2014/12/31

GTX970

きのう届いたので、昨日のバハからさっそく使ってみてました。

OBS の nvenc エンコーダ機能を使用して 1920x1080 で録画しつつ、コンテンツにいってみたところ、60 FPS キープで OBS の CPU 利用率も 2~3%という、とても理想的な結果になりました。

これでどんどん録画していける……!

 

気になってたコイル鳴きは、最高設定でかすかにジリリと鳴る程度でした。

ファンの音のほうがはるかに大きいので、個人的にはとくに問題ありませんでした!

バハ弓げっと!

2014 年内に今週のバハを終了することができました!

そして、

image

弓ゲット!

よいお正月を迎えられそう!

ヒーラー胴の 2 着目もでたらしい!

image

動画ファイルのキャプチャで画質が低くなっちゃってるけど、おそろいのお写真。

かっこいい!

2014/12/29

ポチり

STRIX-GTX970-DC2OC-4GD5

そろそろ HD5870 では力不足かなとおもってあたらしいグラボを探してたら、GTX970 の評判が(コイル鳴き以外は)よかったのでポチり。延長保証付けて約 5 万円なり。

コイル鳴きは 120 FPS 以上で回したときに発生するという情報がけっこうあったので、FF14 を 60 FPS 制限でやるならたぶん問題ないかな?

鳴ったら運が悪かったということで……。

2014/12/28

くさい

ffxiv_20141228_113246

2014/12/26

ドドーン

木工★4 がつくれるようになった記念に、ベッドを作ってみた!

ffxiv_20141224_023055

でかい。しかもダブルベッドだった。

ララフェルなら円形に並んで 10 人くらい寝られそうでござる。

染色不可だったのがちょっと残念。

2014/12/23

マメット・レターモーグリ

どるしーさんがミニオンをもらったみたいなので、見せてもらってきた!

ffxiv_20141223_022342

ffxiv_20141223_022450

モーグリを近づけると踊り出す!

2014/12/22

真成 4 層詩人メモ

やりつつメモってたものを修正して晒してみる。

詩人はダメージを追求する以外本当にやることがなくて、色々と申し訳ない気持ちでいっぱいなのでありました。

構成はナ戦白学モ竜吟黒。

 

★装備

  • HP 6650
  • 命中 532

 

★フェイズ 1

  • 開幕前レクイエム → 開幕バトボ → バフ&霊薬ぜんぶのっけて乱れ。
  • 最初のアースシェイカーあたりで歌を切る。
    • 歌い切ってフェイズ 2 のパイオンを短縮するほうがいいかも。
      • 歌い切るとやっぱり TP たらなかった。ざんねん。
  • 気休めに毒も入れる。

 

★フェイズ 2

  • ギガフレア着弾したら、バハ誘導位置にフレイミングを落とす。あとは咆哮のたびにバハ誘導地点にフレイミングを落とす。
  • 最初の雑魚をたおしたらパイオン。
    • 雑魚フェイズで TP あまりがちなので、フルにうたわなくてもいい気がする。次回試す!
      • Proc の発動状況によっては TP が足りなくなる模様。雑魚への DoT をやめればたぶん行ける?
  • 咆哮直前に DoT の残り効果時間に応じて DoT を更新しておく。
  • 雑魚への DoT はいまいちかもしれない。
    • いまいちではないけど、TP が尽きてしまうようなら入れなくてもいいと思う。
    • 入れるなら初撃のウェイトが重いベノムだけ使うといいかもしれない。お好みで。
  • 最後の雑魚を倒した辺りで乱れと霊薬の CT が回復するので、乱れの CT が回復し次第、すぐにつかってダメージを稼ぐ。すぐ使わないとフェイズ 4 のフルバフ開幕に霊薬の CT が微妙にまにあわないかも。
  • 気休めに毒も入れる。

 

★フェイズ 3

  • ペイン → ブラッド → ガスト×3 → シン×2 → (休憩タイム) → ストーム → ブラッド(湧いたら優先)→ シン(湧いたら優先) → ストーム → ガスト×2 → ペイン
  • 1 回目と 2 回目のダイブ中はちゃんとバラードを入れる。よくわすれる!
  • ブラッドはすぐ死ぬ虚弱体質な上に、ダメージの有効無効が切り替わる関係上、DoT 効率がとても悪い。普通に殴ってた方がよさげ。
  • 雑魚への攻撃よりも、ストームへの DoT 更新を優先するほうがよさそう。シンとかはよほどのことがない限り、削りが遅れてもだいじょうぶ。
  • フェイズ 4 開幕までにリキャ回復が間に合わなくなるようなバフ回しはしない。時間固定のフェイズ 3 で必要以上に火力を出しても意味がないでござる。
    • 攻撃は黒に任せて、できる限り省エネ運転を心がける。範囲攻撃とかは無駄に TP を消費するだけなので、どうしても火力が足りないときのみ。
    • フェイズ 4 開幕時にバフが全部使用可能で、TP が 1000 の状態になるようにする。
      • MP は必要量確保できていればもんだいなし。
  • 最後のペインをはやく倒しすぎてしまうと、モンクのコンボ&迅雷が切れてフェイズ 4 の火力がおちてしまいそう(な気がする)。
    • なので拘束具に乗ったら殴らずにバラだけ歌う。
      • ヒーラーの MP に余裕があるならパイオン。
    • TP 管理の意味もあり。

 

★フェイズ 4

  • 開幕フルバフ霊薬乱れ。
  • 1000MP 分くらいのパイオンを入れておくと最後まで切れないかも?
  • あとはヒーラーの MP 状況を見てバトボバラードを歌えばおっけー。
    • 無事故でヒラさん達が上手ければバラード不要だった!
      • その場合はパイオンにバトボ入れておけばいいかも。他 DPS さんの TP 状況わからないからなんとも。 
      • 事故による MP 枯渇のリスク無視するならフェイズ 4 開幕前にバトボレクイエムを歌っておけば最大効率になるかも。
  • 時間切れギリギリあたりでもう一度霊薬がつかえる。乱れ待ってると時間切れが来るかもなので、さっさと使っちゃうのが良いかも。
    • ただし宝箱開封&記念撮影の儀で花火が使えなくなる問題が……。
  • 気休めに毒も入れる。

 

★歌まとめ

  • フェイズ 1
    • 開幕レクイエム+バトボ(初回アースシェイカーで切る)
  • フェイズ 2
    • 雑魚 1 匹目倒した直後にパイオン(MP 尽きるまで)
  • フェイズ 3
    • ダイブ 1 回目& 2 回目中にバラード(雑魚が出たら切る)
    • 最後ペインのみになったらバラード適量
  • フェイズ 4
    • ヒーラーの MP が 1500 を切ったらバトボバラード適量
    • 自分の TP が尽きてきたらパイオン適量

真成 4 層くりあ!

ffxiv_20141222_000650

固定のみんなありがとう!

2014/12/20

himechan 修行

白修行で極シヴァをぐるぐるぐるぐる。

13 箱目でようやく杖ゲット。

 

↓ himechan ちゃんの香りがするスクリーンショット。ドヤァ。

ffxiv_20141220_050100

2014/12/19

ツリー&だるま

image

ピカァ…

2014/12/18

コガネムシ

ピカァ……

image

ゾディアックでぐるぐるぐるぐるしてたら 500 MIP 貯まってたらしい

次は 1500 MIP……

2014/12/15

近況

囲炉裏をつくりました

image

タタミマットは作れませんでした(タカイ)

image

シャワーをつくりました

image

与一をつくりました

image

 

クリスマスに合わせて内装変えたい

しかしシヴァの照明にするとボム祭りのやつが消えてしまうというジレンマ

 

おわり

2014/10/13

Highcharts

Highcharts を使って気温と気圧を重ねて表示できるようにしてみた。

すごい高機能で表示も綺麗なライブラリだけど、非商用利用の場合はフリーで使えるらしい。

動作サンプルが重いかもしれないので追記で。

2014/10/11

気圧計

台風が直撃しそうな感じなので、秋月の通販で気圧センサーモジュールを買ってみた。

LPS331 というセンサーが使用されているらしい。インタフェースは I2C。

以前買った温度センサーモジュールと配線を共有させる必要があるので、

image

こんな感じの単純な回路をユニバーサル基板で作った。JP1 は Raspberry Pi に繋ぐためのピンヘッダ。JP2 は温度センサー用のソケット。IC1 は今回買った気圧センサーを刺すためのソケット。

ショートのチェックをして、さっそくモジュール刺して使ってみる。

pi@raspberrypi ~ $ sudo i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- 18 -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- 5d -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --

0x18 は温度センサー。0x5d が今回の気圧センサー。

説明書によると、まずは WHO_AM_I レジスタ(0x0F)を読んでみて、値が 0xBB であることを確かめることで接続をチェックするらしい。

pi@raspberrypi ~ $ sudo i2cget -y 1 0x5d 0x0f
0xbb

おっけー。

次に、CTRL_REG1 レジスタ(0x20)に 0b10010000 を書き込むことで、アクティブモードにするらしい。データシートによると、これは気圧と気温を 1 秒に 1 回計測するモードらしい。

pi@raspberrypi ~ $ sudo i2cset -y 1 0x5d 0x20 0x90

あとは PRESS_OUT_H レジスタ(0x2A)、PRESS_OUT_L レジスタ(0x29)、PRESS_POUT_XL_REH レジスタ(0x28)をそれぞれ読み込んで、得られた 24 bit の値を 4096 で割るとヘクトパスカルで気圧が出てくるらしい。

pi@raspberrypi ~ $ sudo i2cget -y 1 0x5d 0x2a; sudo i2cget -y 1 0x5d 0x29; sudo i2cget -y 1 0x5d 0x28
0x3f
0xf9
0x1e

counts = 0x3FF91E = 4192542
pressure = 4192542 / 4096 = 1023.56982421875 [hPa]

いいかんじででてきた。

↑と同じようなことをするスクリプトを Python で書いて、気圧も 1 分ごとにデータベースに記録するようにしてみた。気圧取得部分のスクリプトはこちら。

グラフにしてみた図

image

高気圧が近づいてる感じらしい。

2014/09/27

室温モニタ

結局こんな感じに落ち着いた。

image

グラフ表示部に Google Charts の Annotated Time Line、カレンダー部に jQuery UI の datepicker を使ってみた。

Daily モードにすると、選択した日の 1 分刻みのデータをプロットして、Monthly モードにすると、その月のデータを 1 時間刻みでプロットするかんじ。

Monthly のデータの取り出しには

$targetDateString = $date->format("Y-m");
$daysInTheMonth = $date->format("t");

$query = "select
            date_format(ts, '%Y/%m/%d %H:00:00') as ts,
            avg(temp) as temp
          from sensor_db.room_temperature
          where ts between str_to_date('$targetDateString-01 00-00-00', '%Y-%m-%d %H-%i-%s') and
                           str_to_date('$targetDateString-$daysInTheMonth 23-59-59', '%Y-%m-%d %H-%i-%s')
          group by date_format(ts, '%Y-%m-%d-%H');";

こんな感じのクエリを使ってみた。

なかなか楽しい。

2014/09/26

温度センサー

WLAN のアクセスポイントと化している Raspberry Pi で室温を記録してみようかと思って温度センサーを買ってみた。I2C で通信できるやつ。

スイッチサイセンスで 600 円くらい。MCP9808 というチップが乗ってるらしい。

とりあえず、ピンをはんだ付けして、3.3V、GND、SDA、SCL にそれぞれワイヤを接続し、 i2cdetect をしてみる。

pi@raspberrypi ~ $ sudo i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- 18 -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --

0x18 にいるらしい。データシートを見ると、A0、A1、A2 に 3.3V を接続することでアドレスを変更できるようなことが書いてあった。今回はどのピンも接続してないので、0b0011000 = 0x18。あってる。

偉い人が既に Python のライブラリを書いてくれているので、それを使ってさっそく温度を取得してみる。

pi@raspberrypi ~/repos/Adafruit_Python_MCP9808 $ sudo python
Python 2.7.3 (default, Mar 18 2014, 05:13:23) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import Adafruit_MCP9808.MCP9808 as MCP9808
>>> sensor = MCP9808.MCP9808()
>>> print "Temp: %f" % sensor.readTempC()
Temp: 24.125000
>>> quit()

良い感じに読み取れた。目的は部屋の温度を記録することだったので、MySQL のデータベースに記録してみることにした。適当にタイムスタンプと float のテーブルを作って、

import Adafruit_MCP9808.MCP9808 as MCP9808
import MySQLdb

sensor = MCP9808.MCP9808()
sensor.begin()

temp = sensor.readTempC()

connection = MySQLdb.connect(db="sensor_db", user="sensor", passwd="********")
cursor = connection.cursor()
cursor.execute("insert into room_temperature values(now(), %.3f);" % temp)
cursor.close()
connection.commit()
connection.close()

こんなコードを cron で毎分動かす感じにした。

表示は PHP から MySQL にアクセスしてテーブルを取得して json_encode で JSON 形式に変換し、Google Charts API の Annotation Chart で表示するようにしてみた。コードは長いので割愛。

つまずいたのは、タイムスタンプを PHP のテーブルに突っ込むところくらい。日付の文字列をそのまま突っ込んでも、DateTime 型のオブジェクトを突っ込んでもダメだった。

正解は、カラムのタイプを datetime にして、データは

$dt = new DateTime($row['ts']);
$ts_data = "Date" . $dt->format("(Y, m, d, H, i, s)");

こんな感じの文字列で突っ込んであげればおっけーでした。

完成図がこちら。

image

いいかんじで記録してくれてる。

毎分記録してるのでログ容量がすごいことになりそうとおもって調べてみたけど、データベースサイズは 9 時間で約 50 KB くらい。一日 135 KB。一年で 50 MB。余裕でござりました。

2014/07/20

エオルゼア時間

の計算方法。

普通に日本標準時を (3600 / 175) 倍すればいいらしい。

JavaScript で書くとこんなかんじらしい。

動かすとこんな感じ ⇒

これで天候待ちもこわくないぜ……!

2014/07/19

MineFactoryReloaded on 1.7.2

英語圏からのアクセスが多くて、しかも情報が古かったのでその方たち向けに。

For English readers:

This is an instruction to build the CoFHLib/Core and MineFactoryReloaded for Minecraft 1.7.2. Please DO NOT ASK ABOUT THIS ARTICLE TO THE ORIGINAL MOD AUTHORS.

First, download the portable-git and Apache Ant and set the PATH to these softwares.

Next, you have to checkout previous revision like below because current version of these MODs are currently targeted for 1.7.10. (Of cource, you can build latest version of the source codes without modification if you are playing on the 1.7.10 already):

git clone https://github.com/CoFH/CoFHLib.git
cd CoFHLib
git checkout ab02b8c41c63bcdb8438899dc09a9926947ba709
cd .. git clone https://github.com/CoFH/CoFHCore.git cd CoFHCore git checkout 56645a1161e30ef79b59d85c1ea5a20c41ab3a2f cd .. git clone https://github.com/skyboy/MineFactoryReloaded.git cd MineFactoryReloaded git checkout a38537c72f5803e0a93c7a5188bf157b23aba6aa cd ..

And you have to modify CoFHCore\build.xml and MineFactoryReloaded\build.xml like below to download correct version of CoFHLib/CoFHCore’s source codes on the build:

CoFHCore\build.xml:

at line 94, replace:
        <get src="https://github.com/CoFH/CoFHLib/archive/master.zip" dest="${download.dir}/CoFHLib.zip"/>
into
        <get src="https://github.com/CoFH/CoFHLib/archive/${cofh.lib.revision}.zip" dest="${download.dir}/CoFHLib.zip"/>

at line 99, replace:
        <javac srcdir="${download.dir}/CoFHLib-master/src/main/java" destdir="${compile.dir}"
into
        <javac srcdir="${download.dir}/CoFHLib-${cofh.lib.revision}/src/main/java" destdir="${compile.dir}"

at line 41, append:
    <!-- CoFH revisions -->
    <property name="cofh.lib.revision" value="ab02b8c41c63bcdb8438899dc09a9926947ba709" />

MineFactoryReloaded\build.xml:

at line 90-91, replace:
        <get src="https://github.com/CoFH/CoFHCore/archive/master.zip" dest="${download.dir}/CoFHCore.zip"/>
        <delete dir="${download.dir}/CoFHCore-master" failonerror="false"/>

into
        <get src="https://github.com/CoFH/CoFHCore/archive/${cofh.core.revision}.zip" dest="${download.dir}/CoFHCore.zip"/>
        <delete dir="${download.dir}/CoFHCore-${cofh.core.revision}" failonerror="false"/>

at line 122, replace:
        <get src="https://github.com/CoFH/CoFHLib/archive/master.zip" dest="${download.dir}/CoFHLib.zip"/>
into
        <get src="https://github.com/CoFH/CoFHLib/archive/${cofh.lib.revision}.zip" dest="${download.dir}/CoFHLib.zip"/>

at line 127, replace:
        <javac srcdir="${download.dir}/CoFHLib-master/src/main/java" destdir="${compile.dir}"
into
        <javac srcdir="${download.dir}/CoFHLib-${cofh.lib.revision}/src/main/java" destdir="${compile.dir}"

at line 137, replace:
        <delete dir="${download.dir}/CoFHLib-master"/>
into
        <delete dir="${download.dir}/CoFHLib-${cofh.lib.revision}"/>

at line 143, replace:
        <javac srcdir="${download.dir}/CoFHCore-master/src/main/java" destdir="${compile.dir}"
into
        <javac srcdir="${download.dir}/CoFHCore-${cofh.core.revision}/src/main/java" destdir="${compile.dir}"

at line 190, replace:
        <copy file="${download.dir}/CoFHCore-master/src/main/resources/CoFH_at.cfg" tofile="${transformers.dir}/z_CoFH_at.cfg"/>
into
        <copy file="${download.dir}/CoFHCore-${cofh.core.revision}/src/main/resources/CoFH_at.cfg" tofile="${transformers.dir}/z_CoFH_at.cfg"/>

at line 45, append:
    <!-- CoFH revisions -->
    <property name="cofh.core.revision" value="56645a1161e30ef79b59d85c1ea5a20c41ab3a2f" />
    <property name="cofh.lib.revision" value="ab02b8c41c63bcdb8438899dc09a9926947ba709" />

And then, build the MODs like below:

cd CoFHLib
gradlew build
cd ..\CoFHCore
ant
cd ..\MineFactoryReloaded
ant

Finally, copy the built MOD files and CodeChickenCore for 1.7.2 into your mods folder.

As you know THESE MODS ARE UNDER THE DEVELOPMENT. Please understand there is a risk to damage your world data and do your own risk.

2014/07/03

自動丸石生成機 MOD

ThermalExpansion のアレが 1.7.2 環境で使えないとなかなか不便だったので劣化版を自力で作ってみた。

丸石のみに対応。動力は神秘のマグマパワーで稼働(動力不要)。

レシピ。

image

UI はかまどをそのまま流用。下にマグマバケツ、上に水バケツを入れると動き始める。

image

 

ダウンロードはリリースページにて。無駄にソースも公開中。

2014/06/26

MineFactoryReloaded on 1.7.2

English version here (2014/07/19).

とりあえず動いたのでやりかたをメモ。

D:\dev> set PATH=%PATH%;D:\tools\apache-ant-1.9.4\bin ←antのパス。ビルドに必要。
D:\dev> set PATH=%PATH%;D:\tools\gradle-1.12\bin ←gradleのパス。付属の gradlew.bat を使うならいらない。
D:\dev> set PATH=%PATH%;D:\tools\PortableGit-1.9.4-preview20140611\cmd ←gitのパス。ソース取得用。
D:\dev> set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_60
D:\dev> git clone https://github.com/CoFH/CoFHLib.git
D:\dev> git clone https://github.com/CoFH/CoFHCore.git
D:\dev> git clone https://github.com/skyboy/MineFactoryReloaded.git
D:\dev> cd CoFHLib
D:\dev\CoFHLib> gradle build
D:\dev\CoFHLib> cd ..\CoFHCore
D:\dev\CoFHCore> ant ←gradleのダウンロードにすごく時間がかかることがあるので、build.xmlの237行目にある"./gradlew"を"gradle"に変更してから実行
D:\dev\CoFHCore> cd ..\MineFactoryReloaded
D:\dev\MineFactoryReloaded> ant

あとは、CoFHLib\build\libs\CoFHLib-1.7.2R1.0-CUSTOM_BUILD.jar、CoFHCore\build\dist\CoFHCore-[1.7.2]3.0.0B1-CUSTOM_BUILD.jar と MineFactoryReloaded\build\dist\MineFactoryReloaded-[1.7.2]2.8.0B2-CUSTOM_BUILD.jar を mods フォルダに突っ込めば導入完了。

ss

↑ゴムの木

CoFHLib/Core が 1.7.2 対応してきたってことは、ThermalExpansion もそろそろ対応してくるのだろうか。楽しみでござります。

※当然だけど、これらは開発中のものであり、mod 開発者やいち早く触ってみたい物好きな人用のものなので、安定性を重視する人にはオススメできません。普通の人は開発者からの配布を待った方がよさそうです。

2014/06/07

BinaryWriter.Write(string) と StreamWriter.Write(string)

いろいろ違うらしい。以下のようなテストコード作成していろいろ確認してみた。

using System;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            var str = "Hello World!";

            Console.WriteLine("Input = {0}", str);

            Console.WriteLine("");
            Console.WriteLine("GetBytes (UTF8 with BOM)");
            DisplayBytes(GetBytes(str, true));

            Console.WriteLine("");
            Console.WriteLine("GetBytes (UTF8 without BOM)");
            DisplayBytes(GetBytes(str, false));

            Console.WriteLine("");
            Console.WriteLine("BinaryWriter (UTF8 with BOM)");
            DisplayBytes(BinaryWriter(str, true));

            Console.WriteLine("");
            Console.WriteLine("BinaryWriter(UTF8 without BOM)");
            DisplayBytes(BinaryWriter(str, false));

            Console.WriteLine("");
            Console.WriteLine("StreamWriter (UTF8 with BOM)");
            DisplayBytes(StreamWriter(str, true));

            Console.WriteLine("");
            Console.WriteLine("StreamWriter (UTF8 without BOM)");
            DisplayBytes(StreamWriter(str, false));

            Console.WriteLine("");
            Console.WriteLine("StreamWriter2 (UTF8 with BOM)");
            DisplayBytes(StreamWriter2(str, true));

            var longString = new String('A', 0x100);

            Console.WriteLine("");
            Console.WriteLine("BinaryWriter (long string, length: 0x{0:X})", longString.Length);
            var bwlong = BinaryWriter(longString, true);
            DisplayBytes(bwlong);
            int size;
            Console.WriteLine(
                "DecodeLEB128: Value = 0x{0:X}, Size = {1}",
                DecodeLEB128(bwlong, out size),
                size);

            Console.ReadKey();
        }

        static byte[] GetBytes(string str, bool withBOM)
        {
            return new UTF8Encoding(withBOM).GetBytes(str);
        }

        static byte[] BinaryWriter(string str, bool withBOM)
        {
            using (var ms = new System.IO.MemoryStream())
            {
                var writer = new System.IO.BinaryWriter(ms, new UTF8Encoding(withBOM));
                writer.Write(str);
                writer.Flush();

                return ms.ToArray();
            }
        }

        static byte[] StreamWriter(string str, bool withBOM)
        {
            using (var ms = new System.IO.MemoryStream())
            {
                var writer = new System.IO.StreamWriter(ms, new UTF8Encoding(withBOM));
                writer.Write(str);
                writer.Flush();

                return ms.ToArray();
            }
        }

        static byte[] StreamWriter2(string str, bool withBOM)
        {
            using (var ms = new System.IO.MemoryStream())
            {
                ms.Seek(1, System.IO.SeekOrigin.Begin);

                var writer = new System.IO.StreamWriter(ms, new UTF8Encoding(withBOM));
                writer.Write(str);
                writer.Flush();

                return ms.ToArray();
            }
        }

        static void DisplayBytes(byte[] bytes)
        {
            Console.WriteLine(string.Join(" ", bytes.Select<byte, string>(x => x.ToString("X2"))));
        }

        static int DecodeLEB128(byte[] bytes, out int size)
        {
            int result = 0;
            int shift = 0;
            size = 0;

            while (true)
            {
                var b = bytes[size];
                size++;
                result |= (b & 0x7F) << shift;
                if ((b & 0x80) == 0)
                {
                    break;
                }
                shift += 7;
            }

            return result;
        }
    }
}

結果

Input = Hello World!

GetBytes (UTF8 with BOM)
48 65 6C 6C 6F 20 57 6F 72 6C 64 21

GetBytes (UTF8 without BOM)
48 65 6C 6C 6F 20 57 6F 72 6C 64 21

BinaryWriter (UTF8 with BOM)
0C 48 65 6C 6C 6F 20 57 6F 72 6C 64 21

BinaryWriter(UTF8 without BOM)
0C 48 65 6C 6C 6F 20 57 6F 72 6C 64 21

StreamWriter (UTF8 with BOM)
EF BB BF 48 65 6C 6C 6F 20 57 6F 72 6C 64 21

StreamWriter (UTF8 without BOM)
48 65 6C 6C 6F 20 57 6F 72 6C 64 21

StreamWriter2 (UTF8 with BOM)
00 48 65 6C 6C 6F 20 57 6F 72 6C 64 21

BinaryWriter (long string, length: 0x100)
80 02 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 4
1 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 4
1 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 4
1 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
DecodeLEB128: Value = 0x100, Size = 2

わかったこと

  • Encoding.GetBytes、BinaryWriter.Write(string)、StreamWriter.Write(string) のすべてで null 終端文字は書き込まれない。
  • BinaryWriter.Write(string) は、文字列データの先頭に文字長プリフィックスなるものがつくらしい。
    • 文字長プリフィックスは LEB128 というフォーマットで文字長を記録しているらしい。
  • StreamWriter,Write(string) は UTF8Encoding の BOM が有効な場合で、かつストリーム位置が先頭のときに限り BOM を書き込む。

気をつけないと予期しない結果になりそうでありました。

2014/06/03

OBS Studio

しばらく見てないうちに OBS の次期バージョンである OBS Studio の開発が進んでたのでビルドしてみた。

動かしてみた図が

image

こんなかんじ。

パッと見てわかるのが、ステレオミキサー機能が追加されてて、音声の管理が楽になったところ。音声ソースとしてプラグインや音声キャプチャが使用でき、それぞれ調整可能なので、いろいろ応用ができそう。

Ustream で配信を試してみたところ

image

ちゃんと配信機能も実装されてる模様。

まだちょっと時間がかかりそうだけど、開発は着実に進んでるっぽいので期待しております。

2014/06/01

4層メモ(学者編)

フェイズ1

セレネを使用。最初にバトボレクイエムが入るので、魔法速度からはじめたほうがいいきがする。

ビークとその爆発で盾を殺さないように気を付ける。危険なポイントは、

  • 初回のメテオストリーム後のビーク
  • 2 回目のメテオストリーム後の毒の爆発
  • 3 回目のメテオストリーム後の毒の爆発

の 3 箇所。ここは鼓舞バリアをしっかりと入れないと盾が死ぬ。

あとは本で殴りつつ全力で攻撃に参加する。学者ががんばれば通常構成でダスト 4 つも割と可能。

 

フェイズ2

回復は白に任せて攻撃に専念。6 連続メテオの 20 秒くらい前(セレネの2回目のバフを発動させた直後あたり)に迅速を使わずにエオスに切り替え、メテオ直前に囁き。メテオ中に迅速で範囲回復。

メガフレア 10 秒前あたりで範囲回復してバリアを張り、そのあとに陣とエオスの魔法防御を張る。

 

フェイズ3

わいヴぁーんのデッドリーに要注意。2 回目の天地後に回復が薄くなりがちなので注意する。

あとは適切にギミックを処理できれば問題なしだとおもう。

天地の集合場所については詩人編と同様。学者の場合は本でネール殴ってるのもいいかも。

 

フェイズ4

未知の領域。5 連クロウで盾を殺さないように注意すること。

4層メモ(詩人編)

フェイズ1

開幕レクイエム+バトルボイス。召喚がいる場合はバトルボイスを召喚がタゲ取る直前に。

開幕のバフ回しで乱れ撃ちを後の方に回してしまうと、2 回目のメテオストリーム時に乱れが撃てない無駄な時間ができるので早めに使うといいかも。でも結局ゴーレムフェイズで調整を入れるから気にする必要はないかもしれない。

2 回目のダラガブダイブのあと辺りに回復するバフは使わずにとっておく。

 

フェイズ2

召喚がいる場合はネールが飛んだ直後にバラード。メテオ 3 個が落ちたらレクイエム。

青のタゲは静者を使ってリューサンあたりに取ってもらって、詩人は 3 体のゴーレムに DoT をばらまいた方が効率が良い。モードチェンジ後、青に静寂スタンバイ。MP500 くらいになったら歌終了。最後のゴーレム倒す直前にバラード開始。

6 連メテオはマラソン方式で、マラソン終了したらバラード終了。TP がきつい場合はパイオンも考慮に入れるけど、基本平気なはず。

捨身と発勁をここで使用。歌はなし。猛者・乱れ・ホークアイは使わない。

 

フェイズ3

召喚がいる場合はネールが落ちてくる直前にレクイエムを歌う。黒の場合は天地の後で良い気がする。

1 匹目のわいヴぁーんに全力を出す感じ。

詩人を含む遠隔職の場合は天地前に集合地点に集まる必要はなく、集合地点から 60~80 度くらい右 or 左回り側に陣取っておけばノヴァも安心。ただし、拘束解除が必要な場合は間に合わなくなる可能性があるので、その辺は柔軟に。

あとは単純に火力を出すだけ。ワイバーンポップ直前に DoT を入れなおすといいかもしれないくらい。

 

フェイズ4

未知の領域。とりあえず、死ななければ火力を詰める必要はあまりないらしい。

2014/05/09

PS4版FF14

なんと G300 ちゃんのオンボードメモリに保存したキーバインド設定は PS4 上でも有効だったので、G300 を使えば PC 版とまったく同じ操作感でプレイすることが可能なのであった。

Share ボタンをポチポチすると、お手軽に最大15分間の録画をすることが可能なのであった。バハは 11~13 分制限なので問題ないけど、仮に 15 分超えてもファイル分割で記録される模様。ただし切れ目が入るらしい。

プライベートに設定した Ustream チャンネルに配信を垂れ流してリモートコンソールの録画ボタンを押せば、720p 画質で記録しまくれる気がするのであった。試してないけど。

HDCP も解除できるようになったので、PC 側で録画するのも簡単になったのであった。でも 1080p で録画できる環境がないのであった。

2014/02/22

蒸気ボイラーの燃料消費

最近 MOD 満載のマインクラフトをやっていたりするのだけど、ちょっと気づいたことがあったのでメモ。

Railcraft という MOD に蒸気ボイラーという設備があって、低圧 36 型の蒸気ボイラー・500 ℃の状況下では木炭 1 個で 10 秒持つとか書いてあったので実際に作ってみたら、どう見てもそんなに長く燃えてないように見えたので調査。