けさらんぱの自由帳

とあるFF14プレイヤーがFF14のこととか関係ないことを書いていく予定のブログです。記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

【FF14】【ID愛でる会Aegis】ラバナスタ観光

愛でる会で不定期にやっている24人レイドの観光、今回はラバナスタに行ってきました。最近では毎週行っているところですが、ゆっくり観光していくと普段とは違うところも見ていくことができます。

パーティ編成

今回はパーティ募集がアライアンスに対応したので、ぶっちゃけてしまうと集合する必要はなかったのですが、今回も今までと同じように集合場所を決めてそこでパーティ編成をしました。今回は、クガネランディングの近くの船の上に集合。出発まで思い思いのことをやっている参加メンバーたち。 f:id:KesaranPa:20180121145112j:plain

みんなログインしたらプライベート募集でパーティを編成して、突入!と思ったら、コンテンツファインダーサーバーのエラーが云々というメッセージ…! どうもアライアンスのリーダーしか申請できないようなのですが、あのエラーメッセージではそのことに気付かずしばらく混乱していました。みんなでよしだああ!!って叫んだあと無事に突入。

ラバナスタ地上部

1ボスは普通に撃破。自分が参加したCアラではメガネがドロップ。今回は不参加だったけど、愛でる会にはメガネ好きで有名なたけおさんがいらっしゃって、ラバナスタ実装初期にはメガネ入手のために随分苦労されていたのですが… f:id:KesaranPa:20180121145138j:plain f:id:KesaranPa:20180121145144j:plain

2ボスはかなり苦戦。砂球が爆発して2回全滅しました。初見の方もいるから仕方ない。撃破したあとの雑魚戦があるエリアには、周囲に赤チョコボの卵っぽいものがあります。オムレツ食べたい… f:id:KesaranPa:20180121145900j:plain

帝国の魔導兵器の残骸。最近戦闘があったとNPCが言っていますが、まだ燃えています。青い炎なのは青燐機関の燃料が燃えてるから、かな。 f:id:KesaranPa:20180121150340j:plain

水路

今回はここで一旦7分くらいの自由時間。

空中浮遊ララフェル。実際には水に浮いているだけなのですが、タレットを水面に置くと水上と水中が両方見えるのでこんなことに。紅玉海では青くなっちゃうのですが、ここの水は透明です。 f:id:KesaranPa:20180121150459j:plain

NPCも話していますが、潜水する場所はかなり水深が深いです。 f:id:KesaranPa:20180121150716j:plain

このエリア、天井を見上げても綺麗です。 f:id:KesaranPa:20180121150737j:plainf:id:KesaranPa:20180121150750j:plain

地下

3ボス、4ボスは特に問題なく撃破。3ボスさん、やっぱりグラフィックの作り込みがすごい。今回は3ボス撃破後に2回目の自由行動。 f:id:KesaranPa:20180121150857j:plain

4ボスの戦闘前、あの仮面がボスの近くに浮いてます。 f:id:KesaranPa:20180121150925j:plain

4ボスの途中で出てくるあの人、スカラタンク装備かな? f:id:KesaranPa:20180121150945j:plain

ダークアルテマ後は仮面が増えます。 f:id:KesaranPa:20180121151004j:plain

啓示の時はしっかり仮面を装着している4ボスさん。 f:id:KesaranPa:20180121151032j:plain

そうこうして無事にクリアしてみんなで集合写真を撮影して終了です。主催してくれたすぱさん、はなおん、本当にありがとうです! f:id:KesaranPa:20180121151119j:plain

Pythonで大量のExcelファイルをいじった話

最近「100個のテキストファイルから一部を取り出して100個のExcelファイルを作る」とか、「100個のExcelファイルの一部のセルを1つのExcelファイルにコピペする」とかいう感じの作業をする必要があって、手作業では面倒すぎるのでPythonのopenpyxlを使ってみました。今回はその時のメモです。

openpyxlは、Pythonからxlsxファイルを読み書きするためのパッケージです(xlsファイルは読み書きできないはず)。Excelを操作するわけではないので注意しないといけない点があるものの、逆にExcelなしでExcelファイルをいじることができます。

準備

Pythonとopenpyxlのインストール

Linuxだと標準でPythonが入っていることが多いのですが、今回はWindows環境で作業する必要がありました。WindowsPythonを動かす方法はいくつかあるみたいですが、自分はAnacondaをインストールしました。この場合、普通にインストールするとopenpyxlも一緒にインストールされます。

基本的な使い方

ファイルの読み込みと書き込み

インポートは次のようにしています。

import openpyxl as px

ファイルの読み込みは

wb = px.load_workbook("src.xlsx")

書き込みは

wb.save("dst.xlsx")

みたいな感じで行います。新規ファイルを作成する場合は

wb = px.Workbook()

らしいです。

シートの操作

シートを作成するときは

ws = wb.create_sheet(title="シート名")

とします。既存のシートを名前で選択して操作するときは

ws = wb["シート名"]

現在アクティブなシートを操作するときは

ws = wb.active

とします。シートの名前は

ws.title = "シート名"

で変更できます。

セルの読み込みと書き込み

セルの中身の読み込みは

data = ws['A1'].value

書き込みは

ws['A2'] = data

でできます。数式も書けます。

ws['A3'] = "=1+2"

簡単!

または

data = ws.cell(row=1, column=1).value
ws.cell(row=2, column=1).value = data

でも読み書きできます。ループではこちらの方が便利かも。

その他

他にもフォントや罫線を変えたり、セルを結合したりできるみたいなのですが、自分の用途ではExcelであらかじめ見た目だけを整えたxlsxファイルを作って、 shutil.copy() でコピーしてから値を変える方が楽だったので試していません。

はまったこと

罫線が壊れる!

結合されたセルに罫線があるExcelファイルを読み込んだ場合、openpyxlでいじってから保存すると罫線が壊れます。既知の問題らしく、海外でMonkeyPatchが紹介されていました。下記はそのままのコピペです。この記述をソースのどこかに書いておきます。 追記:v2.6で修正されるようです。

from itertools import product
import types
import openpyxl
from openpyxl import worksheet
from openpyxl.utils import range_boundaries

def patch_worksheet():
    """This monkeypatches Worksheet.merge_cells to remove cell deletion bug
    https://bitbucket.org/openpyxl/openpyxl/issues/365/styling-merged-cells-isnt-working
    Thank you to Sergey Pikhovkin for the fix
    """

    def merge_cells(self, range_string=None, start_row=None, start_column=None, end_row=None, end_column=None):
        """ Set merge on a cell range.  Range is a cell range (e.g. A1:E1)
        This is monkeypatched to remove cell deletion bug
        https://bitbucket.org/openpyxl/openpyxl/issues/365/styling-merged-cells-isnt-working
        """
        if not range_string and not all((start_row, start_column, end_row, end_column)):
            msg = "You have to provide a value either for 'coordinate' or for\
            'start_row', 'start_column', 'end_row' *and* 'end_column'"
            raise ValueError(msg)
        elif not range_string:
            range_string = '%s%s:%s%s' % (get_column_letter(start_column),
                                          start_row,
                                          get_column_letter(end_column),
                                          end_row)
        elif ":" not in range_string:
            if COORD_RE.match(range_string):
                return  # Single cell, do nothing
            raise ValueError("Range must be a cell range (e.g. A1:E1)")
        else:
            range_string = range_string.replace('$', '')

        if range_string not in self._merged_cells:
            self._merged_cells.append(range_string)


        # The following is removed by this monkeypatch:

        # min_col, min_row, max_col, max_row = range_boundaries(range_string)
        # rows = range(min_row, max_row+1)
        # cols = range(min_col, max_col+1)
        # cells = product(rows, cols)

        # all but the top-left cell are removed
        #for c in islice(cells, 1, None):
            #if c in self._cells:
                #del self._cells[c]

    # Apply monkey patch
    worksheet.Worksheet.merge_cells = merge_cells
patch_worksheet()

値を読みたいのに数式が読まれる!

openpyxlではvalueという属性でデータにアクセスできますが、これでデータを読み出すとExcelでいうところの「値」ではなく「数式」が読み出されます。値を読み出す場合は、ワークブックを開くときに data_only オプションを指定します。

wb = px.load_workbook(filename, data_only=True)

ちなみに、Excelでxlsxファイルを保存すると、数式のセルは数式と値の両方がファイルに書き込まれますが、openpyxlでは数式しか書き込まれません。もしopenpyxlで数式を書き込んだファイルからそのまま値を読み出すとNoneが読み出されます。そのため、openpyxlで数式を書いたファイルから値を読み出すには、一度Excelでファイルを開いて保存する必要があります。

【FF14】【ID愛でる会Aegis】スカラ観光

スカラの観光に行きたい、と数日前から言っていたのですが、今日やっと行けました。一緒に行ってくれたみんなありがとう!!

いつもの雑まとめです。

1ボスまで

地面からは赤と白のちょっと変わった植物のようなものが生えています。塩湖の底なので、海藻のようなものなのかも知れません。自分はこれを見て、お刺身によくついてくる海藻を思い出しました。多分別物だとは思いますが。

f:id:KesaranPa:20171104023750j:plain

近くには大きな結晶があります。他のIDだとこういうのはだいたいクリスタルなのですが、ここでは塩の結晶ではないかと思います。

f:id:KesaranPa:20171104023539j:plain

そして魚卵。なんだかお腹が空いてきました…

f:id:KesaranPa:20171104024242j:plain

1ボス

f:id:KesaranPa:20171104024518j:plain

このボスは、戦闘が開始されるまで戦闘フィールドをうろうろしています。もしかしたら視界に入らないようにしたら後ろに回り込めるのではと思ったらできてしまいました。その後すぐに見つかってしまいSSは撮れませんでしたが。

2ボスまで

道中の柱に模様があります。下のほうの小さいものは最初文字かと思ったのですが、模様が欠けているだけのようです。その上の大きめの模様は何なんだろう。ゲルモラ関連の場所にゲルモラのシンボルがあるように、これがスカラのシンボルなのかも。

f:id:KesaranPa:20171104025009j:plain

そしてこのエリアは天井にところどころ穴があります。でも真っ白で何も見えません。このSSを撮ったときはエオルゼア時間で夜だったので、このIDは時間が固定されているIDのようです。

f:id:KesaranPa:20171104025518j:plain f:id:KesaranPa:20171104025525j:plain

道中、食器が置いてあるのですが、このIDの奥の方にあるものと違い、財宝という感じではありません。もしかしたらスカラの人々が使用していた物なのかも。でもなんでこんな所にぽつんと置いてあるんだろう。

f:id:KesaranPa:20171104030036j:plain

2ボス

f:id:KesaranPa:20171104030617j:plain

このボスは、時々ファットキャットが中にいます。今回はいなかったのですが、いるときは円形範囲攻撃のときに出てきます。以前撮影したのがこれです。いたりいなかったりするのはシュレディンガーの猫的な話なのでしょうか。それともファットキャットは何かを企んで光の戦士を倒そうとしている…?

f:id:KesaranPa:20171104030624j:plain

3ボスまで

薄暗いダンジョンでよくある、誰がこの蝋燭点けているんだ、っていうやつです。細かいことは考えないことにしましょう。

f:id:KesaranPa:20171104031401j:plain

このエリアの最初の方で、見たことのある大砲が置いてあり、この場所からアラミゴの財宝が置いてあるのだとわかります。

f:id:KesaranPa:20171104031604j:plain

その財宝ですが、ミイラが落ちている近くだったり、ミイラの上に置かれていたりします。これは多分、スカラ時代にお墓だったものを、テオドリックさんが財宝を置くためにミイラを移動させて財宝をつめたんじゃないかと思います。しかしミイラも財宝も置き方が雑です。テオドリックさんの性格かな?

f:id:KesaranPa:20171104031911j:plain f:id:KesaranPa:20171104031921j:plain f:id:KesaranPa:20171104032209j:plain

そしてこのエリアにはところどころに肖像画があります。全て違う人のようですが、一体誰なんだろう。

f:id:KesaranPa:20171104032629j:plain f:id:KesaranPa:20171104032637j:plain f:id:KesaranPa:20171104032644j:plain

テオドリックさんのお抱え呪術師が設置したと思われる祭壇。中央の骨は何なんでしょう。アルドゴートかと思うのですが、呪術師がザナラーンから持ってきたのかな。

f:id:KesaranPa:20171104033110j:plain

そして最後のボス前の封印。この手の模様、いろんなIDで見かけますが、この模様はここ以外で見たことない気がします。

f:id:KesaranPa:20171104033118j:plain

記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。