みろりHP


緑色さんの多目的ブログ
みろりえいちぴー(旧)
引っ越し先 みろりHP: https://www.mrrhp.com
| カテゴリ:- |
スポンサーサイト

一定期間更新がないため広告を表示しています

| スポンサードリンク | - | - |
| カテゴリ:みろりHP |
2015年総集編



ハローエヴリバーディ。今年はやってたことを月ごとに並べるのはナシにする。というのもわりと長続きした趣味が多く、月ごとにしちゃうと同じ項目をずらずら並べることになってしまうからな。まずはゲーム方面から。

  • ポケモンORAS。図鑑収集や国際孵化などコレクション方面はえらいこと楽しめた。対戦方面は自分のなかでは下火のままだったなあ。知り合いと二週にいちどポケモン会と称して集まり、身内リーグ戦など催したりもしてたんだが。総勢三人の会で、みんなそれぞれお気に入りのポケを使いたがるプレーヤーで楽しかったぜ。ボーマンダ・ペリッパー(残念ながらこの子は途中退場したが…)、チルタリス、エーフィだったか。対戦中、うまいこと相棒同士の対面になると場が沸いたものだ。俺の相棒色違いエーフィは鉄壁バトンタッチと瞑想で防御マシマシ、アシストパワーで大暴れする小さな戦車だったんだけど、朝の日差しも相まっていつまでも倒れないので「エーフィさんのラスボス感パない」と評判でなんだか嬉しかったな。まあ素人勢なりの盛り上がりといったところか(ウェルやづっきーを相手取るならこうはいかない)。って結局対戦の話がほとんどじゃねーか。じつは自分なりに十分楽しんでたのかもしれん。
  • エルミナージュゴシック。遊んでいたときは結構楽しんでいた筈なんだけど、終盤のシナリオのよく分かんなさや妙なバグに見舞われたこと、クリア後ダンジョンの難易度についていけなくなっちゃったことでどうにも印象がよくない。けどまあ、わりとヒドい前評判にしては楽しめたと思う。
  • ウル4。新PC購入にともないグラボのスペックが上がったんでパッドを用意し再スタートした。全キャラでアーケードクリアを目指したりとわりあい楽しんでいた気がもするが、うーん、あんまし続かなかったなあ。ただ緑さんは格ゲーというフレームワークと、それが生み出すセオリーや文化が好きなんで来年リリースされるというスト5もおそらく買うのではないかと思う。そのときの趣味次第だけれど。
  • MHX。いまやっている。目標は勲章コンプと、数種類の武器を平均的に使っていくこと。
  • フリーゲーム。具体的には以下。
  • ムラサキ。魔王物語物語作者の作品で、シナリオや世界観について多くを語らぬ相変わらずのスタイルが雰囲気を出している。音楽も良い。俺はとくにエンディングの曲が気に入りで、たまに聴き返したりしている(ゲーム内にミュージックルームがある)。サウンドトラックも発売されているのだけれど、どうやらゲーム素材の権利問題が起きているようで現在販売が停止されているんだよなあ。
  • OFF。仲間といっしょに謎解きをしつつ遊んだのが楽しかった一品。戦闘システムやUIに不満があったけれど、世界の退廃的な雰囲気やエレメントとかの要素が好みで印象には残っている。
  • 停滞少女。これは初プレイ時にコンプできなかった要素をプレイしなおしただけだ。フリーゲーム緑さんセレクションベスト3の「停滞少女」「まもも」「Ruina」はちょくちょく起動し直してしまっているなあ本当に。
  • スカイハイ・クロノス・エンドレス。今年のベストフリーゲームだ。何がすごいって、非常に主観的だけども、シナリオはワケワカメで作業ゲーが狂気的なのに世界観と雰囲気、音楽だけで感動させられちまった点だ。音楽については同梱の音楽ファイルをプレイリストにして何度も聴いてしまっている。それだけに狂気的作業ゲーが惜しくてねえ。それがまだなんとかなっていればフリーゲーム緑さんセレクションはベスト4となっていた筈なんだけれど…。
  • 米ドラマ。知り合いがいろいろ持っていたんで、2シリーズほどを借りてきた。『ユーリカ』と『フレンズ』だけど、フレンズのほうは俺のコメディ好きな趣味とマッチしてだいぶ繰り返し観てる。恋愛要素がコメディ部分を阻害してうっとうしいんだけれど、まあそれは仕方ないのかもしれんな。あくまでユーモアは、大きな流れを飾るデコレーションとしての立ち位置をキープすべきなのかもしれない。俺にしたって掛け合いなんかは笑い話とは別の主題がないとできないしな。「話せば絶対おもしれーんだ、でも話すことがねーよ」。
  • プログラミング。今年始めてみて、わりと順調に続いている趣味だ。Pythonから始めてPHPとJavascriptも触ってみたけれど、やっぱり俺はPythonが好きだな。とりあえずの目標であるゲーム作りはこのままPythonで続けていくだろう。
  • お絵かき。逆にあんまり続かなかった趣味がこれかねえ。水彩画を練習したくて知り合いのお絵かき好きを集め、週一か二週一くらいでお絵かき会を開催していたんだけれど、上半期が終わるころそこそこ満足できる具合になりやめちまった。まあ捨てる趣味あれば拾う趣味ありなので問題はないが。
  • 読書。いちおう月一冊くらいの割合では読書をできたようだ。読書をしてサマリを書くというワンセットは去年思いついて始めたことだけれど、なかなか性に合っている気がするな。何より読んだ本のあらすじを忘れることはあまりなくなったと思う。
  • 運動。ジョギングも筋トレも共に続いてる。俺の方針は「3日連続ではサボらない」であり、これは正解だっただろう。きっと「毎日走る」だったらスグやめちまった。最近のメニューはこうだ。「腕立て10→柔軟→腕立て10→ジョギング2-5km→体幹トレーニング2分→やりたけりゃ腹筋100→やりたけりゃ背筋50」。Runtasticアプリはジョギングのモチベーションを保つのにかなり使えてる。11月から使っており、12月とともに一ヶ月のジョグ距離はだいたい100km強、ジョグ日数は20日強、速度は1kmにつき5分前後だ。
  • ツーリング。なんだか今年はやたらと出かけたな。青森ではツーリングを楽しめる山々や川が多くあり、カメラをもって走りに出るのが非常に気持ちよかったものだ。名古屋ではきっとそういう楽しみ方はできないんだろうが、カブで走るのはとても好きなので、暖かくなったらまた異なる楽しみ方を見つけ出したいところだ。
  • ゆっくり動画。あいも変わらず観てますよ。ただ今年は新しいのを発掘することはあんまりしなかったかな。お気に入りをリピートしていただけだ。具体的には「さとりとEX三人娘のアリアンロッド2E」、「ゆるふわ」、「酔っ払った二人のクトゥルフリプレイ」あたりか。ほんわか卓については気に入りだけど、新しい投稿がないんで。ただ同作者さんが小説投稿サイトで公開してる小説は読んだりしてるぜ。

こんなもんか。今年もいろいろやったし全部楽しんだ、例年どおりの年だった。来年もきっと同じような最高の年となるだろう。おつかれやんした。よいお年を。

| 緑色 | みろりHP | comments(0) |
| カテゴリ:みろりHP |
緑ライフハック



俺の行動指針はひとつだ。24時間をなるたけ「自分が楽しんでる時間」で満たすこと。それが妨害されるのは、たいていは、決断を迷っているときだ。行動でストレスはたまらない。ストレスがたまるのはどう行動したらいいか迷ってるときだ。金持ちが長生きなのは、お金の関わる選択での迷いをスキップできるからだ。生活していると、似たような種類の選択だとか問題になんどもぶち当たる。そのたびに似たような悩みに時間をとらないため、特定の選択や問題に見舞われたときの行動ルールをあらかじめ決めておく。そうすりゃ選択にかかずらっている時間は最小限になり、24時間のなかの「楽しんでる」割合は最大限になるという寸法だ。



やるかやらないかの選択
  • やらない理由を探しているなら、やっとく。
  • 面倒くさいときは、やっとく。やってるとき面倒くさいと感じる事は、大抵やり終わるとスゴイ満足感。
  • やりたくないときは、やらない。
  • 買うか買わないか迷ってるときは、買う理由が値段なら買わない。買わない理由が値段なら買っとく。
  • シンドいときは、やっとく。俺がシンドいと感じるということは、他の連中もそこでそう感じてやめていくポイントだ。つまりそこがレベルアップの境目である。

なんかかったるいとき(即時的)
  • 以下のリストにチェックを入れていく。
  • メシ食いすぎてないか
  • 野菜食ってるか
  • 運動してるか
  • タスク積んでないか
  • 部屋片付いてるか

なんかかったるいとき(長期的)
  • 予定をたてる。俺らの気分がもっとも高揚するのは、何かをやっているときじゃなく、何かを待っているときだ。

嫌なことに見舞われたとき
  • なんか形に残るものを作り始める。創造行為は楽しいので、脳が「あんなことにかかずらってるよりこっちに集中しよう」って言い出してヤなことは忘れる。
  • 悪口の場合は、「悪口は言われてる側はつねに主役であり、言ってる側はつねに脇役である」という常識を思い出す。

眠気を覚ましたいとき
  • 腕立て伏せ20回する。

イライラしているとき
  • ゆっくり動く。

だらけてきたとき
  • 素早く動く。

選択や問題にぶち当たったとき
  • いったん人間であることを止め、上記の方針を機械的に実行する。

つねに
  • いまやっていることは、自分がやりたくてやっていることなのだと考える。たとえやっていることがクソみたいなことでも、それは「他の選択肢がもっとクソだから自分が頑張って選び出したもっともマシな」クソみたいなことだ。ゆえに全ての行動は自分が選び出しやりたくてやっていることだ。自分がやりたくてやっているのだから楽しめる。すべてにそれを適用すれば、24時間は楽しみで満ちる。


| 緑色 | みろりHP | comments(0) |
| カテゴリ:プログラミング |
クラス・オブジェクトって要するに連想配列のことなんじゃね?



クラスとかオブジェクトって一体なんなのか、よくわからない。なぜ分からないかといえば、たぶん、「どんなとき何に使うものなのか」分からないからだ。けれどJavascriptを書いているときその一端がちょっと見えた気がしたので書き留めておく。以下、確証はないが書きやすさのため断定口調で書く。



オブジェクトは要するに連想配列のことだ。クラスは連想配列を作るシステム。

連想配列でいうところのキーがクラスのプロパティにあたり、キーに関数を格納したもの(無名関数で実現可)がクラスのメソッドにあたる。
現に、連想配列内のものを呼び出すやり方とオブジェクト内のものを呼び出すやり方は酷似している。どちらも、「連想配列Aの変数V」「オブジェクトOの変数V」という書き方だ。

# PHPの場合
$A = array("V":value, "F":function() {...});
class C() {
    public $V = value;
    public function F() {
        ...
    }
}
$O = new C();
# 呼び出すとき
$v = $A["V"];   # 「AのV」という意味
$f = $A["F"](); # 「AのF」
$v = $O->V;     # 「OのV」
$f = $O->F();   # 「OのF」

どちらも使い方は同じだ。違うのは、使い勝手である。クラスを使って連想配列(オブジェクト)を作るなら長い関数(メソッド)が含まれていても書きやすいし、内部のキーや値(プロパティ)を内部の他の関数内で使ったりもできる。

# 一応試したところやはり通常の連想配列ではこういうことは無理
$arr = array("a"=>1, "b"=>2, "c"=>$arr["a"]);

そんなわけで連想配列とクラス・オブジェクトの関係は、データ保存用のtxtファイルとデータベースのような関係だ。つまり、どっちもやってることは同じなんだが、後者はより複雑で大規模なことができる。



思いついたのはJavascriptのオブジェクトリテラルの項目を調べているときだった。Javascriptでは、どうみても連想配列であるもの(Pythonではディクショナリであるもの)をオブジェクトと呼ぶ。「いやそれオブジェクトじゃねーだろ! 連想配列だろ!」と笑ったときのことである。「あれ? 実はオブジェクトなんじゃねーのか、俺が連想配列だと思っていたものも…?」。


| 緑色 | プログラミング | comments(0) |
| カテゴリ:ゲーム |
MHX 村クエレベル4まで


さて先々月あたりルームメイトに誘われてちょっとだけ遊んだ4Gが面白かったのに味をしめ、MHXをちょこちょこ進めてる。目標は勲章コンプだ。



現在の武器は弓の、「混沌のゴンLV1」。状態異常のビンが全種使えるというのがステキで気に入ってる。都合の良いことに村4までで火力不足は感じていない。不足を感じたら罠と爆弾を投入し、それでもキツければ武器のグレードアップとなるだろう。集会所で遊ぶのもわりと楽しんでいるので、誘ってくれたらオトモするぜ。


| 緑色 | ゲーム | comments(0) |
| カテゴリ:感想文 |
ヤンソン『たのしいムーミン一家』


引き続きムーミンを読んでいる。まったく恐れいったぜ。牧歌的な筆致に癒やされっぱなしだ。それに、章ごとの見出しに章のサマリがすでに書いてありやがる。俺が読書のたびにサマリを書いてるのは、あとでそのサマリを読み返したときすうっと思い出せるようにするためだ(他にも理由はあるけどさ、そもそも要約という作業が好きなんだ)。が、もうサマリがあるならその作業は必要ない。まあ形式として軽く書くけども。それと筆者みずからによる、大量の挿絵が素敵だよな。こういう写実的な筆遣いが俺は好きだ。


ムーミン一家の子供たちが山のてっぺんで飛行おにの帽子を見つける。その帽子は、中に入ったものをいろんな姿に変えてしまう魔法の帽子であった。その帽子によって、ムーミントロールはバケモンの姿にされるわ、ムーミン屋敷はジャングルに変わるわ、水を入れたら木苺のジュースに変わってオイシイわ、紙くずを入れるとふわふわ浮かぶ雲になって楽しいわで大騒ぎである。そんなわけで帽子の扱いに困る彼らであったが、なんとか厄介払いをする。貴重なルビーの王様を譲ってもらうため、モランに差し出したのだ。これでめでたし。と思いきやそのルビーを求めて飛行おにが現れた。そうほいほいとやるわけにもいかずお断りすると、彼はすっかり悲しんでしまい、慰めのためにみんなの願いを魔法で叶えてやると言い出した(!?)。いろんな願いを叶えてもらう中、こう言う者がいた。「自分の願いはこうだ、あなたにもルビーの王様と同じものを出してくれ」。そして飛行おにもまたルビーを手に入れ、みんな幸せめでたしめでたし。


いや、慰めのためにみんなの願いを叶えてやるってなんぞ!? とまあところどころ俺にはよく分からん話はあるけれど、生来のんきな世界だし、というかまずこの連中は人間じゃないしモラルとかも違うんでしょ…と緑さん的には納得が可能だ。
全体についての感想としては先回の「彗星」と同じで、これはムーミン谷という世界観を描くことが目的なんだろうなあと。のほほんとした休日を過ごしたいなら手放しで勧められる一品。

  • スナフキン「なにかをためそうってときは、どうしたって、きけんがともなうんだ。かまうもんか、すぐほうりこんでみろよ」

  • 今回もスナフキンは素敵だった。というかコイツだけまとってる雰囲気が違うのだよな。その理由は多分、ムーミン谷のメンバーで抽象的な物言いをするのが彼だけだからだろう。抽象というのは具体の対義語で、ものごとの持つ共通の性質をまとめあげることだ。たとえば「赤」、「緑」を抽象化すると「色」になり、「色」を具体化すると「赤」、「緑」になる。抽象化というのは知性の必要な技術だ。つまり抽象は知性を醸し出す行為と言える。だからスナフキンはカッコ良くみえるんじゃねーかな。


    | 緑色 | 感想文 | comments(0) |
    | カテゴリ:感想文 |
    ヤンソン『ムーミン谷の彗星』


    我が家には学級文庫というスペースがある。ルームメイトたちが好きに本を置いていき、好きに持っていける棚だ。そこにムーミンがあったんでちと読んでみた。恐ろしく平易な文章で、2日かそこらで読み終えた。訳は下村隆一。


    ある晩ムーミン谷に黒い雨が降り、ムーミンファミリーはじゃこうねずみさんから地球滅亡の到来と、宇宙は空のように青くなく真っ黒で、地球はちっぽけな星だと教えられる。ムーミントロールとスニフはすっかり怯えてしまう。元気づけるため、ムーミン夫妻は子供たちを天文台へ送りだす。世界がほんとうにじゃこうねずみの言うように「真っ黒で、地球はちっぽけな星」なのか確かめて来いというわけだ。ムーミントロールとスニフは川をいかだで辿りおさびし山の天文台を目指す。途中でスナフキンと出会い、3人は連れ立って天文台へ辿り着く。そこで彼らは4日後に彗星が地球に落下することを知る。一行は早くそのことを皆に知らせるため帰途につく。彗星の接近による熱で変わり果てていく大地と、異常気象に道を阻まれる道中、かれらはスノークの兄妹やヘムルと会い一行に加えていく。ようやっと帰り着いたムーミントロールたちは洞窟に避難し、ことが過ぎ去るのを待つ。激突するかに思われた彗星はすんでのところで軌道をそれ、地球は滅亡をまぬかれた。


    なんというめでたし。思うにこの物語は、事件や出来事のなりゆきを描くのが目的ではまったくなく、ムーミン谷という世界観を描くのが目的なのだろう。その人がどんな人なのか確かめる方法は、その人が何かの事件や出来事にどう反応するのか観測することだ。それと同じように、作者はムーミン谷というキャラクター(比喩的な意味で)が彗星の到来という事件にどう反応するのかを描いたのだろう。それにより、読み終わる頃には、ムーミントロールやムムリク、ヘムルにスクルットといった種族名が何の前置きもなく出てくるような物語なのに、俺たちはこの世界を「こういう世界か」と直感的に認識することになる。
    ところで俺はこの話を以前映画で観たんで知っていた。原作と映画ではわりに少なくない部分が変更されていて驚いた。まず、あのさ、ミィがいないんだが!?
    映画ではカットされているシーン
  • ガーネットの大蜥蜴と遭遇するところ。
  • 売店とダンス場に立ち寄るところ。
  • 映画では変更されているシーン
  • 原作では、旅は徒歩でなくいかだでする。
  • 原作では、ヘムレンさんがデカイ。そりゃスニフも「小さいスニフ」呼ばわりされるよ。
  • 原作では、スノークという種族は感情で色が変わる。

  • ところで子供たちが天文台への旅へ出かける動機が、えらく理にかなっているよな。よくわからなくて怖いので、わかるために旅をしよう。そういった旅は辛く厳しい側面もたくさんあるけれど、友達ができるし、我が家が急に愛おしく思えてくるものだ。こんな会話の通りに。
    「ムーミントロールは、自分のいったこともないよその土地が、どんなにすてきかってことばっかり、前には話してたじゃないか」
    「そうさ、前にはね」

    気に入った台詞はいくつかあるが、ほとんどスナフキンのものだった。なんだってこのムムリクはこんなにクールなんだ?
    「こまかいことをいうなよ。そのぐらいのちがいなら、ぼくたちの計算では、合ってるというんだ」


    | 緑色 | 感想文 | comments(0) |
    | カテゴリ:感想文 |
    GIJOE『PHPサイバーテロの技法』


    公開していないとはいえウェブアプリケーションを作成している身、「PHPで作成したWebアプリケーションは常にサイバー攻撃の脅威にさらされている」などと表紙で煽られてはちょっと知識を仕入れておくかという気にもなる。そういうわけで今回はPHP版gccsの作成と同時進行でちょこちょこ読んでいた本のサマリをサラリと。本書はウェブアプリケーションに対する実際の攻撃方法を例示し、個別に対策を紹介するというかたちをとっている。それらを軽くまとめてみたいと思うが、如何せん、半分くらいは理解できなくてなあ。たとえばユーザからの入力を投稿としてそのままhtmlに表示するアプリケーションは、有害なJavascriptを入力されるとそれもそのまま表示して実行してしまうという脆弱性を抱えている。これはScript Insertionという攻撃だが、この程度なら俺にもわかる。これを防ぐには、受け付けた入力テキストに < や > などの記号が含まれる場合それらを &lt; やら &gt; といった表記に変換するようにすればよい。ちなみにみろりhpのコメント欄にもその機構が働いているため、たまにスパムが書いたリンクタグがそのまま表示されたりしている。ところが話がHTTPレスポンス分割攻撃などに至ってくるとちょっと前提知識が足りなくなってきてよくわからなくなる。そういう部分はサマリが随分てきとうになると思うがご容赦いただきたく。というかそもそも「想定されるダメージ:クッキーを盗まれる」を読んで「ブフォwそりゃ大事件だw」とか笑っているレベルの素人なのでな、緑さんは。


  • XXSってなんぞ?
    • cross site scripting。リクエスト変数であるGETにJavascriptを埋め込んだリンクをターゲットに踏ませる。一見リンク先は正常なサイトのように見えても、Javascriptの内容が有害なサイトへのジャンプなので飛ばされてしまう。対策はサニタイズ。GETの内容をそのままページ内に表示するようなことはせず、htmlspecialchars()をかけること。

  • Script Insertionってなんぞ?
    • 冒頭で触れたやつ。XXSでもそうだが、外部由来のテキストにはサニタイズ推奨。数値しかとらないとわかっている変数についてはintval()で完全に数値化する。文字列についてはブラックリストやホワイトリストを作れば確実である。

  • SQL Injectionってなんぞ?
    • クエリに不正なSQL文を混ぜてDBからデータを引き出す攻撃。対策はシングルクォーテーションやダブルクオーテーションのエスケープ。並びにブラックリストやホワイトリスト。

  • CSRFってなんぞ?
    • cross site request forgery。管理者権限がなければはじかれるリクエスト変数をもたせたURIを、管理者権限をもったユーザに踏ませる。するとアプリケーションとしては管理者からの命令だと認識するため、その命令が実行される。対策はリファラーチェック。指定したサイトからのリンクでなければ処理をスキップするようにする。リファラーってのはリンク元のこと。あるいはワンタイムチケット法。正しいリンク元ページにパスワードみたいなものを置いておき、それをセッション変数に保存しておく。そして実行ページでパスワードを照合し、合致すれば処理をしてセッション変数を破棄する。いま思えばワンタイムパスワードってこのシステムを利用していたんじゃないかねえ。

  • ヌルバイト攻撃ってなんぞ?
    • リクエスト変数の値にヌルバイトを含めることで、セキュリティチェックを通過する攻撃。たとえばサーバが"ab%00cd"という文字列をチェックするとき、ヌルバイトをチェックした時点で「この文字列はここまでか」となりこの文字列は"ab"であるとされてしまう。対策はサニタイズ。受け取ったデータのヌルバイトは削除する。

  • Directory Traversalってなんぞ?
    • ユーザがディレクトリ内のファイルの名前を指定できるような箇所で ../ を使ってディレクトリを移動し、他のディレクトリ内のファイルを指定する攻撃。対策はホワイトリスト法。指定してよいファイル名をあらかじめ配列にしておく。

  • HTTPレスポンス分割攻撃ってなんぞ?
    • header()関数の飛び先に改行記号とセッションIDを変更する命令を混ぜ込み、セッションを乗っ取る攻撃。対策はサニタイズ。header()に渡すURIから改行記号 ¥r ¥n を削除する。

  • インクルード攻撃ってなんぞ?
    • include文の内容をリクエスト変数で指定している場合、そこに任意ファイルのURIをおくことでそのページにおいて好き放題できる。対策はホワイトリスト法。

  • ファイルアップロード攻撃ってなんぞ?
    • 画像ファイルなどをアップロードできるアプリケーションにphpファイルやJavascriptの含まれるファイルをアップロードし、標的のサーバ内のそのファイルをURIで指定し実行する攻撃。対策はファイル保存場所の非公開化や、アップロード可能ファイルの拡張子ホワイトリスト法。

  • セキュリティホールを作らないために気をつけることは?
    • データの用途を明確にしつつ設計すること。ユーザが自由に値を変更できるデータは必ず型変換し無害化すること。


    俺が趣味で作っている程度のphpアプリケーションにも脆弱性は多数あり、というかフォームやリクエスト変数を使っていればほぼ間違いなく脆弱性が発生していると考えていいだろう。そしてフォームやリクエスト変数を使わないphpスクリプトなんてものはほぼありえない。今回のgccsには、本の復習がてらこころばかりのセキュリティ強化を試してはみた。そして改めて痛感したのが、「それが問題だと気付けない問題」は「解くのが難しい問題」よりも断然難しいということだ。ページにJavascriptを埋め込むことでサイトを狂わせるなんて発想すらしなかったぜ。内容の厳密な理解はできなくとも、phpスクリプトにはセキュリティ上の問題が発生しうるということが知れて視野は広まったし、いまのレベルではこんなところだろう。ヘボなサマリのフォローが済んだところで今回はこのへんで。


    | 緑色 | 感想文 | comments(0) |
    | カテゴリ:プログラミング |
    PHP版GCCS





    こないだ「以前つくったCoCキャラシート作成ツールをブラウザで動作させてみようとしている」と書いたが、ようやっとひいこら実現させた。機能はもちろんpython版とほぼおなじで、

  • ステータスをランダムに振ってHPやSANを自動計算
  • 入力したデータは整形し別タブで出力

  • という感じだが、python版の機能に加えて

  • 年収欄、キャンペーン・シナリオ欄追加
  • 出力テキストに、どの技能に職業P興味Pを振ったか明示
  • 作成データはデータベースに保存可能
  • 保存データは下部で一覧を閲覧可能
  • 一覧からも整形テキストを出力可能

  • といった機能を追加した。


    いや、データベース機能はもともとつける気はなかったんだ。ただ、PHPとApacheをインストールする際に使用したソフトウェアにMySQLというデータベースも含まれており、「なんじゃこりゃ、でーたべーす?」と調べているうちに面白くなってきたのでついでに組み込んでしまった。どうやらPythonでもデータベースを利用することはできるそうなので、「ついで」で世界が広がり結果オーライといったところか。あと組み込める機能としては、保存データを、テキスト出力するだけでなく編集もできるようにするってところか。実装の構成もわりと容易に考えつく。ただ、まあ、サーバマシンがないからどうせ公開は不可能だしな?
    ズコー、としたところで「公開できないならノウハウを晒せばいいじゃない!」今回はこれを作るのに詰まったところやtipsなどを書くぜ。いやこんなコアなネタをありがたがる人はここの読者にはいないと思うけれどさ、初心者むけの講座が多数並ぶなか、超初心者の「実際にやってみたわ」レポートが存在しているのってそう悪くないとも思うんだよな。

    PHPからDBをいじりたい
    PHP標準クラスのPDOを使え。
    $pdo = new PDO(
        "mysql:dbname=/*使うスキーマの名前*/",
        "接続に使うユーザ名",
        "接続に使うパスワード",
        array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION) # 意味はしらん
        );
    
    で接続をつくる。

    PDOでSELECT, INSERTがしたい
    # SELECT
    $record = $pdo->query("SELECT/*クエリを書く*/")->fetch(PDO::FETCH_ASSOC);
    
    で$recordに array("id"=>1, "name"=>"me") って感じの連想配列が入る。
    $records = $pdo->query("SELECT/*クエリを書く*/")->fetchALL(PDO::FETCH_ASSOC);
    
    で$recordsに array(0=>array("id"=>1, "name"=>"me"), 1=>array("id"=>2, "name"=>"you")) って感じの連想配列が入る。
    # INSERT, UPDATE
    $insert = $pdo->prepare("INSERT/*ここにクエリを書くが、サニタイズのため書き込む値は :id という風にしておく*/");
    $insert->bindValue(":id", /*ここでようやく実際に書き込む値を書く*/, PDO::PARAM_INT);
    $insert->bindValue(":name", /*おなじく*/, PDO::PARAM_STR);
    $insert->execute();
    
    でレコードの挿入。UPDATEはクエリが違うだけで他はINSERTと同じ。

    spanタグに幅を設定したい
    styleにdisplay:inline-block;を入れろ。htmlにはインライン要素とブロック要素があり、幅の指定はブロック要素にしかできない。spanはインライン要素であるため、幅は設定できないことになる。だったらinline-blockでブロック要素にしてしまえという話。

    divを横に並べたい
    並べたいdivのstyleにfloat:left;を追加。並べるのをやめたいところでstyleにclear:both;を追加した空divを置く。

    javascriptとphp間で配列のやり取りをしたい
    javascriptが扱える形にするときはphp側でjson_encode()を使いJSON形式にする。json_decode()で元に戻る。

    javascriptでランダム値を作りたい
    Math.random()を使え。ただこいつがちとくせもので、Pythonのrandom()関数のように引数をとって指定範囲のランダム値を出すというような器用な真似はしてくれない。これ単体では、0から0.999...の乱数を返すのみなので…
    // 0から15のランダム値が欲しければこいつに16を掛け、小数点以下を切り捨てればよい。
    var result = Math.floor(Math.random() * 16);
    // 範囲を指定したければ、最大値から最小値を引いた範囲での乱数を出し、そこに最小値を足せばよい。
    var result = min + Math.floor(Math.random() * (max+1 - min));
    

    javascriptで、htmlから値を取得したり値を突っ込んだりしたい
    document.getElementById().valueかdocument.forms[].elements[].valueを使う。
    <!--html側-->
    <form id="f">
    <input type="text" id="in">
    <output id="out"></output>
    </form>
    // javascript側
    var a = document.getElementById("in").value;
    document.forms["f"].elements["out"].value = a;
    
    この項目はまだ理解しきれていない。そもそも前者のほうではエレメントのidしか求められていないのに、後者ではフォームのidとセットで要求されていやがる。おかしいだろ。まあ別の機会でまた詰まって、詳しく知ることになるだろうさ。

    別ウィンドウにPOST変数を送りたい
    本スクリプトでは、入力されたデータ(並びにそれの計算結果)は連想配列にまとめて別ウィンドウへPOSTで送るが、それは以下のような手順で行っている。これは自分で首をかしげてしまうほど強引なやり口なんだが…。
    <!--html側-->
    <form name="f" method="post">
    <input type="hidden" id="monkey">
    <input type="button" onclick="output();">
    </form>
    // javascript側
    var obj = {};
    function output() {
        document.getElementById("monkey").value = /*回収したデータを連想配列にまとめたもの*/;
        var num = Object.keys(obj).length;
        obj["win" + num] = window.open("", "win" + num);
        document.f.target = "win" + num;
        document.f.submit();
    }
    要するに、javascript側だけでデータをPOST変数に格納して送る方法が思いつかないので、データを一度htmlにぶち込み、javascriptからフォームのsubmitを蹴飛ばし無理矢理POSTで送っているのである。いやjavascriptお前、submitがいじれるのならデータのPOST化くらいやれよと言いたくなる。絶対あると思うんだけどなー。ちなみにobjはなぜ登場しているのかといえば、別ウィンドウが増えるたびにそれらのウィンドウに別々の名前を割り振るためだ。この処理を挟まないと開ける別ウィンドウはひとつだけになってしまう。

    上で言うようなやり方をやったがデータがobjectとかになっちゃってうまくいかんぞ
    オブジェクトを文字列として表示するときはJSON.stringify()を通す。

    ページの一部だけ更新したい
    jQueryをインポートしてajax処理をする。
    $(function() {
        $.ajax({
            url:"gccs.php",
            type:"post",
            data:{
                "a":1 /*リクエスト変数として送りたいデータをオブジェクトで*/
            }
        })
        .done(function(data) {
            /*実行したい内容*/
        });
    });
    
    doneメソッド内の仮引数dataにはサーバのphpから返ってきた内容が入っているので、あとはそれをhtmlのoutputにでもはめ込めばよい。ただし上の方で書いた方法ではテキストデータとして扱われてしまう。htmlデータとして扱ってもらうには次のように書く。
    // こうする
    $("out").html(data);
    // これはダメ
    document.getElementById("out").value = data;
    

    リアルタイムで(計算ボタンなど押さずとも)計算を行う
    これはPython版では「1秒ごとに延々と関数を実行する」ことで実現した機能だったが、「キー入力があったら関数を実行する」ってのがjQueryでちゃっちゃと実装できた。
    $(function() {
        $("#id", "#id2").bind('input', function() {
            // 指定したidに入力があったら実行したい内容
        });
    });
    



    期せずしてPHP、SQL、JavaScriptに一気に触れることになってしまったが、Pythonとの違いにいちいち目をぱちくりさせたりできて結構楽しかったぜ。恥ずかしながら正直に言うと、最初は完全にPython贔屓な態度で「なんじゃこの文法、ヘンなの」とか言っていた。でもいまでは言語ごとに得意分野があるのもわかったし、自然言語と同じく、多言語に触れるほど世界観が広がるのも感じてる。最近ではむしろPythonに目新しさを覚える始末で、

    初期「うっわPHPとかJSって、毎行終わりにセミコロンをつけるのかよ面倒くさ!」
      最近「ヤベ、Pythonコードなのにずっとセミコロンつけてた」

    初期「波括弧つけるの面倒くさ!」
      最近「ヤベ、Pythonコードなのに波括弧つけてた」

    初期「for文に毎回括弧つけるのかよ!!」
      最近「ヤベ、Pythonコードなのに括弧つけてた」

    初期「『$』!!!!???
      最近「ヤベ、Pythonコードなのに『$』つけてた」

    参考:以下のコードは同じ意味。
    # PHP
    function foo() {
        for ($i=0; $i < 10; $i++) { 
            echo $i;
        }
    }
    foo();
    

    # Python
    def foo():
        for i in range(10):
            print(i)
    foo()


    | 緑色 | プログラミング | comments(0) |
    | カテゴリ:感想文 |
    山形石雄『六花の勇者』(M)


    妹の紹介でアニメ版を観たのだけれど、不覚にも感動してしまい、原作をコンプしてしまった。アドレットの人間性は素晴らしいし、フレミーの心変わり(というかなんというか)の描写も素敵だと思った。全体のサマリーを書くのでネタバレに注意。



    あとエンディングが魅力的だった。正味、第一話のEDを観た時点で惚れ込んだところがある。


    一巻
      幼いころの恨みから凶魔と魔神を憎むアドレットは、運命の神に六花の勇者として選ばれた。アドレットは他の勇者たちと合流しつつ魔神を倒すため魔哭領へ向かう。しかし合流が済んでみれば、全部で六人であるはずの六花の勇者は七人集まっていた。彼らは誰か一人偽物の勇者、七人目がいることに気づき疑心暗鬼に陥る。そのうえ七人目が発動させた霧の結界が彼らを閉じ込めてしまう。状況的に、結界を発動できたのはアドレットだけであることから彼は嫌疑をかけられる。が、七人目を始末するべく追ってくる仲間たちから逃げつつ、アドレットは真の七人目の策略を暴くことに成功する。ようやく突き止めた七人目、ナッシェタニアの逃走は許してしまったものの、ついに六花の勇者は集結することができた…。と思いきやさらにもうひとりの六花の紋章を持った勇者が現れてしまう。どういうことなの。
    二巻
      偽物をひとり抱えた七人の六花パーティは、とりあえずその問題は置き魔哭領への進撃を開始する。最初の目標は運命の聖者が魔哭領内に作った聖域、「永の蕾」まで到達することである。その裏で六花のひとりモーラは凶魔の総領のひとりテグネウにもちかけられていた取引のことで頭が一杯であった。それは、娘の命と引き換えに六花のひとりを殺害せよというもの。その取引から逃れるにはテグネウを殺すしかない。モーラは世界を救う勇者のひとりとして、そしてひとりの母親として懸命にテグネウの命を狙う。しかし、いざ姿を現したテグネウは知略と戦闘能力を兼ね備えた強敵であった。どうしてもテグネウを倒すことが出来ず、モーラはとうとう仲間を手にかけてしまう。ただしモーラは同時に、その仲間を蘇生させることにも成功する。その行動だけはテグネウの予想外であり、取引は成立しモーラの娘は開放された。今回ばかりはテグネウの策を乗り越えることができたが、彼がこの先も罠を仕組んでいることは明白。さてどうなることやら。
    三巻
      六花の一人であるゴルドフは道を見失っていた。仕える主であったナッシェタニアが最初の七人目であり、魔神を倒さんとする自分の敵だと知ってしまったからである。魔哭領を歩む途中でナッシェタニアが囚われの身になったという知らせが届く。ゴルドフはすぐに救出へ向かい、他の仲間たちも後を追う。しかしそれはテグネウがナッシェタニアを利用して張った罠であった。仲間のひとりは重症を受け、彼らはそれをナッシェタニアの仕業だと断ずる。しかし彼女の仲間の凶魔ドズーにより、ゴルドフだけは真実を知ることができる。彼は仲間と離れ、単独でナッシェタニアを助けだすことを決意する。それを裏切りとみた六花たちはゴルドフを七人目と考え戦いになってしまう。そんな中でゴルドフは辛くもナッシェタニアを救い出す。真実が明かされすべてテグネウの手の内だったことを知り苦虫を噛み潰すアドレットに、ドズーとナッシェタニアは打倒テグネウ同盟を持ちかける。
    四巻
      アドレットたちは同盟を組んだドズーたちからテグネウの切り札について知らされる。正体は不明だが、それは黒の徒花というらしい。その名から不吉さを覚えた一行は、その手がかりが残されているかもしれないという神殿へ向かう。しかしテグネウの配下によって屍兵へと変えられた人々に行く手を阻まれる。その人々は、アドレットの故郷の人々であった。彼らを救いたいという悲痛な気持ちを抑え、アドレットは神殿への道を急ごうとする。ただ、彼の過去と故郷の人々への思いを知る幼馴染のロロニアだけは屍兵を救うべく奔走する。「屍兵は操られているだけで死んではいない」と主張するロロニアだが、その姿は六花の使命への裏切りと捉えられ、一行から責められてしまう。だがロロニアは正しかった。心が生きていた屍兵をすんでのところで見つけ出したアドレットは彼から黒の徒花の正体を知る。それは六花の紋章の力を吸収する人型の聖具であり、その特徴は、六花のひとり、フレミーのものと酷似していた。
    五巻
      フレミーは黒の徒花。その情報は隠しながらアドレットは仲間と共に運命の神殿へ向かう。神殿には運命の聖者のミイラと、黒の徒花の設計図の一部が残されていた。黒の徒花は運命の聖者の力を奪い、テグネウが作ったものだったのだ。それを止めるには徒花を壊すか、テグネウを殺すしかない。そこで設計図を見たフレミーは自らが徒花であることに気づいてしまう。哀れに思いつつもフレミーを殺す決意をかためる六花たちだったが、アドレットだけは命を懸けて彼女を守ろうとする。アドレットはフレミーを愛しており、仲間たちと戦うことになっても守り切ると決めたのだ。その態度は世界を救う使命を負った六花の勇者とは程遠い。六花は彼を七人目と断定し、四面楚歌の苦境に陥るアドレットだが、それを見た凶魔たちもまた彼を七人目だと判じた。アドレットは凶魔たちを騙し協力して、六花の仲間たちを欺きフレミーを殺すことは危険だと思い込ませ、かつ自分は七人目ではないと信じさせた。いまだ疑いを向ける仲間たちはいるものの、一行はテグネウを倒すべく歩を進める。その頃テグネウは、自分が心を操り七人目に仕立てあげた、アドレットの有能さに大満足であった。
    六巻
      とうとう六花とテグネウ舞台の決戦が幕を開ける。六花一行は全力でテグネウの居場所を探り、テグネウの方は心を操作しフレミーを愛するよう仕向けたアドレットと、そのアドレットに惹かれているフレミーを見て愉悦に浸っていた。彼の目的は、愛が起こす奇跡を見、そしてその愛が偽物だったと知ったときの彼らの顔を拝むことである。なんという悪役の中の悪役。六花たちにとって最悪なのはテグネウが逃亡してしまい黒の徒花を破壊できないことだが、テグネウの望みは愛の力を正面から叩き潰すことである。不合理な戦法であっても、テグネウはそういう存在であった。アドレットは心を操られ翻弄されつつも、愛の力でテグネウを打倒することに成功する。しかしその瞬間テグネウの力は消散し、これまでずっと自分を突き動かしてきたフレミーへの愛を、アドレットはもうまったく感じられなくなってしまった。フレミーは悲しみ、アドレットは絶望する。まだ魔神への道のりは遠く、強敵は残っているのに大丈夫なのだろうか。


    テグネウ関連の伏線とその回収がすごい。冒頭で「アドレットの人間性は素晴らしい」とか書いたけれど、それはそもそもテグネウに植え付けられたものであり、テグネウの死とともに崩壊してしまうという台無し感。才能の無さを愛の力だけで補っていたアドレットが、愛の力なしにこれからどうしていくのかマジで幸先不安だ。彼の村が滅んだことも彼のトラウマも結局すべてテグネウのせいだったし、もう何なのお前。アドレットがテグネウを握りつぶすとき、俺まで息を吐いちまったよ。あんなに「生かしといたらヤバイ」「一言でも喋らせるな」感のある敵はそうそう見ない。


    | 緑色 | 感想文 | comments(0) |
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
    << December 2015 >>
    + みろりHP内検索
    + 閲覧記事
    + 過去記事アーカイブ
    + 年月選択
  • 2019年 02月 (1)
  • 2019年 01月 (2)
  • 2018年 12月 (6)
  • 2018年 11月 (6)
  • 2018年 10月 (3)
  • 2018年 09月 (8)
  • 2018年 08月 (4)
  • 2018年 07月 (6)
  • 2018年 06月 (5)
  • 2018年 05月 (4)
  • 2018年 04月 (7)
  • 2018年 03月 (6)
  • 2018年 02月 (6)
  • 2018年 01月 (8)
  • 2017年 12月 (9)
  • 2017年 11月 (9)
  • 2017年 10月 (4)
  • 2017年 09月 (6)
  • 2017年 08月 (6)
  • 2017年 07月 (8)
  • 2017年 06月 (4)
  • 2017年 05月 (7)
  • 2017年 04月 (8)
  • 2017年 03月 (7)
  • 2017年 02月 (10)
  • 2017年 01月 (6)
  • 2016年 12月 (8)
  • 2016年 11月 (8)
  • 2016年 10月 (5)
  • 2016年 09月 (5)
  • 2016年 08月 (7)
  • 2016年 07月 (9)
  • 2016年 06月 (6)
  • 2016年 05月 (8)
  • 2016年 04月 (10)
  • 2016年 03月 (10)
  • 2016年 02月 (8)
  • 2016年 01月 (10)
  • 2015年 12月 (9)
  • 2015年 11月 (6)
  • 2015年 10月 (5)
  • 2015年 09月 (4)
  • 2015年 08月 (8)
  • 2015年 07月 (5)
  • 2015年 06月 (3)
  • 2015年 05月 (7)
  • 2015年 04月 (8)
  • 2015年 03月 (12)
  • 2015年 02月 (8)
  • 2015年 01月 (4)
  • 2014年 12月 (5)
  • 2014年 11月 (5)
  • 2014年 10月 (7)
  • 2014年 09月 (4)
  • 2014年 08月 (7)
  • 2014年 07月 (6)
  • 2014年 06月 (4)
  • 2014年 05月 (12)
  • 2014年 04月 (9)
  • 2014年 03月 (6)
  • 2014年 02月 (6)
  • 2014年 01月 (8)
  • 2013年 12月 (7)
  • 2013年 11月 (10)
  • 2013年 10月 (10)
  • 2013年 09月 (9)
  • 2013年 08月 (11)
  • 2013年 07月 (10)
  • 2013年 06月 (9)
  • 2013年 05月 (15)
  • 2013年 04月 (11)
  • 2013年 03月 (5)
  • 2013年 02月 (7)
  • 2013年 01月 (6)
  • 2012年 12月 (9)
  • 2012年 11月 (10)
  • 2012年 10月 (10)
  • 2012年 09月 (4)
  • 2012年 08月 (2)
  • 2012年 07月 (7)
  • 2012年 06月 (13)
  • 2012年 05月 (13)
  • 2012年 04月 (15)
  • 2012年 03月 (4)
  • 2012年 02月 (12)
  • 2012年 01月 (9)
  • 2011年 12月 (5)
  • 2011年 11月 (13)
  • 2011年 10月 (2)
  • 2011年 09月 (2)
  • 2011年 08月 (1)
  • 2011年 06月 (1)
  • 2011年 05月 (4)
  • 2011年 04月 (10)
  • 2011年 03月 (8)
  • 2011年 02月 (11)
  • 2011年 01月 (14)
  • 2010年 12月 (14)
  • 2010年 11月 (17)
  • 2010年 10月 (17)
  • 2010年 09月 (19)
  • 2010年 08月 (22)
  • 2010年 07月 (18)
  • 2010年 06月 (16)
  • 2010年 05月 (19)
  • 2010年 04月 (15)
  • 2010年 03月 (22)
  • 2010年 02月 (18)
  • 2010年 01月 (18)
  • 2009年 06月 (2)
  • 2007年 12月 (10)
  • 2007年 11月 (7)
  • 2007年 10月 (9)
  • 2007年 09月 (4)
  • 2007年 07月 (5)
  • 2007年 06月 (11)
  • 2007年 05月 (6)
  • 2007年 04月 (4)
  • 2007年 03月 (1)
  • 2006年 01月 (21)
  • + カテゴリ
    + ブックマーク
    + 最近のコメント
    + アクセスカウンター
    全体(since 2010.02.03.)
    今日… 昨日…