ELW株式会社 テックブログ

リアルなログをそのままお届けします。

Tanstack Startのserver functionとは

フロントエンジニアをしております、堀江です。

私はフロントエンド技術の情報収集に、主に『This Week in React』というニュースレターを活用しています。

thisweekinreact.com

そのニュースレターで面白い記事を見つけ、勉強会として一緒に読み合わせを行いました。2つの連続した記事になるのですが、内容としてTanstack Startにおけるserver functionという概念の紹介と、それとRSCやNext.jsのApp Routerとの比較になっています。

www.brenelz.com

www.brenelz.com

Next.jsは記事中で紹介されているserver functionや、server aciton、server componentという概念をRSCとApp Routerの元で混同している(本来は分けて考えることができる)という指摘や、サーバー中心の設計ではサーバー側でキャッシュを管理する必要があるために”use cache”というディレクティブが登場せざるを得なくなったという話は、Next.jsはsimpleではなくeasyなフレームワークであるとよく言われる所以だと感じました。

ブログ記事中ではserver functionというTanstack Startで実現されているアイデアの一端にしか触れられていませんが、フレームワークが持つ他の機能についても気になるため、実際のプロダクトへの採用を考えるため詳しくこれから見ていきたいところです。

その他参考資料

tanstack.com

zenn.dev

Anthropic Computer UseとBrowser Useを使ってみた

ELWでエンジニアをしております、井立田です。

今回はAnthoropic Computer UseとBrowser Useを実際に試してみたので、その手順と感想を書いてみました。

Anthropic Computer Use

docs.anthropic.com

Computer Useとは

  • AI モデル(Claude )がコンピューターのデスクトップ環境を操作できる機能のこと
  • 仮装環境で動作するため、ローカルPCのファイルやシステムに直接アクセスすることはできない
  • プログラムを作らせることも可能

事前準備

  1. クレジットのチャージ(https://console.anthropic.com/settings/billing
  2. API keyの作成(https://console.anthropic.com/settings/keys

手順

  1. githubからAnthropic社の用意しているリポジトリをクローン

     git clone https://github.com/anthropics/anthropic-quickstarts.git
     cd anthropic-quicstarts/computer-use-demo
    

    github.com

  2. docker起動

    事前準備で作成したAPI keyを設定して、dockerを起動します

     export ANTHROPIC_API_KEY=%your_api_key%
     docker run \
         -e ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY \
         -v $HOME/.anthropic:/home/computeruse/.anthropic \
         -p 5900:5900 \
         -p 8501:8501 \
         -p 6080:6080 \
         -p 8080:8080 \
         -it ghcr.io/anthropics/anthropic-quickstarts:computer-use-demo-latest
    

コンテナが起動したら、 http://localhost:8080 にアクセスすると、Computer Useのデモ環境が開きます!

試しにELWのテックブログを開いてもらう

感想

  • Computer Useで実際にステージング環境にログインしてもらい、登録操作を行いました
  • 以下の理由から実運用はまだ難しそう

Brouser Use

browser-use.com

Brouser Useとは

  • AI モデルがブラウザを操作できるようにするためのライブラリ
    • 視覚的な理解と、HTMLの構造を読み取ってWebページを操作できる
    • 複数のブラウザタブを自動で処理し、並列処理を実行可能
    • 要素のXPathを記録し、同じ操作をAIが正確に繰り返せる
    • ファイルへの保存、データベース操作、通知、人間の入力処理など、独自のアクションを追加できる
    • 自己修正機能がある
    • あらゆる LLM に対応(GPT-4、Claude 3、Llama 2 など)

手順

  1. githubからbrowser-useのリポジトリをクローン

     git clone https://github.com/browser-use/browser-use.git
     cd browser-use
    

github.com

  1. browser-useとplaywrightをインストール

     pip install browser-use
     playwright install
    
  2. APIキーの設定

    .env ファイルを作成し、OpenAI や Anthropic の API キーを設定

     OPENAI_API_KEY=%your_api_key%
     ANTHROPIC_API_KEY=%your_api_key%
    
  3. 任意の場所に実行ファイルを作成

    • プロジェクトの任意の場所に実行ファイルを作成する
    • taskにやりたいこと、llmに利用するAIモデルを指定
     from langchain_openai import ChatOpenAI
     from browser_use import Agent
     import asyncio
     from dotenv import load_dotenv
     load_dotenv()
    
     async def main():
         agent = Agent(
             task="ELWのはてなブログにアクセスし、最新の記事を開いてください",
             llm=ChatOpenAI(model="gpt-4o"),
         )
         result = await agent.run()
         print(result)
    
     asyncio.run(main())
    
  4. 上記で作成したファイルを実行

     python demo.py
    

自動でブラウザが立ち上がりtaskの指示に従って操作してくれる

感想

  • Browser Useで実際にstaging環境にログインしてもらい、登録操作を行いました
  • 抽象度の高い指示でも対応してくれるのがすごい。(あまり抽象的すぎると迷子になる)
    • 下記のような指示でも実行することができた
      • サイドバーのアイコンから顧客一覧画面を開き、新規作成を行なってください。任意の名前を入力して保存を行なってください。
    • 保存ボタンが見当たらない場合でも自動でスクロールを行ってくれる
  • カスタムアクションを設定すればファイル出力も可能なため、テストケースを作成すれば簡単なテストであれば自動化できそう → 次回アクション

比較

Browser Use Computer Use
概要 AI がブラウザを操作する AI が仮想デスクトップ環境を操作する
実行環境 Webブラウザ(Playwrightを使用) 仮想環境(Dockerコンテナ上で動作)
制限 Playwrightを使用するためブラウザ内の操作しかできない 仮装環境上で実行されるためローカルPCのファイルやシステムにはアクセスできない

議事録

  • playwrigtのエミュレート機能で自分の操作に対するテストコードを作成できるので、わざわざBrowser Useを利用する必要がないのではないか
  • それだとUIが更新されたらシナリオテストを更新する必要がある
  • これであればシナリオテストを更新せずに、AIが解釈して実行してくれる。抽象度が高い指示でテストしてくれるのがメリット
  • エンジニアじゃなくても支持できるのが良さそう

CSS設計思想の振り返りと今について考察してみる

単純に書けるが故にどういうルールで書くかを考えとかないとカオスになるんですよね。 クラスの命名の仕方とか、どういう粒度にするかとか、上書きどうするかとかとかとかとか。 実はその「ルール」をどうするかっちゅう設計思想というのがCSSにもありまして。

そのお話です。

!)最後にちゃぶ台返しします

BEM、OOCSS、SMACSS、FLOCSS

主要なCSS設計思想とその比較

開発において、保守性、再利用性、可読性の高いCSSを構築することは非常に重要。主要なCSS設計思想である BEM、OOCSS、SMACSS、FLOCSS について、それぞれの概要、メリット・デメリット、相互の関係性、それぞれの設計思想がどのようにCSSの構造化と管理に貢献するかを振り返ってみましょうか。

1. BEM (Block, Element, Modifier)

BEMは、CSSのクラス名をBlock, Element, Modifierという3つの要素で構成する命名規則 です。 この命名規則に従うことで、クラス名を見ただけで(?)HTMLの構造やスタイルの役割を理解しやすくなり、スタイルの衝突や意図しない上書きを防ぐことができます。

Block: ページを構成する独立したコンポーネントを表します。 例えば、ヘッダー、フッター、メニューなどがBlockに該当します。

Element: Blockを構成する要素を表します。 例えば、ヘッダー内のロゴ、メニュー内のリンクなどがElementに該当します。

Modifier: BlockやElementの状態やバリエーションを表します。 例えば、ボタンのホバー状態や、メニューのアクティブ状態などがModifierに該当します。

例:ブログ記事のカードを実装する場合

HTML:

<article class="blog-card">
  <h2 class="blog-card__title">記事タイトル</h2>
  <div class="blog-card__content">
    <p>記事の概要</p>
    <a href="#" class="blog-card__read-more">続きを読む</a>
  </div>
</article>

CSS:

.blog-card {
  border: 1px solid #ccc;
  padding: 20px;
}

.blog-card__title {
  font-size: 24px;
  margin-bottom: 10px;
}

.blog-card__content {
  line-height: 1.6;
}

.blog-card__read-more {
  color: blue;
  text-decoration: none;
}

.blog-card__read-more:hover {
  text-decoration: underline;
}

解説:

blog-card が Block を表し, 記事カード全体のコンテナとなります。 blog-card__title, blog-card__content, blog-card__read-more は Element を表し, blog-card Block 内の要素を指定します。 :hover は Modifier の一種で、blog-card__read-more Element のホバー状態を表します。 このように、BEMの命名規則に従うことで、クラス名を見ただけでHTMLの構造とスタイルの役割を理解することができます。

<BEMのメリット>

可読性の向上: クラス名からHTML構造とスタイルの役割が明確になります。

再利用性の向上: BlockやElementを再利用することで、CSSコードの重複を減らすことができます。

保守性の向上: スタイルの適用範囲が明確になるため、意図しないスタイルの崩れを防ぎやすくなります。

<BEMのデメリット>

クラス名が長くなる傾向: 特にネストが深くなるとクラス名が冗長になり、可読性が低下する可能性があります。

擬似クラスとの組み合わせ: 擬似クラスを使う場合、BEMの命名規則との整合性を保つのが難しい場合があります。

Blockの分割粒度の決定: 適切なBlockの粒度を決定するのが難しい場合があり、設計者によって解釈が異なる可能性があります。

2. OOCSS (Object Oriented CSS)

OOCSSは、「オブジェクト指向」の考え方をCSSに適用した設計思想 です。 ページを構成する要素を 再利用可能なモジュール として定義し、それらを組み合わせてページを構築することで、CSSの保守性と再利用性を向上させることを目指します。 OOCSSの核心は、「レゴのように考える」 という考え方です。 ページを構成する要素をレゴブロックのように捉え、それらを組み合わせることで、複雑なページを構築するという発想です。

例:ボタンを実装する場合

HTML:

<button class="button">ボタン</button>
<button class="button button--primary">プライマリボタン</button>
<button class="button button--large">大きいボタン</button>

CSS:

.button {
  display: inline-block;
  padding: 10px 20px;
  border: 1px solid #ccc;
  border-radius: 5px;
  background-color: #fff;
  color: #333;
  text-decoration: none;
  cursor: pointer;
}

.button--primary {
  background-color: #007bff;
  color: #fff;
}

.button--large {
  font-size: 18px;
  padding: 15px 30px;
}

解説:

.button が モジュール を表し, ボタンの基本的なスタイルを定義します。 .button--primary.button--large は Modifier で, ボタンのバリエーションを定義します。 このように、OOCSSを用いることで、ボタンというモジュールを定義し、それをベースに様々なバリエーションを作成することができます。

<OOCSSのメリット>

再利用性の向上: モジュールを再利用することで、CSSコードの重複を減らし、開発効率を向上させることができます。

保守性の向上: モジュール単位でスタイルを管理するため、変更の影響範囲を限定しやすくなります。

柔軟性の向上: モジュールを組み合わせることで、様々なレイアウトやデザインに対応しやすくなります。

<OOCSSのデメリット>

モジュール分割の難しさ: 適切なモジュール分割を判断するのが難しく、設計者によって解釈が異なる可能性があります。

抽象化の難しさ: 再利用性を高めるためには、モジュールを抽象化する必要がありますが、抽象化のレベルを適切に設定するのが難しい場合があります。

3. SMACSS (Scalable and Modular Architecture for CSS)

SMACSSは、CSSを5つのカテゴリ(Base, Layout, Module, State, Theme)に分類する設計手法です。これにより、大規模なWebサイトでもCSSを構造化し、管理しやすくすることを目指します。

Base: ウェブサイト全体に適用される基本的なスタイルを定義します。 (例: リセットCSSタイポグラフィ)

Layout: ページ全体のレイアウトを定義します。 (例: ヘッダー、フッター、コンテンツエリア)

Module: 再利用可能なコンポーネントのスタイルを定義します。 (例: ボタン、フォーム、カード)

State: 要素の状態に応じたスタイルを定義します。 (例: ホバー状態、アクティブ状態)

Theme: ウェブサイトのテーマ(配色、フォントなど)を定義します。

例:ウェブサイトのヘッダーを実装する場合

HTML:

<header class="header">
  <div class="container">
    <h1 class="header__logo">ロゴ</h1>
    <nav class="header__nav">
      <ul class="header__nav-list">
        <li class="header__nav-item"><a href="#">メニュー1</a></li>
        <li class="header__nav-item"><a href="#" class="is-active">メニュー2</a></li>
        <li class="header__nav-item"><a href="#">メニュー3</a></li>
      </ul>
    </nav>
  </div>
</header>

CSS:

/* Base */
body {
  font-family: sans-serif;
}

/* Layout */
.header {
  background-color: #f0f0f0;
  padding: 20px 0;
}
.container {
  width: 960px;
  margin: 0 auto;
}

/* Module */
.header__nav-list {
  list-style: none;
  margin: 0;
  padding: 0;
}
.header__nav-item {
  display: inline-block;
  margin-right: 20px;
}

/* State */
.is-active {
  font-weight: bold;
}

解説:

body のスタイル定義は Base カテゴリに属します。 .header.container のスタイル定義は Layout カテゴリに属します。 .header__nav-list, .header__nav-item は Module カテゴリに属します。 .is-active は State カテゴリに属します。

<SMACSSのメリット>

構造化の促進: CSSをカテゴリ別に分類することで、大規模なスタイルシートでも管理しやすくなります。

保守性の向上: カテゴリ別にスタイルを管理することで、変更の影響範囲を限定しやすくなります。

チーム開発の効率化: 共通の設計ルールに従うことで、チームメンバー間でのコミュニケーションが円滑になります。

<SMACSSのデメリット>

学習コスト: 5つのカテゴリを理解し、適切に適用するためには、ある程度の学習コストが必要です。

柔軟性の低下: 厳密なルールに従うため、状況によっては柔軟性に欠ける可能性があります。

4. FLOCSS (Functional Level of CSS)

FLOCSSは、CSSを機能レベルで分類する設計手法 です。 OOCSSやSMACSSの考え方をベースに、より明確なファイル構成と命名規則を定義することで、CSSの保守性と再利用性を向上させることを目指します。

FLOCSSでは、CSSを以下の3つのレイヤーに分割します。

Foundation: プロジェクト全体で共通の基本的なスタイルを定義します。 (例: リセットCSS、変数、mixin)

Layout: ページ全体のレイアウトを定義します。 (例: ヘッダー、フッター、メインコンテンツ)

Object: 再利用可能なコンポーネントのスタイルを定義します。 Objectはさらに、Component, Project, Utilityに分類されます。

Component: 再利用可能な最小単位のコンポーネント

Project: いくつかのComponentの集合で、ページ固有のブロック

Utility: ComponentやProjectでは扱わない、marginなどのスタイル調整

例:ウェブサイトのフォームを実装する場合

HTML:

<form class="p-form">
  <div class="c-form-group">
    <label for="name" class="c-form-label">名前</label>
    <input type="text" id="name" class="c-form-input">
  </div>
  <button type="submit" class="c-button u-mb16">送信</button>
</form>

CSS:

/* foundation */
body {
  font-family: sans-serif;
}

/* layout */
.l-container {
  width: 960px;
  margin: 0 auto;
}

/* component */
.c-form-group {
  margin-bottom: 20px;
}

.c-form-label {
  display: block;
  margin-bottom: 5px;
}

.c-form-input {
  width: 100%;
  padding: 10px;
  border: 1px solid #ccc;
  border-radius: 5px;
}

.c-button {
  display: inline-block;
  padding: 10px 20px;
  border: none;
  border-radius: 5px;
  background-color: #007bff;
  color: #fff;
  text-decoration: none;
  cursor: pointer;
}

/* utility */
.u-mb16 {
  margin-bottom: 16px;
}

解説:

body のスタイル定義は Foundation レイヤーに属します。 .l-container のスタイル定義は Layout レイヤーに属します。 .c-form-group, .c-form-label, .c-form-input, .c-button のスタイル定義は Component に属します。 .u-mb16 は Utility に属します。

<FLOCSSのメリット>

明確なファイル構成: レイヤーごとにファイルを分割することで、CSSの構造が明確になります。

命名規則による役割の明確化: 各レイヤーに特定のプレフィックスを付けることで、クラス名を見ただけでその役割を理解できます。

保守性と再利用性の向上: モジュール化と命名規則により、CSSの保守性と再利用性が向上します。

<FLOCSSのデメリット>

学習コスト: FLOCSSの概念と命名規則を理解するまでに、ある程度の学習コストが必要です。

柔軟性の低下: 厳密なルールに従うため、状況によっては柔軟性に欠ける可能性があります。

各設計思想の相互関係

BEM、OOCSS、SMACSS、FLOCSSは、それぞれ異なるアプローチでCSSの構造化と管理を目指していますが、相互に関連し合い、補完し合う関係にあります。

OOCSSは、CSS設計の基本的な考え方 を提供し、BEM、SMACSS、FLOCSSは、その考え方を具体的な手法に落とし込んだものと言えます。

BEMは、命名規則に焦点を当てた手法 であり、OOCSS、SMACSS、FLOCSSのいずれにも適用できます。

SMACSSは、CSSの分類に焦点を当てた手法 であり、OOCSSとFLOCSSの考え方を中に含んでます。

FLOCSSは、OOCSSとSMACSSをベースに、より明確なファイル構成と命名規則を定義した手法です。

…ここまでのまとめ

CSS設計思想は、大規模なWebサイトにおいてもCSSを効率的に管理・運用するために不可欠なものです。 どの設計思想を採用するかは、プロジェクトの規模や要件、チームのスキルレベルなどを考慮して決定する必要があります。

重要なのは、CSS設計思想の背後にある原則を理解し、プロジェクトに最適な手法を選択することです。 適切なCSS設計思想を採用し、実践することで、保守性、再利用性、可読性に優れたCSSを構築することができます。

新たな設計思想の検討

React(Next.js)を用いた開発において、最適なCSS設計思想は、プロジェクトの規模やチームの構成、開発者のスキルセットによって異なります。既存の設計思想(BEM, OOCSS, SMACSS, FLOCSS)はそれぞれ優れた点を持つ一方で、Reactのコンポーネント指向の開発スタイルと完全に合致しない部分も存在します。 既存の設計思想のルールに固執せず、Reactの特性を活かした、新たな設計思想の方向性を検討してみましょう。

目指すべき方向性

コンポーネント中心: Reactのコンポーネント構造を最大限に尊重し、CSSコンポーネント単位で管理することを基本とします。

再利用性と拡張性の両立: コンポーネントの再利用性を高めつつ、プロジェクト固有のスタイルや将来的な拡張にも柔軟に対応できる仕組みを目指します。

シンプルで理解しやすい: チームメンバー全員が理解しやすく、保守しやすいシンプルなルールを設定します。

具体的な設計案

コンポーネントスタイル:コンポーネントは、独自のCSSモジュールを持ちます。 コンポーネント内部の要素のスタイルも、コンポーネントのスコープ内で定義します。 基本的にはBEMのような命名規則を用いることで、コンポーネント内の要素を識別しやすくします。ただし、厳密なBEMのルールに縛られる必要はありません。 コンポーネントのバリエーションは、propsやコンテキストAPIなどを活用して、動的にスタイルを適用します。

グローバルスタイル: プロジェクト全体で共通のスタイル(タイポグラフィ、カラーパレット、リセットCSSなど)は、別途グローバルなCSSファイルで定義します。 グローバルスタイルは、FLOCSSのFoundationレイヤーの考え方を参考に、基本的なスタイル定義に限定します。

レイアウトスタイル: ページ全体のレイアウトや、ヘッダー、フッター、サイドバーなど、複数のコンポーネントにまたがるスタイルは、レイアウト専用のCSSモジュールまたはファイルで定義します。 レイアウトスタイルでは、必要に応じてグリッドシステムやFlexboxを活用します。 SMACSSのLayoutカテゴリの考え方を参考に、レイアウト構造を明確に定義します。

ユーティリティクラス: マージン、パディング、色の調整など、コンポーネントを横断して使用される軽微なスタイル調整のために、ユーティリティクラスを用意します。 ユーティリティクラスは、FLOCSSのUtilityレイヤーの考え方を参考に、命名規則を統一し、必要最小限に留めます。

実装例:

src
├── components
│   └── Button
│       ├── Button.tsx
│       └── button.module.css
├── layouts
│   └── Header
│       ├── Header.tsx
│       └── header.module.css
├── styles
│   ├── global.css
│   └── utilities.css
└── pages
    └── index.tsx

components/Button ディレクトリ: ボタンコンポーネント

Button.tsx: コンポーネントのロジック

button.module.css: コンポーネントのスタイル

layouts/Header ディレクトリ: ヘッダーレイアウト

Header.tsx: レイアウトのロジック

header.module.css: レイアウトのスタイル

styles ディレクトリ: グローバルおよびユーティリティスタイル

global.css: プロジェクト全体の共通スタイル

utilities.css: ユーティリティクラス

<メリット>

コンポーネントの独立性が高く、再利用しやすい: コンポーネントスタイルが独立しているため、他のコンポーネントへの影響を心配することなく、コンポーネントを再利用できます。

スタイルの管理が容易: CSSコンポーネント、レイアウト、グローバル、ユーティリティに分類されているため、スタイルの変更や追加が容易になります。

チーム開発に適している: 明確なルールと構造により、チームメンバー全員がCSSの役割を理解しやすく、一貫性を保った開発が促進されます。

<デメリット>

設計ルールをチーム全体で共有することが重要: 独自の設計思想を採用する場合は、ルールを文書化し、チーム全体で共有することが重要です。

過度な抽象化は避ける: 再利用性を追求しすぎると、抽象度が高くなり、コードの理解が難しくなる可能性があります。

ユーティリティクラスの乱用を防ぐ: ユーティリティクラスは便利ですが、多用するとスタイルの管理が複雑になる可能性があります。

まぁ、もうやってますよね(まとめ)

React(Next.js)でのCSS設計は、プロジェクトの特性に合わせて柔軟に設計することが重要です。既存の設計思想を参考にしつつ、Reactのコンポーネント指向の開発スタイルに適した、新たな設計思想を模索することで、より保守性、再利用性、可読性の高いCSSを実現できるでしょう。

し・か・し

生成AIはTaillwindをよく用いる。 …もうこんなの考える必要ないのでは。 こういう設計思想のそもそものcssの使い方の前提からひっくり返る時代になってますね。 僕はもうimportantさえ無ければOKだと思ってます。

議事録

  • BEMをLPで使ったことがある
    • LPへペライチでReactはコンポーネントだが、BEMの考え方をReactでも使っている
      • ただ、BlockはReactコンポーネント自体になるので、Blockは無くしている
      • Block部分にwrapperなどつけたりもしている
        • つまり、Reactでは各種CSS記法の一番上の階層がそもそも不要なので、注目されなくなったのでは
    • 一方CSSに@layerがある
      • グローバルCSSを書く
      • どのlayerを使うかを各CSSで使うイメージ
    • 今、違うコンポーネントで同じCSSを使いたいというケースはある
      • layerを使うとそこがきれいに書けそう
  • 生成AIとlayoutコンポーネントがあれば、それで解決してしまう
  • Next.jsで生成されるCSSがBEM的になっているので、その知識だけあれば読みやすいくらい
  • もし使うとしたらpanda cssはありかもしれない

Docker Desktop(mac)のコンテナログ削除

概要

肥大化したmac用Docker Desktopのコンテナログを削除した時の備忘録。

実行環境
  • Docker Desktop: 4.37.2
  • macOS: 15.3
  • CPU: Apple M3

導入

頻繁にコンテナごと down -> up していたり、ログ自体Docker DesktopのGUIで見ている分には然程気にならないかもしれないが、まあまあ長いこと動作し続けているローカルデバッグ用のコンテナに対しCLIでlogsを叩くと、さすがにスクロール量が気になってきておりログを掃除しようと思い立つ。

docker logs {コンテナID}

が、具体的なログファイルの格納先はどこなのか?という話になると、通常意識することはないため手が止まってしまう。

雑に調べたところ、Docker DesktopはAppleの仮想化フレームワークを使用して裏でLinux VMを動作させており、コンテナ毎のログもそこに吐かれているらしいことがわかる。

なので、ログを削除するにはそのVMに接続してコマンドを実行すればよさそう。

(ちなみにGUIのClear terminalはその名の通りターミナルを掃除するだけで、ログの実体が消えるわけではない)

作業ステップ

  1. ログファイルのパス特定

    コンソールで以下のコマンドを実行する。

    docker inspect {コンテナID} | grep -i log
    LogPath/var/lib/docker/containers/...VM内のログファイル実体。

  2. VMに接続

    以下のコマンドでVM内に入る。

    docker run -it --rm --privileged --pid=host alpine:edge nsenter -t 1 -m -u -n -i sh
    各オプションの意味については割愛するが、ホストシステム(Linux VM)のリソースにアクセスできる権限を付与したコンテナを一時的に立ち上げ、シェルを起動させている。

  3. 起動したシェルでログを削除

    以下のコマンドでログを削除(ファイルサイズ0化)する。

    truncate -s 0 {1で特定したログファイルのパス}

備考

docker-compose.yaml で管理しているのであれば、ログローテーションを設定してしまうのもよさそう。

LLMの活用状況・今後の活用方法の検討会の第二回を実施しました

ELWのCTOの村上です。LLMの活用検討会の二回目を社内で実施しましたので、その記事となります。 あくまで私が調べた内容や試行した結果ですので、もし間違いがありましてもご容赦いただけると幸いです。 第一回は以下となりますので、合わせて読んでいただけると嬉しいです。

techblog.elw.co.jp

続きを読む

LLMの活用状況・今後の活用方法の検討会の第一回を実施しました

ELWのCTOの村上です。本記事の元となった会議では、私が日々の開発でLLM(Large Language Model)をどのように活用しているかを叩き台として各自どのように活用しているかの共有、そして今後のプロジェクトや日々の開発を改善していくかを議論しました。ぜひ参考にしていただければ幸いです。

続きを読む