OmniAICreator/Qiita-1.07M huggingface dataset:
Azure Bicep_ユニークな名前でストレージアカウントを作成する

# Bicepでストレージアカウントを作成する際にユニーク値を付与する

## Bicepコード
ユニーク値を出力するために `uniqueString` を使用する。

リソースグループのスコープで一意にするために `${uniqueString(resourceGroup().id)}`とする。
※ユニーク値とは言うが、実際は引数のハッシュ値となるので注意。
参考：https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/templates/template-functions-string#uniquestring

```storageaccount-parameters.bicep
{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
      "storageAccountName": {
        "value": "examplesa"
      }
  }
}
```

```storageaccount.bicep
param storageAccountName string
param location string = resourceGroup().location

resource storageAccountName_resource 'Microsoft.Storage/storageAccounts@2019-06-01' = {
  name: '${storageAccountName}_${uniqueString(resourceGroup().id)}'
  location: location
  sku: {
    name: 'Standard_LRS'
    tier: 'Standard'
  }
  kind: 'StorageV2'
  properties: {
    supportsHttpsTrafficOnly: true
    encryption: {
      services: {
        file: {
          keyType: 'Account'
          enabled: true
        }
        blob: {
          keyType: 'Account'
          enabled: true
        }
      }
      keySource: 'Microsoft.Storage'
    }
    accessTier: 'Cool'
  }
}
```
作成されるストレージアカウント名(例)
examplesa_tcvhiyu5h2o5o

## デプロイ

```
az deployment group create --resource-group examplerg --template-file storageaccount.bicep --parameters storageaccount-parameters.json
```
WindowsでマルチPHPをもっと楽に実現する

[windowsでマルチPHPを実現する](https://qiita.com/marveloussound/items/4cccc17edcaad7855940)という記事を見かけたのですが、ジャンクションを使ったほうがもっと楽なのでやり方を紹介します。

シンボリックリンクでもいいんだけど何故か管理者権限が必要だし、今回の用途であればジャンクションで十分です。
なおショートカットでは駄目です。


# PHPをインストール

[PHP For Windows](https://windows.php.net/download)から適当にファイルをダウンロードして、適当にディレクトリに展開します。
今回はとりあえず
`C:\xampp\php7.4.26`
`C:\xampp\php8.0.13`
ってかんじに配置しました。

なんで`xampp`なのかって？
そりゃ[XAMPP](https://www.apachefriends.org/jp/index.html)を使ってるからに決まってる。


# エイリアスを設定

参考記事に合わせて記述すると、こんなかんじになるでしょうか。

```bash
vi /c/php/php

#!/usr/bin/bash
"/c/xampp/php/php.exe" $*
```

```bash
vi /c/php/php.bat

@echo off
"C:\xampp\php\php.exe" %*
```

```bash
vi ~/.bash_profile

alias php='/c/xampp/php/php'
```


私は環境変数PATHに`C:\xampp\php`って突っ込んで済ませますが。


# ジャンクションを作成

cmdで以下のコマンドを打つと、`C:\xampp\php`というジャンクションが作成されます。

```bash
mklink /J C:\xampp\php C:\xampp\php8.0.13
```

一見ショートカットに見えるのですが実際はジャンクションです。
見分け方はコマンドラインで`dir`か`cd`してみればいいです。

これで無事に、phpコマンドでPHP8.0.13が実行されるようになりました。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/6fe5d042-ab94-158c-9cb4-118b0e0d589b.png)

# PHPバージョンを変更

phpコマンドでPHP8.0.13が実行されるようになりましたが、これを変更してみましょう。
やりかたは以下のコマンドを打つだけです。

```bash
rmdir C:\xampp\php
mklink /J C:\xampp\php C:\xampp\php7.4.26
```

これでphpコマンドで実行されるPHPが、PHP7.4.26になりました。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/2ac7ea79-f801-3fd7-d70c-7b658a4e891c.png)

何処から使用するかを気にせず、ジャンクションを変更するだけで常に全てのPHPバージョンが切り替えられるようになります。
べんりですね。

これでコマンドを2個打つだけで、好きにPHPのバージョンを切り替えられるようになりました。
切り替えコマンドをバッチにして`phpvm use 8.1.0`みたいに書けるようにすると、もっと便利になるかもしれませんね。
というか実際それをやったのが`NVM for Windows`です。


# NVM for Windows

[NVM for Windows](https://github.com/coreybutler/nvm-windows)は、バージョン切り替えに上記と同じような仕組みを使っています。

`nvm install`でNodeをインストールすると`C:\Program Files\nodejs\`ディレクトリができるのですが、この`nodejs`はシンボリックリンクです(ジャンクションではない)。
実際の中身は`C:\Users\hoge\AppData\Roaming\nvm\v1.2.3`みたいなところに配置されて、`nodejs`はそこを参照するという構造です。

`nvm use 4.5.6`と打つと、このシンボリックリンクが`C:\Users\hoge\AppData\Roaming\nvm\v4.5.6`と切り替わり、以後は何処からnodeコマンドを打っても変更後のバージョンになります。
べんりですね。


このように、PHPやNodeだけではなく、インストールを必要としないソフトウェアであれば何にでも使える手法です。
なにか面白い使い方があったら教えてくださいね。


# まとめ

Docker使え？

知るか。
フォームsubmitした時に確認アラートの通知をする方法

## 概要
LaravelのテンプレートエンジンBladeを使っている時に確認アラートを出す。
フォームの内容は何かしらの期限を変更するもので、入力した期限が現在の期限を越える場合に更新していいかの確認アラートを出したいとする。

```HTML
<form action="{{ route('ルーティング') }}" method="post" onsubmit="return mail_alert('{{ 現在の期限 }}');" novalidate>
  @method('PUT')
  @csrf
  <fieldset class="form-group">
  <div class="row">
    <legend>期限</legend>
    <div class="form-check form-check-inline">
        <input type="text" name="name" value="value" class="form-control" id="id">
    </div>
  </div>
  </fieldset>
</form>

@push('script')
@include('_scripts.parsley')
<script>
  function mail_alert(現在の期限) {
    let 入力期限 = document.getElementById('id').value;
    if (現在の期限 < 入力期限) {
      return confirm('更新してよろしいですか？')
    }
  }
</script>
@endpush
```
VMware Cloud on AWSお勉強まとめ (初心者向け)

# 1. はじめに
VMware Cloud on AWSについて勉強するにあたり、参考にさせていただいたリンクをまとめます。巷ではVMC on AWSと略して呼称されたりするのですが(公式サイトURLもよーく見ると..)、本記事では正式名称VMware Cloud on AWSのままで記載します。

# 2. VMware Cloud on AWSって？
オンプレとクラウドのそれぞれに強みを持つ両社が共同開発したクラウドサービスです。Amazon EC2ベアメタルインスタンス上にVMware仮想環境が構築されています。詳しくは両社の公式サイトもどうぞ。

## [VMware Cloud on AWS (VMware公式サイト)](https://www.vmware.com/jp/products/vmc-on-aws.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/ffd52e2c-0826-6663-d228-c1e836909d17.png)


## [VMware Cloud on AWS (AWS公式サイト)](https://aws.amazon.com/jp/vmware/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/59bf59a5-a297-356d-a980-b276dd846d1c.png)


# 3. ユースケースとかも知りたい！
国内外を問わずブログやYouTubeなどたくさんあるのですが、まずはこちらからどうぞ。

## [VMware Japan Blog (VMware Cloud on AWS)](https://blogs.vmware.com/vmware-japan/product/vmware-cloud-on-aws)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/a2a6af91-f57b-f70a-dfc4-f36c30c38250.png)


## [Amazon Web Services ブログ (VMware Cloud on AWS)](https://aws.amazon.com/jp/blogs/news/category/compute/vmware-cloud-on-aws/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/343c3773-6ba1-abcb-3370-cd7eb45018ea.png)


## AWS Balck Belt (VMware Cloud on AWS)
AWS Black BeltでもVMware Cloud on AWSについてのトレーニングセッションが複数公開されています。AWSの中の人がお話されているだけに内容が非常に分かりやすく、初めての方もそうではない方も一度ご覧になると理解が深まると思います。(AWS Black Beltとは、AWSの方が特定のサービスやテーマについて解説されるセッションです。動画もしくは資料も公開されています。)

https://aws.amazon.com/jp/blogs/news/webinar-bb-vmwarecloudonaws-2021/

https://www.youtube.com/watch?v=WgSnOe7Duns

https://www.youtube.com/watch?v=D2gk3Ah0dGU

https://www.youtube.com/watch?v=xoOJ-1timik

## DevelopersIO (クラスメソッド)

https://dev.classmethod.jp/tags/vmware-cloud-on-aws/


# 3. もっと詳しく知りたい！

## VMware Cloud on AWS リファレンスアーキテクチャ
他のAWSサービスなどと組み合わせてどういった構成にすれば良いかなど、参考になるアーキテクチャがたくさんまとまっています。

https://aws.amazon.com/jp/vmware/resources/

## VMware Tech Zone

https://vmc.techzone.vmware.com/vmware-cloud-aws

## AWS re:Post

https://repost.aws/tags/articles/TAklgDcn6gSG-YOY3NGulOIA/vmware-cloud-on-aws

https://aws.amazon.com/jp/blogs/news/aws-repost-a-reimagined-qa-experience-for-the-aws-community/

## VMware Docs (VMware Cloud on AWS スタートガイド)
技術的な詳細や利用開始までの手続きなど、こちらのVMware Docsにもまとまっています。
[VMware Cloud on AWS スタートガイド (VMware Docs)](https://docs.vmware.com/jp/VMware-Cloud-on-AWS/services/com.vmware.vmc-aws.getting-started/GUID-3D741363-F66A-4CF9-80EA-AA2866D1834E.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/691aaddb-a633-9c5a-918b-5a65af546abb.png)

## 新機能開発 ロードマップ
[VMware公式サイト](https://www.vmware.com/jp/products/vmc-on-aws.html)から「**ロードマップ**」に遷移すると開発中、プレビュー中の新機能などが閲覧できます。まだまだ進化していくVMware Cloud on AWS、これからもアップデートが楽しみです!

# 4. 関連記事

https://qiita.com/sanjushi/items/ba6426b202215f39ba22

https://qiita.com/sanjushi003/items/175aad0ccdbb3488bfda
インフラエンジニア学習　CCNA　1119

CSMA/CDの三要素

・CS…キャリアセンス
　・利用状況の確認

・MA…マルチプルアクセス
　・平等な送信権

・CD…コリジョンディテクション
　・衝突した場合はジャム信号を送信して
　　ランダムな時間待機する


半二重通信と前二重通信のまとめ
半二重
・送信と受信を同時にできない。
・コリジョンが発生する事がある。

全二重
・送信と受信を同時にできる。
・コリジョンが発生することがない。


レイトコリジョンが発生する原因
・規定より長いケーブルの使用
・半二重/全二重の不一致
・NICの異常


L2スイッチ
・スイッチはデータリンク層のデバイス
・MACアドレスを基にフレームの転送を行う
・ポートごとにコリジョンドメインを分割する
・ブロードキャストドメインを分割できない
・VLANによってブロードキャストドメインを分割できる

コリジョンドメイン
・衝突（コリジョン）の発生が伝わる範囲

ブロードキャストドメイン
・ブロードキャストが届く範囲


MACアドレステーブルは、フレーム受信時に、送信元MACアドレスの情報をMACアドレステーブルに登録して作る。

受信したポート以外のポートからデータを送信することをフラッティング

ブロードキャスト通信をする際は宛先MACアドレスがff-ff-ff-ff-ffになる。


スイッチはブロードキャストのデータを通すがルーターはブロードキャストのデータを通さない。

ブロードキャストアドレスはMACアドレステーブルに登録されない。

スイッチは登録がないMACアドレスのフレームを受信すると、受信ポート以外のポートから転送する。


ルータの特徴
・ブロードキャストを制御する
・WANへの接続
・異なるネットワークへ接続
・パケットのスイッチング


ホスト
・IPアドレスを持っている。
・経路制御を行わない。

ノード
・IPアドレスを持っている。
・経路制御を行う。←ルータ

デフォルトゲートウェイ
・ホストが別ネットワークと通信するための出入り口
SSL証明書はなんのために必要？

## はじめに
この記事は[ペライチアドベントカレンダー](https://qiita.com/advent-calendar/2021/peraichi)の1日目の記事です。

誰でも簡単にホームページが作れる[ペライチ](https://peraichi.com/)では常時SSL化に対応していて、ユーザーさんやCSなど社内の非エンジニアさんとのコミュニケーションの中でも「SSL証明書」について話題になることがあります。その中でよく気になるのが、みなさん「暗号化通信のためにSSL証明書が必要」だと思っていることが多いことです。

エンジニアでない方々にはそのような理解でもだいたい差し支えはないとは思いますが、SSL証明書についてググって出てくる記事などもほとんど「暗号化通信のためにSSL証明書が必要」と書いてあることが多く、たまに本当にそう思っているエンジニアもいたりするので、SSL証明書が何のために必要なのか？について書いてみようかと思いました。

## HTTPSについて
HTTPSはHTTP Secureの略で、TLSという通信プロトコルを使ってHTTPを安全に保護する通信プロトコルです。（昔はTLSではなくSSLというプロトコルが使われていました。現在はSSLはほぼ使われていませんが、SSLの知名度が高すぎてTLSが一般の方々に定着していません。SSLと言うとTLSのことを指していることが多いです）
TLSの機能に「通信の暗号化」があり、HTTPS通信を行うためには「SSL証明書」が必要になるので、「暗号化通信のためにSSL証明書が必要」という理解になってしまうのだと思います。

TLSの主な役割は以下の通りです。

- 通信の盗聴の防止（通信の暗号化）
- 通信の改ざんの防止
- 通信相手のなりすましの防止

この中でも特に通信の盗聴の防止や改ざんの防止は役割をイメージしやすいですが、なりすましの防止については一般の方々に説明するには少々面倒だなだと思います。

## 通信の暗号化
暗号化通信では、事前に暗号鍵を通信相手と互いに共有しておき、この鍵を使って暗号化・復号化を行います。TLSでは「鍵共有プロトコル」と呼ばれる方法で暗号鍵を共有します。

（鍵共有のためにSSL証明書に登録された公開鍵を使う場合がありますが、公開鍵を使わなくても鍵共有をする方法があり、SSL証明書は必須ではありません）

## 通信相手のなりすまし
「なりすまし」とは、通信経路に細工をして、本来通信したい相手とのやりとりを乗っ取る行為です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6389/0ee8d787-6a8f-db57-9a94-84268facd94a.png)

暗号化通信で盗聴の防止をしていても、なりすましをされると、攻撃者との間で暗号鍵を共有し、攻撃者との間で暗号化通信が行われます。つまり暗号化通信をしていても通信内容を盗聴されてしまうのです。

## SSL証明書
さて、ここで出てくるのがSSL証明書です。
SSL証明書とは、認証局と呼ばれる機関がサーバーなどに対して発行する電子証明書です。SSL証明書はサーバーの公開鍵を認証局が署名したものです。
攻撃者は認証局が署名した公開鍵のペアになる秘密鍵持っていないため、SSL証明書を偽造することができません。通信者はSSL証明書を認証局に確認することで通信相手が意図した相手かどうかを確認することができます。

## まとめます
細かい話をだいぶ端折りましたが、

- 「暗号化通信」を行っていても、通信の内容が盗聴されてしまう方法があり、それが「なりすまし」です。
- SSL証明書の役割は「なりすまし」の防止です。

と言う話でした。

通信の「暗号化」のために「証明書」が必要ってどう言うことよ？みたいなことに疑問を持って調べてみると良いんじゃないかなと思います。

おわり。
Azure ARMテンプレートをBicepに変換

# Azure ARMテンプレートをBicepに変換してデプロイを行う手順

## Bicepとは
[Azure リソースをデプロイするための Bicep 言語 - Azure Resource Manager | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/bicep/overview#:~:text=Bicep%20%E3%81%AF%E3%80%81%E5%AE%A3%E8%A8%80%E5%9E%8B%E3%81%AE,%E5%9B%BA%E6%9C%89%E8%A8%80%E8%AA%9E%20(DSL)%20%E3%81%A7%E3%81%99%E3%80%82&text=Microsoft%20%E3%81%A7%E3%81%AF%E3%80%81Bicep%20%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%20Azure,%E3%82%8B%E3%81%A8%E4%BF%A1%E3%81%98%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82)
>Bicep は、宣言型の構文を使用して Azure リソースをデプロイするドメイン固有言語 (DSL) です。 簡潔な構文、信頼性の高いタイプ セーフ、およびコードの再利用のサポートが提供されます。 Microsoft では、Bicep によって Azure のコード ソリューションとしてのインフラストラクチャに最適な作成エクスペリエンスが提供されると信じています。

これまでのJson形式だったARMテンプレートより、完結で分かりやすくなった。
かつ、ARMテンプレートをDecompileすることでBicepテンプレートとして出力できるため今までの資産が無駄にならない。

## 変換
az cli

```
$ az bicep decompile --file main.json
```

### 変換前JSONファイル例

```json:main.json
{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageAccountType": {
      "type": "string",
      "defaultValue": "Standard_LRS",
      "allowedValues": [
        "Standard_LRS",
        "Standard_GRS",
        "Standard_ZRS",
        "Premium_LRS"
      ],
      "metadata": {
        "description": "Storage Account type"
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Location for all resources."
      }
    }
  },
  "variables": {
    "storageAccountName": "[concat('store', uniquestring(resourceGroup().id))]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2019-06-01",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[parameters('storageAccountType')]"
      },
      "kind": "StorageV2",
      "properties": {}
    }
  ],
  "outputs": {
    "storageAccountName": {
      "type": "string",
      "value": "[variables('storageAccountName')]"
    }
  }
}
```


### 変換後Bicepファイル例

```main.bicep
@allowed([
  'Standard_LRS'
  'Standard_GRS'
  'Standard_ZRS'
  'Premium_LRS'
])
@description('Storage Account type')
param storageAccountType string = 'Standard_LRS'

@description('Location for all resources.')
param location string = resourceGroup().location

var storageAccountName_var = 'store${uniqueString(resourceGroup().id)}'

resource storageAccountName 'Microsoft.Storage/storageAccounts@2019-06-01' = {
  name: storageAccountName_var
  location: location
  sku: {
    name: storageAccountType
  }
  kind: 'StorageV2'
  properties: {}
}

output storageAccountName string = storageAccountName_var
```

## Bicepデプロイ方法

az cli

```
$ az deployment group create --resource-group cloudshelltest --template-file main.bicep
```

パラメータファイルがある場合はJSON形式のまま使用する

```
$ az deployment group create --resource-group cloudshelltest --template-file main.bicep --parameters main-parameters.json
```
リード獲得は蟻地獄(マーケティング編）

#リード獲得の始まり
4月からマーケティングをやっていて、学べば学ぶほど案件受注が遠のいていく気がする。とてつもなく労力をかけてもリターンが雀の涙程度だとモチベーション保つのも難しいわって話なの:girl_tone2:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518723/8658325e-6c81-6eaa-1ae2-870544b042de.png)
#活動内容
最初のリード獲得に向けたマーケティング活動が地道すぎるって話なんですけんど、これまで取り組んできたこととしては以下のイベントなどなど。
①ウェビナー
https://www.ap-com.co.jp/pressrelease/post-7857
※2021年は4回開催
スーパーエンジニアの皆さんに感謝感激です:girl:

②展示会
https://www.interop.jp/
https://www.janog.gr.jp/meeting/janog48/

③WPのダウンロード施策
https://www.ap-com.co.jp/network-automation/whitepaper/

#半年ほどの成果と感想
これまで活動をしてきて受注した！という事が無い悲しみ。
一般企業だとDMしまくるシステムを導入しているだろう。まさか私が1人1人にGmailでメール送るって思ってたりするのかな？コスパ悪杉君だと分かっているけど地道な活動が実を結ぶと思いながらやっているの:girl_tone2:
インサイドセールスとやらを理解していないのを痛感しているところです...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518723/64c3282f-2dd8-fd3b-1707-efac81e1ffae.png)

とはいえ、リードはそれなりに獲得出来てきているので、その次のアポ獲得をしていく壁を乗り越えないといけないなと思っておるんです。
この壁を乗り越えたら提案フェーズになって、受注に向けたクロージングをしてくと。
・・・
長い道のりっす。圧倒的リソース不足と知識不足。
[Twitter](https://twitter.com/higashim4/status/1453006036441370638)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518723/b39de773-786f-6ca4-7ade-339e8132cc61.png)
（地道な活動だ....)
#まとめとただの感想(意気込み)
落ちもなんやけど、マーケティング活動は中長期（半年～1年以上）の戦略だなってつくづく思うわけで、SIの業務が体内メモリに染み付いたおっさんの私からしたら3か月、6か月のスコープで結果を出したいと思ってしまうわけなんです:girl_tone2:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518723/ce32d474-984e-50e7-2f62-7967a2318218.png)
胸の中で西川師匠の言葉「**小さなことからこつこつと**」を持ち合わせならが継続してやっていこうとおもいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518723/b8267164-7a0e-3056-1027-e58007b97c3b.png)
AOJトライに関する知識知見の記録共有：Volume0-0044

# タスク概要
Prime Number II

https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0044
 
# コード実装例
TIPS

1. 例外処理含む評価パターンを追加
1. 入力値自体が素数にその旨出力
1. 出力数をパラメータ変数指定し調整可能に

```Python
import pprint, sys
import sympy 

def core(arg, n=3):
    r = [arg] if sympy.isprime(arg) else []
    return [sympy.prevprime(arg)] + r + [sympy.nextprime(arg, i) for i in range(1, n+1)]

def app(*args):
    ret = []
    for arg in args:
        try:
            r = core(arg)
        except Exception as e:
            r = e
        ret.append([arg, r])
    return ret

print(sys.version)
pprint.pprint(app(
    # basic examples
    19,
    3517,
    # additional examples
    7.1,
    # exceptional examples
    "例外入力"
))
```

# 実行結果
各種補足情報出力（入力値FB、デバッグログ等）含む

```
3.8.10 (default, Jun  2 2021, 10:49:15) 
[GCC 9.4.0]
[[19, [17, 19, 23, 29, 31]],
 [3517, [3511, 3517, 3527, 3529, 3533]],
 [7.1, [7, 11, 13, 17]],
 ['例外入力', ValueError('ceiling(例外入力) is not an integer')]]
```

# 補遺
残課題
1. 実行速度の改善（枝刈り、データ構造の見直し等）
【PHP】xDebug.soの読み込みエラーが発生した時の対処法

AWSのCloud9でPHPファイルを実行したときにxDebug.soの読み込みエラーが発生した時の対処法。

PHPのバージョンとxdebugが揃っていない場合などに生じるエラー。

## エラー文

```
Failed loading /xxxxx/xxxxx/xxxxx/xdebug.so:  
/xxxxx/xxxxx/xxxxx/xdebug.so: undefined symbol: gc_globals
```
xxxxxの部分は`xDebug.so`があるパスです。

## 解決方法

`xdebug`を削除してインストールし直せばエラーが解決されます。

```
sudo pecl uninstall xdebug
sudo pecl install xdebug
```

## 参考

https://error-search.com/error-post/detail/168/Failed%2Bloading%2B%252Fusr%252Flib64%252Fphp%252Fmodules%252Fxdebug.so%253A%2B%2B%252Fusr%252Flib64%252Fphp%252Fmodules%252Fxdebug.so%253A%2Bundefined%2Bsymbol%253A%2Bvspprintf

## PHPのお役立ち情報

https://wagtechblog.com/programing/php-school

https://wagtechblog.com/programing/php-book
【超初心者】Django初学者がつまずいた初期設定エラーとインストール【VSCode/PowerShell】

#はじめに
この記事は、Djangoをインストールして簡単なアプリを作成する。
という過程の**初学者（私）のエラーに対する原因と対策**のまとめです。
また、Djangoのインストールについても記載しました。

###対象者

私のような、**超初心者の方向け**だと思います。
経験者の方はスルーでいいかもしれません。

###環境
windows10
vscode（vscode内のターミナルpowershell）

#★目次
[1.実行ポリシーによるエラー](#1.実行ポリシーによるエラー)
[2.パスの間違いによるエラー](#2.パスの間違いによるエラー)


[3.Djangoインストールについて](#Djangoインストールについて)
#1.実行ポリシー(Execution_Policies)によるエラー
:::note warn
このシステムではスクリプトの実行が無効になっているため、（ファイル）を読み込むことができません。
:::
![無題3-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2249152/3cfe6707-c3de-e132-1f60-9021c6fcbbd0.png)

vscodeのターミナルを開いた瞬間に怒られました・・・
え、俺、何かした・・・？

##原因と対策
よくよく探ってみると
**実行ポリシー(Execution Policies)が初期値**が原因でした。
これを調べるために、ターミナル（powershell）に以下のように記述します。

```
PS C:\Users\ユーザー名\Helloworld> Get-ExecutionPolicy
Restricted
```

`Restricted`→制限されている。

 [Microsoft:about_Execution_Policies](https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.2)
上記のMicrosoftの記事によると
**「個々のコマンドを許可しますが、スクリプトは許可しません。」**
となっており、スクリプトの実行ができなくなっている状態です。

これを以下のようにすると、

```
PS C:> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
```

`Restricted`　⇒　`RemoteSigned`
に変えることができます！

![無題6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2249152/c323a121-80e1-1de1-5c06-ca956fd6cc64.png)

`RemoteSigned`に変更完了！！
 [Microsoft:about_Execution_Policies](https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.2)
上記によると**「スクリプトを実行できます。」**
なっており、これで実行できるようになりました！


※ちなみに[2.パスの間違いによるエラー](#2.パスの間違いによるエラー)にも記載しますが
`cd`の位置に気を付けないとエラーが出ますので注意。


#2.パスの間違いによるエラー
:::note warn
パスが存在しないため検出できません。
:::
![無題7-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2249152/548aa801-ab6d-dad9-8cbc-2ef1113b86bd.png)
##原因と対策
**PS（パス）が間違っている**ことが原因でした。

ちなみに`cd`とは**カレントディレクトリ**といい
簡単に言うと**「現在位置」**を表しています。


つまりこの時、cdを指定する記述が違っていたためエラーがでました。
![無題8-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2249152/d0722339-4f54-0eb0-1701-431c061bffe4.png)
この場合、
`cd ..\..`を使うとパスをさかのぼることができます。
そのうえで、
`cd ディレクトリ名（フォルダ名）`で**正しいパスを指定**することで解決しました。


#Djangoインストールについて

初期設定に関するエラーを乗り越えた後は
まずは`Python`を下記のようにインストール。

```
python -m venv djangovenv
```

####そして仮想環境構築！！
以下のようにしました。

![無題7-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2249152/9812eb27-ec0e-7aa3-39fd-8ff586ba18fc.png)

`(djangovenv)`が出ればOKです。

:::note info
point！忘れずに仮想環境を起動しましょう！
:::


そのうえで、以下の通り`django`をインストールします。

```
pip install django==3.0.0 
```

Django のバージョンも確認してみます。
![無題9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2249152/6fb0f377-ce6b-5b8c-ad46-f0aa2fcb5651.png)


これでDjangoインストール完了です。
お疲れさまでした。
**（筆者は環境構築の理解に1日かかりました・・・難しかった・・・）**

#参考文献
https://qiita.com/Targityen/items/3d2e0b5b0b7b04963750
ELFのSection header名一覧を表示する技術

## コード

```c:read_elf.c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <elf.h>
#include <sys/stat.h>
#include <sys/mman.h>

int main(int argc, char *argv[]) {
    int fd, i;
    struct stat sb;
    char *head;
    Elf64_Ehdr *ehdr; // elf header
    Elf64_Shdr *shdr; // section header
    Elf64_Shdr *shstr; // section string

    fd = open(argv[1], O_RDONLY);
    fstat(fd, &sb);
    head = mmap(NULL, sb.st_size, PROT_READ, MAP_SHARED, fd, 0);

    ehdr = (Elf64_Ehdr *)head;

    // head is address
    shstr = (Elf64_Shdr *) (head + ehdr->e_shoff + ehdr->e_shentsize * ehdr->e_shstrndx);

    for (i = 0; i < ehdr->e_shnum; i++) {
        shdr = (Elf64_Shdr *) (head + ehdr->e_shoff + ehdr->e_shentsize * i);
        printf("%s\n", (char *)(head + shstr->sh_offset + shdr->sh_name));
    }

    munmap(head, sb.st_size);
    close(fd);

    exit (0);
}
```

```sh
$ clang read_elf.c ./a.out a.out
.interp
.note.gnu.property
.note.gnu.build-id
.note.ABI-tag
.gnu.hash
.dynsym
.dynstr
.gnu.version
.gnu.version_r
.rela.dyn
.rela.plt
.init
.plt
.text
.fini
.rodata
.eh_frame_hdr
.eh_frame
.init_array
.fini_array
.dynamic
.got
.got.plt
.data
.bss
.comment
.symtab
.strtab
.shstrtab
```

## メモ

### `shdr->sh_name`

`shdr->sh_name`はsection nameのアドレス値が入ってるのではなく、`Section header string table`からsection nameまでのoffsetである.

なので、`head + shstr->sh_offset + shdr->sh_name`は、
mmapされたfileの先頭アドレス + fileの先頭アドレスから`Section header string table`までのoffset + `Section header string table`からsection nameまでのoffsetである.

なお、mmapがどういう仕組み・アルゴリズムでfileをメモリ上にマッピングしているのかはここでは触れない.

### `ehdr = (Elf64_Ehdr *)head;`

最近リトルエンディアンについて触れたので、これについても改めてメモをする.

```c
ehdr = (Elf64_Ehdr *)head;
```

ehdrはこの右側に書いたElf64_Ehdr領域に対する直接的な操作になるだけである.

![Shared Private Board@2x (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141711/194e8e4d-9bca-e0b8-2783-7efc08d6e43b.png)
Shared Private Board@2x (2).png

## その他参考資料

[ELFのSection header string table indexセクションの中を表示する](https://qiita.com/kahirokunn/items/1c68425f9720dabc6b93)
[リンカ・ローダ実践開発テクニック―実行ファイルを作成するために必須の技術](https://www.amazon.co.jp/%E3%83%AA%E3%83%B3%E3%82%AB%E3%83%BB%E3%83%AD%E3%83%BC%E3%83%80%E5%AE%9F%E8%B7%B5%E9%96%8B%E7%99%BA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E2%80%95%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E5%BF%85%E9%A0%88%E3%81%AE%E6%8A%80%E8%A1%93-COMPUTER-TECHNOLOGY-%E5%9D%82%E4%BA%95-%E5%BC%98%E4%BA%AE/dp/4789838072/ref=pd_lpo_1?pd_rd_i=4789838072&psc=1)
Fastlaneでアプリのスクリーンショットを自動化してみた

## はじめに
1つ前の記事で、FastlaneでXCTestを自動化するという記事を書いたのですが、今回はその続きでアプリのスクリーンショットを自動化する記事を書いてみました。

https://qiita.com/ctnc_67/items/e5e0bae431b3025f4255

Fastlaneをこれから導入するという方は、Fastlane導入については前記事をご参照ください。
今回はsnapshotを撮るところだけに焦点を当てていきます。

あと、前提としてプロジェクトにXCUITestは導入されている前提で進めます。

## この記事で学べること
- snapshotとは？
- アプリのスクショの自動化(スナップショット)
- スクショ自動化のための細かいオプション

## Snapshot導入
### fastlaneのsnapshotとは
アプリのスクリーンショットを自分で実機やシュミレーターを操作しながら取得する作業を自動化してくれるツールです。

スマホアプリ開発において「色々な大きさの機種のスクショを全画面取得せよ！」なんていうミッションは、よく課せられると思います。
そこで、このツールを導入することで作業が自動化され、マンパワーとコスト削減につながります。

### 導入してみる

#### snapfileの作成
```
bundle exec fastlane snapshot init
```

を実行すると、/fastlaneに`Snapfile`と`SnapshotHelper.swift`が生成されます。

#### SnapshotHelper.swiftをXCUITestに追加
生成された`SnapshotHelper.swift`をドラッグアンドドロップで、プロジェクトのXCUITestの直下に追加します。
こんな感じです。

![photo1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580445/5dd0320b-9a51-1c85-448f-bd4d92d57a91.png)

#### テストコードに初期化処理を追加
`setupSnapshot(app)`をアプリ起動前に追加します。
スクリーンショットを取得したいタイミングで`snapshot("image名")`を追加します。

```swift
func testLogin() throws {
        
    let app = XCUIApplication()
    setupSnapshot(app)
    app.launch()

    let loginPage = LoginPage(app: app)
    snapshot("ログイン画面")
    XCTAssertTrue(loginPage.pageTitle.identifier == "ログイン画面")
    
    loginPage
        .typeUserId("123456")
        .typePassword("123456")
        .tapLoginButton()
    
    let memberListPage = MemberListPage(app: app)
    snapshot("メンバー一覧")
    XCTAssertTrue(memberListPage.viewController.exists)
}
```

#### Snapfileを編集して最適化する
僕が使っているのはこの辺のパラメーターです。より詳しい情報はこちらにあります。

https://docs.fastlane.tools/actions/snapshot/


```php
// テストしたいデバイス一覧
devices([
  "iPhone 8"
  # "iPhone 8 Plus",
  # "iPhone SE",
  # "iPhone X",
  # "iPad Pro (12.9-inch)",
  # "iPad Pro (9.7-inch)",
  # "Apple TV 1080p",
  # "Apple Watch Series 6 - 44mm"
])

// テスト実行の時に使用する言語一覧
languages(["ja-JP"])

// スクリーンショットをどこに保存するか
output_directory("./screenshots")

// スクリーンショット取得時に前回取得した分を破棄するかどうか
clear_previous_screenshots(true)

// 自動実行するテスト(スクリーンショット取得用メソッド)を個別指定可能
only_testing(["Switf5UITestTrainUITests/Switf5UITestTrainUITests/testLogin"])
```

#### スクリーンショットを取得する
ここまでで準備は完了です。あとは以下のコマンドを叩いてスクリーンショットを取得するのみ！

```
bundle exec fastlane snapshot run
```

こんな感じで緑のハートが出力されていれば成功です。

```
+----------+-------+
| snapshot results |
+----------+-------+
| Device   | ja-JP |
+----------+-------+
| iPhone 8 |  💚   |
+----------+-------+
```

終わったタイミングでHTMLファイルが生成されてブラウザで開かれるので、完了タイミングはわかります。
`.png形式`のファイルも指定したディレクトリに保存されているはずです。


## 注意点・ハマったポイント
#### スナップショット取得のためのテストが失敗(エラー)になると厄介
テスト自体が失敗されると、再ビルド→再テスト(スクショ取得)を複数回、繰り返します。
そのため、プロジェクトによっては、終了までに膨大な時間がかかります。

対策としては、

- `only_testing`などを活用して無駄なテストが実行されないようにする
- snapshot取得テストの前に、snapshot取得で使うテストを、通常の自動テストですべて成功するか確認してから開始する

などが挙げられます。

#### 取得したスナップショットの.pngファイルは順不同で保存されるので画面などがバラバラになってしまう
例えば1画面で複数のスクショが必要な場合、保存されるときはその関連性がないので、保存順がバラバラになります。
なので、後で見たときにどのスクショがどこにあるかわからなくなります。

なので名前をつけるときは、画面名をただ指定するよりは、`"画面IDなど_画面名"`にして、関連性のあるスクショがまとまって出力されるようにしたほうがいいと思います。

## おわりに
今回、プロジェクトでスクショを撮るのを自動化したいということで、色々調べながらやってみました。
1回覚えてしまえば色々なプロジェクトで活用できるので、便利だなと思いました。
SwiftUIの.clippedは何をしている？？

## 概要
SwiftUIの記述で`.clipped`をよく見かけます。
これが何をしてくれるのか分からなかったので調べてみます。

## 公式より
和訳を添付します。

:::note info
clipped（antialiased :)修飾子を使用して、シェイプのレイアウト境界を超えて拡張するコンテンツを非表示にします。
:::

:::note info
デフォルトでは、ビューの境界フレームはレイアウトにのみ使用されるため、フレームの端を超えて拡張されたコンテンツは引き続き表示されます。
:::

https://developer.apple.com/documentation/swiftui/view/clipped(antialiased:)


## `.clipped`あるなしで比較する

###### ある場合

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551042/68c5f54a-3283-96eb-900b-c318cb4e2853.png" width="300" />


```swift:ClippedSample.swift
struct ClippedSample: View {
    var body: some View {
        Text("This long text string is clipped")
            .fixedSize()
            .frame(width: 175, height: 100)
            .clipped()
            .border(Color.gray)
    }
}
```

##### ない場合

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551042/123406a9-be81-6808-e794-b799c90bc09b.png" width="300" />


```swift:ClippedSample.swift
struct ClippedSample: View {
    var body: some View {
        Text("This long text string is clipped")
            .fixedSize()
            .frame(width: 175, height: 100)
//            .clipped()
            .border(Color.gray)
    }
}
```

フレームを超えるコンテンツを切り取ってくれるみたいです。
UICollectionViewDelegateFlowLayoutにはDelegateって書いてたなって話

#今回の内容


* 数日前に、`UICollectionView`をアプリで使う為`UICollectionViewDelegateFlowLayout`を使ったら、プログラムが効いておらず`「おや？」`ってなったので、その時の事を書いてます。

##いきなり結論

* `作成したUICollectionView.delegate = self`を書き忘れていた為、`UICollectionViewDelegateFlowLayout`が働きませんでした。

##なぜ気づかなかったか

* 当時、作成したアプリは`UICollectionView`に表示するだけのつもりだった為、`delegateメソッド`は使わないよねって思ってしまった事

##解決

* 数分考えた結果、`UICollectionViewDelegateFlowLayout`には`Delegate`って書いてるから、`.delegate = self`が要るなって気づきました。

# 終わり
まだまだ、理解が出来てない事があって楽しい。
ご指摘、ご質問などありましたら、コメントまでお願い致します。
例外処理　その１　-初心者メモ

例外処理とは、エラーが出る可能性がある処理に対して、エラーが出ても（例外が発生しても）、代わりに実行される処理のこと。

```Python
def div(num1,num2):
  try:
    print(f'Answer= {num1/num2}')
 
 except ZeroDivisionError as e:
    print(e)

  except TypeError as t:
    print(t)

  else:
    print('正常に終了')

  finally:
    print('すべての処理が終了')
```

tryしてみて、エラーならexcept以下が実行される。

elseは、tryが成功したときに表示される。

finallyはtryの成功失敗にかかわらず実行される。

出力結果例

```Python
div(1,2)
#Answer= 0.5
#正常に終了
#すべての処理が終了

divide(1,0)
#division by zero
#すべての処理が終了しました
```
expoでiOSシュミレーターが開けない

ひさしぶりに環境の再構築をして[expo](https://expo.dev/)をインストールしたら下記のような表示が出てiOSシュミレータが起動しません。Xcodeはすでにインストール済みです。

```
› Opening on iOS...
✔ Xcode needs to be installed (don't worry, you won't have to use it), 
would you like to continue to the App Store? … (Y/n)
Unable to verify Xcode and Simulator installation.
```

`xcode-select --install`をしてもすでにインストール済みと表示されます。

```
❯ xcode-select --install
xcode-select: error: command line tools are already installed, 
use "Software Update" to install updates
```

## 解決方法

xcodeの環境設定の「Location」の一番下の「Command Line Tools」が空白になっていたので、きちんと選択すると治りました。

![スクリーンショット 2021-11-19 22.44.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/c08c3f2d-00a6-2160-fffa-d2b3866608c2.png)

たぶんXcodeを使う前にHomebrewやらVSCodeをインストールした時に「Command Line Tool」を入れてしまったので、パスがXcode側で認識していなくて影響が出たような気がします。

ちょっとハマったので共有します。
【ビジネス】片側検定と両側検定の違い

# 概要
データサイエンス$\times$コンサルとして働いている筆者が、最近、ビジネスで効果検証の結果をTG（Target Group）とCG（Control Group）で結果を比較した際に有意差を求めるタスクが振られた。その際に片側検定と両側検定をどのように選定すればいいのかを調べ、有識者にも話を聞いたため、その話をまとめようと思う。

# 検定とは
「統計的仮説検定（検定）」とは確率を元に結論を導く方法である。様々な検定（t-検定など）がある。それぞれの検定に特徴があるがその検定に関しては別のブログでまとめようと思う。（編集中）

# 片側検定と両側検定
検定する結果が**良くなる、または悪くなる**ことに興味がある場合は**両側検定**を行い、一方で結果が**良くなる**ことに興味がある場合（**悪くなる**ことに興味がある場合）には**片側検定**を行う。

## 例1
例えば簡単な例で言うとコイントスが挙げられる。表（H)と裏（T）の出る確率が 0.5 **であると思われる**コインが本当に歪んでいないかを検定する。

- 「コインが歪んでいる」という仮説を**帰無仮説**
- 「コインは歪んでいない」という仮説を**対立仮説**

と呼ぶ。
100回コイントスを行い、HとTが何回ずつ出たかを測定してその結果からこのコインが歪んでいないことを検定で確認したい。この時、興味があるのは**コインが表か裏か偏りすぎていないか**であるため、両側検定をするのが適切である。

## 例2
新品の曲がっていない（Hが出る確率0.5、Tが出る確率0.5）であるコインがあり、Hが出るようにしたいため少し曲げて見た。果たして本当にHが出やすくなったのかを検定で確認する。

- 「コインはHが出やすくはない」という仮説を**帰無仮説**
- 「コインはHが出やすい」という仮説を**対立仮説**

と呼ぶ。
同様に100回コイントスを行い、HとTの回数を測定する。ここで興味があるのは**出たコインは表に偏っている**ことであるから片側検定を行うのが適切である。

## ビジネス上では
ここまでは理論的な話をしてきたが、実際にどういう場面で両側検定と片側検定を行えばいいのだろうか。何かの施策を打ち出した時にその結果が良くなっているかを確認する場合はどちらの検定を行うべきであろうか。一見**良くなるのを確認する**ためであるから片側検定に思えるかもしれないが、$\alpha$ををその場合（一般的には）0.025に設定するが、なぜ両側検定ではなくかつ$\alpha$を0.05に設定していないのかを説明する必要が出てくる。また、統計ではある程度恣意的に値を操作するのはタブーとされているのも大きな理由の一つだろう。そこまでの労力を割くのであれば、両側検定を行い、帰無仮説を棄却し、実際の測定値を確認して、この施策は有意差があった、と述べる方が圧倒的に労力を必要としない。

では、片側検定は普段どのような場面で使われるべきかと言うと、**必ず結果が良くなる**ことが保証された状況であり、その結果が良くなることが偶然なのか否かを調べる時にのみ使われるべきである。

# 思ったこと
結局のところ、ビジネスでは相手に伝えやすいように工夫するべきであり（恣意的に値を操作するわけではない）、数学的厳密性というのはある程度は緩くしてもいいのかもしれない。
Rails6 Ruby3 で Segmentation fault が発生する

# バージョン情報
Ruby 3.0.0
Rails 6.1.3.2

# 現象
起動したRailsアプリを何度か操作していると以下のエラーが発生してWebアプリが停止してしまう。

```
/root/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/actionpack-6.1.3.2/lib/action_dispatch/routing/route_set.rb:317: [BUG] Segmentation fault at 0x0000000000000010
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux]
```

# 調査

Githubに似たような現象が起きているissueがある・・・

https://github.com/sass/sassc-ruby/issues/197

こちらの方の記事によるとアセットプリコンパイルとwebpackerのコンパイルのタイミングの問題らしい。

https://qiita.com/SoarTec-lab/items/5266b4465b417b641d73

config/initializers/assets.rb

```ruby
Rails.application.config.assets.configure do |env|
  env.export_concurrent = false
end
```

Githubのissueの方にはこれを追記すれば解消するよと書かれているように見える。
試してみたが効果なし・・・。

困った・・・。

# エラー見た限りRubyのバグっぽいからバージョン上げれば解消するんじゃね？
Ruby 3.0.2に思い切ってバージョンアップしてみた。

解決した・・・笑
iPhone iOS 15.1 の出力音質を引き上げる設定

iPhone iOS 15.1 の出力音質を引き上げる設定についてメモします。
iOS 15.1 はデフォルト設定では最高音質にはならないことがあり、以下のように設定変更が必要です。

## 前提条件

このメモは以下の環境で確認および記述しました。

* iPhone `iOS` `15.1` (iPhone SE 第一世代)
    * iPad mini 4 でも動作確認実施済み
    * iPhone SE 第二世代において動作確認実施済み
* `Roland Rubix22` (USB接続オーディオインタフェース)
* [Ruelen: iPhone Lightning - USBカメラアダプタ](https://www.amazon.co.jp/gp/product/B09C5DZC28) (手元にあったのでこれを利用。動作保証するものではありません)

# iPhone と DAC （Roland Rubix22) とを接続する

* iPhone と DAC とを接続します。
* 私は [Ruelen: iPhone Lightning - USBカメラアダプタ](https://www.amazon.co.jp/gp/product/B09C5DZC28) を利用して iPhone SE (第一世代) と `Roland Rubix22` とを接続しました。なお、これは手元にあったケーブルがうまく動作したに過ぎません。この記事が動作保証するものではないことに留意してください。

# iOS 15.1 の設定

## ミュージックの設定を開く

* `設定` の検索窓で `ミュージック` を入力して `ミュージック` を検索して、タップして起動します。

![iPhone01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105739/b297f699-b69b-0114-2a0e-7305f9dd251b.png)

## オーディオの品質を設定

`ミュージック` の `オーディオの品質` をタップします。

![iPhone02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105739/86cf848d-2f1d-efdf-52ae-5690a9bb5053.png)


* `ロスレスオーディオ` スイッチをONにします。
* 次に `Wi-Fiストリーミング` をタップします。

![iPhone03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105739/b1c5a9d9-233a-1474-733e-c06f7c1e240c.png)

* 一覧から Rubix22 の最高音質に相当する `ハイレゾロスレス` ALAC (最大24ビット /192 kHz) を選択します。

![iPhone04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105739/9cc0edc5-c1b8-46fc-a9a9-f22261ad83c3.png)

* 同様に `ダウンロード` についても `ハイレゾロスレス` ALAC (最大24ビット /192 kHz) を選択します。 (ただしストレージ消費量が増加)

これにより、iPhone iOS および Apple Music の再生が最高音質に変わり、高音質な再生環境を得ることができました。
Apple Music の中から `ハイレゾロスレス` や `Apple Digital Master` 対応コンテンツを再生してみると、圧倒的な差が感じられるかもしれませんね。

# おまけ: 再生装置の音質を上げる

出力再生音質があがったので、あとはスピーカーやヘッドホンの再現性を高められれば、高品質な再生環境が得られることが期待できます。

## ヘッドホン

高品質なモニターヘッドホンやハイレゾヘッドホンを Rubix22 のヘッドホン端子につなげることにより、高音質再生環境を得られることでしょう。

## アンプおよびスピーカー

Rubix22 の出力先に、以下のいずれかを選択することにより、高音質再生環境を得られることでしょう。

* ハイレゾ対応アンプおよびハイレゾ対応パッシブスピーカーを Rubix22 の出力に接続する
* ハイレゾ対応アクティブスピーカーを Rubix22 の出力に接続する

# プロパティ

* 初出: 2021-11-19

## 関連リンク

* [iPhone iOS 15.1 の出力音質を引き上げる設定](https://qiita.com/igapyon/items/72906e056262a0d5e89d)
* [macOS Monterey の出力音質を引き上げる設定](https://qiita.com/igapyon/items/b01f06917759fa783ac8)
* [Windows 10 の出力音質を引き上げる設定 (UR44C版)](https://qiita.com/igapyon/items/b93dd4a51b098f292169)
* [Windows 10 の出力音質を引き上げる設定 (Rubix22版)](https://qiita.com/igapyon/items/000ceb2961b88ff185be)
長いWebページをキャプチャー

　最近Web画面をキャプチャーすることが有りまして。でもページが長くで一回をコピーできないです。いろいろツールでWebページを取る方法が有りますが、良く使えないためインストールしていないです。だから毎回はShift＋Windows＋SをWindows10の画面切り取り方法でExcelにコピーして組み合わせます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1402505/ede7a2f9-34d9-a84e-c473-0e0886966d56.png)
　でも綺麗に組み合わせが出来ないため、気持ち悪いです。そして単純な方法がないかと探しました。Windows環境Chromeを使う人にその方法を紹介いたします。
　1.対象ページを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1402505/08f84840-6f06-9713-b1eb-fa74a8522526.png)
　2.Shift+Ctrl+iを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1402505/80bb2fc4-2558-d716-dbdd-804445f25ba6.png)
　3.画面上の設備選択ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1402505/0d8e36eb-4c39-5079-d241-6de16185a952.png)
　4.デバイスを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1402505/657a299e-5787-d03f-ab0f-da2704cf9bec.png)
　5.編集をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1402505/eeedf022-7155-24ac-029f-08c69ec7eb41.png)
　6.ページを定義して、サイズを設定して追加ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1402505/8d09fc80-021d-a35f-6a51-8f200f0a6e81.png)
　7.先定義した設備名を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1402505/5d1258ab-fbac-2654-8ad3-799e706a00d3.png)
　8.まだ画面が長いです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1402505/7afb64a8-c46f-ba8e-ae61-7a78abcdbdf8.png)
　9.自分定義した設備を再編集する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1402505/d962cee5-ac3f-e41b-a8ef-4aebf078d525.png)
　10.サイズを調整して最後全部表示できました。ただし高さは10000以下らしいです。10000以上の場合は別方法しかないですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1402505/152ad58f-bd6b-e36b-8eb5-980d732521bc.png)
　11.設定ボタンを押下、キャプチャーをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1402505/00e42861-a08f-ddfa-6e3f-6893e00b7ea4.png)
　12.画面をキャプチャーしてダウンロードファイルでパソコンにダウンロードする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1402505/872c9fe8-249d-1da2-ac90-80381c7f4ef3.png)
　13.PCのダウンロードフォルダに先の画面キャプチャーがある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1402505/a91c1f5f-9b19-97c0-dc90-a2e2c5596578.png)
AWS Cloud9+Docker ComposeでLaravel環境を構築

## docker-composeをインストールする
### ・Docker Composeの現在の安定リリースバージョンをダウンロード
```
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
```
### ・実行権限を付与する
```
$ sudo chmod +x /usr/local/bin/docker-compose
```
### ・動作確認
```
$ docker-compose -v
docker-compose version 1.25.0, build 0a186604
```
## Laravel環境の準備
### ・コンテナ定義をクローン
```
$ git clone https://github.com/bobtabo/docker-cloud9.git docker
```
### ・コンテナを起動
```
$ cd docker
$ docker-compose up -d
・・・
Creating mysql ... done
Creating php   ... done
Creating nginx ... done
```
### ・PHPコンテナに入る
```
$ docker-compose exec --user 1000 php bash
```
### ・Laravel環境を準備
```
$ pwd
/home/docker

$ cd laravel
$ composer install
$ chmod -R 777 storage
$ chmod -R 777 bootstrap/cache
$ cp -p .env.example .env
$ php artisan key:generate
$ chmod 755 bin/clear-laravel.sh
$ bin/clear-laravel.sh
$ php artisan migrate:fresh --seed
```
下記でコンテナから抜けられる
```
$ exit
```
## Dockerコンテナ
### ・Dockerのコンテナを確認
```
 $ docker ps -a
 CONTAINER ID   IMAGE          COMMAND                  CREATED       STATUS                   PORTS     NAMES
5f3da7ad98cb   docker_nginx   "/docker-entrypoint.…"   5 hours ago   Exited (0) 2 hours ago             nginx
6c00c94b7dde   docker_php     "docker-php-entrypoi…"   5 hours ago   Exited (0) 2 hours ago             php
49bac02e0f94   mysql:5.7      "docker-entrypoint.s…"   5 hours ago   Exited (0) 2 hours ago             mysql
```
### ・Dockerのコンテナにログイン
```
docker exec -it [コンテナ名] /bin/bash
```
### ・Dockerのコンテナを削除
```
docker rm [コンテナID]
```
##Laravel
###・ローカルサーバーを立ち上げる
```
 $ cd docker
 $ cd src
 $ cd laravel
 $ php artisan serve --port=8080
```
PreviewRunningApplicationをクリック

エラーが発生したので対応する
###・権限を付与
```
chmod -R 777 storage
```
###・コマンド打ちキャッシュを削除
```
$ php artisan cache:clear
$ php artisan route:clear
$ php artisan config:clear
```
固定長サブネットマスクと可変長サブネットマスクの違い

## 勉強前イメージ

え、違いわからない・・・
固定と可変？

## 調査

### 固定長サブネットマスクとは

英語では Fixed Length Subnet Mask といい、FLSMと略される。
ネットワークにいくつかサブネットがあったとして、全て同じサブネットを使う方式。
各サブネットに割り当てるIPアドレスが一緒なのでわかりやすい一方、
そんなにIPアドレスが必要でないネットワークでも大量なIPアドレスが割り当てられるため効率が悪い。

![12021-11-19 # 固定長サブネットと可変長サブネットの違い - diagrams.net -.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/f16d9b84-3fd2-e809-094c-dd4ee94e4117.png)


### 可変長サブネットマスクとは

英語では Variable Length Subnet Mask といい、VLSMと略される。
ネットワークにいくつかサブネットがある際に、長さが違うサブネットを使う方式。
必要なIPアドレスに応じてサブネットの大きさを設定できるので、効率的にIPアドレスを割り当てることができる。

![22021-11-19 # 固定長サブネットと可変長サブネットの違い - diagrams.net -.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/e3834c06-321f-ba97-0634-20901a0b90ac.png)


## 勉強後イメージ

感覚的にはいくつかネットワーク作る際はどれだけIPいるか確認して可変長サブネットでやるって思ってたけど、
そうでない場合は、固定長サブネットなのね。
IPアドレスがギリギリだったら可変長じゃないとだめかもしれないけど、余裕があるなら固定長でも良さそうね。
ギリギリだったら、後から足りなくなる場合もあるかもしれない。

## 参考

- [サブネットマスク 【subnet mask】](https://e-words.jp/w/%E3%82%B5%E3%83%96%E3%83%8D%E3%83%83%E3%83%88%E3%83%9E%E3%82%B9%E3%82%AF.html)
- [◆固定長サブネット分割の限界](http://atnetwork.info/tcpip2/tcpip261.html)
オブジェクト思考どうやって理解した?


# 参考にした書籍

https://www.amazon.co.jp/%E7%8B%AC%E7%BF%92Java-%E6%96%B0%E7%89%88-%E5%B1%B1%E7%94%B0-%E7%A5%A5%E5%AF%9B/dp/4798151122/ref=sr_1_8?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=Java&qid=1637326190&sr=8-8

https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BJava%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B1%B1%E6%B8%85%E5%96%AC/dp/4295007803/ref=sr_1_1_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=OAFUYQA74TDN&keywords=Java&qid=1647088503&sprefix=java%2Caps%2C203&sr=8-1-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUFBRE5aNTcyWjgxOTMmZW5jcnlwdGVkSWQ9QTAzNzc4MTgyMEcxRFBVOEFMRzFWJmVuY3J5cHRlZEFkSWQ9QTJKWEExNVgzRkVYTFAmd2lkZ2V0TmFtZT1zcF9hdGYmYWN0aW9uPWNsaWNrUmVkaXJlY3QmZG9Ob3RMb2dDbGljaz10cnVl

https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%AC%AC3%E7%89%88-Swift%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E7%9B%B4%E6%84%9F%E7%9A%84%E3%81%AA%E6%96%87%E6%B3%95%E3%81%A8%E5%AE%89%E5%85%A8%E6%80%A7%E3%82%92%E5%85%BC%E3%81%AD%E5%82%99%E3%81%88%E3%81%9F%E8%A8%80%E8%AA%9E-PRESS-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4297112132/ref=sr_1_3?crid=1E3Z3VV3GES2X&keywords=swift+%E5%85%A5%E9%96%80&qid=1647088670&sprefix=swift%E3%80%80%2Caps%2C193&sr=8-3

## Swiftの文法
```swift
import UIKit

// プロトコルとは、あるクラスや構造体が実装すべきメソッドやプロパティを定義したもの
// 使用例
// protocol プロトコル名 {
//     プロパティやメソッドの定義
// }

// プロトコルの宣言
protocol Protocol {
    var value: Int { get }
    func printValue()
}

// プロトコルの実装
struct Struct: Protocol {
    var value: Int = 0
    func printValue() {
        print(value)
    }
}

// プロトコルの実装
class Class: Protocol {
    var value: Int = 0
    func printValue() {
        print(value)
    }
}

// プロトコルを実行する
let struct1 = Struct()
struct1.printValue()
```

# Javaの文法

```java
public class Main {
  enum Gender{
    MALE,
    FEMALE
  }

  public static void main(String[] args) throws Exception {
      Gender gender_type = Gender.FEMALE;
      switch(gender_type){
          case MALE:
              System.out.println("男性です");
              break;
          case FEMALE:
              System.out.println("女性です");
              break;
      }
  }
}

```

## 実行結果
```
女性です
```

# Swiftでのenumも書いてみた...

```swift
enum Gender: String {
    case MALE = "男性です"
    case FEMALE = "女性です"
}

let gender: Gender
gender = Gender.MALE

switch gender {
    case .MALE:
    print(Gender.MALE.rawValue)
    case .FEMALE:
    print(Gender.FEMALE.rawValue)
}


```

# playgrandで実行結果

```
"男性です\n"
```
ターミナルからBlenderでモデリングする最小手順

ターミナルからBlenderを操作して3Dモデルを作成し、それを.blendファイルとして保存する最小手順をまとめる。

## 確認環境
- Blender 2.92.0
- Python 3.8.8
- MacBook Pro (16-inch 2019)
- macOS Monterey 12.0.1

## 準備
まず、blenderをターミナルから使えるようにする。下記のコマンドをターミナルで打つ。

```sh
alias blender='/Applications/Blender.app/Contents/MacOS/Blender'
# 環境によってパスが異なる場合があるので注意 / 必要に応じてbashとかzshの設定に入れてください
```

するとblenderコマンドが使えるようになる。打つとblenderが立ち上がる。

```sh
blender # blenderが起動する
```

## 本番

まず以下のPythonスクリプトを`test.py`としてファイルに保存しておく。

```python
# これは平面を作成するスクリプトである。
import bpy

# 平面を作成
bpy.ops.mesh.primitive_plane_add(location=(1.0, 1.0, 2.0),enter_editmode=False, align='WORLD')

bpy.ops.wm.save_mainfile()
```

そのスクリプトを以下のコマンドで実行する。

```sh
blender --background --python test.py
```

すると以下のように`untitled.blend`が作られる。

![スクリーンショット 2021-11-19 21.22.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198108/bcb50247-f4f8-a62b-e166-5f965c86594c.png)

このファイルを開くと以下のようになっており、blenderのデフォルトの要素（立方体・ライト・カメラ）に加え、平面が追加されたblendファイルができている。
以上でコードからBlenderでモデリングすることができた。

![スクリーンショット 2021-11-19 21.22.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198108/cb1aa62f-94fd-502c-c539-acac72fb0bcb.png)

## 参考 : スクリプトをもう一度実行した場合の挙動について

もう一回同じコマンドを実行すると、GUIからblenderを使っていて上書き保存をした時と同様、`untitled.blend1`ファイルが作成される。だから2回目のコマンドは既存のuntitle.blendに対して実行されたのではないかと思える。しかし、実際はこのuntitled.blendは新規ファイルとして作成されており、その心配はない。

![スクリーンショット 2021-11-19 21.23.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198108/bb9e3eb1-a1fe-c6d5-c09a-0ab166600991.png)

## 参考文献
Tips and Tricks - docs.blender.org
https://docs.blender.org/api/current/info_tips_and_tricks.html
駆け出しエンジニアが爆速で成長するには

#目次
- [はじめに](#はじめに)
- [技術力アップの為にやったこと](#技術力アップの為にやったこと)
- [プログラミング以外で意識していたこと](#プログラミング以外で意識していたこと)
- [さいごに](#さいごに)

#はじめに
今回は、私が駆け出しエンジニアだった時の経験を踏まえ、やっておくべき事や知りたかった事をまとめました。

#技術力アップの為にやったこと
あなたがプログラマーであれば、プログラミングスキルを上げていく必要があります。技術力アップの為に私がやった事をまとめました。

**①とにかくコードを読む(⭐️⭐️⭐️)**
まず重要なのが、**コードをしっかり読む**事です。

コードは読めないと書けません。**書くよりも読む時間を増やしてみてください。**
このフェーズを飛ばしていきなりコードを書くと、結果的に遠回りになります。ドキュメントでも既存のコードでも読み飛ばさずに、しっかり目を通すのがコツです。

**②分からないところを飛ばして進まない(⭐️⭐️⭐️)**
プログラミングを学習したり、誰かに何かを教えてもらっている時に分からないところは必ず出てきます。
その時に**確実に理解して先に進む様にした方が良いです。**

分からない場合は分かるまで資料を繰り返し読んだり、しつこく聞くくらいの気持ちが大事だと思います。
理解に時間をかけるフェーズを飛ばしがちですが、分からないまま進むとどんどん分からなくなります。

**理解する過程にこそ時間をかけるべきです。**

**③英語の勉強(⭐️⭐️⭐️)**
実際にプログラミングをしていると、英語を使う作業が頻繁に発生します。
その為、英語が出来ると短時間で作業できます。特に**readingスキル**を高めるのがオススメです！

例えば、こんな時に英語を使います。

- メソッド名を考える
- 英語のドキュメントを読む
- エラーを読む
- 海外ベンダーと英語のメールでやりとりをする

便利な翻訳ツールや字幕ツールもありますが、原文のまま読めると文脈や意図を正しく理解しやすいです。

**④ショートカットを覚える(⭐️⭐️)**
開発作業でよく使うツールのショートカットを早めに覚えておくと楽に開発できます。
一日中プログラミングをする様な場合、「いかにマウスを使わないか」はとても重要で、より疲れにくくスピーディーな開発ができます。意外と侮れないです。

慣れてくると指が勝手にショートカットを覚えてくるので、積極的にショートカットを使用する様にしてみてください！

**⑤アウトプットする(⭐️⭐️)**
学んだ事をアウトプットするかしないかで成長のスピードは全く違います。記事を書いたり、誰かにプログラミングを教えたり、やり方は色々あると思います。
アウトプットしたものを色んな人に見てもらえると、**自分のところに有益な情報が集まってきたり、様々なチャンスにも繋がってくる**ので、オススメです。

**⑥上手に休息する方法を見つけておく(⭐️⭐️)**
エンジニアとしての仕事は目や頭が疲れたり、神経を使う仕事でもあります。
その為、上手な休息方法を見つけることが長期的な成長には必要です。

散歩や読書など、それぞれにあった方法を見つけてみてください。

**⑦サービスを作ってみる(⭐️⭐️)**
Mustではないと思いますが、自らの手で一通りのサービスを作ってみると発見がかなりあります。
アプリ開発であれば、アプリのリリースまで個人でやってみる等です。
**必ず壁にぶつかるので、それを自分の力でどうにかする力が身に付きます。**
ある程度、自分のスキルに自身が出てきたら、チャレンジしてみる事をオススメします。何より楽しいです。

#プログラミング以外で意識していたこと
ここからはプログラミング以外で、エンジニアの仕事で必要なことについて書きます。
**「プログラミングが出来ること」は必要なスキルのほんの一部**です。

よく仕事で求められることをまとめてみました。
下記のような事が出来る様になると、エンジニアとしても一人前ではないでしょうか。

**①技術的なことを、技術に詳しくない人に説明できる**
PMやデザイナー等のエンジニアではない人に、エンジニアがやっていることを伝える機会は頻繁にあります。
**技術的なことは非エンジニアには分かりにくい**ので、とても感謝されます。
図やイラスト、わかりやすい言葉に置き換える等、工夫できる部分はあります。

**②実装の時間や難易度を予測できる**
- この機能ならこれくらいで作れる
- これは技術的に難しい、もしくは時間がかなり掛かる
- どうすれば作業がスケジュール通りに終わるか考える

こうした事を関係者に適切なタイミングで伝えられるエンジニアは優秀だと思います。

**③人を頼れる**
チームで開発していると、自分一人では解決出来ない課題に直面する時があります。
そうした際に、**素直に自分よりも得意な人に頼れる人は最強のエンジニアだと思います！**

#さいごに
エンジニアとしての仕事は最初は大変ですが、だんだん自分で出来ることが増えてくると楽しくなってきたり、やりたいことが見つかったり、それらが自信にも繋がってきます。

この記事を読んでくださった方が、「エンジニアになってよかった」と思える様になることを願っています。
RspecでAPIをテストするときにnullをパラメータに含む方法

# 問題

Ruby on Rails の Rspec で JSON を受け取る API をテストするとき、渡すパラメータの値に異常値も入れてテストしておきたいなぁと思います。よくある異常値として null がありますね。
でも、これをテストするのはちょっと難しいです。
なぜなら、チュートリアルでよくあるようにパラメータをハッシュにして API のエンドポイントに渡そうとすると、 null はハッシュの値として認めてもらえず、 ArgumentError になってしまいます。
ハッシュを `to_json` メソッドでJSONに変えようとしても同じことです。
ではどうしたら null をパラメータに含めてテストすることができるのか、考えました。

# 解決方法

JSON を文字列として作り、その JSON に null を含めたものを API のパラメータにすればOKです。
コードは以下になります。

```null_spec.rb
require "rails_helper"

RSpec.describe "エンドポイントにnullを渡す", :type => :request do

  it "エラーが返ってくる" do
    headers = { "CONTENT_TYPE" => "application/json" }
    post "/path/to/endpoint", :params => '{ "hoge": null} }', :headers => headers
    expect(response.status).to eq 422
  end

end
```
このコードは次のページのものの改変になります。
https://relishapp.com/rspec/rspec-rails/v/5-0/docs/request-specs/request-spec#providing-json-data

`"CONTENT_TYPE" => "application/json"` を指定してやるのがキモです。

# まとめ

分かっていれば何のつまづきもないところだと思いますが、私はつまづいたので備忘録がわりに残しておきます。
Oracleでorder by primary keyのSQLを作成するSQL

# やりたいこと

ディクショナリからテーブルのプライマリキーを取得して↓こんなSELECT文を全テーブル分作成する。

```sql
select * from [table_name] order by [pk1], [pk2], ...;
```

# 背景

- 全てのテーブルのレコードを確認する際に`select * from [table_name] order by primary key`がしたかったが、Oracle Databaseではできなさそう
- プライマリキーでorder byしたselect文を取得するSQLを作成してみる

# 全テーブルの全レコードをPKでソートして取得するSQL文を作成するSQL

```sql
select
    'select * from '||table_name||' order by '||listagg(column_name, ', ') within group (order by table_name) ||';'
from
    ( 
        select
            user_constraints.table_name
            , column_name 
        from
            user_constraints 
            inner join user_cons_columns 
                on user_constraints.constraint_name = user_cons_columns.constraint_name 
        where
            constraint_type = 'P' 
        order by
            user_constraints.table_name
            , position
    ) 
group by
    table_name;
```

### おまけ（上記SQLの途中経過）

#### 全テーブルのPKカラム一覧を取得
```sql
select
    user_constraints.table_name
    , column_name
    , position 
from
    user_constraints 
    inner join user_cons_columns 
        on user_constraints.constraint_name = user_cons_columns.constraint_name 
where
    constraint_type = 'P' 
order by
    user_constraints.table_name
    , position;
```

#### 全テーブルのPKカラム一覧を横持ちで取得
```sql
select
    table_name
    , listagg(column_name, ',　') within group (order by table_name) 
from
    ( 
        select
            user_constraints.table_name
            , column_name 
        from
            user_constraints 
            inner join user_cons_columns 
                on user_constraints.constraint_name = user_cons_columns.constraint_name 
        where
            constraint_type = 'P' 
        order by
            user_constraints.table_name
            , position
    ) 
group by
    table_name;
```