OSSのトレンドを知りたい

やりたいこと

オープンソース界隈のトレンドが「ハァ~さっぱり、さっぱり」なのでお手軽にさくっと知れないものだろうか?

方針

- どっかから流行っているオープンソースプロジェクトの名前を取ってくる
 →OSDN Magazineのニュースを利用させてもらう
- 頻出するキーワードのリストを作成
 →HTMLから情報を抽出するcheerioというライブラリを利用させてもらう
- ワードクラウドとかお気楽な見た目で表示
 →これまたD3.jsというライブラリを(以下略

結果

それっぽい結果が得られてうれしい😊(よろこびのハードルが低い)

以下で詳細をお話します

使った道具

- Node-RED
  サーバー側でOSDN Newsサイトにアクセスしたり、キーワードのリストを作成したりするためのプログラミング・実行環境です
- cheerio
  取得したHTMLデータから目的のキーワードを抽出するのに便利なライブラリです
- D3.js (Data Driven Documents)
  頻出キーワードのリストからワードクラウドを表示するのに使ったライブラリです
  ※ D3-cloud (d3-v5版) でワードクラウドを作成する を参考にさせていただきました 先人の知恵に感謝です🙏
- OSDN Magazine Newsサイト
  OSS関連の最新ニュースをまとめてくれているサイトです

手順

1.Node-RED

セットアップは以下を参考にしてください

2.cheerio

2.1 インストール

cd ~/.node-red
npm install cheerio

2.2 Node-REDで使うための準備
~/.node-red/settings.json に cheerio:require('cheerio') 追加

// The following property can be used to seed Global Context with predefined
// values. This allows extra node modules to be made available with the
// Function node.
// For example,
//    functionGlobalContext: { os:require('os') }
// can be accessed in a function block as:
//    global.get("os")
functionGlobalContext: {
    // os:require('os'),
    // jfive:require("johnny-five"),
    // j5board:require("johnny-five").Board({repl:false}),
    cheerio:require('cheerio')
},

[翻訳] cheerioとは

"高速で柔軟性に富み、無駄の少ないcore jQuery実装で、特にサーバー向けに設計されています"

特長なじみのあるシンタックス:cheerioはcore JQueryのサブセットを実装しています。cheerioはjQueryライブラリから全ての一貫性のないDOM操作やブラウザのための書き換えを取り除き、真に見事なAPIを明らかにします。
驚異的な速さ:cheerioはとてもシンプルで、一貫したDOMモデルとして機能します。結果としてパース、操作、レンダリングはものすごく効率的です。
驚くほどフレキシブル:cheerioは@FB55によってもたらされたhtmlparser2をラップしています。cheerioはほぼすべてのHTMLやXMLドキュメントをパースできます。

3.フロー作成

3.1 ニュース記事を何ページかローカルに保存
 ※ OSDNサイトに負荷をかけないようにするため
- [page 1-9] : ページ1~9の配列データをトリガーとします
- [split] : メッセージをページごとに分割します
- [gen msg.page_number / url / filename] : ページ番号、対応するURL、対応するHTMLファイル名を決めます
- [OSDNマガジン] : 決めたURLでサイトからHTMLデータを取得します
- [write html file] : HTMLデータをファイルとして保存します

[gen ...]から出ている線を[OSDNマガジン]につないで([read ...]へは一旦切って )デプロイし、実行します

3.2 HTMLファイルをローカルに保存した後のフロー
- [gen msg.page_number / url / filename]
- [read html file] : HTMLファイルを読み込みます
- [extract article] : cheerioを使ってarticle要素から タイトル / 要約 / 日時 / リンク先 を抽出します
- [join] : 各ページごとのarticleをまとめます
- [merge articles] : さらに1つの配列にまとめます
- [extract product_name] : articleのタイトルから「」で括られた部分を抜き出し、さらにプロダクト名(OSSだとプロジェクト名のほうがいい?)を抜き出します
- [make histogram] : 同じプロダクト名を1つにまとめてヒストグラムを作ります
- [json] : オブジェクトの配列をJSON形式の文字列に変換します
- [write json file] : JSONファイルとして保存します

作成したフローはこちらです

4.ワードクラウドの表示

4.1 Webサーバーのホームディレクトリ設定
~/.node-red/settings.json に httpStatic: '/home/pi/[お好きな場所]/', を追加

// When httpAdminRoot is used to move the UI to a different root path, the
// following property can be used to identify a directory of static content
// that should be served at http://localhost:1880/.
//httpStatic: '/home/nol/node-red-static/',
httpStatic: '/home/pi/image/',

/home/pi/image/ は名前としてよろしくないんですが見なかったことに💦

4.2 D3.jsを使ったWebページをホームディレクトリに配置

上記記事にサンプルへのリンクがあり、そちらを使わせていただきました
具体的には、以下で取得したd3-cloudSampleディレクトリ以下をホームディレクトリにコピーします

git clone [サンプル].git

4.3 words.jsonの更新
3.2の[write json file]で保存したJSONファイルで/data/words.jsonを同名で上書きします

4.4 http://192.168.0.x:1880/index.html にアクセス
ワードクラウドが表示されていると思います

やってみての感想

- つい、functionノードにコードをいっぱい書いてしまう
 ノーコード・レスコード → 既存ノードの理解 が大事
- JavaScript / JSON がわからない😭
 配列操作とか特定functionノードに書いたオブジェクト定義の気持ち悪さとか…
- ホームディレクトリにデータソース置いてる…
 クライアントにデータ送るにはどうしたらいいの…
- Node-RED Dashboard のui_templateノードを使いたい
 AngularJSを活用するとかっこいい?(思考停止🤤)
- d3.jsを理解したい
 可視化大事
- Webスクレーピング楽しい
 自分なりの情報整理の手段にしたいですね

いいなと思ったら応援しよう!