まさかの日記

最近まともな文章しか書けなくなってきました

カテゴリ:技術系もろもろ > プログラミング

年末ごろ適当に本を買って積んでいたものをざっと読んだ(どこを読むかを決めた)のでここでざっと書いておく




因果推論の基礎をかじろうと思って買った。後で気づいたけどkindle unlimitedでも読める。

後半でTransformerでどうの、、というのがあったのでこれを買ったのだけど、そもそものところからちゃんと理解しないと意味がなさそう。なので最初から読んでいく。




10章あたりの、MCPサーバの作り方のところだけ読もうかなとと
この方の他の本も良さそう。



ClaudeCodeをちゃんとつかう(並列とかチケットで)ために買った。ガイド的に手元においておく感じ。



カスタマーサポートをAWSで作る、みたいなところを参考にしようと思って買った。
あとGraphRAG、StructuredRAGについてもちょっと書いてある

(追記)カスタマサポートのところは、下記を見れば良さそう?

sample-practical-generative-ai-on-aws-book/ch05_ai_agent at main ・ aws-samples/sample-practical-generative-ai-on-aws-book ・ GitHub
https://github.com/aws-samples/sample-practical-generative-ai-on-aws-book/tree/main/ch05_ai_agent





4章のヘルプデスク、8章の評価、というあたりを読もうと思って買った。



3章、4章あたり、ローカルでTransformer動かしたりファインチューニングしたりとか、結構ちゃんとした内容の本。
ここに書いたもののなかで、これが唯一Kindle版が無い。




langchain系でやるならいるだろうなと思ったけど、今時点ではあんまり読まないかも。
7章にフィードバックの話がある。

この記事はClaude Code(AI アシスタント)が作成しています。

はじめに

Claude Codeを使い始めてしばらく経ちますが、今日ついに「カスタムスラッシュコマンド」機能を本格的に活用し始めました。これが想像以上に便利で、作業効率が劇的に向上したので、その魅力をお伝えしたいと思います。

カスタムスラッシュコマンドとは?

カスタムスラッシュコマンドは、よく使う複雑な処理や一連の作業を、短いコマンド一つで実行できるようにする機能です。/ で始まるコマンドを入力するだけで、事前に定義した処理が自動実行されます。

従来の方法

「Feedlyの記事を取得して、AIで判定して、HTMLを生成して、
サーバーにアップロードして、各SNSに投稿して...」

スラッシュコマンドなら

/mfeedlynews
たったこれだけ!

私が作成したコマンド体系

すべてのコマンドに /m プレフィックスをつけることで、自分専用のコマンド群として整理しました。

コマンド設計のポイント

1. 統一されたプレフィックス: /m で始まることで、自分のコマンドだとすぐ分かる 2. シンプルな命名: ハイフンを使わず、覚えやすい名前に 3. 直感的な動作: コマンド名から何をするか想像できる

実際の活用シーン

日次ルーティンの自動化

毎日行う定型作業が、コマンド一つで完了します。複数のスクリプトを順番に実行したり、APIを叩いたり、結果を整形したり...という一連の流れが自動化されています。

コンテンツ生成の効率化

ブログ記事の作成から投稿まで、従来は複数のステップが必要でしたが、今では一つのコマンドで完結します。

情報検索の高速化

大量のログファイルから必要な情報を探すのも、専用コマンドで瞬時に実行できます。

技術的な仕組み

カスタムスラッシュコマンドは、以下のディレクトリ構造で管理されています:
~/.config/claude/slash_commands/
├── mfeedlynews.md
├── mblogpost.md
├── mvoice.md
└── ... (その他のコマンド)
.mdファイルには、そのコマンドが実行すべき処理の詳細が記述されています。Claude Codeはこれらのファイルを読み込んで、指定された処理を実行します。

カスタムスラッシュコマンドの魅力

1. 圧倒的な時短

複雑な指示を毎回入力する必要がなく、短いコマンドで済むため、作業時間が大幅に削減されます。

2. ミスの削減

決まった手順が自動化されるため、手動操作によるミスがなくなります。

3. 認知負荷の軽減

「あの処理どうやるんだっけ?」と考える必要がなく、コマンドを覚えるだけで済みます。

4. カスタマイズ性

自分の作業スタイルに合わせて、自由にコマンドを作成・編集できます。

導入のコツ

1. よく使う処理から始める: 日常的に行う作業をコマンド化 2. 命名規則を決める: 統一感のある名前付けで覚えやすく 3. ドキュメント化: READMEを作成してコマンド一覧を管理 4. 段階的に拡張: 少しずつコマンドを増やしていく

まとめ

カスタムスラッシュコマンドは、Claude Codeの真の力を引き出す機能だと感じています。日々の繰り返し作業から解放され、より創造的な活動に時間を使えるようになりました。 「あれやって」の一言で済む世界。それがカスタムスラッシュコマンドの世界です。 もしClaude Codeを使っているけどまだカスタムスラッシュコマンドを活用していない方がいたら、ぜひ試してみてください。きっと作業効率が劇的に向上するはずです! --- Generated by Claude Code 技術記録 2025年7月30日

この記事はClaude Code(AI アシスタント)が作成しています。

はじめに

本日は、既存のFeedly AIニュースピックアップシステムを拡張し、外部Webサイトとの連携機能を実装しました。この記事では、実装した機能と技術的なポイントについて記録します。

実装概要

背景と課題

これまでFeedlyから取得した記事は、各プラットフォーム(Mastodon、Discord、ChatWork)に個別記事として投稿していました。しかし、以下の課題がありました:
  • Mastodonの文字数制限による情報の省略
  • プラットフォーム間での投稿内容の重複
  • 会社関連チャットでの外部サイトURL表示の懸念

解決方針

外部Webサイトを活用したハイブリッド配信システムを構築しました:

1. HTMLニュースサイト生成: 記事をレスポンシブWebサイトとして生成 2. 自動アップロード: SCP経由での外部サーバーへの自動デプロイ 3. 投稿方法の分離: プラットフォームごとに最適化された投稿方法

技術実装

HTMLニュースジェネレーター

レスポンシブデザインのHTMLニュースページを生成

def generate_html_news(picked_articles, output_dir="/tmp"): # モダンなCSSフレームワークを使用 # ホバーエフェクト、モバイル対応を実装
特徴:
  • レスポンシブデザイン(モバイル・デスクトップ対応)
  • ホバーエフェクト付きの記事カード
  • スコア表示による視覚的な優先度表現
  • 日本語フォント最適化

SCP自動アップロード機能

def upload_to_external_server(html_file):
    # SSH鍵認証によるセキュアなファイル転送
    # パーミッション設定とエラーハンドリング
セキュリティ考慮事項:
  • SSH鍵ベース認証(パスワードレス)
  • 専用ユーザーアカウントによる権限分離
  • アップロード先ディレクトリの制限

Webサーバー設定

nginx設定により、アップロードしたHTMLファイルを適切に配信:
location /feedly/ {
    alias /path/to/feedly/;
    autoindex on;
    expires 1h;
}

配信システムの改善

プラットフォーム別最適化

1. Mastodon・Discord: - WebサイトURLのみの簡潔な投稿 - 文字数制限を気にせず済む

2. ChatWork(会社用): - 従来どおりの詳細記事投稿 - 外部サイトURLは含めない(セキュリティ配慮)

処理フロー

記事取得 → AI判定 → HTML生成 → 外部アップロード → URL投稿(Mastodon/Discord)
                                              ↓
                                        詳細投稿(ChatWork)

技術的なポイント

URLリンク化機能

記事内のプレーンURLを自動的にクリック可能なリンクに変換:

RFC3986準拠のURL検出パターン

url_pattern = r'(https?://[a-zA-Z0-9\-._~:/?#\[\]@!$&\'()*+,;=%]+)' html = re.sub(pattern, r'\1', html)

エラーハンドリング

  • ネットワーク接続エラーの適切な処理
  • ファイルアップロード失敗時のフォールバック
  • SSH接続タイムアウト対策

今後の展望

機能拡張案

  • アーカイブ機能: 過去のニュースページへのナビゲーション
  • 検索機能: キーワードベースの記事検索
  • RSS配信: 生成したニュースのRSSフィード提供
  • 統計表示: アクセス数や人気記事の可視化

運用改善

  • 定期実行: cron設定による自動実行
  • 監視機能: アップロード失敗の通知システム
  • バックアップ: 生成ファイルの自動バックアップ

まとめ

本日の実装により、Feedlyニュースシステムが大幅に進化しました:

  • ユーザー体験の向上: レスポンシブなWebページでの記事閲覧
  • 配信効率の改善: プラットフォーム別の最適化された投稿
  • セキュリティ配慮: 会社チャットでの外部URL非表示
  • 運用の自動化: ワンクリックでの記事生成からWeb公開まで

この実装により、情報収集・配信のワークフローがより効率的かつ柔軟になりました。今後も継続的な改善を行い、より良いニュース配信システムを目指していきます。

---

Generated by Claude Code 技術記録 2025年7月30日

はじめに

(本記事はclaude codeによる投稿です)

情報収集の自動化って、結局のところ「自分が何に興味を持つか」をシステムに教え込むことなんですよね。 これまで私は、FeedlyとInstapaperで日々記事をRead LaterやLikeで手動キュレーションしていました。でも、「この蓄積された行動データこそが、最高の学習素材なのでは?」と思い立って、機械学習ベースの記事ピックアップシステムを作ってみました。

従来システムの限界

第1段階:固定ルールベース

最初は「AWS」「AI」「マツダ」みたいなキーワードをハードコーディングして記事を分類していました。
keywords = ["AWS", "Lambda", "マツダ", "CX-5", "ChatGPT"]
if any(keyword in title for keyword in keywords):
    return True

でも、これだと:

  • 新しい関心領域に対応できない
  • 文脈を理解できない(「AWSの障害」も「AWS新機能」も同じ扱い)
  • 関心の変化に追従できない

第2段階:AI判定ベース

そこでClaude 3.5 Sonnetに記事の関心度をスコア化してもらうようにしました。
def judge_article_relevance(article):
    prompt = f"""
    以下の記事がmasakaさんの関心領域に該当するかを0-1で判定してください。
    関心領域:AWS、生成AI、Amazon Connect、マツダ、ポルシェ、声優...
    記事:{article['title']}
    """
    return anthropic_client.complete(prompt)
これで文脈理解は向上しましたが、まだ「人間が定義した関心領域」の枠内でした。

第3段階:学習ベースシステムの誕生

発想の転換

「そもそも私の興味って、Read LaterやLikeした記事の集合体じゃない?」 これが今回のシステムの出発点です。手動キュレーションの履歴を「正解データ」として扱い、そこから特徴量を抽出して新しい記事の関連度を判定する仕組みを作りました。

システム構成

class LearningBasedPicker:
    def collect_learning_data(self):
        # Feedly Read Later記事を取得(200件)
        readlater_articles = self.get_feedly_readlater()
        
        # Instapaper Like記事を取得(25件)  
        instapaper_articles = self.get_instapaper_likes()
        
        return readlater_articles + instapaper_articles
    
    def extract_features(self, learning_data):
        # 日本語形態素解析(SudachiPy)
        tokenized_texts = [self.tokenize_japanese(article) for article in learning_data]
        
        # TF-IDFベクトル化
        vectorizer = TfidfVectorizer(max_features=1000)
        tfidf_matrix = vectorizer.fit_transform(tokenized_texts)
        
        # 重要語を抽出(上位50語)
        return extract_top_features(tfidf_matrix, vectorizer)

学習結果

225件の学習データから抽出された重要特徴語(上位10個):

1. aws (0.046) - AWS関連 2. ai (0.040) - AI関連 3. amazon (0.035) - Amazon関連 4. mcp (0.033) - Model Context Protocol 5. agent (0.032) - エージェント関連 6. claude (0.031) - Claude関連 7. 2025 (0.030) - 最新情報への関心

面白いことに、手動で定義していたキーワードがちゃんと上位に来ていて、さらに「mcp」「agent」など、最近の関心事も自動的に検出されています。

推論フェーズ

新着記事に対して、学習した特徴語との類似度を計算:
def calculate_similarity_score(self, article, features_data):
    # 記事をトークン化
    tokens = self.tokenize_japanese(article['title'] + article['summary'])
    
    # 特徴語との一致度を計算  
    similarity_score = 0.0
    for token in tokens:
        if token in features_data['top_features']:
            similarity_score += features_data['top_features'][token]
    
    # 正規化してスコア化
    return similarity_score / len(tokens) if tokens else 0.0

実運用での成果

ピックアップ精度の向上

従来のルールベースでは見逃していた記事が適切にピックアップされるようになりました。

例えば:

  • 「NotebookLMの新機能」→ 私がAIツールをよく使うことを学習済み
  • 「ランボルギーニ・テメラリオ」→ 車関連の記事への関心を検出
  • 「IIJリングノート」→ 技術系企業への関心を反映

自動進化する仕組み

新しくRead LaterやLikeした記事は自動的に学習データに蓄積され、月1回程度の特徴量再抽出で システムが進化していきます。

学習データ更新

python3 learning_based_ai_picker.py --collect

特徴量再抽出

python3 learning_based_ai_picker.py --features

運用コスト削減

  • チェック記事数:100件 → 5件(95%削減)
  • 精度:関心度の高い記事のみに絞り込み
  • メンテナンス:キーワード更新作業が不要

技術的なポイント

日本語処理の工夫

SudachiPyで形態素解析し、名詞・動詞・形容詞のみを特徴語として採用:
def tokenize_japanese(self, text):
    tokens = []
    for token in self.tokenizer.tokenize(text, self.mode):
        pos = token.part_of_speech()[0]
        if pos in ['名詞', '動詞', '形容詞']:
            tokens.append(token.dictionary_form())
    return ' '.join(tokens)

スケーラビリティの考慮

  • 特徴語数を1000語に制限(計算コスト削減)
  • TF-IDFで重要語のみ抽出(ノイズ除去)
  • JSON形式での特徴量永続化(高速読み込み)

今後の展望

フィードバック学習の実装

ピックアップした記事への反応(クリック、共有、スキップ)も学習データに加えて、より精度の高いシステムに。

マルチモーダル対応

記事の画像や動画コンテンツも分析対象に加えて、より豊富な特徴量を抽出。

コミュニティ学習

他のユーザーの行動データも参考にして、新しい関心領域の発見につなげる。

まとめ

手動キュレーションの蓄積を機械学習で活用することで:

1. 個人化:自分だけの関心パターンを学習 2. 自動進化:新しい行動データで継続的に改善 3. 効率化:情報過多の中から本当に価値のある記事のみを抽出

結果として、「人間が行う質の高い判断」と「機械の高速処理能力」を組み合わせた、理想的な情報収集システムができました。 重要なのは、AIに丸投げするのではなく、人間の行動データを上手く活用してAIを「育てる」アプローチです。あなたも普段の情報収集行動を振り返って、そこから学習できることがあるかもしれませんね。 --- このシステムのソースコードや詳細な実装については、また別の記事で紹介したいと思います。

それでどうこうしたいというのもないけど。

結局その辺を素通りする人生だったので、ちゃんとやっときたいかなと


本屋に行ったらPythonの本ばっかりでビビった
あとpuppeteerの本があったのには驚いた





だなあと

一つ前のやつだと発熱がけっこうすごい ipadで発熱するっていうイメージがあんまりなかったので以外 電池の減りも速い気がする このへん最新のiPad miniだとどうなるか非常に楽しみなところ


黒田さんの本を見ながら、さくらインターネットのクラウドサービスにsshにログインしてdocker起動したりして遊びたいなと


普通に動く。ていうかもう完全にWorkspaces上で生活しているに近い

自分の場合 nickname: Fakeymacs という、Emacsキーバインドの設定集を配ってくださっているもの のままでOK。

なおemacsモードのON/OFFは、 Control + Shift + Space

keyhacのショートカットを shell:startup においておく。

スクロール上下は Control + v / Meta + v


(2021/09/25追記)
ここが参考になるようだ
GitHub - smzht/fakeymacs: Emacs-like key bindings for Keyhac
https://github.com/smzht/fakeymacs

って、思ったけどkeyhacじゃなくてautohotkeyをPythonとかで書けるようなのは無いのかと思ったら普通にある(autohotkey rubyでググるだけ)。
autohotkeyは独自言語っぽいなにかに進化してきたもののようだ。
GUIとかも作れるようだ

これは良い

某アプリのソースもまあまあすぐ動かせた。

dllとかの依存関係とかが若干めんどくさいし、webアプリのホームディレクトリってどこやねん、みたいなハードルは若干あるけど、nokogiri入れようとしてハマる、みたいなのに比べたら全然楽だし。

機械学習とかみてたけど、一周して戻ってきた。react-railsプラスwebsocketでプロト作ってたけど、ポーリングで充分かも。。

みたいな事書いとかないと、自分が何やってたかすぐ忘れるんで。

■GitHub ・ Build software better, together. ▽https://github.com/tokuhirom/avans/blob/master/README.md


■GitHub ・ Build software better, together. ▽https://github.com/tokuhirom/tinyorm/blob/master/README.md


この辺らしい。あと普通にWebAPIとかangularとか。



この辺も読んでからJava8いじり始めるといいらしい


やっぱAPI系は必須として何を選択したらいいんですかね?
と地元の知り合いに聞いてみた結果を共有しときます。

***

バックエンドは当然REST API
実装よりも設計が難しいので要注意
Jersey、Gsonは必須

WEB Viewならspark
http://www.sparkjava.com/

とはいえWEB Viewは不要とのこと。
AngularJS
bootstrap
でシングルページWEBアプリが王道

ORマッパーは、hibernateか、あるいは薄く自作
パフォーマンス重視するなら最終的には必ず自作になる

Seasar、Seasar2系はもう終わり

ちなみにnode.jsよりはvert.xかも

やっぱDockerすごい


(このへんから脱線して開発方法論の話)


社内でメールは不要
チャットから拾ってチケット管理に登録
なので全チーム共通でのチケット管理ツールは必要

ていうか開発方法論も見積もり手法ももはやどうでもいい
作る人で百倍以上違うのに見積もりしても意味が無い
できない奴は一生出来ないし、できるやつなら一日で作れる

進捗何%ですか?は無意味
あと何日で終わるか?だけが重要
もし無理そうならほかの人に変わってもらうだけ

9時過ぎて会社に残ってる人がいたら、困ってたりハマってたりしていないかを上司がチェックする
毎日10時過ぎまで会社に居るのは何かが起きているというアラート
単にこだわってるならOK、困ってて何日も進んでないなら担当を変更する
問題が起きたら出来る人のチームで対応する。


UIは、このUIが最適である、というのをデザインチームが決める。
それを元にエンジニアチームが実装する
リリースはエンジニアチームの都合で決める(延期する)


そもそも管理も何も必要無い
良いメンバーで、雰囲気良くしていればものすごいパフォーマンスを出せる

アプリの仕様書は不要。
そもそも仕様はテストケースで表現する。中身はどんどん変えてOK

納品しない開発、ソニックガーデン、あれは良い


(a * a ) % c == ( a % c * a ) % c

(a * a * a ) % c == ( (a * a) % c * a) % c

(a * a * a * a ) % c == ( ((a * a) % c * a) % c * a) % c


コレ知らないと厳しい


(a * b ) % c == (( a % c ) * ( b % c ) )% c


一般的にはこういう公式しか出てこないし。

合同式とか意味判らんし。


アルゴリズムを学ぼう (アスキー書籍)
KADOKAWA / アスキー・メディアワークス
2014-04-10

1)RubyInstaller,msysgit,ckw-modを入れる
2)ckw-modからmsysgit内の bash -l
3)rubyのPATHを追加

これでだいたい行けるはず。

ckw-modの文字サイズ調整はckw.cfgってファイルを修正すればOK。

msysgitにはssh-keygenも入ってるのでそのへんも大丈夫なはず(未検証)

lsの出力の色が見づらいなら alias ls="ls --color=none"

出力は基本UTF-8なので、nkf32 -s でSJISに変換するとか多用しそう(EXCEL用にCSV出力とか)


その他は下記サイトが参考になる。

■msysgit で日本語を使いたい - Qiita ▽http://qiita.com/kumazo@github/items/2169e1ee7be278f82b94 ””


http://d.hatena.ne.jp/mirakui/20100502/1272849327


の通りですが、この手順をやらないといけなかったのでメモ。


RUBY - RVM doesn't work for 1.9.1 but works for 1.8.6 and 1.8.7 - efreedom http://efreedom.com/Question/1-2910507/RVM-Work-191-Works-186-187


readlineを入れなおしたり、
エラーになるdylibファイルを消したりとか、このへんとか

rvm install 1.9.1 -C --with-readline-dir=$HOME/.rvm/usr


出てたエラーはこのへん


ld: in /usr/local/lib/libsqlite3.dylib, file was built for i386 which is not the architecture being linked (x86_64)


これも出てた。

readline.c: In function ‘username_completion_proc_call’:




efreedomってサイトは最近よく出てくるけど自動翻訳で却って分かりにくい。
URL先頭のja.を外すとオリジナルの英語表示に戻ります。


謎アプリをエンドユーザに近いところに軽く見せたところ、やっぱリアルタイムチャットを必要としているということではないらしい。

まあ予想の範囲内ですが。



ポートの話もあるし、個別アプリにしちゃうとアップデート地獄に堕ちるので、ここはリアルタイム系はすっぱり諦めてperiodicalにexecuteすることにする。

ユーザ数1000人くらいまでなら大丈夫かと。
読み出し処理メインなので負荷分散もしやすいし(杞憂




以下メモ。

・GAEでPusherを使わずにComet出来るようになったらしい。Channel APIってのを使うらしい。

GAEのChannel APIでリアルタイムWebアプリ - ニノ日記
http://d.hatena.ne.jp/ninoseki/20101205/1291519323

#appengine でComet! Channel APIでpushできるぞ - スティルハウスの書庫
http://d.hatena.ne.jp/kazunori_279/20100528/1275039829

・あんまり関係ないけど。

[ruby][sinatra] Sinatraのハンドラ内でem-http-requestを使う - daily gimite
http://d.hatena.ne.jp/Gimite/20101017/1287298216


こういう話ってのが地味に大事だと思うんだけどその大事さを継承できていないなあという気がする昨今ですが、まあそれはそれでよかろうと。


・というわけで当面はAjaxベースで充分かと。せっかくなのでJQueryベースに移行したいところ。

無題メモランダム: Ruby on Rails + jQuery + Ajax で動的にページの一部を更新する
http://blog.mudaimemo.com/2008/08/ruby-on-raisl-jquery-ajax.html

dequeue() - jQuery 日本語リファレンス
http://semooh.jp/jquery/api/effects/dequeue/_/



・とか言いつつ、当面Websocket関連はwatchするつもり。

9、10、11月の成果と12月の目標 - makotoiの日記:from London
http://d.hatena.ne.jp/makotoi/20101129

WebSocketで目指せ“リアルタイムWeb”! - @IT
http://www.atmarkit.co.jp/fcoding/articles/websocket/01/websocket01a.html

em-websocket でチャットとか|Sweets Programming Memo
http://ameblo.jp/i18n/entry-10545104040.html


を作ろうとしていたりしていて、アプリ部分(railsとか)とリアルタイム処理部分(cometベース、もしくはwebsocket)との振り分けをなんとかできないか。

つまり80番ポート1つですべて動かす、ってことができないかを調べてたのでその現時点での自分用メモ。



ていうか、ポート2つ使うものであればshooting_starベースで一応ひと通り動く状態にはなってるんだけど、ポート2つ使っちゃってるから、SSL化できないというのが今の課題。



できるだけ有りモノですまそうとした場合、方法としては2つ。


■nginx用のプラグインで振り分ける
 ⇒リアルタイム処理の部分が独自実装になっていて?悩ましい。
  これからはやっぱwebsocketだろ、という気もしつつ。


■haproxyで、websocketのリクエストを振り分ける
 ⇒これが出来ればこっちで行くんだが、とりあえず動かない。。。
  こっちが本命かなという気もしつつ、websocketの仕様がまだまだ固まらないという話を聞くと実戦投入はまだ先かなとか。。
  そういう意味ではcometはある意味枯れてるよねという話も。




でよくよく考えると、

・URLベースでnginxとかでリバースプロキシすれば1ポートで出来るんじゃないの?
 ⇒これはすんなりとは行かないと思われる。
  例のshooting_starベースだと、チャットでの発言を受けてlong_poll中のセッションにレスポンスを返す部分が一つのコントローラになっていて、これを分離するのが面倒。

・1つのポートですべて完結させたいっていうののそもそもの目的はHTTPSベースにしたい、ってことなんだけどそれって出来るの?
 ⇒websocketにはsslは実装されてるっぽい。。
  cometベースでのlong poll がsslでも大丈夫なのか、ちょっと怪しい気が。keepaliveみたいなこともできなかった気が。(それを解決するのがwebsocketのssl通信ということかと)


というわけで、結局lingrと同様にeventmachineベースで半分自作みたいなcometサーバを作って、リバースプロキシで内部振り分け、っていうのが一番現実的かも。つかもう何年も前にそれできちゃってるlingrはすごすぎる。



まああとリアルタイムチャットにどこまでこだわるか、ってのはあるんだけど。エンタープライズ用途だったらperiodicalExecuteとかで充分な気も。



<参考URL>


Emerge Technology: WebSocketでChatを作ってみた http://blog.liris.org/2009/12/websocketchat.html

go言語によるwebsocketチャットの実装。
以下もそれ系。
簡単なものはすぐできるけど、認証の仕組みとか複数のチャット部屋に分けたりするのはどうしたらいいのか全くわからん。。。。


websocketで遊んでみた - IT素人がIT機器を弄ったり妄想したりする日記 http://d.hatena.ne.jp/the48/20100627/1277646213

WebSocketとWebWorkerを使ってみました - html5-developers-jp | Google グループ https://groups.google.com/group/html5-developers-jp/browse_thread/thread/e82f0d3d0353cfb0?hl=ja
EventMachineとWebSocketでリアルタイムwebアプリを作る: Kwappa開発室 http://kwappa.txt-nifty.com/blog/2010/11/eventmachineweb.html


eventmachineベースのruby用のいろんなgem。em-websocketとem-websocket-serverは違いがよくわからん。。とりあえずem-websocketベースのものが手元では動いている。

igrigorik's em-websocket at master - GitHub https://github.com/igrigorik/em-websocket https://github.com/igrigorik/em-websocket.git

dansimpson's em-websocket-server at master - GitHub https://github.com/dansimpson/em-websocket-server


これは単にProxy。リバースプロキシっぽい使い方が出来るものかと思って期待したんだけど違ったっぽい。
mcolyer's em-websocket-proxy at master - GitHub https://github.com/mcolyer/em-websocket-proxy



Stompってのがあるっぽい。詳細不明。
Matt Colyer » WebSockets & Stomp, the Real Realtime Web http://matt.colyer.name/2010/07/18/websockets-stomp-the-real-realtime-web/


Crampってやつとか。

has_many :bugs, :through => :rails http://m.onkey.org/websockets-made-easy-with-cramp

akitaonrails's cramp_chat_demo at master - GitHub https://github.com/akitaonrails/cramp_chat_demo


この人の記事はひと通り読む価値あり。

Ruby & WebSockets: TCP for the Browser - igvita.com http://www.igvita.com/2009/12/22/ruby-websockets-tcp-for-the-browser/


Ruby & WebSockets: TCP for the Browser | Rails Fire http://www.railsfire.com/article/ruby-websockets-tcp-browser

Nginx & Comet: Low Latency Server Push - igvita.com http://www.igvita.com/2009/10/21/nginx-comet-low-latency-server-push/ em-http




後半がよくわからん。。勉強になりそうな予感。

Websockets and Ruby EventMachine http://www.slideshare.net/ismasan/websockets-and-ruby-eventmachine


これを読んでhaproxyをひと通り調べた

RUBY ON RAILS - Can nginx be used as a reverse proxy for a backend websocket server? - efreedom http://efreedom.com/Question/1-2419346/Can-Nginx-Used-Reverse-Proxy-Backend-Websocket-Server

http://haproxy.1wt.eu/#docs

Re: HAProxy is incompatible with WebSocket protocol revision 76? http://www.mail-archive.com/haproxy@formilux.org/msg03047.html


その他

WebSocket | どうも。わたすがダニーです。 http://daniels-lab.jugem.jp/?cid=5


ポートの話とか。
WebSocketsの実験(未完) - Note ON http://veritas-vos-liberabit.com/note_on/2010/06/websockets.html



後半でなぜかJavaアプリのアプリ化みたいな話がやたら詳しく書いてあったり。

Jettyで始めるWebSocket超入門:第6回 アプリケーションの作成と配布物の生成|gihyo.jp … 技術評論社 http://gihyo.jp/dev/feature/01/websocket/0006



twitterのストリーミングAPIをいじる系

lib/tss_em_web_socket_server.rb at master from gimite's tweet-search-stream - GitHub https://github.com/gimite/tweet-search-stream/blob/master/lib/tss_em_web_socket_server.rb

[tss][ruby] Tweet Search Streamの実装をem-websocketとem-http-requestに - daily gimite http://d.hatena.ne.jp/Gimite/20101011/1286764612


ruby1.9.1での何かのサンプル

Using the em-http gem with WebSockets - SWiK http://swik.net/Ruby/Code+Snippets%3A+ruby/Using+the+em-http+gem+with+WebSockets/ecyzt







知らなかった

Scala座#01で「これまでのScala これからのScala」という発表をしたんだぜ - ゆろよろ日記
帰りの新幹線で、Scalatra + ScalateをGAEに載せようとしてうまくいかなくて、Scalatra-scalate-supportの実装がイケてないっぽなんで今度自分でソース直してビルドして試してみます。うまくいったらエントリ書きます。



 # ところで、この方のスライドのP.10に先日のエントリで書いたようなJavaVM上でScalaを動かすってつまりどういうこと?みたいな話が書いてあるので興味がある人は見てみるといいと思うよ



Scalateってのはテンプレートエンジン。カテゴリとしてはJavaで言えばJSPみたいなものと思ってればいいんじゃ?

Templateってのと名前的に掛けてある。


Playframework で Scalate を使ってみる - 写経日記
Scalate
Scala Template Engine: like HAML or JSP without the crap but with added Scala coolness
HAML か くそな部分がない JSP に Scala のいいところを足したテンプレートエンジン
erb に似たのが ssp
haml に似たのが scaml
どちらかを conf/application.conf で指定する
ssp, scaml ともに豊富なサンプル
現在 (20100710) play-1.1-unstable-r881, scalate-0.3,scala-0.3 までしかテストされてないということだけど、play-1.1-unstable-r942, scalate-0.3,scala-0.6 の組み合わせで問題なし。
app/views/default.scaml があって、そこで index.scaml を呼んでなくても、index.scaml のファイルがない場合、画面には何も描画されない(真っ白いまま)。普通はエラー(Template not found)が表示される
一通り機能がそろっていて、問題なく使えそうな感じ。
JAXRS with Jersey とかはよく分かってない。






ruby用のWEBアプリフレームワークのSinatraってのがあるんだけど、それのScala用なのがScalatraらしい。

Scalatra | A tiny, Sinatra-like web framework for Scala
Since its origin on Gabriele Renzi's blog, this project has been known as Step. Unfortunately, we later discovered that name was already taken. Per Hiram Chirino's suggestion, we have decided to rename the project to Scalatra. Scala + Sinatra = Scalatra.



日本語の記事も沢山あるので適当に検索して試してみるといいかもよ




でも環境をつくらないといけないからちょっと手間が多いかも。

なので、Javaの環境がすでにあるなら、Playとか少しいじればいいんじゃないかと。

Javaで軽快に使える「軽量フレームワーク」特集 〜本格的なRoRスタイルフレームワーク「Play!」(1)(1/7):CodeZine
今やWebのフレームワークと言えば、そのほとんどが「RoRタイプ」です。RoR(Ruby on Rails)がWebの開発に与えた影響は非常に大きく、その後生まれたフレームワークの多くがその影響を受けています。

 しかし、Javaの世界に関しては、RoRはなぜか素通りしてしまいました。既にStrutsというデファクトスタンダードがあったために新しいMVCフレームワークが割り込む余地があまりなかったのか、あるいはLL(ライトウェイト)言語でないとRoRなスタイルは作りにくかったのか。ともあれ、その後、長い間、Javaでは「いわゆるRoRタイプ」と言えるフレームワークは登場しませんでした。

 その流れを変えたのは、Groovyです。Groovyの登場により、JavaでもLL言語のような小回りの聞くコーディングが可能となりました。そのおかげで、ようやくJavaの世界にも遅まきながら新しい世代のフレームワークが登場するようになりました。その1つが、今回取り上げる「Play!」です。





PythonのDjangoの方から来たみたいですね

hikozaemonchan: Hello, Play framework
Play frameworkを使ったことがある人はどれぐらいいるんだろうか。
こんなに面白いフレームワークとは思わなかった。
いや、フレームワークというより、プラットフォームです。

まえにJava on Railsなんて宣伝を見てしまったせいでスルーしていた。
たしかに「Rails使いに媚びてDjangoをJavaにポートした」と言えないこともないけど。
ためしてから宣伝してください。迷惑です。
見所はコマンドラインなんかじゃない。まあ、Python for Windowsがついてくるのは確かに面白いけど。
なんといってもJavaの使い方が革命的に面白い。









まあ文系のIT未経験新卒が「なんとかコンサルティング」っていうITコンサルの会社に就職して、ITシステムの要件定義・設計構築技術を身につけようというような場合には、まずボキャブラリが少なすぎて理解が追いつかない、というようなことは確かにありえるかな(こないだの宴会でもそういう話あったけど)



この場合の最悪シナリオとしては:


ボキャブラリが足りなくて何の話をしているのか判らない

話の内容が理解できなくて面白くない、興味が湧かない

「自分はそういうものには興味が無いタイプの人間です」と自分自身で定義する

スパイラルへ




短期的にはこのへんの話題についてクチプロレスで負けない程度にはなっておくといいかも。自分としてもそういう話が出来る相手が増えるのはありがたいというか、嬉しいし

ここは単に知識の有る無しの話だから結構簡単な話かも(仮面ライダーの悪役の名前を覚えるのと同じレベル


具体的にはWEB+DB PRESSの過去1年分くらいをざっと読むとかw




あと、勉強日記的なBlogを自分で書くのもいいんじゃないかなと。これは地味に効くと思う。
で、書いたら「書きました」的につぶやくという




WEB+DB PRESS Vol.58WEB+DB PRESS Vol.58
著者:編
販売元:技術評論社
発売日:2010-08-24
クチコミを見る



全然2.0対応じゃないなあ〜



といちいち調べながらやってたんですが



Rails 2.0 で『AWDR 第2版』をやる方法 - minorio のプログラミング・メモ
scaffolding と classic_pagination および will_pagination の3つのプラグインを入れると本の通りに実行できるようになるらしい。




なに〜






i18nとか便利(な気がする。他を知らないので)



なので、基本は2.x系で行きます。。







RailsによるアジャイルWebアプリケーション開発 第2版RailsによるアジャイルWebアプリケーション開発 第2版
著者:Dave Thomas
販売元:オーム社
発売日:2007-10-26
おすすめ度:5.0
クチコミを見る


おもむろにこれを読んでいる。
JavaになってからのFoundationはWOの仕事(これを称してヲ仕事、ってのはどうだろ)で使ってたので、Obj-Cのコードもなんとなく見覚えがある感じ。とりあえずsuper呼んどけみたいなあたりとか。

Objective‐C―MacOS Xプログラミング入門 (MacOS Xプログラミング入門)




ホントはこれを買おうと思ったんだけど、上の本が家にあったから、とりあえず一通り読んでからにしようかと。だってこれ高いし。

詳解 Objective-C 2.0





こんなのもあるんだ。これは持ってない。

Objective-C Mac OS Xプログラミング





なぜかこれも頭から全部読もうかとか思ってたり。

ロベールのC++入門講座

これはすごい
WebObjectsのDirect2Webを思い出した(あれはJavaアプレットだけど)

あと、この継続って、WOでもバックトラック(ブラウザで戻るボタンが押されたかどうかを検出する仕組み)は有りますよね。


SeasideへGO!!(第1回)
4.5 コードブラウザ
今度は一番右のアイコンをクリックしてみます。
図 20: コードブラウザの起動
Web ブラウザの中に、Smalltalk のコードブラウザが出現します。

twitterでタイプミスで@が来たので知ったemasaka氏。
bash on Railsの人。

本を読む 「プログラミングGauche」
Lisp初学者のための入門書ではなく、網羅的なリファレンスでもなく、学術書でもなく、まさにPractical SchemeであるGaucheを使ってプログラミングする方法についての手引きになっている。最初からgoshとEmacsを組み合わせた開発環境の説明をみっちりやっているし。文法要素をサンプルを作りながら説明していくうちに、説明した各サンプルが継続渡しによるWebアプリケーションに集結するところはちょっとした感動ものだった。


ていうか全然読めてない>自分




Ruby日記なのになぜかLisp日記になっている。。一瞬Rubyで継続とかマクロとかそういう話かと思った。
自分はマクロあたりで大体挫折しているので、このあたりから読み返そう。

マクロ(1) - バリケンのRuby日記 - Rubyist
今日は、マクロについて勉強するよ。




関連記事:
まさかの日記:[Gauche]Windows+Cygwin+Meadow+Gauche


メモリも増えたことだし、MacOSX上でこの件を調べようと一通り環境作ったら、何げにその機能自体なくなっている。。。。

というわけでこの件は終了。

しかも「問題」が「チケット」とかに変わってるし。
まあ文言はどうせ自分で全部書き換えてるから関係無いけど。



"問題"の注記を追加した際、一覧の更新日が変更されない。。 -
Redmine Users (japanese) | Google グループ
色々試している中で、"問題"を新規追加した後、”注記"追加のみを行った際、どうも一覧の更新日が「注記追加」した日時に更新がされなく困っております

行ってきた。
ゴング楽しかった。

帰りがけにお手洗いに行ったら和田さんが居て、川合さんのサイン貰える事を教えてもらい、つい貰ってしまった(ミーハー
川合さんの実物はイメージとだいぶ違ったな。

あと、アップルの営業の人の新しい名刺貰った。



ログ記事はまだチェックしてないけど、これ↓は興味深いね。

[event][scheme] 第2回gauche.nightログ おまけつき - Greenbear Diary (2008-03-09)
shiroさん語録.




本も買ったけど、マルチスレッド系の記述は無い。ソケット系はあるけど。簡易WEBサーバを作ってみよう的な記事はあるけど、これはシングルスレッドだったり。まあKahuaのソース読めってことで。

プログラミングGauche



それにしても毎回頓挫するLisp勉強。またやるか。

おもむろに


M.Hiroi's Home Page / Common Lisp Programming
Windows でも動作する処理系に CLISP があります。


おもむろにCLISPをダウンロード。



昨日、積んである本をほじくり返していたらANSI Common Lispが出てきたから。

ANSI Common Lisp (スタンダードテキスト)


以前読んでたときも、まだ半分しか読んでない。

#半分に千切って読むなどしており、半分まで読んだところで放り出したことが記憶に新しい


たしか、継続に入りかけたところまでかな。
継続とマクロは理解したいところ。

土曜日に向けて、唐突に復習開始。間に合うか??

というわけでこの本をほじくり出してきた。

Ruby on Rails入門―優しいRailsの育て方



[Project]/config/routes.rbが最初の動作を定義しているファイルとのこと。

Redmineで言えば、

map.home '', :controller => 'welcome'
map.signin 'login', :controller => 'account', :action => 'login'
map.signout 'logout', :controller => 'account', :action => 'logout'
:
:


こんな感じ。

例えば、最初のページ「http://localhost:3000/」は、welcome_controller.rbに処理が渡される。

welcome_controller.rbの内容は以下の通り。
このへんに適当にブレイクポイントを指定してあげてデバッガ開始すると、おお止まった止まった。

class WelcomeController < ApplicationController
layout 'base'

def index
@news = News.latest User.current
@projects = Project.latest User.current
end
end



次は、こないだうちのRoRマスター某氏に頼んで調べてもらったことを自分でも調べてみる予定。

なんかありがちBlog的なタイトルだ。w


Ruby on Railなバグトラッカ(?)、RedmineベースにSFAシステムを作ることにした。
実は社内では割とそれなりに使っていたり>Redmine

ソースをそれなりに読んでおこうと思い。
IDEでは最近のお勧めはNetbeansだと某氏が言うので、

NetBeans IDE 6.0.1 Download

「Ruby入り」をダウンロード。



と思ったらJDKが入っていないので、ここからダウンロード。

Java SE Downloads


Redmineのソースを取得するためにWin32版Subversionをげっと

subversion: Documents & files: Windows


Redmineのソースを取得。


cd \
mkdir proj
cd proj
svn co http://redmine.rubyforge.org/svn/trunk redmine



でとりあえずNetBeansで新規プロジェクト作成>上記フォルダ指定でそれっぽく開けたんだけど、rakeタスクの実行方法がわからん。。

redmineって書いてあるところから右クリック>Rakeタスクの実行>db>migarteって普通に実行したときは、DEVかPRODのどっちかが動いていると思うので、database.ymlの当該箇所をSQLite3を使うように書き換えた(WindowsへのMySQLのインストールとか面倒すぎてありえん。。)



だがJRubyからSQLite3ってどうやって使うのか?JDBCドライバがありそうだが。よくわからん。

(悩むこと5秒)

というわけでJRubyをあきらめてRuby(Win32)をインストール。

手順はこちらを参考にした。

www.be-styles.jp - Windows + ruby + sqlite3 にRailsを入れるためのメモ

SQLite3も必須なので入れておくこと。


というわけで、とりあえずGUIからのrake db:migate&起動成功。

RoRの基本動作を忘れてしまってソースの見方が全くわからないので、積んであるRoR本のうち初心者向けっぽいやつ(動作原理が書いてありそうなやつ)を探して持ってくる。

いろいろ試したけど、ただ単純に<CODE>で囲めばいいみたい

下記でいうと、
<CODE>BEGIN {
となっている。

ちなみに
<CODE>
BEGIN {
とやると、最初に改行が入ってしまう。

BEGIN {
print "Hello, world!"
}



あと、CODEタグ内で半角空白を表示させるのはCSSで可能。
これ知らなかった。。。

シェルスクリプトとかsedとかでテキストファイル編集をやるときは結構こういう発想してます。

私自身は全然Lisperではないですが(そんな畏れ多い

Karetta|Gaucheプログラミング|「Lisp脳」の謎に迫る - Schemeプログラマの発想
「とりあえず1から100までのリストを作れば良さそうだ」



もっと前からLisp勉強しておけばよかったなあ。。。
まあ地道にがんばります

今朝、
そんなテーマのミーティングが都内某所で行われ、
まあ今ならやっぱ、
RoRかなという結論が出ました。


■言語は?

Ruby。



■フレームワークは?

RoR。



Java系のものは沢山あるけど、
”終わってる”ものが多い。

新しい良いモノも有るけど、
決定打に欠ける。





という感じです。

まあもちろん、
色々な制約や環境の中での判断になるので
一概には言えないですが。



あと、
RoRを使ってAjaxっぽいアプリを作れば
プロモーションになるかも?

(WEB2.0対応です、みたいな広告を、こないだどっかの雑誌で見て感動しましたが)


という時期は、
やっぱりもう過ぎたみたいです。



まあアピールとしては、

 RoR普通に使っています

という程度かと。

マイナスではなくゼロです、というアピールかと。




あと例えば

 弊社はJavaに特化してやっています、

というのと、

 弊社は言語は単なるツールだと考えていますので、特にこだわらず何でもやっています。最近はRubyとかですかね。

という言い方の、どちらがアピールになるか?



それはアピールしたい対象にもよるでしょうね。





それと、

言語やフレームワークの選択というのは、
要するに、
会社として技術の方向性をどうするのか?

という話なので。
技術的な要因だけで判断できない。




あと、ありがちな、

 RoRでやるって言い出したの君なんだから、最後まで責任もってやってよね

という丸投げは、
厳しい、とかいう話(ちょっと笑える



これはいわゆる、後ろから撃たれる系ですね。
あるいは補給路を絶たれる、というか。


つまりこういう判断っていうのは
イチ技術者の判断ではなく
会社全体の判断であり
全社的にそれをサポートする必要があり
なんとかで、かんとかで
みたいな





(上記内容は実在するもろもろと一切無関係です)





追記。

弊社では、Common Lisp以外はプログラミング言語ではないと考えておりますので、特にこだわりは有りません。

とか言うと格好良いですね。

継続はすごいなあ。

感動した。

なんでも継続
アプリケーションは 継続をクロージャにラップしてセッションIDをキーとするハッシュテーブルに 登録しておき、httpサーバはユーザーからのフォームのsubmitがあると セッションIDを元に登録された継続を呼び出すのだ。


ちょっと、いろんな物を全部一旦脇においておいて、継続が身に付くまで勉強しようと思います。
まずは半年間は集中しよう。

関数プログラミングとは??

副作用的に生じる変化ではなく、返り値を使って動作するプログラミングのこと。

例えばこんなコードは、返り値を使ったプログラミングであると言えるのでは。


ArrayList list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");


というわけで感覚的には、Lisp等での関数プログラミングは、unixのスクリプトにおいてパイプを繋いで処理を行うことに似ている(ほんとか?)

まあ途中で標準出力に表示してデバッグできたりするところも、関数単位に動作させてテストするところと似ていなくもない。とか言ってみたりして。

なるほど、でもJavaで判りやすいコードを書く、というのはそういうことかも。

判りにくいコードとは、副作用的にどういうことが起きているかを頭の中で想像することを読む人に要求するもの、ということなのかもしれない。

そこそこの経験があるプログラマほど、脳を酷使するコードを書きたがるが、その後経験を積むと、判りやすいコードを書くようになっていく気がする(とか偉そうに言ってみる)



というわけでこの本読んでます。いままでLispとか勉強しようとしては挫折しまくってきた人(自分のことですが)にお勧めです。


ANSI Common Lisp

昨日、巨大な肉の完食後、オアゾ丸善で購入。

ANSI Common Lisp


でつらつら読んでるんですが結構面白い。そろそろ実行環境作るか。。(Haskellは入ってるんだけど)

適当に落としたソースはIntelMacではコンパイルできないようなので、某氏に聞いてみたところportsでやるのが一番楽とのこと。


というわけで、こちらを参考にまずはDarwinPortsをセットアップ。
Mac OS X : Software Install Memo

DarwinPorts自体のインストールはGUIで普通に終了。

あとはこんな感じ

$ which port
/opt/local/bin/port
$ port search clisp
clisp lang/clisp 2.40 The Clisp Common Lisp Implementation
$ sudo port install clisp
Password:
(インストール)
$ clisp
i i i i i i i ooooo o ooooooo ooooo ooooo
I I I I I I I 8 8 8 8 8 o 8 8
I \ `+' / I 8 8 8 8 8 8
\ `-+-' / 8 8 8 ooooo 8oooo
`-__|__-' 8 8 8 8 8
| 8 o 8 8 o 8 8
------+------ ooooo 8oooooo ooo8ooo ooooo 8

Copyright (c) Bruno Haible, Michael Stoll 1992, 1993
Copyright (c) Bruno Haible, Marcus Daniels 1994-1997
Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998
Copyright (c) Bruno Haible, Sam Steingold 1999-2000
Copyright (c) Sam Steingold, Bruno Haible 2001-2006

[1]>



お、起動した。
続きを読む

このページのトップヘ