2018年から2019年へ

こんにちわ。
リエです。
 
2018年も残りわずかとなりました。
2019年は平成が終わり新しい元号が始まる年になりますね。
現段階では新元号は決まっていませんが、どんな元号になるのでしょうか。
 
2019年は亥年。
干支の中で最後の12番目に位置します。
植物の成長としては葉っぱも花も散ってしまい、種に生命を引き継いだ状態が「亥」だそうです。
十二支にはそれぞれ季節が割り当てられていて、亥は冬。
春の芽吹きまでじっとエネルギーを内にためているイメージが亥の意味です。
亥でエネルギーをしっかりとためると、それは「核」となり春には開花します。
なので弊社もしっかりとさらなる地盤作りに努めたいと思います。
参考サイト:https://mshabit.info/2019_eto/
 
2018年も弊社に関わってくださった皆さま。
本当にありがとうございました。
 
来年も何卒よろしくお願いいたします。


PDF をページ単位でインデックスする Solr の RequestHandlerを作成する

はじめに

Solr 6以降では PDF やワードなどのバイナリファイルをインデックスする機能(ExtractingRequstHandler)がサポートされています。
ファイル内に含まれるテキストをまとめて1つの文書として、メタデータ(作成日時、作成者等)と共にインデックスを作成してくれるのでこれはとても便利な機能ではありますが、用途によってはキーワードが何ページ目にヒットするのかを知りたいこともあります。そこで、自前の RequestHandler 作成の練習として PDF をページ単位でインデックスする ReqestHandler を作成してみました。

Apache Tika

Solr では PDF 等の各種フォーマットを扱うために Apache Tika を利用しています。
Tika では PDF 等を XHTML に変換した上で SAX パーサーにコンテンツハンドラを渡して XHML の要素毎の処理を実行させられます。それと同時にファイルに含まれるメタデータが Metadata クラスのオブジェクトに格納されます。
従って、Tika の呼び出し側は

  • ファイルに含まれる構造化コンテンツが XHTML に変換されたもの
  • ファイルのメタデータ

を扱うことができます。

Tika によって PDF から変換された XHTML がどんなフォーマットになっているかは、extractOnly=true オプションを指定することで見ることができます。

bin/post -c test -params "extractOnly=true&wt=json&indent=true" -out yes /tmp/test.pdf

XHTML の body 部分だけを抜粋すると以下のようになっています。

<body>
<div class="page">
<p/>
<p>テストドキュメント1ページ目です。</p>
<p/>
</div>
<div class="page">
<p/>
<p>2ページ目の文章です。</p>
<p/>
</div>
<div class="page">
<p/>
<p>これは3ページ目です。</p>
<p/>
</div>
</body>
</html>

ページ毎に

<div class="page">

に囲まれた構造になっていることが分かります。

ExtractingRequestHandler には capture という実行時パラメータがあり、これを指定することで特定の XHTML 要素(この場合div)を個別にインデックスすることができるのですが

  • 文書IDはファイル全体で共通
  • 同じ名前の要素が複数存在する場合は multivalued のフィールドに入れられる

という仕様のためページ番号との紐付けができそうもなかったのが、今回自前で実装してみようと思ったきっかけでした。

SolrがPDFを扱う仕組み

ExtractingRequestHander では以下のクラス構成で PDF 等のインデックス処理を実行しています。

  • ExtractingRequestHander
    リクエストのエントリポイント(/solr/update/extract)。

    • 設定の読み込み
    • Tika のパーサーが生成する SAX イベントを処理するコンテンツハンドラ(SolrContentHandler)用のファクトリ(SolrContentHandlerFactory)を生成
    • ExtractingDocumentLoader を生成して load メソッド(ファイル読み込みとインデックス処理のメイン)を実行
  • ExtractingDocumentLoader
    実際にファイルを読み込んでインデックス処理を実行。

    • メタデータ読み込み
    • コンテンツの種類に対応したパーサーを生成
    • ExtractingRequestHander から与えられたファクトリ(SolrContentHandlerFactory)を使ってコンテンツハンドラ(SolrContentHandler)オブジェクトを生成
    • パーサーにコンテンツハンドラ(SolrContentHandler)を与えてパース処理を実行
    • 生成されたメタデータオブジェクトとコンテンツ文字列をインデックスに投入
  • SolrContentHandler
    Tika のパーサーが生成する SAX イベントを処理する。
    基本的に XHTML に含まれるコンテンツ部分の文字列を結合して1つの大きな文字列を作っている。
  • SolrContentHandlerFactory
    SolrContentHandler のファクトリメソッドを提供する。

ページ単位のインデックス処理を実装

上記の4クラスをそれぞれ継承したクラスを実装しました。(コードはこの記事の最後に)
実装の内容は以下の通りです。

  • 設定の読み込みは親クラスに任せる
  • 具象クラスの生成処理は上書き
  • SolrContentHandler のサブクラスで
    <div class="page">
    

    を認識してページ番号とページ毎のコンテンツとが対応付けされたテーブルを作成

  • ExtractingDocumentLoader のサブクラスでページ毎に文書IDを振ってインデックス投入

利用方法

  1. 4クラスをコンパイルして Jar ファイルを生成
  2. contrib/extraction/lib に Jar ファイルをコピー
  3. solrconfig.xml の
    <requestHandler name="/update/extract"
                      startup="lazy"
                      class="solr.extraction.ExtractingRequestHandler" >
    

    の箇所を jp.co.splout.solr.plugin.MyExtractingRequestHandler に変更

  4. Solr 再起動

実行例

投入

$ bin/post -c test -params "extractOnly=false&wt=json&indent=true&literal.id=testpdf1" -out yes test.pdf

検索結果

最後に

PDF をページ単位でインデックスする Solr のプラグインを作成しました。
PoC ということで最小限の実装しかしていませんが、ちゃんとするなら

  • せっかくなのでメタデータも有効に使いたい
  • ExtractingRequestHandler の実行時パラメータで共用できるものは共用したい
  • もっというなら ExtractingRequestHandler の1機能として統合?

ということも考えたいと思います。

コード


仕事で使うメールアドレスにフリーメール・・・?

最近プライベートで名刺をいただく機会が増え、もやもやしていることがあります。
仕事で使っているはずのメールアドレスにフリーメールのアドレスがそのまま使われている・・・
ドメインを取得し、ホームページをもっている企業でもフリーメールのアドレスがそのまま使われている・・・
こんな事が結構な頻度であります。

もったいない・・・!

歳をとって細かいことが気になるオッサンになったからかもしれないですが、凄く気になる。

例えば何も情報がない状態で以下の2パターンのメールアドレスだとどちらが信頼できそうでしょうか?
・sploutgames@gmail.com
・games@splout.co.jp
一概には言えないですが、私はフリーメール=誰でも自由に使い捨てアドレスが取得できる。という観点から後者の企業ドメイン(games@splout.co.jp)のほうが信頼できそうな気がしてしまいます。

例としてGmailを挙げましたが、Gmail自体はセキュリティにも優れた素晴らしいものです。
逆に企業ドメインのアドレスについては適当に設定されたメールサーバで稼働するセキュリティの低いものの可能性だってあります。

ただ、それでも企業として利用するメールアドレスにフリーメールアドレスをそのまま使うのは違うと思ってしまうのです。

そこで是非ともおすすめしたいのがG Suiteです。
G SuiteはGoogleが提供する様々なツールを、1つのパッケージで全て利用できるサービスです。
これにはGmailも含まれており、企業ドメインを使用したメールアドレスが利用可能になります。
G Suiteについてもう少し詳しい内容が次の記事にあります。
https://blog.splout.co.jp/2150/

導入はもちろん、導入のご相談からサポートまで一貫したお手伝いをさせていただいております。
この機会にG Suiteの導入をご検討されてみてはいかがでしょうか?
お気軽にご相談ください。

お問い合わせ


人間の集中力の時間

こんにちわ。
リエです。
 
最近勉強したい分野ができたので隙間時間で勉強をしたいと考えています。
やはり社会人になってからの勉強で1番のハードルとなるのが、「勉強時間の確保」ですよね。

 
学生のころは本分が勉強だったので、毎日学校に行って90分授業を4コマ、5コマ受けていたわけですが、今はそんなに勉強時間を確保できません。
 
平日はお仕事が終わってからの勉強となるので、睡眠時間を考えると勉強に時間を取れるのは1・2時間。
なるべく効率よく勉強したい!ということで、人間の集中力の時間について調べてみました。
 
よく人間が本気で集中できるのは15分ぐらいと聞きますよね。
脳科学的にみて15分という時間は集中力を最も高めることができる時間の単位とのこと。
15分の次に普通に集中できるのが30分で続いて45分、長くても90分が限界だそうです。
 
確かに時間が経つにつれて他のことが気になったりして集中力は弱まりますよね。
15分刻みの間に5分休憩をいれて勉強や読書をしたほうがより高い集中力を保てるそうです。
参考サイト
https://www.buzzgeekmagazine.com/human-shuchuryoku/
 
うまく休憩をいれつつ集中力を保ったまま勉強したいと思います。
 
ノートに書きながら勉強しているのですが、最近パソコンやスマホばかり使い字を書くことが少なくなったので、自分の字が本当に下手になっていて泣けます。(元々そんなに字がうまいわけではありませんが。。)
 
たまには字を書かなきゃですね。
字がきれいな人に憧れるので、ペン字習字もしようかな〜。


デザインの進捗とバージョン管理のススメ

 

こんにちは。デザイン担当のLQヒロシです。

 

WEB開発ではGitというアプリケーションを用いてプログラムファイルなどの更新状況管理をしているのですが、ファイルの更新状況を上書き時に業務ログも残しています。
この業務ログは、ひとつのプロジェクトを複数人で作業することの多いエンジニアさんにとって、他のメンバーがどのような進行状況なのか、どういったところで詰まっているのかを知る目安になっています。
プロジェクトの管理担当者も作業者を評価する指標として活用しているケースもあるかと思います。

 

もちろんデザイナーもコーディング作業であればGitを使ってファイルの進行状況を管理したり業務ログを残しますが、デザイン、特にビジュアル作成フェーズの業務ログを残すのってなかなか大変で、デザイナーの管理が難しいと言われる要因の一つかもしれません。

 

弊社ではデザインデータのバージョン管理アプリを利用して業務ログを残すようにしています。今回はその取り組みについて少しご紹介したいと思います。
Gitの仕組みを利用したものになるのでバージョン管理もできるのでおすすめです。

 

デザインデータの管理アプリについて

 

よく利用されているアプリケーションは以下の2種類になるようです。

 

Kactus(カクタス)

 

Githubベースのアプリで弊社ではこちらを利用しています。
基本的にはSource treeみたいな感じで使えます。詳しくは後ほどご紹介します。

【概要】

  • 標準のバージョン管理方法はGit。
  • 対応データ形式はSketchファイルを推奨。aiファイルやpsdファイルも利用できます。Sketchファイルの場合は、png画像を自動で書き出し差分が確認できます。

 

 

Abstract(アブストラクト)

 

デザインデータのバージョン管理アプリではこちらの方が新しく評価も高いです。

【概要】

  • Gitを介さずにできるのでスムーズな導入が可能(Git連携可能)。
  • UIが特に使いやすく、Sketchとの親和性が高い。
  • Kactusよりストレスフリーで使い勝手は良いのですが、Sketchファイルにしか対応していないのが残念。

Abstractの最大の利点はデータを保存するだけででてくるコミット入力ウィジットです。Sketch限定ですがすべての作業がSketch上で完結します。これが非常に便利!!Sketch主体で業務を行っているならこちらの方が良いと思います。

 

 

弊社ではUIデザイン以外にもロゴやイラスト作成などSketch以外で作成する業務もありますのでKactusを選びました。

 

そもそもなぜデザイン業務はログが残りにくいのか?

デザイン業務、ビジュアル作成のフェーズではIllustratorなどのソフトを使ってレイアウトを組み立てていきます。

 

手書きラフなどを先に作成する場合もありますが、基本的には画面上でオブジェクトを動かしながら組み立てていくことが多いです。
色の設定から少しづつ整っていくこともありますし、漫然とした状態からアイデアがカチッとはまって次の瞬間には出来上がることもあります。
このようなところが業務ログを残すことが難しいと感じるのではないでしょうか。

 

完璧なログを残すのではなく、保存のタイミングなどで簡単な状況説明をする、もっと砕いて言えばボヤキぐらいでもいいのでアプリを活用してちょっとしたメモを残す。「誰がどんな感じで業務にタッチしているのかがわかる」ことが重要なのではと思います。
Sketchであればpng画像として自動的に残すこともできるので尚良しですね!

 

それではKactusの利用方法について

 

KactusもAbstructも使い方は検索すれば割と見つかると思います。いくつかピックアップしましたので参照ください。

Kactus – 変更点が見て分かるデザイナーのためのバージョン管理ツール
デザインデータのバージョン管理ができるAbstractを試してみた

 

書かれている内容は概ね、新規にディレクトリを作成して対象リポジトリにするという感じですので、本記事ではKactusで実際のプロジェクトとの紐付方について少しご紹介できればと思います。

 

弊社の場合はプロジェクト毎にgithubリポジトリに紐付いているため(Web開発であれば大抵そうじゃないのかなと思います)、gitクローンするところから始めます。

 

左上メニューの File > Clone Repository を選択

こちらのダイアログが表示されるので  URLタブ内、A欄に Clone 対象リポジトリーURLを B欄にClone先のディレクトリパスを入力して Cloneボタンで完了です。
※クローンするとコーディングファイルなども落ちてくるので管理には注意してください。

 

  1. 管理ディレクトリ内でデザインファイルを作成、または更新すると、ファイル変更情報が A に表示されます。
  2. A をクリックすると ※Sketch 利用時のみ B に画像が表示されます。
  3. まずはCの Fetch origin からリモートの最新バージョンを取得します。
  4. Dの Summary欄にコミットメッセージを入力。弊社の場合はRedmineと連動しているので最低限チケット番号を入力。
  5. 細かいメモはEのDescriptionに残せば良いと思います。
  6.  Commit to master をクリックすればコミット完了。

 

最後に右上の Push origin からリモートを更新して完了です。
余談ですがhtmlなどのファイルの管理もこちらからできたりします。
※プライベートリポジトリを利用するには有料の登録が必要です。

 

 

他にもHistoryからコミットログのテキストやSketchであれば差分画像を確認できます。
Redmineと連携していればそちらでもリポジトリの履歴確認が可能になります。
ブランチの作成もできますので複数人で管理することもできます。

 

 

以上、最後が駆け足になってしまいましたが、今後もKactusのナレッジなどより良い使い方をご紹介していければとおもいます。