OmniAICreator/Qiita-1.07M huggingface dataset:
イカリング３をPCブラウザで表示する

# はじめに
こちらの記事（[イカリング2をPCブラウザで見れる方法があるらしいのでやってみた](https://qiita.com/valmet/items/1b3960085a8764778bf0)）を参考にイカリング2をPCブラウザで閲覧していたが、Splatoon3の発売に際してイカリング3も同様に閲覧出来ないか試したところ、一応上手く行ったので、備忘録も兼ねて手順を簡単に記載します。

※当記事は、上記記事を参考・ベースに書かせて頂きました。




# 環境
- PC
    - Ubuntu 20.04
  
- スマートフォン
    - iPhone 12 mini
    - iOS 15.6
    
- プロキシツール
    - [mitmproxy](https://mitmproxy.org/)
   
- ブラウザ
    - Google chrome
    
- cookie管理ソフト
    - [EditThisCookie](https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg/related?hl=ja)




# 手順
## 1. PCにmitmproxyをインストール
こちらの記事を要参照。 ※今回は説明端折ります
[【Ubuntu】mitmproxyのインストール](https://self-development.info/%e3%80%90ubuntu%e3%80%91mitmproxy%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab/)
起動できたらOKです。



## 2. iOS側の設定
- PCのIPアドレスを調べる
```sh
$ hostname -I
XXX.XXX.XXX.XXX
```
- PCとスマホを同じネットワークに接続する

- iPhoneの設定画面 
→ Wi-Fi 
→ 接続中のネットワークの設定を開く（ネットワーク名をタップ、もしくはiボタン）
 
- HTTPプロキシ項目(画面最下部)の「プロキシを構成」をタップ

- 「手動」を選択し、以下のように設定
    - **サーバ**：先程調べたIPアドレス
    - **ポート**：8080
    - **認証**：オフ
 


## 3. iOSに証明書をインストールする
・PCから下記コマンドでmitmproxyを起動
```sh
$ mitmproxy -p 8080
```
- iOS端末のブラウザで http://mitm.it にアクセス

- iOSの項目のGet mitmproxy-ca-cert.cer をタップしてダウンロード（警告が出たら「許可」）

- 証明書のインストール
**設定**
→ 一般
→ VPNとデバイス管理
→ mitmproxyをタップ
→ 右上のインストールをタップ

- 証明書信頼設定の変更
**設定**
→ 一般
→ 情報
→ 証明書信頼設定
→ mitmproxyをオンにする





## 4. mitmproxyでcookieを取得
- スマホアプリのNintendoSwitchOnlineからイカリング3を開く

- mitmproxy上で以下のようなリクエストを探してURL部分をクリックして詳細表示
```
POST https://api.lp1.av5ja.srv.nintendo.net/graphql HTTP/2.0
    ← 200 application/json 2.3k 1.67s
```

- `cookie:　　_gtoken=超長い文字列`の項目を見つけ、超長い文字列の部分だけをコピー（Ubuntuの場合はshiftを押しながら文字列を選択できます）

- 空白や改行が混ざっている場合は削除して連続した文字列にする
    - こちらが便利 → [改行・空白・タブ削除ツール](https://html-css-javascript.com/n-space-tab/)



## 5. cookieを追加し、ブラウザでイカリング3を表示
- ブラウザ拡張機能 [EditThisCookie](https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg/related?hl=ja) をインストール

- PCブラウザからhttps://api.lp1.av5ja.srv.nintendo.net にアクセス
- スプラトゥーンっぽい背景にメンテナンス中云々と表示されたら、EditThisCookieを開いて＋ボタンからcookieを追加
    - 名前：_gtoken
    - 値：先程コピーした超長い文字列
    - SameSite(最下部の項目)：Strict
- 入力が終わったらチェックマークを押してブラウザのページを更新

これでイカリング3が表示されるはずです。



# おわりに
やはりPCモニターにイカリングを表示させられると見やすくて良いです。
わざわざAndroidエミュレータを動かす必要もなくて楽です。
今後はとりあえず、APIからも取得できないか試してみたいところです。

問題点としては、
- _gtokenがiksm_sessionと比較してもかなりの頻度で更新されてしまう。（1時間保ってない気がする...?）
- _gtokenの自動更新の方法がまだ無い

解決策を模索しますが、どなたかがサクッと更新ツールやAPIを作って下さると思います...

疑問点等あれば是非ご質問、ご指摘下さいmm


# 参照
[イカリング2をPCブラウザで見れる方法があるらしいのでやってみた](https://qiita.com/valmet/items/1b3960085a8764778bf0)
[【Ubuntu】mitmproxyのインストール](https://self-development.info/%e3%80%90ubuntu%e3%80%91mitmproxy%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab/)
[改行・空白・タブ削除ツール](https://html-css-javascript.com/n-space-tab/)
UIEditMenuInteractionを使ってメニューを出してみた

## そもそもメニューってなんのこと？
今回はiOSの話に限りますが、テキストなどの文字列を長押ししたり
タップすると、画像のようにコピーや貼り付けできるメニューが表示されます。

![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/945342/97d0e6d6-1b65-b16b-2f5b-03138eb54694.png)

## iOS16で今まで記載していたメニュー表記のライブラリが非推奨に・・・
現在まではメニュー表示やこのメニュー欄をカスタマイズする方法は、
「UIMenuController」を使用していました。

しかしiOS16ではこのライブラリが非推奨となり、
新たに「UIEditMenuInteraction」を使用することが
推奨されています。

今回はSwiftでメニューを試しに表示する方法を
簡単に説明しようかと思います！

## 早速コードを書いてみよう！
### ①まずは適当なUIを用意！
ここではコピーしたい任意の文字列を置きます。
Classは「UIEditMenuInteraction」を記載したいとこに書いておきました。
ex:CopyUILabel
![スクリーンショット 2022-09-11 17.54.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/945342/e1fa5e00-3ef7-9207-41ce-73d756306932.png)

### ②指定したクラスでコードを記載
コードを記載していきます。
詳細はコメントをご覧いただけたらと思います。

### 長押し・タップ時の処理を呼び出し
```
// さっき指定したクラス
class CopyUILabel: UILabel　{

// タップまたは長押しした時の処理をする制御関数
func copyInit() {        
     // タップ有効
     self.isUserInteractionEnabled = true
      
     // 長押しでもタップでも好きな方を選択して、使用  
     // 長押しコピー
     //self.addGestureRecognizer(UILongPressGestureRecognizer(target: self, action: #selector(CopyUILabel.showMenu(sender:))))
     // 軽くタッチコピー
      self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(CopyUILabel.showMenu(_:))))
    }
}
```

### 上記で呼び出し後、実際にメニューを表示
```
@objc func showMenu(_ recognizer: UIGestureRecognizer) {

   self.becomeFirstResponder()
        
   if #available(iOS 16.0, *) {
       // iOS16以降は「UIEditMenuInteraction」を使用する
    　　　　　let editMenuInteraction = UIEditMenuInteraction(delegate: self)

       // 画面の大まかな場所を決める
       let location = recognizer.location(in: self.view) // locationの引数は任意のViewを入れる
       let configuration = UIEditMenuConfiguration(identifier: nil, sourcePoint: location)

       // メニュー表示する
       editMenuInteraction.presentEditMenu(with: configuration)
            
   } else {
       // iOS15以下の場合
       // オマケで「UIMenuController」でも書いてみた
       let contextMenu = UIMenuController.shared
        
       if !contextMenu.isMenuVisible {
           contextMenu.showMenu(from: self, rect: self.bounds)
       }
 　　 }
}
```
:::note warn
availableで「iOS16以上」を指定する場合、
実機テスト用端末に注意！
:::

### ③最後にメニューを表示するためのオプションとテキストコピー！
```
// テキストをコピーする
override func copy(_ sender: Any?) {
    let pasteBoard = UIPasteboard.general
    pasteBoard.string = text
}
    
override var canBecomeFirstResponder: Bool {
    return true
}
    
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
    // コピーをメニューに表示することを許可
    return action == #selector(UIResponderStandardEditActions.copy)
}
```

## 最後に
これでメニューを無事記載することはできましたでしょうか？

注意事項として、iOS16から使用されるライブラリは
xcode14以上を使用しないと警告が出る場合があります！

この記事が皆様のお役に立てたら
幸いです。

今度はTypeScriptとか触ってみたいな。。
【Swift】CodableをCamelCaseで定義する方法

# サンプルデータ
Twitterの[users/show](https://developer.twitter.com/en/docs/twitter-api/v1/accounts-and-users/follow-search-get-users/api-reference/get-users-show)を一部抜粋してサンプルデータにしました

```sample.json
{
    "id": 121314463,
    "id_str": "121314463",
    "name": "サンプル",
    "screen_name": "sample",
    "location": "japan",
    "description": "sample"
}
```



# 方法１(CodingKeysを使う)
```swift:SampleModel
import Foundation

struct SampleModel: Codable {
    let id: Int
    let idStr, name, screenName, location, description: String

    enum CodingKeys: String, CodingKey {
        case id
        case idStr = "id_str"
        case name
        case screenName = "screen_name"
        case location
        case description
    }
}
```

```swift
let decoder = JSONDecoder()
let sampleModel = try decoder.decode(SampleModel.self, from: data)
print(sampleModel)
```

# 方法２(convertFromSnakeCaseを使う)
```swift:SampleModel
import Foundation

struct SampleModel: Codable {
    let id: Int
    let idStr, name, screenName, location, description: String
}
```

```swift
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let sampleModel = try decoder.decode(SampleModel.self, from: data)
print(sampleModel)
```

# おわり
9月10日〜9月11日はiOSDCに行ってきました！！
めっちゃ楽しかったです！！
iOSDCでの学びについての記事も投稿できたらいいなと思ってます！
【CosmosDB】リソースを作成できない Service Unavailable エラーの解決方法


CosmosDBのリソース作成時に 、```Service Unavailable``` エラーでつまづいたので解決メモ

## CosmosDBのオプション

今回作成しようとしたCosmosDBのオプションは以下の通りです。
- API オプションの選択、「コア (SQL) - 推奨」
- 容量モード、「プロビジョニングされたスループット」
- 場所、「East Asia」
- Free レベル割引の適用、「適応」

## エラー
```
{
    "code":"DeploymentFailed",
    "message":"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.","details":[{"code":"ServiceUnavailable","message":"Database account creation failed. Operation Id: 0ccb95fc-c000-42f7-8b56-f332cb0f485c, Error : Service is currently unavailable. More info: https://aka.ms/cosmosdb-tsg-service-unavailable\r\nActivityId: 4261ad73-9d00-4d09-8f18-9c5d3b5c1e1d, Microsoft.Azure.Documents.Common/2.14.0, Microsoft.Azure.Documents.Common/2.14.0, Microsoft.Azure.Documents.Common/2.14.0, Microsoft.Azure.Documents.Common/2.14.0, Microsoft.Azure.Documents.Common/2.14.0, Microsoft.Azure.Documents.Common/2.14.0, Microsoft.Azure.Documents.Common/2.14.0, Microsoft.Azure.Documents.Common/2.14.0, Microsoft.Azure.Documents.Common/2.14.0, Microsoft.Azure.Documents.Common/2.14.0"}]
}
```

## 原因
[COSMOS DB Deployment failures](https://stackoverflow.com/questions/61120805/cosmos-db-deployment-failures) によると、

> 現時点で Cosmos DB をプロビジョニングしようとしているリージョンには容量がありません。選択肢は、容量が利用可能になるまで待つか、別のリージョンでプロビジョニングすることです。

とのこと。

## 解決方法
リージョンを```East Asia```から```Korea Central```に変更すると、作成できました。
作りたいものから逆算して学ぶFireStore 、例えば予約システム ①

今回は美容院の予約システムに使うDBをFireStoreで作るには？ と考えてみました。
今まで試したことがなかった機能を試行錯誤できそうです。

ドキュメントは、営業時間内に対応できる客には限りがあるので、「予約可能時間とクライアントごとの予約の配列」情報を持つことにします。なのでドキュメント用のインターフェースは２種類ですね。

### ドキュメント StaffReserve 
ID： 日付＋スタッフNo 例 20220822-01
データ部分の型 StaffReserve
```
interface StaffReserve {
    ​ymd: string,   （YYYYMMDD)
    staffNo:number,  （1〜99）
​    reservableTime: number,　（分単位、予約枠の確認用、予約の都度計算して更新）
​    reserveArray: Reserve[]　（顧客予約配列要素）
 }
```
###### 予約配列要素の型 Reserve
```
interface Reserve {
   clientName:string,
   menu: string,
   startTime:string,　(hh:mm)
   endTime:string  (hh:mm)
}
```
FireStoreのドキュメントは予約が入るたびに更新されたり、新しいレコードが作られたりします。予約がキャンセルされたらドキュメントの中の配列が削除されます。

データを入力する際は、時間枠の計算が生じるし、データを取り出す際には、yyyymmddの日付を日付型に変換が必要だったりする。この部分をConvertする機能をFirestoreのDataConverterで書けないかな？

FireStoreの練習用として実用的な良いサンプルではという気がしてます。ポイントは以下の３点

1. DataConverterでスッキリ書ける？　日付の計算処理
2. 予約配列データの追加削除はarrayUnionやarrayRemove処理
3. データの追加・削除・更新を行うフレーズ

実際に作ったらまた記事にしようと思ってます。

以前、美容院の予約システムは、Vue2+AWSのLambda、DynamoDBで実装しましたが、LambaはPythonで実装したりして、予想外に複雑な作りになってしまいました。Nextjs＋FireStoreでもっとスッキリ実装できるならそっちのほうがいいんですよね。
[DVA試験対策]AWS Cognitoの機能

Cognitoを理解するため、機能をまとめる

# AWS Cognitoとは何か
Webアプリやモバイルアプリケーションに認証機能を提供するサービス

## 機能

### ユーザープール
* サインアップ、サインインを簡単にアプリケーションに実装
* カスタム可能な組み込みサインインUI
* ユーザープロファイルの管理（ログイン情報、ステータス管理など）
* MFA,本人確認などユーザー認証の一般的な機能
    - アドバンスドセキュリティ機能：有効にすると、ユーザープールに記録されたID、パスワードが漏洩した時にユーザーブロックが自動で可能
* Lambdaトリガー（サインインをトリガーにLambda実行など）
* Web IDフェデレーション（Facebook,Googleなど）

**ユーザープール = 認証**

＊ 二重管理になるので、ログイン情報はcognitoで、その他の情報はDBの方が良い
* API Gateway、ALB AppSyncはユーザープールと連携できるので、サインイン済みユーザーが認証なしでリソースにアクセスできる
* lambdaトリガーを使用して、ログの収集が可能
* AWS Pinpointとの連携で、対象ユーザーの利用情報が分析できる
* Cloud Trailとの連携でログが記録され、監査やトラブルシューティングに役立つ（一部のサインイン方法では使えない）
* CloudWacthとの連携によって失敗成功回数がわかるので、どれくらい使われているかわかる



### IDプール

S3やDynamoにユーザーが一時的にAWS credentialsを発行しアクセスできる。
IDはアイデンティティという意味。

**IDプール = 認可（アクセスコントロール）**
自作一本ノック

こんにちは。
N予備校でプログラミングをせっせせっせと勉強中のふーちんです。
N予備校プログラミング入門コースの「千本ノック」というものを真似して自分も一つ作ってみたので、「一本ノック」です。

# N予備校プログラミング入門コースの千本ノック

N予備校プログラミング入門コースでは、今年「JavaScript 千本ノック」というのが追加されました。
それは簡単に言うと、JavaScriptの文法の問題集です。
演算子について、文字列について、ループ処理について、配列についてなどや他にもたくさんありますが、
    それらを一つ一つできるだけ一言で説明し、それらを使って解くことができる問題を用意してあります。もちろん答えもあります。
流石に1000問もないですが、簡単な問題から、少しずつ工夫が必要になってくるので、ものすごく身に付くと思います。
問題の題名やフクロウのつぶやきが面白いなと思ったりもします。
やりたいと思ったあなた、是非ともN予備校に入学しよう～

https://www.nnn.ed.nico/

# 作った問題

簡単な電卓の関数を作る問題です。もともと、引数の数値を2つ入れてそれらを足す、という問題があったのですが、四則できるように、記号も引数にして、それらを条件分岐するという問題にしました。
![スクリーンショット 2022-09-09 204909.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2377776/8b3c5faa-8602-c9fd-7ee2-c957c42ae531.png)

:::note
N予備校にある本当の「千本ノック」はこんな変な言葉づかいではないので「こんな問題なんか」とは思わんとってください笑
「ポイント！」なのに「ここがポイントなんだぜ！」になってたり
（自分の頭でやれとか言わんとってねー笑）とかあったりするわけありませんので、笑
:::

# 問題の作り方

1. 簡単な問題を考える。（アイデア勝負）
1. N予備校の千本ノックがある教材ページを開く。
1. どこでもいいので（できるだけ何も無い白い所で）右クリックする。
1. 「検証」を押す。→するとデベロッパーツールの`Elements`タブが開くはず
1. そこから、千本ノックの題名や問題文、ポイントとなる箇所が書かれてあるタグの部分をダブルクリックして、テキストを編集する。
1. 場合によっては、Elementをコピーしたり、削除したりする。（その場合は右クリックしたり何とかやったらできる）
1. 問題文とか編集出来て、完成したら、スクリーンショットをパシャ！

:::note warn
リロードしてしまうと全部元通りになっちゃいます！
:::

#### スクリーンショットの取り方
Windows: `Windows` + `Shift` + `S`
Mac: `Command` + `Shift` + `3`

# 僕が作った問題の答え

<details>
    <summary>HTML</summary>

```html:calc.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>自作一本ノック「電卓で～す！」</title>
</head>
<body>
  <script src="./calc.js"></script>
</body>
</html>
```
</details>

<details>
    <summary>JS</summary>

```javascript:calc.js
'use strict';

/**
 * 自作千本ノック「電卓で～す！」
 * @param {number} n1 数1
 * @param {string} kigou 演算子の文字列
 * @param {number} n2 数2
 * @return 計算結果
 */
const calc = (n1 = 0, kigou = '+', n2 = 0) => {
  let result = null;
  switch(kigou) {
    case '+' || '＋':
      result = n1 + n2;
      break;
    case '-' || 'ー':
      result = n1 - n2;
      break;
    case '*' || '＊' || 'x' || '×':
      result = n1 * n2;
      break;
    case '/' || '／' || '÷':
      result = n1 / n2;
      break;
    // 余りも追加してしまった汗
    case '%' || '％':
      result = n1 % n2;
      break;
    default:
      result = '無効な演算子です。';
      break;
  }
  return result;
}

console.log(calc(6, '*', 5));         // 30
console.log(calc(5.5, '+', 7.8));     // 13.3
console.log(calc(67879, '-', 55432)); // 12447
console.log(calc(13332, '%', 7));     // 4
console.log(calc(6, '', 5));          // 無効な演算子です。
```
</details>

ちなみに、N予備校の千本ノックでは答えはJavaScriptしか載ってないですが、実行させようと思ったらHTMLいるので作って下さい。（どっかのページのデベロッパーツールのコンソールとかnodejsのREPLとかでもいいけど）

# 最後に

N予備校最高です！初心者さんにめっちゃお勧めできます！
これからも僕は頑張って勉強していこうと思います！
ありがとうございました！
リンク

mental
南場、山田、対談、https://logmi.jp/business/articles/327242

tech
python.jp
https://www.python.jp/

傾向スコアと因果推論
https://pira-nino.hatenablog.com/entry/casual_inference

外部システムインターフェース設計の基礎知識
https://mhisaeda.com/archives/1086/amp

単体テスト、結合テスト、システムテスト、受入テストの関係を理解する
https://maku77.github.io/memo/test-relation.html




learning
ソフトウェアエンジニアとしての姿勢と心構え
https://speakerdeck.com/recruitengineers/software-engineers-survival-guide-2022

【データサイエンティスト向け】無料教材まとめ（国内大学編）
https://www.umi-mori.jp/article/engineering/data_science_free_text_univ_jp



management
創業の手引き
https://www.jfc.go.jp/n/finance/sougyou/pdf/sougyou_tebiki_book_202106.pdf
ARISE tech blogのGoソースコードをもっとGoっぽく書いてみた

# はじめに

こんにちは。
ARISE analyticsのエンジニアの井上です。

弊社ARISE analyticsの技術ブログに先日Goについての記事を投稿しました。

そのページは[こちら](https://www.ariseanalytics.com/activities/report/20220704/)

この記事ではサーバーサイド開発として使われるPHP, Javaと比較して

Goの書き方とパフォーマンスについて語りました。

ベンチマークの比較を行う上で、なるべく処理方法を共通とするために

Goらしさを排除した書き方をしました。


本記事ではブログで紹介したGoらしくないソースコードを

筆者が考えるGoらしいソースコードを紹介します。


# Goらしいソースコード

では先にGoの特徴を踏まえたコードを見ていきましょう。

まずはバブルソートの例です

```Go:main.go
package main

import (
	"fmt"
	"math/rand"
	"time"
)

type intSlice []int

func main() {
	rand.Seed(time.Now().UnixNano())
	array := make(intSlice, 0, 1000)
	for i := 1; i <= 1000; i++ {
		array = append(array, i)
	}
	array.shuffle()

	start := time.Now()
	array.bubbleSort()
	fmt.Println(time.Since(start).Microseconds())
}

func (s intSlice) shuffle() {
	rand.Shuffle(len(s), func(i, j int) {
		s[i], s[j] = s[j], s[i]
	})
}

func (s intSlice) bubbleSort() {
	for i := 0; i < len(s); i++ {
		for j := 1; j < len(s); j++ {
			if s[j-1] > s[j] {
				s[j-1], s[j] = s[j], s[j-1]
			}
		}
	}
}

```

それではここからはGoの特徴を4つ紹介します

## 特徴

### type 
typeキーワードは既存の型、型リテラルに別名をつけることができます。

```Go
type intSlice []int
```
は`intSlice`はint型のスライスである、と宣言を表します。

この特徴単独ではただ別名で型を宣言するだけになりますが、

宣言した型にメソッドを追加することができます。

### レシーバ

Goは型にメソッドを追加でき、メソッドを追加する先のことをレシーバと言います。

```Go
func (s intSlice) shuffle()
```

このように書くことで`intSlice`はshuffleメソッドを持ち

intSlice型のarrayで

```Go
array.shuffle()
```

と記述するとshuffleを呼び出すことができます。

### スライスのメモリ管理

Goはスライスという可変長の配列のような型で宣言時にメモリを確保します。

```Go
var slice []int
```

とした場合は要素数0のため容量が0のスライスになります。

スライスに対してappendをして確保した容量を超えた時に

再度メモリを確保するため、使う長さが決まっている場合は先にその分のメモリを確保すると効率的になります。

スライスで長さを指定するためには組み込み関数の`make`を使え

```Go
array := make(intSlice, 0, 1000)
```

と記述すると長さ1000のintSliceをarrayに宣言と代入ができます。


## 多値返却

Goは複数の値を返却できます。

そのためソートでj-1番目とj番目を入れ替えるときには

```Go
s[j-1], s[j] = s[j], s[j-1]
```

と表現できます。

https://qiita.com/official-events/ae80b010f51f7018891a

# 最後に

我々ARISE analyticsはモダンな技術を取り入れて開発をしています。

興味のある方はぜひ我々の[HP](https://www.ariseanalytics.com/)を御覧ください。
なに？　チェックボックスオフでも確実にPOSTする方法があるやと？

    
## ある日の業務中  
ぐっちー
「checkboxってオフの時postされんからオフの処理いちいち書くのめんどくさいな～」
<font color="blue">先輩
「それならええ方法があるがな」</font>
ぐっちー
「ほんまですか？　教えてください！」
<font color="blue">先輩先輩
「1回しか言わんから永久保存版な」</font>
ぐっちー
「了解です！」
## 一般的な書き方  
```index.html
<input type="checkbox" id="hoge" name="hoge" value="1">
<label for="hoge">チェックオン</label>
```

```index.php
$in = $_POST

//初期化
$hoge = 0;
if(isset($in['hoge'])){
    $hoge = intval($in['hoge']);
}else{
    $in['hoge'] = $hoge;
}

$list = array();
$list = search_list($in); //DBからリストを取得する関数の想定
```

## 先輩の書き方
```index.html
<input type="hidden" name="hoge" value="0">
<input type="checkbox" id="hoge" name="hoge" value="1">
<label for="hoge">チェックオン</label>
```

```index.php
$in = $_POST

//初期化
$hoge = 0;

//あるとわかっていてもissetしたほうがよい
if(isset($in['hoge'])){
    $hoge = intval($in['hoge']);
}


$list = array();
$list = search_list($in); //DBからリストを取得する関数の想定
```
<br />


<font color="blue">先輩
「チェックボックスの前にhiddenで埋め込むんよ」</font>
ぐっちー
「なるほど　チェックボックスがオフの場合は、hiddenのvalueがpostされるんですね！」
<font color="blue">先輩
「そうや、でも**絶対チェックボックスの前**に書かんといけんからな？」</font>
ぐっちー
「後ろに書いたらチェックボックスがオンだろうがオフだろうがhiddenのvalueがpostされるからですね！」
<font color="blue">先輩
「そういうことや！」
「あと、nameも同じにすることを忘れるなよ」</font>
ぐっちー
「了解しました！」

## まとめ
**ちょっとしたことでコード記載量を減らせて便利！**

最後まで読んでいただきありがとうございました！
Django NameError: name 'os' is not defined の解決＆解説

## 本記事で話すこと
- ``NameError: name 'os' is not defined``の解決方法とその解説
- ここで出てくるosって何？について

## NameError: name 'os' is not definedの解決方法
結論：ログを見てエラーが発生しているファイルの最上部に``import os``を追記する

※ちなみに自分がこのエラーに遭遇した場面は``python manage.py runserver``を行ったときです。

## どうしてこれで解決するのか
エラー内容は``NameError: name 'os' is not defined``
つまり、呼び出している箇所でosが定義されていないのが問題ということは分かります。

次に理解すべきは「os」とは何かということ。

ここで出てくる「os」とは「osモジュール」のことです。
osモジュールについては以下引用を参考にしてください。

>osモジュールとは、OS（オペレーティングシステム）に依存する機能をPythonで扱えるように提供されたモジュールです。


https://techacademy.jp/magazine/31132

したがって、エラーが発生しているのは、
おそらくファイル内のどこかでこの「osモジュール」を呼び出しているのに、そもそもimport出きていないから、ということになります。

ですので、importしてosモジュールを使えるようにすることでこのエラーが解決するというわけです。

以上、簡単な解説になりますが最後までお読みいただきありがとうございました！

## 参考
https://techacademy.jp/magazine/31132
OpenGL - Compute Shader / Compute Buffer に関するメモ書き

## 概要
自分向けのメモです。メモなのでたぶんどこか間違ってます。
以下のルールを守らないと
> (nvoglv64.dll) で例外がスローされました   

のエラーが発生したり、バッファがおかしくなったりする
## ルール
* ComputeBufferに渡せるデータは、intやfloatといった一般的な型とその構造体のみ。当たり前だがスマートポインタとか自分のクラスをそのまま渡そうとするとエラーになる
    * glm::vec3 val--> float val[3] のように複数型は配列にする
* OpenGL ComputeBuffer (std430/std140)のvec3は16バイトごとにオフセットする(vec4も16バイト)
    * かなりの沼ポイント
    * そのことを知らずにvec3としてfloat[3]を使用していると段々バッファのオフセットがずれていってGPGPUの挙動がおかしくなる
        * 例えば中心の方に動かないオブジェクトがあったら、vec3を4バイトオフセットとして使用していて最後の方のデータが足りずに0になっている
    * ベクトルを渡すときはvec4を使った方が安全
* (当たり前だが)Compute ShaderのDispatchの前にshader programをバインドしないといけない
* バッファをCompute Shaderや通常のShaderにアタッチするとき、glBindBufferBase(OpenGL)やSSBOのbinding(GLSL)にインデックスを指定するが、このインデックスは『各バッファーごとに一つ割り当てて全体で共通(重複なし)なもの』にしなければならない。
    * 例えば、あるCompute ShaderにバッファをglBindBufferBaseで3を指定してアタッチした場合、そのShaderのbindingも3で他のShaderでそのバッファを使う場合も3を指定する
* メモリのパディングに要注意
  * セルフでパディング入れないとバグるよ
* デバイスごとのグループ数やスレッド数の最大値に注意
    * 下記の関数で取れる
   
        * GL_MAX_COMPUTE_WORK_GROUP_COUNT: 最大スレッド数
        * GL_MAX_COMPUTE_WORK_GROUP_COUNT: たぶんローカルサイズに指定できる値の最大値(?)でも下記の値を超えてはいけない
        * GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS: ローカルサイズの x, y, zの積の最大値
```
    int MaxGroupNum[3];
	glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 0, &MaxGroupNum[0]);
	glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 1, &MaxGroupNum[1]);
	glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 2, &MaxGroupNum[2]);
	
	int MaxThreadsSize[3];
	glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 0, &MaxThreadsSize[0]);
	glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 1, &MaxThreadsSize[1]);
	glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 2, &MaxThreadsSize[2]);

	int MaxThreadsNum;
	glGetIntegerv(GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS, &MaxThreadsNum);
```
>[DEBUG] MaxGroupNum=> x: 2147483647, y: 65535, z: 65535
[DEBUG] MaxThreadsSize=> x: 1024, y: 1024, z: 64
[DEBUG] MaxThreadsNum: 1024 

(MaxGroupNumのxってこんなに大きいの？なんか指定間違ってそう)
MaxThreadsNumが1024なので立方体で計算したいなら 8 * 8 * 8 = 512 にするしかない

## 参考
https://qiita.com/hoboaki/items/b188c4495f4708c19002
https://qiita.com/RT-EGG/items/74b2e68a9bfd4bdfa3ab
https://logicalbeat.jp/blog/4032/
https://www.khronos.org/opengl/wiki/Compute_Shader
https://antongerdelan.net/opengl/compute.html
JavaScriptのsetTimeout(func.bind(null,value));のbind周りを書く意味

詰まったので自分用メモ

結論
--
* setTimeoutの第一引数は***関数***じゃないと効かないっぽい
* bindの返り値は***新しい関数***
→`func.bind`で新しい関数を作り、それをsetTimeoutに渡してるから動くっぽい

例)
`hello.bind(null,cat)`が実行されてからsetTimeoutに渡されている
→`hello.bind(null,cat)`の返り値は`hello(cat){console.log('こんにちは！！　' + cat);}`という`hello`メソッドの引数だけ`cat`になったやつ
=>`setTimeout(hello(cat),1000);`になって1秒後に出力される
```
function hello(animal){
    console.log('こんにちは！！　' + animal);
}

const cat="ネコチャン";
setTimeout(hello.bind(null,cat),1000); // 1s後に「こんにちは！！　ネコチャン」
```

↓setTimeoutが効かないやつ
--
* `hello(cat)`が実行され（この時点で出力されてる）てからsetTimeoutに渡されている
=>`hello`メソッド自体に返り値がないから`setTimeout(undefined,1000);`
```
function hello(animal){
    console.log('こんにちは！！　' + animal);
}

const cat="ネコチャン";
setTimeout(hello(cat),1000); // 即「こんにちは！！　ネコチャン」
```

bind(null,value)の意味
---
* `bind`は引数と`this`の束縛ができるよ
    * `this`の場合、第一引数にオブジェクトを指定する
    * 引数の場合、第一引数に`null`を指定
```
function hello(animal){
    console.log('こんにちは！！　' + animal);
}

const animals= {
    cat : "ネコチャン"
}
setTimeout(hello.bind(animals,cat),1000); // 1s後に「こんにちは！！　ネコチャン」

```
bind以外でも書けるみたいだよ
-----
* ```setTimeout```の第一引数が関数として渡せればいいから他の書き方でもいける
```
// 例１
function hello(animal){
   return function(){ 
       console.log('こんにちは！！　' + animal);
   }
}
const cat="ネコチャン";
setTimeout(hello(cat),1000);
```
```
// 例2
function hello(animal){
       console.log('こんにちは！！　' + animal);
}
const cat="ネコチャン";
setTimeout(function(){hello(cat)},1000);
```
参考にしたもの
---
https://qiita.com/sirojake/items/26618081bbb33e918aa4

https://uhyohyo.net/javascript/11_2.html

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/bind#settimeout_%E3%81%A7%E3%81%AE%E5%88%A9%E7%94%A8
英語の勉強に取り組んでいく

英語を身につけておくとこれから困った時に使えると言われたのでこれから勉強することにする。
英語は中学から学び始めたので中学から振り返ってみようと思う。

# 勉強する教材の冒頭には
* 英語力を伸ばすには、英語を```聞く、読む、、話す、書くという４つの力をつけることが大切```。

* 問題の正解を求めるより```英文がどう組み立てられているか```を理解し、```基本に立ちかえり土台をしっかり固める```ことで力を伸ばすことができる。
* 最低限の```文法用語は、頭の中で英語の設計図を描く時に重要な役割```を果たします。

# 勉強法
```英語を聞く、読むを練習で英文のストックを作り、それを話す、書く練習をしながら勉強```を進めていくと効果的だ。

## 気づき
これからこれに倣って聞く読むをしていこうと思う。

# 出典

https://kanki-pub.co.jp/pub/book/details/9784761230227
Symfony5でSQLightは使えないかもしれない

ローカルで勉強するだけの使い捨てDBなのでSQLightでお手軽に構築した。
単一のテーブルでは動いたので使えると思いましたが、リレーションシップの勉強をする段階で以下のエラーが出て詰まりました。 


```
php bin/console make:migration

// 上のコマンドを使うとこのエラーで中断してしまう。
Sqlite platform does not support alter foreign key.  
```

ormを2.13にすれば治る的な英文がありましたが、私の環境ではそもそも2.13.1だったので関係なさそうです。

試しにMAMPでMySQLのDB作って同じコマンド叩いたところ普通に動きました。

なので、どうしてもSQLightを使わなければいけない理由がないなら諦めて違うDBシステム使ったほうがいいです。

簡単に導入できるからSQLite選んだのにMySQLより苦労するなら使う気が起きないので捨てます。


# 余談
Symfonyって使いこなせればLaravelより保守しやすそうなんですけど、日本語の文献の量が1万倍くらい違うし環境構築周りのバグが多くて初期導入がつらい。
XcodeのCommand Line Toolsのみインストールする

# この記事でわかること

1. Xcodeは重いので、最初はCommand Line ToolsだけでOK。
1. Command Line Tools (CLT) とは?
1. インストールの仕方

## どうしてCLT？

Macでの開発といえばXcode必須、と思っていたのですが、
Xcodeをダウンロードすると重い重い…
「オモテ（AppStore）からダウンロードするとフルで入ってめちゃくちゃ重いから、デベロッパーツールだけインストールするといいよ」
とアドバイスいただきまして、下記の作業を行いました。

**Step 1. Xcode のアンインストール**
**Step pre-2. 古いCommand Line Toolsの削除**
**Step 2. Command Line Tools のインストール**

## そもそもCLTとは？
上記で「デベロッパーツール」という単語を出しましたが、どうやら「コマンドラインツール」が正確な言い方のようです。
Command Line Toolsといちいち書いていると長いので、以下ではCLTと略して記載します。
こちらのサイトを参照しました。
参考１:
[CommandLineToolsとXcode](https://qiita.com/payreikit/items/4bb0f863afc7b56d0809)
参考２:
[Xcodeをインストールせずに、Command Line Toolsをインストールする方法](https://qiita.com/iwaseasahi/items/eb820762600c815ab100)

### Command Line Tools とは
-　Mac向けに提供されているコマンドツール
-　コマンドツール：　キーボードで命令や操作するプログラム　> これでShell（ターミナル）が使える！

### AppleのDevelopperからダウンロードする方法
[参考２](https://qiita.com/iwaseasahi/items/eb820762600c815ab100)内に記載があります。
ただし、Xcodeのバージョンがわからないとダウンロードすべきバージョンがわからないので、ここでは割愛。

# 実践
## Step 1. Xcodeのアンインストール
### やったこと
1. Finder > アプリケーション > Xcode -> ゴミ箱に入れる -> ゴミ箱を空にする
1. ターミナルから、下記のうち残っているフォルダ・ファイルを削除
```
/Applications/Xcode.app
/Library/Preferences/com.apple.dt.Xcode.plist
~/Library/Preferences/com.apple.dt.Xcode.plist
~/Library/Caches/com.apple.dt.Xcode
~/Library/Application Support/Xcode
~/Library/Developer/Xcode
~/Library/Developer/CoreSimulator
```
ただし、上記のうち、`Permission denied`のものは、ファインダーから視覚的に削除。
下記コマンド多用。これで見つけて`ゴミ箱に入れる` -> パスワードを入力すれば削除できました。
```md:隠しファイルの表示
Shift + Command + .
```

#### 参考
【１】[Xcodeを完全にアンインストールする](https://qiita.com/UJIPOID/items/015805c89bddca540129)
【２】[完全アンインストール：Xcode の削除](https://macpaw.com/ja/how-to/uninstall-xcode-on-macos)
※本記事は、【２】に記載のアンインストーラーの使用を推奨するものではありません。

## Step 2. Command Line Tools のインストール
ターミナルで下記コマンドを入れるだけ。
```bash
$ xcode-select --install
```
以上。
ここでうまく行かなかった方は、後述のStep pre-2.を試してみてください。

## Step pre-2. 古いCommand Line Toolsの削除
Step 2.をしたら、`Software Update`が必要と出てしまいました。
古いものを削除して、再インストールし直したらうまくいきましたので、備忘。

### 起きたこと
Step 2.のコマンドを入力したのですが、実行結果が以下のようになりました。
```bash:Error
$ xcode-select --install
xcode-select: error: command line tools are already installed, use "Software Update" to install updates
```
already installed?
Software Update???
どうやら、過去ログが消しきれなかったよう。

### 解決方法

```bash:過去ログの削除
rm -rf /Library/Developer/CommandLineTools
```

ずらずらっとCLTがでてきます。一部、`Permission Denied`なものもありましたが、無視。
続いて、再インストール。

```bash:再インストール
$ xcode-select --install
xcode-select: note: install requested for command line developer tools
```
算術演算と誤差

# 桁落ち
絶対値のほぼ等しい２つの数の差を計算したとき、上位の相殺により有効桁数が減る現象。

# アンダーフロー
最小値を超えること
```限りなく０に近い```実数によって浮動少数の```指数部がパンク```して精度が場合に起きるもの。

# オーバーフロー
```最大値と最小値を超える```こと
８ビットの固定小数点で最小〜最大の範囲（-128~127)を超える場合どちらもオーバーフロ-という。
(正のオーバーフロー、負のオーバーフローという。)

# 出典
https://gihyo.jp/book/2020/978-4-297-11781-8

https://gihyo.jp/book/2022/978-4-297-12375-8
[rails初心者]Schema（スキーマ）のまとめ ※自分用

<h2>初めに

<h4>Schemaについてまとめてみました。</h4>

※自分用でまとめてますので、分かり辛かったらすいません。<br>
　また理解不足・誤りがあったらコメント頂けますと幸いです。m(__)m<ﾖﾛｼｸｵﾈｶﾞｲｼﾏｽ

<h2>前提条件

<h4>すでにBookモデルが作成されていること

※じゃあモデルを作成していないとだめなのか？と思った方・・・実はそうでもないんです！！<br>　schemaファイルは**デフォルトであるファイルになる**ので、モデルを作成していなくてもファイルは存在します<br>　ただ何も書かれていない状態になります(;^ω^)

<h2>主なやること

特になし
<details><summary>ご自身で確認したい人は・・・</summary>
①モデルの作成(rails g model 任意のモデル名)＆migrateファイルの編集(任意のカラムを一つか二つ作ってみて下さい)<br>
　→忘れずに「rails db:migrate」<br>
②Schemaファイルを開く(任意のアプリ名/db/schema.rb)</details>

<h2>Schemaとは

「スキーマファイル → データベース上に作った**テーブル・カラムを簡易的に表示したファイル**」とのことでした( ..)φメモメモ
[参考資料：Active Record マイグレーション - Rails ガイド](https://railsguides.jp/active_record_migrations.html)
<details><summary>テーブル＆カラムとは何ぞや？と思った人</summary>
①テーブル→あるデータの集合体<br>
②カラム→テーブルの縦１列（更に？になった人は後で分かりやすい画像がありますので、そちらを参照してください）
</details>

<h2>schemaファイルを見てみよう

では早速、確認作業に入っていきます。
ここでは`本の情報(bookモデル)`を見ていきます。
```:bookers2（任意のアプリ名）/db/schema.rb 
  create_table "books", force: :cascade do |t|
    t.integer "user_id"
    t.string "title"
    t.text "body"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end
```
:::note info
・create_table "テーブル名" → ""内にテーブル名が表示されます
・integer → カラムのデータ型（integerは整数が入ります）
・t.integer"カラム名" → ""内にカラム名が表示されます
:::
これじゃあ分かり辛い方もいると思うので、次に分かりやすく表を作ってみました(/・ω・)/

<h5>表にしてみると・・・

こんな感じです。<br>カラムやテーブルの説明文を読んでもイマイチ分からなかった方は、これだとイメージ出来るんじゃないですか？<br>因みに僕もそうでした(´▽｀)
![テーブルとカラム３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822721/f74c5461-22c6-9431-e9e1-066b958afcfe.png)

:::note info
ポイント①IDは主キー：何番目の本なのかを識別する番号（migrateファイルで指定しなくても作成されます）
ポイント②user_idには整数が入っていること（因みにtitleとbodyは文字が入るようにしています）
:::

<h2>まとめ

schemaファイルは、DBに保存している**テーブルとカラムをまとめたファイル**である
<details><summary>余談ですが・・・</summary>
schemaってどんなときに使うの？？と思った方<br>
　・DBに何のカラムやテーブルが保存しているのか確認したい時(特にアソシエーションを作成するとき)<br>
　・新機能を入れる時(例えば検索機能やフォローフォロワー機能など外部参照キーが必要になる処理を作る時)<br>
　※あくまで私個人の意見に過ぎないので、他に使い時がある場合はぜひコメントで教えてください！！
２重以上のハッシュの取り出し方について

## 久しぶりに問題をしたら忘れていたのでメモ

### そもそもハッシュとは
複数の値をまとめて管理する方法
ハッシュはそれぞれの値（バリュー）に名前（キー）をつけて管理する
書き方はいろいろあるが良く使う（というかほぼこの書き方しかしない？）のがキーにコロン「:」をつけて記述するシンボルという書き方がある
```
{キー: バリュー}
user = {name: "Tanaka", age: 25}
```

### 取り出し方
複数のユーザーの情報をハッシュとして持つ変数user_dataがある
```
user_data = [
 {user: {profile: {name: 'George'}}},
 {user: {profile: {name: 'Alice'}}},
 {user: {profile: {name: 'Taro'}}},
]
```

配列の要素を順番に取り出すeach分を使う
```
user_data.each do |u|
end
```
ハッシュから特定の値を取得するにはその値に対応するキーを取得する
```
ハッシュ[取得したい値のキー]
```
今回はハッシュが３重なので取得したいキーの値まで連続して指定する
つまりこういう書き方になる
```
user_data.each do |u|
  puts u[:user][:profile][:name]
end
```

以上で終わり
浮動小数点数

# 正規化の目的
```丸誤差をの発生を防いで精度を上げる```ために行う。

### 丸誤差とは？
丸め誤差とは、コンピュータが「表現できる数の範囲」（有効桁）を超えてしまった際に、「四捨五入」や「切り上げ」「切り捨て」などを行い```有効桁以降の値を捨てることにより生じる誤差```のことです。

出典 https://medium-company.com/%E4%B8%B8%E3%82%81%E8%AA%A4%E5%B7%AE-%E6%89%93%E5%88%87%E3%82%8A%E8%AA%A4%E5%B7%AE-%E6%A1%81%E8%90%BD%E3%81%A1-%E6%83%85%E5%A0%B1%E8%90%BD%E3%81%A1-%E9%81%95%E3%81%84/#i-3

# 正規化の手法
桁数が制限されているので```有効な桁数が多く取れるように小数点を調整```する

# 浮動小数点をビット列の表し方
S,E,Mの３つで構成されている。

## S
仮数部の符号(0：正、1：負）

## E
指数部(２を基数部とし、負の数は2の補数で表現）

## M
仮数部(２進数　絶対値表現）

# １０進数から２進数へ変換する
基数変換を行っていく。
2^-1や2^-2等重みで割って変換していく。

前の記事 
https://qiita.com/masatom86650860/items/4cb587e4c25a00f405d2#%E3%82%88%E3%81%8F%E4%BD%BF%E3%82%8F%E3%82%8C%E3%82%8B%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0%E5%BD%A2%E5%BC%8F

# 気づき
前よりも気づきが増えてよかった。
ドメイン駆動設計用語集【随時更新】

ドメインとは
ソフトウェアで問題解決しようとする対象領域

ドメインモデル
ドメインの問題を解決するためのモデル

いいモデルとは？
問題を解決できるモデル

いいモデルを作るためには？
ドメインエキスパートに話を聞く
運用して得られた発見をモデルに還元する

ユビキタス言語
開発者、ビジネス側、ドキュメント、コードで同じ意味の言葉が使われる

モデルを直接反映するコード→極力モデルとコードの表現を近づける
モデル表現を隔離するアーキテクチャ

取り組む上での考え方
課題ドリブン→解決したい課題を明確にする
問題解決しようとするドメインが簡単かどうか


DDD固有のモデリング方法
集約
必ず守りたい強い整合性を持ったオブジェクトの集まり

境界づけられたコンテキスト

凝集度
一つのクラスについて、責務、データ、振る舞いの関連の強さの尺度
このクラスは何をするクラスか？がわかりやすいといい

結合度
複数のクラス同士が依存している度合いの尺度
AndroidStudio内のリソースファイルの置き場と利用方法

# はじめに
Androidエンジニアとして初心者だった頃に、取り込んだ画像の置き場所がわからない
文字列を入力する場所ってどこだっけ？
となった経験があることを思い出したので、それぞれのリソースファイルの置き場所とそれの使い方等を表にして記事に残そうと思います。


# 表
|フォルダ|説明|利用例|
|:---|:---|:---|
|/res/values/|色(Color)|R.color.red|
||色(ColorDrawable)|R.drawable.red|
||寸法|R.dimen.one_pixel|
||テーマ　又は、スタイル|R.style.Theme_CommonTheme|
||文字列|R.string.text|
|/res/drawable/|Bitmap(.bmp)、JPEG(.jpg)、PNG(.png)、GIF(.gif)|R.drawable.gazou|
|/res/layout/|レイアウト|R.layout.main_layout|
|/res/anim/|アニメーション|R.anim.spin|
|/res/raw/|バイナリ|R.raw.hoge|
|/res/xml/|XML|R.xml.hoge_xml|
Unity Catalog リネージ機能を有効にする



:::note info
こちらの機能は正式リリースとなり、デフォルトで利用出来るようになりました。
そのため、以下の設定は不要になりました。
:::

# はじめに

~~現時点(2022/9/10)では、Unity Catalogのリネージ機能はPublic Previewとなっており、デフォルトでは有効になっておりません。テーブル作成時にクラスターもしくはSQL Warehouseで設定を有効にしておく必要があります。~~

> 本記事はこちらの[ドキュメント（Capture and view data lineage with Unity Catalog
）](https://docs.databricks.com/data-governance/unity-catalog/data-lineage.html#requirements)を参考にしております。

# 制限事項

利用にあたってこちらの要件や制限事項をご確認ください --> [Requirements & Limits](https://docs.databricks.com/data-governance/unity-catalog/data-lineage.html#requirements)

Unity Catalogの設定については[こちら](https://qiita.com/maroon-db/items/57cee03cef202c839b94)をご覧ください。

### 要件
- ワークスペースは、Unity Catalogが有効で、Premium契約以上で起動されている必要があります。

- テーブルは、リネージキャプチャーの対象となるために、Unity Catalog メタストアに登録されている必要があります。

- クラスタと SQL ウェアハウスにはSpark設定として `spark.databricks.dataLineage.enabled true` が含まれている必要があります。（詳細は後述）

- クエリーは、Spark DataFrame（例えば、DataFrame を返す Spark SQL 関数）または Databricks SQL インターフェイスを使用する必要があります。Databricks SQLとPySparkのクエリの例については、[例](https://docs.databricks.com/data-governance/unity-catalog/data-lineage.html#lineage-examples)を参照してください。

- テーブルまたはビューの系統を表示するには、ユーザーはそのテーブルまたはビューに対してSELECT権限を持っている必要があります。

- ノートブック、ワークフロー、またはダッシュボードの系統情報を表示するには、ユーザーはワークスペースのアクセス制御設定で定義された、これらのオブジェクトに対する権限を持っている必要があります。[「リネージの権限」](https://docs.databricks.com/data-governance/unity-catalog/data-lineage.html#permissions)を参照してください。

- リネージをキャプチャするには、テーブルを使用してデータを作成および変更する必要があります。ファイルに直接書き込まれたデータでは、リネージはキャプチャされません。


### 制限事項

- Delta テーブル間のストリーミングは、Databricks Runtime 11.2 以降でのみサポートされます。

- クラウドストレージのファイルに直接データを書き込んだ場合、クラウドストレージの場所にテーブルが定義されていても、リネージは取得されません。例えば、spark.write.save("s3:/mybucket/mytable/")では、リネージは生成されません。

- リネージは**30日間**のローリングウィンドウで計算されるため、過去30日以内に変更されていないテーブルのリネージは表示されません。

- ジョブズAPIがリクエストを送信するワークフローは、リネージを表示することができません。Runsサブミットリクエストを使用する場合、テーブルとカラムレベルのリネージは取得されますが、実行へのリンクは取得されません。

- Delta Live Tables パイプラインでは、リネージは取得されません。

# 設定方法

## クラスター利用時

クラスターのSpark構成にて以下を入力して起動します。

`spark.databricks.dataLineage.enabled true`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/0fb9dea1-bb04-d812-38da-94641a1464e3.png)


## SQL Warehouse 利用時

[SQL]メニューに移動し、左下の「設定」ー「SQL管理コンソール」画面に移動します。

「SQLウェアハウスの設定」画面にて、以下のようにデータアクセス設定箇所に以下を入力します。
`spark.databricks.dataLineage.enabled true`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/2fec4e51-b7a8-2c97-7071-d0eaecee0dfd.png)

# デモ動画

実際のリネージされている様子はこちらのデモ動画をご覧ください。

<iframe width="1280" height="720" src="https://www.youtube.com/embed/QPte6wmC4vQ?start=99" title="Automated Data Lineage with Unity Catalog" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# さいごに
UnityCatalogセットアップについてはこちらもご覧ください。
https://qiita.com/maroon-db/items/57cee03cef202c839b94
人が距離を推定するメカニズムの考察とComputer Visionの世界

# 概要
 画像による距離推定の研究を行っています。人間が距離を認識するメカニズムを日頃から考えていて、自分なりの意見をまとめたいと思います。Computer Visionの世界には、1フレームの画像で距離を推定する方法が2つあります。一つ目は、単眼の画像から距離を直接推定するMono Depthです。2つ目は、双眼の画像から視差を求めてから距離に変換する方法です。

# Mono Depthとは?
 どうして2次元の画像1枚から距離が求まるかというと、"私達の記憶による情報"と"地面がおおよそ平に伸びていて且つ重力により物体は地面に接地している"事により大凡な距離を推定する事が出来ます。まず記憶を使う事によって物体の大まかな3次元サイズを仮定すると2次元画像に写った時の大きさで物体の距離を推定出来ます。言い換えると遠くのものは小さく見え、近いものは大きく見えるという事です。他にも、以前通ったであれば物体の位置を3Dマップのように記憶しておくことで距離を推測する事が出来ます。さらに、地面はおおよそ平に伸びていて、平らな地面を仮定すると、自分の目の高さと物体が地面に付いている接地面への角度により距離を計算する事が出来ます。大きい人ほど、距離間隔に優れているかもしれません。Mobileyeというイスラエルの会社も地面により距離を求め車の安全装置として活用していました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/99c73d88-f156-bab1-8b8a-f5ef4a911d67.png)



# Stereo Depthとは?
　Stereo Depthとは視差(左と右の眼に見える物体の位置のズレ)を求める事で、距離に変換する方法です。近くの物ほど視差が大きく、逆に遠い物ほど視差が小さくなります。Stereo Matchingと検索すると詳細な方法などが沢山見つかるかと思います。スバルのアイサイトは双眼のカメラを使っている事が有名で、恐らく視差を求める事で距離を推定し衝突回避などをしているかと思います。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/cd20c060-f51a-b426-830f-2374beb34e35.png)


# 人間はMono Depthを使ってるのか?Stereo Depthを使っているのか?
　今までの研究や日常生活を通しての想定ですが、人間は両方の機能を上手く使い分けていると考えられます。その理由として、片目をつぶってもある程度、日常の動作を行う事が出来ます。という事は単眼で距離を推定するという機能があるという事。しかし、片目を瞑った状態で、何かぶら下がっている小さな物を下から人差し指で合わせようとすると、かなりズレます。一方、両目を開いた状態で同じ実験をすると、ほとんど正しい位置に人差し指を持ってくる事が出来るかと思います。細かいメカニズムは分かりませんが、単眼で推定した距離を双眼で補正しているのかと推察出来ます。
　私が知る限りでは、Computer Visionの世界で単眼の情報と双眼の情報を組み合わせ距離を出すことに、未だあまり研究がされていません。単眼と両眼を合わせるという事が出来た時は、機会がより人間に一歩近づけるのではないかと考えています。そんな論文を見つけましたら、是非シェアしたいと思います。もし知っていれば教えて頂けると幸いです。
flex で 横並び 直書きCSS

横並びの div を作るには flexbox 。
わかりやすく、直書きで。

![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/67ba139d-fed5-9151-df8c-e8ffa99b0158.png)


# 使い方

1 親に `display:flex;` を指定
2 子に `flex-basis:30%;` を指定

たったこれだけで横並びdivが完成。

```hoge.html

<div style="display: flex;">
    <div style="background-color:red;flex-basis: 30%;">果物</div>
    <div style="background-color:pink;flex-basis: 60%;">りんご<br>みかん<br>ぶどう</div>
    <div style="background-color:yellow;flex-basis: 10%;">美味しい</div>
</div>

<div style="display: flex;align-items: center;">
    <div style="background-color:red;flex-basis: 30%;">果物</div>
    <div style="background-color:pink;flex-basis: 60%;">りんご<br>みかん<br>ぶどう</div>
    <div style="background-color:yellow;flex-basis: 10%;">美味しい</div>
</div>

```

# 他使いそうなの

# 親 div

    横方向
        中央寄せ
        justify-content: center;
        右寄せ
        justify-content: flex-end;

    垂直方向
        中央揃え
        align-items: center
        上揃え
        align-items: flex-start

# 小 div

    横幅サイズ指定
    flex-basis: 30%;

以上
Windows10でChange Keyを使ってキーボード割り当てを変更（caps lock無効化、左手エンター、など）

# 概要

誤入力防止の為にcaps lockを無効化したい。
左手でエンターキー入力できるようにキーのマッピングを変更したい。
でもそのためだけにソフトをインストールしたくない。

そんな時。

# やり方

下記でChange Keyをダウンロード。

https://forest.watch.impress.co.jp/library/software/changekey/

Change Keyはレジストリーを書き換えてくれる非常駐型のソフト。
キー入力マッピングを手軽に変更できる。

ChgKey.exeを右クリック⇒管理者として起動。

最初に出てくる下記画面は **どのキーのマッピングを変えるか** の設定。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/55f428df-c17b-e8ed-5419-f7a44c39ac56.png)

変更したいキーを選択すると下記のように別画面が出る。
**選択したキーをどこにマッピングしたいかの画面**

今回は無変換をEnterに割り当ててみます。（左手エンターできるように）
Enter左を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/35032469-512a-19c9-dcd7-a6c9f4533507.png)

すると一番最初の画面のみになる。
そこから 登録⇒現在の設定内容で登録します で設定が反映される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/4416fb7e-0fe0-edaa-bea1-1424b646c395.png)

ただし再起動が必要。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/89830c7d-93e4-26c6-7a73-cbf7dd8dec6a.png)

# バージョン

Windows 10 Pro 21H2 OSビルド 19044.1889
Change Key v1.50
AtCoder Beginner Contest 268

## [A - Five Integers](https://atcoder.jp/contests/abc268/tasks/abc268_a)

O(1)
データ構造を使用しましょう。
mapかsetが良いと思います。

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }
 
int main() {
    map<int, int> mp;
  	rep(i, 5){
      int p;
      cin >> p;
      mp[p]++;
    }
    cout << mp.size() << endl;
 
    return 0;
}
```

## [B - Prefix?](https://atcoder.jp/contests/abc268/tasks/abc268_b)

O(N)
S>Tを判定、Sの文字数が多いならNo。
min(S.size(), T.size())だけループし、異なる文字が存在するならNo。

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }
 
int main() {
    string S, T;
  	cin >> S >> T;
  
  	if(S.size() > T.size()){
      cout << "No" << endl;
      return 0;
    }
  
  	int n = min(S.size(), T.size());
  	rep(i, n){
      if(S[i] != T[i]){
        cout << "No" << endl;
        return 0;
      }
    }
    cout << "Yes" << endl;
 
    return 0;
}
```

## [C - Chinese Restaurant](https://atcoder.jp/contests/abc268/tasks/abc268_c)

O(N)
len = P[i]-iの距離を測定する問題です。
lenは-1, 0, 1の加算しNの余りの値を取ります。
値をいくつあるかカウントし、最大値が解答になります。

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }
 
int main() {
    int N;
    cin >> N;
	vector<int> P(N);
  	rep(i, N) cin >> P[i];
  
	vector<int> cnt(N, 0);   
    rep(i, N){
      	repx(j,-1,2){
          int value = (P[i]-i+N)%N;
          cnt[(value+j+N)%N]++;
        }
    }
    
  	int ans=0;
  	rep(i, N){
      ans = max(ans, cnt[i]);
    }
    cout << ans << endl;
 
    return 0;
}
```
数式フィールドではステージが更新された日付を保存できない

まぁ、そうだろうとは思うところ。

フローで数式リソースを利用した提案が回答されていたが、即刻消されている。こまった人たちだ。

[Does anyone have a formula to show the Date when a field was marked (on a checkbox)?](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000JxvDDSAZ)
Azure CLIでVMを作成する


## はじめに
わたしがAzure上でVMをつくっては壊してを繰り返しているときによく使用する手順です。

踏み台サーバ兼Ansible-Playbook実行環境を作成する想定で記載しています。
より良い方法があると思いますのでご存知の方がみてくださったらご教示いただけるとありがたいです。

## 前提
Azure Cloud shell上で実行します
変数の値は適宜読み替えてください。
VM作成時に指定するイメージやサイズについては、最後に調べる方法を記載しています。

## VM作成手順
### リソースグループの作成（初回のみ）
- リソースグループの作成
```bash
RG="managementResourceGroup"
REGION="eastus2"
az group create --name $RG --location $REGION
```
- 実行結果
```json
{
  "id": "/subscriptions/c74afe34-c421-4540-bf9c-fad145c5204e/resourceGroups/managementResourceGroup",
  "location": "eastus2",
  "managedBy": null,
  "name": "managementResourceGroup",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null,
  "type": "Microsoft.Resources/resourceGroups"
}
```
### VMの新規作成（都度実施）
- スクリプトを実行して、VMを作成する
※IPアドレスのセグメントは、`10.0.0.0/24`のなかで指定する
```bash
. ./create_vm.sh 10.0.0.10 ansible-server
```
- スクリプトの内容(create_vm.sh)
```bash 
#!/bin/bash
IMAGE="Canonical:0001-com-ubuntu-confidential-vm-experimental:20_04:20.04.20210309"
SIZE="Standard_B2s"
RG="managementResourceGroup"
USERNAME="aki-nasu"
PRIVATEIP=$1
VMNAME=$2

az vm create \
    --resource-group $RG \
    --name "$VMNAME" \
    --image "$IMAGE" \
    --size $SIZE \
    --admin-username $USERNAME \
    --private-ip-address "$PRIVATEIP" \
    --public-ip-address "" \
    --public-ip-sku Standard \
    --generate-ssh-keys
```

### PublicIPとの関連付け
- PublicIPを関連付けるときは、VMNicのIP構成を選択する(上記スクリプトではPublicIPを作成しないようにしている)
  - 関連付けするIPアドレスを選択すると、関連付けの設定画面がでるので設定する
  ![](https://i.imgur.com/Wwahchc.png)
  ![](https://i.imgur.com/MfjafBC.png)

### おまけ
- Ansible install
上記まででVMの作成は完了。今回はAnsible実行環境を用意したかったので、以下の手順でVMに接続後Ansibleをインストールする。
https://docs.ansible.com/ansible/2.9_ja/installation_guide/intro_installation.html#ubuntu-ansible

## 参考
  - [Azure CLI Reference(az vm create)](https://docs.microsoft.com/ja-jp/cli/azure/vm?view=azure-cli-latest#az-vm-create)
  - [Azure リソースを管理するための一般的な Azure CLI コマンド](https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/cli-manage)
  - [Azure の仮想マシンのサイズ](https://docs.microsoft.com/ja-jp/azure/virtual-machines/sizes)
  - [Linux Virtual Machines の料金](https://azure.microsoft.com/ja-jp/pricing/details/virtual-machines/linux/)
  - [料金計算ツール](https://azure.microsoft.com/ja-jp/pricing/calculator/)
  - [パブリック IP アドレスの料金](https://azure.microsoft.com/ja-jp/pricing/details/ip-addresses/)  
    IPアドレスが変わるのを避けたい場合は、静的IPアドレスを使用します
  - Ubuntuのすべてのバージョンを出力する(処理に数分かかるため、テキストに出力するのがおすすめ)
    `az vm image list --all --publisher Canonical | jq .[] > image-list.json`
  - 使用するサイズを調べる（B2を使用したかったので、以下はB2でgrepしている）
    `az vm list-sizes --location $REGION | jq .[].name | grep B2`
Ktorで動画をシークしたい

# Ktorで動画をシークしたい
最初作ったときに動画がシークできなくて悩んだ

多分 [Accept-Range](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Accept-Ranges "Accept-Ranges - HTTP - MDN Web Docs") が必要
```kotlin
routing{
    route("videos"){
        route("{id}"){
            get {
                call.response.header("Accept-Range","bytes")
                call.respond(LocalFileContent(File("path/to/video")))
            }
        }
    }
}
```

これであってるのかはわからないけど、とりあえず動いた。
FlutterでIconButton内のsvgを拡大する方法

詰まったのでメモしておきます。
ある時、``IconButton`` の ``icon`` を svg画像にしなければならない事例がありました。
svgの表示には、[flutter_svg](https://pub.dev/packages/flutter_svg) を使用しています。


普通に書いたらこうなります。

```dart
IconButton(
  onPressed: () {},
  icon: SvgPicture.asset(
    'assets/images/arrow_right.svg',
    color: Colors.black,
    width: 200,
  ),
),
```

しかし、これではアイコンが非常に小さく表示されてしまいました。もともとの画像が小さかったのでしょう。

## 試した（が、効果がなかった）方法
たくさん試しました。

### FittedBox に入れる

```dart
FittedBox(
  fit: BoxFit.scaledown,
  IconButton(
    onPressed: () {},
    icon: SvgPicture.asset(
      'assets/images/arrow_right.svg',
      color: Colors.black,
    ),
  ),
)
```
だめでした。

### SizedBox に入れる

```dart
SizedBox(
  width: 200,
  height: 200,
  IconButton(
    onPressed: () {},
    icon: SvgPicture.asset(
      'assets/images/arrow_right.svg',
      color: Colors.black,
      width: 200,
      height: 200,
    ),
  ),
)
```
だめでした。

### SizedBox に入れて、IconSizeを指定する

```dart
SizedBox(
  width: 200,
  height: 200,
  IconButton(
    onPressed: () {},
    iconSize: 200,
    icon: SvgPicture.asset(
      'assets/images/arrow_right.svg',
      color: Colors.black,
      width: 200,
      height: 200,
    ),
  ),
)
```

だめでした。

## 成功した方法
最終的に、[こちらのstackoverflowの記事](https://stackoverflow.com/questions/55571536/how-to-resizing-an-icon-icon-button-in-flutter) を参考にしてsvg画像の拡大に成功しました。


```dart
Transform.scale(
  scale: 2.5,  // 拡大したい倍率（多分）
  child: IconButton(
    onPressed: () {},
    icon: SvgPicture.asset(
      'assets/images/arrow_right.svg',
      color: Colors.black,
    ),
  ),
)
```

少し無理矢理のような気もしますが…。

何か私の方法が間違っていたりもっと良い方法があったりすれば教えていただければ幸いです。



#### 環境
Flutter 3.3.0
flutter_svg 1.1.5

#### 参考記事
https://stackoverflow.com/questions/55571536/how-to-resizing-an-icon-icon-button-in-flutter
Splunk: tonumber関数とtostring関数の使い方


###### 実施環境： Splunk Free 8.2.2

### 0. 概要

 Splunk の評価関数には tonumber 関数と tostring 関数の2つの関数が存在します。
名前的には変数の型を数値や文字列に変換するもののようですが、実はそうではありません。
今回はそんな2つの関数について解説していきます。

### 1. Splunk における変数型

そもそも、 Splunk において変数の型は Splunk 側である程度柔軟に処理してくれるため、意識することはまずありません。

```Splunk:Splunk
| makeresults count=1
| eval NUM = 1.2, STR = "1.2"
| eval NUM_IF_NUM = if( NUM > 0,       "OK", "NG"),
       STR_IF_NUM = if( STR > 0,       "OK", "NG"),
       NUM_IF_STR = if( LEN(NUM) == 3, "OK", "NG"),
       STR_IF_STR = if( LEN(STR) == 3, "OK", "NG")
```

![WS000235.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/6410745b-378f-1b28-9cfb-f020facb2876.jpeg "splunk")

では、 tonumber 関数、 tostring 関数は何のためにあるのでしょうか。
実は、2進数や16進数の値と通常の数値(10進数の値)を変換するのに用いられます。

### 2. tonumber

 tonumber 関数は、2進数や16進数の値を通常の数値に変換します。
 tonumber 関数は以下のように引数を指定することで、通常の数値を返します。

 tonumber(N進数の値, N)

以下の例では、2進数の値を通常の数値に変換しています。

```Splunk:Splunk
| makeresults count=1
| eval BASE2 = "01011110"
| eval BASE10 = tonumber(BASE2, 2)
```

![WS000238.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/82fd55d4-adfb-8d7e-c004-c5e226f917b4.jpeg "tonumber")


### 3. tostring

 tostring 関数は、通常の数値を16進数の値に変換します。
また、3桁毎にカンマ(,)を入れた数値や、秒数から時刻への変換といったフォーマットも指定できます。
 tostring 関数は以下のように引数を指定することで、各フォーマットの値を文字列として返します。

 tostring(数値, フォーマット)

フォーマットには以下の3種類が指定可能です。

|フォーマット|説明|例(変換前)|例(変換後)|
|:-|:-|-:|-:|
| hex | 通常の数値から16進数への変換 | 2022 | 7E6 |
| commas | 3桁毎にカンマ(,)を付与 | 1234567890 | 1,234,567,890 |
| duration | 秒数からHH:MM:SSへの変換 | 1000 | 00:16:40 |

以下の例では、通常の数値「9999」を各フォーマットに変換しています。

```Splunk:Splunk
| makeresults count=1
| eval NUM = 9999
| eval HEX = tostring(NUM, "hex"),
       COM = tostring(NUM, "commas"),
       DUR = tostring(NUM, "duration")
```

![WS000236.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/7ff43598-a666-1fa7-c8c0-1efcb9bc0de1.jpeg "tostring")

なお、注意点として、「 hex 」のみ小数に対応していません。
また、「 commas 」は小数の場合小数点以下2桁まで表示され、それより下は四捨五入されます。
「 duration 」は元の数値があまりに大きい場合、日数が先頭に示され、その直後にプラス(+)、時刻はさらにその後ろに記載されます。

```Splunk:Splunk
| makeresults count=1
| eval NUM = 12345678.555555
| eval HEX = tostring(NUM, "hex"),
       COM = tostring(NUM, "commas"),
       DUR = tostring(NUM, "duration")
```

![WS000237.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/3555a6d9-9c50-24d5-05d1-aef60d528fed.jpeg "big_number")
Salesforce モバイルアプリで PDF の扱い


Salesforce のドキュメントによると:
モバイル アプリ コンテキスト内で PDF ビューをレンダリングすることはできないため、これは設計どおりに機能しています。PDF がシームレスに表示されるように、ポップアップを許可するようにモバイル ブラウザーを設定してください。

[Salesforce モバイルアプリで PDF をプレビューおよびダウンロードします。](https://developer.salesforce.com/forums/?id=9062I000000IKOMQA4)

# [Salesforce for Android および iOS アプリケーションで PDF を開くコードを開発する](https://help.salesforce.com/s/articleView?id=000320807&type=1)

Salesforce for Android および iOS アプリケーションで PDF ビューを開くことができます。PDF はサムネイル ビューとして表示され、別のブラウザー ウィンドウでフル ビューにアクセスできるダウンロード リンクがあります。ただし、従うべきいくつかのベスト プラクティスと、知っておくべき既知の制限があり、ここで概説します。

**ベストプラクティス**
sforce.oneを使用します。モバイル アプリ環境で PDF を開くためのnavigateToSObject()イベント呼び出し。このメソッド呼び出しは、Salesforce for Android および iOS アプリケーション環境でのみ使用することを意図しています。Salesforce for Android および iOS アプリケーションで PDF を開くために URL 値をハードコーディングすることはお勧めしません。navigateToSObject() イベント コールは、Salesforce for Android および iOS アプリケーションから PDF ビューを表示するための推奨される方法です。

**注**: navigateToSObject()イベント コールは、モバイル デバイスの新しいブラウザ ウィンドウで PDF を開きます。モバイル アプリ コンテキスト内で PDF ビューをレンダリングすることはできないため、これは設計どおりに機能しています。PDF がシームレスに表示されるように、ポップアップを許可するようにモバイル ブラウザーを設定してください。

+ [Salesforce モバイルアプリで PDF 添付ファイルを表示できません](https://kb.opero.com/documents/knowledge-base/i-cant-view-the-pdf-attachment-in-salesforce-mobile-app/)

Salesforce モバイル アプリは Lightning で動作し、ファイル形式のみをサポートし、添付ファイルはサポートしていません。PDF を生成し、添付ファイルではなくファイルとして保存するには、ドキュメント アクションを構成する必要があります。