OmniAICreator/Qiita-1.07M huggingface dataset:
社内で初めてQiitaアドベントカレンダーを企画して成功させるまで

## 初めに
この記事は[commmune Advent Calendar 2023](https://qiita.com/advent-calendar/2023/commmune)の25日目として投稿されました。

## アドベントカレンダー参加したい
commmuneに入社する前の私は技術ブログなど一切書いた経験はありませんでしたがとあるきっかけで初めて技術ブログを執筆しました。

https://tech.commmune.jp/entry/2022/10/25/112000

前職で培った知識や経験を詰め込んだ記事のため特にチャレンジングな事をした記事ではなかったですが意外にも社内・社外問わず好評をいただきました。その中で、技術ブログを書く事に以下のような意味があると感じました。

1. 自分の技術ナレッジ・ノウハウのシェアがチームの技術力向上に繋がる
2. 社外に対してアウトプットすることでフィードバックをいただく
3. 技術を体系的に学ぶ癖がつくようになる

技術ブログ執筆が自分にもチームにもメリットがあると感じ社内アドベントカレンダーを企画したいと言う思いが強まりました。

### 去年のアドベントカレンダー

去年は社内アドベントカレンダー企画が遅かったこともあり中止する予定でしたが、**技術ブログでなくともSlack上の投稿なら毎日できるだろう**と思い、毎日テストコラムをエンジニア向けに投稿しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730894/cd36d2e9-8b9f-81b1-ce62-b1a8b987efc8.png)

この時は私がcommmuneに入社したてと言うこともありテストについての知識を社内でシェアすることでテストに関する関心が高まって欲しいと言う思いがありました。

アドベントカレンダー中に頻繁に「テストコラムで読んだんですが…」と言う話が業務上でできたのでチーム内でのテストの関心が高まったように感じていました。実施して良かったと思っています。

今年は去年と比べて組織としてもエンジニアチームとしてもパワーアップしたと実感しているので社内ではなく社外向けのQiitaアドベントカレンダーに挑戦してみたかったです。

## 企画ポイント

企画する中でいくつか注意したポイントを記載していきます。

1. 企画者が率先して記事を書く
2. 自由参加性 
3. 早めの企画と周知 

### 企画者が率先して記事を書く

企画はするが技術ブログは書かないとなると誰も付いてこなくなるため企画者が率先して記事を書くべきだと思います。特にアドベントカレンダーのような毎日更新系については簡単に成功できるものではないので必ず記事作成を牽引する人間が必要になります。

また、Slackの投稿とは異なりQiita上にアドベントカレンダーを作るので日付に空白があると見栄えが良くないです。そのため、自分一人しか参加できなかったとしても会社の名前を背負っているので一人でもやり切る気持ちが大事だと思いました。

この部分については去年アドベントカレンダー(Slackでのテストコラム)を完走したこともあり「一人でもできるだろう」と謎の自信があったので深くは考えていなかったです。(笑)

### 自由参加制

技術ブログを書くことは容易なことではないと考えています。そのため「何故アドベントカレンダーをするのか」と言う意味を予め伝えた上で書いていただける人を募集しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730894/f8cab54e-9363-c573-9fd9-901dd512f5b3.png)

業務として強制的に書いてしまうと何のために記事を執筆してしまうのかがぼやけてしまうので自由参加制にしようと考えました。

### 早めの企画と周知

いきなり「再来週からアドベントカレンダー書きます！」となっても準備ができないので事前の段階から告知をしていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730894/cbb6aa9e-7563-5784-0a97-8a2e0e0da6a6.png)

これにより「いざ書きます」となった時に早い段階で記事を書いていただける方を集めることができたので何にでも早めの準備は大事だと痛感しました。

## 成果

### 完走

チームの多大なる協力がありアドベントカレンダーを完走することができました。「一人でもやり切るマインド」と書きましたがSlackの投稿と記事作成が大きく異なり一人ではできなかったと思います。

### チームの技術ノウハウを共有できた

これはチーム内で閉じている成果ですが、一人が持っている知識や経験を記事にすることでチームのレベルアップに繋がったと思っています。

### Zennのトレンドに掲載された

作成いただいた記事に優劣をつけるべきとは思っていないですが一つの指標を得ることができたので公開いたします。

一つの記事について大変な評価をいただきZennのトレンドに乗ることができました。

https://zenn.dev/commmune/articles/874a7bfc342702

当初の目的であった「自身の技術力向上」「commmuneの認知向上」にも繋がることになるのでこれだけでもアドベントカレンダー企画した意味があったと言うことができます。

## 改善点

アドベントカレンダーは成功しましたが改善点が数点見つかったため記しておこうと思います。

### カレンダーの日付を最初に全部埋めるのをやめる

当初は、参加者が好きな日付に予定の記事タイトルを埋めてその後に自分が開いた日付を埋めるという風にしました。しかし、クリスマスが近づくになるにつれて「自分も記事を書いてみたいが空いた日付がないので書いて良いのかわからない」と言う声を耳にしました。

記事を埋めることで安心感を得られたかった私でしたがそのような考えになるのであればチームとしては逆効果だな、と感じました。次回はアドベントカレンダー作成中も参加者を受け付けられるよう必要以上に日付を埋めないようにしたいです。

### 投稿プラットフォームを決めておく

昨今だとQiitaの他にも様々なプラットフォームが登場してきております。あまり深く考えていなかったため「記事作成先はどこでも良い」としましたが、最終的にこれを読む読者目線に立つと投稿先プラットフォームは揃えておいた方が良いと思いました。

MUST要件ではないですが次回はできるだけ投稿プラットフォームを揃える or 限定するようにしたいと思います。

## 終わりに

社内でアドベントカレンダー企画したいけどどのように進めるべきか不安な方にこの記事が届いてくれれば幸いです。
Visual Studio から App Service へアプリをデプロイしようとしたらエラーが発生した

# 事象
Visual Studio から Azure App Service へアプリケーションをデプロイしようとした際に ERROR_USER_UNAUTHORIZED エラーが発生した

### やったこと
Azure App Service を試してみた。
[クイックスタート: ASP.NET Web アプリをデプロイする](https://learn.microsoft.com/ja-jp/azure/app-service/quickstart-dotnetcore?tabs=net70&pivots=development-environment-vs)

### つまずいたところ
しかし、

> 13.[公開] ページで [公開] を選択します。 警告メッセージが表示される場合は、[続行] を選択します。

というステップでエラーが出てしまった。

>エラーが発生しました。
詳細
公開でエラーが発生しました。
ビルドに失敗しました。詳細については、出力ウィンドウを確認してください。
診断ログは次の場所に書き込まれました:

>エラー		Web 配置タスクが失敗しました。(Web 管理サービスを使用してリモート コンピューター ("[appname].scm.azurewebsites.net") に接続しましたが、承認されませんでした。正しいユーザー名とパスワードを使用していること、接続先のサイトが存在すること、および資格情報がそのサイトへのアクセス許可のあるユーザーを表していることを確認してください。  詳細情報の参照先: https://go.microsoft.com/fwlink/?LinkId=221672#ERROR_USER_UNAUTHORIZED)
サイト名、ユーザー名、パスワードが正しいことを確認してください。問題が解決されない場合は、ローカルまたはサーバーの管理者にお問い合わせください。
エラーの詳細:
Web 管理サービスを使用してリモート コンピューター ("[appname].scm.azurewebsites.net") に接続しましたが、承認されませんでした。正しいユーザー名とパスワードを使用していること、接続先のサイトが存在すること、および資格情報がそのサイトへのアクセス許可のあるユーザーを表していることを確認してください。  詳細情報の参照先: https://go.microsoft.com/fwlink/?LinkId=221672#ERROR_USER_UNAUTHORIZED
リモート サーバーがエラーを返しました: (401) 許可されていません

### 解決方法
ログファイルを見ても分からなかったので、検索したところ下記の記事があった。

[Visual Studio よりAzure App Service へ Web アプリケーションを発行した際に発生したエラー ERROR_USER_UNAUTHORIZED](https://qiita.com/kurutasu/items/a6e0d89d542cf8331db6)

デフォルトで、Azure App Service の [設定 -> 構成 -> 全般設定]内の [基本認証の発行資格情報] が オフ(defalt)となっていた。
そのため、[基本認証の発行資格情報]をオンにすれば解消した。

チュートリアルでも書かれてないしで、エラーメッセージがもう少し分かりやすいといいんだけれど。


# メモ
上記でつまずいた 「基本認証」は 「ユーザー名とパスワードの認証」とのこと。
[App Service デプロイで基本認証を無効にする](https://learn.microsoft.com/ja-jp/azure/app-service/configure-basic-auth-disable?tabs=portal)

- FTP および WebDeploy クライアントが App Service に接続するための基本認証が提供されます。 
- ただし多くの場合、企業では Microsoft Entra ID 認証など、基本認証よりも安全なデプロイ方法が必要とされます

ということなので、基本認証はセキュリティ面では無効にするのが良いらしい。

基本認証を使用しないデプロイ
基本認証を無効にすると、FTP やローカル Git デプロイなどの基本認証に基づいたデプロイ方法は機能しなくなります。 別のデプロイ方法については、「[Azure App Service でのデプロイ方法別の認証の種類](https://learn.microsoft.com/ja-jp/azure/app-service/deploy-authentication-types)」をご参照ください。
とのこと。

ドキュメントを見る限りでは、
FTP\FTPS、Visual Studio は基本認証しか対応してないらしい。
A whole another level of Class – Hotels of Riyadh

Riyadh is no stranger to showing off its luxury in the most extravagant of ways! Whether it is the modern architecture, the rich history, the one of a kind culture, the larger than life lifestyle – whatever you point your finger to, it is dripping with luxury. 
All of this is not just limited to its experiences. Even the hotels are just over the top ridiculous when it comes to luxury. There is nothing more that you could ask for when you decide to stay in one of these hotels.

The most expensive hotels in Riyadh

Riyadh is home to some of the most expensive hotels in the world. These hotels really don’t leave much to the imagination, for you can find there anything and everything you can ever dream of! 
Hotels in Riyadh boast of some of the most amazing architecture and top tier hospitality. These hotels are the hallmark of luxury and service and people from all over the world come here to relax and experience the grandeur and beauty of this place. Here are some of <a href="https://dara.sa.com/">The most expensive hotel in Riyadh</a>

	Four Seasons Hotel Riyadh at the Kingdom Center
	Vivienda Hotel Villas , Turki Al Awwal
	Vivienda Hotel Villas Granada
	JW Marriot Hotel, Riyadh
Honeymoon Hotels in Riyadh
Riyadh has truly a one stop destination for all kinds of travelers. The beauty and luxury of Riyadh also invites a lot of couples to a romantic holiday to this place. Couples on their honeymoon can enjoy all sorts of tourist attractions and activities. The Red Sea Mall, King Fahd’s Fountain, Jeddah Corniche etc are all very popular sites for couples to spend time at.
You can also amp up the fun and joy of a romantic holiday by looking up <a href="https://dara.sa.com/our-hotels/">Honeymoon Hotels in Riyadh</a> for your vacation. You can find hotels that have suites and services that specially cater to couples. You can always find out more about it online.
Making the most out of your vacation!
Riyadh calls out to your inner traveler and invites you to indulge in the adventures, luxury, history and culture of this place. No matter what your taste is, what you’re looking for in a holiday, you can definitely find it in Riyadh. And to take your experience to the next level, do your due research in finding <a href="https://dara.sa.com/">The best hotel in Riyadh</a> that cater to your needs and requirements. A perfect stay along with all the fun adventures of Riyadh will surely make for a vacation to remember for a long time.
![business-area-2-1024x683.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3534070/6bf56759-1b7a-bff7-931e-c6b7b7075528.jpeg)
![Exterior-1024x683.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3534070/766e54bb-2054-cb18-fa9e-4357dbdf1bf7.jpeg)
![Lobby-1024x683.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3534070/ffd4fb3c-5d77-f4cd-6569-4311c058923c.jpeg)
![saudi-arabia-84015_640.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3534070/aaf964d7-3f5c-1ab2-59de-629d35d16f99.jpeg)
Azure AI-900 について簡単なまとめ

## AI-900 とは

## 試験範囲

This exam is an opportunity for you to demonstrate knowledge of machine learning and AI concepts and related Microsoft Azure services. As a candidate for this exam, you should have familiarity with Exam AI-900’s self-paced or instructor-led learning material.

This exam is intended for you if you have both technical and non-technical backgrounds. Data science and software engineering experience are not required. However, you would benefit from having awareness of:

- Basic cloud concepts
- Client-server applications

公式学習コンテンツ

Microsoft Azure AI Fundamentals: AI Overview
3 hr 6 min 3 Modules

https://learn.microsoft.com/en-us/training/paths/get-started-with-artificial-intelligence-on-azure/

Microsoft Azure AI Fundamentals: Computer Vision
1 hr 37 min 3 Modules

https://learn.microsoft.com/en-us/training/paths/explore-computer-vision-microsoft-azure/

Microsoft Azure AI Fundamentals: Natural Language Processing
2 hr 22 min 4 Modules

https://learn.microsoft.com/en-us/training/paths/explore-natural-language-processing/

Microsoft Azure AI Fundamentals: Document Intelligence and Knowledge Mining
1 hr 31 min 2 Modules

https://learn.microsoft.com/en-us/training/paths/document-intelligence-knowledge-mining/

Microsoft Azure AI Fundamentals: Generative AI
2 hr 33 min 3 Modules

https://learn.microsoft.com/en-us/training/paths/introduction-generative-ai/

## YouTube 学習動画

https://youtu.be/YL8l7h-Vyiw?si=ucGYVCPPUu5f2zwb

https://youtu.be/TOZZ0iWdrO0?si=b73pXaFMaPE4OrP8
Job Interview Questions Azure 1

## Questions

****What do you understand about cloud computing?****

C****an you tell something about Azure Cloud Service?****

****What are the various models available for cloud deployment?****

****Define role instance in Azure.****

****How many cloud service roles are provided by Azure?****

****Define Azure Service Level Agreement (SLA)?****

****What is Azure Resource Manager?****

****What is NSG?****

****What is Azure Redis Cache?****

****Define Azure virtual machine scale sets****

****What do you understand about the “Availability Set”?****

****What are the available options for deployment environments provided by Azure?****

****What do you need to do when drive failure occurs?****

****Is it possible to design applications that handle connection failure in Azure?****

****Define azure storage key.****

****What is cspack in Azure?****

****What is the best Azure solution for executing the code without a server?****

****What would be the best feature recommended by Azure for having a common file sharing system between multiple virtual machines?****

****Is it possible to login to a Linux Virtual Machine without using a password?****

****What are the differences between Azure Scale Sets and Availability Sets?****

****What would happen when the maximum failed attempts are reached during the process of Azure ID Authentication?****

****Is it possible to get a public DNS or IP address for the Azure Internal Load Balancer?****

****What is Azure Blob Storage?****

## 参考

https://www.interviewbit.com/azure-interview-questions/
Job Interview Questions Azure 2


## Questions

****What do you understand by Azure Scheduler?****

****Is it possible to map the Windows machines running on two different port numbers, say 80 and 81, on an IIS Web Server to an Azure Load Balancer?****

****You have an application running on the On-Prem Server and have backup on Azure East US region. Now, On-Prem server application access fails. Is it possible to access the application via the Azure environment?****

****What feature of Azure can be used to stop the issue of high load on the application in cases of no man support on the flow?****

****What are the types of storage services apart from blob storage provided by Azure?****

****What are IaaS, PaaS and SaaS?****

****What are the differences between the Azure Table Storage and the Azure SQL service?****

****Consider a scenario where an application front end hosting is done on Azure but the customer needs the database hosting to be done on on-premise server due to security concerns. What are the ways to handle the connectivity in Azure for this scenario?****

****What are the differences between the Azure Storage Queue and the Azure Service Bus Queue?****

****What are the possible causes of the client application to be disconnected from the cache?****

****How can a VM be created by means of Azure CLI?****

## 参考

https://www.interviewbit.com/azure-interview-questions/
Job Interview Questions Agile Development 3




How is the velocity of the sprint measured?

What are the major agile quality strategies?

Define Product backlog and Sprint backlog.

What is Pair Programming, and what states its benefits?

What is refactoring?

How can QA add value to an agile team?

How to manage remote teams?

What is meant by the sprint retrospective meeting?

What do sprint planning meetings do?

Mention the places where the Scrum and Kanban methodologies are used?

What are the essential qualities to have as a Scrum Master?

What is the right moment to use the agile model?

How do agile testing methods differ from other testing methods?

How to know that you are using agile development?

Describe the main roles in the scrum.

What are the major Agile components?



## 参考

https://www.simplilearn.com/tutorials/agile-scrum-tutorial/agile-interview-questions
Job Interview Questions Agile Development 2



What do you mean by scrum poker technique or planning poker?

What do you mean by the disadvantages of the Agile Model?

What is the right moment to use the agile model?

What do you mean by release candidate?

Differentiate between agile testing methods and other testing methods?

In which process a Scrum master recommends follow-up action items?

What are the most critical agile Matrices?

What are the essential qualities a good Agile tester should have?

Mention the challenges involved in developing Agile Software?

When not to use Agile?

Explain what it means by product roadmap?

What is the product burndown chart?

What is a sprint burndown chart?

What is the Release burndown chart?




## 参考

https://www.simplilearn.com/tutorials/agile-scrum-tutorial/agile-interview-questions
Job Interview Questions Agile Development 1


Explain Agile in brief.

Explain the difference between the traditional Waterfall model and the Agile model.

What are some important parts of the Agile process

Explain Iterative and Incremental Development in Agile.

What are the different types of Agile methodologies?

What Are the Principles of Agile Testing?

What are some Agile metrics that need to be focused on?

What are some popular Agile tools?

What are the obstacles to the Agile process?

Differentiate between Agile and Scrum.

Discuss the differences between Agile and traditional Project Management.

What are Agile frameworks?

When should you use Waterfall over Scrum?

How long does the scrum cycle last?

Define epic, user stories, and tasks?



## 参考

https://www.simplilearn.com/tutorials/agile-scrum-tutorial/agile-interview-questions

https://www.simplilearn.com/tutorials/agile-scrum-tutorial/agile-vs-waterfall

https://www.simplilearn.com/tutorials/agile-scrum-tutorial/agile-process

https://www.simplilearn.com/agile-vs-scrum-article

https://www.simplilearn.com/waterfall-vs-agile-vs-devops-article) (Waterfall
Job Interview Questions React 3

## Questions 

****How can you update the state of a component?****

****What is arrow function in React? How is it used?****

****Differentiate between stateful and stateless components.****

****What are the different phases of React component’s lifecycle?****

**Explain the lifecycle methods of React components in detail.**

****What do you understand by refs in React?****

****List some of the cases when you should use Refs.****

****How do you modularize code in React?****

****How are forms created in React?****

****What do you know about controlled and uncontrolled components?****

**Explain the concept of a Custom Hook in React.**

**What is the difference between a reducer and an action in Redux?**

**Explain the concept of a Higher Order Component (HOC) in React and when to use it.**

**How do you handle data validation in a React application?**

**What is the difference between a synchronous action and an asynchronous action in Redux?**

**Explain the concept of a Thunk in Redux.**

**Explain the concept of a Provider in React-Redux.**

**How do you handle code splitting in a React application?**

**What is the difference between a connected component and a component in React-Redux?**

**Explain the concept of a Sagas in Redux.**

**How do you handle code optimization in a large React application?**

**What is the difference between a React component and a React element?**

**Explain the concept of a Middleware in Redux.**

**How do you handle internationalization in a React application?**

**What is the difference between a React component and a React class?**

**Explain the concept of a Memorization in React.**

**How do you handle events in React?**


## 参考

https://www.edureka.co/blog/interview-questions/react-interview-questions/
Job Interview Questions React 2

## Questions

****What are forms in React?****

****How do you create forms in React?****

****How do you write comments in React?****

****What is an arrow function and how is it used in React?****

****How is React different from Angular?****

****What are the components in React?****

****What is the use of render() in React?****

****What is a state in React?****

****How do you implement state in React?****

****How do you update the state of a component?****

****What are props in React?****

****How do you pass props between components?****

****What are the differences between state and props?****

****What is a higher-order component in React?****

****How can you embed two or more components into one?****

****What are the differences between class and functional components?****

****Explain the lifecycle methods of components.****

****What is Redux?****

****What are the components of Redux?****

****What is the Flux?****

****How is Redux different from Flux?****

****What is React Router?****

****Why do we need to React Router?****

****How is React routing different from conventional routing?****

****How do you implement React routing?****

****How do you style React components?****

****Explain the use of CSS modules in React.****

## 参考

https://www.simplilearn.com/tutorials/reactjs-tutorial/reactjs-interview-questions
Job Interview Questions React 1

## Questions

1. What is ReactJS?
2. Why ReactJS is Used?
3. How Does ReactJS work?
4. What are the features of ReactJS?
5. What is JSX?
6. How to create components in ReactJS?
7. What are the advantages of ReactJS?
8. Differentiate between real DOM and virtual DOM?
9. What are forms in ReactJS?
10. How is React different from React Native?

****What are the features of React?****

****Can web browsers read JSX directly?****

****What is the virtual DOM?****

****Why use React instead of other frameworks, like Angular?****

****What is the difference between the ES6 and ES5 standards?****

****How do you create a React app?****

****What is an event in React?****

****How do you create an event in React?****

****What are synthetic events in React?****

****Explain how lists work in React****

****Why is there a need for using keys in Lists?****

## 参考

https://www.simplilearn.com/tutorials/reactjs-tutorial/reactjs-interview-questions
確認画面ありのフォームで入力に戻る際に引き継げていないold値を強制的に持たせる



## 通常の戻るボタンの作成

``` 
// blade
<div class="col-sm-3">
    <button class="btn btn-block btn-secondary" type="submit" name='back' value="back">戻る</button>
</div>

// controller
if (!empty($request['back'])) {
  return redirect()->route('〇〇〇.×××.create')->withInput();
} 

```

上記の記述で登録フォームと確認画面のネーム属性が一緒であれば入力された内容を再び登録画面のinputに設置できます。


## 登録フォームと確認画面でnameが一部違った場合
``` 
// blade
<div class="col-sm-3">
    <button class="btn btn-block btn-secondary" type="submit" name='back' value="back">戻る</button>
</div>
// ↑ここまでは一緒↑ //

// controller
if (!empty($request['back'])) {
    //ここでrequestの配列に登録フォームで使われているname属性のkey値の値を追加する
    $request->merge([
        'field1' => $request['field1_confirm'],
        'field2' => $request['field2_confirm'],
        'field3' => $request['field3_confirm'],
    ]);
  return redirect()->route('〇〇〇.×××.create')->withInput();
} 
```

上記のようにする事で確認画面と登録画面が違った場合でもold値を引き継げます。
ネットワークの設定を見る〜Arch LinuxをT2チップを備えない古いIntel Macにインストールしようとする日々その4

この記事は，Ubuntuはよく使うが，Arch Linuxは初めてという私 @zacky1972 が，まずは手近なT2チップを備えていない古いIntel MacにArch Linuxをインストールして習得していく過程を記録する駄文の4回目です．今回は，前回インストールしたArch Linuxのネットワークの設定を見ます．

## シリーズ

1. [Arch LinuxをブートできるUSBメモリを用意する](https://qiita.com/zacky1972/items/9f447f9a11f91e90f6e8)
2. [デュアル・ブート環境にするためにパーティションを区切る](https://qiita.com/zacky1972/items/4b3d8240ff1f4a599908)
3. [いよいよArch Linuxをインストールする](https://qiita.com/zacky1972/items/da1db6795b84151186ab)
4. ネットワークの設定を見る(本記事)
5. [Mac Pro (Mid 2010)にArch Linuxをインストールする](https://qiita.com/zacky1972/items/2904a0a07f9335fdb2de)
6. [ネットワークが繋がらない最小構成のままElixirをインストールして実行してみる](https://qiita.com/zacky1972/items/9a145632c6c12c650bed)
7. [ネットワークが繋がらない最小構成のままElixirをasdfではなくソースコードビルドしてインストールする](https://qiita.com/zacky1972/items/ab537e53fd30ac0d15a6)

## 起動

現状では，下記の起動シーケンスにしたがって起動しています．

https://qiita.com/zacky1972/items/da1db6795b84151186ab#現状の起動シーケンス

ユーザー権限で起動しているという想定です．

## ネットワークの設定

ネットワークの設定は下記のとおりです．

https://wiki.archlinux.org/title/Network_configuration

下記のネットワークマネージャーを使うことがあるようです．

https://wiki.archlinux.org/title/Network_configuration#Network_managers

`ps`で見てみると，どうやら`systemd-networkd`を使っているようです．

確認するために，一度，`exit`を2回押して，下記コマンドを入力します．

```bash
systemctl --type=service
```

これをみると，`systemd-networkd`もですが，`OpenSSH Deamon`も起動しているみたいですね．デフォルトでは入らないようにも見えますので，何かの過程でインストールされたのかもしれません．

`arch-chroot`を用いて起動している間は，残念ながら，この設定をいじることはできないようです．先にmacOSからの起動を確立してからでないと，いけないようです．

取り急ぎ，USBメモリ中のデフォルトの`systemd`の設定を，SSD中にコピーしておいた方が良さそうな気がします．見た感じ，何も設定されていないようでした．
Phoenix LiveView でクリックイベントの伝搬を止める（ stopPropagation ）

## はじめに

Phoenix LiveView で Web ページを作っているとき、クリック時のイベント伝搬を止めたいときがあります

具体的に言うと、例えばモーダルとフラッシュ（通知）が表示されているときです

![スクリーンショット 2023-12-25 16.46.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/52362dd8-6c1f-0831-3695-10d0175bf8db.png)

:::note info
mix phx.gen.live で生成される通常のページの場合、モーダルが閉じてフラッシュが表示されるため、この状態にはなりません

フラッシュ表示後もモーダル内で続けて操作するようなケースを想定しています
:::

通常、モーダルの外側をクリックするとモーダルが閉じます

また、フラッシュはフラッシュ自体をクリックすることで閉じます

モダールとフラッシュが両方表示されているとき、フラッシュを閉じるとモーダルまで一緒に閉じてしまいます

![flash.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/dfa42405-ee5d-39cb-4345-9eb55c24790c.gif)

これはフラッシュをクリックしたイベントが、その後ろにある「モーダルの外側」にまで伝わってしまっているためです

フラッシュだけ閉じたい場合、クリックイベントをフラッシュより後ろに伝わらないよう、イベントの伝搬を止める必要があります

JavaScript の場合、以下のような実装で実現可能です

```javascript
elemnt.addEventListener('click', (event) => {
  event.stopPropagation()
  ....
})
```

`stopPropagation` により、イベントの伝搬を停止しています

これを Phoenix LiveView で再現します

## phx-click による処理

`mix phx.new` で生成される core_components では、フラッシュコンポーネントが以下のように定義されています

lib/app_web/components/core_components.ex
```heex
...
    <div
      ...
      id={@id}
      phx-click={JS.push("lv:clear-flash", value: %{key: @kind}) |> hide("##{@id}")}
      ...
    >
```

`phx-click` でクリック時の処理を定義しています

`{}` 内は Elixir であり、  `JS.push("lv:clear-flash", value: %{key: @kind}) |> hide("##{@id}")` でフラッシュを閉じています

Elixir 側の処理なので、 `phx-click` の中で　`stopPropagation` は実行できません

## フックを経由した処理

フックを以下のように定義します

assets/js/app.js
```diff_javascript
+ const FlashHook = {
+   mounted () {
+     this.el.addEventListener('click', event => {
+       event.stopPropagation()
+       liveSocket.execJS(this.el, this.el.getAttribute('data-flash'))
+     })
+   }
+ }
+ 
- let liveSocket = new LiveSocket("/live", Socket, {params: {_csrf_token: csrfToken}})
+ let liveSocket = new LiveSocket('/live', Socket, {hooks: {FlashHook}, params: {_csrf_token: csrfToken}})
```

`this.el.addEventListener('click', event => { ... })` でクリック時の処理を指定しています

`event.stopPropagation()` によってイベントの伝搬を止めます

`liveSocket.execJS(this.el, this.el.getAttribute('data-flash'))` で `data-flash` 属性に指定した処理を実行します

lib/app_web/components/core_components.ex
```diff
...
    <div
      ...
      id={@id}
+     phx-hook="FlashHook"
-     phx-click={JS.push("lv:clear-flash", value: %{key: @kind}) |> hide("##{@id}")}
+     data-flash={JS.push("lv:clear-flash", value: %{key: @kind}) |> hide("##{@id}")}
      ...
    >
```

`phx-hook` でコンポーネントにフックを紐付け、 `phx-click` を `data-flash` 属性に変更します

これにより、今までクリック時に直接実行していた処理がフックを経由するようになります

フック内で `event.stopPropagation()` が実行されるため、イベントの伝搬が止まります

![flash_stop.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/d929b5a8-ddb1-d5a1-5623-bb40bff2d171.gif)

## まとめ

フックを経由することで自由に JavaScript 　の処理を挟むことができました

他にも様々なことに応用できそうですね
GitHub Actions Workflowの実行結果と実行時間をDatadog Monitorで仕込んでみた

## はじめに
皆さんこんにちは、asmgです。今回は、GitHub Actionsの実行時間、実行結果をDatadog Monitorに仕込む作業を行なったのでそのまとめをQiitaにできればと思います。

## 背景

普段、我々はMySQLのパーティション作成と削除のコマンドをスクリプト化し、そのスクリプトをKubernetesのPodで実行するためにGitHub ActionsのWorkflow Cronを使用しています。今まで実行結果が失敗した通知のみを受け取っており、実行時間の計測は行っていませんでした。実行時間の計測が行われていなかったことが、今回RDSの障害の一因になってしまいました。
※ RDSの障害については今回の記事とは関係ないので詳細には触れません。

## 結果を受けた対応策
そこで、Datadog Continuous Integration Visibility (以降文章の中ではDatadog CI Visibilityと呼びます。)を利用してCronの実行時間 + 実行結果(successかfailed)をMonitor化して計測できるように追加を行いました。

その方法を軽く以下で紹介したいなと思います。

## Datadog CI Visibilityの紹介と作業したこと

### Datadog CI Visibilityとは？
Datadog CI Visibilityは、CIのパフォーマンスや傾向、パイプラインの結果などを可視化してくれる機能です。

詳細については以下のページをご覧ください。
[Datadog continuous_integration Visibility](https://docs.datadoghq.com/ja/continuous_integration/)

### monitorの作成

#### 計測したい内容

今回は、Datadog CI Visibilityを用いて、

* workflowの実行時間
* workflowの成功の可否

のMonitor作成を行いたいと思います。

#### 実際のモニターの作成

#### workflowの実行時間

```:実際のQuery
@git.repository.id:"<repository_name>" @ci.pipeline.name:"<workflow_name>" @git.branch:<branch_name>
```

![スクリーンショット 0005-12-25 13.55.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567360/8dc6c3f1-8131-3d3d-df6f-8d6654a5bce6.png)


↑参考の画像

:::note info
workflowの時間を計測したい場合には、最低限上記に示したQueryを書きShowを`Avg of`:Durationにすることでworkflowの時間を計測を計測することができると思います。
:::

#### workflowの成功の可否

```:実際のQuery
 @git.repository.id:"<repository_name>" @ci.pipeline.name:"<workflow_name>" @git.branch:<branch_name> @ci.status:error
```

![スクリーンショット 0005-12-25 14.04.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567360/02eef9c6-8898-4c8d-6e23-b189a944d9b4.png)

↑参考の画像

:::note info
workflowの成功の可否を計測したい場合には、最低限上記に示したQueryを書きShowを`count`:*にすることでworkflowの成功の可否を計測することができると思います。
※ 今回は失敗を計測したいので`@ci.status:error`を追加しています。
:::

## 終わりに
本記事では、GitHub Actions Workflowの実行結果と実行時間をDatadog Monitorで仕込む方法についてまとめました。
Gihub ActionsのWorkflowを用いて作業の自動化を行う場合、実行結果や実行時間を計測することは障害や問題部分に気づくため必要なことです。(自分は今回の障害を通してすごく感じました。)
この記事がGitHub Actions Workflowの実行結果や実行時間をDatadog Monitorで計測したいという人の参考になると幸いです。
業務のシステムの構築を行いつつ今後の指標を考えてみた話

# はじめに
現在業務として一番触る機会の多いシステムの利用者は高齢者が多い。
システム構築当初からデザインはわかりやすく、シンプルにしようとチーム、顧客で相談の上進めてきた。

# 気になったこと
現在自チームにはデザインに詳しい人がいないため、割と感覚的にこっちの方がいいんじゃない？
こうしたほうがいいんじゃない？という形でデザインを決めることが多かった。
案件によっては社内のデザインチームとやりとりするものもあるが、このシステムは違った。

自チームで設計・開発を進める上で、そもそもデザインって何をきにしたらいいんだ・・・？
と個人的に結構な悩みというかそういう状態になった。

# とりあえず定石を知るかのノリ
とりあえずデザインの考え方のベースを知りたいと思い、いろいろ調べてみたところ
[webデザイン技能検定](https://www.webdesign.gr.jp/) なるものがあるらしい・・・

お国がやってるならまぁ間違いはないやろ！のノリで取り合えず受験してみようと考えている。

# 今後の動き
チーム内で尖った方がいいと思っているのでデザインやUI/UX、フロントメインで頑張って
伸ばしていこうかなーとなっています。（そもそもチーム内BEつよつよまんが2人いるので・・・）
レポートのインライン編集で入力した値がうまく表示できない


レポートでデータ入力ができる便利な機能ですが、更新後の表示に問題があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c268c575-8aaf-d683-5456-ff68a7da33a7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a2559859-0c00-09b8-d7e0-ad2c48e8ae61.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/03004925-d6c1-e2bb-d9c1-b4cd51723824.png)

保存を押して更新しても、値が表示されません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/20a93f1e-f8ee-c068-08a2-e8c08df09680.png)

F5を押して強制的に再描画すると値が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/82d33adc-1477-504a-0108-066f900095a0.png)


既知の問題にもあるけど、Working as Expectedって.... 本当に期待通りなのか？

https://issues.salesforce.com/issue/a028c00000gAwgdAAC/report-is-not-refreshing-after-making-an-inline-edit-and-saving

色々探していると、同じ内容の質問を見つけました。

別の行を更新すると、その前までに編集した内容は表示されるらしい。
（確かめたら、その通りでした。）

[Inline report editing bug](https://www.reddit.com/r/salesforce/comments/u8721d/inline_report_editing_bug/)

:::note
Edit: if you edit another line and save it will refresh the previous edit. So that's kind of a workaround I guess
:::

# Salesforce レポートのインライン編集: レコードの高速更新

+ [Salesforce レポートのインライン編集: レコードの高速更新](https://www.salesforceben.com/inline-editing-for-salesforce-reports-update-records-faster/)

この機能が Summer '21 リリースの一部として最初に利用可能になったとき、試してみるのは素晴らしかったですが、編集できるフィールド タイプの数は限られていました。Salesforce はこれを改善するために多大な努力を払ってきましたが、Winter '22 リリースではさらに多くのフィールドが利用できるようになりました。 

私が最初に試してみたかったのは、営業担当者であるかのように商談を編集することでした。最初は選択リストと標準の日付フィールドが利用できなかったという事実が欠点でした。Winter '22 リリースでは、これは問題ではなくなり、営業チームのメンバーだけでなく営業担当も、「ステージ」などの重要な商談フィールドをレポート内で直接編集できるようになりました。

当初は、一度に 1 つの変更のみがサポートされており、[保存] をクリックするとすぐにレポートが更新され、最新の情報が反映されました。つまり、複数のレコードの複数の「終了日」フィールドを編集して保存することができませんでした。1 つの変更を加えてから、別のレコードの別のフィールドを編集し、このプロセスを必要なだけ繰り返すか、代わりに単純にリスト ビューを使用する必要があります。

Spring '22 リリースの一部として、Salesforce では、レポート実行ページ内でさまざまなレコードの複数の行と列を同時に編集できるようになりました。

レポート内で大量のインライン編集が可能になりませんが、フィールドを変更すると、レポートが保存されるまで他の関連フィールドが保留中として表示されるようになります。たとえば、商談の取引先名を変更すると、従業員の値が依存しているため保留中としてマークされます。アカウントレコード。


Summer '22 リリースに伴い、同じまたは異なるレコード (レポート内の行または列) の複数のフィールドを編集できるようになり、ユーザーの生産性が 1 回保存するだけでレポート実行ページから直接編集できるようになりました。

Spring '23 リリースでは、新しい [フィールド編集を有効にする] ボタンが追加されました。これは、レポートのパフォーマンスを維持し、読み込み時間を最適化する手段として機能すると同時に、レポート実行ページからインライン編集機能に簡単にアクセスできるようにします。この新たな追加が行われるまで、インライン編集はすべてのレポートに対して永続的にオンになっており、読み込み時間に遅延が生じる可能性がありました。
【Athena】重くなってきた読み込みを何とかしたい②  パーティション射影を利用してみる

# はじめに
[【Athena】重くなってきたパーティション読み込みを何とかしたい①  シンプルに読み込み対象のログを減らしてみた](https://qiita.com/TKY_study/items/969f2a21f73ce598979e)の続きとなります。

# 今回試してみた事：パーティション射影の導入
元のDDLをベースにTBLPROPERTIESを以下のように書き換えて設定を行いました。
パーティションの範囲の関しては`..`が使用でき、例えば`'01,02,03,04'`は`01..04`と書けます。
また「〇〇以降」といった設定法が無さそうでしたので、yearに関しては仮で`2021..2100`としました
設定の結果、数日おきのパーティションロード等であれば数十秒程度で完了出来るようになりました。

```SQL
CREATE EXTERNAL TABLE `app_prod_rails`(
  `date` string COMMENT 'from deserializer', 
  `container_name` string COMMENT 'from deserializer', 
  `source` string COMMENT 'from deserializer', 
  `log` string COMMENT 'from deserializer', 
  `container_id` string COMMENT 'from deserializer', 
  `ec2_instance_id` string COMMENT 'from deserializer', 
  `ecs_cluster` string COMMENT 'from deserializer', 
  `ecs_task_arn` string COMMENT 'from deserializer', 
  `ecs_task_definition` string COMMENT 'from deserializer')
PARTITIONED BY ( 
  `year` string, 
  `month` string, 
  `day` string, 
  `hour` string)
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION
  's3://syslog-app/log/app-prod/rails'
TBLPROPERTIES (
  'has_encrypted_data'='false', 
  'partitioning'='enabled', 
  'partitioning.day.range'='01..31', 
  'partitioning.day.type'='string', 
  'partitioning.hour.range'='00..23', 
  'partitioning.hour.type'='string', 
  'partitioning.month.range'='01..12', 
  'partitioning.month.type'='string', 
  'partitioning.year.range'='2021..2100', 
  'partitioning.year.type'='string', 
  'storage.location.template'='s3://syslog-app/log/app-prod/rails/year=${year}/month=${month}/day=${day}/hour=${hour}')
```


# おわりに
ログ調査にあたっては殆ど気にならない速度まで高速化できたので嬉しいです:relaxed:
しかし調査開始時に`MSCK REPAIR TABLE`若しくは`ALTER TABLE ADD PARTITION`が必要であるという状況は変わっておらず、せっかくなら読み込みまで自動で実施したいということで③に続くかもしれません

# 参考
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/partition-projection.html
【Athena】重くなってきたパーティション読み込みを何とかしたい①  シンプルに読み込み対象のログを減らしてみた

# はじめに
度々ログ調査が発生する~~問題児(;´༎ຶД༎ຶ`)~~、ECS on EC2構成にて3年ほど稼働しているとあるRailsアプリケーションについての話となります
# 問題
ログがたまり続けることで`MSCK REPAIR TABLE`の実行が日に日に遅くなってきており、ついに読み込みの完了まで1時間以上かかる状態となってしまいました。
基本的にログ調査というと直近のログが対象となる事が多い状況でしたので、調査開始が遅れてしまいます。

# 今回試してみた事：シンプルに読み込み対象のログを減らしてみた
現状の構成を確認したところ以下のようになっており、稼働初期からの全ログが読み込み対象となっていました。

```SQL
CREATE EXTERNAL TABLE `app_prod_rails`(
  `date` string COMMENT 'from deserializer', 
  `container_name` string COMMENT 'from deserializer', 
  `source` string COMMENT 'from deserializer', 
  `log` string COMMENT 'from deserializer', 
  `container_id` string COMMENT 'from deserializer', 
  `ec2_instance_id` string COMMENT 'from deserializer', 
  `ecs_cluster` string COMMENT 'from deserializer', 
  `ecs_task_arn` string COMMENT 'from deserializer', 
  `ecs_task_definition` string COMMENT 'from deserializer')
PARTITIONED BY ( 
  `year` string, 
  `month` string, 
  `day` string, 
  `hour` string)
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION
  's3://syslog-app/log/app-prod/rails'
TBLPROPERTIES (
  'has_encrypted_data'='false')
```

`PARTITIONED BY`句中の`year`についての記述を削除し、`LOCATION`句にて`/year=2023`の指定を行うという形で、
シンプルに1年分だけ読み込むように新たなテーブルを作って様子見をしてみましたところ、1時間近くかかっていたパーティション読み込みが数分まで短縮されました
```SQL
CREATE EXTERNAL TABLE `app_prod_rails_2023`(
  `date` string COMMENT 'from deserializer', 
  `container_name` string COMMENT 'from deserializer', 
  `source` string COMMENT 'from deserializer', 
  `log` string COMMENT 'from deserializer', 
  `container_id` string COMMENT 'from deserializer', 
  `ec2_instance_id` string COMMENT 'from deserializer', 
  `ecs_cluster` string COMMENT 'from deserializer', 
  `ecs_task_arn` string COMMENT 'from deserializer', 
  `ecs_task_definition` string COMMENT 'from deserializer')
PARTITIONED BY ( 
  `month` string, 
  `day` string, 
  `hour` string)
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION
  's3://syslog-app/log/app-prod/rails/year=2023'
TBLPROPERTIES (
  'has_encrypted_data'='false')
```
# おわりに
パーティション化されているログデータの読み込み範囲の縮小だけであれば、既存のDDLを出力⇒少し書き換えて新テーブルを作成といった手順で対応出来そうでした。そのため、直近のログだけが欲しい、とりあえず早くしたいといった場合には有効かと考えます。
反面、このままでは新テーブルを定期的に作らないといけなかったり、性質上年末にかけて少し重くなってきましたので[②としてパーティション射影](https://qiita.com/TKY_study/items/adb6e7960e10fe526c43)の導入を実施してみました。

# 参考
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/partitions.html
タスク管理してたら工数見積もりの技術が上がるツールを作った（未完成）

# はじめに
自分で作って、自分で使っているタスク管理アプリについて紹介です。
ただし、compose-multiplaftformで作ったこともあり全然技術的に目新しい機能とかはついていません。

# 作った背景
最近の自分の悩みは工数見積もり能力の低さです。
大体1週間くらいで終わるだろうと思ったタスクに1ヶ月近くかかったり、このくらいのことは両立できるはずだと思っても全然手が回らなくなってしまったりします。
仕事に関してだと多めにバッファをとることで問題を避けたり、難しいところは経験者に聞いたりして対応していたのですが
仕事を辞めた今、自分の力でどうにかしないといけません。

それぞれのタスクの見積もりがずれる要因は色々あり、一発で解消することはできないなと感じています。

そこで、普段から工数見積もりについて反省しつつ、少しずつレベルアップする習慣を獲得しようとしました。

# コンセプト
タスク管理をしながら、工数見積もりの練習ができるアプリです。

# どんなアプリ
macのデスクトップアプリとiphone、Androidアプリを作成して裏でデータを同期しています。
macでタスク一覧の確認と、今日やるタスクのリスト化。モバイルアプリで急に入ったタスクの追加と、タスクの実行状況の更新を行います。
UIは自分で使うようなので全然可愛くないのですが、こんな感じです。

一覧画面状態
![](https://storage.googleapis.com/zenn-user-upload/7246280d89e4-20231225.png)
タスク実行中の画面の状態
![](https://storage.googleapis.com/zenn-user-upload/6e307dc01b3c-20231225.png)
これと工数見積もり精度を確認する画面があるのですが、あまりにも個人情報が入り込んでしまっていて隠すのがめんどくさいので割愛します。
# ユーザーストーリー
## 元々の習慣
自分の普段のタスク管理を思い出すと以下のような手順で行っていました。
ちなみに自分はvisual studio codeでmarkdownの形でメモを取ることでタスク管理していました。

1. タスクが発生した時にタスク一覧にメモ
2. 朝一番で、タスク一覧をみて今日やるべきものをリストアップ
3. 夜までに一つずつこなしていく
4. タスクが完了したらチェックボックス

## このアプリで作る習慣
アプリを作って使ってみて（1週間）、大体以下のような習慣に変えることができました。
1. タスクが発生した時にアプリ上にメモ、その時に工数を見積もっておく（スマホ上）
2. 朝一番で、見積もった工数を参考にやるべきタスクをリスト化（PC上）
3. デスクに座ったら左にスマホをセット、作ったアプリを開いておく
4. タスク開始と同時にボタンを「開始ボタン」を押す
5. タスクが終わったら「終了ボタン」を押す
6. 1日のタスクが終わったら見積もりと実稼働の差を確認して、他のタスクの見積もり時間を修正する。

### 細かい機能
深夜に完了に移ったタスクを空にしてます。
見積もりの精度ページは、1週間のタスクの完了状況を精度が低かった順に並べて、まずいやつは赤字にするようにしてます。

### 試してダメだったこと
visual studio codeでタスク管理することは変えずに
タスクを実行中は、手動で対応中カテゴリにタスクを移動させ、cronを頻繁に走らせて、対応中に移った時間と終了に移った時間を計測、誤差をテキスト形式で出力するような形を試してみました。
しかしvscodeが常に画面上に開いているわけではないので、ボタン形式と違ってめんどくさくて習慣化しませんでした。

# 感想
概ね満足です。
compose multiplatformの勉強が主目的だったのですが、全然普段から使えるアプリになったのでコスパの良い体験でした。
もしかしたら使ってみたい人がいるかもしれないので、ストアにリリースする準備中です。
研究ともう一個の案件が1月中には片付く予定なので、その後にリリースするかな。
tinysshdに接続する

- LMDE6に立てたsshd(tinySSHD)に接続するのが一筋縄でき行かなかったので備忘録です

- 前提として、機能限定版のtinysshdは設定ファイルがありません。パスワードでのログインが不可能なので公開キーでの接続が必須ですが、パスワードでのログインができないので、ssh-copy-id で公開キーを送ることができません。設定ファイルが無いので公開キーを受けるときだけパスワードログインを可能にすることができないからです。

- さて、上記の前提での公開キーの登録手順は
1) 接続元での公開キーの作成
2) 公開キーを接続先に設定
3) 暗号キーで接続先にログイン

と、なります。
2で、ssh-copy-idが使えないので、USBメモリ等で物理的に持っていくか、メール等のWEBサービスを使用することになりそうです。（今回はUSBメモリで持っていきました）

- ここまで行けば通常のsshdとして特に違和感なくつながる筈ですね

```
$ ssh -i /home/ayumi/.ssh/id_rsa ayu@eeepc901.local
ayu@eeepc901.local: Permission denied (publickey).
```

- 繋がりませんでした。
- 結果としては"RSA"がダメだったようです。
- ed25519を使用すると問題なく繋がりました。

```
$ ssh -i ./.ssh/id_ed25519 ayu@eeepc901.local
ayu@eeepc901:~$
```

- 参考までに、インストールされているtinysshdで以下のバージョンのです。

```
tinysshd/stable,now 20230101-1 i386
```

---

- さらっと結論まで書きましたが、情報がPermission errorだけなので、なかなか苦戦しました。
- まあ、tinysshdを使用する方も多くないと思いますが、現在非推奨のRSAを使い続けている所だと、あるバージョンから完全排除になった結果バージョンアップ直後から繋がらなくなるといったことはありえるので、早めに公開鍵暗号の方式変更を進めていったほうがいいかもしれませんね。
Ubuntu 23.10(Mantic Minotaur) で PHP 3.0.18 の phpinfo を見てみたい

[php.net](https://www.php.net/)で「[Download](https://www.php.net/downloads.php)」→「[Old archives](https://www.php.net/releases/)」とリンクを辿ると、「Unsupported Historical Releases」というページが表示されます。
ふと、このページの一番下にある「3.0.x」が、最新（2023年12月25日時点）のUbuntu環境(Ubuntu 23.10(Mantic Minotaur))で動くのかが気になったので試してみました。

まずは、Ubuntu 23.10(Mantic Minotaur)のDockerコンテナを起動します。

```
$ docker pull ubuntu:mantic
$ docker container run \
--rm \
-p 127.0.0.1:8080:8080 \
-it ubuntu:mantic \
bash
```

PHPのインストールに必要なパッケージ群をインストールします。

```
# apt install -y build-essential curl
```

今回は「/usr/local/src」の配下でインストール作業を行うので、ディレクトリを移動します。

```
# cd /usr/local/src
```

「[Unsupported Historical Releases](https://www.php.net/releases/)」のページに「PHP 3.0.18 Source Code」と記載されているので、そのリンク先となっているファイルをダウンロードします。
※「http」で提供されいているので、「-k」オプションを付与する必要があります。

```
# curl -k -LO http://museum.php.net/php3/php-3.0.18.tar.gz
```

ファイルを展開します。

```
# tar zxf php-3.0.18.tar.gz 
```

「php-3.0.18」のディレクトリへ移動します。

```
# cd php-3.0.18
```

configureのオプションは何もつけずにデフォルトで実行してみます。

```
./configure
```

コンパイルを実行します。
※途中で大量の「warning」メッセージが表示されますが、ひとまず無視します。

```
# make
```

インストールを実行します。

```
# make install
cp php /usr/local/bin
```

PHPのバイナリファイルが作成されていることを確認します。

```
# ls -l /usr/local/bin/php
-rwxr-xr-x 1 root root 1994784 Dec 25 04:44 /usr/local/bin/php
```

PHPのバージョンを確認すると「3.0.18」と表示されました。

```
# php -v   
3.0.18
```

phpinfoの内容をHTMLファイルとして出力します。

```
# cd /tmp/
# php -i > phpinfo.html
```

先ほど作成した「phpinfo.html」をホストPCのブラウザからアクセスしたいのですが、PHP 3.0.18にはビルトインウェブサーバーの機能がありません。
なので、少々強引ではありますが、同じ環境にPHP8.xをインストールします。

```
# apt install -y php
```

PHP 8.2がインストールされました。

```
# php8.2 -v
PHP 8.2.10-2ubuntu1 (cli) (built: Sep  5 2023 14:37:47) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.10, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.10-2ubuntu1, Copyright (c), by Zend Technologies
```

先ほど「phpinfo.html」を作成したディレクトリへ移動します。

```
# cd /tmp/
```

ビルトインウェブサーバーを起動します。

```
# php8.2 -S 0.0.0.0:8080
```

ホストPCのブラウザで http://localhost:8080/phpinfo.html にアクセスすると、以下のような内容が表示されました。

![phpinfo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/7ad9fdec-9559-37fe-4715-d016de019f5d.png)

ということで、PHP 3.0.18 の phpinfo の内容が無事に確認できたのですが、ここで一つ気になることを思い出しました。

「[Unsupported Historical Releases](https://www.php.net/releases/)」のページでPHP 3.0.18のソースファイルをダウンロードしましたが、 php-3.0.18.tar.gz の取得先のURLは museum.php.net というドメインでした。
この museum というサブドメインは見覚えがあります。

「Unsupported Historical Releases」のページの右側にあるメニューの中に「PHP Museum」というのがありますね。どうやらこのリンク先のURLが https://museum.php.net/ のようです。

![Screenshot from 2023-12-25 14-25-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/8c527b65-840b-b091-c6b8-50389cb9d674.png)

museum.php.net のページを見てみると、「php1」が存在します。
PHP 3.xよりも更に古いバージョンがインストールできるのか試してみるのも面白そうですね。

![Screenshot from 2023-12-25 14-27-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/c1cff242-68e1-e819-381f-7da0f1b92a70.png)
2023年ざっくりまとめ

本記事は、[OSSのノーコード・ローコード開発ツール「プリザンター」 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/pleasanter) の25日目の記事であり、2023年締めくくりの記事でもあります。
皆さまのご協力のおかげで今年もアドベントカレンダーを完走することができました。ありがとうございます！

## はじめに
今年もプリザンター界隈では様々なニュースがありました。
皆さまから多くのレビューをご投稿いただき、ITreview Awardのローコード開発カテゴリにて最高位となるLEADERを3期連続で受賞しました。
![widget202312.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/834556/61d701e2-5cf8-355c-6084-6d5f64e9f44e.png)

名だたるビッグネームに連なって我らがHAYATOくんのアイコンが並ぶのはなんとも感慨深いものです。

それから今年の3月から始まった、お悩み解決生配信「プリなま」も大変ご高評をいただき、これまでの配信で解決したお悩みは100件を越えました！こちらはサンプルコードなどもダウンロード頂けますので、アーカイブで解説を見ながら試していただければと思います。
今回のアドベントカレンダーの記事でもいくつかご紹介していますので、よろしければご確認ください。

[プリザンターを便利に使う小ネタ](https://qiita.com/pleasanter_oss/items/cb7874448091d4f08fb1)
[プリザンターを便利に使う小ネタ②](https://qiita.com/pleasanter_oss/items/fad1627abb9202ae5ef2)

そして、今月の配信でついに10回目！今年最後の「プリなま」は27日(水)18:30〜です。是非ご視聴ください！
![サムネ1280x720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/834556/6676674d-e877-2708-5d78-b39a8a39a533.png)
[プリザンターお悩み解決生配信 プリなま \#10 \- YouTube](https://www.youtube.com/watch?v=GPl5n71Tlt4)

そしてそして、プリザンター自体も大きな機能追加が行われました。
まずは何と言ってもダッシュボード機能！スクリプトを使って結構な力技でダッシュボードを実現しているユーザさんも結構いらしたのですが、ついに標準機能でダッシュボードが使えるように。相変わらず拡張性も高いので、アイディア次第ではいろいろと面白いことができそうな点もワクワクしますね。いろいろ試してみて下さい！
![ダッシュボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/834556/8d91e6e9-511a-11ec-52cf-afe7c1be26d8.png)

更に、今月リリースされたバージョンで実装された計算式の拡張機能。こちらはエクセルライクな関数が使える便利な機能！プリザンターのサーバスクリプト機能はとても強力で、シンプルなコードでパワフルに機能を拡張できるのですが、いくらシンプルとはいえ馴染みのない方にとってはやはりとっつきにくいものです。そんな方々にとってこの計算式の拡張はとても便利にお使い頂ける新機能だと思います。例えば年齢を出したい時などに使える日付の計算であったり、大文字小文字の変換であったり、更にはIF文まで使えてしまいます！エクセル関数を使い慣れている方なら、さらにプリザンターが便利に使えそうです。エクセル業務のプリザンター化が捗りますね。
[ユーザマニュアル：計算式（拡張）の関数一覧](https://pleasanter.org/manual/formula-function-list)
[計算式の関数機能を使ってみた \#Pleasanter \- Qiita](https://qiita.com/implem-taguchi/items/c7b669ec3dd7e335c2e4)

活用ケースとしては少々特殊ではありますが、指定のタイミングでサーバスクリプトを実行できるバックグラウンドサーバスクリプトもかなり強力な機能です。外部バッチで処理していたものがプリザンター単体で完結できるようになるかもしれません。
[テナント管理機能：バックグラウンドサーバスクリプト](https://pleasanter.org/manual/background-server-script)

## おわりに
そんなわけで、なんだかんだで今年もあっという間の1年でした。
プリザンターは、オープンソースのプロダクトですが、今まではOSSとしてのコミュニティ活動に積極的な動きができずにいました。流行り病がある程度落ち着いてきたのもあって、今年は年初より数多くのOSS関連イベントに参加し、とても貴重な出会いの機会をいただきました。会場でユーザさんにお声がけいただけたのもとても嬉しいできごとでした。
来年もまたOSSとしてのコミュニティ活動は積極的に参加していくつもりです。いつかどこかで皆さまにお会いできることを夢見て来年も全国に出没しますのでお近くの方は是非、会場で握手！

というわけで今年も1年ありがとうございました！
皆様、Merry Christmas! & Happy New Year!
and...

![enjoy3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/834556/c2002f96-4101-8328-b304-f5bcdb2f61ec.png)
Swaggerで作成したAPI仕様書をGitHub Pagesにデプロイしよう！

## 概要
Swaggerで作成したAPI仕様書をGitHub Actionsを使ってGitHub Pagesにデプロイする方法について解説します

## 前提
- GitHub Actionsに関する基礎知識を有している
- openapi.ymlを作成済
- Swaggerでドキュメントを自動生成する用のAPIを作成済み

## ディレクトリ構成
ファイル構成は以下のとおりです
```
❯ tree
.
├── .github
│   └── workflows
│       └── deploy-swagger.yml
└── doc
    └── openapi.yml
```

## 実装するファイル一覧
- deploy-swagger.yml

## ワークフローの作成
SwaggerをGitHub Pagesにデプロイするワークフローを作成します
まず、swagger-cliをインストールし、doc/openapi.yml内に書いたドキュメントを静的ファイルとして出力し、swagger-uiというフォルダに格納します
その後、swagger-ui内の静的ファイルをGitHub Actions公式のartifactのactionを使ってartifact内に格納します
最後にartifact内の静的ファイルをGitHub Actions公式のdeploy-pagesを使ってGitHub Pages上にデプロイします

```.github/workflows/deploy-swagger.yml
name: Deploy Swagger UI to GitHub Pages

on:
  push:
    branches:
      - develop
      - main
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Chekcout code
        uses: actions/checkout@v4
      - name: Install swagger-cli
        run: npm install -g swagger-cli
      - name: Generate Swagger UI
        uses: Legion2/swagger-ui-action@v1
        with:
          output: swagger-ui
          spec-file: doc/openapi.yml
      - name: Upload Documents
        uses: actions/upload-pages-artifact@v3
        with:
          # 絶対パスを指定
          path: swagger-ui

  # Deploy the artifact to GitHub pages.
  # This is a separate job so that only actions/deploy-pages has the necessary permissions.
  deploy:
    needs: build
    runs-on: ubuntu-latest
    permissions:
      pages: write
      id-token: write
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    steps:
      - id: deployment
        uses: actions/deploy-pages@v4
```

## GitHub Pagesの設定
Build and deploymentの箇所をGitHub Actionsに設定します

![スクリーンショット 2023-12-25 14.30.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/d9bb532b-3fd5-db8f-760b-134848034b8b.png)

## 実際にデプロイしてみよう！
以下のようにワークフローが成功し、Swaggerの画面をGitHub Pages上で表示できたら成功です

![スクリーンショット 2023-12-25 9.17.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/0cf911a3-c1d7-471f-bfbe-ef0e0d6161e5.png)

![スクリーンショット 2023-12-25 9.17.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/f174536e-f3a3-6c9f-3ca2-8d21120a9609.png)

![スクリーンショット 2023-12-24 15.58.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/19de6572-2ea2-02a4-4a44-7e17c22d452c.png)

## 以下のエラーメッセージが出た時
![スクリーンショット 2023-12-24 15.57.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/f954fb9c-5f09-5b66-c623-d46eb549b061.png)

Swagger3.1以上だとうまくGitHub Actions上でデプロイできないのでv3.0でデプロイしてみましょう

## 参考
https://github.com/Legion2/swagger-ui-action

https://docs.github.com/ja/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site

https://github.com/actions/upload-artifact
VSCodeでrailsのログファイルを開くとカラーコードが制御文字で表示されるのを何とかする

# 事象
VSCodeでrailsのログファイル`log/development.log`を開くと以下のようになります
[![VSCodeでログファイルを開いた様子](https://i.gyazo.com/6ecc074097464cea984d74ca7267e75d.png)](https://gyazo.com/6ecc074097464cea984d74ca7267e75d)

`ESC`や`[1m`や`[36`など謎の文字が表示されており見づらいです。

# 対策
拡張機能ANSI Colorsをインストールしましょう。

https://marketplace.visualstudio.com/items?itemName=iliazeus.vscode-ansi

## 使い方
`Ctrl + Shift + P`で開いたプロンプトで`ansi`と入力すると`ANSI Text: Open Preview`とでるのでこれを選択します。

[![ANSI ColorsのPreview画面](https://i.gyazo.com/89389b79003f25a3f86c0009642ee2c9.png)](https://gyazo.com/89389b79003f25a3f86c0009642ee2c9)

# これはなに？
ANSIエスケープシーケンスという形式で書かれたカラーコードです。ターミナルに色付きで表示する場合に使います。

https://qiita.com/PruneMazui/items/8a023347772620025ad6

これはtailやlessを使ってターミナルを使って表示するときは便利ですが、VSCodeのようなテキストエディタで開くと制御コードがそのまま表示されてしまいます。そこでANSI Colors拡張機能を入れて表示できるようにしました。

ちなみに、Rails側で制御することもできます。 以下の設定でANSIコードが入力されないようになります。
```
# config/environments/production.rb
Rails.application.configure do
  config.colorize_logging = false
end
```




たまに、大量のログが出るときとかにtailしてたら流れちゃうのでVSCodeで開きたいけど見づらいなーとなって我慢してたけど重い腰を上げました。ANSIエスケープシーケンスという名前は初めて知りました。