🎉

hawk v0.2.0リリース - テキスト処理と統計機能で用途が大幅拡張

に公開

TL;DR

hawk v0.2.0をリリースしました! 🎉

前回の記事(120+ likes!)で大きな反響をいただいたhawkが、コミュニティからのフィードバックを受けて大幅にパワーアップしました。

  • 🆕 テキストファイル対応: ログ解析が可能に
  • 🧵 文字列操作: 10種類以上の文字列関数を追加
  • 📊 統計機能: median, stddev, unique, sort対応
  • 🎨 カラー出力: 見やすい色付き表示
  • 🔧 後方互換性: 既存のクエリはそのまま動作

前回からの反響と成長

コミュニティの反応

  • Zenn: 120+ likes, 40+ stocks
  • GitHub: 35+ stars(現在進行中で成長中)
  • PitchHut: プロダクト発見プラットフォームからの招待

ユーザーからの関心

前回の記事のコメントやGitHubのStarを通じて、以下のような用途への関心を感じました:

  1. 「ログファイル解析への期待」 → テキストファイル対応を決断
  2. 「文字列処理の需要」 → pandas風文字列操作を追加
  3. 「統計情報への関心」 → median, stddevなどを実装
  4. 「出力の見やすさ」 → カラー出力で改善

v0.2.0の新機能ハイライト

🆕 テキストファイル対応

最大の新機能: プレーンテキストの処理が可能になりました

# アプリケーションログからエラー行を抽出
hawk '. | select(. | contains("ERROR"))' app.log

# Kubernetesマニフェストの情報表示
hawk '. | info' deployment.yaml

# Nginxアクセスログの行数カウント
hawk '. | count' nginx.log

実際の使用例:

# Before: 従来の方法
grep "ERROR" app.log | head -5

# After: hawkで統一
hawk '. | select(. | contains("ERROR"))' app.log
# 出力: 2024-01-15 09:01:23 ERROR Failed to process user request: connection timeout

🧵 豊富な文字列操作

pandas風の直感的な文字列処理を実現:

# 文字列の基本操作
hawk '. | map(. | upper)' names.txt           # 大文字変換
hawk '. | map(. | trim | lower)' emails.txt   # 空白除去 + 小文字変換

# パターンマッチング
hawk '. | select(. | starts_with("INFO"))' logs.txt    # 接頭辞フィルタ
hawk '. | select(. | ends_with(".log"))' files.txt     # 接尾辞フィルタ

# 高度な変換
hawk '. | map(. | replace("_", " ") | upper)' data.txt
hawk '. | map(. | split(",")[1] | trim)' csv_like.txt

📊 統計機能の充実

データ分析に必要な統計関数を追加:

# 基本統計
hawk '.scores[] | median(.value)' scores.json    # 中央値
hawk '.measurements[] | stddev(.temp)' data.csv  # 標準偏差

# データクリーニング
hawk '.items[] | unique(.category)' products.json  # 重複除去
hawk '.timestamps[] | sort' events.json           # ソート

🎨 美しいカラー出力

ターミナルでの可読性が大幅向上:

# 自動的に色付けされる出力
hawk '.users[]' data.json
  • テーブルヘッダー: 青色 + 太字
  • 数値: 緑色
  • 真偽値: 黄色
  • null値: グレー
  • JSONキー: シンタックスハイライト

実際の業務活用例

DevOpsでのログ解析

# 1. アプリケーションエラーの監視
hawk '. | select(. | contains("ERROR"))' app.log

# 2. メールサーバーの認証失敗検知
hawk '. | select(. | contains("authentication failed"))' mail.log

# 3. Webサーバーのエラーレスポンス統計
hawk '. | select(. | contains(" 500 ")) | count' nginx.log

データクリーニングの自動化

# 1. ユーザーデータの正規化
hawk '.[] | map(.customer_email | lower | trim)' sales.csv

# 2. Kubernetesマニフェストの構造確認
hawk '. | info' deployment.yaml

# 3. ログファイルからの重要情報抽出
hawk '. | select(. | contains("memory"))' app.log
# → 2024-01-15 09:02:45 WARN High memory usage detected: 85%

パフォーマンスと安定性の向上

メモリ効率の改善

  • 大容量ファイル処理の最適化
  • ストリーミング処理による省メモリ化

エラーハンドリングの強化

# より詳細なエラーメッセージ
hawk '.users[].invalid_field' data.json
# Error: Field 'invalid_field' not found in object at .users[0]

起動時間の短縮

  • 依存関係の最適化
  • 初期化処理の高速化

後方互換性の維持

重要: v0.1.0のクエリはすべてそのまま動作します

# v0.1.0と同じ書き方がそのまま使える
hawk '.users[] | select(.age > 30) | group_by(.department) | count' data.json

実装の舞台裏

技術的な挑戦

テキスト処理の統一:

// 全形式を統一的に扱う設計
match format {
    FileFormat::Json => parse_json(content),
    FileFormat::Yaml => parse_yaml(content),
    FileFormat::Csv => parse_csv(content),
    FileFormat::Text => parse_text_as_array(content), // NEW!
}

文字列操作のパイプライン:

// 複雑な文字列変換も型安全に
.map(|s| s.trim().to_uppercase().replace("_", " "))

pandas風の追求

今回のアップデートの多くは、「pandas風の操作感をより忠実に再現したい」という個人的な思いから生まれました:

  • 文字列操作: pandasの.strアクセサのような直感的な文字列処理
  • 統計関数: median(), std()などの基本統計関数
  • データクリーニング: unique(), sort()によるデータ整理
  • 視認性: Jupyter notebookのような見やすい出力

次のステップ

ロードマップ

  • v0.3.0: プラグインシステム
  • v0.4.0: リアルタイムストリーミング処理
  • v1.0.0: API安定化とパフォーマンス最適化

コミュニティ参加

現在、以下のような貢献を募集中:

  • 📖 ドキュメント改善: 使用例の追加
  • 🐛 バグ報告: エッジケースの発見
  • 💡 機能提案: 新しいユースケースの提案
  • 🔧 コード貢献: 新機能の実装

試してみよう

インストール

# Homebrew (推奨)
brew install kyotalab/tools/hawk

# Cargo
cargo install hawk-data

# バージョン確認
hawk --version  # hawk 0.2.0

クイックスタート

# サンプルログデータを作成してすぐに試せる
cat << 'EOF' > sample.log
2024-01-15 09:00:01 INFO Application started
2024-01-15 09:01:23 ERROR Connection failed
2024-01-15 09:02:45 WARN High memory usage
EOF

# エラーログの抽出
hawk '. | select(. | contains("ERROR"))' sample.log

# 結果: 2024-01-15 09:01:23 ERROR Connection failed

# JSONデータでも試してみる
cat << 'EOF' | hawk '.users[] | select(.age > 25)'
{
  "users": [
    {"name": "Alice", "age": 30},
    {"name": "Bob", "age": 25}
  ]
}
EOF

おわりに

hawk v0.2.0は、「pandas風の操作感をCLIでより忠実に再現したい」という個人的な探求心から生まれました。特に:

  • 直感的な操作: pandasユーザーが迷わない関数名と動作
  • 統一インターフェース: データ形式を意識しない処理
  • 実用性重視: 日常業務で実際に使える機能

前回記事での皆様の反響が、開発継続の大きなモチベーションになりました。

引き続き、日常の業務を少しでも楽にするツールとして育てていきたいと思います。

ぜひv0.2.0を試してみて、感想やフィードバックをお聞かせください!


📝 v0.2.0で追加された機能、どれか気になるものはありましたか?
💖 この記事が役に立ちましたら、いいねをお願いします

Discussion