OmniAICreator/Qiita-1.07M huggingface dataset:
日付時間の形式をStringからTimestampに変換する

Javaにおいて日付時間の形式をStringからTimestampに変更する方法

まず、java.time.format.DateTimeFormatterクラスを使ってStringからLocalDateTimeに変換します。その後、LocalDateTimeをTimestampに変換します。

以下にサンプルコードを示します。

```java
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        String strDate = "2023-07-10T15:20:00";  // この形式に注意してください: yyyy-MM-ddTHH:mm:ss

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
        LocalDateTime dateTime = LocalDateTime.parse(strDate, formatter);

        Timestamp timestamp = Timestamp.valueOf(dateTime);

        System.out.println("Timestamp: " + timestamp);
    }
}
```

このコードでは、DateTimeFormatterを使用して指定したパターン("yyyy-MM-dd'T'HH:mm:ss")に従って日付の文字列をLocalDateTimeに変換しています。次に、LocalDateTimeからTimestampに変換しています。

注: このコードは、日付の文字列が正確に"yyyy-MM-dd'T'HH:mm:ss"の形式であることを前提としています。それ以外の形式を使用する場合は、DateTimeFormatterのパターンを適切に調整する必要があります。
raty ダウンロード

### :shamrock:Gitからratyをダウンロードする。

（https://github.com/wbotelhos/raty）にアクセスし、右上の緑色の"Code"ボタンをクリックしてから"Download ZIP"を選択します。ダウンロードしたZIPファイルを解凍します。
![スクリーンショット 2023-07-09 22.33.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/cc45213f-07ae-5995-85b7-e45ff4afa6da.png)
**RatyのJavaScriptファイルのコピー**
:star:**src**ファイル内の **raty.js**を``app/jabascript``に配置する

**画像の配置**
:star:　``app/assets/images``に ダウンロードしたものの中の
　**src** ファイル内の **images**　の中身の画像を　``app/images``に配置


:star:ファイルの最後に import "../raty"; を追加し、保存します。

:::note warn 
import "../raty"; を追加する前に、 raty.js ファイルが存在し、適切なコードが記述されていることを確認してください
:::
```app/javascript/packs/application.js
import "../raty";
```
___

### :shamrock: Ratyを全てのページで使えるようにする

以下のコードを追加することで、Ratyのインスタンスを作成し、初期化する関数をグローバルスコープ（この場合は window オブジェクト）に追加します。
``app/javascript/packs/application.js``
```diff_javascript
// This file is automatically compiled by Webpack, along with any other files
// present in this directory. You're encouraged to place your actual application logic in
// a relevant structure within app/javascript and only use these pack files to reference
// that code so it'll be compiled.

import Rails from "@rails/ujs"
import Turbolinks from "turbolinks"
import * as ActiveStorage from "@rails/activestorage"
import "channels"
import "jquery"
import "popper.js"
import "bootstrap"

+ import Raty from "../raty"

+ window.raty = function(elem,opt) {
+ let raty =  new Raty(elem,opt)
+  raty.init();
+  return raty;
}

import "../stylesheets/application"

Rails.start()
Turbolinks.start()
ActiveStorage.start()

```
このコードについて説明します：

**import Raty from "../raty"**：この行は、raty.js ファイルから Raty オブジェクトをインポートします。"
**../raty"** の部分は、raty.js ファイルが application.js ファイルから見て一つ上のディレクトリ（app/javascript）にあることを示しています。

**window.raty = function(elem,opt) {...}**：これは、新しい raty 関数を全体的なJavaScriptコンテキスト（windowオブジェクト）に追加しています。この関数は、指定されたDOM要素に対して新しいRatyインスタンスを作成し、初期化します。elem パラメータは、Ratyを適用するDOM要素のセレクタ（例えば ".star-rating"）で、opt パラメータは、Ratyのオプションを指定するオブジェクトです。

上記のコードを追加した後、保存して閉じてください。これで、Ratyを全てのページで使えるようになりました。具体的には、HTMLの中のJavaScriptで以下のように書くことができます
```diff_javascript
window.raty('#my-element', {score: 3, readOnly: true});
```

**import Raty from "./raty"** の部分は、raty.js ファイルが application.js ファイルと同じディレクトリ（app/javascript）にあることを示しています。

これで raty.js ファイルが正しくインポートされ、全てのページで window.raty 関数を使用できるはずです。
OffsetDateTimeからTimestampに変換

Javaの`java.time`パッケージを使って`OffsetDateTime`から`Timestamp`に変換するためのコード

```java
import java.sql.Timestamp;
import java.time.OffsetDateTime;

public class Main {
    public static void main(String[] args) {
        // 現在のOffsetDateTimeを取得
        OffsetDateTime offsetDateTime = OffsetDateTime.now();

        // OffsetDateTimeからTimestampに変換
        Timestamp timestamp = Timestamp.from(offsetDateTime.toInstant());

        System.out.println("OffsetDateTime: " + offsetDateTime);
        System.out.println("Timestamp: " + timestamp);
    }
}
```

このコードは、現在の日時を`OffsetDateTime`として取得し、それを`Timestamp`に変換します。そして、両方の日時を出力します。

ただし、`Timestamp`は古い日付・時刻APIであり、Java 8以降では`java.time`パッケージのクラス（`LocalDateTime`, `ZonedDateTime`, `OffsetDateTime`など）を使うことが推奨されています。これらのクラスは、日付と時刻をより直感的かつ安全に扱うことができます。なので、あなたが古いライブラリやフレームワークとの互換性など特別な理由がない限り、新しいAPIを使うことを検討してみてください。
react-iconsのアイコン名をサジェストさせる方法

# きっかけ
アイコンの表示に`react-icons`を使っており、
VSCode の IntelliSense で、使えるアイコンを サジェスト/オートコンプリート して欲しいと思った。

![usage.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527043/b607ec99-2ea3-ece1-b96c-c6a6d4c8ab49.gif)



# 個人的によくやってる書き方

1. デザイナーさんにプロジェクト内で使用するアイコンセットを選んでもらう。
1. 選んでもらったアイコンセットをimportしてラップした、以下のコンポーネントを作る。

```tsx:Icon.tsx
// GitHub Actions で利用している Linux と UNIX システムが大文字と小文字を区別するため、
// react-icons のドキュメントと異なり小文字で import しています
import * as iconsBs from "react-icons/bs"
import * as iconsFi from "react-icons/fi"
import { IconBaseProps } from "react-icons"

export type IconName = keyof typeof iconsBs | keyof typeof iconsFi

type IconProps = IconBaseProps & {
  name: IconName
}

const icons = { ...iconsBs, ...iconsFi }


// ↓jsdoc形式でコメントを書いておくと、ホバーしたときに説明が出るのでおすすめ↓
/**
 * 現在、使用できるアイコンは以下です。
 * - [Bootstrap Icons](https://react-icons.github.io/react-icons/icons?name=bs)
 * - [Feather](https://react-icons.github.io/react-icons/icons?name=fi)
 */
export const Icon: React.FC<IconProps> = ({ name, ...props }) => {
    const IconCore = icons[name]
    return <IconCore {...props} />
}
```

```tsx:使うときの例
<Icon name="BsHouse" size=36 color="#d51dd2" />
```

# 注意点

:::note warn
バンドルサイズ削減のため、アイコンセットは極力少なくしたほうが良いと思われます。
:::

# あとがき

もっといい方法があれば、コメントで教えてください:bow:
FactoryBot 6.0で、enumからtraitが作成されるようになったお話

Railsで、gemをアップデートしていた時によくわからない記述を発見したので、検証備忘録です。

https://github.com/thoughtbot/factory_bot/blob/main/NEWS.md#600-june-18-2020
こちらに、
>Added: automatic definition of traits for Active Record enum attributes, enabled by default 

とあります。
これがよくわからなかったので、手元で検証しました。

# 動作例
仮に以下のようなクラスがあり、
```ruby
class User < ApplicationRecord
  enum role: { normal: 0, vip: 1, admin: 2 }
  enum rank: { white: 0, silver: 1, gold: 2 }
end
```
以下のように適当なfactory_botが定義されていたとすると
```ruby
FactoryBot.define do
  factory :user do
  end
end
```
自分で定義しなくても、enumの値を使ってtraitが自動生成されるようです。
```ruby
  it do
    user_normal = create(:user, :normal) # user_normal.role == 'normal'
    user_vip = create(:user, :vip) # user_vip.role == 'vip'
    user_silver = create(:user, :silver) # user_silver.rank == 'silver'
  end
```

個人的には、こういうのは混乱のもとになりそうなので、愚直にキーワード引数で指定しますね...

```ruby
  it do
    user_normal = create(:user, role: :normal)
    user_vip = create(:user, role: :vip)
    user_silver = create(:user, rank: :silver)
  end
```

# 参考リンク
https://makandracards.com/makandra/481785-factorybot-traits-for-enums/read
EmbulkでPostgreSQLからデータ抽出してCSVを生成する方法

# git cloneすればembulkやgolangのインストールは不要です
以下のリポジトリにハンズオンを用意しています。dockerやmakeコマンドを用意して環境構築をスキップできるようにしているので、ぜひcloneしてハンズオンをしてみてください。

https://github.com/tkanata/embulk-hands-on-postgresql2csv

# ハンズオンの手順
ここに列挙してある手順を実行したらpostgresにテーブルを作ってデータを登録し、そのデータをEmbulkを使ってcsv化することができます。
うまくいかない箇所などありましたらコメントいただけたらと思います。記載漏れの可能性があります。

1. `git clone https://github.com/tkanata/embulk-hands-on-postgresql2csv.git`
2. `docker-compose build`
3. `docker-compose up -d`
4. `make init`
    a. postgresにテーブルを生成するmakeコマンドです。
5. config.ymlの作成
    a. 今回はすでに作成済みですが、削除して自分で書いてみるのもいいと思います。
6. `docker exec -it embulk bash`
    a. dockerコンテナの中に入るコマンド。
7. `embulk run config.yml`
    a. コンテナ内でのembulkコマンドの実行。これで`./output_file/`直下にteas.csvが生成されるはず。


# DB構築
`docker-compose up`あるいは`docker-compose up -d`コマンドを叩くことでpostgresの環境が構築されます。
テーブルの生成についてはentというgolangのライブラリを用いて行なっていきます。


# entでテーブル生成
`make init`あるいは`make init-arm64`コマンドを叩いたらposrgresにテーブルが生成されるようになっています。


# postgresqlからcsvを生成するconfig.ymlの作成
```yml:config.yml
in:
  type: postgresql
  host: postgres
  port: 5432
  user: postgres
  password: password
  database: embulk-handson
  table: teas
  select: "*"

out:
  type: file
  path_prefix: ./output_file/
  sequence_format: "teas."
  file_ext: csv
  formatter:
    type: csv
    delimiter: ","
    newline: CRLF
    newline_in_field: LF
    charset: UTF-8
    quote_policy: MINIMAL
    quote: '"'
    escape: "\\"
    null_string: "\\N"
    default_timezone: "Asia/Tokyo"
    header_line: true
```

docker-composeを利用している場合、ホストマシンのサービスにアクセスする際にはサービス名(postgres)を利用できるため、inputの設定のhostはpostgresを指定しています。
ここをlocalhostにしてしまうと、Dockerコンテナ内のlocalhostを探してしまうため、DBへの接続エラーが発生してしまいます。

:::note info
### config.yml削除して再作成したら、`docker-compose build`コマンドを再実行してください。
Dockerfileを読むとわかるのですが、ホストマシン(つまりあなたが今使っている手元のPC)にあるconfig.ymlをDockerコンテナにCOPYするコマンドが記載されています。
config.ymlがDockerコンテナ内に存在しないとembulkコマンドは失敗するので注意してください。
git cloneした時のconfig.ymlを使っている場合は最初に実行したbuildコマンドでconfig.ymlがDockerコンテナにCOPYされているので再度buildコマンドを実行する必要はありません。
:::

# Embulkの実行
`docker exec -it embulk bash`を実行し、Dockerコンテナの中に移動します。
Dockerコンテナに移動できたら、`embulk run config.yml`を叩くことでembulkが実行されます。
実行すると指定したディレクトリにcsvが生成されているはずです。


# Embulkをローカルにインストールしたい方は以下を参考にするといいかと思います
intel版のMacを使っている方は`brew install embulk`でインストールできます。
M1Macを使用している場合は、このコマンドではインストールできません。
下記記事を参考にして、intel環境のシェルでインストールしてください。

[M1 macでIntelな環境のシェルを使ったCronジョブを流したりする](https://rcmdnk.com/blog/2021/08/02/computer-mac/)



### embulk-input-postgresqlというプラグインのインストール
Embulkでpostgresqlからデータを取得するためには、`embulk-input-postgresql`というプラグインが必要となります。
https://github.com/embulk/embulk-input-jdbc/tree/master/embulk-input-postgresql



### プラグインをインストールする前にプラグインを管理する準備をしましょう
Embulkはさまざまなpluginをインストールすることで各種DBからデータを抽出したり、任意のcsvを生成するように拡張することができます。

pluginのインストールはGemのインストールという形で行われます。
GemはGemfileにて管理されるのですが、GemfileによるGemの管理をしやすくするのがmkbundleというコマンドです。

`embulk mkbundle bundle`というコマンドを実行すると、実行場所に`bundle`というディレクトリが作成されます。
bundle直下にはGemfileなどが生成され、このGemfileを編集することでGemを管理することができます。

bundle/Gemfileにてgemの管理を行うためには、以下のようにbundleディレクトリ配下でpluginをインストールします。
`bundle add PLUGIN-NAME`

最後に、bundleディレクトリ直下で以下を実行してgemをインストールします。
`bundle install`
フロントエンドコーディングでやっておきたいユーザビリティ対策

Web の進化により、フロントエンドコーディングはデザインを再現するだけでは済まなくなりました。

「ふぅ～。デザイン通りにコーディングしてやったぜぇ～:smirk:」
では終われません！

デザインを再現する以外にも注力することがいっぱい増えました…:persevere:

というわけで、フロントエンドコーディングでやっておきたい**ユーザビリティ対策**をまとめてみました！

## レイアウトシフト

:::note info
`img` 要素に `width` と `height` を指定すると、画像のスペースが確保され、レイアウトシフト（レイアウトが下にずれる現象）が発生しません。
:::

```html:HTML
<!-- width height の指定なし -->
<img src="image.jpg">
```

![layout-shift_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/f803b4a4-c6d4-9aeb-33d2-7b39ba9511cb.png)

```html:HTML
<!-- width height の指定あり -->
<img src="image.jpg" width="1000" height="1000">
```

![layout-shift_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/eb56ef1e-63a7-c811-6916-c1ca025c6c5a.png)

## キャッシュバスティング

:::note info
キャッシュバスティングは、リソースのパスにバージョン番号を含ませる（新しいファイルと認識させる）ことで、ブラウザキャッシュを削除せずに、最新のファイルを表示させる手法です。
:::

キャッシュバスティングは以下のパターンがあります。

* ファイル名にバージョン番号を入れる（例：image.v2.png）
* ファイルパスにバージョン番号を入れる（例：/v2/image.png）
* クエリにバージョン番号を付与する（例：image.png?ver=2）

クエリにバージョン番号を設定するのが手軽でオススメです。
バージョン番号には、MD5ハッシュ値を利用するのがベストだと思います。

:::note info
MD5ハッシュ値は、ファイル内容から計算される128bitの値で、同じファイルからは同じ値が得られ、ファイル内容が1bitでも異なればまったく違う値になります。
:::

```html:HTML
<img src="image.jpg?ver=1df0fdd672cbe7bb378f56dfa0f1410f">
```

## ダークモード

:::note info
OS の設定でダークモードを有効にしている人に対して、Webサイトも黒ベースだと眩しくならず親切です。
:::

ダークモードの対応は、CSS で `@media` の `prefers-color-scheme` メディア特性を利用します。
また、CSS変数（カスタムプロパティ）を利用すると、記述も管理もとっても簡単です。

```css:CSS
/* ライトモード */
:root {
  --color: #333;
  --background-color: #fff;
}
/* ダークモード */
@media (prefers-color-scheme: dark) {
  :root {
    --color: #ccc;
    --background-color: #222;
  }
}
body {
  color: var(--main-text);
  background-color: var(--main-bg);
}
```

CSS の設定だけだと、UIパーツ（フォームパーツ、スクロールバーなど）が明るいままになってしまいます。
そのため、HTML の `meta` 要素の `name="color-scheme"` に、対応するカラースキームを記述します。

`content` 属性の値は以下となります。

|属性値|内容|
|:-|:-|
|normal|ブラウザの既定のカラースキームを使用|
|light|ライトモードに対応|
|dark|ダークモードに対応|
|only|ブラウザがカラースキームを上書きすることを禁止|

```html:HTML
<!-- ライトモードで表示することを推奨しつつ、ダークモードで表示することも可能 -->
<meta name="color-scheme" content="light dark">
```

ライトモード、ダークモードの切り替えボタンを設置したい場合は、以前記事にしたので参考にしてみてください。

https://qiita.com/taqumo/items/1b626ff841f9a3234d4d

## PWA（Progressive Web Apps）

:::note info
PWA の機能でインストール可能にしておくと、ブラウザを立ち上げることなくワンクリックでサイトを閲覧できるようになり便利です。
:::

PWA を実装することで以下の機能が利用できるようになります。

* インストール可能
* キャッシュの利用
  * 表示速度の高速化
  * オフライン対応
* プッシュ通知

手軽に導入できる「インストール可能」に対応しておくのがオススメです。
Chrome の場合、アドレスバーに表示されるボタンからアプリをインストールできます。

![pwa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/86f32be0-feec-ff37-d7de-3486dac5ae1d.png)

Webサイトを「インストール可能」にする方法の詳細は、以前記事にしたので参考にしてみてください。

https://qiita.com/taqumo/items/b9198a91506c82cbc51e

## 関連記事

https://qiita.com/taqumo/items/3660b04400c28c5c2aa5

https://qiita.com/taqumo/items/0c7116517bb2b44b2939

https://qiita.com/taqumo/items/d69522e2f3b95bf02996
TypeScriptで開発中、Stringとstringの違いでエラーに遭遇。

こんにちは。
株式会社HRBrainでフロントエンドエンジニアをしているみつです。

とはいえ、技術が足らないなぁとか、
無理やりコーディングしているなぁとか、感じている日々:sunny:

先日、そんな無理やりコーディングの最中、
「**念のためString使って文字列だよってしとこ〜**」と軽い気持ちで使っただけなのにね・・・
new String()になんか怒られたのでその共有です:weary:

## 目次
- [★先に結論](#先に結論)
- [★これが、エラー](#これがエラー)
- [★これは、エラーじゃない](#これはエラーじゃない)
  - [String（MDNより）](#stringmdnより)
  - [string（サバイバルTypeScriptより）](#stringサバイバルtypescriptより)
- [★何のエラーだった？](#何のエラーだった)
- [★さらに言うと・・・](#さらに言うと)
- [★まとめ](#まとめ)
- [参考URL](#参考url)

## ★先に結論
**Stringは、オブジェクトだからstring型とは同じものではない。**

## ★これが、エラー
```JavaScript
const something = '何かしらの値'
const text: string = new String(something)
console.log(text)
```
>型 'String' を型 'string' に割り当てることはできません。
'string' はプリミティブですが、'String' はラッパー オブジェクトです。できれば 'string' をご使用ください。ts(2322)

「stringを使えって、string使ってるじゃん・・・:angry:」

## ★これは、エラーじゃない
```JavaScript
const something = '何かしらの値'
const text: string = new String(something).toString()
console.log(text)
```
「stringにtoStringしてもstringのままだろ！なんで逆にエラー解消すんだよ・・・:angry:」

### String（MDNより）
>String コンストラクターは新しい String オブジェクトを生成するために使用します。
・・・
String 関数と String コンストラクターは異なる結果を生み出します。

```JavaScript
typeof new String('Hello world'); // object
typeof String('Hello world'); // string
```

Uh-huh:flushed:

### string（サバイバルTypeScriptより）
>文字列リテラル。string型を表す。
TypeScriptのstring型の型注釈はstringを用います。

## ★何のエラーだった？
エラーのメッセージを見てみると。
できれば'string'をご使用くださいって言われてて、stringじゃん！？って思ってたんですが

Stringは、ラッパーオブジェクトって書かれてて、typeofで確認してみたらオブジェクト。
▼
つまり、**オブジェクトのStringとstring型は別物**・・・という。

だから、toString()にしてstringを期待していることを明示してあげてるとエラーが出ない。

ってことなのかな。

## ★さらに言うと・・・
ドキュメントではStringは使うなって言ってた。
>Number, String, Boolean,  Symbol and Object
Don’t ever use the types Number, String, Boolean, Symbol, or Object
These types refer to non-primitive boxed objects that are almost never used appropriately in JavaScript code.

:::note info
意訳
数値、文字列、真偽値、シンボル、オブジェクトは使わないでね。
これらは、ノンプリミティブでボックス化されたオブジェクトなので、多くの場合、JavaScriptにおいて適切に使われることがないですよ。
:::

とのこと。

だから、シンプルに、new String()とか使わず、そのまま入れとけば怒られずにすんだのにね:expressionless:

```JavaScript
const something = '何かしらの値'
const text: string = something
console.log(text)
```

例としてこういう感じのことも上がってました。

```JavaScript
/* WRONG */
function reverse(s: String): String;
```

```JavaScript
/* OK */
function reverse(s: string): string;
```

## ★まとめ
**Stringは、オブジェクトだからstring型ではない。**

なんでもちゃんと理解して使うようにしたいと思いました。

## 参考URL
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String

https://typescriptbook.jp/reference/values-types-variables/string

https://www.typescriptlang.org/docs/handbook/declaration-files/do-s-and-don-ts.html
Eclipse で、未コミットファイルの差分確認

未コミットの変更があるファイルについて、前回コミットとの差分を表示する方法。
VSCodeだと勝手に ↓こんな感じで目印がついてくれるのですこぶる便利なのですが、eclipseだとつかないので、どうやって確認するか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1605263/c89e712f-64cc-acd2-5f1b-2412c43dffc3.png)
### やり方
Window > Show View > Other > Git Staging
で、下記のようなウィンドウを表示。
![スクリーンショット 2023-07-10 11.53.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1605263/372cddf6-7c87-8985-ae73-c841a237d82c.png)

Unstaged Changes がステージに乗せてない変更。
staged Changes がステージに乗せた変更。
このインターフェースはSource Tree に似ていて、わかりやすい。

差分を確認したい差分をクリックすると、下記のような画面が出るので、ここでローカルとgit commit済分との差分が確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1605263/df777e28-9c22-91f3-5930-e794591ed25f.png)

### ひとこと
VSCode の方が、ウィンドウをまたがず差分が見れて、一目でわかりやすい、、

##### (環境)
OS : Mac (Catalina)
STS4 Version: 4.19.0
※プラグイン Egit がインストール済
【ChatGPT無】でデータから棒グラフを出させるPrompt

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

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

　今回は、
　　タイトルどおり、
　　　データを与えて、
　　　　棒グラフを作成させます。

　ふつうに
　　ChatGPTさんに
　　　作らせると、
　　　　グラフに
　　　　　＊でポイントする
　　　　　　だけです。

　それは
　　棒グラフとは
　　　言わないよぉ、
　　　　と叫んでしまいます。

　ということで、
　　棒グラフを作成します。

　もちろん、
　　ChatGPTさんは、
　　　グラフィカルな表示は
　　　　できません。

　だから、
　　キャラクターコードで
　　　グラフ化しなければ
　　　　なりません。

　そして、
　　数値が
　　　桁数たくさんだと
　　　　大変です。

　まぁ、
　　その件は、
　　　放置してw

　Promptです。
```Text:データから棒グラフPrompt
# 目的
入力データから棒グラフを作成する。

# 注意点
・コードは不要です。
・解説や説明は不要です。
・出力は結果のみ。
・出力は、マークダウン記法のコードブロック。

# 棒グラフの作成例
10│■
20│■■
30│■■■
40│■■■■
50│■■■■■

# 処理手順
データから棒グラフを作成し、出力する。

以上の内容が理解できたら、「データの入力をお願いします」と答えて待機してください。

理解できない箇所は、指摘してください。
```
　で、使用例です。
　　引用で出しますね。
>ChatGPT
>データの入力をお願いします。
>
>
>User
>20.10.30.90.10
>
>
>ChatGPT
>以下は、入力されたデータから作成された棒グラフです。
>
>Copy code（←コードブロック）
20│■■
10│■
30│■■■
90│■■■■■■■■■
10│■
以上が、入力データから作成された棒グラフです。
***
>User
>30.20.90.10.50
>
>ChatGPT
以下は、入力されたデータから作成された棒グラフです。
>
>Copy code（←コードブロック）
30│■■■
20│■■
90│■■■■■■■■■
10│■
50│■■■■■
以上が、入力データから作成された棒グラフです。
***

　どうでしょうか。

　まぁ、
　　このまま使うのは、
　　　難しいでしょうね。

　それに
　　ExcelやSpreadsheetがあるのに、
　　　わざわざChatGPTさんを
　　　　使用する意味がありませんし。

　必要性があるとしたら、
　　ChatGPTさんで
　　　データ処理させての
　　　　出力でしょうか。

　そこを悩むのは、
　　私の仕事ではありませんので、
　　　the 放置w
【Excel】シート間参照がブック間参照になってしまう現象を避ける裏技

# 概要
## ある日のエンジニア

「XファイルのシートをYファイルにコピーしたい！」
「ん？Xファイルのシート内にシート間参照を行ってるセルがあるぞ？」

```
=sheet1!A1
```

「でも、コピー先のYファイルでも"sheet1"シートを参照したいしこのままでいいな！コピー！」

```
=[Xファイル.xlsx]sheet1!A1
```

「なんでXファイルの"sheet1"シートを参照してるんだ...」

## 説明

このようにシート間参照を含むセルを別ブックにコピーすると、勝手に元のブックを参照してしまいます。

エクセルは`=sheet1!A1`という数式を「コピー元ファイルのSheet1のA1セルを参照する」と認識しているようで、別ブックにコピーした際にコピー元のファイルを自動で参照するような数式に変換されてしまいます。
しかし、このようなコピーを行った際は「コピー先ファイルのsheet1のA1セル」を参照してほしいことが多いと思います。

私は業務でこの問題にぶつかり悩んでいたんですが、
別ブックをまたいだコピーを行っても数式が変わらない裏技を見つけました！

# 裏技
```
=INDIRECT("sheet1!A1")
```

このようにINDIRECT関数を噛ませるだけです！
INDIRECT関数はセル参照を文字列を使って指定ができる関数です。
文字列はコピーやオートフィルによって勝手に変換されてしまうことは無いので、固定したい数式を文字列として持っておくことで保持ができるという寸法です。

# 問題点
オートフィルに対応できないということはデメリットでもあります。
例えば、sheet1のA2,A3セルも参照したいと思った時は逐次`=INDIRECT("sheet1!A2")`や`=INDIRECT("sheet1!A3")`のようにセルに書き込んでいく必要があります。

# まとめ
今回の事象自体はあまり起こらないものかもしれませんが、

**文字列として持っておくと自動修正されない**

このテクニックは他の場面でも応用が効きそうなので覚えておいてもいいのではないでしょうか。
[備忘録]githubの初期設定

## 目的
githubのリポジトリを作成する時に毎回設定を忘れてしまうので、備忘録として残す

## sshでpushしたいので設定する
```
ssh-keygen
cat ~/.ssh/id_rsa.pub
```
settings →　SSH and GPG keys
News SSH keysをクリックして、先ほどの情報を張り付ける

https://github.com/settings/keys




## リポジトリ作成後
```bash
git init
git config --global user.email "XXXXXX@gmail.com"
git config --global user.name "shoma564"

git remote add origin git@github.com:shoma564/REPOSITORY.git
git remote set-url origin git@github.com:shoma564/REPOSITORY.git

git add *
git commit -m "first commit" 
git branch -M main
git push origin main
```
iOS 17 Developer Beta 3のインストールがLINEを破壊

iOS 17 Developer Beta 3をインストールしたら、なんとLINEアプリが使えなくなっちゃったんです。破壊って言いすぎるかもしれませんが、少なくとも、使いにくなったしまいました。具体的には、キーボードが入力ボックスを覆ってしまうため、タイプしている内容が見えなくなるという問題が発生しています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295096/2bf5ab04-ff9b-b843-f472-18c63cbe863a.jpeg" width="200">
## デベロッパーベータのインストールには注意が必要

デベロッパーベータ版のiOSは、新機能のテストやバグの修正を目的としています。だから、開発者向けのプレリリース版で、一般のユーザーが使用するにはリスクがあります。このため、デベロッパーベータ版をインストールしたら、バックアップを取るのは大事です。また、重要なアプリが使えなくなる可能性もあるので、メインのデバイスにはインストールを控えた方がいいと思われています。でも確かに、新機能を試したいという理由で、メインのデバイスにインストールしてしまうユーザーもありますね（例えば、僕）。
Databricks にて High concurrency クラスターにて Databricks AutoML を実行した際のエラーの対応方法

## 概要

Azure Databricks にて High concurrency クラスターにて Databricks AutoML を実行した際のエラーの対応方法を共有します。

Azure Databricks にて High concurrency クラスターにて Databricks AutoML を実行するコードを久しぶりに実行したところ、次のようなエラーが発生しました。

```text
AutomlServiceError: Failed to create Automl experiment. Status Code: 401 Error: b'\n\n\nError 401 > Unauthorized\n\n
HTTP ERROR 401
\n
Problem accessing /api/2.0/automl/experiments. Reason:\n
    Unauthorized
 \n\n\n'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0863be05-f591-f896-66c9-8585fa3b4536.png)

`Enable Admin Protection for “No Isolation Shared” Clusters`の設定が`Enabled`となっていることが原因であるため、`Disabled`に設定したところ正常に動作しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/30d58395-a0eb-3090-9214-49d890c156ac.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b473697a-9c62-c920-c31e-9ce85f1d8388.png)


本記事で利用しているコードは、次のリンク先のノートブックを利用しています。

- [automl-forecasting-example - Databricks (microsoft.com)](https://learn.microsoft.com/en-us/azure/databricks/_static/notebooks/machine-learning/automl-forecasting-example.html)

## エラー詳細

### エラーメッセージ

```text
AutomlServiceError: Failed to create Automl experiment. Status Code: 401 Error: b'\n\n\nError 401 > Unauthorized\n\n
HTTP ERROR 401
\n
Problem accessing /api/2.0/automl/experiments. Reason:\n
    Unauthorized
 \n\n\n'
```

```python
AutomlServiceError: Failed to create Automl experiment. Status Code: 401 Error: b'<html>\n<head>\n<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>\n<title>Error 401 Unauthorized</title>\n</head>\n<body><h2>HTTP ERROR 401</h2>\n<p>Problem accessing /api/2.0/automl/experiments. Reason:\n<pre>    Unauthorized</pre></p>\n</body>\n</html>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/33d0dc24-341f-6bfc-d0db-8c9524f830e1.png)

### エラー原因

`Enable Admin Protection for “No Isolation Shared” Clusters`の設定が`Enabled`となっている場合に、Machine Learning ランタイムが利用できなくなることが原因のようです。

> 制限事項
> 分離共有クラスターなしまたは同等の従来のクラスター モードで使用する場合、アカウントで分離共有クラスターなしの管理保護を有効にした場合、次の Azure Databricks 機能は機能しません。
> - Machine Learning ランタイム のワークロード。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6bf34b59-08f1-ddf1-4980-79b4e39b2a16.png)


引用元：[アカウント レベルの管理者保護設定を有効にする Databricks | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/databricks/administration-guide/account-settings/no-isolation-shared#enable-the-account-level-admin-protection-setting)

## エラーへの対応方法

### 1. Databricks の [アカウントコンソール](https://accounts.azuredatabricks.net/settings/feature-enablement)にログインして、`Enable Admin Protection for “No Isolation Shared” Clusters`を`Disabled`に設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/99161d7d-a90c-2608-a1eb-eae5545ceed7.png)

### 2. クラスターを再起動後、Databricks AutoML のコードを再実行して正常終了することを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b473697a-9c62-c920-c31e-9ce85f1d8388.png)
tauri + next.js の開発環境を3000以外のポートで動かしたい

他のプログラムが`http://localhost:3000`を使っているときなど、3000以外のポートを使いたいとき

例えばポート3001を使いたい場合は下記です

## Next.js の設定

```json:package.json
{
...
    "scripts": {
        ...
        "dev": "next dev -p 3001"
        ...
    }
...
}
```

## Tauri側の設定

```json:src-tauri/tauri.config.json
{
...
    "build":{
        ...
        "devPath": "http://localhost:3001"
        ...
        }
...
}
```

Next.js、Tauriとも同じポート番号を指定してください
エンジニア・データアナリストが取り組むべき日本国の課題

これからの現代の日本や資本主義社会の課題に取り組むためにデータ分析や機械学習を活用できないだろうかと会社で話題となったので、具体的に **「日本国全体、およびこれからの日本の国民・住民の課題や障害は何なのか」を** 学習しました。 太田比路氏の **「政治的に無価値なキミたちへ」** という若者向けの本にそれらが分かる良い章があったので、簡潔にまとめてみました。

https://www.amazon.co.jp/%E6%94%BF%E6%B2%BB%E7%9A%84%E3%81%AB%E7%84%A1%E4%BE%A1%E5%80%A4%E3%81%AA%E3%82%AD%E3%83%9F%E3%81%9F%E3%81%A1%E3%81%B8-%E5%A4%A7%E7%94%B0-%E6%AF%94%E8%B7%AF/dp/4781621945/ref=sr_1_1?adgrpid=114536760685&hvadid=658684357384&hvdev=c&hvqmt=e&hvtargid=kwd-902922433104&hydadcr=12921_13530804&jp-ad-ap=0&keywords=%E6%94%BF%E6%B2%BB%E7%9A%84%E3%81%AB%E7%84%A1%E4%BE%A1%E5%80%A4%E3%81%AA%E3%82%AD%E3%83%9F%E3%81%9F%E3%81%A1%E3%81%B8&qid=1688954178&sr=8-1

# 日本国全体の課題や障害とは何か？

## ①財政問題
日本の中央銀行は **大量の国債** を発行している。政府債務の対GDP比はG20中最悪で、特にこの問題をどう解決するのかという長期的視点を示したリーダーがいない。政府債務を返すため、増税・年金支給引き上げなど現役の労働者階級、および労働引退階級へのしわ寄せが強まっている。政府債務を返しつつ、生活水準を改善するにはどうすればよいのか？

## ②人口問題
出生率が低水準となり、特に2050年までに人口が1億人を下回ると予測されている。2050年頃には、65歳以降の労働引退人口が人口の40%を占めると推測される。
労働者階級へのしわ寄せが増え自由に使える資産・過ごせる時間が大幅に減少する。また労働引退人口の健康と経済・余生を人間らしく生活するという基本的な人権が脅かされる。 **人口自体が減り、人口ピラミッドの均衡が崩れる** という問題にどう対処するべきか？

## ③自然災害・原子力問題
日本はたびたび地震や津波・台風等による **自然災害による甚大な被害** を受ける。とくに2011年は自然災害に伴う人災＝原発による放射能汚染が大きな問題となった。その上、昨今ではウクライナ戦争に伴う **エネルギー危機** を受け政府は更に稼働する原発を増やす方針を表している。天災と人災・環境汚染や核のゴミに日本は耐えられるのか？

## ④経済の低迷
日本国の一人当たりのGDP＝労働生産性は1990年あたりからほぼ上昇しておらず、 **「失われた30年間」** と呼ばれている。アメリカ・中国の企業が成功しているAI・クラウドソーシング等の新技術の社会実装を手掛ける企業が少ないのと、昭和的な上下下達式の非効率的な組織構造が温存されていることが原因であると考えられる。経済低迷からの脱却のため、官公庁や民間企業にはどんな工夫ができるか？

## ⑤国民主権の実体性
日本国の国民は国政選挙・地方選挙に立候補するのに莫大な資金を用意しなければならない。とくに小選挙区で立候補するには300万円の供託金に加え、党の運営に最低約1000万円ほどの資金を用意しなければらならない。日本の労働者階級にそんな余裕はない。また国民が政党運営に参加するには学問を学ぶ機会・余暇を使った自由研究が求められるが、平日をほぼ労働に使っている労働者階級にその両立は不可能である。 **国民が政治に参加するためのハ―ドルを低し、その機会を広くする** にはどうするべきか？

## 政治の世界で求められるリーダーシップ
リーターシップとは、 **「自己の理念と価値観に基づいて魅力ある目標を達成・またはその実現に必要な体制を構築し、人びとの意欲を高め成長させながら課題や障害を解決する行動」** と定義されています。

今日本が求めているリーダーや人材には、保守かリベラルなのか、リバタリアンなのか共産主義者なのかといった **価値観がしっかりしている** ことが重要です。 **目標がしっかりしていて実力があり、人々をやる気にさせる人間** がこうした課題解決に成功する人であると考えられます。

## 理念による結集
意志や目標をなるべく多くの人と共有して一緒に行動するには、まず 多くの人の間で共感できるような **理念（Idea, Ism）** に仕上げていくことが不可欠 です。そのためには、理念を **「自由・平等・民主主義」のような抽象的な言葉で表現する** 必要があります。人類が行ってきた政治とは、こうした **抽象的理念の下に具体的現実を造る活動** であると言うことができます。

エンジニアやデータアナリストが日本国の課題の課題に取り組むためには、このような日本国の課題とは何かを具体的に知ること、そのうえでリーダーシップを発揮するのと **「何のために自分の能力と職業を活かすか」** という理念を自発的に考えることが肝要であると考えられますね。
github user の 特定の PR/Issue をまとめるレポートを作った話

# 概要

特定のユーザーの PR/Issue 情報をレポジトリごとに、定期的に集計してサマリーを自動で作成する機能を gihub actions を用いて作成しました。

# 経緯
私のチームでは以下のような課題がありました。

開発環境を構築したエンジニアがチーム内におらず、チームメンバーだけではどういった保守運用が必要かわからない状態でした。幸い、環境構築をしてくれたエンジニアは別のレポジトリで、同じ開発環境で開発を行っていた。そこのレポジトリを定期的にウォッチし、参考にさせてもらうことで、自チームの補修運用に役立てることにしました。

とはいえ、ウォッチしなければいけないレポジトリが複数あったり、毎回レポジトリを検索するのが大変です。なので、[Github の Slack インテグレーション](https://github.com/integrations/slack#readme)を検討しましたが、特定のユーザーの PR/Issue をレポジトリごとにウォッチする機能はありませんでした。うーん、かゆいところに手が届かない、、、。

ないなら作ってしまえ！

# 作ったもの

https://github.com/mmikami-lifull/github-author-report

特定のユーザーの PR/Issue 情報をレポジトリごとに集計してサマリーを作成する機能を作りました。

- config file で設定を管理
    - ユーザー、レポジトリ、いつからの PR/Issue を取得するかなど
    - 複数設定可能
- github acitons の `GITHUB_STEP_SUMMARY`　を使って、サマリーを自動で定期的に作成
- ローカルでサマリーをマークダウン形式で作成

利用方法は [README.md](https://github.com/mmikami-lifull/github-author-report#readme) に記載しています。興味のあるかがいらしたら、そちらを参照してください。

例）https://github.com/mmikami-lifull/github-author-report/actions/runs/5473225350d
| Author | Title | URL | CreatedAt |
| ------ | ----- | --- | --------- |
| mmikami-lifull | test2 | https://github.com/mmikami-lifull/github-author-report/issues/2 | 2023-07-06T07:55:58Z |
| mmikami-lifull | test1 | https://github.com/mmikami-lifull/github-author-report/issues/1 | 2023-07-06T07:55:49Z |
| mmikami-lifull | feat(workflows): add author issue report workflow | https://github.com/mmikami-lifull/github-author-report/pull/3 | 2023-07-06T07:58:43Z |
【Tips】"/sbin/ldconfig.real: ~~is not a symbolic link"への対処

# 背景

ubuntuのupdateをしていたらこんな表示が出てきた。

```bash
/sbin/ldconfig.real: /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_ops_
train.so.8 is not a symbolic link
```

単純にシンボリックリンクが貼れていない何かが残っているのだろう、ということで削除することにした。

# 実施内容
このサイトを参考にした。

https://yellowarrow.hatenablog.com/entry/2015/04/26/200000

手順としては
1. symbolic linkが貼れていないものの確認
1. 一個ずつ削除

これだけ！

## symbolic linkの確認

```bash
sudo ldconfig
```

### 本当は 
https://wa3.i-3-i.info/word13812.html

https://linuxcommand.net/ldconfig/

2つのサイトを見る限り、**共有ライブラリを表示する**のが本来の機能

その中で共有ライブラリのsymbolic linkがちゃんと貼れているかをついでに確認できる、くらいのニュアンス

# 〆

まだやったところだからエラーが出たら記事書き換えます。
TypeScript 型安全 with switch

```ts
/* eslint-disable @typescript-eslint/no-unused-vars */
export function checkNever(target: never) {
  return;
}

function onTabSelectTypeSafe(animal: 'dog' | 'cat' | 'bird') {
  switch (animal) {
    case 'dog':
    // 何かしらの処理
      break;

    case 'cat':
      // 何かしらの処理
      break;

    case 'bird':
      // 何かしらの処理
      break;

    default:
      // 'dog' | 'cat' | 'bird'は全部switchにチェックがあり、かあた安全エラーが発生しません。
      checkNever(animal);
  }
}

function onTabSelectNonTypeSafe(animal: 'dog' | 'cat' | 'bird') {
  switch (animal) {
    case 'dog':
    // 何かしらの処理
      break;

    case 'cat':
      // 何かしらの処理
      break;

    default:
    // bird がハンドリングされていないときに animal が型エラーになる
      checkNever(animal);
  }
}


```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318767/2024dbdb-59d5-fc33-b154-0f59f69e0037.png)
Macにコマンドライン版Wireshark(Tshark)をインストールする

[Homebrew](https://brew.sh/)からWireshark(Tshark)をインストール。

```shell
$ brew install wireshark
```

バージョン確認。

```shell
$ tshark --version
TShark (Wireshark) 4.0.6 (Git commit ac2f5a01286a).

〜省略〜
```

接続確認。

```shell
$ tshark -D
1. en0 (Wi-Fi)

〜省略〜
```

接続時にエラーが出るので、

```shell
$ tshark -i en0
Capturing on 'Wi-Fi: en0'
tshark: You do not have permission to capture on device "en0".
((cannot open BPF device) /dev/bpf0: Permission denied)
Please check to make sure you have sufficient permissions.

If you installed Wireshark using the package from wireshark.org, close this dialog and click on the "installing ChmodBPF" link in "You can fix this by installing ChmodBPF." on the main screen, and then complete the installation procedure.
tshark:
0 packets captured
```

ChmodBPFをインストールしてみる。

※ChmodBPFを再インストールする場合、アンインストールが途中で失敗し、
Homebrewで再インストールも出来なくなる。  
そうなった場合、ChmodBPFを下記サイトから一度手動でインストールし直す。
https://www.wireshark.org/download/

```shell
$ brew install wireshark-chmodbpf
```

動くようになる。

```shell
$ tshark -i en0
Capturing on 'Wi-Fi: en0'
 ** (tshark:25063) 10:20:10.802578 [Main MESSAGE] -- Capture started.
 ** (tshark:25063) 10:20:10.803569 [Main MESSAGE] -- File: "/var/folders/s3/r4ql7qd12b38x0jbvlnh92n40000gn/T/wireshark_Wi-FiBESO71.pcapng"

〜省略〜
```

ちなみにGUI版をHomebrewで入れようとすると下記で怒られるので、
下記サイトからインストーラーを入手し、手動で入れる必要がある。
https://www.wireshark.org/download/

```
$ brew install --cask wireshark
Error: Cask 'wireshark' conflicts with 'wireshark-chmodbpf'.
```
Elixir Image でコントラスト調整、鮮明化

## はじめに

Elixir Image に 0.35.0 で追加されたコントラスト調整、鮮明化を Livebook で実行、視覚化してみます

https://github.com/elixir-image/image

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

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/vix/contrast.livemd

## セットアップ

必要なモジュールをインストールします

```elixir
Mix.install([
  {:image, "~> 0.35"},
  {:kino, "~> 0.9"}
])
```

- [Image](https://github.com/elixir-image/image): 画像処理 
- [Kino](https://github.com/livebook-dev/kino): Livebook の UI/UX

## 画像の準備

"/home/livebook/vix/normal.jpg" のパスに以下の画像が保存されているものとします

![normal.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/41c987a1-2f72-c105-e611-42ce87528357.jpeg)

この画像を `Image.open` で開きます

```elixir
normal_image = Image.open!("/home/livebook/vix/normal.jpg")
```

## コントラスト調整

`Image.contrast` でコントラスト調整します

第2引数 `contrast` が　1.0 より小さいとコントラストが弱まり、 1.0 より大きいとコントラストが強まります

```elixir
[
  normal_image,
  Image.contrast!(normal_image, 0.5),
  Image.contrast!(normal_image, 1.5)
]
|> Kino.Layout.grid(columns: 3)
```

![スクリーンショット 2023-07-10 10.19.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/4c6a21a2-0582-b6ae-c194-9701349823db.png)

左が元画像、中央がコントラスト0.5、右がコントラスト1.5です

コントラストを弱めると、全体的に白いもやがかかっています

コントラストを強めると、影が強調されてハードボイルドな雰囲気が漂います

他の方法も試してみましょう

```elixir
[
  normal_image,
  Image.apply_tone_curve!(normal_image, shadows: -30, mid_points: 20, highlights: 30),
  Image.local_contrast!(normal_image, window_size: 200)
]
|> Kino.Layout.grid(columns: 3)
```

![スクリーンショット 2023-07-10 10.21.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/e91e1bb8-9828-e3df-9837-b05c0e171818.png)

`Image.apply_tone_curve` は「どの明るさの場所を強調するか」を指定できます

`shadows: -30` で影を弱め、 `mid_points: 20` で普通の明るさを強調し、 `highlights: 30` で明るい場所を特に強調しています

全体としては強い光が当たったような印象になりました

`Image.local_contrast` は局所的にコントラストを調整し、明るいものの近くにある影を強調する

https://rawpedia.rawtherapee.com/Local_Contrast/jp

## 鮮明化

`Image.sharpen` によって画像を鮮明化する

```elixir
[
  normal_image,
  Image.sharpen!(normal_image, sigma: 3.0)
]
|> Kino.Layout.grid(columns: 2)
```

![スクリーンショット 2023-07-10 10.30.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/382c5f8f-8aea-464d-9705-9b1b23c8e829.png)

左が元画像、右が鮮明化した画像です

全体の色調や明るさは変えずに、ボヤッとしていたところがくっきりしています

## まとめ

これでピンボケ写真をキレイに加工できますね
AWSのサーバーを利用する 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/202a52de-615a-0014-fdc9-9cbcd74de88e.png)
1:本番環境でデータベースを作成
データベースの種類を確認します。
データベースには以下のような種類があります。

①階層型データベース
②ネットワーク型データベース
③リレーショナルデータベース
　この中でもっとも利用されているのが「リレーショナルデータベース」です。
　エクセルの表のような形で情報を整理し、管理できます。そして、このリレーショナルデータベースを管理するソフトウェアは「リレーショナル・データ・ベース・マネジメント・システム（RDBMS）」と呼ばれます。

そんなRDBMSの中でも代表的なものの1つが「MySQL」です。

MySQLマイエスキューエル
「MySQL」とは、Oracle社が開発・提供をしているRDBMSです。データベースの作成、編集、削除などを行うことができます。オープンソースソフトウェアとして公開されており、誰でも無償で利用できます。
Ruby on Railsと合わせ利用することができ、本カリキュラムでは一貫してMySQLを利用しています。

MySQL公式ページ：https://www.mysql.com/

そして、MySQLから派生した「MariaDB」というデータベースがあります。

MariaDBマリアディービー
「MariaDB」とは、MySQLの派生として開発されているオープンソースソフトウェアです。MySQLとの互換性があります。

２：MariaDBを起動
①MariaDBをインストールします。
Amazon Linux 2を利用している場合、MariaDBは 「yumコマンド」からインストールできます。

以下のコマンドを実行していきます。

ターミナル（EC2内で実行）
[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y install  mariadb-server mysql-devel
→sudo yum -y install  mariadb-server mysql-develコマンドを実行します。

②データベースを起動します。
データベースを起動するために「systemctlコマンド」を利用します。

systemctlシステムコントロールコマンド
systemctlコマンドは、Amazon LinuxやCentOSに含まれているもので、インストールしたソフトウェアの起動を一括して行えるツールです。

ターミナル（EC2内で実行）
[ec2-user@ip-172-31-25-189 ~]$ sudo systemctl start mariadb
→sudo systemctl start mariadbコマンドを実行します。

起動できたか確認するために、以下のコマンドを打ってみます。

ターミナル（EC2内で実行）
[ec2-user@ip-172-31-25-189 ~]$ sudo systemctl status mariadb
→sudo systemctl status mariadbコマンドを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/c2fd2097-edb9-46dd-f14f-2582537ed5b9.png)
「active (running) 」と緑色の表示がされれば、データベースの起動は成功です。

３：データベースのrootパスワードの設定
　yumでインストールしたMariaDBには、デフォルトで「root」というユーザーでアクセスできるようになっていますが、パスワードは設定されていません。なので、パスワードを設定する必要があります。

パスワードは自身で決めることができます。ご自身が覚えやすいパスワードを設定します。

 「0」、または「!」から始まるpasswordは読み込んでくれないケースが多いので避けます。（例：「0001password」、「!password」など）
 設定したパスワードはこの先にある作業でも扱うので、メモアプリなどに控えておきます。
それでは、以下のコマンドを実行していきます。
ターミナル（EC2内で実行）
[ec2-user@ip-172-31-25-189 ~]$ sudo /usr/bin/mysql_secure_installation
→sudo /usr/bin/mysql_secure_installationコマンドを実行します。

その後、以下のステップで実行します。

手順	やること
①	Enter current password for root (enter for none): 」と表示されたらEnterキーを押す
②	「Set root password? [Y/n]」と表示されたら「Y」を入力してEnterキーを押す
③	「New password:」と表示されたら自身で決めたパスワードを入力（※とくに画面には何も表示されませんが入力できています）
④	「Re-enter new password:」と表示されたら、同じパスワードを入力（とくに画面には何も表示されませんが入力できています）
ここで「... Success!」と表示されればパスワードの設定は完了です。しかしながら、続けて細かい設定について答える必要があります。

手順	やること
①	「Remove anonymous users? [Y/n]」と表示されたら「Y」を入力してEnterキーを押す
②	「Disallow root login remotely? [Y/n]」と表示されたら「Y」を入力してEnterキーを押す
③	「Remove test database and access to it? [Y/n]」と表示されたら「Y」を入力してEnterキーを押す
④	「Reload privilege tables now? [Y/n]」と表示されたら「Y」を入力してEnterキーを押す
プロンプトが表示されたら設定は完了です。

データベースへの接続を確認しましょう
さきほど設定したパスワードが使えるか確認してみます。以下のコマンドを入力してください。

ターミナル（EC2内で実行）
[ec2-user@ip-172-31-25-189 ~]$ mysql -u root -p
→mysql -u root -pコマンドを実行します。

「Enter password:」とパスワードを入力するように表示されるので、さきほど設定したパスワードを入力して、Enterキーを押してください。以下のように表示されれば、データベースの設定は終了です。

ターミナル（EC2内）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/4ba9f08e-156b-5b48-bd83-66e9c0b7b3ef.png)
「exit」と入力すれば抜け出すことができます。
【SQL】DELETEの使い方・特徴・注意点

SQLの学習中につき、学習の記録として、こちらにまとめておきます。

プログラミング、SQL初学者の方は是非参考にしてみてください。

今回はDELETE文について、その使い方や特徴、実行時の注意点などをまとめました。


# DELETEの使用例
postsテーブルから、idが1のデータを削除した後、投稿一覧を取得する。

#### postsテーブル
|id  |name  |date  |
|---|---|---|
|1  |プログラミング学習の日誌1  |2023/07/10  |
|2  |プログラミング学習の日誌2  |2023/07/11  |


#### SQL構文
```SQL
DELETE FROM posts
WHERE id = 1;

SELECT *
FROM posts;
```

#### 実行後のpostsテーブル
|id  |name  |date  |
|---|---|---|
|1  |プログラミング学習の日誌1  |2023/07/10  |


# メモ
- WHERE句を用いて、削除対象を限定できる。
- DELETE対象が全レコードの場合は、テーブル全削除となる。
- 違う対象データを削除してしまうなど、条件指定の間違いに注意する。
- データベースから削除する操作のため、気をつけなければならない。
- 削除するテーブルと、同一テーブルをSELECTすることはできなくなる。
- DELETE実行前に一度、同一条件でSELECTを行い、指定する条件に問題がないか確認するのが良い。


参考：【SQL】1分でわかるDELETEでのデータ削除方法!安全に削除するには?
https://sejuku.net/blog/72944



# 参考サイト


https://sejuku.net/blog/72944


https://products.sint.co.jp/topsic/blog/sql#toc-2
プラットフォームエンジニアリングを知るためのリンク集

## はじめに
今回はプラットフォームエンジニアリングを知る際に参考にした書籍、サイトなどを紹介していきます。
Platform Conの中で2022年と2023年でYoutbeやSlackなどへの参加人数の比較がありましたが最近注目度が高まっている分野になります。
![Screenshot 2023-07-07 at 16.59.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620003/00fb7e1b-a437-5044-20a4-81bdc300754f.png)
そのためか、調べ始めた際にはなかなか欲しい情報に辿り着くことができずに困ったので、参考にした（したい）情報をまとめていきたいと思います。


## 対象読者
対象読者はプラットフォームエンジニアリングに関心がある初級から中級のエンジニアです。

## 参考資料

### 書籍
#### LeanとDevOpsの科学

https://www.amazon.co.jp/Lean%E3%81%A8DevOps%E3%81%AE%E7%A7%91%E5%AD%A6-Accelerate-%E3%83%86%E3%82%AF%E3%83%8E%E3%83%AD%E3%82%B8%E3%83%BC%E3%81%AE%E6%88%A6%E7%95%A5%E7%9A%84%E6%B4%BB%E7%94%A8%E3%81%8C%E7%B5%84%E7%B9%94%E5%A4%89%E9%9D%A9%E3%82%92%E5%8A%A0%E9%80%9F%E3%81%99%E3%82%8B-impress-gear/dp/4295004901

そもそもDevOpsがどのようなものかを理解するために読みました。実際の膨大な調査をもとにどのような手法が効果的かを示しているため手元で何をすればいいかを考える際の参考になりました。

#### State of DevOps

https://cloud.google.com/devops/state-of-devops?hl=ja

LeanとDevOpsの科学の書籍の中では有効だと言われていても、その後の調査では有効だとは言えないものや、より広範囲を調査などを知ることができます。

#### チームトポロジー

https://www.amazon.co.jp/%E3%83%81%E3%83%BC%E3%83%A0%E3%83%88%E3%83%9D%E3%83%AD%E3%82%B8%E3%83%BC-%E4%BE%A1%E5%80%A4%E3%81%82%E3%82%8B%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%92%E3%81%99%E3%81%B0%E3%82%84%E3%81%8F%E5%B1%8A%E3%81%91%E3%82%8B%E9%81%A9%E5%BF%9C%E5%9E%8B%E7%B5%84%E7%B9%94%E8%A8%AD%E8%A8%88-%E3%83%9E%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%BB%E3%82%B9%E3%82%B1%E3%83%AB%E3%83%88%E3%83%B3/dp/4820729632

プラットフォームエンジニアリング関連のカンファレンスなどを視聴していると参照されている場面を見ます。
どのようなチーム構成とそのチーム同士の関係性の時にパフォーマンスを高くすることができるのか、それがなぜ起きるのかがわかりやすくまとまっています。

よりサクッと知りたい時はこちら
[Youtube チームトポロジーを成功させる実践方法の探求 - Team Topologies Study](https://www.youtube.com/watch?v=uJL3M7R8MLc)

#### [Slack Community: Platform Engineering](https://platformengin-b0m7058.slack.com/ssb/redirect)
様々な資料や日本、リクルート用のチャンネルなどがあります。

### YouTube
#### [Platform Engineering](https://www.youtube.com/@PlatformEngineering)
カンファレンスの動画などが上がっています。
プレイリストもわかりやすく整理されていて、まずどの動画を見ていくと良さそうかがわかります。
![Screenshot 2023-07-07 at 17.43.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620003/b6cdf493-09a0-dbb9-d7bb-179e4674f950.png)
#### [Platform Engineering Meetup](https://www.youtube.com/@platformengineeringmeetup-2626/streams)
> 近年急速に注目を集めつつあるPlatform Engineeringについて、学んで、発信して、交流していくための勉強会です。

勉強会のバックログとして運用されているYoutubeチャンネルです。
日本語のため気軽に視聴できます。
プラットフォームの構築方法や各会社でどのようにプラットフォームの構築を進められていて、これまでにどのような失敗、解決策などがあったのかを知ることができます。

### サイト
https://platformengineering.org/

ツール、イベントの告知、ブログのポストなどがあります。
どのようなツールがあるのかを調べるために[Platform Tooling](https://platformengineering.org/platform-tooling)ページをよく利用しています。

https://internaldeveloperplatform.org/

IDPとは何か、どのようなツールで構築できるのかとその比較などがあります。
私はBackstageを利用してIDPの構築を進めていますが、そのほかにどのようなIDPが存在するのか、各ツールにどのようなメリットデメリットが存在するのかを知ることができます。


## おわりに
今回はプラットフォームエンジニアリングを知るための情報を列挙してきました。
またを見つけ次第追記したいと思います。
OpenAIのEmbeddingで文章をベクトル化してみる

# はじめに
ChatGPTで有名なOpenAIですが、文章をベクトル化する```Embedding```というサービスも展開しています。
文章をベクトル化することで、2つの文章の類似度を計算できます。
企業のAIチャットbotなどで、ユーザーが求めている情報を提示する際などに使えるようです。

# GooogleColaboratoryを開く
本記事では、試しに使ってみるだけなので、GoogleColaboratoryで十分でしょう。

https://colab.research.google.com/

![スクリーンショット 2023-07-10 9.38.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626170/aa1e068b-a6d5-be2c-60af-691a96b28cab.png)

# ColabにOpenAIをインストール
まずは、ColabにOpenAIをインストールしましょう。
おなじみの```pip install```でインストールできます。

```python
!pip install openai
```
![スクリーンショット 2023-07-10 9.41.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626170/06066530-f39a-f044-7aa3-e043c69ee8b8.png)

# OpenAIをインポートし、APIキーを設定
インストールできたので、インポートしましょう。
APIキーは、ご自身のキーを使ってください。

```python
import openai

openai.api_key = "ご自身のAPIキー"
```
![スクリーンショット 2023-07-10 9.43.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626170/5f4166c8-11f3-5be3-71f5-ffe1e57786c9.png)

# ベクトル化
準備ができたので、ベクトル化の機能を使ってみます。
```python
input = "テスト"

response = openai.Embedding.create(
    model='text-embedding-ada-002',
    input=input
)

response
```
モデルとベクトル化したい文章を投げるだけで、ベクトル化されて返ってきます。
モデルには、```text-embedding-ada-002```を使っています。
トークンの制限は```8191```、出力されるベクトルの次元は```1536```みたいです。
とんでもない次元のベクトルですね^_^
![スクリーンショット 2023-07-10 9.56.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626170/abc4960b-e0b9-1a2b-c251-d8b22957109c.png)
[↑OpenAIのドキュメントから確認できます。](https://platform.openai.com/docs/guides/embeddings/what-are-embeddings)

それでは、実行してみましょう。
![スクリーンショット 2023-07-10 9.55.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626170/41a49fb9-d83e-2af7-851d-3f0fe423fbfe.png)
とてつもない量の出力がありますが、1546次元のベクトルが出力されるので、ミスではありません。

実行結果から、ベクトルにアクセスするには、```response["data"][0]["embedding"]```です。

# 類似度を計算してみる
ベクトル化はできたので、次は類似度を計算してみましょう。
まずは、ベクトルを2つ用意します。
```python
input1 = "テスト"
input2 = "試験"

response1 = openai.Embedding.create(
    model='text-embedding-ada-002',
    input=input1
)

response2 = openai.Embedding.create(
    model='text-embedding-ada-002',
    input=input2
)
```
![スクリーンショット 2023-07-10 10.07.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626170/5ac91721-4955-da1a-e3c9-7feb2a79d35d.png)

ベクトルが2つ用意できたので、類似度を求めてみましょう。
Embeddingには、類似度を求めるツールが用意されています(```cosine_similarity```)。
```cosine_similarity```では、内積計算を行うことで、ベクトルの類似度を算出します。
もし内積がわからない方がいらっしゃいましたら、高校数学ですので復習してみて下さい^_^
```cosine_similarity```の使い方は簡単で、2つのベクトルを与えるだけです。

```python
from openai.embeddings_utils import cosine_similarity
cosine_similarity(response1["data"][0]['embedding'], response2["data"][0]['embedding'])
```
![スクリーンショット 2023-07-10 10.08.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626170/db7170ec-8941-b177-64fa-abba76ed015d.png)

# おわりに
本記事では、OpenAIのEmbeddingによるベクトル化と、ベクトル同士の類似度の計算まで行いました。
これらの機能を使って、類似度の高い文章を見つけ出し、ユーザーに適切なレスポンスをすることができます。
それはまた別の記事でやってみることにします。

本記事の内容がどなたかの役に立つとうれしいです。
いいねとストックお願いします！！
Corderのcode-server と VS Code server(情報求む！)

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

# 0. VS Codeサーバーがいっぱいありすぎてよく分からない

- coder社のcode-server
- VSCodeの純正のcode-server
    - code-server
    - code-server serve-local
- VSCode
    - code tunnel

しかし、どれがどういう方法で利用できて、どういう条件があり、どういうメリットがあるか全然分からないのでまとめてみる。理解していない部分が多数あるのでご指摘大歓迎！！

# 1. 前提条件

LinuxやWSLで動かすVSCodeでローカルのユーザープロセスとして動かすものではなく、常駐するサービスまたはデーモンで動かすようなリモート接続されるようなVSCodeサーバーについてまとめます。

利用するバージョンは現時点では以下の通りですが、将来的に変更がある可能性があります。
Coder社のcode-serverとVSCodeのcode-serverが同じ綴りなので、`coder code-server`と`VSCode-server`とできるだけ書きたいと思います。

Ubuntu OS: 22.04 LTS
VSCode(VSCode-server):
```
$ code --help
Visual Studio Code 1.80.0
```

coder Code Server:
```
$ code-server -h
code-server 4.14.1 5c199629305a0b935b4388b7db549f77eae82b5a with Code 1.79.2
```


# 2. VSCodeのcode server

## 2-1. インストール

通常のVSCodeをインストールする方法でOK

## 2-1. 起動方法

```
code tunnel
```

# 3. VSCodeのcode-server

# 3-1. インストール

```
wget -O- https://aka.ms/install-vscode-server/setup.sh | sh
```

昔はあったが現在は上記ではインストールできない

# 3-2. 起動方法

```
code-server
```


# 4. Coderのcode-server

## 4-1. インストール

```
curl -fsSL https://code-server.dev/install.sh | sh
```

## 4-2. 起動方法

```
/usr/bin/code-server
```


```
sudo systemctl enable --now code-server@$USER
```
PostgreSQLのデータバックアップとリストアの手順

## はじめに
以前、サーバー移転を行うため、postgresqlのバックアップ・レストアについて調べる機会があったので、
記事として残します。


## データバックアップの手順:
PostgreSQLでは、pg_dumpコマンドを使用してデータベースのバックアップ（ダンプ）を作成します。以下の手順に従って進めてください。

ステップ1: pg_dumpコマンドを使用して、データベースのバックアップを作成します。
```
pg_dump -U ユーザー名 -d データベース名 -f ファイル名
```
例:
```
pg_dump -U myuser -d mydatabase -F c -f backup.dump
```
このコマンドでは、以下のようなオプションを使用します:

- -U: データベースに接続するためのユーザー名を指定します。
- -d: バックアップを作成するデータベース名を指定します。
- -F: バックアップファイルの形式を指定します。一般的な形式には、"c" (カスタム形式), "t" (テキスト形式), "p" (プレーンテキスト形式)があります。
- -f: バックアップファイルの出力先となるファイル名を指定します。

ステップ2: バックアップファイルが正常に作成されたことを確認します。

## データリストアの手順:
バックアップファイルを使用して、データベースをリストア（復元）します。

ステップ1: psqlコマンドを使用して、バックアップファイルをデータベースにリストアします。
```
psql -U ユーザー名 -d データベース名 -f ファイル名
```
例:
```
psql -U myuser -d mydatabase -f backup.dump
```
このコマンドでは、以下のようなオプションを使用します:

- -U: データベースに接続するためのユーザー名を指定します。
- -d: リストアを行うデータベース名を指定します。
- -f: バックアップファイルのパスとファイル名を指定します。

ステップ2: リストアが正常に完了したことを確認します。

PostgreSQLでは、pg_dumpコマンドとpsqlコマンドを使用してデータのバックアップとリストアを行うことができます。
PHPの基礎(仮)

# 実行環境
とりあえず最新のバージョンで始めました。
- MAMP 5.0.5
- PHP 8.0.1
- MySQL 5.7.24
- Google Chrome
# PHPの基本
### PHPのルール
PHPでは下のコードのように処理を囲みます。例では、「echo」を使用して、Hello Worldを出力しました。
~~~php:index.php
<?php 
echo 'Hello World';
?>
~~~
出力結果です。実際にはChromeに表示されています。
~~~:出力
Hello World
~~~
処理が1行の場合は、セミコロンを省略しても動作します。
~~~php:index.php
<?php 
echo 'Hello World'
?>
~~~
~~~:出力
Hello World
~~~
### 変数の定義方法
変数の名前の前に$をつけて定義します。型の指定は必要ないです。出力の際に「" "」は変数を展開しますが、「' '」は文字列として出力します。brタグを使用して改行しています。
~~~php:index.php
<?php
$str = "で囲んでいます。";

echo "ダブルクォーテーション{$str}<br>";
echo 'シングルクォーテーション{$str}';
?>
~~~
~~~:出力
ダブルクォーテーションで囲んでいます。
シングルクォーテーション{$str}
~~~

### 文字列の扱い
文字の連結には「.」を使います。また、「.」による連結を使用しなくても書けたりします。
~~~php
<?php
$tom = 'Thomas Cruise'; 

echo 'Hello, ' . $tom . '<br>';
echo "Hello,  {$tom}";
?>
~~~

# さいごに
本記事では、ほんとに基礎的な内容しかやっていません。時間をかけてよりいいものに修正していくつもりですが、この記事以外のものも参考にすることを推奨します。
0.1のfloat表現から0.1を算出する

手元のＣコンパイラで 0.1 を float で表現すると（IEEE754の32bitだと）
3DCCCCCD
すなわち
00111101110011001100110011001101
になるんですが、逆に、このビットパターンから0.1に戻す計算をしてみます。

# 符号部

**0** 0111101110011001100110011001101
符号部がゼロなのでプラスです。

# 指数部
以下の太字の部分です。
0 **01111011** 10011001100110011001101
01111011は10進数で123で、IEEE754の規格により 127 をゼロとします。
123-127=-4
なので、指数部の意味するところは $2^{-4}$ すなわち最終的に $1/16$ されます。

# 仮数部
以下の太字の部分です。
001111011 **10011001100110011001101**
IEEE754の規格によりこれは少数部なので1を加え
1.10011001100110011001101
と解釈します。

よく見ると1001が繰り返されている！ので、これを２進数の循環少数とみなして分数に変換します。$x$ とおき、循環する部分を太字にすると
$x$ = 1. **1** 00 **1**
と表せて、循環部分は４桁なので16倍(２進数で10000倍)したものを用意します。
10000 $x$ = 11001. **1** 00 **1**
２進数なのに注意。ここから
$x$ = 1. **1** 00 **1**
を引くと、
$ 1111x = 11000$
$ x=\\frac{11000}{1111} $
となります。

# すなわち
指数部の$1/16$ を適用するため、分母を16倍(２進数なので0を４つ書き加える）します。

$ x=\\frac{11000}{11110000} $

１０進数で表すと
$ 11000 →　24 $
$ 11110000 → 240 $
すなわち
$ x=\\frac{24}{240}=\\frac{1}{10} $（10進数）
が導かれ、
00111101110011001100110011001101
というビットパターンが 0.1 であることを確認できました。めでたしめでたし。

# おまけ
実際にこのビットパターンは 0.1 は表現できておらず、IEEE754に従って計算すると
0.100000001490116119384765625
となります。２進数の少数で $ \\frac{1}{10} $ という値は表現できません。
今回は、例えるなら 0.3333334 という値を見て $ \\frac{1}{3} $ を導いた、という話でした。

# おまけ２
元々のビットパターンは手元のgccでコンパイルしてメモリの中身を取り出したものです。仮数部は切り捨てではなく切り上げするロジックになっているらしく、0.1より大きな値になっています。