OmniAICreator/Qiita-1.07M huggingface dataset:
Google検索で英語情報のみを表示する設定


- 下記を開く
  - `chrome://settings/`
- 下記を表示する
  - `Search Engine` > `Manage search engines and site search` > `Site search` > `Add`
- 下記設定をする
  - Search Engine: `Google(English)`
  - Shortcut: `e`
  - URL with %s in place of query: `https://www.google.com/search?gl=us&hl=en&gws_rd=cr&pws=0&q=%s`

- 設定完了。検索ボックスにて `e` + `space` + `<検索キーワード>` で英語結果のみが表示されるようになる

## REF

- [日本からアメリカのGoogle (google.com) で英語で検索する方法](https://www.suzukikenichi.com/blog/how-to-search-on-google-com-in-english-from-japan/)
- https://twitter.com/imos/status/1444859564583645187
【爆速】証明書付きのHTTPSサーバをたった4行の設定で立ち上げる【Caddy】

HTTPサーバと言えばNginxがおそらく一番普及していますが、これからはCaddyの時代かもしれません。CaddyならNginxと同じことがより少ない記述量で設定でき、HTTPSの証明書取得・更新まで自動で行ってくれます。ということでCaddyを使って証明書付きのHTTPSサーバーを爆速で立ち上げます。

https://caddyserver.com/

# 準備
DNSサーバを設定して、ウェブサーバに使うホスト名とIPアドレスの対応付けを行っておきます。

# インストール
Dockerイメージもありますが、ここでは普通にインストールします。Debian、Ubuntuの場合を記します。それ以外の場合は公式の以下を参照。

https://caddyserver.com/docs/install

```console
$ sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
$ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
$ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
$ sudo apt update
$ sudo apt install caddy
```

# 設定ファイル作成
`Caddyfile`という名前のファイルがCaddyの設定ファイルになります。ここでは静的なウェブサーバを立てます。

```:Caddyfile
www.example.com {
　root * /home/me/mysite
  file_server
}
```

以上で`www.example.com`というホスト名のサーバを立てて、その内容は`/home/me/mysite`ディレクトリから提供するようになっています。

# ウェブサーバ起動
`Caddyfile`があるディレクトリで以下のコマンドを実行します。

```console
$ caddy run
```

これでウェブサーバが起動します。同時に`www.example.com`の証明書を Let's Encrypt 等から取得してくることにより、HTTPSでのアクセスも勝手にできるようになっています。そしてHTTPでのアクセスはHTTPSにリダイレクトされます。もちろん証明書の更新も自動でやっておいてくれます。

以上、終わり！

# その他のレシピ
## リバースプロキシする場合
```:Caddyfile
www.example.com {
  reverse_proxy http://localhost:8000
  # 以下のように省略可能
  # reverse_proxy :8000
}
```

`X-Forwarded-For`、`X-Forwarded-Proto`、`X-Forwarded-Host`の各ヘッダは自動で付加される。

## パスで分ける場合
```:Caddyfile
www.example.com {
  handle /hoge/* {
    reverse_proxy http://192.168.1.2:8000
    # /hoge/aaa は http://192.168.1.2:8000/hoge/aaa にプロキシされる
  }

  handle_path /fuga/* {
    reverse_proxy http://192.168.1.3:8000
    # /fuga/aaa は http://192.168.1.3:8000/aaa にプロキシされる
  }
}
```

## HTTPのみで立てる場合
```:Caddyfile
:8000 {
　root * /srv/http/hoge
  file_server
}

http://www.example.com {
  root * /src/http/fuga
  file_server
}
```

ホスト名を書かずにポートだけ書いたり、明示的に`http://`とすればHTTPのみになる。

# あとがき
証明書が自動更新されるHTTPSサーバを4行の設定ファイルだけで立てられるわけですから、すごいですね。NginxとCertbotの構成を全部置き換えたいです。
Azure Synapse Analytics って何？

# プロローグ

**ほげ君**：ねえねえ、 Azure Synapse Anatlytics って知ってる？
**ふが君**：何それ？知らない。
**ほげ君**：僕も知らないんでよね！どんなものなのか教えてよ、 Microsoft 公式ドキュメント君！
**公式ドキュメント君**：分かりました。





# Synapse Analytics 概要
**公式ドキュメント君**：Azure Synapse は、データ ウェアハウスやビッグ データ システム全体にわたって分析情報を取得する時間を早めるエンタープライズ分析サービスです。 Azure Synapse は、エンタープライズ データ ウェアハウスで使用される SQL テクノロジ、ビッグ データのための Spark テクノロジ、ログおよび時系列分析に使用される Data Explorer、データ統合と ETL および ELT のための Pipelines、Power BI、CosmosDB、AzureML などの他の Azure サービスとの緊密な統合の長所を組み合わせたものです。

**ほげ君**:ん－－、要は大量のデータを処理することができるってことか。それってそんなにすごいのか？
**ふが君**:最近気づいたんだけどさ、多分データの量が多いってだけでも実は結構問題になるんじゃないかな？ただ降順に並べ替えるとかのエクセルでよくやる処理が、データが多いとそれだけで難しいのかなって。
**ほげ君**:そうなのか？
**ふが君**:あと僕たちが個人として扱ったいるデータと違って、企業とかが使うデータは誰が見たとか、どれぐらい使われたとか、そもそもどんなデータがあるのかとか、ただデータを見る使う以外にも、いろいろ気にしなくちゃいけないんじゃないかな？
**ほげ君**:なるほど！だからこんな何が嬉しいんだ？みたいな製品がいっぱい世の中にはあるのか！
**ふが君**:そうかもしれない。
**ほげ君**:にしても、Synaspe は何で難しいはずの大量データの処理ができるんだ？
**ふが君**:それは公式ドキュメント君に聞かないと。

**公式ドキュメント君**: Synapse にはビッグデータを処理する為のランタイムが三つあります：
1.Synapse SQL
2.Apache Spark for Azure Synapse
3.Synapse Data Explorer

**ほげ君**:多いなあ...
**ふが君**:一個ずつ教えてよ。

**公式ドキュメント君**:Synapse SQL では、サーバーレスと専用の両方のリソース モデルが提供されます。予測可能なパフォーマンスとコストに対しては、専用 SQL プールを作成して、SQL テーブルに格納されているデータの処理能力を確保します。 計画外または突発性のワークロードに対しては、常に使用可能なサーバーレスの SQL エンドポイントを使用します。

**ほげ君**:なるほど。一気に予約するのが専用で、使った後に会計するのがサーバレスか。
**ふが君**:二個目の Apache Spark は分散処理用のエンジンだね。三つ目は？

**公式ドキュメント君**:Azure Synapse Data Explorer は、ログとテレメトリ データから分析情報を引き出すための対話型クエリ エクスペリエンスを顧客に提供します。

**ほげ君**:これがさっき言ってた企業向けの機能か！ログは誰が何をしたかだよな。テレメトリデータってなんだ？
**ふが君**:教えてよ、グーグル先生。

**グーグル先生**:テレメトリーデータ（telemetry data）とは、ソフトウェアやアプリケーションがパフォーマンス改善や品質向上を目的として収集するユーザーの利用状況データのこと。プロセスは自動化されて、メーカーやベンダーのコントロールセンターなど特定の地点にデータは送信、収集される。

**ふが君**:利用状況のデータか。
**ほげ君**:へー。企業ってこんなこともやってるんだ。
**ふが君**:もうちょっと各部分の詳細を知りたいね。
**ほげ君**:今日はこのぐらいにしようぜ。腹減った。かつ丼食べに行こう。
**ふが君**:いいよ。また今度教えてね。公式ドキュメント君。
Google Colab環境でChromiumを使う方法

# 概要

Ubuntu 20.04+からは、Chromiumの提供範囲が変わった影響で、Google Colab環境でChromiumを用いてWebスクレイピングを行う際に環境設定が必要になりました。

環境設定を行わずに、今まで通りに以下の方法でWebDriverをインスタンス化しようとするとエラーになります。

```python:note1.py
pip install selenium

from selenium import webdriver

webdriver = webdriver.Chrome("chromedriver")
```



日本語での解説記事が見つからず英語で色々調べる必要がありました。

今後Google Colab環境でChromiumを使いたい人の参考になれば幸いです。

# 環境設定

それでは環境設定を行います。

具体的には、Debian BusterのレポジトリからGoogle Colabに対応可能なバージョンのChromiumをインストールしていきます。

Google Colabで新しいノートブックを作ったら、まず最初に設定を行いましょう。

```python:note2.py
%%shell
# Ubuntuはスナップパッケージ外でのChromium-browserの提供をやめました。

# Debian busterを追加します。
cat > /etc/apt/sources.list.d/debian.list <<'EOF'
deb [arch=amd64 signed-by=/usr/share/keyrings/debian-buster.gpg] http://deb.debian.org/debian buster main
deb [arch=amd64 signed-by=/usr/share/keyrings/debian-buster-updates.gpg] http://deb.debian.org/debian buster-updates main
deb [arch=amd64 signed-by=/usr/share/keyrings/debian-security-buster.gpg] http://deb.debian.org/debian-security buster/updates main
EOF

# キーを追加します。
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys DCC9EFBF77E11517
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 648ACFD622F3D138
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 112695A0E562B32A

apt-key export 77E11517 | gpg --dearmour -o /usr/share/keyrings/debian-buster.gpg
apt-key export 22F3D138 | gpg --dearmour -o /usr/share/keyrings/debian-buster-updates.gpg
apt-key export E562B32A | gpg --dearmour -o /usr/share/keyrings/debian-security-buster.gpg

# DebianのレポジトリからChromiumパッケージだけが欲しいと伝えます。
# 入力間に2列の改行があることに注意してください。
cat > /etc/apt/preferences.d/chromium.pref << 'EOF'
Package: *
Pin: release a=eoan
Pin-Priority: 500


Package: *
Pin: origin "deb.debian.org"
Pin-Priority: 300


Package: chromium*
Pin: origin "deb.debian.org"
Pin-Priority: 700
EOF

# ChromiumとChromium driverをインストール。
apt-get update
apt-get install chromium chromium-driver

# Seleniumをインストール。
pip install selenium
```

正直何を行なっているか詳しいことはわからないのですが、これをコピペして実行すればとりあえずインスタンス化ができるようになります。

**Chromiumで手軽にウェブスクレイピングを行うためには、この方法がおすすめです。**

## 補足

環境設定とは別なのですが、Seleniumの最新パッケージでは要素を取得するための以下のメソッドが消されています。

```python:note1.py

webdriver.find_elements_by_ロケーター("ロケーター名")

#例: webdriver.find_elements_by_id("id_name")
```

確かにロケーターごとにわざわざ違うメソッドを呼び出すのは無駄のある動きだったのかもしれません。

今後は、Byクラスを使用する必要があります。


```python:note1.py

from selenium.webdriver.common.by import By

webdriver.find_elements(By.ロケーター, "ロケーター名")

#例: webdriver.find_elements(By.CLASS_NAME, "class_name")
```

こちらの方が少しスマートに見えます。

さらに、すっきりした上にロケーターを宣言するときには大文字で叫んでいるようで、主張が強めなのも好印象です。



# おわりに

今回はGoogle Colab上でSeleniumのWebdriverを使えるようにするための環境構築を行う方法をお伝えしました。


ついでに指定のWebページから要素を取得する方法も紹介しました。


find_elements_by_id()などというメソッドはベンチから外され、find_elementsやfind_elementの独壇場になっているのでご注意ください。

参考）https://github.com/googlecolab/colabtools/issues/3347#issuecomment-1387453484
[]byte("a", "b", "c") でエラーがでる理由わかる？正しい書き方は？

## やりたいこと

文字をバイト型のスライスに入れたいのですが、`[]byte("a", "b", "c")` はエラーがでます。

```
too many arguments in conversion to []byte
```

ふむふむ。引数が多いのか。。
エラーにある通り引数を一つにすればエラー回避できるのですが、どういう仕組みなのかを見ていきましょう。

## `[]byte(変数)` ← 丸いかっこ と `[]byte{変数}` ← 波状のかっこ の違い


### 丸いかっこを使う「型(変数)」は、型変換をする

丸いかっこを使う「型(値)」は、型変換を行う表現です。
(記事にしているのでよかったら見てください。😊 )

https://qiita.com/yNavS4Ki/items/58dd2771ffa5effa4a40

なので、`[]byte(変数)` は、() 内の変数を、バイト型のスライスに変換する表現になります。

なので、複数の値を渡すのではなく `[]byte("abc")` とすれば、エラーはなくなります。
→ string 型 "abc" を byte 型のスライス に **型変換** していることになります。

ここで疑問が。。
**波状のかっこもあるけど、違いはなに？です。**
すぐには答えが思いつかなかったので調べてみました。

### 波状のかっこは、その型自身に変数を定義する

`[]byte{変数}` は、単純に byte 型 のスライスに、"変数" を定義します。

なので、`[]byte{'a', 'b', 'c'}` すれば、やりたいことを実現できます。

ここで別の疑問が。。
**文字を渡しているのになぜ byte 型 として扱えているのか？です。**
これもすぐに答えが思いつかなかったので調べてみました。

## シングルクォート(`'`)、ダブルクォート (`"`)、バッククォート(<code>`</code>) の違い

* シングルクォート(`'`): デフォルト動作は、1文字を rune (= int32) 型 で扱う。ただし、byte (=uint8) 型を明示された場合は byte 型となる。
* ダブルクォート (`"`): 文字列を string 型 で扱う + エスケープシーケンスを特殊文字として扱う (例: `\n` を改行として *扱う* )。
* バッククォート(<code>`</code>): 文字列を string 型 で扱う + エスケープシーケンスを文字列として扱う (例: <code>\n</code> を改行として *扱わない* )。


なので、`[]byte{'a', 'b', 'c'}` は、byte 型に変換された `'a'` をスライスに入れていることになります。

## 結論

下記のいずれかが、エラーを出さずにやりたいことを実現する表現となります。

* `[]byte("abc")`
* `[]byte{'a', 'b', 'c'}`
GoogleWorkspaceをIdPとしてkintoneとSAML連携する際の注意点

会社でGoogleWorkspaceとkintoneを利用しているのですが、Googleのアカウントを利用してkintoneにログインする形にできないかと考えました。

手順はGoogle、kintoneそれぞれにマニュアルがありますがお互い連携先サーバの設定についてはあまり詳しく書いていなかったりします。

https://support.google.com/a/answer/7623668

https://jp.cybozu.help/general/ja/admin/list_saml.html

# 全体の手順
1. GoogleWorkspace上で　kintoneのSAML連携アプリをインストールして設定する
1. kintoneの管理画面でSAMLログインを有効化してURLや証明書を登録する
1. GoogleWorkspace上で連携アプリを有効化する
1. SSOログインをテストする

# 手順の詳細
基本的にはGoogle側のマニュアルをベースに設定すればうまくいきます
https://support.google.com/a/answer/7623668

ただし以下の点に注意が必要です

:::note warn
kintoneだけでなくcybozuのサービスを他にも使っている場合は、URLとして"kintone.com"となっているところは"cybozu.com"に読み替えてください
:::

:::note warn
デフォルトではGMailのメールアドレスを利用してkintoneにログインする形になりますので、kintone側のアカウント名はあらかじめGMailアドレスを設定しておいてください
:::

:::note warn
kintone側でSAML連携を有効にしたとたん、ログアウトしている人全員にSAML連携によるログインが強制されます
:::

:::note warn
kintone管理画面を操作した後で同じブラウザ上でSAML連携をテストしようとすると、認証重複のためSLASH_SA02エラーになります
必ずkinoteの設定部分は別途シークレットウィンドウを開いて行なってください
:::

# まとめ
他のシステムなどもGoogleWorkspaceをIdPとしてログインができそうなので今後徐々に広げていこうと思います

https://support.google.com/a/topic/6304947?hl=ja

どうしてもGmailアドレス以外でアカウント連携したい場合は、GoogleWorkspace上でカスタム属性を作成すれば対応できそうですのでそちらも検討したいと思います

https://support.google.com/a/answer/6208725?hl=ja
【AWS】SSMパラメータストアを設定する　メモ

## パラメータストアとは？？
`AWS Systems Manager パラメータストアとは
システムで使用するパラメータや定数を切り出して定義するもの`
サービスを開発するときに環境変数やパスワードをパラメータストアから引っ張ってくることができます。

## パラメータを作成して取得してみる
今回はパラメータを取得して、コマンドライン上で取得するところまでやってみたいと思います。

***1\. AWS Systems Managerからパラメータストアにアクセス***
***2\. 「パラメータの作成」をクリック***
***3\. パラメータを作成***
* ***タイプが「文字列」の場合***
値は「サンプルのパラメータです」にしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/5585319b-879c-d9a9-d13a-5912ccf85141.png)
* ***タイプが「安全な文字列」の場合***
安全な文字列な場合値、が●になっており、暗号化されることを示します。
値は「安全な文字列です」にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/0ea05b3b-2af1-0aaf-bbce-511759ce5828.png)

***4\. コマンドラインでパラメータの確認***
コマンドラインで以下を実行するとパラメータを確認することができます。
```
$ aws ssm get-parameters --name sample

{
    "Parameters": [
        {
            "Name": "sample",
            "Type": "String",
            "Value": "サンプルのパラメータです",
            "Version": 1,
            "LastModifiedDate": "2023-01-27T13:29:45.215000+09:00",
            "ARN": ***,
            "DataType": "text"
        }
    ],
```
「サンプルのパラメータです」を取ってくることができました。

* 暗号化した方で試す
暗号化されている方の中身を見るためにはコマンドの最後に`--with-decryption `を付けてあげます。
```
$ aws ssm get-parameters --name sample_safety --with-decryption

{
    "Parameters": [
        {
            "Name": "sample_safety",
            "Type": "SecureString",
            "Value": "安全な文字列です",
            "Version": 1,
            "LastModifiedDate": "2023-01-27T13:28:17.925000+09:00",
            "ARN": ***,
            "DataType": "text"
        }
    ],
    "InvalidParameters": []
}
```
valueのところが暗号化されています。
【UE5】VRMのキャラを読み込んだ時に謎の影？が出てくる対照法

https://github.com/ruyo/VRM4U/issues/242

メモです、
この影らしきものを直します　(UE5.1です)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843707/446c448c-e27d-66ba-7f7f-03e6d27237e4.png)



モデルによるかもしれないけど、PhysicsAssetでモデル全体を覆う方法で自分は治りました。

<br>
<br>
<br>
<br>
<br>


「PHYS_〇〇」を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843707/2be26f9b-96da-45be-0dcc-3fbdb615bee8.png)

<br>
<br>
<br>
<br>
<br>

プラスボタンから、お好きな形を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843707/ab6fcc27-f92a-49c2-5d59-4a39a662ff8d.png)
あとはサイズを調整すればOK

<br>
<br>
<br>
<br>
<br>
<br>

Twitterのフォローお願いします

https://twitter.com/MapleSyrup77

<br>
<br>
<br>

参考にどうぞ

https://qiita.com/MapleSyrup77/items/0b3916ee2778541007b7
WindowsにJDKをインストールする方法

# WindowsにJDKをインストールする方法

ダウンロードサイトが古いバージョンの記事が多いため、投稿します。

## 対象

- 動作環境が以下であること
    - Windows 10 Pro
    - 64bit
        - [Windows10が32bit・64bitかを確認する方法](https://miya-system-works.com/blog/detail/119)

## JDKのダウンロード

1. Oracleのダウンロードサイト [Java Downloads（Oracle）](http://www.oracle.com/technetwork/java/javase/downloads/index.html) に遷移する
    ![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547575/736b3574-618c-cc72-7ce2-78b268a8696c.png)
1. スクロールし、Windowsタブを選択する
    ![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547575/78425b77-5b29-4c94-48d4-e3b335339920.png)
1. システムの種類が 64bit であることを確認し、jdk-xx_windows-x64_bin.exe をダウンロードする
        ![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547575/9dc65628-4f8d-13ce-95ee-c5af19386d8a.png)
Oracle Analytics Cloud： データセットを設定する。データセットの設定で"キャッシュ"にしたときの動きについてみてみる

はじめに
---
Oracle Analytics Cloud ： データセットで、データベースの表のデータアクセスの設定を"自動キャッシュ"にしたとき、レポートを実行したとき、データセットがOACのキャッシュに存在していればキャッシュを利用します。
設定でデータアクセスを"ライブ"にしているとデータベースにデータをとりにいきますが、"自動キャッシュ"にしているとOACにキャッシュされたデータを利用するので、すぐに結果を返すこともできます。いちいちデータベースに問い合わせをしないのでデータベースへの負荷も減らすことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/998687cb-4759-c0d1-97bc-637c13551a35.png)




前提
---
・データセットを作成したことがある
・開発者メニューを設定したことがある

開発者メニューは、右上部の"アカウント"をクリックし、
<img width="400" alt="{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/ae625cf1-0916-c45e-c6c6-880cef680b0f.png"/>

"拡張"をクリック、"開発者オプションの有効化"をON(右側にツマミを移動)し、保存します。
<img width="400" alt="{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/623a19a8-0a93-8b19-64b5-6a9c47c7fae1.png"/>

"自動キャッシュ"のデータセットの用意
---
データセットを作成し、データアクセスを"自動キャッシュ"設定にします。
PRODUCTS表をデータセットに追加します。"PRODUCTS"を右クリックし、右クリックメニューから"定義の編集"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/11c05eed-0ebd-df44-f315-d0c2e02590cd.png)

データ・アクセスを"自動キャッシュ"に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/11914887-15b1-ea11-4915-e719fe3ca2b9.png)

名前を付けて保存します。PRODUCTS_CACHEと入力し、OKをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/11874961-3ac1-a4ef-c21f-b86b66699406.png)

データアクセスが表示されていないことがあります。その場合は、ウィンドウの右真ん中あたりにマウスカーソルを移動すると、"展開"のツマミがあり、それをクリックすると、表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/7c471d73-f980-eb2f-9234-1b6a43ea006b.png)

ワークブックを作成する
---
PRODUCTS_CACHEのデータセットを使ってワークブックを作成します。
PRODUCTS_CACHEデータセットを開き、"ワークブックの作成"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/d8a43272-0087-41fa-3561-338604556a4e.png)

列を選択します。Ctrlキー＋列で複数列を選択できます。PROD_ID、PROD_NAMEを選択し、右の空白部分"キャンバス"にドロップします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/0db82563-4252-f2b9-c448-a95cb7c97da2.png)

ワークブックが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/0b22ae3f-c74d-1df7-0a81-feaa1c9b9a53.png)

"動き"をみてみる
---
開発者ウィンドウを開きます。
右上部の「・・・(縦)」メニューをクリックします。"開発者"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/0b938670-3313-059e-3937-a0abc2b8a23a.png)

"リフレッシュ"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/98310490-80a0-d4aa-7a23-24006c4e0e10.png)

"実行ログ"タブをクリックします。下部までスクロールすると、データベースに発行されたSQLが表示されますが"自動キャッシュ"設定の場合は、物理SQLが表示されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/1d754925-32f8-424f-1acb-06d73a8a5401.png)

"サマリー"タブをクリックします。
"問合せ時間"で、物理問合せの実行にかかった時間は0.00です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/86b8178b-1650-95c8-37df-37cd7e8b6977.png)

以上
NO.1 円グラフの追加方法

# はじめに
こちらのセクションからビジュアル（グラフ）の追加方法を説明していきます。
まずは練習用のレポートを開いて、編集ボタンを押下、データのテーブルを開いておきましょう（下記、動画参照）
![ezgif-4-61b6e0ed7f.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/832385ef-6c3d-c08e-1339-a179fa3329cd.gif)

データソースのインポートがまだの方は、こちらのリンクを参照して設定してみましょう。
[No.1 データのインポート方法](https://qiita.com/shinyasasaki/items/c9559fa9dec34fdcd9a8)

# 円グラフを追加
**1．ビルドから「円グラフ」を選択
2．テーブルを展開し、円グラフで表示したい項目を選択する（今回は「支社毎」の「売上」を確認する）
3．表示されたビジュアルを確認する**
![ezgif-5-0f81c7bfee.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/9fc1b7ea-326b-e40e-be3f-e08f4dc0ff8b.gif)

# 円グラフの編集
**1．ビジュアルの書式設定を選択
2．詳細ラベルからオプションを選択。割合の表示箇所や内容を変更
3．値が小さい場合は、文字を大きくする事が可能**
※今回は「詳細ラベル」の「オプション」→「位置」を「内側」に変更
　　　　「詳細ラベル」の「値」→フォントサイズを変更
![ezgif-5-0099a03a03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/ad271107-ad11-ee85-7c9f-c8c8bac3c349.gif)



# 円グラフの利用シーン
・全体における項目の割合を確認する
・合計値を見るには向いていないため、おおまかな傾向を使う際に利用
e.x）
売上における支社毎の割合
売上における製品毎の割合
全社員の部門毎の人数比（項目が多すぎると細分化されすぎるため注意）

# 【番外編】ドーナツグラフとの違い
円グラフの隣に「ドーナツグラフ」と呼ばれる、円グラフに似たビジュアルがあります。
こちらの違いは真ん中が空いているかどうか、というのが違いになりますが、活用方法をちょっと考えてみたいと思います。
![スクリーンショット 2023-01-27 11.53.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/4511e481-dff2-e5ad-0e4b-418ab2fc5ca6.png)

こちらがドーナツグラフです。
![スクリーンショット 2023-01-27 11.58.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/a39f1b80-0379-fc9b-9aa8-9ebba236f985.png)

カードをドーナツの穴の中に置いてみました（真ん中の数字の部分）
![スクリーンショット 2023-01-27 12.04.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/a15e1f3d-a685-0b90-e837-e4ff2687e74a.png)

特定のエリアでフィルタするとカードも同じようにフィルタリングされるため、数字が変化します。個別の割合や数字を見たい場合は便利かもしれないですね。
![スクリーンショット 2023-01-27 12.05.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/a4674c12-37ff-de03-ee74-a9f8b7986012.png)

あとはPowerPointに出力した後に、自社製品のアイコンを真ん中に置いていただいて何のグラフかわかりやすくする、、などです。
![スクリーンショット 2023-01-27 12.10.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/744d550d-a71a-eae1-326d-7b9c723465e9.png)

こちらのセッションは以上です。
[→ Power BI サービス練習帳に戻る](https://qiita.com/shinyasasaki/items/391d50c2508794e8fcfd)
No.2 レポートの説明

# はじめに
こちらの記事ではPower BI サービスのレポートの画面についてクイックに説明しています。

# 画面の説明と操作
## 1. キャンバス
レポートを開いてまず最初に表示される白い領域はキャンバスと呼ばれています。
レポートを作成するにあたり、ここのキャンバス上にグラフや表などのパーツを置いていきます。
![スクリーンショット 2023-01-25 10.54.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/340120e3-5f85-cd4b-f1a7-e040b7dd91b2.png)

## 2. ビジュアル
グラフや表などはビジュアルと呼ばれており、こちらを使って取り込んだデータの可視化をしていきます。
右側のグラフのアイコンを押すと自動的にキャンバス上に配置がされていきます。
![スクリーンショット 2023-01-25 10.58.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/3dfa5508-b951-21ca-72ec-fb2e48209ad7.png)

## 3. グリッド線
キャンバスに引かれている線の事で、こちらは設定をしておきましょう。
画面上部の「ビュー」を押して「グリッド線の表示」「グリッドに合わせる」のトグルをONにします。
※既にONになっている場合はそのままで大丈夫です。
![スクリーンショット 2023-01-25 10.56.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/b68711ab-218e-5ce2-3f8f-07b8b6b2bed1.png)

これはビジュアルをどれくらいの大きさにすべきかを考える時の目安になるので、配置が楽になります。
（グリッド線があると、ビジュアルが置きやすいです）
![スクリーンショット 2023-01-25 11.01.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/c947178f-c3f0-13a6-b99b-ab6272a4ab7c.png)

## 4. ビジュアルの削除
置いたビジュアルはDeleteキーや、ビジュアル右下の「・・・」から削除のコマンドを選択すると消せます。
テストで色々追加して邪魔になったら消しましょう。
![スクリーンショット 2023-01-25 11.05.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/5ec16d0b-8ea0-bbdc-26ad-1453df86c227.png)

## 5. ワークスペース
作成したレポートを保存しようとすると、レポートの名前と保存先の「ワークスペース」を選択する事ができますが、この「ワークスペース」というものはなんでしょうか？
![スクリーンショット 2023-01-31 8.51.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/acd2ff4e-9787-bc1c-8497-c381819f81ae.png)
こちらは作成したデータセット（Excelからインポートしたデータなど）やレポートなどを格納する「フォルダ」です。
基本的には「マイ ワークスペース」という個人の領域に保存していきましょう。
Proライセンス以上をお持ちの方は他人にレポートの共有などができますが、基本的に作成したレポートは利用している個人のみの利用に限られますのでご安心ください。
※また、Proライセンス以上であれば複数人で共有できるワークスペースも作成可能です。
![スクリーンショット 2023-01-31 8.53.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/e77db127-4ec7-19e1-79d4-c515a9aeda94.png)


細かいところの設定は他にもありますが、一旦このページで出てきた単語や操作方法を覚えてみましょう。

こちらのセッションは以上です。
[→ Power BI サービス練習帳に戻る](https://qiita.com/shinyasasaki/items/391d50c2508794e8fcfd)
Android開発中のエラー~ values-v31/values-v31.xml:4: error: resource drawable/ic_launcher_foreground 編~

アイコンを適用するために
File -> New -> Image Asset
で作成してビルドしたら以下のようなエラーが
```
~略~ values-v31/values-v31.xml:4: error: resource drawable/ic_launcher_foreground ~略~
```

values-v31.xmlでic_launcher_foregrouneが無い？

再生成やら不要そうなDirectoryやらファイルやら整理してみるも全然うまくいかず

解決方法
===
Build -> Clean Project

これでOKでした。
【コピペでOK】Tinker立ち上げる度にModelとかClassの名前空間を毎回useするのが面倒くさいのでなんとかしたい。

## はじめに
- (ほぼ)自動でエイリアスをつけてくれるファイルを作成しました
- 私の環境では config/tinker.php の設定ファイルを作るやり方だとうまくいきませんでした
- Laravelのversionによってはできないかもしれません
- コードの良し悪しはご容赦ください
- 自己責任でご利用ください

## バージョン
```
Laravel 6.18.13
```

## 手順1
- Laravelプロジェクト直下に .tinker ファイルを作ります
```
touch .tinker
```

## 手順2
- 以下をコピー
```test.php
<?php

use Illuminate\Foundation\AliasLoader;

$targetArr = [
  ['dir' => 'app/Models/*.php',  'alias' => 'App\Models\\'],   // 例) すべてのModelを対象とする
  ['dir' => 'app/Services/*.php','alias' => 'App\Services\\'], // 例) Service配下のすべてのPHPファイルを対象とする
  // ['dir' => '', 'alias' => ''], // TODO エイリアスをつけたいディレクトリと、namespaceを記述
];

function setClassAlias(Array $targetArr): void
{
  $loader = AliasLoader::getInstance();

  foreach ($targetArr as $target) {
    $targets = glob($target['dir']);

    $loadClasses = [];
    foreach ($targets as $data) {
      $loadClasses[] = basename($data, '.php');
    }

    foreach ($loadClasses as $data) {
      $loader->alias($data, $target['alias'] . $data);
    }
  }
}

setClassAlias($targetArr);
```

## 手順3
- さっき作った .tinker ファイルに貼り付ける

## 手順4
- $targetArr の中にエイリアスをつけたい対象のディレクトリを追加する（不要なら削除する）
- 以上で設定は完了

## 手順5
- Tinkerを実行します
- 作成したファイルである .tinker をつけるのをお忘れなく
```
php artisan tinker .tinker
```

## おわり
指定したディレクトリについては、エイリアスが作成されます。
例えば、以下のようにuseなしでModelを入力し始めることができます。

```:tinker
>>> Post::first()

=> App\Models\Post {#6054
     id: 1,
     nm: "xxxx",
   }
```

それでは、よきティンカーライフを!!

## おまけ
日付を取得したりできる、Carbon の追加は以下です。
$targetArr に足してあげてください。

```.php
  ['dir' => 'vendor/laravel/framework/src/Illuminate/Support/Carbon.php', 'alias' => 'Illuminate\Support\\'],
```

##
弊社ダイアログではエンジニアを募集しております。
カジュアル面談など随時行っていますので、ちょっとでも気になった方はご連絡ください！
Explorer v0.5.0 に追加された DataFrame.describe で基本統計量を取得する

## はじめに

Explorer は Elixir でデータ分析をするためのモジュールです

https://github.com/elixir-nx/explorer

Python でいうところの pandas、 R でいうところの tidyverse に当たります

私も今までにいくつか記事を書いています

https://qiita.com/RyoWakabayashi/items/dfb5495b9c25eff710a2

https://qiita.com/RyoWakabayashi/items/a06ae639337726be2e9d

2023/01/13 に Explorer の v0.5.0 がリリースされました

https://github.com/elixir-nx/explorer/releases/tag/v0.5.0

その中に DataFrame.describe の追加があり、これが非常に便利なので記事に残しておきます

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/explorer/describe.livemd

## Livebook での実行

pandas の describe と同じ機能です

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.describe.html

https://hexdocs.pm/explorer/0.5.0/Explorer.DataFrame.html#describe/2

データフレームの各列について、以下の基本統計量を返してくれます

- count: 件数
- mean: 平均値
- std: [標準偏差](https://bellcurve.jp/statistics/glossary/1193.html)
- min: 最小値
- 25%: 25[パーセンタイル](https://bellcurve.jp/statistics/glossary/1388.html)
- 50%: 中央値（50パーセンタイル）
- 75%: 75パーセンタイル
- max:　最大値

実際に Livebook で使ってみましょう

### セットアップ

Explorer と Kino をインストールします

```elixir
Mix.install([
  {:explorer, "~> 0.5"},
  {:kino, "~> 0.8"}
])
```

エイリアスを付けておきます

```elixir
alias Explorer.DataFrame
alias Explorer.Datasets
alias Explorer.Series
```

### データの準備

ワインデータセットを使います

```elixir
wine_df = Datasets.wine()

Kino.DataTable.new(wine_df)
```

![wine_df.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/77533834-f727-2814-3379-907a158d7ab2.png)

178 本のワインについて、それぞれの種類（class）と各種成分を持っています

### describe の実行

データセットに対して describe を実行してみます

```elixir
wine_df
|> DataFrame.describe()
|> Kino.DataTable.new()
```

![スクリーンショット 2023-01-27 11.55.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/db6adbf7-76e2-a54c-eed6-7f2d61fd3fd3.png)

各列毎に基本統計量が表示できました

データの性質をザックリ把握したいときに非常に便利です

以前は[自分で組む必要がありました](https://qiita.com/RyoWakabayashi/items/a06ae639337726be2e9d#%E7%B5%B1%E8%A8%88%E6%83%85%E5%A0%B1%E3%81%AE%E5%8F%96%E5%BE%97)

### パーセンタイルの指定

パーセンタイルについては任意の位置を指定できます

```elixir
wine_df
|> DataFrame.describe(percentiles: [0.33, 0.66])
|> Kino.DataTable.new()
```

![percentiles.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/b09b0e4a-38a6-4560-cc2d-363f6d84ac08.png)

### 文字列の扱い

文字列に対してはどうなるか見たいので、別のデータセットを使います

```elixir
fuels_df = Datasets.fossil_fuels()

Kino.DataTable.new(fuels_df)
```

![fuels.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/c20adf46-6ee7-3b44-08a6-87fa9a5fd828.png)

年毎、国毎の化石燃料由来 CO2 排出量のデータセットです

これに対して describe を実行します

```elixir
fuels_df
|> DataFrame.describe()
|> Kino.DataTable.new()
```

![fuels_describe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/6a161983-4ce2-7259-b139-4798c45d7923.png)

文字列型の country は件数以外 `nil` になりました

## まとめ

簡単に基本統計量を表示できるので、最初にデータのおおよその傾向を見るときに便利ですね
git初ブランチまで

今後git○○が出てくるときは、VSCodeのターミナルで操作しているとします。

１. 現在のbranchを確認する
```terminal
git branch -a
```

２. git branch 好きな名前 でbranchを制作する。(今回のbranch名はobjectとする)
```terminal
git branch object
```

３. 新しいbranchにコミットを追加していくために、新しいbranchに移動
```terminal
git checkout object
```
ちなみに、2. 3.を同時に行うこともできます。
```terminal
git checkout -b object
```

４. 変更したファイルすべてをcommitする
```terminal
git add *
git commit -m "commit to new branch !!"
```

５. commitしたファイルをリモートブランチにpushする
```terminal
git push origin object
//(objectとは今回作成したbranch名)
or
git push origin HEAD
//(HEADとは現在いるbranchのこと)
```
PHPファイルでファビコンが表示されなくて困った話

画像のURLとかもあっていて1つだけファビコンが表示されなくて困った。
原因はデバッグ用にpreタグをそのまま出力していたこと。

```
echo '<pre>';
//var_dump($show_data);
echo '</pre>';
```

なぜ表示されないのかは謎ですが、調べても出てこない内容なので同じことで詰まっている人の救いになれば幸いです。
Python（書くのが）速いものたち

https://toriidao.hateblo.jp/entry/2023/01/24/121216

　この記事を読んで感銘を受けたので、「Python 速いものたち」をまとめようと思いましたが、よく考えたら **Python は速くない**ので、（書くのが）速いものたちをまとめました。

# 文字列操作

- 文字のカウント `count`
- 文字を置き換える `replace`
  - 正規表現を組み合わせた `re.sub` は更に強力
- 区切り文字でリスト化 `split`
- 小文字大文字間の変換が容易

```python
import re

s = 'Python is fast to write'
print(s.count('t')) # 4
print(s.replace('t','T')) # PyThon is fasT To wriTe
print(re.sub('[aiueo]','x',s)) # Pythxn xs fxst tx wrxtx
print(s.split(' ')) # ['Python', 'is', 'fast', 'to', 'write']
print(s.upper()) # PYTHON IS FAST TO WRITE
```

### 瞬殺できる問題

- [B - Cat](https://atcoder.jp/contests/abc286/tasks/abc286_b)

# スライス

- 部分文字列が書きやすい
- 末尾を超えた分を自動で省略してくれるのも便利

```python
s = 'Python is fast to write'
print(len(s)) # 23
for i in range(5):
    print(s[:(i+1)*5])
# Pytho
# Python is
# Python is fast
# Python is fast to wr
# Python is fast to write
# 最後の出力は文字列長を超えている点に注意
```

### 瞬殺できる問題

- [A - DISCO presents ディスカバリーチャンネルプログラミングコンテスト 2016](https://atcoder.jp/contests/discovery2016-qual/tasks/discovery_2016_qual_a)

# itertools

　全探索も順列もこれ一発ですべて解決。

```python
import itertools

a = [0,1,2]
print(*itertools.product(a,repeat=2))
# (0, 0) (0, 1) (0, 2) (1, 0) (1, 1) (1, 2) (2, 0) (2, 1) (2, 2)
print(*itertools.permutations(a))
# (0, 1, 2) (0, 2, 1) (1, 0, 2) (1, 2, 0) (2, 0, 1) (2, 1, 0)
```
### 瞬殺できる問題

- [C - 数を3つ選ぶマン](https://atcoder.jp/contests/abc028/tasks/abc028_c)

# 複数変数の一括処理
- `a, b, c = list(map(int, input().split(' ')))` みたいなやつ。
- 出力する時も `print(a, b, c)` でよい。
- `a, b, c = b, c, a` みたいにスワップもできる。

```python
a, b, c = 0, 1, 2
print(a, b, c) # 0 1 2
a, b, c = b, c, a
print(a, b, c) # 1 2 0
```

# リスト内包表記
- リストの変数に一括して処理を行いたい時に便利
  - 1-indexed の入力を 0-indexed に直す
  - 条件に抽出するものだけを残す
  - etc

```python
a = [1,2,3,4,5]
print([i-1 for i in a]) # 0-indexed に直す
# [0, 1, 2, 3, 4]
print([i for i in a if i%2]) # 奇数だけ抽出
# [1, 3, 5]
```

# 全体的な注意点

　Python は速く書くことができるが、実行速度が速くなる訳ではない。いかにも $O(1)$ で出来ますよみたいな顔をしているが、実際は $O(N)$ かかっていたりするので注意。
[Go] 型変換 & 型アサーション の使い方がすぐに思い出せない場合は、こちらから公式サンプルページへ



## 型変換 (Type Conversion)


変数v, 型T があった場合、T(v) は 変数v を T型へ変換します。

```go
i := 42         // int

// 型(変数) で型変換
f := float64(i) // float
u := uint(f)    // uint
```

A Tour of Go のページ

https://go-tour-jp.appspot.com/basics/13


The Go Programming Language Specification のページ

https://go.dev/ref/spec#Conversions


## 型アサーション (Type Assertion)

インターフェース型i を 型T に変換

```go
// t, ok := i.(T)

var i interface{} = "hello"

s, ok := i.(string) // s は string 型 で "hello" を保持
fmt.Println(s, ok)
```

A Tour of Go のページ

https://go-tour-jp.appspot.com/methods/15

Effective Go のページ

https://go.dev/doc/effective_go#interface_conversions

The Go Programming Language Specification のページ

https://go.dev/ref/spec#Type_assertions

## ちなみに

調べて分かったことは、「型キャスト (Type Casting)」という言葉は、公式には使われていないようです。
検索に引っかかりませんでした。
[Ubuntu Server 22.04]　CLI からデスクトップの解像度を変更する

## <font color="MediumVioletRed">注意事項</font>
**リンク先に記載**

**[[Ubuntu Server 22.04] 個人的初期設定 覚書](https://qiita.com/QiitaYkuyo/items/54cf4dc7acab59074a5e)**

#### 「目次」
**CLI からデスクトップの解像度を変更する**
　　**[説明](#説明)**
　　**[前提](#前提)**
　　**[解像度変更のやり方](#解像度変更のやり方)**
　　　　**[0.GNOME Desktop を起動しておく](#0gnome-desktop-を起動しておく)**
　　　　**[1.ディスプレイ名を取得](#1ディスプレイ名を取得)**
　　　　**[2.変更可能な解像度一覧を取得](#2変更可能な解像度一覧を取得)**
　　　　**[3.実際に設定する](#3実際に設定する)**
　　　　**[備考](#備考)**
　　**[引用元、参照元、参考先](#引用元参照元参考先)**

#### 「説明」
　Ubuntu 22.04 における GNOME Desktop の解像度変更方法です。

#### 「前提」
　Wayland であること

#### 解像度変更のやり方
以下の記事からスクリプトを利用させていただきました。

https://smile-jsp.hateblo.jp/entry/2021/05/04/223356

##### 0.GNOME Desktop を起動しておく
```sudo systemctl start gdm3```
※一度、RDP でも コンソール でも良いですが、デスクトップの画面を表示させといた方が良さそうです。

##### 1.ディスプレイ名を取得
```bash:bash
gdbus call --session \
           --dest org.gnome.Mutter.DisplayConfig \
           --object-path /org/gnome/Mutter/DisplayConfig \
           --method org.gnome.Mutter.DisplayConfig.GetResources \
          | tr -s '>,' '\n' \
          | grep 'display-name' \
          | awk -F "[\\\\'<]*" '{$1=""; print $0}'
```

##### 2.変更可能な解像度一覧を取得
```bash:bash
# tail に指定する行番号は、各自調整してください。
gdbus call --session \
           --dest org.gnome.Mutter.DisplayConfig \
           --object-path /org/gnome/Mutter/DisplayConfig \
           --method org.gnome.Mutter.DisplayConfig.GetResources \
          | tr -d '\n' \
          | sed 's/'\),'/'\)\\n'/g' \
          | tail -n +4 \
          > resolution_list.txt

# "横　縦　フレームレート"　で表示されます。
sort -t "," -k 3 -k 4 -n resolution_list.txt | awk -F ', ' '{print $3,$4,$5}'
```

##### 3.実際に設定する
　※フレームレートが 60.0 等の小数点以下が 0 の場合には、小数点以下を省略してください。
フレームレートの例）
resolution="1600x900@60"
resolution="1280x720@60"
resolution="640x480@59.940475463867188"
```bash:bash
‘’display_name="ディスプレイ名"
‘’resolution=" 横 x 縦 @ フレームレート "

例）
display_name="HDMI"
resolution="1280x720@60"

serial="$(gdbus call \
    --session \
    --dest org.gnome.Mutter.DisplayConfig \
    --object-path /org/gnome/Mutter/DisplayConfig \
    --method org.gnome.Mutter.DisplayConfig.GetResources | awk '{print $2}' | tr -d ',')"
echo $serial

gdbus call --session \
           --dest org.gnome.Mutter.DisplayConfig \
           --object-path /org/gnome/Mutter/DisplayConfig \
           --method org.gnome.Mutter.DisplayConfig.ApplyMonitorsConfig \
          $serial 1 "[(0, 0, 1, 0, true, [('$display_name', '$resolution', [] )] )]" "[]"
```

##### 備考
・設定した解像度の確認
　`cat ~/.config/monitors.xml`
・うまくいかない場合は、RDP 接続した状態でコマンドを実行するか、
　接続先の ターミナル アプリ から実行してみてください。

#### 引用元、参照元、参考先
Wayland でのコマンドラインによる解像度変更
・https://smile-jsp.hateblo.jp/entry/2021/05/04/223356
HiDPI
・https://wiki.archlinux.jp/index.php/HiDPI

awk: warning: escape sequence \`\]' treated as plain \`]'
・https://stackoverflow.com/questions/25867060/awk-warning-escape-sequence-treated-as-plain/25867768#25867768
Bashコマンドawkで全てのカラムを出力
・https://yuis-programming.com/?p=1305
sed コマンドで改行コードを置換したり削除する方法
・https://webbibouroku.com/Blog/Article/sed-crlf-lf
sortコマンドについて詳しくまとめました 【Linuxコマンド集】
・https://eng-entrance.com/linux-command-sort
数当てゲーム(Powershell)

Powershellを使った簡単な数当てゲームを作りました

```Powershell
#入力関数
function read(){
    $input = Read-Host("1から10までの整数を入力してください")
    return $input
}
#1から10までの整数をランダムに作成する
$ans = Get-Random -Minimum 1 -Maximum 10
#入力した数字変数
$input1 = 0
#入力回数
$cnt = 0
#正解、不正解フラグ(0は正解,1は不正解)
$sw = 0

while ($cnt -lt 3){
    $input1 = read    
    if ($input1 -lt 1 -and $input1 -gt 10)  {
        Write-Host "1から10までの整数を入力してください"
    } else {
       $cnt++
       if($input1 -eq $ans){
            Write-Host("${cnt}回目で正解です")
            break
       } else {
            Write-Host("不正解です")
            if ($cnt -eq 3){
                $sw = 1
                Write-Host("${cnt}回不正解でした")
                break
            }
       }
    }
}        

if($sw = 1){
    Write-Host("正解は${ans}です")
}
```
こんな感じで実装しました。
neosでlogix その98

# 概要
neosでlogixやってみる。
logixを、俺コードで表現してみる。

# 参考にしたページ

https://qiita.com/ohisama@github/items/27c7a14ae5b0618a1c49

# 俺コード

```

Box = ButtonEvents TouchButton
	|> PlayOneShot SineWaveClip

```

以上。
neosでlogix その97

# 概要
neosでlogixやってみる。
logixを、俺コードで表現してみる。

# 参考にしたページ

https://qiita.com/ohisama@github/items/60daa87fe80f0f221813


# 俺コード

```

Box.CharacterController.SimulatingUser = ButtonEvents
	|> local user
	|> Write Ref
	|> Set Character Velocity 0 5 0


```

以上。
neosでlogix その96

# 概要
neosでlogixやってみる。
logixを、俺コードで表現してみる。

# 参考にしたページ

https://qiita.com/ohisama@github/items/1f6d5034013a35512060


# 俺コード

```
Box.CharacterController.SimulatingUser = KeyHeld BackSpace
	|> FireOnTrue
	|> WriteRef LocalUser
	|> SetCharactorVelocity 0 5 0


```


以上。
Python　気持ちが悪い、引数への値の渡し方

下のコードにおいて、「気持ちが悪い」とコメントしたところ。ちゃんと動くが、気持ちが悪い。


```Python
def func(a, b, c=3, d=4):
    print(a, b, c, d)

# OK
func(1, 2)
# 1 2 3 4

# OK
func(1, 2, c=-1, d=5)
# 1 2 -1 5

# OK
func(1, 2, d=5, c=-1)
# 1 2 -1 5

# 気持ちが悪い
func(1, 2, -1)
# 1 2 -1 4

# 気持ちが悪い
func(1, 2, -1, 5)
# 1 2 -1 5

# 気持ちが悪い
func(a=1, b=2)
# 1 2 3 4

# 気持ちが悪い
func(b=2, a=1)
# 1 2 3 4

# 気持ちが悪い
func(c=-1, b=2, a=1)
# 1 2 -1 4
```

一応、下のようにすれば、「気持ちが悪い」のパターンでerrorを発生させることができるらしい。

```Python
def func2(a, b, /, * , c=3, d=4):
    print(a, b, c, d)

# OK
func2(1, 2)
# 1 2 3 4

# 気持ちが悪い
func2(c=-1, b=2, a=1)
# TypeError: func() got some positional-only arguments passed as keyword arguments: 'a, b'
```

参考：https://docs.python.org/ja/3.8/whatsnew/3.8.html
Kong GatewayのPlugin Ordering機能を試す

Kong GatewayのPoCをやっている時に、ある問題に遭いました。
PoCの要件は以下になる
- Key-authプラグインでGateway全体を保護
- Request-transformerプラグインで必要なAPI KeyをHeaderに付与し認証を突破

二つのプラグインを設定した後、API keyをrequestに追加されても認証されない

~~~
# key-auth is enabled
❯ http --header localhost:8000/demo | head -1
HTTP/1.1 401 Unauthorized

# Got 401 after creating request-transformer-adv plugin.
❯ curl -X POST http://localhost:8001/services/testsvc/plugins \
    --data "name=request-transformer-advanced"  \
    --data "config.add.headers=apikey:wenhandemo"
...
❯ http --header localhost:8000/demo | head -1
HTTP/1.1 401 Unauthorized
~~~

理由を調べたら、どうやらPluginのデフォルトの実行順番があるらしいです。

https://docs.konghq.com/gateway/latest/plugin-development/custom-logic/#plugins-execution-order

key-authのプライオリティは`1250`、request-transformer-advの`801`より高いです。よってkey-authが実行するときに、Headerに必要なAPI Keyがまだ付与されていない状態になります。

解決方法として、Kong Gateway 3.0に新しく追加された機能、plugin orderingでプラグインの実行順番を明示すればOKです。

https://docs.konghq.com/gateway/3.0.x/kong-enterprise/plugin-ordering/get-started/

よしでは実装してみよう。`request-transformer-advanced`のプラグインを設定するときに、`key-auth`の前にすると宣言します。

```
❯ curl -X POST http://localhost:8001/services/testsvc/plugins \
    --data "name=request-transformer-advanced"  \
    --data "config.add.headers=apikey:wenhandemo" \
    --data "ordering.before.access=key-auth"
...
❯ http --header localhost:8000/demo | head -1
HTTP/1.1 200 OK
```

ジャジャン♪
DockのアイコンからNotification Badgeを取得するAppleScript

アプリケーションアイコンのバッジの内容、無ければmissing valueが返ります。

名前で取得する場合（`whose`使用）
```AppleScript
tell application "System Events" to set myBadge to get value of attribute "AXStatusLabel" of item 1 of (UI elements of list 1 of application process "Dock" whose name = "アプリのなまえ")
```


Dock内の位置で指定する場合
`get value`以下を次に変更
`UI element 1`を上から（左から）数えて指定（ちょっと速い）

```AppleScript
get value of attribute "AXStatusLabel" of UI element 1 of list 1 of application process "Dock"
```

例えば、Dockは隠しているけど、メニューバーに通知状態を表示したいとき。
xbarのプラグインとしてこうするとメニューバーにdockバッヂ状況を表示できます。

```shell 
#!/bin/bash

osascript -e 'if get running of application id "アプリのbundle ID" is false then return "起動してないよ"' -e 'try' -e 'tell application "System Events" to set myBadge to get value of attribute "AXStatusLabel" of item 1 of UI elements 「Dock内の位置だよ」 of list 1 of application process "Dock"' -e 'if myBadge = missing value then' -e 'return "何もないよ"' -e 'else' -e '	return "バッヂがついてるよ"' -e 'end if' -e 'end try'
```
プリザンターを公式Dockerイメージで動かす

## プリザンターの公式Dockerイメージが公開中

公式Dockerイメージが公開されています。

- [implem/pleasanter | Docker Hub](https://hub.docker.com/r/implem/pleasanter/tags)

さっそく使ってみます。

## Dockerを使えるようにする

まずはDockerを使えるようにしてください。

このエントリ内では`docker`コマンドを`sudo`なしで記述しています。各自の環境に合わせて実行してください。

## 準備

~~1. データベース初期化クエリの作成~~

**※2023/10/05 記述を削除しました。**

1. 環境変数を指定するファイルの作成

   必要な環境変数を設定します。  
   コンテナに渡す環境変数は`docker run`実行時に引数で指定しますが、まとめてファイルに書いてもいいのでこれを用意します。
   `env-list`として以下の内容で作成します。

   ```text
    Implem.Pleasanter_Rds_PostgreSQL_SaConnectionString=Server=db;Database=postgres;UID=postgres;PWD=<Any Sa password>
    Implem.Pleasanter_Rds_PostgreSQL_OwnerConnectionString=Server=db;Database=#ServiceName#;UID=#ServiceName#_Owner;PWD=<Any Owner password>
    Implem.Pleasanter_Rds_PostgreSQL_UserConnectionString=Server=db;Database=#ServiceName#;UID=#ServiceName#_User;PWD=<Any User password>
   ```

   `PWD`は接続先DBの各ユーザのパスワードです。それぞれ書きかえてください。

1. ファイル配置はこうなります。

    ```text
    .
    +-- env-list
    ```

## 実行

準備が整いましたので実行していきます。

1. Dockerネットワークを作成

   ```shell
   docker network create pleasanter-net
   ```

1. PostgreSQL起動

   ```shell
   docker run --rm -d --network pleasanter-net \
       --name db \
       --env POSTGRES_USER=postgres \
       --env POSTGRES_PASSWORD=<Any Sa password> \
       --env POSTGRES_DB=postgres \
       postgres:15
   ```

1. CodeDefiner実行

   ```shell
   docker run --rm --network pleasanter-net \
       --name codedefiner \
       --env-file env-list \
       implem/pleasanter:codedefiner _rds
   ```

1. Pleasanter起動

   ```shell
   docker run --rm --network pleasanter-net \
       --name pleasanter \
       --env-file env-list \
       -p 50001:80 \
       implem/pleasanter
   ```

## アクセスする

Pleasanterの起動時に`-p`で指定している`50001`がアクセス先のポート番号です。お使いの環境に合わせて変更してください。  
ではアクセスします <http://localhost:50001/>

いかがですか？ いつものログイン画面が表示されましたでしょうか。  
では初期ユーザ、初期パスワードを入力します。

- ユーザ: `Administrator`
- パスワード: `pleasanter`

ログインしますとパスワード変更を求められますので入力してください。

## 終了する

Pleasanterを起動した画面で`Ctrl-C`とするとコンテナを終了できます。  
作成したリソースを削除して終了します。

   ```shell
   docker stop db
   docker network rm pleasanter-net
   ```

`docker ps`で確認すると綺麗に消えているのがわかります。

## あとがき

プリザンターを動かす方法はいろいろありますが、Dockerで動かす場合でもビルドが必要で時間がかかっていました。  
今回、一番簡単な`docker run`による実行方法をまとめました。  

更に最新版のプリザンターを手軽に試せるようになったのでどんどん試してみてください。

## 参考エントリ

- [PleasanterをDockerで動かす \- Qiita](https://qiita.com/imp-kawano/items/3bd23f0139a53957134b)
[Flutter] Depend on referenced packages.のwarningの治し方の一例

![flutter-logo-sharing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/f026f2d9-7f9f-0651-8562-3ed8adda9b70.png)


こんにちわ。いせきです。最近、FlutterForwardがありましたね。僕はまだまだの実力なので見てもわからないと思い、寝ていました。。。笑
あとで確認してみようと思います。

さて、今回は、`Depend on referenced packages`のWarningの治し方の一例をご紹介します。
⚠︎Warningなので、直しても直さなくても問題はありません。あくまでのいいコードにするための一つの方法だと思っていただけると幸いです。


# Depend on referenced packagesの解明

翻訳をしてみましょう
<b>「Depend on referenced packages」</b>
<b>「参照するパッケージに依存する」 for deepl</b>

ここだけじゃわかりませんね。

次にこちらのサイトを見てみましょう

https://dart-lang.github.io/linter/lints/depend_on_referenced_packages.html

こちらのサイトによると、、、、

<b>「参照するパッケージに明示的に依存することで、それらが常に存在することが保証され、依存関係の制約をそれらに設定して、重大な変更から保護することができます。」</b>


なるほど。。。。僕なりにわかりやすい理由を考えてみましたので共有します。

<b>「たまたま、　別で入れたパッケージでwarningのパッケージを使用しているため、作成したファイルでも使用できちゃっている」ということだと考えています。</b>


どうでしょうか？理解できましたでしょうか？少しでもわかったと思ってもらえたら嬉しいです！


# warningを修正する方法

１、warningしているPackageを探す。
２、Packageを`pubspec.yaml`に入れる。
３、pubgetをすると、消える！!


# 最後に
最近は、インプットが増えすぎて渋滞している状態です。どんどんアウトプットしていきます！！


# 参考文献

https://dart-lang.github.io/linter/lints/depend_on_referenced_packages.html
ジェネリック関数でキャストを実行する

自分メモ。キャストに失敗した場合はコールバック関数を呼び出す。
```
public static class ObjectExtentions
{
    public static E Cast2Enum<E> (this object self, E defVal, Action<object, E> callback = null)
    {
        if (!Enum.IsDefined(typeof(E), int.Parse(self.ToString())))
        {
            if (callback != null) callback(self, defVal);
            return defVal;
        }
        return (E)Enum.Parse(typeof(E), self.ToString(), true);
    }
}
```
実数x,yで、x^2+y^2=1をみたすyの最大値?

wolframalphaに最大値がありました。

https://www.wolframalpha.com/input?i=-x%5E2%2B1&lang=ja

# 参考

https://www.wolframalpha.com/input?i=x%5E2%2By%5E2%3D1%2Cy%E3%81%AE%E6%9C%80%E5%A4%A7%E5%80%A4&lang=ja



https://www.wolframalpha.com/input?i=x%5E2%2By%5E2%3D1&lang=ja



https://www.wolframalpha.com/input?i=y%3D%E2%88%9A%281-x%5E2%29&lang=ja


y^2=-(x-0)^2+1 数Iの「2次関数」の平方完成
Ruby 配列

# 配列とは
１つの変数で複数の値を持つことができる値。
配列の中には、複数の値を入れることができ、順番で値を管理します。

### 配列の宣言
```
変数 = []
```
<br>
<br>
例

```ruby
fruits = ["りんご", "みかん", "いちご"]
puts fruits
```
```
# ターミナル出力
りんご
みかん
いちご
```

<br>
fruitsという変数に、バナナという要素を追加してみます。

```ruby
fruits = ["りんご", "みかん", "いちご"]
fruits << "バナナ"
puts fruits
```

```
# ターミナル出力
りんご
みかん
いちご
バナナ
```
このように、配列演算子<<を使って配列に要素を追加することができます。
Azure Administrator(AZ-104)：Azure での ID とガバナンスの管理「Azure Policy」

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

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

※前回の投稿は下記から確認できます。
[Azure Administrator(AZ-104)：Azure での ID とガバナンスの管理「管理グループ」](https://qiita.com/fsd-jume/items/98d61193f8cf9b71a09a)

## Azure Policy
・ポリシーの作成/割り当て/管理に使用できるAzureサービス
・リソースに対して規則を適用し、企業のコンプライアンス標準やSLAを満たすことが可能
⇒リソースに対する評価やスキャンが自動で実施される

### Azure Policyの利点
**◆規則のコンプライアンスの適用**
・組み込みポリシーを有効にするか、すべてのリソースに対するカスタムポリシーを作成
⇒リアルタイムなポリシー適用と評価、定期的/オンデマンドなコンプライアンス評価を実施
・リソースの評価が行われるタイミング
　-スコープに対するポリシー/イニシアティブの新規割り当て時
　-スコープに割り当て済みのポリシー/イニシアティブ更新時
　-ARM/REST APIを介した割り当てによるスコープ内リソースの作成/更新時
　-標準のコンプライアンス評価サイクル(24時間に1回)
　-ユーザによる任意のタイミング

**◆ポリシーの大規模な適用**
・管理グループにポリシーを適用することで、管理グループ下すべてに適用可能
・イニシアティブ定義で複数のポリシーをグループ化可能
⇒イニシアティブ定義を適用することでポリシーをまとめて適用可能
・評価の対象から外す除外設定も可能

**◆修復の実行**
・ポリシーに準拠していないリソースを修復して準拠状態にすることが可能
・リアルタイムの修復や既存リソースの修復が可能

**◆ガバナンスの実行**
・環境のガバナンスタスクを実装
　-複数のエンジニアリングチーム(環境内での展開と運用)をサポート
　-複数のサブスクリプションの管理
　-クラウドリソースの構成方法を標準化
　-規制コンプライアンス/コスト管理/セキュリティ/設計の一貫性管理

### Azure Policy使用時の考慮事項
**◆デプロイ可能なリソースを検討**
・組織がデプロイ可能なリソースの種類を指定
・組織がデプロイ可能なVM SKUセットを指定

**◆場所の制限を検討**
・リソースデプロイ時にユーザが指定できる場所を制限
・組織が使用可能なリージョンを選択

**◆規則の適用を検討**
・リソース/ユーザオプションの管理に役立つコンプライアンス規則と構成オプションを適用
・必要なタグをリソースに対して適用し、許可された値を定義可能

**◆インベントリ監査を検討**
・VM上のAzure Backupサービスでインベントリ監査を実行可能

## 次の学習内容
**◆Azure Policyの作成手順**

https://qiita.com/fsd-jume/items/2dc2ebb326afa77afbc3

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

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
Googleプロジェクト管理：スプリントレビュー

# はじめに

わたしが [Google プロジェクト管理:プロフェッショナル認定証で得られた素晴らしい体験][google]を、要点をまとめ小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ ***"Google プロジェクト管理:プロフェッショナル認定証"*** を受講してみてください。

[google]: https://qiita.com/mapami/items/317ae776a2268fd54c8f

https://jp.coursera.org/professional-certificates/google-project-management

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/1c9e3622-d11d-e6dd-1bb7-f12b3fef8845.png" width="800">

[アジャイルマニフェストの原則][ref1]の1つに、

***<font color="MediumVioletRed">「情報を伝えるもっとも効率的で効果的な方法は、フェイス・トゥ・フェイスで話をすることです」</font>***

があります。スプリント後のスプリントレビューを通して、チームとコミュニケーションをとることについて説明します。

[ref1]: https://agilemanifesto.org/iso/ja/principles.html

# スプリントレビュー

スプリントが終了すると、チームはスプリントレビューと呼ばれる別のイベントを完了します。このスプリントイベントは、[スクラムの柱である検査と適応][ref2]にとって重要であり、 [公開、勇気、そして尊重という価値][ref3]を実証するものです。

[ref2]: https://qiita.com/masami-atwvn/items/14d89704c39637c86051
[ref3]: https://qiita.com/masami-atwvn/items/defb8bbabfd12159c898

スプリントレビューは、スクラムチーム全体が参加するミーティングで、プロダクトのデモを行い、どの部分が完成していて、どの部分が完成していないかを判断するものです。

スプリントレビューでは、開発チームとプロダクトオーナーがこの検査と議論に大きな役割を果たします。また、プロダクトバックログのどの項目が完了したとみなされるべきかを調査し、プロダクトをデモして検査します。

スプリントレビューは、本当に楽しくて高揚感のあるものでなければなりません。スプリントレビューは、チームが過去1週間から4週間の間に達成したクールな事柄を互いに印象付ける場です。この時間枠のミーティングは　***<font color="MediumBlue">4時間</font>*** を超えてはならず、チームが完成した仕事についてフィードバックをすることで、スクラムの価値観である公開と尊敬を実践する良い機会です。

:::note info
多くの場合、スプリントレビューから素晴らしい製品のアイデアが生まれます。
:::

# サンプル

Virtual Verdeチームは、ホームオフィスの植物を特集した新しいウェブサイトページを立ち上げる必要があります。スクラムチームにマーケティングの専門家がいると想像してみよう。

8月のスプリントレビューミーティングで、スプリントバックログアイテムの1つは、既存のPlant Palsの法人顧客に彼らの新しい冒険について送るためのローンチメールを作成することでした。

スプリントレビューミーティングで、チームはメールのデモを受けます。共有スクリーンにメールを表示し、その場でスペシャリストにフィードバックを与えます。

- この冒頭の文章はとてもいいですね、相手を引き込みます。
- 冒頭の画像をもっと大きくしましょう。
- 受信者が友人に転送しやすいようにしましょう。
- この文章をもっと短くできませんか？　ちょっと長いな。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/e578502f-cd2e-0966-da01-bb1f4e5ba4c9.png" width="500">

このように、チームの成果物をグループで確認することは、単にマーケティングメールの質を高めるだけでなく、多くのメリットがあります。

- ***<font color="MediumBlue">フィードバックを可能な限り即座に行う</font>*** ことができます。各自でレビューして、後でフィードバックを送るのを待つ必要はありません。
- 全員が発言することで、製品立ち上げのあらゆる側面で ***<font color="MediumBlue">当事者意識</font>*** を共有することにつながります。
- マーケティングチームのメンバーがどのように仕事をしているかを知ることができ、***<font color="MediumBlue">チームメンバー間の信頼と理解</font>***　を深めることができます。

# プロダクトインクリメント

スプリントレビューは、チームが達成したことを実証する場です。また、スプリントレビューは、プロダクトインクリメントと呼ばれるものをチームメンバーが発表する場でもあります。プロダクトインクリメントとは、あるスプリントの後に作られるもので、リリース可能であると考えられているものです。

プロダクトは、チームが実装された一連の機能または要件を持つ最小限のプロダクト（***<font color="MediumBlue">MVP</font>*** : Minimum viable product）を開発したときにリリース可能となります。最小限の機能を持つ製品とは、初期の顧客を満足させるのに十分な機能を持つ製品のことです。

各スプリントの終わりには、Doneの定義を満たしたアイテムだけがプロダクトインクリメントの一部とみなされる。Doneでないものはプロダクトバックログに戻されます。
QGISのジオリファレンサがレイヤメニューの方に移動していた(ベクタレイヤもできるようになっていた)

# QGISのジオリファレンサ機能
QGISのジオリファレンサ機能はいわゆるラスタに幾何補正をかける機能として有名ですが、先日久しぶりに使おうと思ったらラスタメニューに見当たりませんでした。

# レイヤメニューに移動したジオリファレンサ機能
探してみたらどのバージョンからは分かりませんがレイヤメニューの方に移動していました。

# ベクタレイヤも読み込めるようになっていた
ラスタ読み込みボタンの右側にベクタ読み込みボタンができていました。
確かにベクタデータも読み込めるようになったようです。

QGISのジオリファレンス機能がベクタレイヤに対応したことによって、
ヘルマート、多項式、アフィン…等の変換手法が選べることになって嬉しいです。
linuxコマンド 使用頻度の高いものメモ（投稿者の個人利用向け）

基本的には個人利用が目的、他の方のチートシートと合わせて利用してもOK

| コマンド | たまに使う<br>オプション | 使用例 |
|:-:|:-:|:-:|
|  sudo | -i  |  sudo -i(非推奨、使用する場合もあるため記載) |
|  su |   |  su ユーザ名 |
|   |   |   |


※書きかけ
wiki40b/jaをダウンロードして前処理もする

## はじめに

TensorFlowDatasetsの[wiki40b](https://www.tensorflow.org/datasets/catalog/wiki40b?hl=ja)のダウンロードが少しむずかしかったので，やり方を書きます．

## 環境構築

venvやvirtualenvなどで適当にpython3の環境を作っておく．

```
pip install tensorflow tensorflow-datasets
```

をする．tensorflowも入れないとだめみたいです．

## ダウンロード

以下のコードを実行する．文ごとに改行された単言語コーパスが得られる．

`make_data`は，ダウンロードしてきたデータを行ごとに返すイテレーターです．ダウンロードしてきたデータには，パラグラフや行の切れ目を示すトークンがいろいろ入っているので，そのままでは単言語コーパスとしては使いづらくなっています．

`get_line_data`は，行ごとに文を取り出して返すイテレーターです．`get_paragraphs`でパラグラフごとのイテレーターにして，`get_lines`で文ごとのイテレータにします．

```python
import tensorflow_datasets as tfds


def main():
    ss = ['train', 'validation', 'test']
    for s in ss:
        with open(f'{s[:5]}.txt', 'w') as f: # validationは長いのでvalidにしている
            for line in get_line_data(make_data(s)):
                print(line, file = f)


def make_data(s):
    ds = tfds.load('wiki40b/ja', split = s)
    for text in ds.as_numpy_iterator():
        lines = text['text'].decode()
        for line in lines.split('\n'):
            yield line


def get_line_data(s):
    s = get_paragraphs(s)
    s = get_lines(s)
    return s


def get_paragraphs(s):
    mode = True

    for x in s:
        x = x.strip()

        if x == '_START_ARTICLE_':
            mode = False
        elif x == '_START_SECTION_':
            mode = False
        elif x == '_START_PARAGRAPH_':
            mode = True
        elif mode and (len(x) > 0):
            yield x


def get_lines(s):
    for para in s:
        for line in para.split('_NEWLINE_'):
            if len(line) > 0:
                yield line


if __name__ == '__main__':
    main()
```

おしまい