ty’s blog

毒を食らわば皿は

Gem 名の命名規則について

Name your gem - RubyGems Guides

ユーザに Gem の読み込み方針を提示するために、↑ の命名規則が推奨されている

① クラス・モジュール名に複数単語が含まれる場合

単語を _ 区切りにする

require 先と同じ表記になるので、ユーザーフレンドリー

例えば、

  • Gem 名は ruby_parser
  • require 先は
  • クラス・モジュール名は RubyParser

② 別の Gem を拡張する場合

拡張元を - 区切りにする

require先は / 区切りとなり、クラス・モジュール名は :: 区切りにする

Bundler.setup | Bundler日本語ドキュメント | Ruby STUDIO

例えば、net/httppersistent 機能を追加する場合

  • Gem 名は net-http-persistent
  • require 先は net/http/persistent
  • クラス・モジュール名は Net::HTTP::Persistent

③ ①と②の場合

例えば、net/httpdigest authentication 機能を追加する場合

  • Gem 名は net-http-digest_auth
  • require 先は net/http/digest_auth
  • クラス・モジュール名は Net::HTTP::DigestAuth

※ 大文字は使わない(小文字で統一する)

OS によって、小文字や大文字を区別しない場合があり、意図せず Gem を読み込んでしまう可能性があるため

新年度

やる気と可能性に満ちてて、何とも

これからはインプットは関係なくアウトプットで評価される

会社から与えることができるものは、どこまでも価値提供を求めること

ある目的のために集まった仲間とは、また違った深い関係性を築ける

あの頃はどうだったより、今そしてこれから何をやっているを語りたい

Ruby-Graphviz でサブグラフを描く

ゴール

GitHub - glejeune/Ruby-Graphviz: [MIRROR] Ruby interface to the GraphViz graphing toolClusters | Graphviz を描きたい

まずは、dot 言語で書いてみる

Graphvizとdot言語でグラフを描く方法のまとめ - Qiita を参考にして

digraph node_sample {
...
  subgraph cluster_1 {
    label = "clu1";
    labelloc = "t";
    labeljust = "l";
    fillcolor = "#888888";

    nu [label = "nu", shape = "trapezium"];
    xi [label = "xi", shape = "trapezium"];

    nu -> xi;

    subgraph cluster_2 {
      label = "clu2";
      labelloc = "t";
      labeljust = "l";
      fillcolor = "#888888";

      nu2 [label = "nu2", shape = "trapezium"];
      xi2 [label = "xi2", shape = "trapezium"];

      nu2 -> xi2;

     subgraph cluster_3 {
        label = "clu3";
        labelloc = "t";
        labeljust = "l";
        fillcolor = "#888888";

        nu3 [label = "nu3", shape = "trapezium"];
        xi3 [label = "xi3", shape = "trapezium"];

        nu3 -> xi3;
      }
    }

    nu -> nu2
  }
}

dot -T png sample.dot -o sample.png して open sample.png すると

f:id:ty_1592:20220325153803p:plain

次に、Gem で書いてみる

require 'ruby-graphviz'

# Create a new graph
g = GraphViz::new(:G, type: :digraph, use: :dot, rotate: 0, rankdir: :LR)

# setting sub-graph
g.add_graph('cluster_1', label: "clu1", labelloc: "t", labeljust: "l", fillcolor: "#888888")
sub1 = g.get_graph('cluster_1')
hello1 = sub1.add_nodes( "Hello1" )
world1 = sub1.add_nodes( "World1" )
sub1.add_edges( hello1, world1 )

sub1.add_graph('cluster_2', label: "clu2", labelloc: "t", labeljust: "l", fillcolor: "#888888")
sub2 = sub1.get_graph('cluster_2')
hello2 = sub2.add_nodes( "Hello2" )
world2 = sub2.add_nodes( "World2" )
sub2.add_edges( hello2, world2 )

sub1.add_edges( hello1, world2 )

# Generate output image
g.output( :png => "./tmp/hello_world.png" )

f:id:ty_1592:20220325154111p:plain

ポイントとしては、Class: GraphViz — Documentation for glejeune/Ruby-Graphviz (master) を使う際、第一引数として渡すグラフ名を cluster から始まる文字列にすること(そうしないとサブグラフとして機能しない)

ニシアフ🥺

たまたま見かけて qualia-45.jp

思った以上に f:id:ty_1592:20220321204041j:plain

グッ… www.youtube.com

とりあえず f:id:ty_1592:20220321204158j:plain

かっこよ f:id:ty_1592:20220321204237j:plain

寝とる f:id:ty_1592:20220321212906j:plain

グッ… 2 www.youtube.com

読んでる

ActiveRecord の継承関係を可視化してみる

前提

rails (6.1.4.1) の中にある activerecord (= 6.1.4.1)

結果

f:id:ty_1592:20220321164243p:plain

図がデカすぎてはてなブログだと見れないようなので

www.dropbox.com

補足

おまけ

ancestors でやってみた(オレンジはモジュール)

www.dropbox.com

oldNews のカテゴリを変えた

はじめに

oldNews という Web サービスをリリースした - ty’s blog で書いているようにカテゴリの改善をしたいなあと漠然と思っていた

精度改善の前に、そもそもカテゴリの種類がわかりづらい(そのカテゴリにどんな内容があるのかがパッとわからない)

ということで、カテゴリを見直すことにした

方針

元々、コンテンツの分類  |  Cloud Natural Language API  |  Google Cloud を使ってカテゴリ判定できたらと思っていたけど、現状は日本語対応してなくて利用を見送っていた(なので、以前は、他の Natural Language API を使ってそれっぽいことをしている)

ここで見落としてたのが、事前に英訳すればカテゴリ判定できるということ(英訳する API も提供されている!)
参考: GCP Natural Languageでブログのカテゴリを自動で付けてみた - Qiita

カテゴリ定義

コンテンツ カテゴリ  |  Cloud Natural Language API  |  Google Cloud のカテゴリは数が多いので、そのまま使えない

ということで、他のニュースサイトのカテゴリを参考にしたり、実際にカテゴリ判定検証してみた結果を反映しつつ、マジカルナンバーも踏まえて、

  • エンタメ
  • 暮らし
  • テクノロジー
  • ビジネス
  • 社会
  • その他

また変えるかもしれないけど、しばらくはこれで様子を見るか

おわりに

カテゴリ変わったことで大分見やすくなったと思う
👉 oldNews

一方で、カテゴリ判定を改善する余地はありそう
例えば、どうしても「その他」が多くなってしまうとか

ここはいくつか改善案があるので、また時間がある時に調べてみるかな

Ruby から classify text API を叩く

ゴール

以下を Ruby から叩く。

cloud.google.com

事前準備

上記 API は Natural Language API の一つなので、Ruby で Natural Language API を叩く - ty’s blog の準備ができてれば OK

API 仕様

Method: documents.classifyText  |  Cloud Natural Language API  |  Google Cloud

↑には明記されていないが、Gme を使った際に分かったこととして、対象の英語文に最低限 20 個の単語が含まれている必要がある

カテゴリ一覧は、コンテンツ カテゴリ  |  Cloud Natural Language API  |  Google Cloud
現状は、最上位カテゴリは 27 個(結構多い)
また、より詳しいカテゴリがわかる場合は、それより上位のカテゴリは省略される

"/Adult"
"/Arts & Entertainment"
"/Autos & Vehicles"
"/Beauty & Fitness"
"/Books & Literature"
"/Business & Industrial"
"/Computers & Electronics"
"/Finance"
"/Food & Drink"
"/Games"
"/Health"
"/Hobbies & Leisure"
"/Home & Garden"
"/Internet & Telecom"
"/Jobs & Education"
"/Law & Government"
"/News"
"/Online Communities"
"/People & Society"
"/Pets & Animals"
"/Real Estate"
"/Reference"
"/Science"
"/Sensitive Subjects"
"/Shopping"
"/Sports"
"/Travel"

Gem から API を叩く

GitHub - googleapis/google-api-ruby-client: REST client for Google APIs

require 'google/apis/language_v1'

# Doc: https://googleapis.dev/ruby/google-api-client/v0.23.6/Google/Apis/LanguageV1/CloudNaturalLanguageService.html#classify_document_text-instance_method
service = Google::Apis::LanguageV1::CloudNaturalLanguageService.new
service.key = 'APIキー'

# Doc: https://googleapis.dev/ruby/google-api-client/v0.23.6/Google/Apis/LanguageV1/ClassifyTextRequest.html
request = Google::Apis::LanguageV1::ClassifyTextRequest.new({
  document: {
    type: 'PLAIN_TEXT',
    language: 'en',
    content: 'Nintendo's home video game console "Nintendo Switch" will be released simultaneously in Japan, North America, Europe, Australia, Hong Kong, etc.',
  }
})

# Doc: https://googleapis.dev/ruby/google-api-client/v0.23.6/Google/Apis/LanguageV1/ClassifyTextResponse.html
response = service.classify_document_text(request)

# Doc: https://googleapis.dev/ruby/google-api-client/v0.23.6/Google/Apis/LanguageV1/ClassificationCategory.html
response.categories
=> [#<Google::Apis::LanguageV1::ClassificationCategory:0x00007fbdf9214ee0 @confidence=0.77, @name="/Games/Computer & Video Games">, #<Google::Apis::LanguageV1::ClassificationCategory:0x00007fbdf4b038d0 @confidence=0.66, @name="/Computers & Electronics/Consumer Electronics">]

response.categories.first.name
=> "/Games/Computer & Video Games"

response.categories.second.name
=> "/Computers & Electronics/Consumer Electronics"