OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails】rename_tableでテーブル名を変更したらインデックスのエラーが出る

# 発生した問題

rename_tableでテーブル名を変更する際に、インデックス名が長すぎるというエラーが発生しました。
元々のインデックスは64文字以内になってるし、テーブル名変更するだけなのになんで？と思ったので調べてみました。
```bash
Index name 'xxx...' on table 'table_name' is too long; the limit is 64 characters
```

## 環境
- Rails 7.0.5
- MySQL 8.0

# 原因
rename_tableで、テーブル名の変更とともにインデックス名の変更の処理もされていたためでした。
変更後のインデックス名が64文字を超えていたためエラーが出たようです。

## rename_tableの挙動
rename_tableのコードを見てみます。
```ruby
def rename_table(table_name, new_name)
  schema_cache.clear_data_source_cache!(table_name.to_s)
  schema_cache.clear_data_source_cache!(new_name.to_s)
  execute "RENAME TABLE #{quote_table_name(table_name)} TO #{quote_table_name(new_name)}"
  rename_table_indexes(table_name, new_name)
end
```
テーブル名変更のSQL実行後に、rename_table_indexesが実行されています。
rename_table_indexesも見てみましょう。
```ruby
def rename_table_indexes(table_name, new_name)
  indexes(new_name).each do |index|
    generated_index_name = index_name(table_name, column: index.columns)
    if generated_index_name == index.name
      rename_index new_name, generated_index_name, index_name(new_name, column: index.columns)
    end
  end
end
```
詳細を見ればわかりますが、generated_index_nameはRailsがインデックスをはる際にテーブル名とカラム名から自動生成するインデックスの名前です。
つまり、既存のインデックス名がRailsが自動生成したインデックス名なら、新しいテーブル名でインデックス名を生成し直しています。

## 要するに
新しいテーブル名が旧テーブル名より長くなったりするとそれによって変更されるインデックス名も長くなり、インデックス名の文字数上限(ここでは64文字)を超えてしまう場合に今回のエラーが出ていたようです。

# 回避策
インデックス名を明示的に指定して、Railsが生成するインデックス名と被らないようにしましょう。
```ruby
rename_index :target_table, :old_index_name, :new_index_name
rename_table :target_table, :new_table
```

# 参考
[raname_tableのソースコード](https://github.com/rails/rails/blob/984c3ef2775781d47efa9f541ce570daa2434a80/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb#L304)
YetAnotherHttpHandlerをMagicOnionで導入する方法

# はじめに

https://qiita.com/KyoheiOkawa/items/63a68bbcc3caaaac581e

以前MagicOnionの導入方法を紹介させていただきましたが、記事を公開した後Cysharp様が[YetAnotherHttpHandler](https://github.com/Cysharp/YetAnotherHttpHandler)をリリースされていたので導入方法を紹介したいと思います。

前回の記事のUnityインストール手順とクライアントコード以外は同じになります。

# インストール手順
## プロジェクト設定
Api Compatibility Levelを.NET Frameworkに

Scripting Define Symbolsに以下を追加
- USE_GRPC_NET_CLIENT
- USE_GRPC_NET_CLIENT_ONLY

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188476/b88289e4-dae0-0e43-14f9-28c8440117bd.png)


## YetAnotherHttpHandlerインストール

Window/PackageManagerの+Add package from git urlに以下を追加してパッケージ追加

```
https://github.com/Cysharp/YetAnotherHttpHandler.git?path=src/YetAnotherHttpHandler#v0.1.0
```

:::note warn
最新のURLが変わる可能性があるので、YetAnotherHttpHandlerのGitHubページをご確認ください
:::

以下のページから以下をダウンロードしてパッケージインポート
- Cysharp.Net.Http.YetAnotherHttpHandler.Dependencies.unitypackage
- Grpc.Net.Client.Dependencies.unitypackage

https://github.com/Cysharp/YetAnotherHttpHandler/releases/tag/redist-20230728-01

## MessagePackインストール

MessagePackのリリースページからUnityPackageをダウンロード

https://github.com/MessagePack-CSharp/MessagePack-CSharp/releases

すべてを選択してインポートした後、YetAnotherHttpHandlerの依存パッケージに含まれていた

Plugins/System.Runtime.CompilerServices.Unsafe

を削除

## MagicOnionインストール

リリースページから最新のUnityPackageを入手

https://github.com/cysharp/MagicOnion/releases

Pluginsの選択を外してインポート実行

# Unityクライアントコード

```csharp
using MagicOnion;

public interface IMyFirstService : IService<IMyFirstService>
{
    UnaryResult<int> SumAsync(int x, int y);
}
```

```csharp
using Cysharp.Net.Http;
using Grpc.Net.Client;
using MagicOnion.Client;
using UnityEngine;

public class Sample : MonoBehaviour
{
    void Start()
    {
        CallTest();
    }

    private async void CallTest()
    {
        var handler = new YetAnotherHttpHandler();
        handler.Http2Only = true;
        var options = new GrpcChannelOptions { HttpHandler = handler, UnsafeUseInsecureChannelCallCredentials = false };
        var channel = GrpcChannel.ForAddress("http://localhost:5000", options);
        var client = MagicOnionClient.Create<IMyFirstService>(channel);
        var result = await client.SumAsync(1, 2);
        Debug.Log($"Result: {result}");
        await channel.ShutdownAsync();
    }
}
```

# まとめ
前回の記事で簡単に導入できるそうと追記しましたが、それぞれのパッケージの導入手順通りにやっても導入できなかったのでそこまで簡単ではありませんでした。
気が向いて軽く検証してまとめた記事ですが、ご参考になれば幸いです！
転職活動で出会った残念な対応6選

## はじめに
私は2023年5月から約3ヶ月間、薬剤師からエンジニアへの転職を目指して転職活動をしていました。詳細はこちらの記事をご覧ください。

https://qiita.com/odendayoko/items/f616b2f1952897a9af5d#%E8%BB%A2%E8%81%B7%E6%B4%BB%E5%8B%95

転職活動中、信じられないほど残念な対応をする企業にたくさん出会いました。もうはっきり言いますが、**仕事が適当すぎる！！**
もし自分が採用に携わることになった時には、今回のような対応は絶対にしてはいけないですし、また転職活動をすることになった時は、適当な対応をする企業には行かないと思います。

今回は、私が転職活動中に出会ったケースをひどいなと感じた順にランキング形式で紹介します。
この記事を読んで、転職活動中の方にはこんなケースもあるのかと少しでも参考にしていただけたら嬉しいです。

## 転職活動中に出会った残念な対応ランキング

### 第6位　未経験エンジニアを採用する体制が整っていない
転職サイトで企業からスカウトしてくださり、とても良さそうな会社だったので採用担当の方とカジュアル面談をすることになりました。しかしながら、話を聞いてみるとまだ未経験エンジニアの採用例がないとのこと。社内では検討してもいいのではないかという意見も出てはいるそうなのですが、まだ基準も体制も整っていないので社内で相談してみないとわからないと言われました。
社内で相談してみるので書類選考に進んでみませんかと提案され、会社自体は興味があったので選考に進むことにしました。結果はほぼ諦めてはいましたがお見送りでした…👋

採用基準や体制はあらかじめ社内で決めておいて欲しいです。良さそうな会社だったので余計残念でした。


### 第5位　自社の子会社からスカウトが来た
前職は調剤薬局の薬剤師だったのですが、その会社の電子カルテシステムなどの開発を請け負っている子会社からスカウトが来ました。親会社の名前を見た時は驚いて笑ってしまいました😇
スカウトは蹴りましたがカジュアル面談で話を聞いてみたらもっと面白かったかもしれませんね笑

### 第4位 履歴書に実務経験がないと書いてあるのに経験者向けのスカウトが届く
履歴書やプロフィールには明確にエンジニアの実務経験がない旨が記載されているにもかかわらず、企業からは経験者向けのスカウトやオファーが届くというケースです。どう考えても経験者、即戦力を求めていそうだったので、「私は実務経験がありませんがお力になれますか？」と伺うと、次のような返事が返ってきました。

> おっしゃるとおり、実務経験がある方の採用をさせていただいております。
弊社よりスカウトをお送りさせていただきながらこのような連絡しかできず大変恐縮でございます。

>今回、ご連絡させていただいたエンジニアのポジションについて、誠に勝手ながら、現在社内で要件の見直しを行っており、ご面談について見送らせていただきたく、ご連絡いたしました。

「ですよねー😇」
無駄なやり取りが増えるだけなので、しっかりと履歴書を読んでからスカウトして欲しいです。

### 第3位 関係ない点に魅力を感じられたスカウトメール
企業からのスカウトメールの中には、「あなたの〇〇な点に大変興味を持ちました」「あなたの〇〇の経験は十分に発揮できると思います」のように、履歴書や職務経歴書の内容を踏まえて送ってくださるものがあります。しっかりと読んで、興味を持ってくださったことがわかり、こちらとしてもとても嬉しいです。

しかしその内容が、全く自分に関係がないものだったことがありました。
「一体誰の話をしているの？そんな内容は全く書いていない！😠」
あまりにも関係のない話すぎて笑ってしまいました。

定型文なのか送り先を間違えたのか、理由はわかりませんがいずれにしても失礼ですし適当すぎませんかね…
誤った内容を送るぐらいなら、全て定型文にした方がお互い傷つかなくて済むと思います。

### 第2位 GitHubのアカウント名を3回連続で間違えられる
一次面接=>二時面接=>最終面接と3回面接をしたのですが、3回連続でGitHubのアカウント名を間違えられました。おそらく面接官に渡されている資料への記載が誤っていたのだと思います。

面接官「すごくアプリ作ってますね。3年前から開発やってるんですね」
私「いや、そんなことはないのですが…」(ん？？なんの話？？？）
面接官「あれ…これもしかして別の方ですかね？」
私「多分？そうだと思います…」

一次面接でこんなやり取りをしました。これが1回だけだったらいいのですが、この後の2回の面接も全て間違えられました。

「いや１回目で修正しておいてくれよ😇」
こういったハプニングがあると、面接を受ける側は不信感を持ってしまいます。企業側は事前に資料や情報を正確に確認して、誤りがあれば修正して次の面接に繋げて欲しいです。

### 第1位　最終面接を面接官に忘れられた
志望度の高い会社で最終面接に進むことができました。ZOOMにログインし開始時間を待っていましたが、5分過ぎても面接が始まりません。10分待っても始まらなかったので不安に思い、企業の採用担当に電話をかけると、「面接担当に連絡してみますのでそのままお待ちください」と案内されました。

待機していると、5分後ぐらいに面接官が入室されやっと面接が始まりました。しかし、周りがザワザワしていて若い女性の話し声が聞こえてきます。明らかにカフェで面接をしているのだとわかりました。
「いや絶対面接忘れてたよね😇カフェで最終面接ってありなの？」と戸惑いましたが、気にしても仕方がないと気持ちを切り替えました。
面接中もずっとザワザワした店内の話し声が聞こえていました。周囲の音が入ってしまうような環境で面接を行うのは集中力が落ちてしまうのでやめて欲しいですし、相手に対して失礼だと思いました。オンライン面接が主流になってきている中で、もしかしたらこのような事例は少なくないのかもしれません。

大前提として面接を忘れないことが重要ですし、もしオンライン面接をやるなら、お互い静かで集中できる場所で実施して欲しいです。

## 終わりに
いかがだったでしょうか。色々な企業がありますよね。
転職活動中はお見送りが続いて病む人もいると思います。私もかなり病んでいました…

「落とされて辛い😭」と企業の立場が上のように感じてしまいますが、実際は転職活動において応募者と企業の立場は対等です。
企業と応募者、双方が同じ目線で向き合えることが理想ですが、実際は適当な対応もあリます。企業には真剣に転職活動に取り組んでいる応募者に対して失礼のないように向き合って欲しいです。

応募者と企業が気持ちよくマッチして、円滑に転職・採用活動が進むことを願っています。
【Java】レビュワーが体験した指摘事項の共通点

## はじめに
こんにちは、私はエンジニアとしての冒険は3年目！
転職も1度し、これまで2社の会社を経験したよ！

## 共通指摘事項
さて、現在の仕事では、新人やインターン生のコードレビューも任されてます。
その中で、よくある指摘点をここにまとめてみました。

##### ① コード規約に関する指摘:
JavaDocのコメント、命名規則など、自社ルールに則ったこと。
##### ② ロジックの流れに関するダメ出し:
Nullチェックやエラーハンドリングなど。
※個人的にprintStackTrace()でエラーログ終了だと、保守性悪い気がしてるのですが・・
##### ③ 共通化:
メソッド化、クラス化、リファクタリングの重要性。
##### ④ 外部ライブラリの使用:
動作が保証されているメソッドの使用。
##### ⑤ 例外処理:
後続処理への影響や例外の投げ方。

## まとめ
これら全てをカバーできる新人は珍しいですし、私も未だに指摘されます。
ですが、指摘する側も正直めんどくさい・・

## 最後に
レビュワーの皆さん、優しくしてくださいね。
そして新人の皆さん、この記事の内容を実装時にぜひ参考にしてみてください！
Excelブックのプロパティを取得するVBA

仕事でExcel VBAの調査依頼があり、調査の一環でブックのプロパティを取得することになりました

様々な方法で取得できますが、ここではVBAで取得する方法を記載します

以下の構文を使用することでブックのプロパティを取得することができる
WorkbookObject.BuiltinDocumentProperties(index/title)


index/titleに以下のインデックス番号かタイトルを入力することで取得できます
インデックス番号	タイトル	詳細
1	Title	タイトル
2	Subject	件名
3	Author	作成者
4	Keywords	キーワード
5	Comments	コメント
6	Template	テンプレート
7	Last author	最終更新者
8	Revision number	改訂番号
9	Application name	システム
10	Last print date	最終印刷日時
11	Creation date	作成日
12	Last save time	最終保存時間
13	Total editing time	合計編集時間
14	Number of pages	ページ数
15	Number of words	単語数
16	Number of characters	文字数
17	Security	セキュリティ
18	Category	カテゴリ
19	Format	フォーマット
20	Manager	マネージャー
21	Company	会社
22	Number of bytes	バイト数
23	Number of lines	行数
24	Number of paragraphs	段落数
25	Number of slides	スライド数
26	Number of notes	ノート数
27	Number of hidden Slides	非表示のスライド数
28	Number of multimedia clips	マルチメディアのクリップ数
29	Hyperlink base	ハイパーリンクベース
30	Number of characters (with spaces)	文字数（スペース含む）
31	Content type	コンテンツタイプ
32	Content status	コンテンツステータス
33	Language	言語
34	Document version	ドキュメントバージョン



以下は最終更新者を表示させます

Public Sub setProperties()
dim str1 as string
str1 = WorkbookObject.BuiltinDocumentProperties(”Last author”)
Debug.Print str1
End Sub
[日記]初めてのWebアプリケーション開発 インストール編

# はじめに
<!-- 発端や概要を記載 -->
今までHTMLやCSS,JavaScriptでのコーディングを遊びで勉強していました。

今回、家計簿をつけるときに、どうせなら自分で作ったもので、と思ったことからアプリの開発をやってみようとなりました。

実際に家計簿をつけるのはいつになることやら、、、（笑）

開発の手順はこちら↓を参考にします
https://qiita.com/Saku731/items/52a3bbacd002f26f408e

<br>
※当方、ガチで初めて。間違ったことをやらかすこともあると思いますが、その際は優しく指摘お願いします！

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [anacondaのインストール](#Chapter1)
1. [Git Bashのインストール](#Chapter2)
1. [Visual Studio Codeのインストール](#Chapter3)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# anacondaのインストール
anacondaのインストールは下記URLから行います。
<a href='https://www.anaconda.com/download'>anacondaのインストール</a>
<br>
Memo：anacondaはPythonのディストリビューションだそう。簡単にいうと、Pythonコンプリートパック。
Pythonを使って何かしたいときにはこれ一本！なやーつ。
<br>
<a id="#Chapter2"></a>
# Git Bashのインストール
Git Bashのインストールは下記URLから行います。
<a href='https://gitforwindows.org/'>Git Bashのインストール</a>

Memo：GitBashはWindows上でUnixやLinuxのコマンドを使えるようにするためのもの、らしい。訳わかりません（笑）。別で日記作る可能性大。
<br>
<a id="#=Chapter3"></a>
# Visual Studio Codeのインストール
Visual Studio Codeのインストールは下記URLから行います。
<a href='https://code.visualstudio.com//'>Visual Studio Codeのインストール</a>

Memo：超メジャーなテキストエディタのひとつ。拡張機能でどんどん自分好みにカスタマイズできるemmetがあるのもグッド！
参考資料には、Atomがインストールされてたけど、自分の使い慣れてるものを使います。
<br>
<!--総括、まとめ、コメント等-->
# 最後に
今回の日記ははじめの一歩！をするための準備を行いました。
次回からPythonに注目し、必要に応じてスタイルの勉強をしていきます。
とりあえず、仮想環境やらフレームワークを勉強、構築していきます。
Pythonの関数等動かし方は必要なものを段階的に勉強します。

最後の最後にXにも私のアカウントがあります。こちらの更新通知や雑談、趣味をつぶやいていますので良ければフォローお願いします。
<a href='https://twitter.com/Progres33515938'>私のアカウントです。クリック！</a>
【VSCode】flake8で特定エラーの警告を非表示にする

# やり方
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479797/1dc71379-a17f-3d90-310a-5d8c6a03ba2e.png)

1. VSCodeの設定を開く
1. `Flake8`で検索
1. `Flake8: Args`に以下を記載(今回はE501を非表示に設定)
```
--ignore=E501
```

# 参考
https://gushwell.github.io/TIL/VSCode/Python%E3%81%AEflake8%E3%81%A7%E7%89%B9%E5%AE%9A%E3%82%A8%E3%83%A9%E3%83%BC%E3%82%92%E9%99%A4%E5%A4%96%E3%81%99%E3%82%8B.html
JavaのDateTimeFormatterについて

## はじめに
JavaのDateTimeFormatterについてまとめてみた。
Javaには日付や時刻を扱うためのクラス「DateTimeFormatter」が存在している。
このクラスを使用し、日付や時刻を表現するには３つの方法がある。
・DateTimeFormatterクラス内の定数を使用する
・パターン文字を使用する
・FormatStyleを使用する

## 事前に定義された定数を使用する
DateTimeFormatterクラスにあるstatic定数を使って日付・時刻を表現する。
```Java
LocalDateTime dateTime = LocalDateTime.of(2023, 12, 17, 12, 10, 50);
        
DateTimeFormatter basicIsoDate = DateTimeFormatter.BASIC_ISO_DATE;
System.out.println(basicIsoDate.format(dateTime));
// 実行結果
// 20231217
DateTimeFormatter isoLocalDate = DateTimeFormatter.ISO_LOCAL_DATE;
System.out.println(isoLocalDate.format(dateTime));
// 実行結果
// 2023-12-17    
DateTimeFormatter isoLocalTime = DateTimeFormatter.ISO_LOCAL_TIME;
System.out.println(isoLocalTime.format(dateTime));
// 実行結果
// 12:10:50
```

## パターン文字を使用する
大文字と小文字のアルファベットを使用して日付・時刻を表現する。
```Java
LocalDateTime dateTime = LocalDateTime.of(2023, 12, 17, 12, 10, 50);
        
DateTimeFormatter dateTimeFormat = DateTimeFormatter.ofPattern("yyyy年MM月dd日HH時mm分ss秒");
System.out.println(dateTimeFormat.format(dateTime));
// 実行結果
// 2023年12月17日12時10分50秒
```

## FormatStyleを使用する
列挙型FormatStyleを使用して日付・時刻を表現する。
```Java
LocalDateTime dateTime = LocalDateTime.of(2023, 12, 17, 12, 10, 50);

// ロケールが日本

DateTimeFormatter formatFull = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).withLocale(Locale.JAPAN);
System.out.println(formatFull.format(dateTime));
// 実行結果
// 2023年12月17日日曜日
DateTimeFormatter formatLong = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG).withLocale(Locale.JAPAN);
System.out.println(formatLong.format(dateTime));
// 実行結果
// 2023年12月17日
DateTimeFormatter formatMedium = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.JAPAN);
System.out.println(formatMedium.format(dateTime));
// 実行結果
// 2023/12/17
DateTimeFormatter formatShort = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).withLocale(Locale.JAPAN);
System.out.println(formatShort.format(dateTime));
// 実行結果
// 2023/12/17


// ロケールがアメリカ

DateTimeFormatter formatFull_US = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).withLocale(Locale.US);
System.out.println(formatFull_US.format(dateTime));
// 実行結果
// Sunday, December 17, 2023
DateTimeFormatter formatLong_US = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG).withLocale(Locale.US);
System.out.println(formatLong_US.format(dateTime));
// 実行結果
// December 17, 2023
DateTimeFormatter formatMedium_US = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.US);
System.out.println(formatMedium_US.format(dateTime));
// 実行結果
// Dec 17, 2023
DateTimeFormatter formatShort_US = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).withLocale(Locale.US);
System.out.println(formatShort_US.format(dateTime));
// 実行結果
// 12/17/23
```
Stern-Brocot Treeで高速にN以下で表現される既約分数の近似値を求めたい

先日のABC333のG問題にて、Stern-Brocot Treeを用いる問題が出題されました。が、調べて実装してもTLEになってしまったのでその対策を行なった話をします。

https://atcoder.jp/contests/abc333/tasks/abc333_g

# Stern-Brocot Treeとは

自分も昨日はじめて耳にしました。
$[a/b,c/d]$の区間をノードにもっていて、子ノードに$[a/b,a+c/b+d]$,$[a+c/b+d,c/d]$を持つような木で、二分探索の要領でひとつずつ下に潜っていけばN以下で表現される既約分数の近似値がもとまるといったモノになっております。

詳しくはこちらの記事を参照されるとよいと思います。

https://satashun.hatenablog.com/entry/2018/12/13/163524

# TLEがとれない

愚直に実装したところ、だいたい0msや1msで実行できているのですが、なんか4ケースでTLEになってしまっていました。特定のケースの場合にめっちゃ時間がかかっている模様。

https://atcoder.jp/contests/abc333/submissions/48598794

こういうときは境界付近を疑うとよさそうなので、めっちゃ小さい場合を考えてみます。
$[0/1,1/1]$ の子ノードは、
$[0/1,1/2]$ の子ノードは、
$[0/1,1/3]$ の子ノードは、
$[0/1,1/4]$ の子ノードは、
$[0/1,1/5]$ の子ノードは・・・

という感じで、0/1付近や1/1付近は一度の操作で区間に使用される数字が1しか増えないことに気づきました。一方、今回の制約は $N \leqq 10^{10}$ なので、0.000000000000001みたいな入力がくると間に合いません。

# 処理を改良

これまでは、以下のような感じで次のノードに行っていましたが、ここを頑張って高速化しました。

```Rust
fn stern_brocot(
    pt: u128,
    qt: u128,
    pl: u128,
    ql: u128,
    pr: u128,
    qr: u128,
) -> (u128, u128, u128, u128) {
    let pm = pl + pr;
    let qm = ql + qr;
    if pt * qm < qt * pm {
        return (pl, ql, pm, qm);
    } else {
        return (pm, qm, pr, qr);
    }
}
```

$[a/b,c/d]$ -> $[a/b,a+c/b+d]$
ではなく、
$[a/b,c/d]$ -> $[a/b,ax+c/bx+d]$
となるような$x$をみつけて処理を高速化することを試みました。

子ノードに潜っていく方向を
右、左、左、左、右、右、右、右、右、左
だったものを
右×1、左×3、右×5、左×1
にするイメージです。

注意点として、右×1000000000みたいな場合に設定していた$N$をこえてしまうので適当なところで打ち切る処理をいれています。
右側に潜る場合と左側に潜る場合で計算がそれぞれ必要だったので、実装は少し面倒でした・・・が、これで高速化できて、全ケース1msで通るようになりました！！

```rust
fn stern_brocot(
    pt: u128,
    qt: u128,
    pl: u128,
    ql: u128,
    pr: u128,
    qr: u128,
    n: u128,
) -> (u128, u128, u128, u128) {
    let pm = pl + pr;
    let qm = ql + qr;
    if pt * qm < qt * pm {
        let x = ((pr * qt - pt * qr) / (pt * ql - pl * qt))
            .min((n - qr) / ql)
            .max(1);
        return (pl, ql, pl * x + pr, ql * x + qr);
    } else {
        let x = ((pt * ql - pl * qt) / (pr * qt - pt * qr))
            .min((n - ql) / qr)
            .max(1);
        return (pl + pr * x, ql + qr * x, pr, qr);
    }
}
```

https://atcoder.jp/contests/abc333/submissions/48600285

最後までご覧いただきありがとうございました！
いいね押していただけるとモチベ上がりますので嬉しいです :heart_exclamation:
頼む、俺の代わりにEMやってくれ！〜ジンジニアは俺がやるから！〜

## ATTENTION

この文章は以下の様な方におすすめです。

- テクノロジーマネジメントには自信ないが、ピープルマネジメントには強い関心がある方
- 非エンジニア・非情報系からジョブチェンジしてIT業界へいらした方
- 私の代わりにEMやってくれる方

## はじめに

初めまして、株式会社Hacobuで組織開発室・室長をしておりますAKITO3です！
元々QAエンジニアとして働いていた私が、EMを経験し、組織開発室を立ち上げ、組織の最適化を目指して動き始めた話を記載します。

## 背景　EMのあり方って？

これまで、HacobuのEMはテクノロジーマネジメントとピープルマネジメント双方を兼ね備えている方、片方だけに特化した方と、EMとしての得意領域、特徴がそれぞれ異なっていました。

そのため、周りからのEMへの期待値がそれぞれ異なってしまい、EMにはジャンル問わず様々な依頼が飛び込んでくる状態になり、広い範囲の業務をこなす存在になっていました。

こうした理由により、EMが一種の「なんでも屋さん」の様な状況に陥ってしまったため、EMの役割を再定義することになりました。

## HacobuのEM

そうした議論の中で「EMの役割はピープルマネジメントに特化するのも良いのではないか」との議論もありましたが、最終的にはテクノロジーマネジメントを現場で出来ないEMでは、現場メンバーとの信頼関係構築が難しいのではないかという判断となりました。

最終的に

- テクノロジーマネジメントとピープルマネジメントを双方実践する

こちらがHacobuのEMの役割であり、それを実践できることが要件になりました。

## ん？あれ？私はEMじゃなかった件

私は前職のQA時代からピープルマネジメントには非常に興味があり、QAマネージャーに近しい立場も経験してきました。Hacobuに入社してからもその思いは消えず、入社して半年という早さで、EMとしてチャレンジできるチャンスを頂き、私なりに組織に貢献できる様に尽力してきました。

しかし、私はQAエンジニアとして働く以前は商社営業をしており、また情報系大学の出身ではありません。そのため、テクノロジーマネジメントに関する経験は少なく、私が今回のEMの要件を満たすことは難しくなってしまいました。つまるところ、私はピープルマネジメントを通して組織貢献を目指していた中、そこに携わる方法をいきなり失ってしまいました。

## EMがだめなら・・・枠を作る！

一方で新しいEMの定義をしたものの、EMはテクノロジーマネジメント、ピープルマネジメントを双方を実施することになっており、引き続き負荷が高い状況になることは予想されました。もちろん、EMへの負荷が増大し、テクノロジーマネジメントに注力できない状況はプロダクトの提供価値を下げてしまうことに繋がります。そこで私は、ピープルマネジメントの側面から、EM・開発組織全体をバックアップする組織を作ることを提案しました。

提案後は様々な議論が交わされましたが、その議論の内容だけで記事が書けるレベルなのでいずれ書く機会があれば書きたいと思いますが、提案から紆余曲折を経て生まれたのが、「組織開発室」です。

EMの定義が変わった結果、私はEMの枠には入りませんでしたが、EMの枠以外の方法で組織課題を解決する方法を考え、自分の特性に一番あった形で組織貢献できる枠を作ったのです。

## 組織を最適化する

組織上のもう一つの課題として、CTO室が組織横断の技術課題・組織課題双方を担っており、こちらも負荷が高い状況になっていました。CTO室には技術課題の解決力の高いメンバーが揃っていることもあるので、双方の課題に追われてしまう状況を解決し、メンバーがより得意分野に集中できる環境を作ることが必要でした。

また、先述のEMの課題もあり、組織開発室は、EM、CTO室双方の課題を吸収できる組織になることが、開発組織にとって最も価値があると考えました。

そのため、組織開発室は下記の2点を目的として、走り出す事にしました。

- EMと並走し、EMが活躍しやすい環境を作る
- CTO室が横断的な技術課題の解決を担い、組織開発室が横断的な組織課題を解決を担う

そして目下、次の様な活動に取り組もうと考えています。

- 組織・採用計画
    
    組織を俯瞰して、最適な人員の配置・採用を検討します
    
- 広報活動
    
    社外発信を通してHacobuの開発組織の魅力を伝えます
    
- 文化醸成
    
    開発組織の文化を醸成し、一枚岩の開発組織を目指します
    
- EMフォロー
    
    EM負荷の削減を目指し、テクノロジーマネジメントへさける時間を増やします
    

まだまだ出来ること、やりたいことはありますが、まずは一つ一つを達成して組織に必要な存在であることを証明していこうと考えています！

## まとめ　いつの間にやらジンジニア

今回はEMを退任することになりましたが、後方支援としての組織貢献を選び、組織開発室を立ち上げるまでに至りました。元営業マンは転んでもタダじゃ起きません（笑

まだまだ走り始めたばかりの組織ではありますが、人事・労務とも協力しながら、これからの未来に向けて進んでいこうと考えていこうと思います。

ジンジニアという言葉は組織を立ち上げることを決めてから知った言葉でしたが、今の私に最もしっくりきており、開発組織への貢献方法はエンジニアリングだけではないことを改めて考えています。

もし、私と同じようにテクノロジーマネジメントには自信なくても、ピープルマネジメントには興味が強くある方々、非エンジニア・非情報系からジョブチェンジしてIT業界にきた皆様への参考になれば幸いです。

## 最後に、頼む、誰か俺の代わりにEMやってくれ！

ということで、今は私の担っていたEMの枠が空いてしまいました！

私の代わりにHacobuでEMやってくれる方、お待ちしています！😄

[【テクノロジー本部】エンジニアリングマネージャー - 株式会社Hacobu](https://herp.careers/v1/hacobu/3mrybLD920yM)
無料で使えるOSSのノーコード開発ツール「プリザンター」

# はじめに
ノーコード開発ツール [プリザンター](https://pleasanter.org) を開発しています。オープンソースとしてGitHubに公開しており、機能制限やユーザ制限なく無料で使うことができます。開発当初は個人で開発しておりましたが、現在は法人化して組織で開発を行っています。

https://github.com/Implem/Implem.Pleasanter

# 導入事例
金融機関や大手製造業など大企業のさまざまな管理業務に利用されており、現在21件の導入事例を公開しています。クローズドなネットワークで利用でき、大人数で利用しても費用がかからないなどの理由で大企業にとって導入しやすいノーコード開発ツールとなっています。

https://pleasanter.org/cases

# ITreview Grid Award 2023 Fall
口コミサイトITReviewの「ローコード開発部門」では、認知度、満足度ともに上位に位置付けられています。この中で無料で使えるオープンソースは「プリザンター」だけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78230/2ff78a53-8b23-6fec-47b3-53eacceaba48.png)

# 口コミ
使いやすさやカスタマイズ性についても、多くのユーザが評価してくれています。オープンソースということもあり、ファンになってくれるユーザが多いのも特徴です。

https://www.itreview.jp/products/pleasanter/reviews

# パートナー企業のエコシステム
ノーコードツールは扱える人が多いほうが安心です。プリザンターをビジネスに活用するパートナー企業が70社を超えました。パートナー企業は技術情報や事例の発信、アドオンツールの開発、付加価値の高いサービスなどを提供しており、プリザンターを中心としたエコシステムを形成しています。

https://pleasanter.org/partner

# 動画デモ
実際の使い方がわかる20分の動画デモを公開しています。プリザンターの機能や画面イメージを確認することができます。

https://www.youtube.com/watch?v=-ClJGmoK7WA&t=16s

# Advent Calendar
プリザンターの高度な使い方などを紹介するAdvent Calendarも行っています。
https://qiita.com/advent-calendar/2023/pleasanter

## おわりに
プリザンターは今後も業務に役立つノーコード開発ツールとして進化を続けてまいります。応援よろしくお願いします。皆さん良いクリスマスをお過ごしください。
https://pleasanter.org
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78230/1764addf-fe7a-b707-0d06-d84ad7899014.png)

:star:GitHubにスターつけてもらえたら嬉しいです。
https://github.com/Implem/Implem.Pleasanter
[CDGC] 2023.11 ⑦REST API

# はじめに

<!-- ★『インフォマティカが提供する、 CDGC(データガバナンスとデータカタログ)を使って』までは定型文 -->
[インフォマティカ](https://www.informatica.com/jp/)が提供する、 [CDGC](https://www.informatica.com/jp/products/data-governance/cloud-data-governance-and-catalog.html)(データガバナンス＆カタログ)において、2023年11月にリリースされたメジャーバージョンで、更新されたREST APIについて記載します。
※2023/12時点の情報を元にしています。

# CDGCのREST APIとは？
CDGCが持つ機能群は、REST APIとして公開されており、外部から呼び出すことができます。
例えば、検索、Import/Export、ジョブ監視などのAPIがあります。
詳細は、下記のKB(ナレッジベース)をご覧ください。

- CDGC の Public REST API - Postman コレクションサンプル

https://knowledge.informatica.com/s/article/CDGC-Public-API-Postman-Collection?language=ja

<BR>

- API Reference

https://docs.informatica.com/data-governance-and-quality-cloud/data-governance-and-catalog/current-version/api-reference/preface.html

# 2023.11での更新内容
カタログ・ソース管理 REST API を使用して、指定したカタログ・ソース ジョブを実行できます。

下記のヘルプに仕様の詳細が載っているので、ご覧ください。

https://developer.informatica.com/tpn/v5/reference/catalog-source-management-apis


catalogSourceUUIDを設定し、オプション実行を設定することで、ジョブの中にどのオプションを含めるかを設定できます。基本的には、画面上で実施する設定と同じになっていますね。

- メタデータの抽出
- データプロファイリング
- データ品質
- データ分類
- リレーション検出
- 用語集の関連付け

:::note info
メタデータの抽出は、カタログ・ソース ジョブを、初めて実行する場合には必須です。それ以降に実行する場合は、カタログ・ソース ジョブを実行する前に少なくとも 1 つのオプションを指定していることを確認してください。
:::

# 参考文献
<!-- ★URLをそれぞれのカタログ・ソースに応じて変更する -->
- [**Catalog Source Management APIs - API Guide**](https://developer.informatica.com/tpn/v5/reference/catalog-source-management-apis)
AnsibleでUbuntu22.04のEC2にPHP7.2を入れてみた

本記事は、エキサイトホールディングス Advent Calendar 2023の17日目のものになります。
リンクは[こちら](https://qiita.com/advent-calendar/2023/excite-hd)
<br>

# 本記事の目的
Ubuntu22.04のEC2にPHP7.2を入れる際に必要だった操作やPlaybookなどを記載しておく。
＊結構調べたのですが、同じことをやっている人があまりおらず、日本語の記事が少なかったので、Tipsとして記録しておく。
<br>
# Ubuntu22.04のEC2を用意する
私は、会社からEC2作成の際にAMIが準備されています。
AWSのEC2から適当にUbuntu22.04のEC2を選択して作成してください。
特にこちらに関しては、記載しません。

Ansibleのバージョン: ansible 2.9.9
<br>
# PHP7.2をインストールするPlayBookを作る
今回は、Block単位でタスクを実行してほしいと考えました。
理由は、散らばるとPHP7.2をインストールのための前準備かどうかとかもわからないからです。

```yaml
- name: Install php7.2 Block
  block:
    - name: software-properties-common
      apt:
        name: software-properties-common
    - name: PHP | Install Ondrej PHP PPA
      apt_repository:
        repo: 'ppa:ondrej/php'
        update_cache: yes
    - name: "Updating the repo"
      apt: update_cache=yes
      become: yes
    - name: Installation PHP 7.2
      apt:
        name: php7.2
        state: present
      become: yes
```
ちょっとずつ解説していきます。

### software-properties-commonについて
こちらは、その次のリポジトリ`ppa:ondrej/php`をインストールするために追加しておく必要があります。PHPのバージョンが少し古いものをインストールするときは、このリポジトリがよく使われる印象です。

### Ondrej PHP PPAについて
これは、希望したPHPのバージョンをインストールするのに必要なリポジトリになります。
PHP5.5, 5.6, 7.0とかも同様にできるらしいです。

update_cache: yes
は、インストール前に`apt-get update`をしてくれます。これがないとインストールに失敗したりします。
updateは時間かかる！何度も実行したいよ！の場合は、`cache_valid_time`を指定してあげると良い。


### Updating the repo
まあ、正直`Installation PHP 7.2`にupdate_cache: yesを追加すれば良いです。
やっていることは同じですが、このように明示的にすることもできるということを伝えたく、わざとこう書きました。

### Installation PHP 7.2
じゃあ、バージョン指定をしてインストールしていきましょう。
`name: php7.2`
で、7.2をインストールできます。
<br>
# PHP7.2は古いわ！
えーと、その通りです。ですが、プロジェクトによっては、移植で速攻で作成してほしい。一から作るというよりほぼコピー品として作成して、別サイトを作成してほしい。でも、Ubuntuのサポートしているバージョンにはしておきたい。そんな時の参考にしてください!PHPのバージョンを少し古めなものを扱うときに役に立つかと思います。
<br>
# 以下、Tips的なAnsibleの情報
### dry runのやり方
コマンド例: `ansible-playbook -i playbook.yml --check`

dry runでshellを利用した結果を元にバージョンチェックを入れたい場合、shellで確認した値がskippedされることがあります。その場合、変なエラーで返ってくることがあります。(値がないよ的な...)
それを防ぐには、`check_mode: no`でdry run実行時にskipしないようにすることができます！
これ結構便利！

### 複数タスクを同じタスクとして実行する方法
例えば、dry run実行時に、ひとつ前のタスクを実行した上で次のタスクを実行しないと成功しない場合やタスクをまとめてみやすくしたい。などをするときに使えます。
```yaml
- name: block task
  block:
    - name: task1
        ...
    - name: task2
        ...
    - name: task3
```
[参考リンク](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_blocks.html)

### エラーを無視する
タスクでエラーが発生してもとりあえず、無視して一通り確認したい！場合あると思います。
そんな時に使えます。

```yaml
task:
- name: task1
  ...
- name: task2
  ...
  ignore_errors: yes
- name: task3
```
task2でエラーが出てもtask3に移り無視します。
dry runでお試し実行の時に使えたりします。

[参考リンク](https://ansible-workbook.readthedocs.io/ja/latest/hensu2/erro-handling.html#error-wo-mushi-suru)

### タスクファイルの再利用方法

```yaml
- import_tasks: task/install1.yml
- import_tasks: task/install2.yml
```
`task/install1.yml`を完了後、`task/install2.yml`を実行するような順になっています。
playbookは、`import_tasks`だけで作り上げることもできます。

# 終わりに
今回は、あくまでUbuntu22.04でPHP7.2をインストールしたい
というニッチな記事になっています。
Tipsも記述しましたが、少しでも参考になったら嬉しいです。

# 余談
terraform周りの記事や輪読会で読んだ本についての記事も書きたいな〜
と思っています。ちまちま書いていきます。
SJC-P 6 を Java SE11 Goldにアップグレードした話

# 長い前置き

最後に Java の試験に挑戦したのは何時だっただろう？
ふと思い返してみると12年前でした

2010年に学生→サラリーマンとクラスチェンジを果たしてから約1年
それまではVC+の業務をやってましたが、現場が変わり扱う言語がJavaに変わったのをきっかけに
基礎知識を身に着けるため資格試験に挑んだのでした

SJC-P 6
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532289/97d85fde-982f-1aef-6de9-0e2e517ddd55.png">
SJC-WC
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532289/f0c73b14-6f1c-355d-4c58-5600d6c18c8d.png">

SJC→OCJに変わったのは2013年ぐらいなので、そこから見ても10年以上経過しているんですね

Java8が主流になり2016年ぐらいにJava Goldの制度が登場しました
そこで資格のアップグレードをするかと紫本を買ったんですが…買って満足して今に至ってしまったわけです

OpenJDKの中でもEOLが視野に入ってきたJava11、いまはJava17、21辺りを採用している企業も増える中、SJC-PからJava Goldにアップグレードできるのもそろそろ限界かもしれないと思い立って動き出しました（今更感）

# 勉強方法

## まずはじめに

同じようにアップグレードしている方の記事を参考にしました

https://qiita.com/aminosan000/items/f922711d9753d91a40b4

もうこの記事だけでいいんじゃない？ってぐらいしっかり書かれてます

## 私の学習方法

### Java SE11 Gold の黒本

解説を読みつつ最後まで1週間ほど実施しました

一通りの基礎知識は身に着く印象です
ただこれだけ勉強して試験に挑むと、ModuleもLambdaもStreamも単純な問題しかないので、初見で見るメソッドを使った問題や、試験問題の複雑さに苦戦すると思います

### Udemy

https://www.udemy.com/course/ocp_java-se-11_1z0-819_p2/

1. Working with Lambda expressions
1. Working with Streams
1. Java Platform Module System
1. Java I/O API

アップグレード試験だったので試験範囲はかなり絞って勉強しました
この中でModuleについてはかなり役立ちました
黒本でうーん…って感じていたものが、何となくわかったマンになれました

LambdaとStreamsについても、試験よりも難しい問題が多く試験は結構楽でした
こちらの問題は仕事終わりに、酒を飲みながら2週間ほど続けました

# 試験結果と試験傾向

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532289/a366a337-38b0-5dff-8e55-8d94f3ba7eff.png)

試験結果は、解き終わった時の感覚と近しい点数でした
・31問はたぶん自信半分ぐらい
・49問はたぶん正解しているだろう

50問取れれば合格できる試験で、60問ぐらいは正解できたかな？と思ってます

試験の時間配分は参考までですが以下のような感じです

1. 60分で一通り問題を解き終える
1. 40分で後で見直す問題を見なおす
1. 40分で一通り見なおす

久々のJava試験ですが、記憶があいまいな部分を突いてくる感じ懐かしさを感じました
ただ日本語がかなりしっかりしていて、読んでて苦にならない点は進歩を感じました

試験傾向としては、以下のような感じで１～４の比率が多く、５、６が続いて試験問題で出てくる感じでした
黒本に型推論について問題はほとんどないので、どういうケースで使えて、どういうケースで使えないかはある程度調べておいた方が良いかもしれません

1. Java9で登場したモジュールシステム
1. ラムダ
1. 関数型インターフェース
1. ストリーム
1. nio
1. 型推論（var）


# 最後に

Java SE17 Goldの日本語版も、Java11がEOLになるあたりで登場するかもしれませんが…
Java21のEOL辺りで、またJava試験のアップグレードしようと思います
LINUX初心者の私がつまづいたこと事

## 前置き
　1月にLinux技術者認定資格(LinuCの101)を受験するにあたり個人的に躓いたところを書き出しておく。
 受験する方はこちらを確認することで、勉強期間や受験時の勉強方法の参考にしてもらいたい。
 ※受験が来月の為、躓いたことリストは増える可能性があります。

## Linuxで使用するファイルの権限の操作について
Linuxのファイルを管理するにあたり、ファイル所有者と所有権を設定・
変更するコマンドが3種類あるがそれぞれの違いがはじめ解らなかったためここで記載します。

### １.前提知識
Linuxではログインするためにアカウントが必要です。
これをユーザーアカウントというのですが、アカウントは任意に複数作成が可能です。
また、アカウントを作成するとユーザ名と同様の名前のグループが作られ、
ユーザはそのユーザグループに所属しているとシステムに登録されます。
グループは複数のユーザに紐づけさせることが可能で、紐づけさせることで複数のユーザに対して同じ処理を実行することや、権限を付与することが可能となります。

### ２.ファイル所有者と所有権を設定・変更するコマンド
#### (1)chown 
前提知識で説明したユーザーアカウントはLinux内でのユーザ IDとして管理されます。
ファイルの管理者(所有者)としてユーザーアカウントが登録されている場合、
ユーザーアカウントを変更することが出来るのがこのコマンドです。

#### (2)chgrp
前提知識で説明したユーザグループはLinux内でのグループ IDとして管理されます。
ファイルの管理者(所有グループ)としてユーザグループが登録されている場合、
ユーザグループを変更することが出来るのがこのコマンドです。

#### (3)chmod
ファイルに権限を付与できるコマンドです。
ファイルの所有者、所有グループに設定されたアカウントはそれ以外のアカウントに対して
読み、書き、実行の３つの権限を設定できます。
またこの権限の付与は所有ユーザ、所有グループで所有者以外のユーザ、所有グループ以外のユーザごとに付与が可能です。

### ３.ファイル所有グループの確認
ls -l ファイル名,フォルダ名をコマンドにて入力することで下記のようにファイル内の属性を確認することが出来ます。

```
$ ls -l .bashrc
-rw-r--r-- 1 penguin linux 124 2 月 6 02:44 .bashrc
（所有者が読み書き, 所有グループが読み, その他が読み）
$ ls -l /usr
合計 272
drwxr-xr-x 3 root root 4096 2 月 6 01:45 X11R6
drwxr-xr-x 2 root root 4096 2 月 8 13:07 arc
drwxr-xr-x 2 root root 69632 2 月 9 04:02 bin
drwxr-xr-x 2 root root 4096 3 月 30 2007 etc
drwxr-xr-x 2 root root 4096 3 月 30 2007 games
drwxr-xr-x 84 root root 12288 2 月 6 02:04 include
drwxr-xr-x 6 root root 4096 11 月 11 11:39 kerberos
drwxr-xr-x 108 root root 69632 2 月 7 11:41 lib
drwxr-xr-x 13 root root 4096 2 月 9 04:02 libexec
drwxr-xr-x 11 root root 4096 2 月 6 01:43 local
drwxr-xr-x 2 root root 16384 2 月 7 11:41 sbin
drwxr-xr-x 226 root root 12288 2 月 6 02:05 share
drwxr-xr-x 5 root root 4096 2 月 6 08:52 src
lrwxrwxrwx 1 root root 10 2 月 6 01:43 tmp -> ../var/tmp
```

それぞれの見方をファイル[.bashrc]を元に説明します。
```
[1]-rw-r--r-- [2]1 [3]penguin linux [4]124 [5]2 月 6 02:44 [6].bashrc
```
[1]ファイルの種類と許可属性です。
　**最初の1文字：**
  　ファイルの種類」を示しており、ディレクトリなら「d」、シンボリックリンク（実体は別の所にあるファイル）ならば「l」、通常のファイルならば「-」などと表示されます。
　**2～4文字：**
   　所有ユーザに付与されている権限、読み込みなら「r」、書き込みなら「w」、実行またはディレクトリの移動ならば「x」が表示される。
   　**5～7文字：**
   　所有グループで所有者以外のユーザに付与されている権限。
   　**8～10文字：**
   　所有グループ以外のユーザごとに付与されている権限。
    
[2]ハードリンク数です。
　　ディレクトリの場合、自身の名前(例：user,hoge etc)以外に自分自身を示す「.」というハードリンクが自動で作成されます。ハードリンクは全てのフォルダに付与されるため、階層が深いところにあるファイル程この数が多くなります。
[3]所有者と所有グループです。
[4]ファイルサイズです。
[5]タイムスタンプです。ファイルが操作された最終日時が表示されます。
[6]ファイル名です。

## 参考文献
Linux標準教科書
https://linuc.org/textbooks/linux/
WordPress日本語訳ドキュメントのリンク切れを直すためにプルリクを出した話

この記事は [CMS(WordPressやヘッドレスCMS) Advent Calendar 2023](https://qiita.com/advent-calendar/2023/cms) の 17日目の記事です。

***

![スクリーンショット 2023-12-17 12.08.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331211/c0d112cc-df6c-4316-06a1-2908679ed942.png)

WordPressの日本語サイト [ja.wordpress.org](https://ja.wordpress.org/team/handbook/) には、有志の方が英語の開発ドキュメントを日本語訳してくださっていて、近年のWordPressユーザーが積極的に学習すべきブロックエディタの開発やブロックテーマの開発などのドキュメントも日本語訳ドキュメントが充実しています。

そのドキュメントを活用させていただいて学習を進めていた際に、ドキュメント内に一部リンク切れを起こしている箇所を発見したので、その修正を初めてWordPressコミュニティで提案・自身で修正プルリクを出した時のお話です。

↓その際のプルリク
https://github.com/jawordpressorg/gutenberg/pull/26

## チュートリアル用のドキュメントのリンクが切れていた

ブロックエディターハンドブックの手順に従って開発環境の構築の確認を進めていたら、Node.jsのダウンロードに関するリンクが切れているのに気がつきました。（当然現在は修正済）

![スクリーンショット 2023-12-16 9.36.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331211/4e24e866-e4f2-8da8-b703-ba55b20a397c.png)

従来からフロントエンド開発でNode.jsを使っている身としては、別にスルーして問題ないところではありました。

しかし、せっかく気づいた人が話題を共有しなければ、このリンクは死んだままです。

個人的な話になりますが、WordPressのコミュニティイベントである [WordCamp TOKYO 2023](https://tokyo.wordcamp.org/2023/) にて、コントリビュート活動の意義や重要性に気づいたばかりでしたから、この小さな問題が初学者の学習の妨げになりうるのであれば見逃すべきではないと考えて、なんとかして問題をWordPressドキュメントの担当の方へ共有しなければと思った次第です。

より個人的な話を読んでくださる方は [こちら](https://note.com/qoorus/n/ne3eb18378d3e)

## WordSlackのdocチャンネルで相談

とは言っても、誰にどのように声を掛ければ良いかがわからなかったので、ひとまずWordCampの際に勢いで参加したWordSlackのチャンネルに呼び掛ければ良いかなと考えて、こんな投稿を。

（WordSlackへの参加方法は [こちら](https://ja.wordpress.org/support/article/slack/) ）

<img width="270" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331211/89172050-8f27-8de9-5319-298686d0988b.png">

すると、WordPress Japanese Teamの [@atachibana](https://twitter.com/atachibana) さんがお声がけくださり、ドキュメントの元となっているGitHubリポジトリの該当ファイルのリンクを送ってくださり、プルリクを送ってみて欲しいとのこと。

<img width="270" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331211/126ddb9f-99db-2524-7d23-b2ee4ca24203.png">

## 簡単なテキスト変更であればGitHub上のみでプルリク可能

現在のGitHubの軽い変更のコミットであれば簡単なもので、atachibanaさんご指示の通り、鉛筆アイコンをクリックして編集するとForkもブランチ分割もコミットも半自動的にやってくれました。

![スクリーンショット 2023-12-17 12.36.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331211/da55ae58-d29f-53a5-e64d-d1256dbe8a2b.png)

該当のリンクの部分の修正、リンク先のidの修正をコミットしてプルリクまで終了。

作業完了の報告をslackですると、atachibanaさんから協力者の名前一覧に私の名前も載せてくださるとのご報告が。

https://ja.wordpress.org/team/handbook/block-editor/

<img width="270" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331211/5d0993b5-2896-b4ae-ada2-dd98e078afa5.png">

翻訳者になろうと意図してやったことではないですが、これが私の人生初めてのOSS活動、コントリビュートになったわけです。

WordPressのブロックエディタ開発を学習する方の妨げがこれで取り除けたのだと信じて、これからも積極的に自分が気づいたことは直していってみようかなと思います。
docker初心者でも超分かりやすかったUdemy講座

# **皆さん初めまして！**

インフラエンジニア歴もうすぐ3年のitohです。

突然ですが最近、会社の流れでオンプレミスでdockerホストを構築・運用していくことになりました。
普段はKVMで仮想マシンの作成やら、オンプレミスサーバの構築、
ロードバランサの設定やバージョンアップなどに費やす人生を送っており、コンテナというものをあまり詳しくは知りませんでした。

そんなこんなでまずは勉強から始めなければと思い、Udemyの講座を一度受けてみて勉強しました。**今回はそこで実際に受けてみて、よかったUdemyの講座を一つ紹介します。**

:::note warn
*あくまで個人の感想ですので、参考程度に見ていただければ幸いです。
また、ここでは具体的な講座の中身については説明しません。あくまで良かったことなどの感想のみ記載します。
:::

# 講座概要

| 主要項目 | 名前 |
|:-:|:-:|
| 講座名  | 初心者OK！Docker入門＋応用：ゼロからでも実務で使えるスキルが身に付ける  |
| 作成者  | ケンタロウ 0 0  |
| 使用環境  |  macOS&DockerDesktop |
| 最終更新日  | 2023年7月  |
| 講座の時間  |  およそ10時間（自分はメモりながらやっているのでもう少しかかっている） |
|値段|¥4,800-(自分が受けたときはセール期間で、¥1,500-)|

https://www.udemy.com/course/ok-docker/

# なぜこの講座をうけようと思ったか
いろいろな講座があるなかで、この講座をうけようと思った要因は主に以下の通りです。

### 実行環境がmacOSだったから

自分がプライベートで使用しているPCがmacbookしかないため、同じ環境で講義を行なっていただけることに安心感を感じたため

### 日本人講師の中で評価件数が高かったため
評価数は400件近くあり、総評価も4.6と高く、ハズレではないだろうと思った。のちにも記載するが、実際にdockerを触ってみて分かりやすい講座であった。

### 同じ値段の講座と比較して情報量が多く、講座も長すぎない。

本講座では、dockerの基本操作の理解から、軽めの応用の方法の仕方までを網羅しており、
内容が濃い。他の講座では、講座が長すぎない代わりに多くの情報を広く取得できないので、
同じ値段でセールされていたらこちらの方が良いだろう。
また、20時間等の長い講座でないため、モチベーション的にも達成しやすいと思う。

主な講座内容
- メリット
- ネットワーク
- ボリューム
- カスタムイメージの作成
    - カスタムイメージの容量削減方法も。
- Compose
- お試しのCICD

# 良かった点

### 最新のコマンドなどを考慮して説明してくれる

　`docker ps` -> `docker container ls`というような、旧コマンドであることを説明した上で最新のコマンドを紹介してくれる。古い講座や情報サイトでは説明されていないところがあったりするので、そこを説明していただけるのは個人的に嬉しかった。

 ### dockerの基本操作などをハンズオンしながら体験できる。また、図説が分かりやすい。

 実際にコンテナやボリューム、ネットワークなどをハンズオン形式で説明していただけるため、自分の環境でも通信できていることを把握しながら進められるため、イメージを把握しやすい。
また、要所要所ででてくるコマンド、オプションの説明や構成図の説明が概念図で説明していただけ、どのような関係性を持っているか分かりやすい。

 ### 実践想定の、CICDの手法を教えてくれる。
本当にdockerの内容だけしりたいというのであれば、ここの内容は不要だと思います。
ただ、小規模でも実際にコンテナを作成し、デプロイする。それをさらにイメージとして管理するという内容を、
最後の講座で教えていただけるため、実践にも役立てることができます。

自分の職種はアプリケーションを作成する部署ではないため、直接的に業務に役にたつ内容とは言えなかったですが、デプロイのイメージを把握することができたのは収穫だと思っています。

### AWS、Githubの設定を少し知れる。
 
 dockerがメインであり、ここは実践形式で行わないのであれば不要なコンテンツなのですが、最後の実践形式で触る部分ではAWSのECR、ECSに少し触れます。
 そのためにIAMの設定などを行う箇所があるため、AWSの知識を得ることも可能です。
 あくまでおまけの内容なのでしっかり触れるわけではないので、AWS、Githubについては別途勉強が必要です。


 # 良くなかった、注意する点

正直よくない点は自分ではなかったのですが、あえていうのであればここに関する内容は注意すべきかなと思っています。

### AWSリソースは有料
これは他の講座にも言えることですが、AWSは初期の無料期間を過ぎると、EC2などを動かす際に料金が発生します。自分はもう無料期間を他の勉強で使い果たしてしまったため、もう無料で作成できないです。
講座の代金以外でも料金が発生する可能性があることは把握しておきましょう。

### Kubernetes(以下k8s)については触れない。
講座名は**docker**なのでそこは最初から割り切っていましたが。

コンテナを実運用している場合はコンテナオーケストレータと合わせて運用している所が多いと思います。
今回はECSにて操作していきますが、　世間一般ではk8sが一般的です。
k8sについて勉強がしたいという場合は、別途k8s専門の講座を受けてみるべきです。


### 講座はMacOS前提で進んでいく。
おそらく環境による差異はそこまでないと思っていますが、講師の環境はmacOSであり、自分の環境もmacOSで進んでいきます。WindowsOSで操作する場合は操作が一部異なる可能性があります。
また、オンプレLinux上にdockerをインストールして、そこで開発操作するということも対象外ですので、別途自分で調べる必要があります。

# 総評

結論、受けてよかったです。
この講座を受ける前はdockerについてはなんとなくしっている程度でしたが、イメージ、移動の仕方や、コンテナおよびその環境を構成する要素がどのようなものかということを把握することができます。
dockerについてあまり詳しくない、これから知りたいという方には受ける価値ありの講座だと思います。

**それでは、みなさん共に勉強を頑張りましょう！ではまた！**
Qiitaでアウトプットする際に最低限知っておくと嬉しいこと！

# はじめに
今年からQiitaで記事を投稿しはじめ、最初は記事の書き方が分からず、読みにくい記事になっていました。記事を書き進める中で、ありがたいことに編集リクエストを多くの方からいただきました！
そこで教えていただいたQiitaで記事読みやすくする工夫でよく使用しているものをランキング紹介します！

# ⭐️1位　コードブロックの言語指定方法
　下記のようにコードブロックで言語を指定していないと読みにくいコードになっていました。

```
class Person {
    let personName = "ひなっこ"
    func sayName() {
        print(self.personName)
    }
}
```
下記の方法で ` ```swift:ファイル名 `と`　```　`でコードを囲みます！
~~~md:書き方
```swift:Person.swift 
class Person {
    let personName = "ひなっこ"
    func sayName() {
        print(self.personName)
    }
}
```
~~~
すると、Swiftのコードということが認識され、下記のように色がつき、読者が見やすいコードになりました！
```swift:Person.swift 
class Person {
    let personName = "ひなっこ"
    func sayName() {
        print(self.personName)
    }
}
```


# ⭐️2位　画像の大きさの指定方法
## 画像の大きさを適切な大きさにする
下記のように画像の大きさを指定せずに、画像をあげると、大きすぎてめちゃめちゃ見にくいです！
![スクリーンショット 2023-12-16 18.11.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/d5d79400-1045-7bbc-c96c-7f2682c0c1a8.png)
~~~md:書き方
<img src="画像のURL" width=300>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/43d81ec1-bdfe-8959-17bf-9482edb34f97.png" width=300>
~~~
下記のように見やすい大きさになりました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/43d81ec1-bdfe-8959-17bf-9482edb34f97.png" width=300>
## 画像を横に並べる！
横にシュミレータの画像を並べたい時は下記のように書きます！

~~~md:書き方
<img src="画像①のURL" width=300>　<img src="画像②のURL" width=300>
~~~
下記のように画像を横に並べ、見比べることができます！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/43d81ec1-bdfe-8959-17bf-9482edb34f97.png" width=300>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/7d8d1fa9-e85e-de10-2372-9a9bd53d6c30.png" width=300>

# ⭐3位 コードスパン記法

コードスパン記法を使用すると、コードを読みやすくすることができます！

以上、ご参考までに。

~~~md:書き方
` print("Hinakko") `
~~~
下記のようにコードが見やすくなります！
` print("Hinakko") `
使用例
```swift:Peson.swift
class Person {
    let name: String = ""
    func callName(name: String) {
        print("\(name)")
    }
}

Person().callName(name:"Hinakko")
```
`print("\(name)") `ではHinakkoがプリントされます！

# ⭐4位 文字を太字にする！
~~~md:書き方
**Qiitaでアウトプットする際に最低限知っておくと嬉しいこと！**
~~~
下記のように文字を太字にし、強調することができます！
**Qiitaでアウトプットする際に最低限知っておくと嬉しいこと！**

# ⭐5位 文字の色を変える！

~~~md:書き方
<font color="red">Qiitaでアウトプットする際に最低限知っておくと嬉しいこと！</font>
<font color="blue">Qiitaでアウトプットする際に最低限知っておくと嬉しいこと！</font>
~~~
色を指定することで、下記のように文字の色を変えることができます！
<font color="red">Qiitaでアウトプットする際に最低限知っておくと嬉しいこと！</font>
<font color="blue">Qiitaでアウトプットする際に最低限知っておくと嬉しいこと！</font>

# おわりに
編集リクエストをくださったみなさんありがとうございました！
編集リクエストをいただいたおかげで、記事の内容だけでなく、記事の見やすさの重要性に気づくことができました！
今回の記事にも編集リクエストをいただき、コードスパン記法と文字を太字にする方法と色を変える方法の違いについて理解が深まりました！

# 参考文献

https://qiita.com/Sicut_study/items/9b20ac5ded003cb6d55a

https://qiita.com/KaitoMuraoka/items/ce8449086d67ea5859b3

https://qiita.com/Qiita/items/c686397e4a0f4f11683d
Vuexを少しだけ拡張して使ってみた

## はじめに:clapper:
「公式ドキュメントを読むのはいいけど、本質を理解して自分なりに実装するよう意識しないと伸びないよ。」

先輩エンジニアに言われて、グザっと刺さるフレーズをご紹介します。

今回は「Vuexの基本は学習しました！」というエンジニア向けに、こんな使い方もできますよというサンプルを提示できたらいいなと思って記事を書きます！
※Vue3になってpiniaを利用する方も多いかと思いますが、通ずる話かと思います

稚拙なところも多々ありますが、一読いただけると幸いです！

## State
stateはVuexの中核を担うものですが、文字列や数値、空の配列のみ定義しなければならないわけではありません。
必要なデータはひとまとまりにすると参照する際もデータを更新する際も楽なことがあります(Vuexに限らずですがね)。

```javascript
state = () => ({
  // 基本的な書き方
  base: '',
  count: 0,
  // まとまった方が使用しやすい場合は、オブジェクトなどで定義してあげると後ほど楽になる
  blogPost: {
    title: '',
    content: '',
    tags: [],
    type: 0,
  }
})
```

## Getters
gettersでは、stateを複数のデータを保持するプロパティを作成したことで、特定の属性だけでなく、まとまった情報を取得する事もできます。

```javascript
getters = {
  base: state => state.base,
  count: state => state.count,
  // 複数のデータを返すことができる
  blogInfo: state => state.blogPost,
  // こんな感じで複数のデータを返す事も
  systemInfo: state => {
    base: state.base,
    count: state.count
  }
}
```

## Mutations
mutationでは、複数のデータを更新することができるように設計します。特定の属性だけを更新する場合でも、このmutationを再利用することができます。
payloadはオブジェクトにするのがミソです。

```javascript
mutations = {
  setBase(state, payload) {
    state.base = payload
  },
  setCount(state, payload) {
    state.count = payload
  },
  // payloadをオブジェクトにすることで、複数の値を一気にセットできる
  setBlogInfo(state, payload) {
    state.blogPost.title = payload.title
    state.blogPost.content = payload.content
    state.blogPost.tags = payload.tags
    state.blogPost.type = payload.type
  },
  // 場合によっては、まとめてにセットすることもできる
  setBlogInfo(state, payload) {
    state.blogPost = { ...state.blogPost, ...payload }
  }
}
```

## Actions
actionsでは、各コンポーネントから指定されたデータを更新するだけでなく、APIから取得したデータでブログ投稿を更新したり、ユーザーの操作に応じて特定の属性を更新したりします。

```javascript
actions = {
  updateBlogInfo({ commit }, payload) {
    commit('setBlogInfo', payload);
  },
  updateBlog({ commit, getters }, blogInfo) {
    const currentBlogInfo = getters.blogInfo;
    commit('setBlogInfo', { ...currentBlogInfo, title: newTitle });
  },
  async fetchBlogPost({ commit }) {
    try {
      const response = await this.$axios.$get('/api/blog/post');
      commit('setBlogInfo', response.data);
    } catch (error) {
      console.error('Error fetching blog post:', error);
    }
  },
}
```

ざっくりですが、こんな感じで使用することもできます！
Vuex以外にも様々な機能がありますが、基本を理解したらどのように利用するか、どのように利用したら有効活用できるかは意識していきたいなと思ってます。

最後になりますが、良い１年をお迎え下さい！
Cesiumでカメラ移動毎に標高値取得したら、とてつもなく重かった話

:::note info
これは「[MIERUNE Advent Calendar 2023](https://qiita.com/advent-calendar/2023/mierune)」の17日目の記事です。昨日は、@kntoshiya さんによる「NetworkXで地理院ベクトルタイルの道路データを使ってネットワーク解析」でした。
:::

突然ですが、
CesiumJSで、カメラの高さを現在地点の標高+アルファで、地形に追従したカメラ高さにしたいという場面が有りました。
＝カメラの高さが、標高＋アルファで一定になるようにする

標高取得　初期コード一部抜粋

```jsx
const cartographicPosition = Ellipsoid.WGS84.cartesianToCartographic(viewer.camera.position)
let level = 11 // 任意のLODレベルを指定
sampleTerrain(viewer.terrainProvider, level, [cartographicPosition]).then(function (
  updatedPositions
) {
  console.log(updatedPositions[0]);
  if(updatedPositions[0].height === undefined) return
  const demHeight = updatedPositions[0].height
```

Cesiumで移動先の高さを地形から取得して見ました。

しかし、cameraMoveイベントで行っていると
偶にいや、よく８割位、高さ（demHight）の取得に失敗しました。

おそらく、マウスで動かすと、移動イベントがかなり、多く発生するため
地形からの高さ取得が間に合わないのだと推測します。

単発でやるとうまく出来るのに、高頻度で地形からの標高取得が出来ない事が頻発します。
→標高＋アルファにしているはずなのに、適切なカメラ高さが設定できず、移動していると山にめり込む事が頻発。

対策をいろいろやってみました。
- カメラ移動イベントが前回位置より一定距離移動後、カメラの高さ変更を行う。
    →頻度は減るが、まだ多い
    （GPSの処理だと、一定距離移動したあとイベント発生させる機能が有ったので効果あるかなと思った）
- カメラ移動終了イベントで、カメラ高さを変える
    マウスでカメラを動かしている最中はスムーズに動いているのに、止まった直後高さが変わる。
    →追従性が悪い

今回やりたかったのは、マイクラの移動のような動きなので、どうしたら良いか悩んだ結果

移動の方法をマウスではなく
- キーボードで特定キー（WASD）で移動方向を指示して、１キーで5m毎に移動するようにして、地形から標高を取得するイベント数を減らした。

- 移動先の標高値を取得できたら、移動するようにした。
    単発での標高取得は元々問題なかったので、キーを押すくらいの頻度で、高度を取得すのも問題なかった。
    
これでCesium上でマイクラのような移動が出来るようになりました。

ちなみに、カメラの、heading,pitchも本来は、マウスもしくはナビゲーションパネルでやる操作でしたが、こちらも十字キーに割り当てて、キーを押すたびに一定量角度が変わるようにしました。

![スクリーンショット 2023-12-17 10.35.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580547/83db3c94-1645-31f6-fe22-1246bd64e341.png)

サンプルの画像は、33.42301280235916、131.07503658735817の位置（場所に意味はないです）

地形は：地理院の5mDEMを、CesiumIonで地形に変換して使用
タイル画像は、地理院の衛星写真を使用しています。

まとめ

Cesiumで地形から標高を取得できるのは、すばらしい機能なのですが、高頻度で地形から高度を取得するのは、耐えられないのだと思いました。
（そりゃそうですね）
Cesiumがシームレス＆スムーズに３D地球儀を表現できている＆移動できるが故の悩みでした。

もし、もっとスムーズにやりたいのであれば、Cesiumではなくゲームエンジンの分野に任せた方が良い気がします。
PHP 条件分岐(if)

## はじめに
ifとswitchについて理解はしているのですが、書き方がごっちゃになることがあるので自分用まとめです。
自分用のまとめなので間違いや自分が完全に理解しているところに関しては省略して書いていることもあります。ご了承お願いします。

## ifサンプルコード
```php
$score = 100;

if ($score == 100) {
    echo "excellent!!" . PHP_EOL;
} elseif ($score >= 80) {
    echo "Great!" . PHP_EOL;
} else {
    echo "もうすこしがんばりましょう" . PHP_EOL;
}   
```
```
ecellent!!
```

## 比較演算子
```php
>=  //以上
<=  //以下
>   //超過
<   //未満
== //等しい
!= //等しくない
=== //等しいとTrue、型も等しい(厳密な比較)
!== //等しくないとTrue、型が等しくなくても
```

## 複数条件
```php
&& and //なおかつ
|| or  //もしくは
!      //ではない
```

## returnで処理の中断
ifの中でreturnを使用するとifを抜けます。


## まとめ
言語によって書き方が少しずつ違ったりしますよね。
なのでサンプルコード１つ残しておくとあとから確認できて便利です。
【GAS】開いた時に任意のセルを左上に表示する方法

## 概要
- スプレッドシートで，開いた時に任意のセルを表示させたい場面がある．
- GASを利用して`sheet.getRange().activate()`で表示することはできるが，左上ではなく右下など見づらい所に表示される．
- 本記事では，任意のセルをページ左上に表示させる方法を紹介する．

## サンプルコード

```javascript
function onOpen() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheets()[0];

    var cell = "D5"; //左上に表示させたいセル
    
    var lastRows = sheet.getMaxRows();
    var lastClms = sheet.getMaxColumns();
    sheet.getRange(lastRows,lastClms).activate();
    SpreadsheetApp.flush();
    sheet.getRange(cell).activate();
}
```
- まず，`sheet.getMaxRows()`と`sheet.getMaxColumns()`でシート右下のセル位置を取得．
- その後，その右下のセルを`sheet.getRange(lastRows,lastClms).activate()`で表示．
    - 一度，右下のセルを表示させることで，表示させたいセルが左上にくるようになる．
- `SpreadsheetApp.flush()`で右下のセルを確実に表示させる．
- 最後に，表示させたいセルを`sheet.getRange(cell).activate()`で表示させる．
Microsoft Ignite2023に参加して

先日、大阪会場のMicrosoft Igniteに参加してきました。
現地はAIとCopilot一色で、もはやプログラマーは不要なんじゃないかと思えるほど進歩したなと感じております。
（実際はプログラマーが不要になることはない(笑)）

# Microsoft Fabricに関する情報
そんな中で、私が一番最近注目している`Microsoft Fabric`ですが、ついにGAされました。
現地ではYangさん(@yangjiayi) 他MSのFabric担当者とお話する機会にも恵まれまして、実運用についてもヒアリングしてみました。

私が聞きたかったことはこの２つ。
* FabricとPower BIやAzure Data Factoryの使い分け
* ランニング費用

結局のところ、`Data Factory`や`Power BI`もそれぞれのサービスがなくなるわけではないので、SIベンダーとして提案する際にはお客さんの業務課題やニーズに合わせて見極めが必要かなというところです。
ランニング費用については容量によって変わりますが、F32だと日本円で70万円以上とかなりお高いので、この費用を問題なく支払える企業様がターゲットということになりそうです。
※月額費用は2023年12月現在のものです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885406/b817ad94-4649-b475-f3b3-b6d490c6b0f8.png)

ちなみに、Fablic用のCopilotは現在プレビュー中ですが、有効にするにはF64以上でないと利用できません。

https://learn.microsoft.com/ja-jp/fabric/get-started/copilot-fabric-enable


その他、Fabricに関する詳細情報はこちらの公式ドキュメントをご参照ください。

https://learn.microsoft.com/ja-jp/fabric/

# 試験情報
新しい資格試験が発表されました。
Fabricに関しては、`DP-600`という新しい試験が登場しました。
2024年1月から受験できるようです。私も勉強して取得する予定です。
https://learn.microsoft.com/en-us/credentials/certifications/exams/dp-600/


また、`Microsoft Applied Skills`というこれまでのMCP試験とは異なるシナリオベースの試験も登場しました。

https://techcommunity.microsoft.com/t5/microsoft-learn-blog/announcing-microsoft-applied-skills-the-new-credentials-to/ba-p/3775645?wt.mc_id=appliedskills_twitter_organicsocial_wwl

現在クラウドスキルチャレンジで対象となっているコースは無料で受けられるとのことですので、私も近いうちにチャレンジするつもりです。

https://www.microsoft.com/en-US/cloudskillschallenge/ignite/registration/2023?ocid=ignite23_CSC_bbanner_cnl

# まとめ
今回は、思ったことをだらだらと書いてしまっただけですので、ご参考程度に読んでいただけますと幸いです。
私は今までの経験上、`Data Platform`を考えるのが大好きなので、これからもMicrosoft Fabricのキャッチアップを続けていく予定です。
【ChatGPT＋DALL-E3】作品です。プロンプトあり。


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

　今回は、自作の作品です。プロンプトも付けますw

:::note info
本記事は、ChatGPT＋DALL-E3で、
作品を作っています。あしからず。
:::

　まずは、
　　作品をどうぞ。
![DALL·E 2023-12-17 11.29.59 - A black and white Kirigami artwork titled 'Tiger'. This artwork should focus on capturing the majestic and powerful essence of a tiger. The design sho.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/593d1509-87d2-5750-8f9d-ef55a243bae3.png)

　これは、切り絵のトラです。

　切り絵とは、何か。
***
***GoogleSGE***
切り絵（きりえ）とは、紙を切り抜いて台紙に貼り込み、人や動物などを表す絵画の手法です。切り紙絵とも呼ばれます。﻿
切り絵は、白黒に染め分けた下絵を黒い紙に固定し、不要な部分を切り抜いて絵を作り上げていきます。白と黒のコントラストの妙や、刃物の切り口による独特の造形が味わい深く、愛好家も多いと言われています。
﻿
切り絵は、紙をハサミやナイフでカットすることによって生まれる切り口や線を生かしながら描きだすという、紙の特質を最大限に生かした技法です。絵具などで制作される絵画作品にはない独自の質感や効果を持った表現方法です。
﻿
日本では古来より神事に使用されており、中国の「剪紙（せんし）」と呼ばれる伝統工芸品の切り絵は、なんと約1500年以上の歴史を持っています。﻿
***
　まぁ、
　　ほぼほぼウィキペディアからの
　　　引用ですけどねw

　切り絵について知りたければ。
　　ウィキペディアを参照することを
　　　おすすめします。
***
　さて、プロンプトです。

　なお、ここでは、みなさんへの
　　プロンプトのシェアを
　　　目的にしますので、
　　　　トラに限らず描画できる
　　　　　形にしておきました。

　キーワードを
　　トラにすれば、
　　　上記画像のようになります。
```Text:
下記プロンプトに従って、描画。
[キーワード:トラ]
Black and white Kirigami artwork titled '[キーワード]'. This artwork should focus on capturing the essence of [キーワード], whether it's an animal, object, or concept. The design should be intricate, using only black and white paper to create contrast and depth. If [キーワード] is a living creature, it should be depicted in a dynamic pose, showcasing its unique features and characteristics. If it's an object or concept, the artwork should creatively interpret it, emphasizing its form and significance. The background can be minimalistic, highlighting [キーワード] as the central focus. The Kirigami should showcase detailed paper cutting techniques, emphasizing the main features of [キーワード] and the overall elegance of this art form.
```
***
***日本語***
下記プロンプトに従って、描画。
[キーワード:トラ]
[キーワード]」と題された白黒の切り絵アートワーク。この作品は、動物、物体、または概念である[キーワード]の本質を捉えることに焦点を当てるべきです。デザインは複雑で、コントラストと深みを出すために白黒の紙のみを使用します。[キーワード]が生き物である場合、動的なポーズで描かれ、その独特な特徴や特性を示すべきです。物体や概念である場合、作品はそれを創造的に解釈し、その形と意義を強調すべきです。背景は最小限にし、[キーワード]を中心的な焦点として強調します。切り絵は、[キーワード]の主要な特徴とこの芸術形式の全体的な優雅さを強調するために、詳細な紙切り技術を披露すべきです。
***

　また、
　　キーワードを
　　　“中国の龍”とすれば
　　　　こんな感じになります。
![DALL·E 2023-12-17 11.43.45 - Black and white Kirigami artwork titled 'Chinese Dragon'. This artwork should focus on capturing the essence of a Chinese Dragon, a mythical creature.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/e3f6dba9-183b-feb7-71ec-cba643de2856.png)

　みなさんも
　　いい作品を
　　　生み出してください。

　今回は、ここまで。