OmniAICreator/Qiita-1.07M huggingface dataset:
MRTKのStandardシェーダーを、実装ついでに学ぶ①

MRTKのシェーダーが拡張性のあるものであることを教えていただいたので
OculusQuest2にて、負荷確認も兼ねて検証していきます。

## 環境
・MRTK3
・Unity 2021.3.10f1
・Windows 11

## マテリアルへのシェーダー適用方法
MRTK3では、Shaderの項目に「Graphics Tools」が追加されていますので
それを選択して「Standard」へ切り替えを行います。

![ff.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/c54dcef2-78fb-09f6-0180-e45b30bf044d.png)

## シェーダーの動作をチェックしていく
少し注意したい点として、NomalMapなどを適用したいときは
チェックを付ける必要がある点です。

![hh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/9666762f-363f-fda2-66fd-f4ff97b3d242.png)

また、その他のテクスチャを追加で取り付けられそうな場所はないのでご注意ください。
（見落としていたらご指摘お願いします）
他、チャンネルMapはかなり見た目が変化するため、あまり使わないほうがいいかもしれません・・・。


ちょっと面白い点として、ライティングの設定があることでした。
![ii.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/2dacbb07-d8b4-ca7d-e3ec-e8ee6744d90e.png)

ただ、これを使うにはOculusProとかじゃないと、負荷が怖いなぁという印象です。
※これらにチェックをいれていないとかなり暗いので、調整用にHoverLightを入れています。

また、「Gradient Mode」でマテリアルの見た目も変更することができます。
今回は試しにグラデーションを入れてみました。

![jj.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/9c51c065-5a81-32a8-44ce-90b1c2b141b2.png)

適用時はGame画面でないと実際の変化が実感できない部分があります。
Sceneではわかりにくいのでご注意ください。

![kk.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/a7f85eb0-c6b2-78f8-d5b7-aa4ab2521ae9.png)
※Noneにすると、違いがよくわかります


また、驚いたのがステンシル機能があること。
![ll.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/cdf317aa-c81a-08aa-16b9-2ff4fabf0ca9.png)

設定するだけでステンシルが使えるので、実装がはかどりそうです

## 最後に
今回はStandardシェーダーのみ確認していきましたが、
他の便利な機能もありそうなことや、他のシェーダーもあるので
時間があれば検証していきたいと思います。

次回は「Gradient Mode」を使いたいので、処理負荷を見ていこうと思います。
Laravelで既にDBから取得したデータを絞り込む方法

DBから取得したデータをさらに加工したいということがあると思います。
そんな時便利なのが、**Collection関数** を使う方法です。
<font color=red>※Collection関数を使用するには、データがCollection型である必要があります。</font>

Collectionを使えば、
+ データ取得
+ データ集計
+ フィルタ
+ ソート

などを容易に行えます。

今回は、Collection関数の中の一つ「where」の使い方を解説します。

公式のサイトに様々な関数が記載してありますので、必要であれば参照してください。
[公式サイト](https://readouble.com/laravel/9.x/ja/collections.html)

## 実際の使い方

では、DBから以下のデータを取得してきたとします。
``` php:code
$data = [
    {['id' => 1, 'name' => 'ichiji', 'age' => 26]}
    {['id' => 2, 'name' => 'niji', 'age' => 24]}
    {['id' => 3, 'name' => 'sanji', 'age' => 24]}
    {['id' => 4, 'name' => 'yoji', 'age' => 22]}
];
```
そして、Collection関数「where」を使用して「age」が「24」のものを絞り込みます。
``` php:code
$result = $data->where('age',24);
```
そうすると、以下のような結果になります。
``` php:result
$result = [
    {['id' => 2, 'name' => 'niji', 'age' => 24]}
    {['id' => 3, 'name' => 'sanji', 'age' => 24]}
];
```
【Python】QRcode生成方法

QRコードは、Quick Response Codeの略で、1994年にデンソーウェーブ社が開発したものです。規則に従って読み込むことで埋め込まれた数字やアルファベット、URLなどを読み取ることができるツールです。QRコードは無料で商用利用が可能になっています。

QRコードには主に２つのパターンがあり、ファインダパターンとアライメントパターンです。これら２つのパターンで位置情報を補正し、白黒のbitにより埋め込まれたデータを読み取ります。

 - ファインダパターン
   ３つのコーナーを認識することで、シンボルの位置、大きさ、傾きを検出する。

 - アライメントパターン
   アライメントパターンの中心座標を求めて、シンボルのゆがみを補正する。

![QRcode.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/cbf48a25-60ce-73f6-2f48-d4ad76082c0e.png)

## qrcodeモジュールインストール

pipを使って[qrcodeモジュール](https://pypi.org/project/qrcode/)をインストールします。

```console
$ pip3 install qrcode
```

## Pythonコード

```Python:QRcode.py
import qrcode
from PIL import Image

qr = qrcode.QRCode(
    version=10, #QRコードの大きさ
    # 約7％以下の誤りを訂正, ERROR_CORRECT_M：約15％以下の誤りを訂正
    error_correction=qrcode.constants.ERROR_CORRECT_M, #ERROR_CORRECT_L：
    box_size=2, #サイズとピクセル数
    border=8 #境界線の太さ
)

qr.add_data('https://www.python.jp/')
qr.make()
_img = qr.make_image(fill_color="black", back_color="#ffffff")
_img.save('qrcode.png')
img = Image.open('qrcode.png')
img.show()
```

## qrコマンド

qrcodeモジュールをインストールしたときに追加されるqrコマンドを使って、QRコードを表示したり画像ファイルを生成することもできます。

```console
$ qr "Hello, world!"
█████████████████████████████
█████████████████████████████
████ ▄▄▄▄▄ ██▀█▀▄█ ▄▄▄▄▄ ████
████ █   █ █ █▄▄▄█ █   █ ████
████ █▄▄▄█ █  ▀▀▄█ █▄▄▄█ ████
████▄▄▄▄▄▄▄█ █ █▄█▄▄▄▄▄▄▄████
████▄█▄  ▄▄▀▀▄▄▄▀▀▄▄   █▀████
█████▀▀▄█▀▄▀▄▄ ▀  ▄▀█  ▄█████
████▄▄█▄▄▄▄█ ███▄▀  ▀▀██▄████
████ ▄▄▄▄▄ █▀▄ █  ▄ █▀  █████
████ █   █ █ ▄▀▄▄▄▄▀ ▀█▄▄████
████ █▄▄▄█ █▄▄ ▄ ▀▄▄▀▀ ██████
████▄▄▄▄▄▄▄█▄▄█▄██▄█▄██▄█████
█████████████████████████████
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
```

```console
$ qr "Hello, world!" > hello.png
$ file hello.png
hello.png: PNG image data, 290 x 290, 1-bit grayscale, non-interlaced
```

## まとめ
今回は、QRcode生成プログラムを紹介した。
Railsでテーブル作成時にカラムの順番を指定する

## やりたいこと
MySQLの場合です。
SQLiteでもできるかも？(未検証)
PostgreSQLは少し面倒そう？https://wiki.postgresql.org/wiki/Alter_column_position/ja

Userテーブル作成時に`deleted_at`等のカラムを作りたいとします。
作成後のschemaでは以下のように`updated_at`の後ろになって欲しい場合に、どうすれば良いか。

```ruby
  create_table "users", force: :cascade do |t|
    t.string   "email",        limit: 255
    t.string   "name",         limit: 255
    t.datetime "created_at",   null: false
    t.datetime "updated_at",   null: false
    t.datetime "deleted_at" # updated_atの後ろ
  end
```

普通に作るとこうなってしまいます。
afterオプションも、普通につけるだけだと意味なしです。
```ruby
  create_table "users", force: :cascade do |t|
    t.string   "email",        limit: 255
    t.string   "name",         limit: 255
    t.datetime "deleted_at" # updated_atの後ろにしたい
    t.datetime "created_at",   null: false
    t.datetime "updated_at",   null: false
  end
```

## 結論
こうすれば可能です。
```ruby
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :email
      t.string :name

      t.timestamps null: false
    end

    add_column :users, :deleted_at, :datetime, after: :updated_at
  end
end
```

## 補足
afterオプションは、`create_table`メソッドにつけても効果なしです。
`add_column`メソッドにつけないと効果がないので、
テーブル作成時のmigrationファイルに、`create_table`メソッドと`add_column`メソッドを分けて記述すればOKです。
Supabaseの認証機能実装で躓いた話【HTTP 500 Internal Server Error】

初アウトプットです。
今年の目標である情報発信をしようという目標をギリ達成できそう。

### 実行環境
- Next.js: 13.0.4
- React: 18.2.0
- Supabase: 2.2.0

### まえおき
Supabaseをさわり始め、[公式ドキュメント](https://supabase.com/docs/reference/javascript/auth-api)の通りにSupabaseの認証機能を実装しようと試みたが、`Status Code: 500`エラーでSupabaseにデータを飛ばせずユーザーの登録ができず頭を抱えていた。

```javascript:supabase.tsx
// 該当箇所のみ抜粋
const supaSignUp = async () => {
  const { data, error } = await supabase.auth.signUp({
    email: "example@example.com",
    password: "examplepassword",

  });
  console.log(data);
};
```

![supa_error_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3078763/d3cca1a4-618a-056a-4984-223e8b3f5d46.png)

### 解決策
あれこれいじくり回したのち、supabaseダッッシュボードページ左のアイコン群より、*Logs > Auth*と進むと認証関連のAPIログが見れることが判明。

エラーメッセージを見てみると。。。
![supa_error_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3078763/829408b1-14bb-0381-a104-96d470558042.png)
`public`スキーマに`profiles`テーブルが存在しないとのこと。
plofilesテーブルを作り、もう一度POSTしてみると。。。
![supa_error999.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3078763/44294565-adfb-da83-832e-75d19bbbf2ce.png)

`full_name`, `avatar_url`のカラムを作るように言われ再度POSTを試みる。![supa_error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3078763/17df602d-034d-fdea-3448-4746a72fb5e2.png)
POSTできた！

### まとめ
後から[ドキュメントの違うページ](https://supabase.com/docs/guides/auth/managing-user-data)に解決方法が書いてあることに気づく。
今後ドキュメントの関連のあるところは隅々まで読もうと思います。。。
今回のようにドキュメントが英語のみのツールも多いと思うので公式ドキュメントを読み解いて構築をスムーズに行えるよう来年はこの辺の自己学習に力を入れたく思います。
誰かの参考になれば幸いです。



### 参考
- [supabase公式ドキュメント](https://supabase.com/docs )
GitHubからCodeCommitへのミラーリング方法とハマったこと

# はじめに

表題の通り、この記事は GitHub Actions によるミラーリングで、GitHub にあるレポジトリを CodeCommit へと同期する方法と、その際に詰まったポイントについて書いてあります。

# 参考にした記事

「そもそもGitHub Actionsを用いたミラーリングってどうするんだろう？」となっている人は以下三つの記事あたりに目を通してもらうと良いかと思います。
- [GitHub Actionsを使ってGitHubリポジトリをCodeCommitリポジトリへミラーリングする](https://dev.classmethod.jp/articles/mirror-github-repository-to-codecommit/)
- [GitHubへのPush時にAWS CodeCommitに任意のブランチを同期する](https://zenn.dev/itouuuuuuuuu/articles/3d9ba9cd92cc33)
- [【AWS】GitHubをCodeCommitにミラーリングする](https://chibinfra-techblog.com/github-with-aws-codecommit/)

（この記事を参考にするだけでミラーリングに成功する方も多いと思いますが、ググっても解決方法が出なかった詰まりポイントがあったので続けます）

# やったこと

上記の記事にあるようにまずローカルで SSH鍵を作成し、作成したキーを AWS の IAMユーザに登録しました。

次にGitHubの該当リポジトリのActions secretsにて
- CONFIG
```
Host git-codecommit.*.amazonaws.com
  User ${IAMで登録したSSHキーID}
  IdentityFile ~/.ssh/id_rsa
  StrictHostKeyChecking no
  UserKnownHostsFile=/dev/null
```
- SSH_PRIVATE_KEY
```
ローカルで作成した秘密鍵
```
を登録します。
(自分はマージされたことをトリガーにして、特定のブランチのみでミラーリングを動かしたかったので二つ目の記事を主に参考にしました)

そしてミラーリングしたいリポジトリの /.github/workflows/mirror.yml にて
```yml
name: Mirroring

on:
  pull_request:
    branches:
      - test-branch
    types: [closed]

jobs:
  push_to_codecommit:
    runs-on: ubuntu-latest
    if: github.event.pull_request.merged == true
    env:
      TARGET_MIRROR_REPOSITORY: ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test-repository
      REF: ${{ github.ref }}
    steps:
      - uses: actions/checkout@v1
        with:
          fetch-depth: 0
      - name: set-git
        run: |
          mkdir ~/.ssh                                            
          chmod 700 ~/.ssh                                        
          echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
          echo "${{ secrets.CONFIG }}" > ~/.ssh/config 
          chmod 600 ~/.ssh/id_rsa
          chmod 600 ~/.ssh/config
      - name: push
        run: |
          git remote add codecommit $TARGET_MIRROR_REPOSITORY
          git checkout $REF
          git push codecommit $REF
```
のように記載します。

これで設定は完了しました。
あとはこの mirror.yml にあるように test-branch に何か適当なブランチをマージすればできるはず！
……なんですが、あれ？
`Error: Process completed with exit code 255.`
というエラーでミラーリングが出来ない、、、

# 解決方法

色々試してみましたが結果、 Actions secrets に登録した CONFIG を以下のように書き換えると上手くいきました。
```
Host git-codecommit.ap-northeast-1.amazonaws.com
  User ${IAMで登録したSSHキーID}
  IdentityFile ~/.ssh/id_rsa
  StrictHostKeyChecking no
  UserKnownHostsFile=/dev/null
```
つまりHostの部分を
`git-codecommit.*.amazonaws.com`から
`git-codecommit.ap-northeast-1.amazonaws.com`に修正すると上手くいきました。

ちょっと原因がわかってないのでかっこよくないのですが、
mirror.yml の中で
```yml
TARGET_MIRROR_REPOSITORY: ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test-repository
```
と記載した部分が関わってるのかなと推察しています。
もしこの原因がわかる方がいらっしゃったらぜひコメントなどで教えていただきたいです。
【JavaScript】Array.sort()は参照を返す

# 背景
オブジェクト配列をソートするメソッドを作成し、
そのユニットテストを書く。
Jestを利用したユニットテストで、
まずは**失敗**するように書こうと思った。

ソートするメソッド
```typescript
function compare (a: Hoge, b: Hoge) {
  if (a.fuga < b.fuga ) {
    return -1
  } else if (a.fuga > b.fuga) {
    return 1
  } else {
    return 0
  }
}

export default (objectList: Hoge[]): Hoge[] => {
  return objectList.sort(compare)
}
```

ユニットテスト
```typescript
describe('sort', () => {
  test('false case', () => {
    const baseArray = [ソート元のオブジェクト配列]
    const sortArray = sortMethod(baseArray)
    // ソート順を確認するためループ内で比較
    sortArray.forEach((object, i) => {
       expect(object).toEqual(baseArray[i])
    }
  });
});
```

しかし、これだとテストが**成功**してしまった。

# 原因
Array.sortは**ソートされた同じ配列の参照を返す**。
そのため`baseArray`と`sortArray`は参照先が同一となり、
中身はソートされた後の配列になっているため、
テスト結果がtrueになってしまう。

# 対処
**ディープコピー**を実施する。
ここでは`structuredClone()`を使用する。
（使用できない環境であれば`JSON.parse(JSON.stringfy())`を使用するといい）

```typescript
describe('sort', () => {
  test('false case', () => {
    const baseArray = [ソート元のオブジェクト配列]
    // ソート結果をディープコピーする
    const deepCopySortArray = structuredClone(sortMethod(baseArray))
    deepCopySortArray.forEach((object, i) => {
       expect(object).toEqual(baseArray[i])
    }
  });
});
```

これでテストが失敗することが確認できた。

# 結論
`Array.sort()`は**参照**を返すため、それを意識して使用すること。

# 参考
[Array.prototype.sort()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)
[Deep copy (ディープコピー)](https://developer.mozilla.org/ja/docs/Glossary/Deep_copy)
MySQL 最大接続数の上限を確認する

# 概要

- MySQLにて最大接続数の上限を確認する方法をまとめる。

# 方法

- 下記のSQLを実行する。

    ```sql
    show global variables like 'max_connections';
    ```

# 参考文献

https://dev.mysql.com/doc/refman/8.0/ja/too-many-connections.html
既存のCodeCommitのリポジトリに一括でファイル、フォルダ群をpushする

# やりたいこと
CodeCommitにアクセスできない環境で開発を実施していて、あるタイミングでそのファイル群をリポジトリにpushしたいということがありました。
意外とハマったので記事にします。やりたいことを箇条書きにすると、以下となります。

- 渡されたzipファイルを、解凍してCodeCommitにpushしたい
- 既にCodeCommitにはリポジトリが作成されており、その中で更新したいファイルがzipに固められている
- サブフォルダもあるので、GUIでのpushはきつい

# 方法
Cloudshellでzipファイルを解凍して、cloneしてきたフォルダにコピーして、pushします。

## Cloudshellでzipファイルをuploadする
ブラウザでコンソールにログインして、Cloudshellをクリック。
その後、右上の「Actions」→「Upload file」をクリックして、zipファイルをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/21c5eed3-e919-ef2a-9844-c668a11f0162.png)

ちなみに、アップロードしたファイルは`/home/cloudshell-user`にアップロードされます（デフォルトのユーザー名の場合）。

## zipファイルを解凍する
unzipコマンドでここに解凍します。
```bash
unzip filename.zip
```

## 更新したいリポジトリのHTTPSのアドレスをコピー
`git clone`するために、CodeCommitのコンソールからコピーしてきます。
対象のリポジトリの`HTTPS`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/2f5a911f-80c8-c2a7-fb6b-3d5c1d4b0574.png)

## クローンする
Cloudshellで、`git clone`しましょう。
リポジトリが、Cloudshell環境上にコピーされてきます。
（以下のコマンドの`codecommit~~~repository`の部分は、ご自身の環境のリポジトリのHTTPアドレスに変更してください）
```bash
git clone codecommit::ap-northeast-1://xxxxxx-repository
```

## コピーする
ここが**重要ポイント**。
zipから解凍したフォルダを、クローンしてきたリポジトリにコピーします。
コピーなので、元々リポジトリ内にあったファイルが**削除**されることはなく、**新規作成と更新のみ**実行されます。

- rTオプションは、大文字小文字間違えず入力してください。
    - rオプションはサブディレクトリも含めて再帰的にコピーします。
    - ただ、これだけだとコピー先がディレクトリの場合、その下にコピー元ディレクトリをコピーしてしまいます。
    - これを避けるために、Tオプション（**大文字**）もつけます。
    - 以下のQiitaが分かりやすいです。
    - https://qiita.com/mangano-ito/items/87d269325ff29c95f0ef
- コピー元、コピー先は**ディレクトリ**を指定してください。
    - `/*`とか`.`とかつけなくてよいです。

```bash
cp -rT /home/cloudshell-user/src /home/cloudshell-user/xxxxxx-repository
```

# gitコマンドでpush
あとは、クローンしたディレクトリ内に移動して、以下のコマンドを実行します。

```bash
git add .
git commit -m "sample comment"
git push
```

# おわりに
cpコマンドやmvコマンドで結構試行錯誤しました。
mvコマンドだと、サブディレクトリ内の更新ができないので、cpコマンドで実行することをお勧めします。
Linuxの基本コマンドは、まだまだ知らないことだらけや･･･。
Djangoでformの大きさを、CSSで調整できないときにやった事

# 課題
自分のプロダクトを作ってるなかで、CSSでformの大きさを調整できないという課題がありました。
「Django form 大きさ CSS できない」で検索してもすぐには見つからなかったので、解決方法を共有させていただきます。

# 結論
forms.Textarea()の引数に、attrsを設定する


# 解決する前のforms.py
forms.Textarea()の引数には、何も入ってませんでした。

```python:解決する前forms.py

from django import forms

class TranslationForm(forms.Form):

    sentence = forms.CharField(
        label='', widget=forms.Textarea(), required=True)

```

# 解決した後のforms.py
forms.Textarea()の引数にattrsを設定し、colsとrowsの値を指定しました。

colsとrowsの意味は、以下の通りです。
| キー | 意味 |
|:-:|:-:|
|cols | テキストエリアの入力幅  |
| rows  |  テキストエリアの高さ |


```python:解決した後のforms.py

from django import forms

class TranslationForm(forms.Form):

    sentence = forms.CharField(
        label='', widget=forms.Textarea(attrs={'cols': '70', 'rows': '20'}), required=True)

```


# 参考記事にした記事

[[Django]TextFieldフォームのデフォルト幅や高さを変える](https://yuki.world/django-textfield-height-width-modify/ "[Django]TextFieldフォームのデフォルト幅や高さを変える")

# 最後に
「Django form 大きさ CSS できない」よりもう少し具体的に、"TextField"や"CharField"などを検索ワードに入れると出てきました。

ご参考にしていただければ幸いです！
最後までお読みいただき、ありがとうございました！
Google UXデザイン：パーソナル・ブランドの探求

# はじめに

わたしが[Google UX Design Certificateで得られた素晴らしい体験][google]を、特に重要だと思われるポイントを小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ Google UX Design Certificateを受講してみてください。

[google]: https://qiita.com/mapami/items/7a0d0a3d4661c50f8bec

https://www.coursera.org/professional-certificates/google-ux-design

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/c7b131e0-c561-369b-95c5-22e00e0cf949.png" width="800">

<details><summary>これまでの振り返り</summary>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/f9765b9a-dcbd-d4af-3785-91b5e523440c.jpeg" width="700">

</details>

# パーソナル・ブランドとは

***<font color="MediumVioletRed">『デザイナーとしてのあなたの個性、ユニークなスキル、そして価値観と、一般的なペルソナとの交わり方である』</font>***

パーソナル・ブランドは、デザイナーとしてのあなたの価値を示すために不可欠なものであり、ポートフォリオを構築する際に中心的な役割を果たすべきものです。

# なぜパーソナル・ブランドが重要？

ブランドというと、有名な企業が頭に浮かびます。あなたは、その会社の名前を聞いたとき、どのように思い浮かべますか？

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/d5f53684-54fd-d0a1-902e-ac71be764415.png" width="700">

これらはすべて、ビジネス、製品、消費者に提供する価値について、まったく異なるメッセージを持つ主要なブランドです。それらを思い浮かべたとき、お腹が空いたとか、ワクワクするとか、ある種の感情を抱くかもしれません。

しかし、ブランディングは大企業だけのものではありません。しかし、ブランディングは大企業だけのものではありません。例えば、有名人は、伝えたいパーソナル・ブランドに基づいて、自分の仕事や支援する慈善活動を選びます。UXデザイナーとして同じことをすることができます。

そのために、自分自身にいくつかの質問を投げかけることから始めてください。

- ***私は何が得意なのか？***
- ***私は何を楽しんでいるのか？***
- ***私は何を大切にしているか？***
- ***他の人たちは、私や私の才能をどのように表現しているのだろうか？***
- ***自分は何を認めてもらいたいのか？***

***<font color="MediumVioletRed">『理想は、自分自身の考え方と、他人が自分を表現する方法が似ていること』</font>***

UXデザイナーやその他のクリエイティブな仕事をしているとき、あなたのパーソナル・ブランドは、あなたが群衆から際立つための方法なのです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/74d05a4c-06ea-e00e-4676-90cd16326b49.png" width="500">

# パーソナル・ブランドのオンラインで表現する

1. まず、自分のパーソナル・ブランドについて考えるとき、自分の才能や価値観をリストアップしておくと便利です。
2. そして、あなたのブランドは、オンラインで存在感を示すすべての場所で一貫している必要があります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/3f08920d-57f1-b10c-6a9d-37666365f257.png" width="700">

# オンラインでプロフェッショナルな存在感を示す

### パーソナル・ステートメント

***<font color="MediumVioletRed">『あなたが何をしているのか、何を支持しているのかを説明する1～2文のフレーズ』</font>***

パーソナル・ステートメントは、あなた自身のスローガンやキャッチフレーズのようなものだと考えてください。自己PRでは、あなたの仕事のユニークな点を強調したいものです。最高の自己紹介文は、記憶に残りやすく、キャッチーなものです。

### 一貫性


写真、配色、ロゴ、フォント、その他のデザイン要素が、すべてのプラットフォームで一貫していることを確認します。ポートフォリオやソーシャルメディアなどのウェブサイトはもちろん、名刺などの印刷物も同様です。

パーソナル・ブランドを構築する上で、一貫性は重要なポイントです。個人として、またプロフェッショナルとして、一貫して自分を表現することで、信頼性を伝え、デザインコミュニティの人々の間に信頼を築くことができます。
DearPyGuiでshadertoyのshaderを描画

pyimguiではOpenGLのコンテキストが喧嘩して諦めた。DearPyGuiではOpenGLを使っていない記事を発見。もしかしたら、OpenGLが使えるのではで試して成功。  
まあ、説明がどうこうではないのでサンプルだけ。  
```python
import dearpygui.dearpygui as dpg
from OpenGL.GL import *
from OpenGL.WGL import *
from ctypes import *
import numpy as np

# OpenGL Context init
xsc, ysc =windll.user32.GetSystemMetrics(0),windll.user32.GetSystemMetrics(1)
hwnd = windll.user32.CreateWindowExA(0,0xC018,0,0,0,0,xsc,ysc,0,0,0,0)
hdc = windll.user32.GetDC(hwnd)
pfd = PIXELFORMATDESCRIPTOR()
SetPixelFormat(hdc, ChoosePixelFormat(hdc, pfd), pfd)
wglc = wglCreateContext(hdc)
wglMakeCurrent(hdc, wglc)

# OpenGL init
program = glCreateProgram()
shader = glCreateShader(GL_FRAGMENT_SHADER)
glsl = '''
#version 300 es
precision highp float;
out vec4 fragColor;
uniform vec2 iResolution;
uniform float iTime;

void mainImage(out vec4 fragColor, in vec2 fragCoord);

void main() {
      mainImage(fragColor,gl_FragCoord.xy);
}

// shadertoy code

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 uv = fragCoord/iResolution.xy;
    vec3 col = 0.5 + 0.5*cos(iTime+uv.xyx+vec3(0,2,4));
    fragColor = vec4(col,1.0);
}
'''
glShaderSource(shader, glsl)
glCompileShader(shader)
if glGetShaderiv(shader, GL_COMPILE_STATUS) != GL_TRUE:
    raise RuntimeError(glGetShaderInfoLog(shader).decode())
glAttachShader(program, shader)
glLinkProgram(program)
glUseProgram(program)
glViewport(0, 0, 200, 200)

dpg.create_context()
dpg.create_viewport(title='Shader Window Test', width=500, height=500)
dpg.setup_dearpygui()
dpg.show_viewport()

with dpg.texture_registry(show=False):
    dpg.add_raw_texture(width=200, height=200, default_value=np.zeros(200*200*4), tag="shader_texture")
with dpg.window(label="shader"):
    dpg.add_image("shader_texture")

while dpg.is_dearpygui_running():
    glUniform2f(glGetUniformLocation(program, "iResolution"), 200, 200)
    glUniform1f(glGetUniformLocation(program, "iTime"), dpg.get_total_time())
    glRects(1, 1, -1, -1)
    pixels = glReadPixels(0, 0, 200, 200, GL_RGBA, GL_UNSIGNED_BYTE)
    pixels = np.frombuffer(pixels,dtype=np.uint8).astype(np.float32)/255.
    dpg.set_value("shader_texture", pixels)
    dpg.render_dearpygui_frame()

dpg.destroy_context()
wglMakeCurrent(0, 0)
wglDeleteContext(wglc)
```  
これはshaderだけの描画だけど、OpenGLが使えるので、後はどうにでも展開できる。pyopenglはCのOpenGLのライブラリーのラッパーなので、作法はCと同じ。速さはCで書くには負けると思うが、気楽に書けるのが良い。
はじめてのnote運用メリットとデメリット！


![note.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180499/58ae18c0-d688-a728-3de7-fa2ff1c1bdd7.jpeg)
## noteってなに？
noteとは、「書く」ことに特化した情報発信ツールです。最近、個人も企業もnoteを始める人が増えています。この記事では、noteの魅力について解説していきます。

### なぜ今、noteがアツいのか
noteが2020年6月に発表したデータによると、noteの月間アクティブユーザー（Monthly Active User: MAU）は、6,300万を突破。noteが2021年6月に発表したデータでは、法人利用数が3,000件突破しました。このようにユーザーは右肩上がりに増えています。

## noteのメリット
noteはブログやWebサイトとどう違うの？と思う方もいるかもしれません。noteのメリットについて、まとめてみました。

アカウントを開設してすぐに、記事をかける

HTMLやCSSの知識が不要

有料記事やコンテンツが販売できる

Twitterなどの短文SNSに書けないような詳しい記事が書ける

Baseなどのショッピングサイト、動画、音声、写真などの外部連携ができる

難しいことは分からないけれど、アカウントを開設してすぐに記事を書きたい、何かを発信したいという人には、最適なツールですね。

反対にデメリットについてもまとめてみました。

## noteのデメリット
予約投稿ができない（月額500円の月額500円のプレミアム会員になれば可能）

デザインのカスタマイズができない

広告掲載ができない

独自ドメインが持てない（月額5万円のnote proにすれば可能）

ライターにとって、予約投稿ができないのは大きな痛手ではありますが、コンテンツが収益化してきて、500円がペイできるようになってから有料版に移行しても良いでしょう。


## 継続して書くことがカギ
![継続がカギ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180499/a598c324-a74d-2013-88a8-356625bc95c9.jpeg)


noteを始めてみたのはいいけれど、途中で書かなくなってしまったり、不定期に更新していたのでは、フォロワーも増えず、スキやコメントも獲得できません。

週1回、月1回など、更新日を決めて、記事を公開し続けることがフォロワーを獲得するカギになります。

また、金曜日の18時などと更新時間も決めておくと、フォロワーからリアクションが獲得しやすくなります。

## まとめ
noteのメリットとデメリットについて解説してきました。

noteは、ブログやWebサイトを立ち上げるまでもないけれど、みんなに見てほしいコンテンツ、ノウハウがある人にとっては、手軽に始められるツールです。また、Twitter、Facebook、Instagramなど、ほかのSNSと組み合わせてバズらせることもできます。

無料なので、まずはアカウント開設からはじめてみてはいかがでしょうか。
【UiPath】モダンデザインでのExcel操作系のアクティビティを使ってみた④


# はじめに

:::note info

この投稿はモダンデザインで使用可能なパッケージExcel ModernのアクティビティをStudioで使用してみた第4弾となります。
今回は「Excel ファイルを PDF として保存」アクティビティを使用してみたいと思います

実行環境は以下の環境で行っております
UiPath Studio 2022.10.3 (Community License、UIAモード：モダンデザイン）
:::

# ■Excel ファイルを PDF として保存
<font color=blue>(UiPath.Excel.Activities.Business.SaveAsPdfX)</font>
ExcelブックをPDFファイルとして保存するアクティビティです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/05cac6bf-16e7-90b3-da78-6bc36724360f.png)
# ■アクティビティの設定
今回は下記画像の様な請求書.xlsxというファイルを作成したのでPDFとして出力したいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/d31c2bae-924a-0ce5-2190-830ac49bbe8a.png)


①まずは「<b><font color="blue">Excelファイルを使用</b></font>」アクティビティを設置して請求書ファイルのパス(画像赤枠)を設定します。
※今回はこの部分の詳細設定方法については省略します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/074ea00a-b044-0ddf-b4d7-a577a63d9dfd.png)

②①で設置したExcelファイルを使用の中に「<b><font color="blue">Excel ファイルを PDF として保存</b></font>」アクティビティを設置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/5fc2687d-9c71-dbb1-5ec4-fc078d8ede6d.png)

③ここから「<B>ExcelファイルをPDFとして保存アクティビティ</b>」のプロパティ設定を行っていきます。
まず、PDF保存したいブックを選択します。
ブックの右端の＋マーク⇒Excelの順に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/d61a091a-c494-71ee-2146-b9e621fbec1c.png)
<b><font color="red">※ここで設定した「Excel」はExcelファイルを使用で設定されている「参照名」です。</b></font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/1d9f9bae-abfb-e732-5b25-069e56eda71b.png)

④次に出力するPDFのファイル名を設定します。
今回は「OutputFilePath」という変数に出力するファイルパスを設定しているため、ファイルパス欄には変数名を設定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/1338669d-1917-4280-3872-7f4824b69dd4.png)

:::note warn
既存のファイル置き換えがデフォルトで設定されているため、
上書きしたくない場合はチェックを外してください。
:::

⑤出力を行う開始・最終のページ設定を行います
<font color="red">※ページ設定は任意となります。<br>空欄にした場合は1シート目からファイル内の最終シートまでが設定されます。</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/0ca993cd-f121-290a-53d7-91d245eae91c.png)

|項目|内容|
|:---|:---|
|最終ページ|最終ページの番号を指定します。<br> 例）ファイルに14シートあり、ページ番号を指定しない場合は14シート目まで、5を設定したら5シート目が最終シートとなります|
|開始ページ|開始ページの番号を指定します。<br> 例）ファイルに14シートあり、ページ番号を指定しない場合は1シート目、5を設定したら5シート目から出力が開始されます|


⑥次は保存品質を設定します。
デフォルトの設定は「<b><font color="blue">StandardQuality</b></font>」になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/b744a938-6a3f-187f-29a6-46fbff175968.png)
|選択項目|内容|
|:---|:---|
|StandardQuality|オンライン パブリッシュおよび印刷用に最適化|
|MinimumQuality|オンライン パブリッシュ用に最適化|

アクティビティの設定はここまでで完了です。

⑥最後に実行して確認してみましょう。
実行後、請求書_株式会社AAA.pdfとして請求書のPDFが保存されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/09353748-a9ac-6de7-472a-6fc58ad2921e.png)
ファイルの中を開いて確認してみます。
Excelの内容が問題無く出力されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/a0f92a15-09ed-be54-d093-435c53febb50.png)


# おわりに

今回は「ExcelファイルをPDFとして保存」について触れましたがいかがでしたでしょうか。
他のアクティビティにも順次触れていこうと思います。
閲覧いただき有難うございました。
Snowflake 調べたことまとめ


## クエリ作ったらやること
- パフォーマンスチェックのためクエリプロファイルで以下を確認すること
    - スピルして無いこと
    - プルーニングされていること

参考: [Snowflake を使うときに初心者に気をつけてほしいこと](https://qiita.com/foursue/items/7e818ab2b5cbedb8e092)

## Tips
- 試行錯誤は仮テーブルか一時テーブルを使う
    - 永続テーブルの場合は一定期間FailSafeにデータが溜まり続けてしまうため。 参考: [Fail Safe みてない](https://qiita.com/foursue/items/7e818ab2b5cbedb8e092#fail-safe-%E3%81%BF%E3%81%A6%E3%81%AA%E3%81%84)


## 関連用語
- Spill / スピル: データがメモリから溢れる状態のこと
    - Snowflake メモリで処理ができなくなったらにディスクにデータをスピルし、次にリモートストレージにスピルします。つまり、スピルしている場合は、クエリかwearhouseを見直した方が良い
    - スピルの状態[クエリプロファイル](https://docs.snowflake.com/ja/user-guide/ui-query-profile.html#how-to-access-query-profile)から確認可能
- マイクロパーティショニング: 行データを格納するファイル
    - 50 MB〜500 MB(非圧縮時) のデータが各マイクロパーティション間で行が均等に分割され、パーティション内でデータは列ごとに並べ替えられて保存されている。この構造により効果的なクエリプルーニングを実現する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249595/970b7a0a-0721-2f82-65b4-39cb16e0ddaa.png)

> Snowflakeはテーブルのクエリに対して次のアクションを実行できます：
> 1. まず、クエリに不要なマイクロパーティションをプルーニングします。
> 2. 次に、残りのマイクロパーティション内の列ごとにプルーニングします。  


参考: [マイクロパーティションとデータクラスタリング](https://docs.snowflake.com/ja/user-guide/tables-clustering-micropartitions.html#what-is-data-clustering)

- プルーニング: 不必要なデータの読み取りを削減すること
    - snowflakeにおけるプルーニングの特徴

> Snowflakeはパーティションの列状スキャンを使用するため、クエリが1列でのみフィルターする場合、パーティション全体はスキャンされません。

> 言い換えれば、スキャンされたマイクロパーティションと列指向データの比率が選択された実際のデータの比率に近いほど、テーブルで実行されるプルーニングはより効率的です。

参考: [クエリプルーニング](https://docs.snowflake.com/ja/user-guide/tables-clustering-micropartitions.html#query-pruning)



- データクラスタリング
    - クラスタ化の目的は不必要なデータの読み取りを削減（プルーニング）するため

- 列指向: 列方向にデータをまとめているため、特定の列をまとめて処理することが得意
    - 特定の行を抜き出して更新、削除するのは苦手
【個人開発】交換日記のiOSアプリを作ってみました【Flutter】


___「Exchange Diary」という交換日記を誰とでもできるアプリをリリースしました！___

https://apps.apple.com/jp/app/exchange-diary/id6444697825

- **誰でもいいから、誰かに話を聞いて欲しい**
- **誰かの日常を覗いて見たい**

そんな人に是非使って欲しいアプリになります。誰かとマッチングしたら、交換日記が始まります。
家族や友達を誘って始めることも可能です。


技術はFlutter、Firebaseを使いました。
詳しい話は別のところでしようかな。するかな。どうかな。



僕自身も、奥さんや友達とこの交換日記をはじめてみまして、新しい発見や刺激を得ている気がします笑

みなさまにもこのアプリで交換日記の面白さを少しでも味わっていただけたら幸甚です
Google UXデザイン：モバイル専用アプリとレスポンシブWebサイトの違い

# はじめに

わたしが[Google UX Design Certificateで得られた素晴らしい体験][google]を、特に重要だと思われるポイントを小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ Google UX Design Certificateを受講してみてください。

[google]: https://qiita.com/masami-atwvn/items/7a0d0a3d4661c50f8bec

https://www.coursera.org/professional-certificates/google-ux-design

https://qiita.com/mapami/items/71dadc7256b87d2b6fed

# 現在のコース

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/c7b131e0-c561-369b-95c5-22e00e0cf949.png" width="700">

<details><summary>これまでの振り返り</summary>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/f9765b9a-dcbd-d4af-3785-91b5e523440c.jpeg" width="700">

</details>

# モバイル専用アプリとレスポンシブWebサイト


<dl>
  <dt>モバイル専用アプリ</dt>
  <dd>モバイルデバイス上で動作するように構築されており、携帯電話のホーム画面のアイコンを通じてアクセスします。モバイル専用アプリは、ネイティブモバイルアプリとも呼ばれます。</dd>
  <dt>レスポンシブWebサイト</dt>
  <dd>ユーザーが使用しているデバイスに適応し、携帯電話のWebブラウザからアクセスする実際のWebサイトです。</dd>
</dl>

# モバイル専用アプリのメリット・デメリット

#### メリット

- アプリをダウンロードしてインストールした後は、インターネット接続は必要ありません。外出先や飛行機の中でWi-Fiやインターネットに接続せずに遊べる、お気に入りのゲームアプリをいくつか考えてみてください。
- マイクやカメラ、位置情報サービスなど、デバイスに内蔵された機能とうまく連動しています。これにより、ユーザーの好みに合わせて、よりパーソナライズすることが可能になります。
- デザインの自由度も高まります。モバイル専用のアプリをデザインする場合、ジェスチャーやアニメーションなど、より多くのビジュアルやインタラクションのオプションが用意されています。

#### デメリット

- レスポンシブWebアプリよりも開発コストが高くなります。また、AndroidやiOSなど、モバイル端末のプラットフォームに応じて、異なるバージョンを作成する必要があります。
- iOSの場合はApp Store、Androidの場合はGoogle Playで公開する前に、承認を受ける必要があります。
- モバイルアプリはダウンロードする必要があるため、デバイスの容量を消費します。多くの場合、安価なデバイスはストレージが限られているため、モバイルアプリをダウンロードするのが大変になります。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/d5fb563a-d174-65e1-19fa-803d66379334.png" width="600">


# レスポンシブWebサイトのメリット・デメリット

#### メリット

- モバイルアプリケーションよりも高速かつ低コストで開発できるため、チームの時間、リソース、コストを節約できます。
- 携帯電話のウェブブラウザで実行されます。携帯電話を使ってインターネットで探す情報を考えてみてください。これにより、ユーザーは最初にアプリをダウンロードすることなくコンテンツにアクセスでき、ユーザーの携帯電話の貴重なスペースを節約することができます。
- レスポンシブなので、コンテンツはあらゆるデバイスで簡単に見ることができます。レスポンシブWebデザインは、デバイスのサイズに応じてWebサイトを自動的に変化させることができることを覚えておいてください。


#### デメリット

- インターネット接続か携帯電話の電波が必要です。ユーザーはオフラインでアクセスすることができないのです。このため、「ネクスト・ビリオン・ユーザー」や遠隔地のユーザーにとっては、Webサイトにアクセスするのが難しくなる可能性があります。
- 検索で表示されても、アプリストアにリストされていないため、ユーザーが見つけるのが難しい場合があります。
- すべてのモバイルスクリーンサイズで動作することを確認するのは難しい場合があります。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/5664f292-ea66-617e-a7cb-4136ffe06a67.png" width="600">
アルゴリズム実技検定(PAST) 第11回 F問題 Python解答例

Supership VPoEの名畑です。
趣味で競プロやっています。

アルゴリズム実技検定(PAST)の過去問題解答例シリーズです。[アルゴリズム実技検定(PAST) 第11回 E問題 Python解答例(二分探索)](https://qiita.com/nabata/items/ad3797a54658bbc410eb)の続きです。

今回は第11回のF問題の私の解答例(Python3)を公開します。

ちなみにA問題からF問題までの合計点が46点なので、ここまで来れば初級(45点)ですね。
[高橋様のつぶやき(2019年時点)](https://twitter.com/chokudai/status/1196371845563346944)によるとAtCoderでは茶色相当ってことになります。

:::note info
そもそもアルゴリズム実技検定ってなんですか？ という方は[アルゴリズム実技検定(PAST)について 並びに 第11回A〜C問題 Python解答例](https://qiita.com/nabata/items/0421f20e8ec849ee70ad)をご覧いただけますと幸いです。
:::

## 第11回の過去問題全部

- [第11回](https://atcoder.jp/contests/past202206-open)

## 第11回 F問題 シューティングゲーム(7点)

### 問題

- [F - シューティングゲーム](https://atcoder.jp/contests/past202206-open/tasks/past202206_f)

### 言語

- Python (3.8.2)

### 解答例

```
H, W = map(int, input().split())
s = [list(map(int, input().split())) for _ in range(H)]
N = int(input())

for i in range(N):
    # rとcの入力。sが0始まりなので1減らしている。
    r, c = map(int, input().split())
    r -= 1
    c -= 1

    # ブロックマスなら上位(行番号が小さい)マスを一つずつ下ろす
    if s[r][c] > 0:
        for j in range(r - 1, -1, -1):
            s[j + 1][c] = s[j][c]
        s[0][c] = 0  # 最上位を空マスにする

# 結果出力
for i in range(H):
    print(*s[i])
```

最初は空中ブロックがないという条件なので、撃たれたマスの上位を一つずつ順番に見れば網羅できる。

jのループは途中で空マスが見つかればそこで抜けても良いのですが、Hが100以下とかなり小さいので処理継続させています。

## 最後に宣伝

[SupershipのQiita Organization](https://qiita.com/organizations/supership-inc)を合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。

Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方は[Supership株式会社 採用サイト](https://supership.jp/recruit/)よりご確認ください。

是非ともよろしくお願いいたします。
ActionDispatch::Request::Session::DisabledSessionError: Your application has sessions disabled. To write to the session you must first configure a session storeが発生した時の対処法

# 概要
- ruby 3.1.2
- rails 7.0.4
- railsはAPIモードで利用
# 結論
config/application.rbに以下の3行を追記すれば解決する。
```config/applicaton.rb
config.session_store :cookie_store, key: '_interslice_session'
config.middleware.use ActionDispatch::Cookies
config.middleware.use config.session_store, config.session_options
```
参考になれば幸いです。
# 参考文献
- [Rails 7.0.1 with disabled Sessionstore ctionDispatch::Request::Session::DisabledSessionError (Your application has sessions disabled. To write to the session you must first configure a session store): #235](https://github.com/waiting-for-dev/devise-jwt/issues/235)
Pythonでgnuplotの図に寄せる

pltでgnuplotみたいに図を書きたいと思ったので，色々設定をいじって近づけてみた．いちいち設定するのは多少面倒かもしれないが，pltの設定はかゆいところに手が届くと思う．しかしながら，手の込んだ図はseabornに軍配が上がりそう．
あと，gnuplotでは第２x,y軸を`mirror`で簡単に処理できるところを，pythonでは少し面倒．pltがよく使われるコマンドならもっと簡単にできるように実装されてると思う．そもそも，gnuplotで`mirror`を設定している研究室は稀なのかもしれない．


#### ソース
```python:gnuplotの散布図風の図
plt.rcParams['font.family'] = 'Times New Roman' # font familyの設定
plt.rcParams['mathtext.fontset'] = 'stix' # math fontの設定
plt.rcParams["font.size"] = 15 # 全体のフォントサイズが変更されます。
plt.rcParams['xtick.labelsize'] = 24 # 軸だけ変更されます。
plt.rcParams['ytick.labelsize'] = 24 # 軸だけ変更されます
plt.rcParams['figure.dpi'] = 300
plt.rcParams['xtick.direction'] = 'in' # x axis in
plt.rcParams['ytick.direction'] = 'in' # y axis in 
plt.rcParams["legend.fancybox"] = False # 丸角
plt.rcParams["legend.edgecolor"] = 'black' # edgeの色を変更
plt.rcParams["legend.labelspacing"] = 0.9 # 垂直方向の距離の各凡例の距離
plt.rcParams["legend.framealpha"] = 1 # 透明度の指定、0で塗りつぶしなし
plt.rcParams["legend.handlelength"] = 2 # 凡例の線の長さを調節


fig, ax = plt.subplots(figsize=(8,6))
# plt.subplots_adjust(left=0.1, right=1, bottom=0, top=1.03) # 図の余白調整

ax.legend(loc='best')
ax2 = ax.twinx()  # ax2 handles y
ax3 = ax2.twiny()  # ax3 handles x
ax2.set_yticks(ax.get_yticks())
ax2.set_ylim(ax.get_ylim())
ax3.set_xticks(ax.get_xticks())
ax3.set_xlim(ax.get_xlim())
ax2.tick_params(labelbottom=False, labelleft=False, labelright=False, labeltop=False)
ax3.tick_params(labelbottom=False, labelleft=False, labelright=False, labeltop=False)

# epsも可能．ただし，これで作成したepsはtexに挿入するとズレを引き起こす可能性あり．そのため，png作成→ブラウザソフトやInkscapeなどでeps変換を推奨．
fig.savefig("file.png", bbox_inches="tight", pad_inches=0.05,transparent=True)
```

#### 参考

https://qiita.com/MENDY/items/fe9b0c50383d8b2fd919

https://qiita.com/renesisu727/items/24fc4cd8fa2635b00a0d
sys.path.append

通常版(.py)
```
sys.path.append(os.path.join(os.path.dirname(__file__), '<参照したいディレクトリのパス>'))
```
notebook版（.ipynb）
```
sys.path.append(os.path.join(os.path.abspath(''), '<参照したいディレクトリのパス>'))
```
PHP_CodeSnifferとPHP-CS-Fixerの比較

PHPのコードスタイルをチェックしてくれるツール (Linter) といえば、**PHP_CodeSniffer**と**PHP-CS-Fixer**の2つが有名です。

2種類あるがゆえに、いざツールを導入しようとなると「どっちを選べばいいの！？」となりがちだと思います。というか自分が実際なりました。
というわけで、私が担当プロダクトへのLinter導入にあたって調査した、PHP_CodeSnifferとPHP-CS-Fixerの比較を紹介します。

## 使い方
いずれもComposerでインストールし、コマンドラインから実行できます。

特徴としては、PHP_CodeSnifferはチェックと自動修正でそれぞれ`phpcs`,`phpcbf`という別コマンドに分かれているのに対し、PHP-CS-Fixerは`php-cs-fixer fix`コマンドで自動修正、それに`--dry-run`オプションを付けるとチェックのみになる、という違いがあります。
PHP-CS-Fixerは "Fixer" という名前からもわかるように、あくまでコードの修正が基本で、チェックする機能はそのドライランという位置づけのようです。

### インストール
```shell
# PHP_CodeSniffer
composer require --dev squizlabs/php_codesniffer
# PHP-CS-Fixer
composer require --dev friendsofphp/php-cs-fixer
```

### チェック
```shell
# PHP_CodeSniffer
vendor/bin/phpcs target_file.php
# PHP-CS-Fixer
vendor/bin/php-cs-fixer fix --dry-run target_file.php
```

### 自動修正
```shell
# PHP_CodeSniffer
vendor/bin/phpcbf target_file.php
# PHP-CS-Fixer
vendor/bin/php-cs-fixer fix target_file.php
```

## 設定ファイル
いずれも設定ファイルでコーディングルールの細かい指定が可能ですが、フォーマットが異なります。

- PHP_CodeSniffer: XMLファイル
- PHP-CS-Fixer: PHPファイル

これはどちらが優れているというよりは、好みの問題でしょう。
個人的にはPHPファイルの方が普段から見慣れていてよさそうに感じます。

## 人気度
OSSの場合、一般に利用者が多いものほど洗練されていてバグが少ないことが多いです。
そのため、人気度も大事になってきます。

人気度の測り方はいろいろあると思いますが、今回は下記2点を基準としました。いずれも2022/12/25時点で確認した数値を記載しています。

- 直近30日間のPackagistでのダウンロード数
- GitHubリポジトリのスター数

||PHP_CodeSniffer|PHP-CS-Fixer|
|--|--|--|
|直近30日のダウンロード数|3,895,973|2,687,527|
|GitHubのスター数|9,878|11,581|

ダウンロード数ではPHP_CodeSnifferが上、スター数ではPHP-CS-Fixerが上という結果です。これに関してはどちらも十分人気があると言っていいでしょう。

## リリース頻度
頻繁にリリースされているほど、バグ修正やPHPの新しい文法への対応も迅速に行われていると考えられます。
2022年中のリリース回数は以下の通りでした。

- PHP_CodeSniffer
  - 2回
- PHP-CS-Fixer
  - 15回

これはPHP-CS-Fixerが圧倒的に上回っていました。
PHP_CodeSnifferも開発が止まっているわけではありませんが、最新のPHPの文法をガンガン使っていきたいような場合はPHP-CS-Fixerの方がいいかもしれません。

## 設計思想
先ほども出てきましたが、PHP-CS-Fixerは原則としてコードの**自動修正**を目的としています。
そのため、自動修正できないような問題を検知するコーディングルールが用意されていないという特徴があります。

たとえば、1行あたりの文字数の長さをチェックするルールは、PHP_CodeSnifferには存在しますが、PHP-CS-Fixerにはありません[^1]。
[^1]: https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/1361

---

私のチームでは、自動修正できない問題も検知したいという理由から、最終的にPHP_CodeSnifferを採用することにしました。
それぞれのチームやプロダクトに合ったLinter選びの参考になれば幸いです！
ハッカソンにはじめて参加したので、記録しておく

# ハッカソンとは？
ハッカソンとは、hack（ハック）＋marathon（マラソン）からの造語で、ソフトウエア開発者が、一定期間集中的にプログラムの開発やサービスの考案などの共同作業を行い、その技能やアイデアを競う催しです。期間はふつう数時間から数日程度で行います。（https://www.weblio.jp/content/%E3%83%8F%E3%83%83%E3%82%AB%E3%82%BD%E3%83%B3 )
# 私が参加したハッカソンについて
私が通う大学で行われた、学内ハッカソンです。p2hacks(https://p2hacks2022.github.io/ )に参加しました。
学内ハッカソンですが、豪華なスポンサーがついており、優勝すると豪華景品がもらえるという感じでした。私は初めてということで、賞は目指さず、楽しんで、初めてハッカソンを体験し、プロダクトを作ることを目標にしました。
# 参加した経緯
私が通う大学では、学部3年次にPBLを必修で履修します。その中で、Swiftを用いてアプリ開発を経験したのですが、それでアプリ開発に興味を持ったのがきっかけです。
また、去年に、違う学内ハッカソンに参加したことがある友人が、技術力が上がるよ、と言っていたので、それなら、と参加することに決めました。
友達同士で組み、4人グループで参加しました。（2人～5人までのグループが条件でした）
# 参加して良かったことや反省点
## 良かったこと
### 1\. 短期間でプロダクトを作るという経験ができた
3年次の必修のPBLでは1年かけて、課題からアプリ開発～レビューなどまで経験します。1年という期間があるので、今回参加したハッカソンより長いです。いかにして、短期間で良いプロダクトを作るのか？という経験が出来たことはとても貴重でした。
### 2\. 技術力が上がった
Swiftを使ったのですが、大学の必修PBLでは用いなかった技術（pod install関連やFirebaseとの連携など）をやったので、とても良い経験になりました。正確に言うと、必修PBLでもFirebaseは使っているのですが、私は担当ではありませんでした。本格的に使用したのは、今回のハッカソンが初めてだったので、その経験が出来たのはとても大きかったです。
### 3\. 他グループのプロダクトを見ることが出来た
最終日に全グループ（20グループほど）の発表で、それぞれのプロダクトを見ることが出来たことは、とても良い経験でした。私達のグループは、最後まで技術面（主にgitとpod関連）で苦しんだため、当初予定していたところまで進めることができませんでした。ですが、きちんと完成させているところがあったり、発表時のスライドがとても工夫しているところだったり、をみることが出来たのは、とても良かったです。
### 4\. 企業の方と関わることが出来た
今回の学内ハッカソンでは豪華スポンサー企業がついてくださっています。ハッカソンの運営が、グループごとの座談会を開いてくれており、私はソフトクリエイトホールディングス株式会社と、Wantedly株式会社との座談会に参加し、とても刺激を受けることが出来ました。（希望を出し、抽選という形でした）
## 反省点
### 1\. プロダクトを完成させることが出来なかった
私達が立てた目標までを作ることが出来なかったことは、とても残念でした。しかし、アイデアなど、しっかり練って、ペルソナなども立て、3年次必修PBLを活かせたことはとても良かったなと思っています。次回、ハッカソンに参加する際は、実装に関係が無い技術面（GitやPodなど）をスムーズにしたいと思います。また、計画をしっかり立て、完成できる目標をしっかり立てたいと思いました。
### 2\. メンバーの幅広さ
冒頭でも書いた通り、今回は友人を誘って参加しました。私が通う未来大のシステムコース4人だったため、幅広いメンバーがいたら、よりよいプロダクトができるのではないか？と思いました。他のチームは、色々なコースの人がいたため、そのアイデアの幅広さみたいなものを感じました。ただ、今回は初めてでしたし、とても楽しんで参加することができたので、とても良かったです。
### 3\. 開発メンバーの少なさ
今回、Swiftを使ったことのあるメンバーが私とあと一人で、他2人は、1人はデザイン、1人は一応開発ですが、Swift初心者でした。そのため、圧倒的にメンバーが足りなかったです。フロントエンドやバックエンド、デザインと、一人一人の役割がもっときちっと決まっていたら、色々スムーズにいった点もあるのかもしれません。
# まとめ
つらつらと良かったことや反省点を書きましたが、今回、学内ハッカソンに参加して良かったと思っています。
Yahooなどが主催している他のハッカソンにも参加してみたいと思いました。
一応、学内ハッカソンは私が1年生のときから毎年1回は開催されていたので、参加する機会はあったのですが、技術力のたりなさから、参加をためらっていました。
なので、技術力のたりなさから、ハッカソンに参加するかしないか迷っている方は、ぜひ参加してみてほしいです。
とても楽しいハッカソン期間でした。
つよつよの人のチームのプロダクトだったり、企業の方との関わりだったり、とても刺激になります！
読んでくださり、ありがとうございました。
[Comopse]Coilを使ってString -> Bitmap -> Drawableに型変換する方法

## こんな時
- StringをどうしてもBitmapの形に変換したい時
- BitmapをどうしてもDrawableの形に変換したい時
- StringをどうしてもDrawableの形に変換したい時

## 前提
- Composable関数の中で書く
- coilを使うのでgradleに以下追加
```
implementation("io.coil-kt:coil-compose:2.1.0")
```

## コード
コルーチンの中で変換します。
以下は String -> Bitmap -> Drawableの順に変換してます。

```
val myString = "画像URLとか"
val context = LocalContext.current

val coroutineScope = rememberCoroutineScope()
coroutineScope.launch{
val loader = ImageLoader(context)
val request = ImageRequest.Builder(context)
    .data(myString)
    .allowHardware(false) 
    .build()

val result = (loader.execute(request) as SuccessResult).drawable
val myBitmap = (result as BitmapDrawable).bitmap

val myDrawable = context.imageLoader
    .execute(ImageRequest.Builder(context).data(myBitmap).build())
    .drawable
}
```

myBitmapがbitmapの形になってます。
myDrawableがDrawableの形になってます。

## 参考
https://stackoverflow.com/questions/61892301/how-to-get-bitmap-from-url-using-coil

https://qiita.com/toastkidjp/items/8563df168fa37154ddbc
Spring Bootプロジェクトの開始(VSCode)

## はじめに
今回はVSCodeでのSpring Bootプロジェクトの開始方法を書いていきます。
Macで作成しています。

最初に、表示からコマンドパレッドをクリック
![スクリーンショット 2022-12-26 16.37.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/7523af8d-efb3-d3c8-8095-13b14dea1b59.png)

そうすると以下のような表示になります。
Spring Bootのプロジェクトには主に、「Gradle」と「Maven」がありますが、今回は「Gradle」で作成していきます。
![スクリーンショット 2022-12-26 16.37.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/9d79972a-4e16-18e0-ce46-097376af79df.png)

次は、Spring Bootのバージョンを指定します。
今回は2.7.8を指定します。
![スクリーンショット 2022-12-26 16.37.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/26a30d29-fa66-8362-e4ad-c6b41d2c3a9f.png)

次は、プログラミング言語を指定します。今回はSpring Bootでの開発なので、Javaを指定します。
![スクリーンショット 2022-12-27 10.09.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/20e4e49a-6855-57cf-3925-6ce05d13fa4a.png)

次は、パッケージ名の指定です。
今回は、このままEnterで進みます。
![スクリーンショット 2022-12-27 10.08.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/b1bc87da-b421-2a23-944d-47d33b2b9feb.png)

次はプロジェクト名の指定です。
今回は「base」と指定してEnterで進みます。
![スクリーンショット 2022-12-27 10.08.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/57ca9c20-98a1-b33b-a2c0-7c9db0df965a.png)




次は、このMacで使用されているJavaのバージョンを指定します。
こちらでインストールされているバージョン以外のバージョンを指定するとエラーになってしまい、Spring Bootが起動できなくなるので注意してください。
VSCodeのターミナルで、Javaのバージョンを以下のコマンドで確認します。
```
MacBook-Air ~ % java -version
java version "19.0.1" 2022-10-18
Java(TM) SE Runtime Environment (build 19.0.1+10-21)
Java HotSpot(TM) 64-Bit Server VM (build 19.0.1+10-21, mixed mode, sharing)
```
このMacではJava19がインストールされているので、19を指定します。
![スクリーンショット 2022-12-26 16.38.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/9b0771e2-2158-e741-3aa4-62603bce08ac.png)

次は、依存関係の指定をします。
要は、Spring Bootで使える便利な機能を指定します。
こちらはプロジェクトを開始した後でも追加ができるので、今回は、以下の10個を指定しておきます。
![スクリーンショット 2022-12-26 16.40.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/959569a7-6cec-8a53-fddb-3c7cfdb8aac2.png)

画像はありませんが、作成したファイルを格納する場所を指定する画面になりますが、今回はデスクトップに指定します。
そうすると、「作成者を信頼しますか？」とVSCodeに聞かれますが、「はい」をクリックしてください。

すると、以下の画面になり、Spring Bootのプロジェクトが作成されました！

最後に、Spring Bootプロジェクトがちゃんと作成できているか確認するために、画像で指定されている「Run」というところをクリックしてください。
![スクリーンショット 2022-12-26 16.41.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/675e9170-b149-2fa5-d0ff-127fadfe4b77.png)

ターミナルが以下の画像のような画面になれば、Spring Bootがちゃんと起動しています。
![スクリーンショット 2022-12-26 16.41.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/7cbd2388-bd1e-1b88-7e20-7ab2a3539e61.png)

起動が確認できたら、ブラウザで
http://localhost:8080/
を打ち込むと、以下のような画面になります。

今回は依存関係を指定するところで、ログイン機能などを実装するために必要な「Spring Security」を指定したので、Spring Bootに初めから搭載されているログイン画面が表示されます。


![スクリーンショット 2022-12-26 16.42.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/b68142d7-6a90-3c1b-d71b-1ae8998c4ece.png)

以上でSpring Bootプロジェクトの作成が成功しました。
【データ基盤構築/BigQuery】UNION結合とGROUPBYを併用する際に、視認性が高いクエリの書き方

# 今回の課題
ひとつのクエリ内で、UNIONとGROUPBYを使用した際に、
視認性が低くなってしまった。

そのため、視認性の高いクエリの書き方をメモすることにした。

## 視認性の高いクエリ
下記の手順でクエリを記述すると視認性が高くなった。
1. WITH句内でUNION結合。
2. 外側のクエリでGROUP BYする
```SQL
with master as (
    select
        session
        , user_id
        , case
            when user_id is null then 'guest'
            when user_id is not null then 'login'
            else null
		end as login_status
        , action
        , category
        , products
        , amount
        , stamp
    from
        action_log
	union all
    select
        session
        , user_id
        , 'all' as login_status
        , action
        , category
        , products
        , amount
        , stamp
	from
        action_log
)
select
    action
    , login_status
    , count(session) as action_count
    , count(distinct session) as action_uu
from
    master
group by
    action
    , login_status
;
```

## 視認性の低いクエリ
最初はこちらでクエリを作成してしまった。
GROUPBYしながらUNION結合していたため、非常に見づらいクエリになってしまっていた。
```SQL
with master as (
    select
        action
        , case
            when user_id is null then 'guest'
            when user_id is not null then 'login'
            else null
		end as login_status
        , count(session) as action_count
        , count(distinct session) as action_uu
    from
        action_log
    group by
        actoin
        , login_staus
	union all
    select
        action
        , 'all' as login_status
        , count(session) as action_count
        , count(distinct session) as action_uu
	from
        action_log
    group by
        action
)
select
    *
from
    master
;
```
簡単にドライブを増やす

## ちょっち、Dドライブが必要な時とか
CドライブしかないPCに何かの都合で一時的にDドライブが必要になった時にどうしますか？ いちいちパーティション切るのも面倒ですよね。そんな時は [SUBSTコマンド](https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/subst "SUBST") でフォルダにドライブ文字を割当てたりするわけですが、再起動する度にSUBSTコマンドを打ち込むものめんどくさい。ってことで、レジストリのスタートアップに登録してしまいます。

* まずは適当なところにDドライブとして使いたいフォルダを作成。この場合は **C:\D_Drive** と言うフォルダを作りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106424/edf984c8-a789-076c-1996-382a9fac2a4c.png)
* このフォルダを一時的にDドライブとして割当てるにはコマンドプロンプトからSUBSTコマンドを打ち込めばいいのですが、再起動の度に打ち込むのは面倒です。
```CMD:SUBSTコマンド
subst d: "C:\D_Drive"
```
* そこで、レジストリのスタートアップに登録してしまいましょう。スタートアップに登録するには画像の通り、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run の下に適当なキー名（ここでは「**SubstDdrive**」）で文字列定義をして、データに 「**subst d: "C:\D_Drive"**」を書いてしまえばOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106424/77c15bfb-3f54-1f5a-8c87-7afec39a7066.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106424/7a182d8a-c01d-48c7-068c-8504b6b0ca74.png)

これで、再起動時も自動的にDドライブが割当てられます。まるで本当にDドライブがあるような気もしてきます。
[Ruby on rails] 駆け出しエンジニアの「なんでこの名前なん？」4選



どうも、9月に入社しました駆け出しエンジニア（４か月）です。
この記事では、僕が「**え、それそういう由来だったのね**」と思ったIT用語や略語を4つまとめてみたいと思います。
漠然とした機能に加え、その語の由来やニュアンスを的確に捉えることができれば初学者はよりスムーズに、経験者はより深く用語について理解できるのではないでしょうか。
尚、以下は完全なる僕の主観に基づいた情報であり、現状の僕の用語に対する理解です。
間違い、補足等あれば都度コメントいただけると幸いです。
それではスタートです。
※Ruby on Railsを主に触っている前提です。
# erb
これは”Embedded RuBy"の略です。日本語に訳すと、「**埋められたruby**」。
よくHTMLファイルなどで見かかけますね。
〇〇.html.erbのような感じです。つまり、「rubyが埋められたHTMLファイル」だよ！ってことを示してくれています。「あれ、、rubyが読み込まれてない、、」なんてことが起きた時は拡張子がきちんと「.erb」になっていなかった。なんてことはよくあるので、よくよく確かめてみるべきだなあと思いました。

# configファイル
Configuration ：**設定**　という単語を縮めたものです。
その名の通り、このフォルダではプロダクトの様々な設定が為されていました。
Routes.rbがその代表格ですね。ルーティングに関する設定が書かれています。
configファイルを見た時、「あ、何かいろんな設定が書かれてあるファイルね」となれるだけでも少し安心感が増しますね。

# モデル（model）
モデルは、コントローラーの命令に従って、DBから何らかの情報を取り出したり、あるいはデータベースに何らかの情報を書き込んだりしてくれます。
「**型・模範などに合わせて～を〕作る**」という訳が今回の場合は最もしっくりくる気がします。
つまり、railsのシンプルで直感的な書き方に乗っ取れば後はモデルが内側で適切なSQL文を勝手に作り出してくれる。といった感じです。
これですこーしだけモデルの名前に納得できた気がしています。

# インスタンス（instance）
初学者を悩ませる概念、インスタンス。
ここでのinstanceの適切な訳し方は、「**一例となるデータ**」かなと思います。
ですので、インスタンス化はクラスを基に「一例となるデータを生み出すこと」となります。
クラスは設計図なので、クラスを基にいくつものインスタンスを生み出すことができます。
よって、インスタンス化する際にはたくさん生成できるインスタンスのうちの一つ、つまり「一例」を生み出していることになります。
こればっかりは文章を読むよりも実際にコードを見た方が１００倍くらい納得感があるなと思いました。
以下のサイトが特にわかりやすかったです。
https://qiita.com/yamaday0u/items/dca132e46b390c9af51b

# 終わりに
以上、僕が最初に目にした時「何でこの名前なん？」となった用語と、現状の僕なりの解釈でした。
以降もプログラミングに関する情報を綴りつつ、エンジニアライフを謳歌したいと思います。
Azure Administrator(AZ-104)：Azure での ID とガバナンスの管理「Azure ADへの参加」

Microsoft Learnを用いたMicrosoft Azure Administrator(AZ-104)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始め、AZ-900取得後の資格としてAZ-104取得を目指している方の参考になれば幸いです。
※AZ-900の内容は本投稿では省略しております。再度復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：試験合格に向けた学習内容のまとめ](https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8)

## 今回の学習内容
**◆「Azure ADへの参加」**
◇対応するMicrosoft Learn ラーニングパス
[AZ-104:Azure での ID とガバナンスの管理](https://learn.microsoft.com/ja-jp/training/paths/az-104-manage-identities-governance/)
◇対応するモジュール
[Azure Active Directory 参加を実装する](https://learn.microsoft.com/ja-jp/training/modules/configure-azure-active-directory/6-implement-active-directory-join)

※前回の投稿は下記から確認できます。
[Azure Administrator(AZ-104)：Azure での ID とガバナンスの管理「Azure ADのエディション」](https://qiita.com/fsd-jume/items/02297c7277ceabba4dac)

## Azure ADへの参加
### Azure AD参加の利点
**◆SSO(シングルサインオン)**
・Azure管理のSaaSアプリやサービスへのSSOアクセスを提供
・職場のリソースへのアクセス時、余分な認証画面を表示しない
・社内ネットワークに接続していない時でもSSOアクセス可能

**◆Enterprise State Roaming**
・Windows10以降で使用可能
・ユーザのWindows設定とアプリ設定のデータをAzureクラウドとセキュアに同期
⇒新しいデバイスを構成する時間が短縮
例：新しく購入したPC-Bの設定をPC-Aと同じ設定で構成したい場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/063efeae-c929-470f-8943-6b9909a99f91.png)
**◆ビジネス向けMicrosoft Storeへのアクセス**
・組織単位で事前に取得したアプリを専用ページからインストール可能

**◆Windows Hello for Business**
・PINや生体認証を用いたWindowsへのサインイン方法
・仕事用リソースへのセキュリティ保護された便利なアクセスを提供
※Windows HelloはAzure ADユーザとして認証しない構成時のみの利用を想定

**◆アクセスの制限**
・アプリへのユーザアクセスを特定のデバイスからに制限可能
例：コンプライアンスポリシーを満たす参加済みデバイスなど

**◆オンプレミスリソースへのシームレスなアクセス**
・デバイスからオンプレミスのドメインコントローラへの通信経路がある場合
⇒オンプレミスのリソースにシームレスにアクセス可能
※Azure ADシームレスSSO機能の一部

### 参加済みデバイス使用の考慮事項
**◆Azure ADへの接続オプション**
・デバイスをAzure ADに登録
　-BYOD用のデバイスで使用することを想定
　-Azure ADへの登録によってデバイス認証用のIDが指定される
　　⇒このIDでデバイスの有効/無効が可能
・デバイスをAzure ADに参加
　-登録の拡張機能
　-職場または学校アカウントを使用してデバイスにサインイン可能

**◆登録と他のソリューションの組み合わせ**
・登録とIntuneなどのMDM(モバイルデバイス管理)を用いて、条件付きアクセスが可能
⇒コンプライアンスポリシーを満たしていないデバイスはブロックするなど

**◆他の実装シナリオ**
・ブランチオフィスなどオンプレミスのADがない場合でもAzure ADで参加可能

## 次の学習内容
**◆Azure ADのセルフサービスパスワードリセット**

https://qiita.com/fsd-jume/items/e3b7e1cfd6878a59bc13

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
ruby 練習問題44　（アウトプット用）

times文を使って、以下のようにターミナルに出力されるプログラムを書く問題。
```
1回目の繰り返し
2回目の繰り返し
3回目の繰り返し
4回目の繰り返し
5回目の繰り返し
6回目の繰り返し
7回目の繰り返し
8回目の繰り返し
9回目の繰り返し
10回目の繰り返し
```
以下、模範解答
```ruby
10.times do |i|
  puts "#{i + 1}回目の繰り返し
end
```
以下、解説
times文を使い、puts "○回目の繰り返し"という処理を繰り返し行う。
今回は○回目の○の部分に数字を１ずつ足していかなければいけないので変数を使用する。（今回は変数iとする。）
プログラムなので、1回目の繰り返しではiは0になるので(i + 1)回目の繰り返しとすれば１となる。