OmniAICreator/Qiita-1.07M huggingface dataset:
Copilot StudioでOpenAI APIを扱う ~HTTP要求の使い方~

## 今回解説すること
Copilot Studioは、手軽にTeamsボットを作成できるMicrosoftのサービスです。
今回は、Copilot StudioでOpenAI APIを扱った時につまづいたポイントを解説していきます。
特にHTTPリクエストを送信する「HTTP要求」の設定と、受け取ったレスポンスをどのように扱えばいいかを中心に解説します。

## HTTP要求の送信の呼び出し
新しいトピックを作成し、「HTTP要求の送信」をクリックします。
![スクリーンショット 2024-04-23 12.01.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2503518/1c7a53be-017d-9ce0-13dd-e42dee578c67.png)

## HTTP要求の送信の設定
HTTP要求のカードが出てきたら以下を設定してください。
- URLは`https://api.openai.com/v1/chat/completions`
- メソッドは`POST`
- ヘッダーにキー：`Authorization`、値：`Bearer sk-*******`←OPENAIのAPI KEYを入力してください
![スクリーンショット 2024-04-23 13.21.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2503518/42560b20-5be5-8fb2-9ef3-ecd863a7858f.png)

本文には、`JSONコンテンツ`を設定し、`JSONの編集`を`式の編集`に変え、以下を入力します。`System.Activity.Text`にはユーザーの入力の値が入っているので、それをそのままAPIに投げています。
```
{
  messages: [
    {
      role: "system",
      content: "あなたは質問に回答するAIです。"
    },
    {
      role: "user",
      content: System.Activity.Text
    }
  ],
  model: "gpt-3.5-turbo",
  temperature: 0.2
}
```

応答のデータタイプは`Record`とし`スキーマを編集する`を押し、以下を設定する
```yml
kind: Record
properties:
  choices:
    type:
      kind: Table
      properties:
        finish_reason: String
        index: Number
        logprobs: Blank
        message:
          type:
            kind: Record
            properties:
              content: String
              role: String

  created: Number
  id: String
  model: String
  object: String
  system_fingerprint: String
  usage:
    type:
      kind: Record
      properties:
        completion_tokens: Number
        prompt_tokens: Number
        total_tokens: Number
```

`応答に名前をつけて保存`をクリックし、新しい変数`Var1`を作成します

## 受け取ったレスポンスを扱う。
レスポンスは以下のような形式です。
```json
{
   "choices":[
      {
         "finish_reason":"stop",
         "index":0,
         "logprobs":null,
         "message":{
            "content":"ここに返答が入ります。",
            "role":"assistant"
         }
      }
   ],
   "created":1713846594,
   "id":"chatcmpl-9H24wFfltmmY8jN3iTquNhBjAZpHw",
   "model":"gpt-3.5-turbo-0125",
   "object":"chat.completion",
   "system_fingerprint":"fp_c2295e73ad",
   "usage":{
      "completion_tokens":117,
      "prompt_tokens":40,
      "total_tokens":157
   }
}
```
ここから`Topic.Var1.choices[0].message.content`として取り出したいところですが、それではエラーが出ます。
メッセージ送信カードを作成したら、`PowerFx式を挿入する`をクリックして、以下のように設定してください。PowerFx式では`Index`を使うことでリストの要素を取り出すようです。
```python
Index(Topic.Var1.choices,1).message.content
```

![スクリーンショット 2024-04-23 13.35.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2503518/4bfd3ce8-4069-68d9-846c-c4778b4d670c.png)

上記が完了したら、保存をして動かしてみましょう。

## 実行してみる

トリガーを「今日の晩御飯なんにしよう」に設定し、トリガーの通りに入力してみます。
![スクリーンショット 2024-04-23 13.42.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2503518/6f06c0e8-3d3b-93ad-680e-411ec6ff5ceb.png)

きちんとレスポンスを受け取ることができました。

## まとめ
いかがだったでしょうか。Copilot Studioは、PowerFx式が一癖あって使いづらいですが、簡単にTeamsボットが作成できる点はとてもいいですよね。トリガーを`On Unknown Intent`にすることでさまざまな入力を受け取れるようになるので、そこにこのHTTP要求の流れを作ると良いかもしれません。
VPS環境でlaravel+reactで環境作成時のエラー備忘録「 ERR_CONNECTION_REFUSED」

# 環境
php 8.3.6
laravel Framework 11.4.0
composer 2.7.2
sail v20.12.2
npm npx 10.5.2

# 環境構築中のエラー
https://ryamate.hatenablog.com/entry/laravel_sail_react

上記を参考に環境を作成して、
「sail npm run dev」を実行してブラウザを表示しようとしたらブラウザーが真っ白で下記のconsoleエラーが発生
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771936/1b6de9b6-60b2-c902-6080-80d6ee1281b8.png)

```
http://localhost:5173/@react-refresh net::ERR_CONNECTION_REFUSED
```

プロジェクト直下にある「vite.config.js」にserverの部分を追加し
host:の 「157.xxx.xxx.xxx」の部分をグローバルIPにすることで解決
```
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
import react from '@vitejs/plugin-react'; // 追加

export default defineConfig({
    plugins: [
        laravel({
            input: [
                'resources/sass/app.scss', 
                'resources/ts/index.tsx'
            ],
            refresh: true,
        }),
        react(), // 追加
    ],
    server: {
        hmr: {
            host: '157.xxx.xxx.xxx',
        },
      }
});
```
# まとめ
VPSやawsなどのクラウドで作成する方の参考になればと思います
ポートの解放も必要です(ポート解放については過去の記事をご参照ください)

https://qiita.com/aimkbiz/items/7ffc75be3406f6eac1d6
【Flutter】FlutterWebをモバイル端末で動作させる

# はじめに

FlutterWebで実装したアプリケーションをモバイル端末で確認しなくてはいけない状況になりました。

とはいえ開発環境のURLはlocalhostだし、どうやるんだこれ？？って思った時に、実機での確認方法を見つけたので、備忘として残しておきます。

結論、めっちゃ簡単です。

# 開発環境

[Flutterバージョン]
3.16.1

[使用端末]
PC: Macbook Air(M1)
モバイル端末: iPhone13Pro(17.4.1)

[開発ツール]
VSCode

# Wi-Fi接続

前提として、PCと動作確認するモバイル端末を同じWi-Fiに接続してください。


# IPアドレスの確認

以下の手順でIPアドレスを確認します。

アップルマーク > システム設定 > ネットワーク > Wi-Fi > 詳細

その画面にあるIPアドレスをコピーしておきましょう。
よく聞く、「192.168~」ってやつですね。

# Webサーバ起動

以下のコマンドを打って、Webサーバを起動します。

```
fvm flutter run -d web-server --web-hostname=<IPアドレス> --web-port=8080 
```

「< IPアドレス >」には、先の手順でコピーしたIPアドレスを貼り付けてください。

# 確認

ここまでできたら、実際にChromeで確認してみましょう。
検索バーに「http://< IPアドレス >:8080」で検索してみてください。Web上で動作するアプリが確認できると思います。

# 参考サイト

https://note.com/danchi_kun/n/n5747fa9eb748
Inspiron 11 3162/3164 BZ4CYB2のセットアップ

# 1. F2を押して、Restore Defaultsし、Saveする

# 2. F12を押して、Windows 10 Homeをインストール

# 3.「インターネットに接続していません」を押して、MSアカウントと紐づけないように

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/2cbab25b-e741-35f4-6381-048bab3e45c8.png)

# 4.「制限された設定で続行する」を押して、MSアカウントと紐づけないように
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/a2dad8c2-29fc-fedc-49e8-2b7cd143bfbd.png)

# 5. コルタナはうざいので設定しないようにする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/23566a26-dfb0-1289-8cc5-5bad03b9dce5.png)

# 6.「Buffalo-G-XXXX」のSSIDに接続して、Windows Updateする (3時間)

「Buffalo-A-XXXX」のSSIDに接続すると、Windows Update中にインターネットが壊れる。

# Inspiron 11 3162/3164の違い

パッケージが異なる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/84e98a80-f99a-c2fd-24f3-1304148ad4f1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/3a516ee0-53f5-aacf-6b2b-589f3df8df56.png)

https://www.dell.com/support/home/ja-jp/product-support/servicetag/0-T2dqWm5henBqSWJsZGR0akQ0NjkxZz090/docs

https://dl.dell.com/rdoc/dell%20inspiron%203164,p24t,p24t001,dell%20regulatory%20and%20environmental%20datasheet.pdf

https://dl.dell.com/rdoc/dell%20inspiron%203162,p24t,p24t001,dell%20regulatory%20and%20environmental%20datasheet.pdf
[Cloud Translation Basic API(V2)] Javaで翻訳がサポートされている言語のリストを取得する

Cloud Translation Basic API V2(Java)を使用して、
翻訳がサポートされている言語のリストを取得する方法
についてご紹介します。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Cloud Translation Basic API(V2)] JavaでTranslation Basic APIを使う](https://qiita.com/doran/items/54d2cd5d1767697d95cb)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[言語リストを取得](#1-言語リストを取得)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|


## 1. 言語リストを取得
言語リストを取得します。

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
TranslateScopes.CLOUD_TRANSLATION
TranslateScopes.CLOUD_PLATFORM
```
[⧉[Cloud Translation Basic API(V2)] JavaでTranslation Basic APIを使う(2.2 Translateインスタンスを取得)](https://qiita.com/doran/items/54d2cd5d1767697d95cb#22-translateインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行

```java
public static void main(String[] args) throws Exception{
    Translate translate = getTranslate();
    Translate.Languages languages = translate.languages();
    Translate.Languages.List list = languages.list();
    
    LanguagesListResponse res = list.execute();
    System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
GET:　https:\//translation.googleapis.com/language/translate/v2/languages
が実行されます。

#### 1.2.2. クエリパラメータ
Translate.Languages.Listのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setTarget|String|ターゲット言語コード|
|setModel|String|特定の翻訳モデルでサポートされている言語|

### 1.3. レスポンスの内容
#### LanguagesListResponse
|メソッド|戻り値|説明|
|---|---|---|
|getLanguages|List\<[LanguagesResource](#languagesresource)\>|サポートされている言語セット|

#### LanguagesResource
|メソッド|戻り値|説明|
|---|---|---|
|getLanguage|String|サポートされている言語コード|
|getName|String|ターゲット言語にローカライズされた名前|

<br>
<br>
おしまい。。
Astroのアイランドって何なの？ 下ネタ？

## 著者の紹介

著者はイナバくん。
某会社でフロントエンドエンジニアをしています。
ガンダムSEEDとコードギアスに再燃中。

## この記事で話すこと

今さらながら[Astro](https://astro.build/)を触ってみたので、感想を書きます。

ちなみに、イナバくんのフロントエンドエンジニアとしての略歴・技術スタックは以下の通りです。

```
1. Webサイト制作(WordPress, HTML, CSS, jQuery) + マネジメント
↓
2. 少しHeadless CMSの案件やる(MicroCMS, Nuxt.js)
↓
3. Webアプリケーション開発(Next.js, TypeScript, GraphQL, スクラム開発) ← いまここ
```

業務ではWebアプリケーションの開発をしているのですが、副業ではサイト制作もしています。
ふと、モダンな技術スタックでサイト制作をするとしたら、何のライブラリ・フレームワークを選定するだろう・・？ と思い、Astroに興味を持ちました。

この記事では、イナバくんの目線でAstroの感想を書きます。

## AstroはNext.jsの競合ではない

Astroが登場した当初は、GatsbyのようなReactベースのフレームワークだと勘違いしていました。
しかし、Astroは全く異なるフレームワークである事が分かりました。

まず、AstroはReactベースではありません。
HTML, CSS, JSをそのまま書くことができます。

さらに、Vue.jsやReactコンポーネントも利用可能で、JSX記法もサポートされています。
なので、Astroは学習コストが限りなく抑えられたフレームワークであると言えます。

また、AstroはNext.jsと異なり、MPA(Multi Page Application)のフレームワークです。
Next.jsなどのSPAフレームワークの弱点を解決するという思想で開発されたのがAstroです。
SPAの弱点は、初回の読み込みがとても遅いことですが、Astroは初回読み込みがとても速いです。
AstroはMPAであり、さらにbuild時にJSを最小限に減らしているため、ページの読み込み速度を向上させています。

AstroはMPAでJSの排除された静的HTMLなので、静的コンテンツの多いメディアサイトやブログなどが向いています。
逆にNext.jsは、SPAでReactベースなので、インタラクションや機能の多いWebアプリケーションが向いています。

(※ 著者も趣味で1PのサイトをAstro + Vercel で作ってみました: https://ene-ari.vercel.app/)

## Next.js と共通している機能

AstroはNext.jsとは異なる思想で設計されているフレームワークですが、共通している機能もあります。

### 1. モダンな開発環境を提供している

- ホットリロード付きのローカル環境
- 画像の最適化
- TypeScriptがオプションで導入できる
- コンポーネント開発ができる

### 2. ルーティング機能

`/pages`ディレクトリに`.astro`ファイルを置くとルーティングできる

### 3. モジュールバンドル

内部的にViteが使われていて、ビルドが爆速です

## Astroの文法について

### 1. JSXと似ている点

`.astro`ファイルでは、HTML・CSS・JSをそのまま書けるので、基本的には特に学習しなくても開発ができます。

また、JSXのように変数・条件分岐・ループができます。

```jsx:Sample.astro
---
const items = ["犬", "猫", "アフリカゾウ"];
const isVisible = true;
---
<ul>
  {items.map((item) => (
    <li>{item}</li>
  ))}
</ul>

{isVisible && (<p>出る</p>)}
```

### 2. JSX, Next.js と違う点

#### 2.1. イベントハンドラの扱い

JSXと一番の違いは「イベントハンドラの扱い」です。
Next.jsでよく使う下記のようなコードはNGとなります。

```jsx:Sample.astro
---
const handleClick = () => {
  console.log("クリックされたお");
}
---

// ❌ NG例 ❌
<button onClick={handleClick}>クリックする</button>
```

AstroではHTML内のJSがビルド時に排除されるため、JSXのような書き方はサポートされていません。

下記のように`<script>`内でDOM操作する必要があります。

```jsx:Sample.astro
<button id="button">クリックする</button>

<script>
  const handleClick = () => {
    console.log("クリックされたお");
  }
  document.getElementById("button").addEventListener("click", handleClick);
</script>
```

複雑なインタラクション(例えばフォームのバリデーションなど)があった場合は、Reactライブラリを使ってインタラクティブなコンポーネントを作って、Astroファイルにimportするのが効率良いと思いました。

ちなみに、このようなインタラクティブなコンポーネントの事を、Astroでは[「アイランド」](https://docs.astro.build/ja/concepts/islands/)と呼んでいます。
(アイランド = 静的コンテンツの海の中に浮かぶ孤島、らしいです。)

#### 2.2. コンポーネントのPropsの書き方

AstroではNext.jsと違い、コンポーネントファイルの中で`type Props`の型を定義すると、それが自動的にpropsの型になります。

```jsx:Sample.astro
---
type Props = {
 title: string;
 description?: string;
}

const {title} = Astro.props;
---

<h2>{title}</h2>

{description && <p>{description}</p>}
```

他にも細かい違いはありますが、詳しくは[公式ドキュメント](https://docs.astro.build/ja/basics/astro-components/)を参照してください。

## まとめ

Astroは学習コストがほぼ無い上に、簡単にモダンな開発体験ができます。

また、MPAでかつサーバーファーストで読み込み爆速なので、ブログやポートフォリオサイトやLPなどであれば、Next.jsよりAstro方が最適だと思いました。

## 参考文献

- [Astro公式ドキュメント](https://docs.astro.build/ja/getting-started/)
午前12:00と12:00 AM の罠

#### 結論
『午前12:00』 ← 昼間
『12:00 AM』 ← 深夜


#### 細かい話
◯深夜（00:00, 24:00）
「午前0時」「午後12時」「12:00 AM」

※「0:00 PM」「AM 12:00」とは表記しない
<br />

◯正午（12:00）
「午前12時」「午後0時」「12:00 PM」

※「0:00 AM」「PM 12:00」とは表記しない
<br />

<br />


AM PMを時間の前に表記することも ネイティブではしないとのこと。
日本語的に理解しやすいので、日本では違和感ないですね。

<br />

いや、24時間表記してくれとしか。。。

<br />
<br />

参考文献
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1416406544
https://www.nao.ac.jp/faq/a0401.html
AWS PrivateLinkでNLBに接続する際、最低限必要なセキュリティグループのルール

# 内容

オンプレミス環境のPCからアカウントAのVPCエンドポイント～アカウントBのエンドポイントサービス経由でNLBにアクセスする構成を例にします。EC2上ではNginxがポート80で稼働しており、オンプレミスPCからは`http://VPCエンドポイントのDNS名`を指定することによってEC上のNginxに接続します。

![pvlink6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/880c469d-9afb-7407-8978-1114dfba2d49.png)

# 説明
TCPリスナーでパススルー構成となるため、EC2の`Security Group C`で`192.168.1.10/32:80`が必要そうですがなくても大丈夫です。なぜならPrivateLink経由でNLBにアクセスする場合は、NLBで送信元IPが書き換わって、EC2にアクセスするのはNLBのIPになるからです。

![pvlink2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/177ac670-8d91-5e66-7dc9-e70975433af1.png)

ちなみにPrivateLinkを使用しない場合はNLBでアドレスは書き換わりません。
※デフォルト設定の「クライアントIPアドレスの保持」が「有効」な場合。「無効」するとNLBのIPアドレスに書き換わる。

![pvlink3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/2656cea2-884e-47b5-2d8a-83cab2ce3ac3.png)

PrivateLink経由の接続の場合、「クライアントIPアドレスの保持」が「有効」でも「無効」でもNLBのIPアドレスに書き換わります。クライアントのIPアドレスを保持したい場合はProxy Protocolを有効にします。
![pvlink4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/25c9f64d-68ec-609e-d718-cff3c30cefac.png)

その場合、nginx側のアクセスログに送信元IPアドレスを記録するためにはログフォーマットに`$proxy_protocol_addr`の追加が必要です。

![pvlink5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/49fa7396-a40c-b37b-dbfb-b173f208f2cc.png)
Unity 2d spriteにOutlineや影をつける

## やりたいこと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/ec123881-f81a-98f4-3052-f6a8d3f71253.png)
影と、アウトラインをつける。


## 方法
シェーダーを使った方法もあるがもっとシンプルに同じものをコピーして、影の色のにしてずらすだけ。

同じものをコピー、Objの子にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/d64a7291-c8c3-d999-2ea8-27d24f0f4c37.png)
スプライトを色を黒にアルファ値はお好みで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/6a676940-7598-a7c7-597e-87df1569719e.png)

アウトラインならスケールを調整。影ならpositionをずらす
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/750ba71e-c58e-b929-1b26-459683f9e124.png)

レイヤの順には気を付けつる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/bf61d9d5-560c-4ea1-c1e7-e51566329e5f.png)

単純にずらしているので、２重も、色も、形も、すべて自由に設定できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/1c4a747e-d8cd-dbc8-d82c-8574e0a2ced3.png)

やったね。

## 終わりに
意外と気が付かない簡単な解決策だったので記事にしました。
pythonを使ってff14の世界エオルゼアで虹が出る時刻を予測できます

eorzeaenvというff14ユーザーなら嬉しいライブラリを発見しました
こちらのウェブサイトに、虹が出る時刻を予測できるプログラムがあったので、
時刻を「年、月、日、時、分」を入れて表示できるプログラムにしてみました

https://pypi.org/project/eorzeaenv/

とりあえず光の戦士のみなさまはこれを入れましょう
~~~
pip install eorzeaenv
~~~



~~~python:rainbow.py
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
from EorzeaEnv import EorzeaPlaceName, EorzeaRainbow, EorzeaTime, EorzeaWeather

rainbow_times: list[str] = []
jst = ZoneInfo("Asia/Tokyo")
place = EorzeaPlaceName("東ラノシア") # ()内を変えると別の場所の時刻が出ます
the_rainbow = EorzeaRainbow(place_name=place)

for t in EorzeaTime.weather_period(step='inf'):
    the_rainbow.append(t, EorzeaWeather.forecast(place, t, raw=True))
    if the_rainbow.is_appear:
        # UNIX タイムスタンプを JST に変換してフォーマット
        jst_time = datetime.fromtimestamp(t.get_unix_time(), jst)
        formatted_time = f"{jst_time.year}年{jst_time.month}月{jst_time.day}日 {jst_time.hour}時{jst_time.minute}分"
        rainbow_times.append(formatted_time)
    if len(rainbow_times) == 5: #ここの値を変えると虹が出る日付をたくさん表示したりできます
        break

for time in rainbow_times:
    print(time)  

~~~

出力結果です

~~~
2024年4月23日 19時16分
2024年4月25日 3時56分
2024年4月25日 5時6分
2024年4月25日 7時26分
2024年4月25日 9時46分
~~~
PHPでundefinedになる組み合わせをChatGPTに聞いて表形式でまとめてもらう。

# 経緯
PHPでundefinedになるパターンをいつも頭の中では何となくしか覚えていない状態でした.
そこで今回ChatGPTで表形式にしてもらいました。
※ChatGPT4による回答のためある程度精度が高いとは思いますが間違っている場合もありますので、ご了承ください。

## undefinedになる組み合わせ
| ケースタイプ                     | コード例                                 | 結果                                  |
|-------------------------------|---------------------------------------|-------------------------------------|
| 未定義の変数にアクセス                 | `$value;`                              | Notice: Undefined variable: value   |
| 配列の未定義のキーにアクセス              | `$array = []; echo $array['key'];`    | Notice: Undefined index: key        |
| オブジェクトの未定義のプロパティにアクセス       | `$obj = new stdClass(); echo $obj->prop;` | Notice: Undefined property: stdClass::$prop |
| 関数の未定義の引数を使用                | `function test($a) { echo $b; } test(1);` | Notice: Undefined variable: b       |


## issetでundefinedになる組み合わせ
| ケースタイプ                     | コード例                                  | `isset()` の結果 | 説明                                   |
|-------------------------------|----------------------------------------|----------------|--------------------------------------|
| 未定義の変数をチェック                  | `isset($value);`                         | `false`        | `$value` は定義されていないため、`false` を返す       |
| 配列の未定義のキーをチェック              | `$array = []; isset($array['key']);`     | `false`        | `$array['key']` は存在しないため、`false` を返す    |
| オブジェクトの未定義のプロパティをチェック     | `$obj = new stdClass(); isset($obj->prop);` | `false`        | `$obj->prop` は存在しないため、`false` を返す      |
| NULLを含む変数をチェック               | `$value = NULL; isset($value);`          | `false`        | `$value` はNULLであるため、`false` を返す           |
| 定義されている非NULL変数をチェック         | `$value = 'Hello'; isset($value);`       | `true`         | `$value` は定義されておりNULLでもないため、`true` を返す |

## まとめ
表形式にしてもらい、自分の備忘録として使えそうです。
一人暮らしフルリモートワーカーのメンタルヘルス対策

# 一人暮らしフルリモートワーカーのメンタルヘルス対策
こんにちは、私は18歳で専門学校を卒業後、
ご縁があり ***アプリ開発会社「イーディーエー」*** で
アプリエンジニアとして働いています。
フルリモートの一人暮らしは、人と話す機会が少なくなりがちです。
1日に人とコミュニケーションを取るのはコンビニやスーパーの店員さんだけで、
最近はセルフレジも多くなってきているので、どんどん人と話す機会が減ります。
 
そこで、今回は***個人的に効果的だと感じたメンタルヘルス対策***をいくつか紹介します。

:::note info
イーディーエーとは？
スマホアプリ専門のシステム開発会社です。
初期iPhone 発売当時からスマホアプリ受託制作・開発専門
これまで東京都内をはじめ、全国240 社以上のお客様と共に、
450以上のアプリを制作・開発
:::
## 1. 筋トレ
筋トレは、体の血流が良くなり精神的に安定します。
また仕事面でもメリットがあり、集中力ややる気が向上し、
仕事のパフォーマンスが上がったという調査結果も出ています。

私の場合は週に2〜3回以下のメニューを行っています。
* 腕立て伏せ
* 腹筋  
* スクワット

筋トレが終わった頃には「今日も1日頑張った感」が出ます。
そして、全体的に体の血流が良くなるので健康的な体になります。
ぜひ一度試してみてください!

またフィットネスアプリを利用することで効率的に筋トレをすることできます。

https://apps.apple.com/jp/app/%E8%87%AA%E5%AE%85%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%A2%E3%82%A6%E3%83%88-%E7%AD%8B%E3%83%88%E3%83%AC-%E3%83%95%E3%82%A3%E3%83%83%E3%83%88%E3%83%8D%E3%82%B9%E3%82%A2%E3%83%97%E3%83%AA/id1313192037

## 2. サウナ
サウナに入って体を温めると、筋肉の緊張が解けて血管が緩みます。
その結果、動悸が解消されて不安感やストレスの解消にもつながります!

また、血行がよくなり、筋肉内を循環する血液量が増え、汗と共に疲労物質が
排出されるので、肩こり、腰痛などの神経感覚的症状が改善されます。

サウナに入った後は、水風呂に入り血管を収縮させます。
収縮させることによって、血管を強くしたり免疫が生成される内臓の活発化が促進され、
免疫力が向上するとされています。水風呂から出た後、外気に触れるため、
そこで再び血管が拡張し、血行が促進されるという仕組みです。

一石二鳥どころか、一石三鳥くらいのメリットがあります。ぜひ挑戦してみてください!

↓日本全国のサウナ一覧が載っているサイトです。このサイトで近くにあるサウナや行ってみたいサウナを検索してみてください!

https://sauna-ikitai.com/

## 3. 夜の散歩
朝が苦手な方は朝方に運動をする気になれないですよね。
そこで仕事終わりに軽く運動がてらウォーキングをしてみましょう！

夜の散歩をすることで以下のメリットがあります。
* ウォーキングすることで、その日にあった「嫌な事」を忘れられたり、
毎日することでストレス耐性が身につきます!
* 運動不足解消・睡眠の質向上
運動することで、血行が良くなり溜まったコリが解消されます。
ウォーキングをしてほどよく疲れることで、ぐっすりと質の良い睡眠が取れます。
 
* ダイエット効果
エンジニアの方は座りがちな仕事が多いので、体温が高くなるほど代謝が上がり、
脂肪燃焼効果が期待できます。

## 4. 友達との会話
精神的に不安定だと感じているのであれば、仕事終わりや休日には電話や
直接会って友達と話してみましょう。直接会っての会話は、電話で3時間話すよりも、
15分間の対面での会話の方がより充実感があります。

# まとめ
ジュニアエンジニアは新しい環境に入り、周りは知らない人ばかりで
精神的に不安定になりがちです。私も先輩方とコミュニケーションを積極的に取ったり、
セルフケアを行うことで精神的安定を得ることができました。

「もう無理、仕事をしたくない」と感じていても、休日はリラックスすることで
精神的に安定することができます。
ぜひ今回紹介した対策を試してみてください!

# 告知
最後にお知らせとなりますが、イーディーエーでは一緒に働くエンジニアを
募集しております。詳しくは採用情報ページをご確認ください。

https://eda-inc.jp/recruit/

みなさまからのご応募をお待ちしております。
[jMeter]ListとかJSONとかをvarsに入れるやつ

# IT屋や工作屋って面倒くさがりの究極系
そろばんが電卓になり、手紙がメールやアプリのDMになり、紙での申請がワークフローシステムでスマホからも出来るようになり、色鉛筆や絵の具でのお絵描きもデジタル・CGに置き換わりつつあり。。。

と、手作業でチマチマ行ってきたものがITの発展してきたお陰でササッと出来るようになって、さらに近年はAIも出てくるようになりとうとう人は考えることすら辞めてしまうのかという不安すら感じる今日此の頃、みなさんいかがお過ごしでしょうか。
※AIやGoogle先生に聞けばいいやと言う、何も考えられないバカだらけの世の中は嫌だなぁ。。。

なんでこんなに発展したのか、根本にあるのは作業効率化という建前の __「ちょっとでも楽をしたい」__ という、お気持ちからなんだろうと思ってます。

IT屋なんかは特にその「楽をしたい」と言う気持ちが強いようで、各工程（設計・開発・テスト・リリースなど）の割とありとあらゆる作業を楽に終わらせようというぜということで、自動化ツールが腐る程あるわけですよ。
※ツールを使うまでもないようなものは基本的に即席で自作

# そんなこんなで、タイトルのjMeterってなに？
超ざっくりいうと、
WebサイトやAPIのテスト（主に負荷テスト）を、いちいちブラウザ開いてポチポチしなくても、
ツールがリクエスト送ってくれて戻りの結果とかをいい感じに見せてくれるツールです。
※500人同時アクセスとか、APIの戻り合ってるよね？テストをする時に使うアレ

# まぁここにたどり着いたということは。。。
既にjMeterの知識があるとか、実装に悩んでとりあえず来ちゃったみたいな人が大半だと思うので、とりあえずコードだけ先に。。。

```javascript:JSR223 Listener
// サンプラーの HTTPリクエスト にぶら下げる JSR223 Listener
// リクエストの結果を格納するよってコード（groovyじゃなくてJavascriptで書いてます）

// とりあえず、戻ってきた結果をJSONにパース
var body = JSON.parse(sampleResult.getResponseDataAsString());

// 最終的に保存するList（配列）
var responseList = [];
// bodyの中にlistっていうKeyの配列がある体で、中身のlistをループして変数にPush
for(var i = 0;i < body.list.length; i++){
	responseList.push({
		'appId': body.list[i].appId,
		'appName': body.list[i].appName
	});
}

// varsに入れるよ
vars.putObject('responseList', responseList);
```

通常の __vars.put__ だとStringしか格納できないため、
__vars.putObject(key名, 入れたいもの)__ を使うと良いらしいです。

ちなみに値をゲットするときは __vars.getObject(key名)__ を使う。
Getした値は変換をかけずにそのまま使えるので便利だねぇ。
【ChatGPT＋DALL-E3】落書きから画像生成する。あれから改造。


　どうも、カーブミラーです。

　今回は、落書きから画像生成する方法をブラッシュアップしました。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はあります。　あしからず。
:::

　昨日（2024/04/22）の記事は
　　役立ちましたか？
[【ChatGPT＋DALL-E3】落書きから画像生成する。](https://qiita.com/kabumira/items/b9ced48e76d03c27a6db)

　今回は、続編と言いますか
　　あれからプロンプトを
　　　見直しましてw

　PromptShareできるかな、と
　　思いまして、まとめ直しました。

　下記Promptの変数GENDERは、
　　男女の指定です。
```Text:【落書き→ポーズのリストアップ】
［GENDER: 性別］

Analyze a series of doodle sketches depicting figures of [GENDER] in various poses. Identify and list the key features of each pose, focusing on the position of limbs, direction of weight bearing, any implied movement, and potential actions being depicted. Avoid personal identification and maintain an objective tone. Consider the potential dynamism in each sketch, such as the initiation of a step, gestural communication, or maintained postures. Provide insights into what each stance could suggest about the figure's activity or behavior. Ensure that the interpretations are respectful and considerate of the artist's intent.
```
　和訳すると
>様々なポーズで描かれた[GENDER]の人物の落書きスケッチシリーズを分析します。各ポーズの主要な特徴を特定し、リストアップしてください。これには、四肢の位置、重心の方向、暗示される動き、そして描かれている潜在的な行動に焦点を当ててください。個人の特定は避け、客観的な調子を保ちます。スケッチの中の潜在的なダイナミズムを考慮し、ステップの開始、ジェスチャーによるコミュニケーション、または保持されるポーズなどについて考えてください。各スタンスが人物の活動や振る舞いについて何を示唆しているかについての洞察を提供してください。解釈は尊重と配慮を持って行い、アーティストの意図を考慮してください。

　これで出力された内容を
　　以下のPromptで、描画します。

　ここでは、男性としていますが、
　　みなさんで調整してください。
```Text:描画Prompt
この人物は男性です。服装はジャージの上下。スニーカー。実際の人物に当てはめて、カラーで実写。正方形で描画して。
```

　今回、
　　生成されたのがこちらです。
![1713840004660.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/2ed31a58-1105-8be2-b943-7b446078e9b9.jpeg)

　まぁ、左脚の形が違いますけど
　　そこは指示を与えて、
　　　修正していけば良いかと。

　ごらんのとおり、
　　完璧にポーズを
　　　得られるわけではありません。

　それでも
　　手始めには
　　　なるかと思います。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
PowerShellでCSVファイルをCSVファイルに変換

## PowerShellでCSVファイルを別フォーマットのCSVファイルに加工する方法

PowerShellでCSVファイルを読み込み、中身のデータを加工して別フォーマットのCSVファイルに書き出したいとします。

引継ぎを想定してコードの可読性はできるだけ高くしたいのが前提です。

### 効率の悪い方法

例えば以下のようにコーディングすると非常に効率が悪いです。

CSVファイル全体をいったん変数に読み込んでから1行ずつループを回すためです。

```PowerShell
$sourceFullName = 'C:\temp\SourceFile.csv'
$destFullName = 'C:\temp\DestFile.csv'

"Header1,Header2" | Out-File -FilePath $destFileFullName -Force

$lines = Import-Csv -Path $sourceFullName -Delimiter ','

foreach ($line in $lines) {

    # いろいろとデータを加工...
    $column1 = $line.Property1.SubString(3, 3)
    $column2 = (Get-Date $line.Property2).AddHours(9).ToString('HH:mm:ss')

    # 加工後のデータを改めてコンマで連結して1行ずつファイルに書き出し
    "$column1,$column2" | Out-File -FilePath $destFullName -Append

}
```

### より効率的な方法

当然パイプラインを使う方が効率的です。

ただ、データを加工する部分はどう書けばいいのか、となります。

一つの方法として、以下のようにProcessブロックを使う方法があります。

ForEach-Object内のProcessブロックで加工したデータをPSCustomObjectにする方法です。

```PowerShell
$sourceFullName = 'C:\temp\SourceFile.csv'
$destFullName = 'C:\temp\DestFile.csv'

Import-Csv -Path $sourceFullName -Delimiter ','
| ForEach-Object {
    Process {
        [PSCustomObject]@{
            # いろいろとデータを加工...
            Header1 = $_.Property1.SubString(3, 3)
            Header2 = (Get-Date $_.Property2).AddHours(9).ToString('HH:mm:ss')
        }
    }
}
| Export-Csv -Path $destFullName -NoTypeInformation
```

以上、ほぼ需要はないと思いますが、自分の備忘として書かせていただきました。

※そもそもCSVをCSVに変換するってどんな要件だ、というのはナシでw
PlayMakerで小数の桁数を指定して切り下げ・切り上げ・四捨五入がしたい！

小数の切り捨て・切り上げ・四捨五入に関して、同僚から質問があったのでググってみたんですが、情報が全然見つからないので自分で記事を書いてみました！

# PlayMakerで小数の切り下げ・切り上げ・四捨五入がしたい！

いったん桁を指定するのは忘れて、小数を `切り下げ` や `切り上げ` で整数に変換できないか調べます。

ずばり、 `Convert Float To Int` を使えばできます！

これは `Float` を `Int` に変換するアクションですが、その際に `Rounding` で `切り下げ` `切り上げ` 等を指定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/38d7196d-9bf7-1c7f-ad7a-448557f2df74.png)

`Rounding` の意味は以下の通りです。

| Rounding | 意味 |
|---|---|
| Round Down | 切り下げ |
| Round Up | 切り上げ |
| Nearest | 四捨五入 |


ちなみに、 `Round Down` は小数 `切り捨て` ではなく `切り下げ` なので、ご注意ください。
切り捨てと切り下げはマイナスの値のときに違いがでます。

| 入力値 | 切り捨て | 切り下げ |
|---:|---:|---:|
| 12.3 | 12 | 12 |
| -12.3 | -12 | -13 |


# 小数の桁数を指定して切り下げ・切り上げ・四捨五入がしたい！

いよいよ桁を指定する方法を紹介します！

`Convert Float To Int` アクションを応用すれば、小数の桁数を指定できます！

たとえば、小数第三位まで残し、第四位以降は切り下げしたい場合、以下の図のようにアクションを組み立てればよいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/9ff5d31b-f962-629f-4402-693e46d485ed.png)

`12.34567` という入力を `12.345` に変換できました！

上記の処理をC#風に表現するとこんな感じです。

```cs
// 入力
float inputFloat = 12.34567;
int decimalScale = 1000;

// 1000倍にする
float scaledFloat = inputFloat * decimalScale;

// int型に変換する。その際に小数を切り下げる。
int roundedInt = (int)scaledFloat;

// 1000分の1倍にする
float outputFloat = (float)roundedInt / decimalScale;
```

桁数は `DecimalScale` で指定しています。以下のように10のべき乗で指定します。

| `DecimalScale` | 桁数 |
|---|---|
| 10 | 1 |
| 100 | 2 |
| 1000 | 3 |
| 10000 | 4 |
| ... | ... |

0の数がそのまま桁数になるイメージです。

`Convert Float To Int` アクションの `Rounding` をいじれば、 `切り上げ` や `四捨五入` にも対応できます！


# さいごに

本記事作成にあたり、以下のページを参考にしました！ありがとうございました！

- https://hutonggames.fogbugz.com/default.asp?W359
- https://hutonggames.com/playmakerforum/index.php?topic=8953.0
Windows TerminalでのAzure CloudShellの設定方法

# はじめに
私は普段AWSを扱うことが多いのですが、たまたまAzureを触る機会が来そうなので、前々から気になっていたWindows TerminalでAzure CloudShellを設定してみたので、備忘として残しておきます。

# 環境
- Windows 10 バージョン 22H2(OSビルド 19045.4291)

# 実施内容
Windows Terminalを起動して、上部の「∨」をクリックして「Azure Cloud Shell」を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/9acc5fe5-7928-28c2-671d-9657d808ab4e.png)

そうすると「 https://microsoft.com/devicelogin 」というURLと「H2FYAZLFT」というコードがコンソール上に表示されます。　※執筆時点では既にコードの有効期限は切れてます
この情報を利用してMicrosoftアカウントへのサインインを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/95d28fd4-9e19-612a-0727-5a33172e8b88.png)

## Microsoftアカウントサインイン
Microsoftアカウントサインインが可能なブラウザを開き、先ほど確認したURLをブラウザバーに入力するとコードを入力する画面が表示されます。
同じく先ほど確認したコードを入力して「次へ」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/3a04e20d-17eb-a658-a303-f1205c0e1351.png)

以降は通常のMicrosoftアカウントへのサインインと同じ画面が表示されるので、画面の表示に従ってログイン処理を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/a0fefa36-4eca-8d11-5d3d-bd9c7482eecb.png)

サインイン処理後、「Windows Terminalにサインインしますか？」と聞かれるので、「続行」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/d67e48e8-4163-54c1-950e-b1ef96f53a9d.png)

問題なければ以下のような画面が表示されます。次はWindows Terminalの方に戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/bcd08abf-aa81-d4e7-a741-6a5504a23af2.png)

## Windows Terminal操作
ブラウザでサインインできると、Windows Terminalで対象のテナントを選択するメッセージが出力されます。
Microsoftアカウントが複数のテナントに紐づけられている場合は、Azure CloudShellで操作したいAzureリソースが含まれるテナントを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/3df210a4-2b73-12ae-6c40-e7046c79d132.png)

その後接続設定を保存するか聞かれるので、「y」を入力して少し待つとAzure CloudShellが利用できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/e0bee1e5-3ded-43a7-6995-ebab70e25ecc.png)

適当なAzure CLIコマンドを実行するとリソース情報が取得できることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/9073a854-2461-8261-d9a3-0515cb58174b.png)

# 追記
色々と操作していたら以下のエラーが急に出たんですが、

> Failed to connect to MSI. Please make sure MSI is configured correctly.
> Get Token request returned: <Response [400]>

調べてみたら以下の記事がヒットして、20分ぐらいでセッションが切れることを知りました。
流石に短い...

> 20分ぐらい？で自動的に切れることを知らなかった際に困っていた話
https://qiita.com/baku2san/items/2d3f351ca5253d11c7da

# おわりに
AWS CLIであればよく設定していましたが、Azure CLIの設定方法は知らなかったので、調べながらやってみました。
ブラウザでの認証が必要とはいえWindows Terminalに標準で利用できるようになっているのは流石Microsoft製品だと思いました。
連続で push した際、アクションが重複しないように前のアクションを停止させて CI コスト削減

自身のリポジトリは全て public なのでどれだけ動かそうとも GitHub Actions に課金は発生しません **（※microsoft さんいつもありがとうございます）** が、仕事では GitHub Teams の無料枠3000分（50時間）を超えて 100 ドルくらいの課金が発生しているため少しでも CI コストを下げたいと思い調べてみた

# 参考

https://github.com/styfle/cancel-workflow-action

# workflows 

これだけでいけるっぽい。すげー簡単…



```yaml
name: Develop Build Workflow

on: 
  push:
    branches:
        develop

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Stop Previous Action
        uses: styfle/cancel-workflow-action@0.12.1
        with:
          access_token: ${{ github.token }}
```

正直、連続で push するというのはあまり無いので、さほどコスト減には繋がらないと思いますが月2ドルでも下がってくれれば1年くらいで作業コストの元は取れそう。

:::note alert
または定時後に作業すれば**作業コストゼロなので翌月からコスト削減！**
（※所属する会社によって異なります）
:::
pyinstallerでのpython-pptxのPackage not found at ..\pptx\templates\default.pptxへの対処

Windows版のデスクトップアプリを作成しているときに以下のエラーに出会いました。
`Package not found at 'C:\Users\ユーザ名\AppData\Local\Temp\_MEI215442\pptx\templates\default.pptx'`

python-pptxのdefault.pptxが一時フォルダにないというエラーです。
実際に確認してみると、使っている他のライブラリは`C:\Users\ユーザ名\AppData\Local\Temp\_MEI215442`以下に存在するのに、pptxだけありませんでした。

# 解決方法
pyinstallerコマンドを実行したときに生成される.specファイルに以下を記述することで解決しました。
自分はpyenvを使っているので以下のようなパスになっていますが、適宜書き換えてください。
```python
p=r"C:\Users\ユーザ名\.pyenv\pyenv-win\versions\3.9.13\Lib\site-packages\pptx\templates\default.pptx"

a = Analysis(
    ['app.py'],
    pathex=[],
    binaries=[],
    datas=[ (p, '.\\pptx\\templates\\') ],
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    noarchive=True,
)
```

その後、specファイルを指定して実行します。
```
pyinstaller App.spec
```

以上で完了です。
順番実行とJavaScript（jQuery）のコールバック地獄

⭕⭕が終わったら…、❌❌が終わったら…、を入れ子の中に入れていくとインデントが深くなってしまい見づらくなり、保守が困難になってきます。

そんなとき、ワタシはこんな感じで書くようにしています。

```js
	$.when(function(){
        $(".loading_modal").toggle(true);
		//dfd.resolve(); // 成功（続行）
		//dfd.reject(); // 失敗（中断）
		return;
	})
	.then(function(){
        var dfd = new $.Deferred;
        var ret = 処理A();
        if (ret) {
            dfd.resolve();
        } else {
            dfd.reject();
        }
		return dfd.promise();
	})
	.then(function(){
        var dfd = new $.Deferred;
        var ret = 処理B();
        if (ret) {
            dfd.resolve();
        } else {
            dfd.reject();
        }
		return dfd.promise();
	})
	.then(function(){
        var dfd = new $.Deferred;
        var ret = 処理C();
        if (ret) {
            dfd.resolve();
        } else {
            dfd.reject();
        }
		return dfd.promise();
	})
	.always(function(){
        // ファイナル処理
		$(".loading_modal").toggle(false);
	})
	;
 ```

参考としたURL
JavaScriptとコールバック地獄
https://techblog.yahoo.co.jp/programming/js_callback/
JMP 18 ドキュメンテーションライブラリのインストール方法

#### ※今回の内容はYouTube動画でもご紹介しています。
<iframe width="560" height="315" src="https://www.youtube.com/embed/L5uPVIZ1RLg?si=GthlxawNmio_FAYl" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
この記事では、JMPの最新バージョン「JMP 18」で、ヘルプの役割を果たすドキュメンテーションをPDF形式で表示する方法をご紹介します。

#### 1. 以前のバージョンのJMP でのドキュメンテーション表示方法
JMPのドキュメンテーションは、操作方法が分からないときの資料として多くの方に利用されています。以前のバージョンのJMP 17では、あらかじめインストーラに含まれていたために、以下のような手順で表示できました。

1)JMPを起動後、上の「ヘルプ」から「JMPドキュメンテーションライブラリ」を選択。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/1527a14d-1ddf-ed7c-2c02-0c0728ab746a.jpeg" width=75%>

2)PDF版のドキュメンテーションが表示される。
![画像2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/fab6676b-1f33-43e4-291e-4e81be6dad22.jpeg)

#### 2. 最新版JMP 18のドキュメンテーション表示方法
一方、JMP 18ではドキュメンテーションはインストーラには含まれません（それにより、インストーラのファイルサイズをより小さくし、内容を適時アップデートできるようになりました）。

そのため、JMPユーザーコミュニティ等でアドインとしてダウンロードし、インストールする必要があります。今回はその方法をご紹介します。

1)JMPユーザーコミュニティの[**「日本語ドキュメントアドイン」**](https://community.jmp.com/t5/JMP-Add-Ins/Japanese-Documentation-Add-In/ta-p/722353)のページを開く。
![画像3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/2ed92be0-b2fe-3030-13bb-5ff5a8f3c89f.jpeg)

2)画面右の「Attachments」の「JMP 18.0 Documentation PDF Files in Japanese.jmpaddin」をクリックしてアドインをダウンロード。
![画像4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/6d7a21a8-eaf3-63a6-b654-ffc1a16965a1.jpeg)

3)ダウンロードしたファイルを開くと下の表示が出るので「インストール」を選択。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/3d82f0c7-63d3-e531-5bdb-af25b56e9e14.jpeg" width=60%>

4)インストール後には、「ヘルプ」に「ドキュメンテーション（PDF）」が追加されています。ここから「はじめてのJMP」を選択すると、JMP 18に対応したPDF版の資料が表示されます。

**（アドインのインストール前）**
![画像6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/907610da-ada8-b25d-7f68-94e36124a1ce.jpeg)

**（アドインのインストール後）**
![画像7_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/46282d7e-34ec-5350-56cf-fe2b5186328c.jpeg)
![画像8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/8e1426df-c54d-1406-5cc6-c14c0d6383e1.jpeg)

**<font color="orange">※	「はじめてのJMP」以外のマニュアルは現時点では英語でのご提供となりますが、今後のマイナーアップデートで日本語化される予定です。</font>**

#### 3. JMP 18で、より深く豊かな分析の旅へ！
最新バージョンのJMP 18でドキュメンテーションを表示させる方法は以上になります。豊富な新機能をぜひお試しください！

<br>


**JMP 18の新機能**
https://www.jmp.com/ja_jp/software/new-release/new-in-jmp.html
【WordPress】wp_enqueue_scriptにtype=moduleやasyncを追加する方法

# はじめに

wp_enqueue_scriptを使うと、scriptタグの書式が固定されてしまいます。
type=module/async/deferなどを追加する方法を解説します。

# 解決方法

下記をfunctions.phpに追記しましょう。
下記の例だと、hogeとpiyoのみmoduleで読み込むことができます。
スクリプトタグの修正箇所にasyncなどの文字列を追加して、別のパラメーターを付与することもできます。

```functions.php

// スクリプト読み込み
wp_enqueue_script('hoge', __DIR__ . 'js/hoge.js', [], '1.0.0', true);
wp_enqueue_script('fuga', __DIR__ . 'js/fuga.js', [], '1.0.0', true);
wp_enqueue_script('piyo', __DIR__ . 'js/piyo.js', [], '1.0.0', true);

function add_type_attribute($tag, $handle, $src)
{
    $target_handler = ['hoge', 'piyo'];
    if (!in_array($handle, $target_handler)) return $tag;
    
    $tag = '<script type="module" src="' . esc_url($src) . '"></script>';
    return $tag;
}
add_filter('script_loader_tag', 'add_type_attribute', 10, 3);

```

# 実際の使用事例

実際にはプラグイン上で使用しました。

```plugin.php

function store_list_callback($atts)
{
    wp_enqueue_script(
        'store_list_js',
        plugin_dir_url(__FILE__) . 'js/common/main.js',
        [],
        '1.0.0',
        true
    );
    
    // ～その他の処理～

}
add_shortcode('store_list', 'store_list_callback');

function add_type_attribute($tag, $handle, $src)
{
    $target_handler = ['store_list_js'];
    if (!in_array($handle, $target_handler)) return $tag;
    
    $tag = '<script type="module" src="' . esc_url($src) . '"></script>';
    return $tag;
}
add_filter('script_loader_tag', 'add_type_attribute', 10, 3);

```

ショートコードを展開するためのプラグインで、ショートコードに対してスクリプトを読み込みたいと思いました。
ショートコードを使う記事内でスクリプトを毎回読み込むのが手間なので。

こうすることで、別メディアに対して同じ機能を実装したい場合、プラグインの載せ替えだけで対応できるようになりました。

# 参考

https://stackoverflow.com/questions/58931144/enqueue-javascript-with-type-module
JSのMapオブジェクトを使用してみる

## 今回のゴール

`Map`オブジェクトを用いてユーザーの情報を表示制御する。

## 実際のコード

```tsx
import React from 'react';

// ユーザーの型定義
type User = {
  id: string;
  name: string;
};

// ユーザーデータ
const users: Map<string, User> = new Map([
  ['1', { id: '1', name: 'User One' }],
  ['2', { id: '2', name: 'User Two' }],
]);

const UserList = () => (
  <div className="p-4">
    {Array.from(users.values()).map((user) => (
      <div key={user.id} className="bg-blue-500 text-white p-2 m-2 rounded">
        {user.name}
      </div>
    ))}
  </div>
);

export default UserList;
```

上記の`Array.from(users.values())`の部分でMapオブジェクトのイテレータを取得して配列にしています。あとは`map`メソッドで展開するだけです。

このオブジェクトの性質としてキーの型に`string`以外にも指定できます。自身で設定した値を`Map`オブジェクトをJSON化したい場合、一度オブジェクトにする必要があります。

## 参考記事

https://typescriptbook.jp/reference/builtin-api/map
Javaを基本からまとめてみた【Servlet ・JSP・Bean・MVCモデル】

## 1. Webアプリケーション

##### インターネットの仕組み

- インターネットでwebページを見る時は、2つのコンピュータ(端末)が関連して動く 

💻(①webブラウザ)　→（②リクエスト）← (③レスポンス)　←（④webサーバ）

①webブラウザ：Webページを表示できるソフトウエア

②リクエスト：Webページの情報をサーバに要求すること

※ リクエスト：https://google.com/index.html 送信元IPアドレス、ブラウザ情報、画面入力への入力情報など

※ IP(Internet Protocol)アドレス：PCやスマホ、ネットワーク機器などに割り当てられるインターネット上のアドレス番号

③レスポンス：リクエストに対してサーバが情報を返すこと

④webサーバ：Webページの情報を提供するソフトウエア

※ サーバ(Server)：サービスを提供するPCやプログラムのこと ⇨ Webサーバ、mailサーバ、ファイルサーバetc

##### web環境で動くプログラムをwebアプリケーションといい、サーバーサイド(バッグエンド)とクライアントサイド(フロントエンド)に分かれる

## 2. Apache Tomcat

(1) tomcatとは？

- Apache Tomcat(正式名称)
- ① Webサーバと② Webコンテナの機能を持つJava製の無料のソフトウエア

①Webサーバ：webブラウザからのリクエストに応じてwebページの情報を提供するソフトウエア(PC)
②Webコンテナ：サーブレットとJSPの実行環境

- 無料で使えるWebサーバ ⇨ 自分のPCでWebアプリを実行できる

(2) webアプリケーションのフォルダ構成

```
webapps - ①コンテキストルート
            ├── HTML・JSP・画像など
            └── WEB-INF
                ├── class - class
                ├── web.xml
```
①コンテキストルート：webアプリケーション最上位のフォルダ。木構造(root)にあたるためルートと呼ばれる。


## 参考サイト
[【有料級】初心者向けにサーブレット/JSP/Bean/MVCモデルを全解説【サーバサイドJava入門講座 総集編】](https://www.youtube.com/watch?v=gvcCEFlA-50&list=WL&index=12&t=2459s)
Google Apps Script(GAS)でウェブページの更新を検知する

# この記事の内容で何ができるのか
- ウェブページのソースコードに差分があったら検知できる
- 定期的にチェックを実行できる(最高頻度で毎時)

# 何ができないのか
- スクリプトからのアクセス拒否しているページには使えない
- どのような差分かは分からない
- 即時の検知はできない

# はじめに
RSSフィードの無いウェブページの更新を検知する必要があったのでGoogle Apps Script(GAS)でスクリプトを作成しました。
同じようなニーズを持つ方の参考になれば幸いです。

# スクリプト
## 前提
スプレッドシートをデータ保管に使いたいので、
新規のスプレッドシートから「拡張機能」→「App Script」の順でスクリプト作成を開始する。
(スプレッドシートとの連携が楽なので)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274706/81a5b0e1-933c-56eb-b4b0-8303ce0d997f.png)

## コード
スプレッドシートのA1のアドレスを、チェック用のハッシュ保管エリアとして使います。
``` JavaScript
function myFunction() {
  const CHECK_URL = "https://~~~"; // チェックしたいURL
  const sheet = SpreadsheetApp.getActiveSheet();

  let oldHash = sheet.getRange('A1').getValue();  
  
  let response = UrlFetchApp.fetch(CHECK_URL);
  let text = response.getContentText();
 
  let hashBin = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_512, text);    
  let hash = Utilities.base64Encode(hashBin);
  
  if (hash === oldHash) { // ハッシュ値に変化がなければ変更なし
    return; 
  }
  
  sheet.getRange('A1').setValue(hash);  // ハッシュ値を更新

  /* 通知を送信したり、外部のAPIを実行したり、
   * 変更があったときに行いたいことを記述
   */

  return;
}
```

## 定期実行
デバッグ実行して問題が無さそうであれば、トリガーのメニューから「トリガーを追加」を選び、
必要な頻度での実行を指定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274706/7f3fa66a-abca-4b52-e4b8-47242e632b59.png)

## カスタマイズ例
先のコードはコア機能のみなので、必要に応じて機能を足してください。
例えば以下のカスタマイズコードは、下記の要件を満たすよう改造した場合です。
- 複数のURLを対象にする
- スプレッドシートでURLを管理する
- 通知用にタイトルの項目を追加する

スプレッドシートのA列をタイトル、B列をURL、そしてC列をチェック用のハッシュ保管エリアとして使います。

``` JavaScript
function myFunction() {
  const COLUMN_TITLE = 0;
  const COLUMN_URL = 1;
  const COLUMN_HASH = 2;

  const sheet = SpreadsheetApp.getActiveSheet();
  const allData = sheet.getDataRange();  
  const rows = allData.getValues();  

  let results = [];

  rows.forEach(function(row, i) {
    let title = row[COLUMN_TITLE];
    let url = row[COLUMN_URL];
    let oldHash = row[COLUMN_HASH];

    let response = UrlFetchApp.fetch(url);
    let text = response.getContentText();
    let hashBin = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_512, text);    
    let hash = Utilities.base64Encode(hashBin);
    if (hash === oldHash) { 
      return; 
    }
    results.push([title, url]);    
    sheet.getRange(i + 1 , COLUMN_HASH + 1).setValue(hash);  
  });

  if (results.length === 0) {    
    // 更新がなかったときの処理
    return;  
  }  

  // 更新があったときの処理
  
  return;
}
```

# おわりに
GASからのfetchがタイムアウトになってしまうページについては無力で、他のサーバサイド言語などで対応する必要があります。
ただ、お手軽にサクッと更新チェックを定期実行するのであれば、魅力的な選択肢だと思います。
スプレッドシートで改ページをカスタムして出力する

# はじめに
## ひとこと
アクセスしていただきありがとうございます。
Googleスプレッドシートでは改ページを調整する方法がExcelと大きく異なるため、そちらを解説した記事となります。

## 対象の読者
* **Googleスプレッドシート** で **改ページをカスタム** して **印刷** もしくは **PDFに出力** したい方

## 対象の環境
* **Windows11**

## 推奨の環境
* **Google Chrome** の最新版(Googleのサービスが使いやすいため)

# 1. 改ページをカスタムして出力する
1. メニューバーの **ファイル** を選択します
2. 一番下の **印刷** を選択します
(新しい画面が開きます)
![スクリーンショット (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969427/16a90874-6637-bc7c-5786-13eaff1fbc87.png)
3. 右側の **カスタムの改ページを設定** を選択します
(新しい画面が開きます)
![スクリーンショット (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969427/4e9a8b5c-4c9d-a8dd-cb4c-f4b81c219cbb.png)
4. **青色の破線** をドラッグ＆ドロップすることで改ページの位置を調整します
(調整できたら、次に進んでください)
5. **改ページを確定** を選択します
(画面が閉じます)
![スクリーンショット (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969427/bfccf897-cdb5-1b88-1df3-2c606eba3bf5.png)
6. **送信先** を任意のものに切り替えます
ここではPDFに保存するとして **PDFに保存** を選択します
7. 右下の **保存** を選択します
(画面が閉じます)
![スクリーンショット (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969427/67c061ad-5aa2-9474-e4c6-1fc07d1500b9.png)

# さいごに
## ひとこと
最後までご覧いただきありがとうございます。ご意見などがございましたら。遠慮なくコメントいただけると幸いです。
Salesforce フローの選択オプションの改善(動的に選択肢をつくる)3


使う変数を整理してみます。

画面フローで独自の選択肢をセットします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/889d03a4-c8e7-cd72-84f9-afa8bdad1fc7.png)

**choiceTableM(Collection Choice Set)**

Choice LabelとChoice Valueを設定します。これが画面で選択肢として使われます。
今回はラベルと値が同じ設定でいいので、どちらにも同じ項目をセットしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/dcb5ed57-9a74-1842-fbac-1ebdf99c31ed.png)

**TableMcollection(Object Variable)**

この変数はオブジェクトの変数として定義します。しかしオブジェクトはダミーなので何を選んでも関係ない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8e2e939f-2f0a-324f-fddd-71f331e841db.png)


上記オブジェクト変数にループの中で追加していきます。

この例では最終的にコレクションを並び替えたいので２つ目の項目を使っていますが、並び替えなければ、１つ(Name)だけでも大丈夫です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f49c9116-0a5e-9b04-1390-eb587ad8d4d1.png)

# 解答例

+ [i want use a picklist value set in a collection variable of a flow ? how to do it](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ajV3aSAE)

+ [displaying collection variable from a loop as individual options in a picklist](
https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T483RSAR)
MySQLダンプをシェルで取得する方法

# はじめに

私は1年以上稼働しているシステムを運用しているエンジニアです。
データベース(以下DB)のバックアップをとりたい！でも手順が多くてめんどくさい！ということありますよね。
そこで今回はDBダンプを取得するシェルを作成したので紹介します。

# こんな人に読んでほしい

- システムを運用している
- データベースのバックアップをとりたい
- MySQLを使っている
- シェルを使いたい

# 目次

- なぜシェルを作るのか
- なぜダンプなのか
- シェル概要
- 前提条件
- シェル使用方法
- まとめ

# なぜシェルを作るのか

システムの運用をしていると「その時々の本番環境と同様の環境を用意したい」「何かDBに変更を加える前にバックアップを取りたい」などが発生します。
いくら手順化していても「手動操作によるミス」「順番を飛ばす」などのリスクがあります。
そこで「誰でも」「簡単に」「誤りなく」DBバックアップを取る方法のひとつとしてシェルを作成しました。

# なぜダンプなのか

DBのバックアップを取る方法はいくつかありますが、今回ダンプにした理由についてスナップショットとの違いをもとに記載します。

|バックアップ手法|メリット|デメリット|
|-|-|-|
|ダンプ(フルバックアップ)|元データが消失しても復元可能|取得時間が長い|
|スナップショット(差分バックアップ)|取得時間が短い|元データが消失すると復元不可能|

上記に挙げた以外にも違いはありますが、私がバックアップを取得する際には「すべてのデータに影響をきたす可能性がある作業」をしなければならないためダンプを取っています。
細かい違いや他のバックアップ手法については皆さんで調べてみてください。

# シェル概要

このシェルでは大きく2つの処理を実行しています。
- DBダンプファイルの取得
- ダンプファイルの圧縮

# 前提条件

このシェルを使用するにあたって、以下環境を用意する必要があります。

- OS：Linux
- DBMS：MySQL
- ツール：gzip

# シェル使用方法

シェルを叩く前に、以下手順を実行してください。

1. ファイル内の`{}`をみなさんの環境に合わせて変更
1. 変更後のファイルを任意のディレクトリに配置
1. ファイルへ実行権限の付与

```
chmod +x mysql_db_dump.sh
```

上記手順が完了したら、あとは以下コマンドを実行してください。

```
bash mysql_db_dump.sh
```

```mysql_db_dump.sh
#!/usr/bin/bash

# Mysqlデータベースのダンプファイル取得＆圧縮をするスクリプト
#
# 【使い方】
# (1) 権限付与
# chmod +x mysql_db_dump.sh
# (2) スクリプト実行
# bash mysql_db_dump.sh
# (3) ダンプファイル名入力
# 20240101_dump.sql
# (4) パスワード入力
# XXXXXXXX
# (5) 作成完了


# mysqlのインストール有無判定
if ! command -v mysql &> /dev/null; then
  echo "mysql がインストールされていません。"
  exit
fi

# gzipのインストール有無判定
if ! command -v gzip &> /dev/null; then
  echo "gzip がインストールされていません。"
  exit
fi

# ダンプファイル名入力
while true; do
  read -p "ファイル名を入力してください（例 20240101_dump.sql）: " filename

  if [[ $filename == *".sql" ]]; then
    break
  else
    # 末尾に.sqlがない場合、再度ファイル名入力
    echo "末尾に .sql が含まれていません。再度ファイル名を入力してください。"
  fi
done

# ダンプファイル作成
echo "パスワードを入力してください。"
mysqldump --set-gtid-purged=OFF -h {ホスト名} -u {ユーザー名} --port {ポート番号} -p {データベース名} > "${filename}.gz"

# ダンプファイル作成処理の終了ステータス判定
if [ $? -eq 0 ]; then
  echo "mysqldumpが成功しました。"
  # ダンプファイル圧縮
  gzip "$filename"
  echo "ファイルの圧縮に成功しました。"
else
  # 不要に作成されるファイルの削除
  rm "$filename"
  echo "mysqldumpが失敗しました。パスワードに誤りがないか確認してください。"
fi
```

今回は各コマンドの詳細については省略します。
mysqldumpコマンドのオプションについては[MySQL 8.0 リファレンスマニュアル](https://dev.mysql.com/doc/refman/8.0/ja/mysqldump.html)を参考になさってください。

# まとめ

今回はDBへ影響を与える作業へのリスクを軽減するためにシェルを作りました。

本番環境と検証環境で取得するDBを分岐する、取得後のファイルをどこかへ送信するなど、みなさんのお好きなようにカスタマイズして何かしらに活用いただければ幸いです。
ここまで読んでくださりありがとうございました！
JetBrains チートシート

## 検索

| ショートカット | アクション |
| :--- | :--- |
| `command + shift + o` | ファイル名検索 |
| `command + shift + f` | 全ファイルから単語検索 |
| `command + f` | ファイルから単語検索 |

## 矩形選択

| ショートカット | アクション |
| :--- | :--- |
| `option + shift + 矢印（←→）` | 矩形選択（横方向） |
| `option + option + 矢印（↑↓）` | 矩形選択（縦方向）|


## カーソル移動

| ショートカット | アクション |
| :--- | :--- |
| `option + 矢印（←→）` | 1単語先に移動 |
| `command + g` | 矩形選択されている単語と同じ単語に移動 |
| `ctrl + g` | 矩形選択している単語と同じ単語を選択 |
| `ctrl + command + g` | 矩形選択している単語と同じ単語を全て選択 |

## 行入れ替え

| ショートカット | アクション |
| :--- | :--- |
| `option + shift + 矢印（↑↓）` | 行入れ替え |

## 単語置換

| ショートカット | アクション |
| :--- | :--- |
| `command + r` | ファイルの単語置換 |
| `command + shift + r` | 全ファイルの単語置換 |

## ジャンプ
| ショートカット | アクション |
| :--- | :--- |
| `command + b` | カーソルの当たっているメソッドにジャンプ |
| `command + option + 矢印（←→)` | 直前に参照していた箇所にジャンプ |

## コピー＆ペースト
| ショートカット | アクション |
| :--- | :--- |
| `command + d` | 行を下にコピー |
picoCTF 2021 writeup information

## information (Forensics)

Files can always be changed in a secret way. Can you find the flag? cat.jpg

添付ファイル
・cat.jpg

とりあえずテキストエディタで開く
```
 <rdf:Description rdf:about=''
  xmlns:cc='http://creativecommons.org/ns#'>
  <cc:license rdf:resource='cGljb0NURnt0aGVfbTN0YWRhdGFfMXNfbW9kaWZpZWR9'/>
 </rdf:Description>
```

licenseのところが気になるので、base64デコードしてみる、とフラグが得られた。

`picoCTF{the_m3tadata_1s_modified}`

ちなみに、画像ファイル等のメタデータの読み取りなどをするのに、ExifToolが使えそう。
Bevyのsystemは16を超える引数はとれない

## 結論: タプルあるいはSystemParamを使えば解決

https://github.com/bevyengine/bevy/blob/main/examples/ecs/system_param.rs

（追記）：以下に「16を超える引数はとれないよ」って書いてあって、対応策もちゃんと書いてあった。ただ実装上の関係か、タプルを使うと各16パラメータまでとのこと。（16 x 16 = 256なので、`SystemParam`を使わなくてもこれだけあれば十分。)

[https://bevy-cheatbook.github.io/programming/systems.html](https://bevy-cheatbook.github.io/programming/systems.html)

## 背景： systemに17以上の引数を与えると、意味不明なエラーが出る。

systemに互換のない引数を定義するとエラーが出る（詳細は下記）のだけれど、引数が16を超えると、互換があるはずなのに同様のエラーが出て、にっちもさっちもいかなくなる。特徴は、`'a, 'b, 'c, 'd, 'e, ...` が妙に多いことくらいで、実はこの数は16にはならないのでさらに解明を難しくする。

[https://bevy-cheatbook.github.io/pitfalls/into-system.html](https://bevy-cheatbook.github.io/pitfalls/into-system.html)

トレイトの定義も複雑なので、やっとのことで該当行にたどり着いた。

https://github.com/bevyengine/bevy/blob/fcd87b25281e7d1f6e857fb8096eea1ddfefb98c/crates/bevy_ecs/src/system/function_system.rs#L701

確かに `16` という数字がコード中にあり、これ以上の引数はとれないので `SystemParam` を使ってねという趣旨のメモが残されている。

```rust
// Note that we rely on the highest impl to be <= the highest order of the tuple impls
// of `SystemParam` created.
all_tuples!(impl_system_function, 0, 16, F);
```

Rustのタプル自体は数の上限はないはずなので、何かしら別の実装上の要因があってのことと思われるが、詳細は未調査。

もしかしたら今後改善されるかもしれないけれど、たぶん望み薄なので、引数が多いときは素直にタプルか `SystemParam` を使ったほうがよさそう。
Pythonのリスト内法表記内でのfor, ifの使用方法と、any, allとの組み合わせについて整理

# 背景
リスト内法表記 + any, all関数の使い方について整理する。

# リストから、特定の条件にマッチする要素を取得する
例：リストから奇数の要素を取得する
``` python
>>> a = [1,2,3,4,5]
>>> [x for x in a if x % 2 == 1]
[1, 3, 5]
```
# リスト全体に対して、特定の条件にマッチするかを判定する
例：リスト内に奇数の要素が存在するかを判定する
``` python
>>> any([x % 2 == 1 for x in a])
True
>>>
```
例：リスト内の全要素が奇数かを判定する
``` python
>>> all([x % 2 == 1 for x in a])
False
```

# 余談
## 記事を書いた背景
リスト内の全要素が奇数かを判定する。を実装する際に以下のようにしたら想定と動作が違った。
``` python
>>> all([x for x in a if x % 2 == 1])
True
```
forの右側でif判定する際には、判定結果に合致する要素を取得する。
``` python
>>> [x for x in a if x % 2 == 1]
[1, 3, 5]
```
forの左側で判定する際には、各要素が条件に合致するかをboolで返す。
``` python
>>> [x % 2 == 1 for x in a]
[True, False, True, False, True]
>>>
```
any()やall()に渡す場合は後者にしないと結果がおかしくなる。

# any()、all()の挙動について
公式ドキュメントより（ https://docs.python.org/ja/3/library/functions.html#all ）、
all()は以下の実装になっている。
``` python
def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True
```
なので、 `all([]) == True` になる。
``` python
>>> all([])
True
```
これは直観と異なるので注意が必要（個人の感想です）。
ちなみにanyは以下。
``` python
def any(iterable):
    for element in iterable:
        if element:
            return True
    return False
```
これはわかる。