カテゴリー: テクノロジー

FizzBuzz のコーディング

こんにちは。開発担当のマットです。

今日の記事で、FizzBuzzという海外の子供の遊びと、プログラミングについて話をしたいと思います。
FizzBuzz とは、とても単純な子供のゲームです。 1 から数字を数え上げるゲームだけです。
1,2,3,4,5,6,7… などなど

ただし、3で割れる数を “Fizz” という
そして、5で割れる数を “Buzz” という
1,2,Fizz,4,Buzz,6,7… の感じで。
なお、3でも、5でも割れる場合、 “FizzBuzz” という
1,2,Fizz,4,Buzz,6,7,8,Fizz,Buzz,11,Fizz,13,14,FizzBuzz,16,17… などなど

基本的に、二人で遊んで、交合に数字をできるだけ早く言うのがルールです。
間違えてしまうと負けになります。

スクリプトを作ってみましょう

FizzBuzz をコードで作るのはとても簡単で、初心者でもできますので、是非一緒にやってみましょう。
僕は Javascript でやりたいと思います。
Javascript は Chrome のコンソールに直接書いてすぐに実行できますので、便利です。

まずは、1 から 99 までの for ループを作りましょう。
そのループの中で、数字をそのまま書き出します。(Fizz や Buzz は後でやります)
コンソールで実行する場合、 console.log を使いますが、プログラミング言語によって、echo や print なども使えます。

これをコンソールで実行する場合、1 から 99 までの数字が全部出力されます。

Fizz と Buzz を入れるには?

3 で割れる場合、”Fizz”
5 で割れる場合、”Buzz”
3 と 5 で割れる場合、”FizzBuzz”
そして、どれにも当てはまらない場合、 数字そのまま

それをコードにそのまま書くと、以下のような感じになります。

結果を見ると・・・

ダメですね…

15 の場合、Fizz も Buzz も FizzBuzz も出てしまった。何というバグ。
なお、コードが整っていないですね。バグを修正しようと思っても、更にわかりにくくなりそう…

考え直しましょう!

まず、「出力値」の変数を作りましょう。その変数に空っぽな文字列も入れてみます。
var output = “”;
のような感じで。
もし、3で割れる場合、その output 変数に “Fizz” を追加しましょう。
もし、5で割れる場合、その output 変数に “Buzz” を追加しましょう。
これで、Fizz も Buzz も FizzBuzz も、対応できますよね。

なお、上記のチェック後、その output の変数の文字列が空っぽであれば、数字を書き出せばいいとなりますよね。

結果を見ると・・・

完璧です!

なお、とてもわかりやすいコードになりましたので、ゲームのルールを変更したバージョンもすぐに作成できますね。

まとめ

何かのプログラムやスクリプトを作る場合、書き方は様々あります。
ただし、プログラマーは日常、わかりやすくて簡潔なコードを書くことはとても大事です。

直感でいくと、バグだらけのわかりにくいコードになる恐れはありますので、何かの挑戦に取り組む前に、進め方を一度考えてから進んだほうがいいでしょうね。

これからも頑張っていきましょう!

[Solr] zeppelin-solrで単語の使われ方を可視化する

zeppelin-solr の事例の1つ “Text Analysis and Term Vectors” では Solr 内のドキュメントをテキスト解析してその特徴を可視化する方法の例が示されています。これを日本語のドキュメントでやってみました。

対象は日本語版Wikipediaとします。
Streaming Expressions の analyze 関数を使うと指定した文字列を形態素解析できます。

analyze("システム構成の概要", text)

「システム構成の概要」が対象の文字列、text は text フィールドで定義されている Tokenizer でトークナイズするという意味です。 Wikipedia 用のコレクションを作るときの設定で text フィールドは Kuromoji を使った形態素解析をすると定義されています。

上の analyze の実行結果は以下の通りです。

[システム, 構成, 概要]

では解析結果を使って図示してみましょう。
“Text Analysis and Term Vectors” では、英語のドキュメントの bi-gram をカウントして多いものトップ10をグラフにしていました。ここでは、「漫画」を含む Wikipedia の記事のタイトルを形態素解析して単語をカウントし、多いものトップ20をグラフにしました。

結果は以下の通りです。
ultimate-pie-chart を使っています。
円グラフの内訳が降順になっていないのが気になるところですが、こういう仕様のようです。

[Solr] 外部パッケージ化された Data Import Handler (DIH) を使う

はじめに

Solr 8.6 以降 Data Import Handler (DIH)が deprecated となり、外部パッケージ化されました。

https://cwiki.apache.org/confluence/display/SOLR/Deprecations
https://github.com/rohitbemax/dataimporthandler

以前やったように Wikipedia の記事をインポートする作業を通じて、外部パッケージ化された DHI を利用する方法を確認しました。

Wikipedia のデータダウンロード

https://dumps.wikimedia.org/jawiki/
の latest から jawiki-latest-pages-articles.xml.bz2 をダウンロードして展開しておきます。

DIHをSolrにインストールする

パッケージ機能を有効にして Solr を起動

$ bin/solr -c -Denable.packages=true

data-import-handler パッケージのリポジトリを追加

$ bin/solr package add-repo data-import-handler "https://raw.githubusercontent.com/rohitbemax/dataimporthandler/master/repo/"

data-import-handler パッケージインストール

$ bin/solr package install data-import-handler

Wikipedia インポート用のコレクション設定

$ cd solr-8.10.0/server/solr/configsets
$ cp -r _default wikipedia
$ vi wikipedia/conf/data-config.xml

DIH 用の設定ファイル data-config.xml を作成します。

<dataConfig>
  <dataSource type="FileDataSource" encoding="UTF-8" />
  <document>
    <entity name="page"
                processor="XPathEntityProcessor"
                stream="true"
                forEach="/mediawiki/page/"
                url="data/jawiki-latest-pages-articles.xml"
                transformer="RegexTransformer,DateFormatTransformer">
      <field column="id"        xpath="/mediawiki/page/id" />
      <field column="title"     xpath="/mediawiki/page/title" />
      <field column="revision"  xpath="/mediawiki/page/revision/id" />
      <field column="user"      xpath="/mediawiki/page/revision/contributor/username" />
      <field column="userId"    xpath="/mediawiki/page/revision/contributor/id" />
      <field column="text"      xpath="/mediawiki/page/revision/text" />
      <field column="timestamp" xpath="/mediawiki/page/revision/timestamp" dateTimeFormat="yyyy-MM-dd'T'hh:mm:ss'Z'" />
      <field column="$skipDoc"  regex="^#REDIRECT .*" replaceWith="true" sourceColName="text"/>
    </entity>
  </document>
</dataConfig>

読み込み対象を data/jawiki-latest-pages-articles.xml と指定しているので、記事ファイルを ${SOLR}/server/data/jawiki-latest-pages-articles.xml としてコピーしておきます。

設定ファイルのセットを ZooKeeper 上にアップロードします。

(cd conf && zip -r - *) |curl -X POST --header "Content-Type:application/octet-stream" --data-binary @- "http://localhost:8983/solr/admin/configs?action=UPLOAD&name=wikipedia"

コレクション wikipedia を作成して DIH を有効にする

先程アップロードした設定ファイルを指定して、コレクション wikipedia を作成します。

$ curl "http://localhost:8983/solr/admin/collections?action=CREATE&name=wikipedia&numShards=1&collection.configName=wikipedia"

コレクション wikipedia に data-import-handler をデプロイします。

$ bin/solr package deploy data-import-handler -y -collections wikipedia

Wikipedia の記事をインポートする

full-import をスタート。

$ curl "http://localhost:8983/solr/wikipedia/dataimport?command=full-import"

[Solr] zeppelin-solr で Geospatial

Zeppelin 上で Solr の検索結果を地図にプロットすることもできます。

まずはメニューから Helium を開き、 volume-leaflet を有効にします。

volume-leaflet が利用可能になったらノートブック上で地球のアイコンが追加されます。

検索結果に緯度経度のフィールドが含まれる形で検索してから valume-leaflet を開き、Available Fields の coodinates に緯度経度のフィールド(この場合は address_p)を、tooltip に name_str のフィールドを指定するとプロットされます。(popup や gis_server は任意)

位置情報を持つデータ傾向を地図上で簡単に把握できる非常に良い手段だと思います。

[Solr] Heliumパッケージを使って zeppelin-solr の可視化手段を増やす

Zeppelinには始めからいくつかの可視化の手法が用意されていますが、Helium パッケージを使って後から追加することもできます。飛行船に追加するものだからヘリウムなんですね。

そのためには、Zeppelin の設定ファイルを変更して Helium パッケージリポジトリを有効にする必要があります。conf/zeppelin-site.xml.template をコピーして conf/zeppelin-site.xml を作り、以下のコメントアウトされている箇所を有効にします。

$ diff -u conf/zeppelin-site.xml.template conf/zeppelin-site.xml
--- conf/zeppelin-site.xml.template     2022-02-24 12:56:08.000000000 +0900
+++ conf/zeppelin-site.xml      2022-07-24 23:50:42.829396848 +0900
@@ -410,13 +410,11 @@
   <description>Remote Yarn package installer url for Helium dependency loader</description>
 </property>

-<!--
 <property>
   <name>zeppelin.helium.registry</name>
   <value>helium,https://s3.amazonaws.com/helium-package/helium.json</value>
   <description>Location of external Helium Registry</description>
 </property>
--->

 <property>
   <name>zeppelin.interpreter.group.default</name>

設定ファイルの準備ができたら zeppelin を再起動します。

$ bin/zeppelin-daemon.sh restart

Helium パッケージリポジトリを有効にしたら Zeppelin のページにアクセスしてメニューから Helium を開き、追加するパッケージを選んで “Enable” ボタンを押します。

パッケージを最初に追加するときにはかなり時間が掛かる場合もありますが、しばらく待てば利用できる状態になります。今回は ultimate-heatmap-chart を追加しました。

以下は、大阪市のどの区にどの施設が沢山あるかを示すヒートマップチャートです。