梅体験専門店「蝶矢」に行ってみた

梅酒といえばで有名な、あの!チョーヤ梅酒を自分で作ることが出来るという予約困難な梅体験専門店「蝶矢」に行ってきました。
今回は実際に体験した内容を、ご紹介していきたいと思います。

いざ店内へ

店内に入りますと店内奥に体験スペースがあり、作り方の説明POPや梅のヘタを取るピック等が用意されています。

壁には梅酒を作って1日目から7日目までの見本瓶が飾られています。
中身は本物!

砂糖と梅とお酒を選ぶ

スタッフの方の説明を聞きながら、ひとつひとつ試飲してオリジナル梅酒の材料を決めます。
砂糖と梅どちらも5種類から選べます。

梅の写真を撮り忘れたのでテキストでご紹介。
・完熟南高(かんじゅくなんこう)
・古城(こじろ)
・有機南高(ゆうきなんこう)
・鶯宿(おうしゅく)
・パープルクイーン

砂糖を選ぶときは完熟南高がベース、梅を選ぶときは氷砂糖がベースのシロップで試飲します。

そして最後にお酒を選びます。
こちらも写真を撮り忘れたのでテキストでご紹介。
・ウォッカ
・ブランデー
・ホワイトラム
・ジン

全て選び終わったら待ちに待った梅酒作りに入ります。

梅酒作り

マイボトルシート記入後、材料を用意してもらい梅のヘタをほじほじしたら瓶に入れていきます。


砂糖と梅を入れ終わったら最後にお酒を入れて完成です!

私の梅酒達

完成した梅酒達です。
かわいー。

使用した瓶は箱付きで購入するのですが、購入した箱+瓶を持参すれば次回作りに来た時に再び購入する必要がなく何度でも繰り返し使えるそうです!
より美味しい梅酒にするために、沈殿した砂糖を梅に触れるように撹拌するという作業が2週間毎日必要となります。
私は過保護に1日3回ほど撹拌してお世話しています。
撹拌という工程を経て1ヶ月後に本当の梅酒が完成です!

1日限定10本しか販売しない特別な梅酒

梅体験専門店「蝶矢」には特別な梅酒が販売されています。
京都店で5本、鎌倉店で5本の1日限定10本のみ販売されている「蝶矢 限定熟成」という名の梅酒です。

3年以上の年月をかけて作られる特別な梅酒が運良く、残っていたので即決で購入しました。
早く飲んでみたいけど、特別という名の魔法にかかりいつまでたっても開封出来る気がしない。。
写真のセンス皆無なので、本来のかっこいいビジュアルは以下の記事をご覧ください。
https://www.choya.co.jp/news/1714/

まとめ

梅体験専門店「蝶矢」とってもよかったです。
自分で選んで作れるのが楽しいのであっという間に時が過ぎます。
体験に行かれるか迷われている方は参考にしていただければ嬉しいです。
https://choyaume.jp/

[Solr] Tagger Handler

Solr には Tagger Handler というテキストへのタグ付けの機能があります。
タグ付けはかなり幅の広い技術で、高度な自然言語処理を用いてアノテーションを与える手法もある一方で、辞書として与えられた単語を単純に抽出する手法もあります。Solr の Tagger Handler は後者です。

Tagger Handler ではSolrのインデックスを辞書として使い、Tagger Handler へ送られたテキスト内に含まれる辞書の単語をタグ付けして出力します。与えられたキーワードがインデックスされたドキュメントに含まれるかどうかを調べる検索処理と対照的ですが、要素の技術は共通しています。

Solr リファレンスには Tagger Handler のチュートリアルが含まれているので、それに沿って動作を確認してみます。

まず geonames というコレクションを作ります。

bin/solr create -c geonames

スキーマを API で定義します。

curl -X POST -H 'Content-type:application/json'  http://localhost:8983/solr/geonames/schema -d '{
  "add-field-type":{
    "name":"tag",
    "class":"solr.TextField",
    "postingsFormat":"FST50",
    "omitNorms":true,
    "omitTermFreqAndPositions":true,
    "indexAnalyzer":{
      "tokenizer":{
         "class":"solr.StandardTokenizerFactory" },
      "filters":[
        {"class":"solr.EnglishPossessiveFilterFactory"},
        {"class":"solr.ASCIIFoldingFilterFactory"},
        {"class":"solr.LowerCaseFilterFactory"},
        {"class":"solr.ConcatenateGraphFilterFactory", "preservePositionIncrements":false }
      ]},
    "queryAnalyzer":{
      "tokenizer":{
         "class":"solr.StandardTokenizerFactory" },
      "filters":[
        {"class":"solr.EnglishPossessiveFilterFactory"},
        {"class":"solr.ASCIIFoldingFilterFactory"},
        {"class":"solr.LowerCaseFilterFactory"}
      ]}
    },

  "add-field":{"name":"name", "type":"text_general"},
  "add-field":{"name":"name_tag", "type":"tag", "stored":false },
  "add-copy-field":{"source":"name", "dest":["name_tag"]}
}'

Tagger Handler を API で設定します。

curl -X POST -H 'Content-type:application/json' http://localhost:8983/solr/geonames/config -d '{
  "add-requesthandler" : {
    "name": "/tag",
    "class":"solr.TaggerRequestHandler",
    "defaults":{"field":"name_tag"}
  }
}'

http://download.geonames.org/export/dump/cities1000.zip
からサンプルデータをダウンロードし、/tmp に展開しておきます。
サンプルデータを geonames コレクションに投入します。

bin/post -c geonames -type text/csv \
  -params 'optimize=true&maxSegments=1&separator=%09&encapsulator=%00&fieldnames=id,name,,alternative_names,latitude,longitude,,,countrycode,,,,,,population,elevation,,timezone,lastupdate' \
  /tmp/cities1000.txt

タグ付けの動作を確認します。

$ curl -X POST \
  'http://localhost:8983/solr/geonames/tag?overlaps=NO_SUB&tagsLimit=5000&fl=id,name,countrycode&wt=json&indent=on' \
  -H 'Content-Type:text/plain' -d 'Hello New York City'
{
  "responseHeader":{
    "status":0,
    "QTime":1},
  "tagsCount":1,
  "tags":[{
      "startOffset":6,
      "endOffset":19,
      "ids":["5128581"]}],
  "response":{"numFound":1,"start":0,"docs":[
      {
        "id":"5128581",
        "name":["New York City"],
        "countrycode":["US"]}]
  }}

リファレンスによると、Tagger Handler へのリクエストではインデックスのどのフィールドを辞書として扱うかを示す filed パラメータが必須となっていますが、このリクエストには field パラメータが含まれていません。その代わりに Tagger Handler の設定で以下を指定しているため、デフォルトで name_tag フィールドが使われます。

   "defaults":{"field":"name_tag"}
を指定しているため、デフォルトで name_tag フィールドが使われます。

複数のエンティティが含まれる場合も試してみました。

$ curl -X POST   'http://localhost:8983/solr/geonames/tag?overlaps=NO_SUB&tagsLimit=5000&fl=id,name,countrycode&wt=json&indent=on'   -H 'Content-Type:text/plain' -d 'Hello New York City. Hello Los Angeles.'
{
  "responseHeader":{
    "status":0,
    "QTime":0},
  "tagsCount":2,
  "tags":[{
      "startOffset":6,
      "endOffset":19,
      "ids":["5128581"]},
    {
      "startOffset":27,
      "endOffset":38,
      "ids":["3882428",
        "3801497",
        "3998147",
        "3998148",
        "8858843",
        "3705542",
        "3705544",
        "1705545",
        "5368361"]}],
  "response":{"numFound":10,"start":0,"numFoundExact":true,"docs":[
      {
        "id":"3882428",
        "name":["Los Ángeles"],
        "countrycode":["CL"]},
      {
        "id":"3801497",
        "name":["Los Ángeles"],
        "countrycode":["MX"]},
      {
        "id":"3998147",
        "name":["Los Angeles"],
        "countrycode":["MX"]},
      {
        "id":"3998148",
        "name":["Los Angeles"],
        "countrycode":["MX"]},
      {
        "id":"8858843",
        "name":["Los Ángeles"],
        "countrycode":["MX"]},
      {
        "id":"3705542",
        "name":["Los Ángeles"],
        "countrycode":["PA"]},
      {
        "id":"3705544",
        "name":["Los Ángeles"],
        "countrycode":["PA"]},
      {
        "id":"1705545",
        "name":["Los Angeles"],
        "countrycode":["PH"]},
      {
        "id":"5128581",
        "name":["New York City"],
        "countrycode":["US"]},
      {
        "id":"5368361",
        "name":["Los Angeles"],
        "countrycode":["US"]}]
  }}

“New York City” と “Los Angeles” の両方がヒットしました。様々な国の “Los Angeles” がタグとして出力されています。
Tagger Handler へのリクエストにはフィルタクエリを含めることができます。

$ curl -X POST   'http://localhost:8983/solr/geonames/tag?overlaps=NO_SUB&tagsLimit=5000&fl=id,name,countrycode&wt=json&indent=on&fq=countrycode:US'   -H 'Content-Type:text/plain' -d 'Hello New York City. Hello Los Angeles.'
{
  "responseHeader":{
    "status":0,
    "QTime":0},
  "tagsCount":2,
  "tags":[{
      "startOffset":6,
      "endOffset":19,
      "ids":["5128581"]},
    {
      "startOffset":27,
      "endOffset":38,
      "ids":["5368361"]}],
  "response":{"numFound":2,"start":0,"numFoundExact":true,"docs":[
      {
        "id":"5128581",
        "name":["New York City"],
        "countrycode":["US"]},
      {
        "id":"5368361",
        "name":["Los Angeles"],
        "countrycode":["US"]}]
  }}

先程のリクエストに fq=contrycode:US を追加することで、結果を US に限定できました。

改めて確認したい印刷の用語

Webデザインをメインにやってこられた方は、印刷物に苦手意識を持っている方も多いのではないでしょうか?私自身、紙での仕事は苦手意識が強くあります。

苦手意識の一つとして専門用語を曖昧にしているのも一つの要因かもしれません。
なので、ここで改めて確認しようと思います。

見開き

書籍や雑誌などのページものを開いた時に対になる、左右ページのこと。

タイトル(大見出し)

新聞・雑誌などで、目立つように大きな活字を用いた見出し。
章全体を総括した見出し。

リード文

本文に入るまえのタイトルの下、近くにある、本編へ「誘導する、リードする」ための文章のこと。

本文(ほんぶん・ほんもん)

本編、コンテンツの中心となる文章のこと。
文字の大きさは、大体11Q~13Qくらい。

キャプション

写真・図版に添えられた説明文のこと。
(8Q、9Qなどの小さいQ数)

級(Q)

文字の大きさを示す日本独自の単位のこと。
(1Q = 0.25mm。4Qで1mm)

歯(H)

歯とは、文字と文字の間隔(字送り)や行と行の間隔(行送り)のサイズを表す日本独自の単位のこと。
(1H = 0.25mm。4Hで1mm)

ノンブル

ページ番号のこと。

小見出し

本文を区切るために入れる、短めの文章。新聞・雑誌・書籍などで用いられる記事の先頭に本文とは異なった目立つ体裁で組まれた見出しのこと。

柱(ショルダー)

ページの上下の余白部分に印刷される書籍名、章節などの見出しのこと。
1章、2章、などの章立てや、記事のタイトルを小さめに入れる。

キャッチ(中見出し、たらし)

文字組みにおいて画像や本文の間に入れるアイキャッチ的な文字のこと。
コンテンツの内容をひきたたせる文章のこと。

天、地

「天」は誌面の上側をのこと。
「地」は下側のこと。

ノド

本・雑誌などの折り込まれている、内側のこと。

小口

「ノド」の反対方向、本の外側のこと。

版面(はんずら)

書籍などのページ紙面において、余白を除いた印刷面のこと。

マージン

天地左右の余白。印刷物の版面の周囲の余白のこと。


いかがでしたでしょうか。
以上、参考になれば幸いです。

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 を使っています。
円グラフの内訳が降順になっていないのが気になるところですが、こういう仕様のようです。