OmniAICreator/Qiita-1.07M huggingface dataset:
shifter-static-local の使い方

Shifter をローカルで使う　shifter-static-local の使い方です。

## Docker が動いていることを確認

```text
$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
     Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; preset: >
     Active: active (running) since Thu 2023-06-15 13:08:09 JST; 1h 41min ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 1310 (dockerd)
      Tasks: 35
     Memory: 149.8M
        CPU: 2.880s
```

## 使ったバージョン

```text
$ docker --version
Docker version 24.0.2, build cb74dfcd85

$ docker-compose --version
Docker Compose version 2.18.1
```


## ダウンロードと実行

```bash
git clone https://github.com/digitalcube/shifter-static-local.git my-shifter-site
```

```bash
cd my-shifter-site
docker-compose up
```

## ブラウザーでアクセス

https://127.0.0.1:8443/

次のエラーが表示されます。

```text
Warning: mysqli_real_connect(): (HY000/1130): Host '172.18.0.3' is not allowed
 to connect to this MySQL server in /var/www/html/web/wp/wp-includes/class-wpdb.php
 on line 2019
```

![local01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/c608a7fa-f9fc-9880-4d25-1a4e2dc5ba7f.png)


## 対策

MySQL に　
wordpress というデータベースを作成
'shifter'@'172.18.0.3' というユーザーを作成、パスワードは 'pass'
'shifter'@'172.18.0.3'　に wordpress へのアクセス権を与える

## データベースの作成

```text
$ docker exec -it shifter-static-local-mysql-1 bash
bash-4.2# mysql -uroot
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 273
Server version: 5.7.42 MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

```sql
create database wordpress;
create user 'shifter'@'172.18.0.3' identified by 'pass';
grant all on wordpress.* to 'shifter'@'172.18.0.3';
```

確認

```text
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| wordpress          |
+--------------------+
5 rows in set (0.00 sec)

mysql> select user,host from mysql.user;
+---------------+------------+
| user          | host       |
+---------------+------------+
| shifter       | 172.18.0.3 |
| mysql.session | localhost  |
| mysql.sys     | localhost  |
| root          | localhost  |
+---------------+------------+
4 rows in set (0.00 sec)

mysql>
```

## ブラウザーでワードプレスを使う

https://127.0.0.1:8443/

![local02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/73bd59e5-da82-0105-5cc3-33000cb5b324.png)
備忘録：Office 365 メールサービスを SMTP サーバーとして Yellowfin から利用

Office 365 を利用している環境で、Yellowfin メール配信を利用する場合の設定内容を、備忘録も兼ねて記録します。

[管理] > [システム構成] > [電子メール] > [送信メールサーバー] から SMTP サーバーに関する設定を行います。
|設定項目|設定内容|
|---|---|
|SMTP サーバー|smtp.office365.com|
|SMTP ポート|587|
|SMTP 認証|有効|
|ユーザー名|(Office 365 アカウント) <foo>extremecarv</foo>@example.net|
|パスワード|(アカウントのパスワード) *******|
|パスワードの確認|(同上) |
|電子メールサイズの上限|(任意の数値を MB で) 10|
|暗号化|STARTTLS|
|テスト電子メールアドレス|(テストメール送信先) <foo>extremecarv</foo>@example.net|

設定画面の例がこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/28b6e957-de69-e915-60e3-68a9e39ff1c0.png)

なお、上記 SMTP 認証で使用するアカウントと、メール送信者は同じアカウントを設定する必要があります。
[管理] > [システム構成] > [電子メール] > [一般設定] の以下 2 か所が該当します。
 &nbsp;&nbsp;・通知用電子メールアドレス
 &nbsp;&nbsp;・ブロードキャスト電子メールアドレス
それぞれの設定に関する詳細は[こちら](https://wiki.yellowfin.co.jp/pages/viewpage.action?pageId=3801295#id-%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E6%A7%8B%E6%88%90-%E9%9B%BB%E5%AD%90%E3%83%A1%E3%83%BC%E3%83%AB)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/2c547b17-5b64-8523-1e8e-d0acde42b1ab.png)

では皆様、良いデータ分析を!
自己紹介

# あいさつ
はじめまして！nissy243と申します．
情報系の大学に所属している怠惰な四年生です(2023年現在)．

研究ではLINEBotの開発をしていますが，24卒でAndroidアプリエンジニアとして頑張っていく予定です．

# 言語
技術スタックと言えるほどの高尚さがあるかは定かではありませんが触れるものを載せていきます．

- Kotlin
当然ですが，Androidアプリ開発で利用しています．夏休みに参加した複数のインターンや個人開発の経験があります．Androidアプリ開発飲みなので，サーバーサイドは分かりません．
- Swift
iOSアプリ開発に使用しました,ただ3人で作った簡単なアプリなのでバリバリ触れるというわけではありません．ただ，paizaのスキルチェックで主として利用していたのでロジカルな部分の知識は多少あるのかなという感じです．
- TypeScript
研究で開発しているLINEBotのサーバーとして利用しています．
- JavaScript
学生の頃のWebサイト制作のアルバイトで利用していました．
- Java
使用歴の最も長い言語ですが,最近微塵も使ってないので書けると言えるかは疑問です．


# 趣味
ただの好きなことです
- 読書
- ゲーム
- スノーボード
- キャンプ

# おわりに
(怠惰でなければ)今後積極的に記事を書いていきたいと思うので,どこかの誰かの役に立てたら嬉しいなと思います．
Oracle Database 23aiで追加されたSQLの新機能 様々なVALUE句 をFree版で試してみた

Oracle Database 23ai から SELECT文 や MERGE 文 でも VALUE句 を使えるようになりました。
早速、SELECT文 で VALUE句 を使って、SQL文中に表を作成してみます。


```sql
SQL> SELECT * FROM (VALUES (1, 'one'), (2, 'two'), (3, 'three')) AS EXAMPLE(n, c);

         N C
---------- -----
         1 one
         2 two
         3 three
```

一時的な表を使いたい場合に、CREATE TABLE 文や INSERT 文を使わずに、次のように SELECT 文を書くことができます。

```sql
SQL> SELECT T1.n1, T2.c FROM (VALUES (1), (2), (3)) AS T1(n1),
       (VALUES (1, 'one'), (2, 'two'), (3, 'three')) AS T2(n2, c)
  3  WHERE T1.n1 = T2.n2;

        N1 C
---------- -----
         1 one
         2 two
         3 three
```
SELECT 文中に一時的な表を作成することができると、開発効率が上がると思います。
以上、Oracle Database 23ai SQLの新機能 様々な VALUE句 でした。
【UiPath】Appsのアクセスコントロールについて

# はじめに
Appsは、UiPathが提供するローコードアプリケーション開発ツールで、プログラミングの専門知識を持っていなくても簡単に、すばやくアプリケーションを作成できます。
Appsは、RPA（Unattended）やエンティティ（Data Service）、ストレージバケットなどのUiPathの別サービスをシームレスに組み込むことができ、動的なアプリケーションを実現することができます。
![Apps2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/483f147d-5b57-04b2-9379-ff8f4a2f51aa.png)

本記事では、Appsで作成したアプリケーションに対するアクセスコントロールを整理してみます。

# つかうもの
※クラウド環境は2023年6月時点のもの
Automation Cloud(Apps) Enterprise版


# デプロイの種類
Appsには、2種類のデプロイの方法があります。
まず、デフォルトのプライベートです。これは、限られたユーザにアプリケーションを公開するモードです。
もう1つは、パブリックです。これは、アプリケーションをインターネット上に公開することで、世界中のユーザがアプリケーションにアクセスすることできます。
![Apps1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/02cbd275-e900-71ed-a20f-121b5d1214e2.png)


# プライベートデプロイ
* Automation Cloudへログインが必要
* アプリへの権限が必要
* 権限（ロール）は「実行のみ」と「編集と実行」の2つ
* アプリ所有者には「編集と実行」が付与
* ユーザまたはグループに対して権限の付与が可能

デフォルトの設定でパブリッシュした場合は、プライベートアプリケーションとなります。
アプリケーションへのアクセスの際、Automation Cloudへのログインが必要となり、未ログイン状態でアクセスするとアクセス拒否され、ログイン画面にリダイレクトされます。

初期状態では、アプリケーションの所有者のみにアクセス権限が付与されます。アクセス権限を持っていないアカウントがアプリケーションにアクセスすると次のようなエラーが出ます。
![プライベート1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/bfebb2e2-919f-c6b5-170b-11720c6b4b35.png)

アクセス権の付与はアプリケーションのプロパティから設定できます。ユーザまたはグループに対して、「実行権限のみ」か「編集と実行権限」を与えることができます。
![プライベート2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/ccc1a72e-8e9f-5ddb-28a4-eaa81a5da4e8.png)
![プライベート3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/4daec00e-7907-d8aa-38d9-f162571e213b.png)


## アクセスコントロールの例
次のようなアクセスコントロールを実現したい場合を想定します。

> アプリAは部門A専用のアプリケーションのため、部門Aのメンバーには実行させるが（編集はできない）、部門A以外はアクセスさせない。
> ただし、アプリケーション開発者と管理者チームは例外で編集権限も付与する。

![プライベート4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/9a843f56-8572-c1c1-38e6-6e304079e78a.png)

「部門A」というグループと、開発者ユーザを用意し、以下のようにアクセス権を与えます。管理者は既存グループの「Administrators」を利用します。
![プライベート5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/784e8fe8-85c0-ff4d-a916-262378054387.png)


# パブリックデプロイ
* Automation Cloudへログインが不要（世界中、誰でもアクセスできる）
* IPアドレスフィルターを付けることでアクセス元を制限することが可能

オプションにチェックすることでパブリックアプリケーションとしてデプロイすることができます。プライベートアプリケーションとは異なり、Automation Cloudのアカウントを持っていない方でもアクセスできます。
パブリックアプリケーションはインターネット上に公開されるので、「機密情報の収集や表示をしない」「データアクセス範囲の限定する」などプライベート以上に注意すべき点が多いです。

Automation Cloudの管理機能であるIPアドレスフィルターを使用することで、アクセス元のIPアドレスを制限することができます。
UiPathユーザ以外も含むすべての社員にアプリケーションを使用させたい場合は、パブリック＋IPアドレスフィルターを組み合わせて、アクセスコントロールを実装します。ただしIPアドレスの設定１つ間違うと、社外秘情報をインターネット上に公開するなどのリスクがあることを承知で行ってください。

:::note warn
IPアドレスフィルターを有効にすることで、Automation Cloudに含まれるすべてのサービスもIPアドレス制限が適用されます。
:::

![パブリック1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/3baa81f6-aa4d-e231-aca0-a9a718b1a0e0.png)

制限されたIPアドレスの範囲外からアプリケーションにアクセスした場合は、次のようなエラーが出ます。
![パブリック2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/00b5ce06-859c-3a63-4436-7d9cc03c604f.png)


# さいごに
いかがでしょうか。Appsでは部門やチーム単位などの細かいアクセスコントロールが可能なようです。ただし、グループメンバーシップの管理が必要になります（Azure ADを連携させれば自動化できるかな？？）。
jsonを分割してから横持ち→縦持ちに変換するクエリ（備忘録）


## jsonを分割して横持ちし、そのあとに縦持ちに変換するクエリ（replaceはデータによる）

```
select
	id
    ,member_id
    ,
  (
    CASE t2.`key`
      WHEN 'tmp1'  THEN tmp1
      WHEN 'tmp2' THEN tmp2
      WHEN 'tmp3'      THEN tmp3
    END
  ) AS value
from
(SELECT
	id
    ,member_id
    ,SUBSTRING_INDEX(replace(replace(replace(JSON_EXTRACT(data,'$.list'),"[",""), "]",""),'"',""),',',1) as tmp1
	,SUBSTRING_INDEX(SUBSTRING_INDEX(replace(replace(replace(JSON_EXTRACT(data,'$.list'),"[",""), "]",""),'"',""),',',2),',',-1) as tmp2
	,SUBSTRING_INDEX(SUBSTRING_INDEX(replace(replace(replace(JSON_EXTRACT(data,'$.list'),"[",""), "]",""),'"',""),',',3),',',-1) as tmp3
from
	json_table
) as t1
CROSS JOIN
(
  SELECT 'tmp1' AS `key`
  UNION ALL SELECT 'tmp2' AS `key`
  UNION ALL SELECT 'tmp3' AS `key`
)  as t2
```
VBAでブック検索ツール

## 仕様
ブックの内容を検索するツールを作成しました。
指定するディレクトリ内のブックの全シートを特定ワードで検索します。
シート1名を「設定」としC2検索対象ディレクトリを指定してください。
シート2名を「検索結果」としてください。

~~~
Sub SearchInFolder()
    Dim folderPath As String
    Dim fileName As String
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim searchRange As Range
    Dim result As Range
    Dim searchText As String
    Dim summarySheet As Worksheet
    Dim summaryRow As Long
    
    ' 検索対象のディレクトリを指定する
    folderPath = ThisWorkbook.Sheets("設定").Range("C2").Value
    'folderPath = "対象ディレクトリ"
    
    
    ' 検索対象のワードを指定する
    ' ユーザーに検索文字列を入力させる
    searchText = InputBox("検索する文字列を入力してください", "検索")
    
    ' 検索文字列が入力されなかった場合は終了する
    If searchText = "" Then
        Exit Sub
    End If
    
    ' 新しいシートを作成して、検索結果をまとめる
    Set summarySheet = ThisWorkbook.Sheets("検索結果")
    ' 検索結果シートのデータを削除する
    summarySheet.Rows("2:" & summarySheet.Rows.Count).ClearContents
    
    ' ヘッダーを設定する
    summarySheet.Cells(1, 1).Value = "検索文字列: " & searchText
    summarySheet.Cells(1, 1).Font.Bold = True
    
    summarySheet.Cells(2, 1).Value = "ファイル名"
    summarySheet.Cells(2, 2).Value = "シート名"
    summarySheet.Cells(2, 3).Value = "セル"
    summarySheet.Cells(2, 4).Value = "内容"
    summaryRow = 3
     
    ' 指定されたディレクトリにあるすべてのファイルに対して検索を行う
    fileName = Dir(folderPath & "\*.xls*")
    Do While fileName <> ""
        Set wb = Workbooks.Open(folderPath & "\" & fileName)
        
        ' ワークシートごとに検索を実行する       
        For Each ws In wb.Worksheets
            Set searchRange = ws.UsedRange
            Set result = searchRange.Find(searchText)
            
            ' 検索結果が見つかった場合は、メッセージを表示する
            If Not result Is Nothing Then
                summarySheet.Cells(summaryRow, 1).Value = wb.Name
                summarySheet.Cells(summaryRow, 2).Value = ws.Name
                summarySheet.Cells(summaryRow, 3).Value = result.Address
                summarySheet.Cells(summaryRow, 4).Value = result.Value
                summaryRow = summaryRow + 1
            
            End If
        Next
        
        wb.Close False
        fileName = Dir()
    Loop
    summarySheet.Columns.AutoFit
End Sub
~~~
Blazor チュートリアル - 最初の Blazor アプリを構築する

# はじめに

Blazor Tutorialを試してみました。
最初の Blazor アプリを構築して、少しカスタマイズしてみます。

https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/intro

# ダウンロードとインストール、アプリの作成

`Tutorial`通りに進めるのが一番わかりやすいので割愛します。
Visual Studioを使ったことがあれば簡単に進めることが出来ると思います。

# アプリを実行する

Visual Studioのツールバーにあるデバッグ開始ボタン（緑の矢印）をクリックしてアプリを実行します。
問題なければ`Hello,world`が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/2c6174b2-e4f8-a4f6-af5d-48fdf1392052.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/e12b318a-5e68-64ad-1674-3102e9cc05cc.png)


>Visual Studio で Web アプリを初めて実行すると、HTTPS 経由でアプリをホストするための開発証明書が設定され、証明書を信頼するように求められます。証明書を信頼することに同意することをお勧めします。証明書はローカル開発にのみ使用され、証明書がないとほとんどのブラウザーは Web サイトのセキュリティについて問題を報告します。

# Home画面（index.razor）

起動してすぐに表示されるHome画面は以下の`Pages`フォルダ内にある`Index.razor`で記述されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/52183db8-8b51-c5ec-a7a2-0693d195a016.png)

`@page /`はルーティングを示しているようです。最初に表示される画面なので`/`


~~~index.razor
@page "/"

<PageTitle>Index</PageTitle>

<h1>Hello, world!</h1>

Welcome to your new app.

<SurveyPrompt Title="How is Blazor working for you?" />
~~~


# カウンターを試してみる

左のサイドバーにある`Counter`をクリックして、ページを移動します。
`Click me`ボタンを押すと`Current count`の数値が`+1`されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/51018375-309d-1d9b-f145-485b7985c9ce.png)

コードは以下の`Counter.razor`に書かれていますので見てみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/e50840fb-3e9c-923c-e50f-72ec00be05db.png)


`@currentCount`が変数になっています。
ボタンをクリックしたときの動作は`@onclick=`に割り当てられた`IncrementCount`が動作しているようです。
~~~Counter.razor
@page "/counter"

<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

<p role="status">Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
~~~

`@code`で書かれている部分に変数の宣言・初期化、メソッドの定義がありますね。
ボタンを押した時に`IncrementCount()`が呼び出されて`currentCount++`が実行されます。
~~~Counter.razor
@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        currentCount++;
    }
}
~~~

# コンポーネントを追加する

先ほどの`Counter`をHome画面でも使えるようにしてみます。`index.razor`に`<Counter/>`を追加してみてください。

~~~index.razor
@page "/"

<h1>Hello, world!</h1>

Welcome to your new app.

<SurveyPrompt Title="How is Blazor working for you?" />

<Counter/>
~~~

以下のように`Counter`コンポーネントが追加され、ボタンを押すとカウントアップします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/1f8e3758-2990-5a0d-74bd-ad2ee0aa8cc3.png)

# まとめ

ロジックの部分をC#で書けるのがいいですね。
次はToDoアプリをつくってみたいと思います。
PolicyAsCode の仕組み

![how does (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3347065/b97edc58-fd3b-f8b4-34a4-28318c30b303.png)

ポリシーとは、セキュリティとコンプライアンスのポリシーを実行可能なコードとして記述する方法です。これらのポリシーは、組織のアプリケーションやインフラストラクチャと共に使用され、セキュリティとコンプライアンス要件を満たすことを保証します。

従来のセキュリティとコンプライアンスの手法と比較して、ポリシーとしてのコードはより効率的かつ正確な適用方法を提供します。また、開発および展開プロセス内でセキュリティとコンプライアンスのポリシーを自動化することで、効率を向上させ、運用リスクを減らすことができます。

## ポリシーとしてのコードはどのように機能するのですか？
ポリシーとしてのコードは、次の3つの主要なコンポーネントに依存しています。

### データ
クラウド、SaaS、またはインフラストラクチャ環境を分析するためには、基礎となるデータを取得する必要があります。ポリシーとしてのコードツールの文脈では、データは通常、プロバイダを使用して取得されます。Selefraの場合、プロバイダはさまざまなクラウドサービスプロバイダからデータを取得するために使用されます。Selefraの実行の初期段階では、オープンソースの（またはユーザー定義の）プロバイダが使用されて、クラウドリソースのデータが指定されたPostgreSQLデータベースに取得および保存されます。このデータは、後続のステップでポリシーの作成と分析の基礎として機能します。

### ポリシー
ポリシーは、意思決定の振る舞いをシミュレートするコードとして記述されます。これらのルールは、セキュリティ、コンプライアンス、またはベストプラクティスの要件を記述します。ポリシーは、業界の標準（CISベンチマークなど）または組織内のポリシーに基づくことができます。自然言語、ドメイン固有言語（DSL）、またはコードを使用して表現することができます。Selefraでは、ポリシーはYAML形式で定義され、プレースホルダーとSQLステートメントが使用されます。

yaml
Copy code
rules:
  - name: bucket_acl_publicly_writeable
    query: |-
      SELECT
        DISTINCT(a1.*)
      FROM
        aws_s3_buckets a1,
        aws_s3_bucket_grants a2
      WHERE
       a1.selefra_id = a2.aws_s3_buckets_selefra_id
        AND a2.grantee :: jsonb ->> 'URI' = '<http://acs.amazonaws.com/groups/global/AllUsers>'
        AND a2.permission IN ('WRITE_ACP', 'FULL_CONTROL');
    output: "S3 bucket ACL publicly writable, ARN: {{.arn}}"
上記の例では、Selefraはユーザーの設定に基づいてAWSデータを取得し、指定された形式で保存します。次に、定義されたルールを適用して非準拠のアイテムを特定します。

### 実行
データとポリシーが整ったら、ポリシーを実行し、セキュリティ上のリスクやコンプライアンスの違反をクエリするためのツールが必要です。Selefraの場合、ポリシーは実行可能なコードとして解釈されます。ポリシーのクエリセクションが実行され、結果がフォーマットされ、出力セクションを使用して出力されます。ユーザーは、クラウドリソースの特定の問題をコンソールで確認することができます。

## 結論
これで、ポリシーとしてのコード製品の概要説明が終わりました。実装の各ステップでは、重要なコード設計が必要です。私たちの今後の記事では、私たちのチームが各ステップのアーキテクチャ設計とコード実装について詳細な説明を提供します。私たちのチームに興味を持ち、オープンソース製品のSelefraを体験したい場合は、以下をご覧ください。

GitHub: https://github.com/selefra/selefra

Slack: https://selefra.io/community/join

お読みいただき、ありがとうございました！
datetime.datetimeにdatetime.timedeltaを足し算する

# 結論
`datetime.timedelta`型の変数に格納された時差分だけ日時を進める・戻した`datetime.datetime`型の変数が返ってきます。

# 解説
以前、`datetime.datetime`型同士の変数を引き算すると`datetime.timedelta`が返ってくるという記事を投稿しました。

https://qiita.com/76r6qo698/items/b8e2d1cdba600275202b

この`datetime.timedelta`ですが、`datetime.datetime`型の変数に足し算することもできます。結果としては想像できる通り、`datetime.timedelta`に格納された時差分だけ日時を進める・戻した`datetime.datetime`型が返ってきます。

# 検証コード

```py
import datetime

# 2023/06/01を表すdatetime
dt = datetime.datetime(2023, 6, 1, 0, 0, 0, 0)

# 2023/06/01の6日後
print(f'dt + datetime.timedelta(days = 6)            :{dt + datetime.timedelta(days = 6)}')

# 2023/06/01の6日と12時間後
print(f'dt + datetime.timedelta(days = 6, hours = 12):{dt + datetime.timedelta(days = 6, hours = 12)}')

# 2023/06/01の6日前(負の数で指定できる)
print(f'dt + datetime.timedelta(days = -6)           :{dt + datetime.timedelta(days = -6)}')
```

```
dt + datetime.timedelta(days = 6)            :2023-06-07 00:00:00
dt + datetime.timedelta(days = 6, hours = 12):2023-06-07 12:00:00
dt + datetime.timedelta(days = -6)           :2023-05-26 00:00:00
```
以上です。

# 参考

https://docs.pyq.jp/python/library/relativedelta.html
プログラミング未経験者が8週間でオリジナルWebサイトを作ってみた｜受講生作品コンテスト｜スパルタコーディングクラブ



こんにちは！
スパルタコーディングクラブです。:smile:

今日は、`１期受講生の作品`をご覧いただける`コンテスト`を紹介します！
投票された方の中から抽選でプレゼントも！:clap:

# ＜Webサイト自慢コンテスト＞
<p1> プログラミング入門コースの受講生が 
8週間の学習期間を通して作成した作品をご紹介します。
作品をご覧いただく皆さんもコンテストを楽しんでいただけるように
プレゼントも用意しました！</p1>

<a href="https://www.japan.spartacodingclub.com/exhibition"><img src="https://assets.st-note.com/img/1686724833397-X6YkcJkIyp.png"></a>
:point_up:クリックしてコンテストを見に行く:point_up:

### 投票イベント:gift:
<p1>投票していただいた方の中から抽選でプレゼントを送りします！</p1>

![note_present.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327902/fe3aa62f-a675-e0b2-0bcc-a729433b8b55.png)
> 豪華なプレゼントをもらうチャンス！</p2>

>・**投票期間**：6月13日(火)〜6月25日(日)
・**発表日**：6月27日(火)
・**プレゼント**：Airpods（1名）/ Amazonギフトカード・3千円分（3名）</p1>

:::note info
ヒント:Twitterで共有すると、当選確率がさらに上がるかも...？
:::



### なんでコンテストをしているの？
このコンテストは、受講生の8週間の学習と努力の成果をより多くの方に見ていただき、初めの１歩を踏み出せるきっかけになればと思い開催しました。

また、実際に受講されている皆様もご自身を作品を披露して、今後より多くの作品を作っていくためのモチベーションになればと思っております。

一番のポイントは、受講生のほとんどが`未経験からプログラミングを始め`、自分でアイデアを考えて企画から制作まで`全てを経験したということ`です。

お仕事や家事と両立しながらでも8週間の学習で自分のオリジナルWebサイトが作れるんです！

「私にもプログラミングができるのかな？」「最後までできるのかな？」と悩んでいるのであれば、実際に受講された方のWebサイトを見ながら、「私でもできるんだ！:flushed:」って少しでも自信をつけていただき、挑戦するきっかけになれば幸いです。



# スパルタコーディングクラブが気になる！

スパルタコーディングクラブのカリキュラムや受講費など、より詳しい情報が気になる方はぜひ下のリンクから確認してみてください。

https://www.japan.spartacodingclub.com/
AIをクライアントにすると結構面白いかもしれない。

## 何かと仲が悪いAIとイラストレーター
AI技術の発展はすさまじく、ほんのちょっと前まではAIで生成したイラストを見ては、「手でラーメン食ってて草」と遊んでいたと思ったら、今や「イラストレーターの仕事を奪う」や「芸術への侮辱」だと大騒ぎです。

特にAIを使ってイラストを生成する側と、いわゆる「絵師」と呼ばれる人たちの対立はひどく、Twitterでは日々争いが起きています。そいうこともあり、絵師界隈ではAIは悪みたいな文化が定着しつつもあります。

とはいえ、AIというせっかく目新しい技術があるので、なんとか両者が協力できるような方法がないか考えてみました。


## クライアントをChatGPTにしてみる
AIイラストの問題は学習に他人の作品を使っているといわれてます。
これはどうしようもないので、画像生成AIからいったん離れます。

というわけ、LLM系の文章生成AIを活用できないかと思いました。

今回やってみるのは、ChatGPTの中に架空のクライアントの人格をつくり、その人から依頼を受けてみるというものです。

ChatGPTのロールプレイの機能ですね。

## 結果

### 入力したプロンプト
>====
今、絵師とそのクライアントが会話しています。
絵師は自分が描くイラストについて、テーマ、雰囲気、出てくるモチーフ、描くものについて具体的に説明します。
====
絵師「今回のイラストはどのようなものにしましょうか？」
クライアント「そうですね…何か意外性のあるようなものがいいですね」
絵師「意外性？」
クライアント「はい、意外性です。それでもって人目をひくインパクトのある感じでお願いします」
>絵師「わかりました。では今回描くイラストを具体的に説明すると


### 出力（何回か途切れたので連結しています）
>絵師：「了解しました。意外性と人目を引くインパクトを持ったイラストを描きますね。具体的な説明をお願いします」
>
>クライアント：「このイラストは、ファンタジーの世界観を基にしたものにしたいです。テーマは『夢と現実の交差』です。雰囲気は、神秘的で不思議な感じが漂っているようなイメージです。」
>
>絵師：「了解しました。ファンタジーの世界観を表現し、夢と現実が交差するイメージを描きます。神秘的で不思議な雰囲気を大切にします。次に、出てくるモチーフや描くものについて具体的なアイデアはありますか？」
>
>クライアント：「モチーフとしては、夢の中に現れる幻想的な生物や風景がいいですね。また、夢と現実の対比として、現実世界での風景や人物も描いてほしいです。でも、それらを見たときに驚きや興味を引く要素があるといいです。」
>
>絵師：「なるほど、夢の中の幻想的な生物や風景、現実世界の対比、そして驚きや興味を引く要素を取り入れたイラストですね。それでは、具体的なモチーフやシーンのイメージがあれば教えてください。」
>
>クライアント：「夢の中には、キラキラと輝く妖精が舞っていたり、不思議な森の中を歩いている少女が描かれているといいですね。一方、現実世界では、都会の喧騒や忙しさを感じさせる風景や人々が描かれているといいです。さらに、夢と現実が交差する瞬間を表現してもらえると素敵です。」
>
>絵師：「理解しました。キラキラと輝く妖精や不思議な森の中を歩く少女、都会の喧騒や忙しさを感じさせる風景や人々、そして夢と現実が交差する瞬間を描きます。素晴らしいイメージですね。この情報を基に、意外性と人目を引くインパクトを持ったイラストを創り上げます

>絵師：「ありがとうございます。クライアント様の要望を踏まえ、意外性とインパクトを追求したイラストを制作いたします。まず、夢の中のシーンでは、キラキラと輝く妖精が夜空を舞い、鮮やかな色彩の花々が咲き誇る不思議な森を描きます。少女はその森の中を探検していて、驚きを感じる表情を浮かべています。」
>
>「一方、現実世界では、都会の景色を反映させながら、人々が忙しなく通り過ぎる街の中に立ち上がる高層ビルを描きます。街中には様々な人物がいて、彼らの表情や仕草から多様な人間模様が伝わるようにします。」
>
>「そして、夢と現実が交差する瞬間を表現するために、少女の後ろ姿からは夢の世界が広がり、妖精が現実の街中に飛び出してくる構図を取り入れます。この瞬間には、驚きや興味を引く要素をより強調し、視覚的なインパクトを与えるようなデザインを心掛けます。」
>
>「以上が具体的なイメージとなりますが、もしご希望があれば色彩や背景の詳細、キャラクターのデザインなど、細かい部分についてもご指定いただけますか？」
>
>クライアント：「おお、それは素晴らしいアイデアですね！色彩は夢の中はパステルカラーで柔らかく、現実の街は対照的に鮮やかな色合いを使って表現していただきたいです。背景には、夢の中の森には奇妙な形状の木々や光の演出を取り入れてほしいです。また、少女の衣装はファンタジー的な要素を取り入れたデザインにしていただけますか？」
>
>絵師：「承知しました。パステルカラーと鮮やかな色彩を使って、夢と現実の対比を表現します。夢の中の森では奇妙な形状の木々や光の演出を盛り込み、少女の衣装にはファンタジー的な
>
>絵師：「了解しました。パステルカラーと鮮やかな色彩を使って、夢と現実の対比を表現します。夢の中の森では奇妙な形状の木々や光の演出を盛り込み、少女の衣装にはファンタジー的な要素を取り入れます。たとえば、流れるようなシルクのドレスや、蝶の羽根を思わせる煌めきを持つアクセサリーなどが考えられます。」
>
>「また、夢と現実が交差する瞬間には、少女の周囲に魔法の粒子が舞い上がり、妖精が飛び出してくる構図に特に力を入れます。光と影のコントラストや、鮮やかな色彩の対比を活用して、驚きと興味を引く効果を最大限に引き出します。」
>
>「以上が具体的なイメージとなりますが、もし追加の要望や修正点がありましたら、お知らせください。お客様のご要望に沿ったイラストを作成するために、できる限りご協力させていただきます。」

## 考察
思った以上に会話してくれて面白かったです。
プロンプトはまだまだ改善の余地がありそうですね。
ですが、かなり具体的に描いて欲しい内容を言ってくれて、普通にこの絵を見てみたくなりました。
自分は絵が描けないのでここで終わりですが、イラストレーターさんがアイデアを思いついたりするのには結構いいかも？
こんな感じでAIと人間のコラボレーションがみれるといいですね。
また違う業種でも試してみようと思います。
【備忘】Synapse Analytics の条件付きアクセスについて　

## 参考


https://learn.microsoft.com/ja-jp/azure/azure-sql/database/conditional-access-configure?view=azuresql
https://learn.microsoft.com/ja-jp/azure/synapse-analytics/security/workspace-conditional-access

## 確認事項


1. Synapse を利用する際に Azure SQL Database 条件付きアクセスを構成するとどうなるか
    → SSMS などから接続する際など、Synapse SQL 部分への認証時に条件付きアクセスがトリガー. Synapse Studio 上でもトリガーしたが無視してクエリ実行ができたので、少々確認が不足してるかもしれない。
1. Synapse を利用する際に Microsoft Azure Synapse Gateway 条件付きアクセスを構成するとどうなるか
    → Synapse Studio に接続する際に条件付きアクセスがトリガー

いずれにせよ、Synapse Analytics 利用時には双方の条件付きアクセスの構成が必要
シェルコマンドの && 活用法

## 概要
シェルコマンドを使用して作業を行う際、複数のコマンドを一つの行で実行できたらefficiencyが上がる場合があると思います。そのような場合、それぞれのコマンドを別々に打ち込む代わりに、`&&`を使用することで、一つのコマンドとしてまとめることができます。

`&&`の機能は非常にシンプルで、

:::note
**一つのコマンドが成功した場合（つまり、エラーなく実行された場合）にのみ次のコマンドを実行します。**
:::
これにより、一連のコマンドを簡単に管理でき、エラーが発生した場合にはすぐに停止することができます。

## 使用例

たとえば、次の2つのコマンドがあるとします。

```bash
$ mkdir test-app
$ cd test-app
```

これらのコマンドは、新しいディレクトリ`test-app`を作成し、そのディレクトリに移動します。これらのコマンドを`&&`を使用して結合すると、次のようになります。

```bash
$ mkdir test-app && cd test-app
```

さらに、このパターンを続けて、新たに`backend`というディレクトリを作成し、そこに移動したい場合は、次のようにコマンドを入力します。

```bash
$ mkdir backend && cd backend
```

さらにさらに、これらのコマンドを組み合わせることもできます。

```bash
$ mkdir test-app && cd test-app && mkdir backend && cd backend
```

## まとめ
非常にシンプルな機能のコマンドですが、”**一つのコマンドが成功した場合にのみ次のコマンドを実行**”というところがかなり味噌になると思いますし、上手く活かせば、上記方法以外でも活用法があると思います。
stateが更新されない（レンダリングとstateを理解する）

## 事象
私は、Reactを使ってフォームを作成していました。
stateでデータを保持していたのですが、登録ボタンを押下すると、DatePikerで選択したはずの値で更新されておらず、1つ前のデータを保持した状態でDBに保存されるという、いやな事が起きてしまいました。

:::note info
上記現象が起きたコンポーネントの構造は、
**ページコンポーネント（親）から、自作のDatePicker（inputbox付き）を呼んでいて自作のDatePicker（子）から、[MUIのDateCalendar](https://mui.com/x/react-date-pickers/date-calendar/)を呼んでいる**という風になっております。
:::


## 改善
```diff_typescript
// stateの宣言
const [value, setValue] = useState<string>('');

// 更新時
- setValue('更新したで。');
+ setValue((value) => {return '更新したで。'});

```


## 参考
- [Reactのレンダリングを理解する](https://zenn.dev/1129_tametame/articles/bf4fc2005bea4d)
- https://ja.legacy.reactjs.org/docs/faq-state.html

参考にさせていただきました、ありがとうございました:bow_tone2:
プリザンターのトラブルシュートに役立つ切り分けTips

# はじめに
プリザンターで発生したトラブルを解決するための足掛かりとなる情報を記載します。随時ノウハウが増えたタイミングで追記していきます。

## システムログ
プリザンターのトラブルを切り分ける上で様々な情報を確認することができます。システムログは下記の手順で取得することができます。

https://pleasanter.org/manual/faq-contents-of-syslogs

#### アプリケーションで問題が発生しました
プリザンターの画面このエラーが出た場合には、システムログの[ErrMessage]および[ErrStackTrace]を確認することで、原因がつかめる場合があります。

#### プリザンターの動作がおかしい
ユーザがどのような操作を行ったか[Url]や[HttpMethod]に記録されます。ユーザが入力したデータは[RequestData]に記録されます。また操作したユーザは[Creator]でユーザIDを確認できます。おかしな動作とこれらのログを突き合わせることで、原因がわかることがあります。ログの記録が無い場合には、ネットワークの問題やWebサーバの制約の問題、クライアントの問題の可能性もあります。

#### プリザンターの動作が遅い
プリザンターではユーザのリクエストの処理にかかったサーバ側の時間を[Elapsed]にミリ秒単位で記録しています。[Elapsed]が大きい処理がある場合には負荷の高い操作が行われています。[Elapsed]が大きい処理が無い場合には、1分あたりのログの件数などを確認し、リクエスト数が多くなっていないか確認します。いずれも該当しない場合には、クライアント側の処理（スクリプトなど）による動作遅延の場合もあります。

#### プリザンターとつながらない / 操作が失敗する
プリザンターとクライアント間の通信ができない状態の場合、システムログに記録が無いことを確認して切り分けることができます。ネットワークの経路上で特定のHTTPメソッドが禁止されている場合、送信したデータのサイズが大きすぎる場合、APIのURLが誤っている場合などはログが残りませんので、URLや通信経路上の制約を確認します。

## Windowsイベントログ
ASP.NETやSQL Serverなどに問題がある場合、アプリケーションで問題が発生している場合には、イベントログに記録が残る場合があります。セットアップ後に起動しない場合にも、こちらを確認することで切り分けができる場合があります。

## journal
Linux環境においては下記のコマンドでエラーが確認できる場合があります。
```
journalctl -u pleasanter
```

## メール送信ログ
プリザンターでは、下記の手順でメールの送信ログを確認することができます。

https://pleasanter.org/manual/faq-view-outgoing-mail-log

#### メールが届かない場合
メールの送信ログに記録があるか確認します。記録が無い場合には、プリザンターがメールを送らない条件になっていないかを確認します。記録があるにもかかわらず、メールが届かない場合には、SMTPサーバと通信できているか、メールゲートウェイで拒否されていないか、メーラーの迷惑メールボックスに入っていないかなどと確認します。

## ブラウザのコンソール
クライアント側の問題が発生している場合には、ブラウザのコンソールにエラーが表示されることがあります。F12キーを押下してConsoleを開いてエラーが無いか確認します。

## バージョンアップ後に発生するよくあるトラブルの原因

#### プリザンターの動作がおかしい（古いキャッシュの影響）
JavaScriptライブラリのキャッシュが影響している可能性があります。ブラウザを変更したりキャッシュをクリアして改善するか確認します。この問題がでている場合、ブラウザのコンソールにエラーが表示されます。

#### プリザンターの動作がおかしい（パラメータの設定ミス）
古いパラメータファイルを上書きコピーした場合、新しく追加になったパラメータ項目が失われる可能性があります。WinMerge等の差分ツールを使用して、変更部分のみを新しいパラメータファイルにマージしてください。
OSMnxを使って簡単に経路探索・可視化

この記事は旧版です.
新版は[こちら](https://zenn.dev/wind111/articles/4cc15edad10508)
<!--
## はじめに
近年, Google MapsやApple Mapsなどのマップアプリケーションで簡単に道路検索ができるようになり開発者向けにもAPIが提供されていますが,
これらのAPIは従量課金制であまりコストを掛けたくない人やクレジットカードを持ってない人, 経路探索を簡単に試したい人には難しいのではないかなと思ってます.

そこで出てくるのが"OpenStreetMap"の存在です.

OpenStreetMapはフリーのマップサービスで有志の開発者らによってAPIが提供されており,
さらにコストもゼロのためお試しで使う, GISを扱いたいならオススメできるサービスです.

今回はgboeing氏がPythonユーザ向けに提供している[OSMnx](https://github.com/gboeing/osmnx)を紹介します.

## 前提条件
- Python3.9以上がインストールされていること

## インストール
はじめに, 経路探索をするために必要なScikit-learnをインストール.
```
pip3 install scikit-learn
```
次にOSMnxをインストール.
```
pip3 install osmnx
```

これらが完了したらコードを書いていきます.

## ソースコード
```python:route.py
import osmnx as ox

# 対象地域は今回以下のように設定
area = 'Minatoku,Tokyo,Japan'
# 車道のみでグラフを作成
G = ox.graph_from_place(area, network_type='drive')

# 出発点は六本木ヒルズ, 到着点は虎ノ門ヒルズに指定
departure = (35.660000, 139.730000)
destination = (35.666797, 139.749408)

#　2地点の近似ノードを取得する(経度, 緯度の順番であることに注意)
dep_node = ox.nearest_nodes(G, departure[1],departure[0])
des_node = ox.nearest_nodes(G, destination[1],destination[0])

# 経路探索
shortest_route = ox.shortest_path(G, dep_node, des_node)

# ルートをプロット
ox.plot_graph_route(G, shortest_route)
```
## 解説

最初に`area`で検索対象とするエリアを設定します.
`ox.graph_from_place(area, network_type='drive')`で設定されたエリアからグラフが作成されます.

今回は初めて使う人向けにエリアを指定していますが, 毎回エリアを指定して検索すると時間がかかってしまうため, `ox.save_graphml(G)`でグラフを保存して`ox.load_graphml('graph.graphml')`で読み込む方がおすすめです.

`ox.nearest_nodes(G,X,Y)`で設定した点の近似値を取ります.
ここで,　経度→緯度の順に指定していることに注意してください.
(間違えると対象エリアが見つからない旨のエラーが出ます)

`ox.shortest_path(G, dep_node, des_node)`で経路探索を行います.
デフォルトだとダイクストラ法で探索します.
(他の探索方法はドキュメントを参照してください)

`ox.plot_graph_route`でルートをプロットしています.

## プロットされた経路
![スクリーンショット 2023-06-15 12.02.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728089/c4ab2f68-bec7-6a9e-1280-a1292678d376.png)

赤い線がOSMnxによって最短経路と判断されたルートですね.
経路探索アルゴリズム自体はダイクストラをベースにしていますが, `ox.shortest_path`でweightオプションを指定することによって, 道路の長さや時間(時間は別で重みを追加する関数を書く必要がありますが)を加味した経路探索が可能になります.

## メリット
OSMnxを使ったメリットとして,
- グラフデータの取得, 経路探索などが数行で実現可能なため, 簡単に地理空間情報を扱うことが可能
- 経路探索の結果をプロットして確認することが可能
- Web, モバイル言語の地図ライブラリと組み合わせることでルート探索アプリの作成が可能

## デメリット
- リアルタイムではないため, VICSなど渋滞情報を参考にした経路探索は不可(gboeing氏も言及済)
- 経路探索に道路の制限速度条件などを追加すると, 指定した道路に情報を追加するため探索に時間がかかる
- ナビゲーションアプリとして作成する場合, 地図ライブラリで渋滞情報が取得できる物がある場合, 地図ライブラリ側での工夫が必要(例えば渋滞を回避したいなどの条件を作る場合)

## 最後に
短い文章となってしまいましたが, この記事を見てGISを扱うことに興味ある方や経路探索を試してみたい方はぜひOSMnxを試してみてはいかがでしょうか?
-->
## 参考
[OSMnx Documentation](https://osmnx.readthedocs.io/en/stable/index.html)
Bitrise APIでビルドすれば新しいワークフローもmainブランチに入れる前に試せるよ

# 概要

Bitriseで、bitrise.ymlをGitHubで管理している場合前提です。

bitrise.ymlに新しいワークフローの追加をmainブランチ以外で作った場合にWeb上では新しいワークフローは表示されません。

つまり、PRで作ったワークフローのテストをどうやるかという話です。

# やり方

APIを叩けばいいです。

`<対象のブランチ>`と`<対象のワークフロー>`はそのままなので説明不要でしょう。

```sh
curl -X 'POST' \
  'https://api.bitrise.io/v0.1/apps/${app-slug}/builds' \
  -H 'accept: application/json' \
  -H 'Authorization: ${access-token}' \
  -H 'Content-Type: application/json' \
  -d @- <<EOS
{ 
  "hook_info":{
    "type":"bitrise"
  },
  "build_params":{
    "branch": "<対象のブランチ>",
    "workflow_id": "<対象のワークフロー>"
  }
}
EOS
```

`${app-slug}`は、URLの `https://app.bitrise.io/build/<ここの部分>` です。対象のアプリを選択したときに出るアプリのIDだと思います。

`${access-token}`は、[BitriseのSecurity画面](https://app.bitrise.io/me/profile#/security)で生成できます。

以上です。

参考までに、Bitrise APIは、Swaggerあります。最新の仕様はこっちを見るのがいいでしょう。
https://api-docs.bitrise.io/
パパ！Elasticsearchってなに？

## 登場人物
かーくん：だいちの息子、リアルはパパと言ってくれない1歳4ヶ月の男の子。
だいち：かーくんのパパ。パパ歴1年4ヶ月、嫁とかーくんをこよなく愛してる。

## 質問は突然に…
ある日、だいちと息子のかーくんはリビングで一緒に過ごしていました。かーくんは最近プログラミングに興味を持ち始め、新しい技術について学ぶことに夢中になっていました。その日、かーくんはElasticsearchについて調べていましたが、なかなか理解できずに困っていました。

かーくん「ねえ、パパ。Elasticsearchって何？」
だいち「Elasticsearchね。それは、大量のデータを素早く検索できるように設計されたソフトウェアだよ。」

かーくん「それってどういうこと？」
だいち「うーん、例えば、大きな図書館を想像してみて。そこには何千もの本があるよね。それぞれの本がElasticsearchの"ドキュメント"に相当するんだ。そして、それらの本が整理されている棚が"インデックス"だと思ってみて。」

かーくん「でも、そんなにたくさんの本があったら、探している本を見つけるのは大変じゃない？」
だいち「それがElasticsearchのすごいところなんだ。Elasticsearchは図書館のカードカタログのようなものを持っていて、各ドキュメントの内容を解析して、キーワードとその位置を記録しているんだ。だから、特定のキーワードを含むドキュメントをすぐに見つけ出すことができるんだよ。」

かーくん「へえ、それなら大量のデータでもすぐに検索できるんだね！」
だいち「その通り。それに、Elasticsearchは分散型のシステムだから、データと処理を複数のサーバーに分散させることができるんだ。だから、大量のデータを扱うことができるし、高い可用性も確保できるんだよ。」

かーくんの目は輝き、Elasticsearchについてさらに学ぶことを楽しみにしていました。

## かーくん、Elasticsearchについて知りたくなる

かーくん「でもパパ、Elasticsearchはどうやって使うの？」
だいち「それは、Elasticsearchが提供するAPIを使って操作するんだよ。例えば、データを追加したり、更新したり、検索したりするためのAPIがあるんだ。」

かーくん「APIって何？」
だいち「APIは"Application Programming Interface"の略で、ソフトウェアが他のソフトウェアと通信するための規則や手段を提供するものだよ。ElasticsearchのAPIはHTTPを使ってアクセスできるから、ウェブブラウザやコマンドラインツール、あるいはプログラムからでも操作できるんだ。」

かーくん「なるほど、だからウェブサイトで検索ボックスに何かを入力すると、その裏でElasticsearchのAPIが使われて、関連する情報をすぐに見つけ出して表示できるんだね！」
だいち「その通り！さすが、かーくん。早くも理解が深まってきたね。」

かーくんは満足そうに笑いました。Elasticsearchについての理解が深まり、新しい知識を得ることができたからです。だいちも息子の成長を嬉しく思いました。

## うちの子、めっちゃかわいい
かーくん「でもパパ、Elasticsearchがそんなに便利なら、どんなところで使われてるの？」
だいち「それはいろんなところだよ。例えば、大規模なウェブサイトでは、ユーザーが何かを検索するときにElasticsearchが使われていることが多いんだ。また、ログデータや機械データの分析にもよく使われているよ。」

かーくん「ログデータって何？」
だいち「ログデータとは、システムやアプリケーションが動作する中で記録される情報のことだよ。例えば、ユーザーがウェブサイトを訪れたときや、エラーが発生したときなどに生成されるんだ。これらのログデータをElasticsearchに保存しておけば、後から何が起こったのかを詳しく調べることができるよ。」

かーくん「へえ、それなら問題が起きたときに原因を探すのに役立つんだね！」
だいち「その通り。それに、ログデータを分析することで、システムのパフォーマンスを改善したり、ユーザーの行動を理解したりすることもできるんだよ。」

かーくんはElasticsearchの可能性についてさらに理解を深め、その応用範囲の広さに驚きました。

## かーくん、Elasticsearchを完全に理解した。

かーくん「パパ、Elasticsearchについて教えてくれてありがとう。すごく面白そうだね！」
だいち「うん、それは本当だよ。でも、覚えることがたくさんあるから、一つ一つ確実に理解していくことが大切だよ。」

かーくん「うん、分かった！これからも色々教えてね！」
だいち「もちろんだよ。一緒に学んでいこうね。」

かーくんは満足そうに笑い、新たに得た知識を消化するためにパソコンに向かいました。

## 参考
[What is Elasticsearch?](https://www.elastic.co/guide/en/elasticsearch/reference/current/elasticsearch-intro.html)
[REST APIs](https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html)
[ELK Stack](https://www.elastic.co/jp/what-is/elk-stack)
スプレッドシートの複数セル(範囲)が同時に編集(貼り付け)されたときの検知

# こんなことがありました

「シートの特定のセルが編集されたらそれを検知してSlackに通知してほしい」というニーズがあったので、これのGASを書いたのですが「編集したけど通知が来ない」という連絡がありました。

例えば↓こんな管理表があって「C列が `完了` になったら、その行のタスク名とともにSlackに通知する」みたいな。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8612/56e82086-10be-0d9f-088e-d6da53a9d4b7.png)

↑この状態で、「C3」を「完了」にしたときはSlack通知が来るのですが、


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8612/4f48786f-25a7-72c2-7bfb-650753d1c553.png)

↑こんな感じで「A4:C4という範囲を一気に貼り付ける」をやると、たしかに「C列が更新されている」のではありますが、Slack通知が届きません。

オチとしては、範囲を貼り付けられた場合、下記の「単一セルの編集の検知」だと「貼り付けた範囲の左上のセル」は検知できるのだけどそれ以外のセルはわからない、でした。

「複数セルが同時に編集された時」(範囲を貼り付けられた時)の検知の仕方もメモっておきました。


# 単一セルの編集の検知


```js
function onEdit(e) {
  const ss = e.source;
  const sheet = ss.getActiveSheet();
  const sheetName = sheet.getName();

  const changedRow = e.range.getRow();
  const changedCol = e.range.getColumn();

  console.log(`[${sheetName}]シートの [${changedRow}]行目、[${changedCol}]列目が [${e.oldValue}] から [${e.value}] に編集された`)
}
```


# 複数セルの同時編集の検知


```js
function onEdit(e) {
  const editedValues = e.range.getValues();
  console.log(editedValues) // 編集された値の二次元配列が取れる

  const rowStart = e.range.rowStart;
  const rowEnd = e.range.rowEnd;
  const colStart = e.range.columnStart;
  const colEnd = e.range.columnEnd;

  const sheet = SpreadsheetApp.getActive().getActiveSheet()
  for (let r = rowStart; r <= rowEnd; r++) {
    for (let c = colStart; c <= colEnd; c++) {
      const v = sheet.getRange(r, c).getValue()
      console.log(`[${sheet.getName()}]シートの [${r}]行目、[${c}]列目 が 「${v}」に編集された`);
    }
  }
}
```

このやり方だと 編集前の値 は取れないのかな。なにか方法があるのかな。

参考(というかほぼこれ): [GAS入門 スプレッドシートのセル編集時のイベントトリガーまとめ │ Web備忘録](https://webbibouroku.com/Blog/Article/gas-event-cell)
【Query Builder：Expression】Try using Filter Reference

Let's take a look at the one of the populer expressions, **Filter Reference**.
Launch the Query Builder from the [Sharperlight](https://sharperlight.com/) application menu.
## Filters ##
Let's set the filter first.
- `Mode`: **Detailed Report**
- `Product`: **SAP Business One**
- `Company`: **\<Default>**
- `Table`: **G/L Transactions**

When specifying the table, the required filter items are displayed, so let's set the filter value for them.
- `G/L Account Code`: **\<ALL>**
- `Year/Period Code`: **PERIOD -12y** (FROM) and **PERIOD** (TO)
It means from the current accounting period 12 years ago to the current accounting period.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/24727f5b-b61f-af8d-bee1-1bf78537cc09.png)
## Outputs ##
Next, set the output items.
I chose the following three from the selection list.
- G/L Account Code
- Posting Date
- Amount

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d36848cf-d66f-db59-bb59-8f03e706f996.png)
## Preview ##
Let's have a look the result by clicking `Preview` button.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/f7a0d736-7618-6704-4d2d-6ef6e5f986cf.png)
The query works fine.
## Filter Reference ##
Now let's go back to the query definition and use a filter reference.
Right-click in the Output area and select **Add Expression**.
Try expanding the `Filter Named Values` from the Functions list.
A list of filters used in the query is displayed.
The **Description** and **Name** of the filter are displayed respectively.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/ba6755dd-58d2-9c3c-202e-f6dcb717c1fc.png)
This **Name** is the key and important in the filter reference.
Renaming can be done from the right-click menu in the `Filter` area.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/a816b74a-21b8-0a3b-5c31-62c7a9feeb05.png)
Let's use it right away.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/75141f20-a5f4-24f9-ca50-d1bedb5431c1.png)
Double-click `Year/Period Code {@YeaPerCod}` to transfer it to the above editor area.
Let's amend it like this.
`"The Period Start is [" + {@YeaPerCod} + "]"`
Choose **Text** for the `Data Type`.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c8aa1030-a3ee-e5e2-8319-7bc502a280b4.png)
Now confirm with OK and preview the query.
It was displayed like this. 
You can see that the specified filter value is also converted well and displayed.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/5902bc26-f2a6-d5a2-e655-99ca683262d1.png)

This output is meaningless here, but it means you can use it like this.
I hope this will help your work.
特定の文字列を検知するプログラムの練習

check_nameメソッドをinclude?メソッドを用いて書こう。

・名前を入力すると「Your name has been registered」という文字列を出力する
・名前の中にアンダーバー(_)がある場合は、「 "エラーです。記号は登録できません"」という　　　文字列を出力する
・名前の中に空白（半角）がある場合は、「 "エラーです。空白は登録できません"」という文字列を出力する


こうなる。

```ruby

def check_name(name) 
  if name.include?("_")
    puts "エラーです。記号は登録できません"
  elsif name.include?(" ")
    puts "エラーです。空白は登録できません"
  else
    puts "登録が完了しました♪"
  end
end
puts "登録したい名前を入力してください(例)FukuzawaYukichi"
name = gets
check_name(name) 

```
Oracle Database 23aiで追加されたSQLの新機能 Boolean型 をFree版で試してみた

Oracle Database 23ai から Boolean型 を使えるようになりました。
早速、Boolean型 を試してみます。

Boolean型が列にある表を作成します。

```sql
SQL> CREATE TABLE example (id NUMBER, c1 BOOLEAN, c2 BOOL);

Table created.
```

Boolean型の列がある表にレコードを挿入します。

```sql
SQL> INSERT INTO example VALUES (1, TRUE, NULL);

1 row created.

SQL> INSERT INTO example VALUES (2, FALSE, true);

1 row created.
```

Boolean型の列がある表を検索します。

```sql
SQL> SELECT * FROM example;

        ID C1          C2
---------- ----------- -----------
         1 TRUE
         2 FALSE       TRUE
```

Boolean型自体が論理値なので、WHERE句にBoolean型のみで評価できます。

```sql
SQL> SELECT * FROM example WHERE C1;

        ID C1          C2
---------- ----------- -----------
         1 TRUE
```
Boolean型を型変換してみます。

```sql
SQL> SELECT TO_BOOLEAN(ID -1) C3, TO_NUMBER(C1) C4, TO_CHAR(C1) C5 FROM example;

C3                  C4 C5
----------- ---------- -----
FALSE                1 TRUE
TRUE                 0 FALSE
```
以上、Boolean型のデータを扱うことができました。
【C#】1バイトの16進数を半分（ニブル）に分割する

1バイトの16進数（例：`AD`）を半分（`A`と`D`）に分割したい。
使用言語：C# 10.0

# 右側（下位のニブル）の取得
`AD`から右側の`D`を取得する。
`AD`を2進数に直すと`1010 1101`となる。
ここから`0000 1101`を取得するには、`0000 1111`でANDマスクすればいい。

```c#
byte source = 0xAD;

// ANDマスクで下位4bitだけにする
byte loNibble = (byte)(source & 0b_0000_1111);
Console.WriteLine(loNibble);   // 13

// 16進数で表示
string loNibbleStr = Convert.ToString(loNibble, toBase: 16).ToUpper();
Console.WriteLine(loNibbleStr);    // D
```

# 左側（上位のニブル）の取得
`AD`から左側の`A`を取得する。
`AD`を2進数に直すと`1010 1101`となる。

右に4bitシフトすれば、`1010`が取得できる。
（追記）当初は左側の4bitだけ残るようにANDマスクしてから右シフトしていましたが、右シフトするだけでOKでした。

```c#
byte source = 0xAD;

// 4bit右シフトする。
byte hiNibble = (byte)(source >> 4);
Console.WriteLine(hiNibble);   // 10

// 16進数で表示
string hiNibbleStr = Convert.ToString(hiNibble, toBase: 16).ToUpper();
Console.WriteLine(hiNibbleStr);    // A
```

# 拡張メソッドを定義
拡張メソッドにしておくと便利。

```c#
public static byte GetLowNibble(this byte source)
{
    // ANDマスクで下位4bitだけにする
    return (byte)(source & 0b_0000_1111);
}

public static byte GetHighNibble(this byte source)
{
    // 4bit右シフトする。
    return (byte)(source >> 4);
}
```

呼び出し方
```c#
byte source = 0xAD;

Console.WriteLine($"上位：{source.GetHighNibble()}");  // 上位：10
Console.WriteLine($"下位：{source.GetLowNibble()}");   // 下位：13
```

# （追記）タプルで返す拡張メソッド
コメントでご指摘いただいた通り、上位と下位のニブルをタプルにして返すとさらに便利。

```c#
public static (byte high, byte low) GetNibble(this byte source)
{
    return ((byte)(source >> 4),    // 上位4bit
            (byte)(source & 0b_0000_1111)); // 下位4bit
}
```

呼び出し方。相方が迷子になりづらくて良い。
```c#
byte source = 0xAD;

// ニブルを取得
var nibble = source.GetNibble();

Console.WriteLine($"上位：{nibble.high}");  // 上位：10
Console.WriteLine($"下位：{nibble.low}");   // 下位：13
```


# 参考文献
- [.net - C# 4 bit data type - Stack Overflow](https://stackoverflow.com/questions/42075537/c-sharp-4-bit-data-type)
GraalVM Enterpriseが無償化されたよ

# Javaブログでの発表
2023年6月13日のJavaブログで、GraalVMのライセンス変更が発表された。
[Introducing the GraalVM Free License](https://blogs.oracle.com/java/post/graalvm-free-license)
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/684a0094-b835-afec-3dbc-e0f635b4b38f.png)](https://blogs.oracle.com/java/post/graalvm-free-license)

冒頭のKey Detailsを超訳すると、こんな感じだろうか。

* **従来のOracle GraalVM Enterpriseは、Oracle GraalVM for JDK 20のようなリリース番号が付く名前に変更**
* **新しいGraalVMは、（JDKのNFTCライセンスに似た）GraalVM Free Terms and Conditions(GFTC)ライセンスで提供し、商用利用や再配布も無償になった**
* **これまでGraalVM Enterpriseをダウンロードするにはライセンスアグリーメントをクリックする必要があったが、クリックなしにダウンロードできるようになった（CI/CDやIaCに組み込みやすくなった）**
* **従来のCommunity Editionも引き続き提供**（従来GraalVMは、GPLv2のCommunity Editionと商用ライセンスもしくはOTNライセンスのEnterprise Editionがあった）

# Community Editionのサイトでは
Community Editionサイトの[トップページ](https://www.graalvm.org)でも、今回のアナウンスが掲載されている。
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/9ff6b918-a206-b041-4838-5670deeb7c74.png)](https://www.graalvm.org)

# GFTCライセンスの詳細
詳しくは以下のサイトを読んでほしい。2023年6月15日現在GFTCについては日本語版のサイトには掲載されていない。
[Oracle Java SE Licensing FAQ](https://www.oracle.com/java/technologies/javase/jdk-faqs.html#GraalVM-licensing)
[Oracle Java SEライセンスに関するFAQ](https://www.oracle.com/jp/java/technologies/javase/jdk-faqs.html)

# GraalVMのダウンロード
[Java Downloadsページ](https://www.oracle.com/java/technologies/downloads/#graalvmjava20)ではダウンロードURLが公開され、[JDK and GraalVM Script Friendly URLs](https://www.oracle.com/java/technologies/jdk-script-friendly-urls/)というページもある。
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/b5b9ad05-131b-0c4b-84f3-032b51cf519d.png)](https://www.oracle.com/java/technologies/downloads/#graalvmjava20)
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/6709a253-fa7a-5cbf-803a-09b407420d2a.png)](https://www.oracle.com/java/technologies/jdk-script-friendly-urls/)

# 雑感
Javaはライセンス変更がありすぎて、超絶反感をくらって、いろいろな派生を生み出した経緯があるし、クリックの関門を突破できないとCI/CDに組み込みづらいから、こんなことになったのだろうか。
Linuxでコマンドのエイリアスを設定する手順

Linuxでコマンド入力する際に、エイリアスを使うには2パターンある

1. .bashrcに定義する
1. aliasコマンドで設定する

## 1) .bashrcにエイリアスを定義する

- この方法だと、bashを開くたびに既にエイリアスを設定された状態を保持してくれる
- 毎回使用するようなコマンドはここに登録しておくと便利◎

.bashrcファイルを開く

```sh
$ vi ~/.bashrc
```

エイリアスを定義する
（既にあるaliasの下など分かりやすいところに追加しておくとよさそう）

```.bashrc
alias dc='docker-compose'
```

【使い方の例】

```sh
# docker-compose up の意
$ dc up
```

## 2) aliasコマンドでエイリアスを設定する

- この方法だと、bashを再起動するとエイリアスは消える
- 毎回は使わないけど一時的にエイリアスを設定したい場合に便利

```sh
$ alias lla='ls -al'
```

【使い方の例】

```sh
# ls -al の意
$ lla
```

### おまけ unaliasコマンドでエイリアスを解除

```sh
$ unalias lla
```

```sh
$ lla

Command 'lla' not found, did you mean: xxx
```
vscodeのshell integrationがfishだと動作しない

# TL;DR

- `.config/fish/config.fish`に以下の処理を足す(ゴリゴリ)
```
string match -q "$TERM_PROGRAM" "vscode"
and . (code --locate-shell-integration-path fish | sed -e "s|shellIntegration.fish|fish_xdg_data/fish/vendor_conf.d/shellIntegration.fish|g")
```

## vscodeのshell integration

- https://code.visualstudio.com/docs/terminal/shell-integration
- https://dev.classmethod.jp/articles/vs-code-command-decorations-by-terminal-shell-integration-is-convenient/

## 環境

- wsl2
- ubuntu 22.04
- fish, version 3.6.1
- vscode  1.79.1


## 事象

https://code.visualstudio.com/docs/terminal/shell-integration
に書かれている通りやってみるが、なんか有効化されない

`code --locate-shell-integration-path fish`を実行すると、、以下の結果

```bash
 ~  $  code --locate-shell-integration-path fish                                                                                     (base) 
/home/XXXX/.vscode-server/bin/4cb974a7aed77a74c7813bdccd99ee0d04901215/out/vs/workbench/contrib/terminal/browser/media/shellIntegration.fish
 ~  $  cat /home/XXXX/.vscode-server/bin/4cb974a7aed77a74c7813bdccd99ee0d04901215/out/vs/workbench/contrib/terminal/browser/media/shellI
ntegration.fish
cat: /home/XXXX/.vscode-server/bin/4cb974a7aed77a74c7813bdccd99ee0d04901215/out/vs/workbench/contrib/terminal/browser/media/shellIntegration.fish: No such file or directory
```

## 調査

ディレクトリを見てみると、、ファイルが無い＋なんかフォルダがある

```
 ~  $  ll /home/XXXX/.vscode-server/bin/4cb974a7aed77a74c7813bdccd99ee0d04901215/out/vs/workbench/contrib/terminal/browser/media/(base) 
total 44K
drwxr-xr-x 3 XXXX XXXX 4.0K Jun 13 01:17 fish_xdg_data/
-rwxr-xr-x 1 XXXX XXXX 8.2K Jun 13 00:54 shellIntegration-bash.sh*
-rw-r--r-- 1 XXXX XXXX  592 Jun 13 00:54 shellIntegration-env.zsh
-rw-r--r-- 1 XXXX XXXX  472 Jun 13 00:54 shellIntegration-login.zsh
-rw-r--r-- 1 XXXX XXXX  700 Jun 13 00:54 shellIntegration-profile.zsh
-rw-r--r-- 1 XXXX XXXX 5.2K Jun 13 00:54 shellIntegration-rc.zsh
-rw-r--r-- 1 XXXX XXXX 6.9K Jun 13 00:54 shellIntegration.ps1
```

このフォルダの奥に、スクリプトを発見

```
 ~  $  ll /home/XXXX/.vscode-server/bin/4cb974a7aed77a74c7813bdccd99ee0d04901215/out/vs/workbench/contrib/terminal/browser/media/fish_xd
g_data/fish/vendor_conf.d/shellIntegration.fish 
-rw-r--r-- 1 XXXX XXXX 4.6K Jun 13 00:54 /home/XXXX/.vscode-server/bin/4cb974a7aed77a74c7813bdccd99ee0d04901215/out/vs/workbench/contrib/terminal/browser/media/fish_xdg_data/fish/vendor_conf.d/shellIntegration.fish
```

`.config/fish/config.fish`でこのスクリプトを実行するようにして見ると、動作することを確認しました



## 対応方法(暫定)

https://code.visualstudio.com/docs/terminal/shell-integration#:~:text=integration%2Dpath%20bash)%22-,fish,-%E2%9A%A0%EF%B8%8F%20This%20is%20currently

ここのスクリプトを少しいじる。

`4cb974a7aed77a74c7813bdccd99ee0d04901215`の部分はアップデートなどで変わってしまうので、とりあえずshellIntegration.fish部分をsedする

```
string match -q "$TERM_PROGRAM" "vscode"
and . (code --locate-shell-integration-path fish | sed -e "s|shellIntegration.fish|fish_xdg_data/fish/vendor_conf.d/shellIntegration.fish|g")
```


## 恒久対応

すでにIssueも出て、PRもマージされていますね。リリースを待ちましょう

https://github.com/microsoft/vscode/issues/184659
https://github.com/microsoft/vscode/pull/185056
PHP(CLI)でhtml、css、jsのunify、minify

```
<?php
$contents = file_get_contents('http://localhost:8000/index.html');
$contents = preg_replace('/<!--.*-->/', '', $contents);
{
	preg_match_all('/<link rel="stylesheet" href="(.*\.css).*/', $contents, $matches, PREG_SET_ORDER);
	foreach ($matches as $match) {
		$inner = file_get_contents('./static/'.$match[1]);
		$inner = preg_replace('#/\*([^*]|\*[^/])*\*/#s', '', $inner);
		$inner = trim($inner)."\n";
		$contents = str_replace($match[0], "<style>\n".$inner."\t\t</style>", $contents);
	}
}
{
	preg_match_all('/<script src="(.*\.js).*/', $contents, $matches, PREG_SET_ORDER);
	foreach ($matches as $match) {
		$inner = file_get_contents('./'.$match[1]);
		$inner = preg_replace('#/\*([^*]|\*[^/])*\*/#s', '', $inner);
		$inner = preg_replace('#^\s*//.*#m', '', $inner);
//		$inner = preg_replace('#^\s*console\..*#m', '', $inner);
		$inner = trim($inner)."\n";
		$contents = str_replace($match[0], "<script>\n".$inner."\t\t</script>", $contents);
	}
}
$contents = preg_replace('/\s*\n\s*/', '', $contents);
echo $contents;
```
「アプリをインストール」するだけのPWA

``` manifest.json
{
	"name": "{アプリケーション名}",
	"display": "standalone",
	"start_url": "index.html",
	"orientation": "portrait",
	"icons": [
		{
			"src": "images/logo.png",
			"sizes": "192x192"
		}
	]
}
```

``` sw.js
self.addEventListener('install', event => event.waitUntil());
self.addEventListener('fetch', event => event.respondWith());
```

```
if (navigator.serviceWorker) {
    navigator.serviceWorker.register('sw.js');
}
```
背景画像(壁紙)を素敵なものにしてくれるアプリ（ブラウザ, macOS, Windows）

# Google Chrome

## Momentum

[Momentum Dash: Your space for focus](https://momentumdash.com/)

- 世界中の風景写真（主に自然）を表示
- 日替わり
- 画像元: [Unsplash](https://unsplash.com/ja)
- 他にも、ToDoや時計など色々な機能有

![Momentumの例](https://momentumdash.com/img/home/hero/5.jpg)

![Momentumの例](https://momentumdash.com/img/home/hero/4.jpg)


## Earth View from Google Earth

[Earth View from Google Earth - Chrome ウェブストア](https://chrome.google.com/webstore/detail/earth-view-from-google-ea/bhloflhklmhfpedakmangadcdofhnnoh?hl=ja)

- Google Earthからの地上写真を表示
- ウィンドウ・タブを開くごとに新しいものへ

<iframe width="560" height="315" src="https://www.youtube.com/embed/W1iQ-6KDQ2w" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" loading="lazy" allowfullscreen></iframe>


## Google Art & Culture

[Google Arts & Culture - Chrome ウェブストア](https://chrome.google.com/webstore/detail/google-arts-culture/akimgimeeoiognljlfchpbkpfbmeapkh/related)

- 過去のアート作品（名画）を表示
- 画像元: [Google Arts & Culture](https://artsandculture.google.com/)

![ChromeでのGoogle Art & Cultureの例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6438/18eee7e5-03ce-a554-4a31-3a043100475a.png)




# macOS

## Unsplash Wallpapers

[「Unsplash Wallpapers」をMac App Storeで](https://apps.apple.com/jp/app/unsplash-wallpapers/id1284863847?mt=12)

- Unsplashからさまざまな写真を持ってきて背景へ設定
- Unsplash公式
- 日替わり、週替わり、など設定可

## Satellite Eyes

[Satellite Eyes](https://satelliteeyes.tomtaylor.co.uk/)


- **あなたが今いる場所**にあわせた「地図」や「航空写真」を壁紙へ
- （macOSの「位置情報サービス」による場所）
- オープンソース
- @Yfuruchinさんに教えてもらった: 好きすぎてもう13年くらい使っているらしい


> Satellite Eyes is a MacOS app that automatically changes your desktop wallpaper to the satellite view of where you are, right now.


> Oh, and it's free. And the source code is [available on Github](https://github.com/tomtaylor/satellite-eyes).

![Satellite Eyesの例 - 航空写真](https://satelliteeyes.tomtaylor.co.uk/images/screenshot.jpg)

![Satellite Eyesの例 - 地図](https://user-images.githubusercontent.com/836375/31194770-0950b980-a8fd-11e7-8108-9a08555a0832.png)

![Satellite Eyesの設定画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6438/3c0bdc36-1c60-b336-7b30-d57cebd3d315.png)


# 追記: Bing Wallpaper （Windows, macOS, 各種ブラウザ）

当記事を見た@asahina820さんに教えてもらいました！

[1 枚 1 枚の写真で世界を探検 | Bing Wallpaper](https://bingwallpaper.microsoft.com/mac/en/bing/bing-wallpaper/)

- 検索エンジンBingのホームページに掲載された画像をデスクトップへ
- Windows
  - デスクトップに加え、Internet Explorer 11、Microsoft Edge バージョン 74 以降、Chrome、Firefox に適用可能
- macOS
  - デスクトップに加え、Safari、Chrome、Firefox に適用可能