FF14新生のチャットログを棒読みちゃんで読み上げるツールを作りました
【blog.soichiro.orgの閉鎖にともない転載しました】
プレイ中チャットログを見ずにボス戦をしたり、シャウトの募集待ちを読み上げたり、生放送実況をしながらFF14新生をプレイするために、チャットログを棒読みちゃんに読み上げてもらうツールを作成しました。
ダウンロードはこちらから↓
FF14Rep棒読みちゃん Ver1.0.5
https://github.com/sifue/ff14repbouyomi/raw/master/ff14repbouyomi-1.0.5-jar-with-dependencies.zip
使い方について
使い方は、まずJava7以上をインストール。
http://java.com/ja/download/
以上のサイトを見ながらインストール。
その後、棒読みちゃんをインストールして起動しておきます。
http://chi.usamimi.info/Program/Application/BouyomiChan/
以上のサイトのdownloadのページを見ながらインストールして、起動。
最後にFF14Repをインストールして起動しておきます。
http://xivparser.blogspot.jp/
以上のサイトのdownloadのページを見ながらインストールして、起動。
最初の起動直後に求められるFF14新生のドキュメント>My Games以下の更に二階層下のlogフォルダ設定をお忘れなく。
その後、右上の†のアイコンの設定から、
リアルタイムログ検出をONに。
ログファイル自動更新間隔を0.2秒にしておきます。
最後にこのサイトからダウンロードしたzipを解凍し
ff14repbouyomi-X.X.X-jar-with-dependencies.jar
をダブルクリック。
FF14Repのログフォルダの選択をして、開始ボタンを押します。
プレイヤー名を読み上げるたり、各ログの種類を読み上げるオプションはご随意に。
ちなみによく質問があるFATEやボスやNPCのログはsayに分類されています(わかりにくいっすね)。
なお含むテキストは、そのテキストを含む時だけ読み上げるようになります。空だとすべて読み上げます。また、正規表現で記述することもできます。
実行するとタイトルに実行中と表示されます。
終了はウインドウを終了すると終了します。
では、快適なエオルゼアライフを!
新生FF14攻略情報 エオルゼアガイドhttp://www.dopr.net/sinseiff14kouryaku/%E3%83%84%E3%83%BC%E3%83%AB%E7%B4%B9%E4%BB%8B
以上のサイトにて紹介していただきました~。
【開発者向け】 ソースコードについて
ちなみにソースコードはこちらでMITライセンスで公開しています。
https://github.com/sifue/ff14repbouyomi
言語は簡単なJavaで書かれていますので、少し心得のある方でしたら好きに変更してmavenでビルドし直すことができると思います。
更新履歴
2013/11/04 含むテキストのみを読み上げることができる機能を追加した1.0.5をリリース
Erlangの開発環境をWindows上のCentOS6.4に整える
仕事ではMacを使っているけれども、プライベートで使うPCは大抵ゲームのためにWindowsPCだったりするので、vagrant上のCentOS6.4開発環境を作るための手順をまとめておく。
VirturalBoxをインストール
vagrantをインストール
boxファイルは、
から好きなものを利用する。本番環境でもCentOS6.4を使うつもりなら
CentOS 6.4 x86_64 Minimal (VirtualBox Guest Additions 4.2.16, Chef 11.6.0, Puppet 3.2.3)
このあたりの構成が良さそう。
ターミナルエミュレーターは、
Tera Term
http://sourceforge.jp/projects/ttssh2/
configureするためにgccとは必要になりそうになものはsudu yum install gccで予めインストールしておく。
https://gist.github.com/voluntas/8911384
を参考にインストール。
これでerlコマンドやerlcコマンドが使えるようになる。
あと、vimも整備する。
vimは7.3以上をインストールしたいので
http://qiita.com/muniere/items/0569d05d470c5d3dc51b
をインストール
バージョン管理としてNeoBundleをインストール
https://github.com/Shougo/neobundle.vim
そして以下の設定をvimrcに追加。
erlang開発用に足すvimrc(NeoBundle前提)
を追加して
:NeoBundleInstall
する。
その後、
~/.vim/bundle/vim-erlang-runtime
のtest_syntax.erlがちゃんとシンタックスハイライトで表示されるか確認する。
ちなみに以下のコードはこんなかんじに表示される。
無論、makeの設定もしたので、:makeでシンタックスチェックもしてくれるようになる。とりあえずこれだけあれば最低限の開発はなんとか、大丈夫そう。
ただ、Linux上のvimの開発にこだわらないのであれば、IntelliJ IDEA UtlimateのErlangプラグイン使ったほうが楽そうではある。
個人用にIntelliJ IDEA Utlimate13のライセンスを買うかは悩ましいところ。
まだErlang入門仕立てなので、またビルドツールrebarとの連携が入ってきたら追記していきたい。
Scalaでの切り出したい処理が処理の中間にあるメソッド同士の重複行排除のやり方
最近Scalaを書く人が増えてきたこともあっていろいろ教える機会も増えてきたのですが、その中でよくScala初心者がつまづきやすいポイントである、切り出したい処理が、処理の中間にあるメソッド同士の重複行排除のリファクタリングの例を書こうと思います。
重複のあるサンプルコードとしてはこのような感じになります。
例として、ランダムに文字列のテンプレートを選択してその中にメッセージを埋め込んだあと、そのバイト数と内容を出力するメソッドと、その文字数と内容を出力するメソッドを用意してみます。
RandomTemplateProviderはテンプレートをランダムに渡すオブジェクトです。2つのメソッドは見ての通り仕様をそのまま実行していますが、printByteLengthAndContentメソッドとprintCharLengthAndContentメソッドには4行の重複行が含まれています。
こういう切り出したい処理が処理の真ん中に挟まっている場合の重複行排除は、関数を第一級オブジェクトでかけるScalaではこのようになります。
切り出したい処理が処理の中間にあるメソッド同士の重複行排除の例
関数をオブジェクトとして扱うことに慣れない方は、一瞬ん?とおもうかもしれませんが、このコードでは、printTargetLengthAndContentというメソッドを最下部で新たに定義し、そこでは、targetLengthProviderという関数を受け取って実行するという処理をしています。
この渡すtargetLengthProvider関数の中に切り出したい関数を元々のメソッドに設定すればよく、Scalaで簡単に匿名関数を作ることができる{}という記法を用いて上記のように表現してやることができます。これで見た目もわかりやすく存在していた重複行を排除することができました。
これでCPDなどのチェッカーなどに引っかかった時も柔軟に対応することができます。実際の業務のコードではこの重複行の長さが10行を超えるものである場合がほとんどですが、ぜひ応用にチャレンジしてみてください。
ちなみに、Java8になったことで、このような関数オブジェクトを使った重複行排除のリファクタリングが、Javaでもずいぶん書きやすくなっています。その例はまたの機会に。
Developers Summit 2014 で「Play2/Scalaでドメイン駆動設計を利用した大規模Webアプリケーションのスクラム開発の勘所」という内容で発表してきました
あまりにタイトルが長すぎるだろうと各所から突っ込まれ、あまりにも詰め込んだ内容で発表してしまったとちょっと反省しています。
お話としては、現在ニコニコ生放送の内部をPHPからScalaへ書きなおしているよ、というお話でした。
発表内容はこちら。
これらの内容は、これからScalaを使ってWebサイトを構築、運営してみようとしているリーダーさん向けに書いたものとなっています。Play2/Scalaやドメイン駆動設計、またスクラム開発の導入への足がかりにの情報となっていれば幸いです。
こんな雪の中わざわざ聞きに来てくださった皆様、そしてこの書き直しを着想するにあたってお世話になった特にじゅんいちかとうさん(id:j5ik2o)さんには多大な感謝を申し上げます。
追伸
もともと blog.soichiro.org にブログを移転していたのですが、もし大量にアクセスが有った時にさくらVPSだとさばけないと思いこちらに記載することとしました。
Twitterの検索結果をIRCにnoticeで転送し、閾値を超えるとmessageするボット
Scala2.9→2.10に移行するにあたって、公開することで誰かが使えるかもしれないScalaのツールがあったので、GitHubに公開しました。Twitter APIも1.0の廃止が近いので1.1への対応をしてあります。
https://github.com/sifue/twisearch_ircbot
使う用途は主にIRC上でのtwitter監視ですねw 内部的にStreaming APIではなくRESTのSearch APIを使っているので、ANDやOR、その他の検索指定演算子を利用することができます。http://blog.fkoji.com/2009/10191119.html の解説が丁寧です。
なおScala2.10といいつつ、akkaへの移行が大変だったりとか、長期間の検証をしなくていはいけないとかがあり、こいつはactorをそのまま使っています。build.sbtに
libraryDependencies <+= scalaVersion("org.scala-lang" % "scala-actors" % _)
を書くことでactorをそのまま使い続けられます。id:xuweiさん、情報ありがとうございました。
なお内部的には、twitter4jとsircを梱包しており、assemblyコマンドでビルドすることでjava -jarコマンドで実行できるjarになります。
$ git clone git@github.com:sifue/twisearch_ircbot.git
を利用して、思い思いにコードを変更してご利用ください。
ビルド方法は、以下のとおり
ビルド方法
javaとsbtをインストールの上、
$ sbt
> assembly
これでtargetディレクトリの中に、twisearch_ircbot-assembly-2.0.jarがビルドされます。
使い方
twisearch_ircbot-assembly-2.0.jarと同じディレクトリに、 twisearch_ircbot_template.propertiesを正しく編集して、 twisearch_ircbot.propertiesというファイル名で保存ください。
irc.address = hostname irc.channel = #channelname irc.nickname = twisearch_ircbot irc.charset = UTF-8 limitCount = 3 intervalSec = 60 keyword = #MT2 messageFormat = interval:%1$s keyword:%2$s count:%3$s noticeFormat = @%1$s %2$s %3$s consumerKey = consumerKey consumerSecret = consumerSecret accessToken = acessToken accessTokenSecret = accessTokenSecret
twisearch_ircbot.propertiesの内容のうち、consumerKey、consumerSecret、accessToken、accessTokenSecretはTwitter Developpers https://dev.twitter.com/ より、ログインの後、アプリケーションを作成してaccessTokenを発行してご利用ください。
なお日本語などを入れたい場合には、javaのnative2asciiコマンドを利用してascii化する必要があります。 http://symfo.web.fc2.com/js-sample/jq/sample2.html 以上のようなサイトでも変換できます。
設定の後、
$java -jar twisearch_ircbot-assembly-2.0.jar
で実行することができます。 またIRCのボットが入っているチャンネルにて
ping nickname
とするとWorking now.とnoticeを返します。
コードの中身
メインルーチンは、
TwitterSeacher.scala
def act() = loop { val query = new Query query.setQuery(keyword) query.setSinceId(maxId) query.setResultType(Query.RECENT); val tweets = twitter.search(query).getTweets().reverse if(maxId != 0L) tweets.filter(t => t.getId() > maxId).foreach(sendNoticeToIRC) val count = tweets.filter(t => t.getId() > maxId).size if(count > limitCount && maxId != 0L) sendMessageToIRC(count) tweets.foreach(t => {if(t.getId() > maxId) maxId = t.getId()}) TimeUnit.SECONDS.sleep(intervalSec) }
これだけで表現できています。あとは設定の読込と例外ハンドルだけ。やっぱりScalaは短く書けて良いです。
Scala2.9から2.10への移行作業の健忘録
ただの作業ログです。
build.sbtのscalaVersionを2.10.0に変更
scalaVersion := "2.10.0"
以上のようにする。
Seq#firstをSeq#headに置換
盲目的に置き換え。
Squerylを2.10対応の最新バージョンに。でもリポジトリのURLがおかしいので直接追加
libraryDependencies ++= Seq( "org.squeryl" %% "squeryl" % "0.9.5-6" from "http://repo1.maven.org/maven2/org/squeryl/squeryl_2.10/0.9.5-6/squeryl_2.10-0.9.5-6.jar", "mysql" % "mysql-connector-java" % "5.1.21" )
actor使えなくなるのでakkaへの乗り換え。実装量大。
object actors is not a member of package scala
[error] import scala.actors.Actor
悲しい...。build.sbtに
resolvers += "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/" libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.1.1"
を追加して、あとはakkaのAPIを見ながら実装していきます。
というかActorの作り方も、実装の仕方や例外のハンドリングなんかも基本全然違うのでakkaに合わせて書きなおさないと、変な感じになってしまう。というか書きなおしたほうが早い。