にわかプログラマーにけやのお砂場

主に教科書的なプログラミングについて書きます。たまに趣味とか。

グラブルのおすすめのサイドストーリー【初心者向け】

今回はCygamesのグランブルファンタジーから。

サイドストーリーって?

グラブルのサイドストーリーとは、過去に開催されたイベントを復刻開催する恒常イベントです。 イベントでの出番が多いキャラクターの背景が描かれたイベントやシリーズ化されたイベントを恒常で開催することで新イベントでのシナリオに置いてかれることがないようになっています。

加入キャラクターについて

各サイドストーリーには条件を満たすことで加入するキャラクターが存在します。
うち信頼度で加入するキャラクターはサイドストーリーが恒常開催のため実質的な即加入なのですが、信頼度を最大にするまでフェイトエピソードが閲覧できません。

加入するキャラクターは現在全てSRであり、初心者にとってはありがたい手軽な戦力向上手段です。
また、イベント加入であるからといって弱いわけではなく、役割をもたせればかなり強いキャラであることもしばしばです。

取っておきたいキャラとしてはかばう持ちのユーリ(若き義勇を振るう剣)、通常攻撃を行わないものの強力なアビリティと高い奥義ダメージで援護するルリア(どうして空は蒼いのか)が挙げられます。

狙い目の交換アイテム

サイドストーリーではストーリーシナリオ終了後に解禁されるボス討伐クエストをクリアすることで手に入るトレジャーとアイテムを交換することができます。
以下では狙い目となるアイテムについて書いていきます。

  • レジェンドガチャチケット
  • リクシルハーフ、ソウルシード
  • 栄光の証、覇者の証
    全サイドストーリーで交換可能なアイテムです。
    リクシルハーフとソウルシードは交換レートが安くて手に入りやすいのが魅力ですが日毎の交換上限があるため注意が必要です。
    栄光の証や覇者の証は後々で使い道があるため今のうちに交換しておくといいですね。

  • ネフティスフォーク(臆病勇者と囚われの姫君)
    風属性の通常攻刃(大)武器です。序盤から入手が可能で上限解放が容易なため武器が揃ってくる中盤まで使える武器です。

  • ヱビス(薫風、白波を蹴立てる)
    召喚効果に水属性防御DOWNという効果がついている召喚石。
    水属性防御DOWNは防御DOWNと重複するため序盤では有用な召喚効果です。
    加護もそこそこ有用ですが最後まで上限解放しないとダブルアタック率が低下してしまうので注意が必要です。

  • トリアイナ(若き義勇の振るう剣)
    水属性の通常攻刃(大)武器です。ポセイドンが厄介な状態異常をかけてくるため収集は少々大変かもしれませんがそれでもガチャ産SSR武器に比べ上限解放が容易であるため長くお世話になる武器です。

  • ファフニール(亡国の四騎士)
    召喚効果に火属性防御DOWNという効果がついている召喚石。
    火属性防御DOWNは防御DOWNと重複するため序盤では有用な召喚効果です。
    加護はそこそこの値ですが最後まで上限解放しないと防御が下がってしまうためメインとして起用する場合は必ず最後まで上限解放すること。

  • ベルエンジェル(Duelist of Eternity)
    1ターンの間ダメージを1000まで肩代わりしてくれるという地味な召喚効果ですが、最後まで上限解放を行うと1000以上のダメージを受けた際にチャージ中の星晶獣を一つ召喚可能にしてくれるという効果が付きます。
    うまく使えばカーバンクルを再利用で6ターンの間ダメージ半減など利用方法はあると思います。

  • 白銀の弓(Duelist of Eternity)
    Ex攻刃という通常攻刃とは別枠で計算・攻撃力に乗算されるスキルを持つ風属性の武器です。この武器は最終上限解放が実装されているため通常の武器よりもLv・スキルLvの上限が高くなります。そのため長くお世話になる武器であり、Duelist of Eternityに挑めるようになったら最優先で取りに行きたい武器です。

  • ルナのおともだち(Duelist of Eternity)
    白銀の弓と同じくEx攻刃持ちの闇属性の武器です。こちらも最終上限解放が実装されており、また闇属性の武器は序盤では入手手段がすくないこともあって非常に長くお世話になる強力な武器です。こちらも最優先で取りに行きましょう。

  • ギガントナックル(ロボミ)
    光属性の通常攻刃(大)武器です。よほどガチャを回したりできるような人でなければ序盤から中盤にかけての貴重な簡単に3回上限解放できる武器ですから長くお世話になると思います。

  • 闇の炎の子(どうして空は蒼いのか)
    召喚効果も加護もあまり効果が高いものではありませんが、その真価はこのイベントで仲間になるルリアと組ませてから。
    なんとルリアがいるときに召喚すると使用済みアビリティを一つ使用可能にしてくれるのです。
    ルリアのアビリティは一つ一つが強力であるためルリアをパーティにいれるなら交換が視野に入ります。

  • ドミニオンハープ(どうして空は青いのか)
    Lv100でEx攻刃(大)を習得する光属性武器です。恒常で入手可能な光属性のEx攻刃持ち武器としては最初に入手が可能で上限解放も比較的容易なため多少無理をしてでも取っておきたいです。
    楽器系ジョブのメイン武器としても優秀な性能です。

Python3の文字列表現について

そもそも文字列表現とは?

おそらくプログラマーを名乗る人物のほとんどが様々な言語に一度は触れたことだろう。
そして大きく異なるであろう部分の一つが文字列の書き方だと思う。

例えばCでは「文字列」は必ず「"」(ダブルクォーテーション)で囲まなければならないが、
多くの言語では「'」(シングルクォーテーション)と「"」どちらを使っても良いなんてのがわかりやすいだろう。

そして個人的に面白い(そしてややこしい)文字列の表現をするのがPHPPythonである。
PHPの文字列表現については割愛するが、他の言語であまり聞いたことのない仕様であるため機会があればそのことについてでも書こうと思う。

Python2とPython3の文字列

さて文字列表現そのものに触れる前にまずPythonのバージョン違いによる文字関係のクラスに触れたいと思う。

Pythonは2と3で大きく仕様が異なる(後方互換性のない)言語であるが、文字列にも大きなメスが入った。

Python2では文字列の表現方法としてstrクラスとunicodeクラスが存在する。これはunicodeクラスがマルチバイト文字対応文字列、strクラスがマルチバイト文字非対応の文字列と思えばいいだろう。
この仕様は後々Pythonがメジャー化されるにつれて(特に英語に弱い日本で顕著だったのだが)バグの温床の一つであった。
(モジュール内部の処理がstrオブジェクトのみを想定していることが多かった。またアルファベットはasciiコードで基本的に処理可能なため主にマルチバイト文字を処理する環境での開発者が少なかった頃のPythonはこの形式で本当に問題なかったのだろう。)

Python3では文字列を扱うオブジェクトがbyteオブジェクトとstrオブジェクトに変わり、Cに近い環境になったと言える。
byteクラスはバイトコードを扱い、strクラスは文字列をそのまま操作できると、より直感的なプログラムが可能になったように思う。
もっともbyteクラスを直接扱うことはPythonでは比較的少ないとは思われるが。(私は昔ファイルのコピープログラムをPythonでやったりするということで使ったりはした)

Pythonの「文字列表現」

さて、Pythonでは文字列を表現する際幾つかの記法が存在する。 - 通常の文字列 - raw文字列 - format文字列 - byte文字列 - unicode文字列 Python3では全部の記法が使える(unicode文字列は互換性のために残っているものの通常の文字列として扱われる)が、Python2ではformat文字列とbyte文字列は使えない。さらに言うとformat文字列は比較的新しくPython3.6以降でないと使えない。

通常の文字列

どのプログラミング言語でも初めて触れる時には様式美としてHello, World!を出力する(と、少なくとも私は思ってる)。これはPythonの通常の文字列が何かを説明するのにもいいかと思うのでそのまま使ってみよう。

print("Hello, World!")
print("\tTest for escape-sequence")
print('Hello, World!')
print('\tTest for escape-sequence')

実際に実行してみたらわかると思うが、Pythonでは「'」と「"」に違いはない。
どちらの記号を使ってもエスケープシークエンスは正常に動くし、文字列が出力できないなんてこともない。
この記法を用いるとPython2もPython3もともにstrクラスのオブジェクトとして扱われるようになる。
クラスの確認にはtype("確認したいオブジェクト")で十分だろう。
(Pythonでは非推奨のやり方だが今回重要なのはクラスの取得だけなのでそれならばこちらの方が理に適っている。クラスによって挙動を変えたい時はisinstance("文字列", str)みたいにすればいい)

この仕様がPython2時代では厄介だった。まだunicodeクラスを知らないPython初学者が日本語を出力しようとして「通常の文字列で」日本語を記述してしまうケースがとても多かったのだ。文字列だけなら環境によっては出力可能だが、このあと変数や標準入出力関数でエラーが起こりやすい。

raw文字列

raw文字列は文字列をraw記法で記述する方法だ。
文字列の前にrを書くことでこの文字列としてみなされる。
まずは下のプログラムを見て欲しい。

print("\t通常の文字列\n")
print(r"\traw文字列\n")

はてなブログさんがすでにシンタックスで教えてくれてはいるが、エスケープシークエンスが働いていない。
raw(生)の示す通り文字列内の特殊文字や変数などを展開せずそのまま文字列にしてくれるのがraw文字列である。

この記法は最近はやりの機械学習、とくに自然言語処理分野で活躍している(ような気がする)。
それ以外にもreモジュールなど、正規表現を用いる場所では「\」(バックスラッシュ)を多用するため、いちいちエスケープを行わないようにraw文字列で記述することが多い。
使い所が限定されるせいかあまり紹介・活用されていないような気がする少々不憫な文字列とも言える。
(自然言語処理のプログラミングについて解説しているようなところでもraw文字列を使っていないところは結構見受けられる印象)

format文字列

文字列の前にfを追加することでこのformat文字列になる。
Python3.6から追加された新顔、format文字列だが、Pythonにはすでに文字列のformatを行う関数が幾つも存在している。
strクラスのformatメソッドやTemplate()、%記法については別のブログ記事を書くことにしてここでは単純な紹介をだけしよう。
(他人のブログに誘導してもいいのだが自分のブログのモチベのためにあえてそうしないことにした)

name = "にけや"
print(f"私の名前は{name}です。")

このように書くと「私の名前はにけやです。」って出力される。
format文字列にも変数の展開だけでなくformatメソッド以上にformatの種類があるのだがそれも割愛。
PHPを書いていた人はこの変数展開の仕方に見覚えがあるかもしれない。

format文字列はraw文字列と組み合わせて書くことができる。
その関係上なのかformat文字列の展開部分では「\」を使った変数、関数等は使用できない。

byte文字列

Python3のみにある(byteクラスがあるのはPython3だけなので当然なのだが)byte文字列だが、raw文字列以上に使いどころのない文字列だと思われる。
Pythonでバイトに触れる機会がそもそも多くなく、正直それならCやアセンブリコードを書いた方がいいような場面も多いような気がするが紹介だけ。
なお、この文字列はbを文字列の前に置くことが記法になっている。

print(b"Hello, World!")
print(b"Hello, World!".decode())

byte文字列をそのまま出力した場合、bというプレフィクスと「'」で囲まれた文字列が返ってくる。
decodeメソッドはそれを適した文字コードで解釈しstrクラスに戻すメソッドである。
おそらくbyte文字列を使うことはほとんどなくstrクラスからbyteクラスへの変換はstr.encode()を用いるだろう。

byte文字列はraw文字列との併用が可能である。
format文字列とは使えないが、用途的には全く問題ないだろう。

unicode文字列

unicode文字列はPython2のみに存在する文字列で、日本語を母語とする多くのPython2プログラマーは最初にこの記法を覚えざるを得なかったであろう記法である。
文字列の前にuを記述することでこの記法になる。

なお、この記法自体はPython3でも使えるのだが、意味はないものとなっている。
Python2を切り捨てたはずのPython3でこの記法が使えるのはascii文字以外の文字が入っていることをPythonプログラマーに伝えるためのサイン代わりなのだろうか?(調査不足、何か知っている人がいたらコメントしてくれるとありがたい)

print(u"Hello, World!")

Python2での記法であるため上記3種類の文字列との併用は不可。

さいごに

ここまで駆け足の割には長文になったブログ記事を読んでくれた方には是非とも公式のドキュメントだけでなくPEPの方にも触れてみるといいと思う。
最先端の開発状況が確認できるしこれまでのPythonの変遷を知るのにも役立つであろう。

Pythonのドット(.)の意味

にわかなプログラマーなので間違っているかも。

ドットの意味

Pythonのプログラム内で使うドット(.)は意味としては三種類。

  • パッケージ内の階層構造

    • JavaPHPでも似たような使い方をすることがある。
    • Pythonではこの階層構造自体が名前空間として厳密に意味を持つっぽい(にわか)。
      • import urllibしてurllib.request.urlopen()しても動かないのはurllibとurllib.requestで違う名前空間になるから?
      • 追記(2017/09/16):ドキュメントによるとurllib.requestは「パッケージ.サブモジュール」ということらしい。
        つまりurllibとurllib.requestは同じパッケージ内の別モジュールということだ。
        そりゃ名前空間も違うわ。
  • 名前空間

    • PHPだと::が当てはまりそう
    • これのおかげで関数の名前の衝突怖くない
  • オブジェクトの属性

なぜこんなしょうもないまとめを書いたのか

身近で「import urllibしてurllib.request.urlopen()動いたんですけど!」と言われそんなはずあるかといろいろやってみて得た知見をどこかにまとめておきたかった。

俺は人工知能を学びたい

どーもみなさんはじめまして。
にわかプログラマーにけやといいます。

最近流行りのディープラーニングっていうのに手を出してみたら色々思うところがありまくりだったのでこんな記事書いてみました。

そもそも知能とは?

まず知能ってなんなんでしょうか?
広辞苑によると以下のような意味だそうです。
【知能・智能】(ちのう)①知識と才能。②知性の程度。③環境に適応し、新しい問題状況に対処する知的機能・能力。(引用:広辞苑 第六版 岩波書店新村出・編)

人工知能という言葉に照らし合わせてみると②はちょっと意味が通らなさそう。
①でも間違いではなさそう……。
でもやっぱりみんなの考える人工知能とは違うだろう。

③はおそらくみんなが考えているものそのものだろう。
困った時には相談に乗ってくれそうだし、ちょっとデータを渡したらあっという間にその問題のプロフェッショナルになってそう、そういうのが人工知能だと思っている人もいると思う。

さて、その観点から機械学習ディープラーニングという文字列を見てみると違和感がちらほら……。
それもそのはず学習やラーニングというのは大量のデータがなければ成立しないのですから新しい問題状況に対処というのは少々難しいように思えるはず。

ディープラーニング機械学習について

今流行りのディープラーニング……の前にまずは機械学習の話から。

機械学習の歴史そのものはとても古く、1960年代にはすでに近傍法の記述があります。
最も、計算機自体が人間が少しでも楽をしようと便利な道具を作ってきた歴史の中で発展してきたものですから計算機に学習させることができないかどうかという研究が古くから行われていたのはある意味では当然と言えると思います。
その中で近傍法や決定木などの直感的なものに始まり、回帰やSVMなどの複雑なアルゴリズムへと進化してきました。

そして脳のモデル化というところからニューラルネットワークモデルというものができてきました。
今日でいうディープラーニングはほとんどがニューラルネットワークモデルのことを指しています。
ディープラーニング機械学習の一部ですから本質は変わりません。
データをもらって操作して評価しての繰り返し。
なんてことはない、一般的な学習の方法です。

ここまで長々と説明してきましたが、言いたいことは一つです。
これ、本当に「知能」なの?

人工知能という名前の「学習器」

みなさんの中には「機械学習ディープラーニング」=「人工知能」という等式が成り立っている人もいるかと思います。
しかし、実際には機械学習でもディープラーニングでも一つのことを学んでいるだけにすぎません。
新しい問題の状況に適応しているわけではなく、あくまで過去の事例から学んでいるだけに過ぎないのです。
これでは知能と呼ぶには少々頼りなさそうです。

無から有を生み出せなければ人工知能とは呼べないと言いたいわけでもありません。
独創でさえもその製作者の経験や背景などがふんだんに詰まっているわけですから、今まで人類の誰も成し遂げたことがないようなすごいことができるのが人工知能だというわけでもないはずです。

とはいえ現状やたらAIと評してディープラーニングなどを持ち上げる動きには懐疑的なのです。
人工知能ははたして思考をしているのでしょうか?
AIやディープラーニングといった横文字に騙されているのではないのでしょうか?
学習をすることだけが「知能」の証明なのでしょうか?

人工知能に対して高い期待を寄せるのは何故なのか。
それは神の領域だからとかそういった話ではないはずです。
人件費の削減だとか時間効率の上昇だとかそういったことが期待につながっているわけでもないでしょう。

つまりは人工知能に求められているのはドラえもん鉄腕アトムのようなコミカルでちょっと抜けたところのある、けれども人間では成し得ないようなことを成し遂げるような友達のような小英雄なのです。
ビジネスにおいてはそれ以外にも価値があるように思えますが、結局のところ私たちにとって人工知能はディスプレイ的な存在しかベンチマークとして知り得ず、ゆえに正しい評価ができないまま人工知能に用いられる技術のみをわっしょいしている状態なのです。

それを踏まえて、俺は人工知能を学びたい
たんなる学習器としてのプログラムでなく、会話を楽しむだけの傀儡でもなく、私たちの友人として、時には対立もするだろう、でもいっしょになって考えたり助け合ったりするかけがえのない隣人としての人工知能を。
夢物語のようだけれども実現するための技術は少しずつ進歩しています。

当然、人工知能の根底には機械学習ディープラーニングといったアルゴリズムがあるのは間違いのないことですし、それを学ぶことが無駄というわけではありません。
組み合わせていけば複雑な仕組みの学習器が作れるだろうと思いますし、その学習能力は人間と遜色ない、いや遥かに優れたものであることも想像することができます。
もっとも、現在の流れではあまり複雑すぎる仕組みのものは労力に見合う実装ではないとして切り捨てられる傾向にあるようですが。

機械学習ディープラーニングだけではなく言語や思想といった分野にも知識を広げていくことが人工知能に対する理解を深めることになると思います。
(理系の文系disに対するアンチテーゼも含めて)