2015/05/28

PS4の動画編集ソフト「ShareFactory」の実力と課題

スクリーンショットをTwitterやFacebookにアップロードしたり、動画をキャプチャして直接Youtubeにアップしたり、TwitchやUstreamで生放送したり。
PS4が前世代機と何が一番変わったのか、と言われたら、やはりこの「シェア機能」なのではないかと思う。

あまり話題になることがないが、シェア機能を影で支える「ShareFactory」なる編集ソフトがある。 動画をゲーム機でキャプチャできるということにも驚いたが、それを編集までできるようになるなどとPS3時代に予想した人は果たしていただろうか。

例えばこれ。

これはShareFactoryで編集したものだ。 動画の切り貼り、フェードといった基本的な機能に加え、テロップをつけることもできる。 他にも色々と機能はあり(図形を挿入できるのが、オンラインで他人のIDをマスクしたりするときに役に立ちそう)、さすがにAviUtlといったソフトのレベルにまでは達していないが、イメージ的にはWindowsムービーメーカーくらいのことはできる、といったところである。

ゲーム機での動画編集としては高いレベルにあるのだが、ひとつ不満がある。それは「2つの『動画の時間』」だ。

1つは、出力する動画の時間。どういうわけかShareFactoryは15分以内の動画しか出力できない。キャプチャーも1回最大15分なので、それと足並みを揃えているのかもしれないが、もう少し長くてもいいのではないか、と思ってしまう。

そして2つ目は、編集段階での動画の時間。「読み込める動画の最大時間」と言ったほうがわかりやすいかもしれない。ShareFactoryは編集時に合計40本かつ20分以内までしか読み込めない。これが編集上のボトルネックになっている。

というのも、一つ目で挙げたように、1回の動画キャプチャは15分まで、つまり動画ファイル一つは最長で15分だ。15分の動画ファイルが2つあり、それをShareFactoryで結合し、ひとつの動画にしようと考えてみる。しかし、2つのファイルで合計時間が30分となり、読み込むことができないのだ。最終的な出力が15分以内なので、20分読み込めればそれでいいだろうということなのかもしれないが、一度に読み込んでいらないところを削っていく、ということがしにくい。せめて、最長動画2本+α、40分くらいは読み込めるようにしていただけるとありがたいなあ、と思っている。

USBメモリ経由でPCに動画ファイルを移せるので、本格的に編集したければPCでやれ、ということなのかもしれないが、著作権的にグレーな部分が多い中で「いや、全部PS4でやれているんですよ」というのは意外と強力な“言い訳”になると感じているので、個人的にはPS4で編集を完結させたいと思っていて、それがひとつのテーマにもなっている。なかなか注目を浴びないソフトウェアだが、密かにアップデートを期待している。

2015/05/23

Google Apps Scriptによるメール自動返信botの作成(2)

同(1)では受信トレイから未読メールを取得し、それが受送信用アドレスからのメールアドレスであることを確認するとcondirmBody関数を実行するようにした。この記事はそのconfirmBody関数を作成するところから続ける。
関数名は「Body(本文)を確認する」という意味にしたく、「確認する 英語」と検索をかけて出てきたのが「confirm」だったのでそうしたのだが、よく考えたらconfirmは確認するという意味でも、どちらかというと「認める」のような意味が強いのでそぐわないようにも思うが、今さら関数名が記述される部分をすべて書き直すのも面倒なのでとりあえずメール返信botのプログラムの中ではconfirmで統一する。今後同じようなシチュエーションがあれば「check○○」にでもしようかと思う。英語って難しい。

confirmBody関数では、引数のメッセージの本文を取得しその内容を確認する。そしてその内容に応じて返信内容を決め、それに応じた関数を起動するようにする。
今回の記事では、メッセージ本文の文字列に「おはよ」が含まれていれば、それにふさわしい返信をする関数(GoodMorning関数)を起動するようにする。

function confirmBody(m){
  var body = m.getBody();
  if(body.indexOf('おはよ',0)!=-1){
    GoodMorning();
  }
}
使用した機能:getBody() - Class GmailMessage - Apps Script - Google Developers
 引数のメッセージmについて、getBodyでその本文を取得できる。ここでは変数bodyに代入している。
 そして、前回も使用したindexOf関数で「おはよ」が含まれればif文内の処理を実行し、GoodMorning関数を起動するようにしている。

function GoodMorning(){
  var to = '受送信に使うアドレス';
  var title = 'Re:';
  var body = '任意の本文';
  var opt = new Object();
  opt.name = 'botからのメールで表示される送信者名'
  opt.replyTo = 'bot用のメールアドレス';
  GmailApp.sendEmail(to,title,body,opt);
}
使用した関数:sendEmail(recipient, subject, body, options) – Class MailApp - Apps Script - Google Developers
続いてGoodMorning関数である。使用した関数はsendEmail関数で、この関数の第1引数はメールの送信先、第2引数はメールのタイトル、第3引数は本文、第4引数はオプションだ。第1~第3引数では文字通りだが、第4引数はname(送信されるメールで表記される送信者名)、replyTo(返信する際の送信先)を保持するオブジェクトだ。これらを引数としてsendEmail関数を実行すると、引数で指定した通りのメールが送信される。

そして最後に、前回記事で作成した未読メール確認関数を自動的に、一定間隔で実行するようにする。
上部のメニューからリソース→現在のプロジェクトトリガーを選択し、新しいトリガーを追加のリンクをクリック。左からconfirmUnRead、時間主導型と選択肢、残り2つのセレクトボックスで実行する間隔を選択すれば良い。
これで設定した間隔ごとに未読メールがあるか確認するようになる。

たったこれだけのコードで、しょぼいなりにメールを自動返信できるようになった。もっとも、今後返信パターンを増やした際、複数のパターンにヒットする本文がある場合どうするか、などの課題はある。
また、GoogleAppsScriptはメールだけでなく、Googleの様々なサービスにアクセスできる。ただ昔をなぞるようにメールの自動返信botを作り始めたが、もう少し実用性のあるものも作れそうだ。例えばカレンダーに接続して、予定がある日の朝にメールを送信するようにする、といったこともおそらく可能だ。今後、このbotを発展させる形で色々と機能を追加して遊んでみたい。

2015/05/18

文系な私がいかに基本情報技術者試験の勉強をしたのか

さて、平成27年度春期の基本情報技術者試験の合格発表があり、私も無事合格することができた。自己採点で多少の自信はあったが、やはり実際に結果を見てようやく安心した、といったところだ。

同じく文系で基本情報技術者試験を受けようとする人の役に少しでも立てるように、この記事では文系である私の基本情報技術者試験合格までの道のりをまとめようと思う。

もっとも、文系だからどうだ、という部分(も無いわけではないが)はほとんどないので、基本情報技術者試験に興味がある人なら誰でも参考になるように書きたい(書くとは言ってない)。

Sponsored Link

そもそも文系で基本情報技術者試験に合格できるのか

結論から言うと全然大丈夫.「情報技術者」というとテクノロジー寄りの色が強いように見えるが,必ずしもそういうわけではない.

例えば「コアコンピタンス」という言葉が出てくることがあったが,これは完全に経営学分野.他にもプロマネだのサービスマネジメントだの戦略だの,むしろ社会科学系と親和性の高い分野は存在する.

従って選択問題では基本的にそうした分野で点を稼いでいく.その上で技術よりのところでも点を取る.そもそも満点を取らないといけない試験ではないので,得意なところと苦手なところでトントンになっていれば良いわけである.

まあ,合格したから言えるって話だけどね.

使用した参考書(記事編集時最新版)まとめ

午前問題対策

私が使ったのはこれ(リンクは記事編集時最新版).正直ある程度人気のある書籍数種類の中であればどれを選んでも大差はなさそう.実際本屋で立ち読みしてフィーリングが合ったものを買えば良いと思う.

Java(午後選択)

そもそもプログラミングを学ぶきっかけにしたいと思って基本情報技術者を受けたのでJavaを選んだ.プログラミングに興味が無いなら表計算とかを選べば良いと思う.

Javaの文法的なところはこの2冊がバイブル.マジでわかりやすいのでおすすめである.プログラミングに全く触ったことのなかった私だが,この本でプログラミングの基礎の基礎を学べた.

試験のテクニック的なのはこの本を使った.

午後問題の前半の選択はどれを選ぶべきか

「プロジェクトマネジメント」「サービスマネジメント」「システム戦略」「経営戦略・企業と法務」にあたる問6、問7あたりは文系でも取っ付き易い、というよりむしろ我ら文系のテリトリーだ。理系の方々はこの分野が苦手で、積極的にこれらを捨てにかかるらしい。

4問選択なのであと2つだが、「ソフトウェア設計」(問5)は割と解きやすい。残り1つは「ハードウェア」「ソフトウェア」「データベース」「ネットワーク」から選ぶことになるが、そこはそれぞれの適正に合わせて、としか言いようがない。

データベースは少し勉強すれば得点源になるような雰囲気はあったので、余裕がある人はそれがいいかもしれない。私はデータベースにまで手を付ける余裕がなかったので、まずDBを切って、残りの問題の難しそうな問題を切る、という消去法を選んだ。

勉強期間・時間

「期間」を試験の何ヶ月前に勉強を始めたのか、という意味ならばそれは1年ということになる。ただしこれはJavaの勉強にかけた時間のほうが長い.

プログラミング言語(Java)以外の勉強を始めたのは試験の2ヶ月ほど前だ。勉強3日に2回、1回あたり2時間くらいのペースだったと思う。つまりプログラミング言語を除けば勉強時間は40時間かそこらだろう。

プログラミング言語のほうはかなり長期、数ヶ月間に渡って勉強したが、こちらは週末にそれぞれ1,2時間ずつくらいのペースだった。あまりに長期間に、散発的になりすぎて勉強時間はわからないが、上に挙げた参考書をそれぞれ1週するくらいの勉強量、ということは確かだ。

勉強方法

午前・午後ともに参考書→過去問の流れ。特に午前問題は過去試験からの流用が数多くあるので、たくさん解けば解くほどいい。


いわゆる文系でIT系に就職したい!と思っているなら,実務の役に立つかはともかくとして,自分の適性を確かめるきっかけとして,勉強をはじめるきっかけとして,そしてある程度勉強し,かつ適性があることを示す証拠として有用かなと思う.

2015/05/13

スマホサイズで、Windows8.1が動く端末

 富士通株式会社は、5月14日から開催される「富士通フォーラム 2015」で、Windows 8.1を搭載する5.54型端末を参考出展する。
 あくまで参考出展であり、実際に製品化された場合の仕様とは異なるが、参考展示機の主な仕様は、5.54型フルHD(1,920×1,080ドット)液晶ディスプレイ、CPUに"最新世代"Atomプロセッサ、メモリ2GB、ストレージに32GB eMMC、OSに英語版Windows 8.1を搭載。外部インターフェイスはmicroSDカードスロット、Micro HDMI、Micro USBなど。重さは280g。ロックフリーのSIMカードスロットを搭載し、MVNO SIMなどを使用してモバイルネットワークへの接続も可能であるという。
富士通、フルWindows 8.1搭載の5.54型スマホ型端末を開発 ~最新世代AtomとフルHD液晶搭載で280g - PC Watchより引用

結構面白そうな端末ではないだろうか。もし一般向けに発売されれば、スマホサイズでありながらフルサイズのWindowsが載るのであり、当然Flashも使えるわけで、色々捗るのは間違いないだろう。

ただし、これはWindows8.1よりは今年中には出そうなWindows10のほうが相性が良さそうな気もする。現状ではWindowsストアアプリは品揃え豊富とは言えないし、この画面サイズで解像度がHDとなるとタッチやスマホに最適化されたソフトでないと使いにくい気もする。 一方Win10ユニバーサルアプリであれば、フルサイズのWindows上でスマホアプリっぽくソフトウェアを使うことができるし、外部ディスプレイやキーボード、マウスと接続すれば普通のパソコンとして使うこともできるだろう。

一方で気になるのがWindows10のシステム要件。マイクロソフトは8インチを境界にして、8インチ以上をWindows10(for PC)、8インチ未満のものをWindows10 for Phones and tablets、と分けるようだ。
例外として業務用端末では8インチ未満の端末でもfor PCが使えるようになるものがあるのではないか、という観測もある。今回の富士通の端末も企業向けのようだし、その流れでWindows10へのアップグレードがあり得るかもしれない。

一般消費者向けにも是非スマホサイズのWindows10 for PC端末が出て欲しいのだが、果たしてどうなるか。個人的には台湾あたりのメーカーがしれっと開発しそうな気もしているが、どうなるだろう。

2015/05/11

Google Apps Scriptによるメール自動返信botの作成(1)

自分語りで一記事余計に使ってしまったため、この記事が本編となる。

前提
  • 自動返信のプログラムにはGoogle Apps Scriptを用いる。
  • 返信内容のパターンは自分で考える
  • この記事では本文に「おはよ」が含まれ、かつ特定のアドレスからのメールに対して予め決められた内容を返信するプログラムを作る
必要なもの
  • 自動返信bot用のGoogleアカウント
  • bot用とは別のメールアドレス(Gmailでなくてもよい)

さて、さっそく実際のプログラミングに移ろう。まず今回使用する「Google Apps Script」を使用できるようにする。
まずはGoogleドライブへ入り、新規→その他→「アプリを追加」を選択。検索フォームに「Google Apps Script」と入力し、検索する。恐らく一番上に出てくるであろう「Google Apps Script」の右側にある「接続」をクリック。
そしてドライブの最初の画面に戻り、再び新規→その他と進むと、「Google Apps Script」(以下、GAS)が出現しているはずである。これをクリックする。
クリックするとGASのメニューが表示されるので「空のプロジェクト」をクリックする。新しくプロジェクトが作成されるので、ここにメールの返信スクリプトを書いていくことになる。

さて、実際のプログラミングに移る前に、処理の内容を検討する。

  1. 受信トレイからメールを取得する
  2. 取得したメールが未読かを確認する
  3. 未読であればメールの差出人を確認し、自分が送ったメールアドレスか確かめる
  4. 自分が送信したものであれば、本文を読み込む
  5. 本文に、決められたパターンと合致する文言があるか(今回では「おはよ」)確認する
  6. パターンと合致した場合、そのパターンにふさわしい内容の返信メールを作成し、送信する。

これらの機能ごとに関数を作成していくことにする。

1.受信トレイからメールを取得し、未読かどうかを確認する。(confirmUnread関数)

function confirmUnRead(){
  var thds = GmailApp.getInboxThreads(0,10);
  for(var n in thds){
    var thd = thds[n];
    if(thd.isUnread()){
      thd.markRead();
      confirmFrom(thd);
    }
  }
}
基本的に文法はjavascriptに準拠している。その上でGoogleが用意した関数その他を利用していく、というスタイルになる。
var thds = GmailApp.getInboxThreads(0,10);
使用した関数:getInboxThreads(start, max) - Class GmailApp - Apps Script Google Developers 
早速Googleが用意してくれた関数を用いる。
ここでは受信トレイの最初から10番目までの「スレッド」を取得している。プログラミングではいつものことだが、一番最初のスレッドは「0番目」なので注意する。
  for(var n in thds){
    var thd = thds[n];
    if(thd.isUnread()){
      thd.markRead();
      confirmFrom(thd);
    }
  }
使用した関数:
- isUnread() - Class GmailThread - Apps Script Google Developers
- markRead() - Class GmailThread - Apps Script Google Developers  取得したのはスレッドの配列なので、そこからスレッドをひとつずつ未読かどうか確認する作業を行う。その作業では当然for文を使うが、javascriptに慣れていない私はここで一回詰まってしまった。
for(var n in thds){
 この部分なのだが、Javaでいうところの拡張for文のノリ、つまりスレッドの配列からスレッドを1つずつ取り出せるのだろうと思って書いたのだがうまく動かず、リファレンスを読むとどうも違うようで、各オブジェクトのプロパティを取り出してnに代入しているようだ。
 より具体的には「取り出したものが配列の何番目か」、というのがnに代入されているようだ。
var thd = thds[n];
 というわけで、このように書けばthds配列中のすべてのスレッドを取り出せることになる。取り出した配列はisUnread関数で未読かどうかを確認、もしそれがtrue(未読)であれば、if文内の処理(スレッドを既読にし、スレッドを引数としてconfirmFrom関数を実行)を行う。

2.取得した未読メールが自分からのメールか確認する(confirmFrom関数)
さて、そのconfirmFrom関数の内容だ。

function confirmFrom(thd){
  var msgs = thd.getMessages();
  for(m in msgs){
    var m = msgs[m];
    if(m.getFrom().indexOf('自分が送信に使うメールアドレス',0)!=-1){
        confirmBody(m);
    }      
  }
}
使用した関数:
- getMessages() - Class GmailThread - Apps Script Google Developers
- getFrom() - Class GmailMessage - Apps Script Google Developers  引数として渡されているのは「スレッド」であり、いくつかの「メッセージ」の連なりだ。よって、このスレッドからメッセージを取り出す。受信トレイからスレッドの配列を取り出したのと同様に、getMessages関数を用いてメッセージの配列を取得しmsgsに代入し、これまた同様にfor文を用い、メッセージの配列からメッセージを取り出す。
 取り出したメッセージの送信元は、getFrom関数を用いて取得する。そして更に、その送信元の文字列に自分のメールアドレスが含まれているか、indexOfを用いて検索する。indeOfはGAS特有の機能ではなく、javascript標準の関数だ。第一引数に検索する文字列、第二引数に走査を開始する位置を入れると、その検索する文字列がはじまる位置を返してくれる関数で、見つからなければ-1を返す。よって、この関数の戻り値が-1でなければ、送信元アドレスの文字列に自分のアドレスが含まれていることがわかる。
 どうしてダイレクトに
m.getFrom=="自分が送信に使うメールアドレス"
としなかったかというと、getFromで取得される送信元は、送信時に使ったメールクライアントなどによって同じアドレスでも別の送信元文字列となることがあるからだ。
具体的には、Gmailでは「(登録した送信者名)<送信に使用したメールアドレス>」の形となる。送信者名を変更したりした場合にプログラムを修正しなくて済むように、ここはindexOfを用いることにした。

取得したメッセージが自分(が送信に用いるアドレス)からのメールであるときには、メッセージを引数としてconfirmBody関数を実行するようにした。これ以降の内容については次回の記事で扱うことにする。

2015/05/10

Google Apps Scriptによるメール自動返信botの作成(プロローグ)

私には両手では数え切れないほどの黒歴史がある。そしてごく最近にもその数を増やしては、明け方に目が覚めた拍子に「うわあああああああああああ」となって布団で悶えている。
一方で、私自身は黒歴史と思わないものの、他人曰くそれは黒歴史だというものが存在する。これは私自身全く恥ずかしいと思わないので、積極的にネタにしていく。メール自動返信botもその一つだ。

あれは私が高校生の頃だったと思う。私はTwitterをフル活用してメールの自動返信botを作り、botとメールするという遊びに興じていた。うろ覚えなのだが、仕組みはこうだ。

  • Twitterアカウントを2つ用意する(自分で操作する用と、bot用)
  • bot用アカウント側で、リプライに対して適切な(そしてお粗末な)リプライを返すようなbotを設定する。
  • 操作用アカウントで、botアカウントへのリプライを送るメールアドレスを設定しアドレス帳に登録。更にリプライがきたときにメールで通知されるようにして、そのメールアドレスもアドレス帳に登録。
  • メールを用いてbotにリプライを送ると、botからリプライが返ってきて、それがメールで届くようになる。

確かこのような仕組みだった。これを自分で思いつくとも思えないので、恐らく何かしら元ネタがあったのだろうと思うが、思い出せない。妄想力が今よりも豊かだったので、ご丁寧にキャラ設定まで色々考えていた。確かに闇深いといわれたらその通りだと思う。
botを動かすためにサーバーが必要だったり、返信パターンを考えるのに飽きて、結局そのうちやめてしまった。

あれから3年以上は経ったことになる。ネットサーフィン(死語)を楽しんでいた私は、「Google Apps Script」なるものの存在を知る。これはjavascriptを用いてGoogleの様々なサービスを操作できる、というものらしい。
Googleのサービス。マップ、カレンダー、ドライブ…色々ある。あとは忘れてはいけない、Gmailだ。Gmailを直接操作したらどんなことができるんだろう…そう考えだした時、3年以上前のメールの自動返信botを思い出したのだった。
Gmailを直接操れば、Twitterを介すような面倒なルートを取る必要はない。これを使って3年前のリベンジと行こうか、と思い立った。

実は思い立ったのは半年以上前の話だ。Google Apps Scriptではjavascript(正確にはjavascript互換の言語)を用いる。その当時、まだjavascriptを使ったことがなかった私は、ひとまずjavascriptを習得することにした。
…のだが、GoogleAppsScriptそっちのけでjavascriptにハマり、結局スクフェスLP回復時間計算スクリプト、艦これ:制空値算出、文章スタイルプレビューと立て続けに作った。
仕方がない、JavaやPythonと違ってHTML+Javascriptは公開も楽だし、ボタンやらフォームやらを使って視覚的なものになるので楽しいのである。

javascriptにもだいぶ慣れ、時は来た。いよいよ3年前のリベンジを始める。
恒例の熱い自分語りで尺を取ってしまったので、本編は次記事以降とするが、Googleが用意しているAPIが充実しているので、少しjavascriptの知識があれば誰でもbotを作ることができると感じた。
メール以外の機能も利用できるので、遊び方は無限にありそうで非常に楽しみだ。

2015/05/08

VisualStudio Codeを使ってみた。

先日の「同一formの別のselectの操作」の記事で紹介した「途中で詰まったコードの例」、実はあれは記事に合わせて新しく書き起こしたコードになる。詰まった経験自体がなかったわけではなく、艦これ対空値計算スクリプトを書いている時には、formごとに関数を作らず済む方法があるのではないかと詰まったのは事実だ。
ただし、そのときのコードを保存するのを忘れていたのだ。忘れていた、というよりは、どん詰まって「あああああああああ」などと言いつつ髪を掻きむしってその時のコードをCtrl+Aで全選択肢、Deleteで消した、というのが正しいのだが。
ともかくそのときのコードは存在しない。だが記事を書くに当たり、その「詰まった」コードを掲載したかった。よって新しく「わざと詰まらせたコード」を書くことにして、先日の記事のコードなのだ。

わざわざ詰まるコードを書くというのもなかなか面倒だ。そう思い、少しでも手間を省くために先日のMicrosoft「Build」で発表されたVisualStudio Codeを試してみることにした。

この「VisualStudio Code」は様々な言語の文法確認やサジェストをしてくれるエディターで、とにかくサクサクと動く。この手のツールは以前Androidアプリを作っていた時にEclipseを使っていた。VisualStudio CodeはEclipseより機能は少ないが、それを考慮しても圧倒的に軽い。Eclipseではもっさりする私の低スペックPCでもサクサク動くのはとても気持ちがいい。
軽くコードを書くときは今後、VisualStudio Codeを使ってみようと思う。機能が少ないと言いつつ、(私は使ったことがないが)Gitとの連携もできるようだし、機会があれば試してみたい。

2015/05/05

[HTML/javascript]“同一formの別のselectの操作”を複数のformについて一つの関数で行う。

この記事は以前製作した艦これ対空値計算スクリプトを事例に書いているため、艦これを知らない人にはわかりにくい説明となっている可能性があります。
一般性をもたせた結論はこちらになりますので、すっ飛ばして読んでいただいたほうがわかりやすいかもしれません。

艦これ:制空値算出は、6隻分の対空値を計算するために6つのformを使用している。
それぞれの艦について1つずつformを使用し、艦1から6まで、それぞれ「ship1」から「ship6」までのnameが付与されている。

一方、このスクリプトに必要な機能(関数)は以下の

  • 「艦種」が選択された際に、それに応じた「艦名」をセットする→setShipvar関数
  • 「艦名」が選択された際に、それに応じた「艦載機の積載数」をセットする→setShipname関数、loadsubmit関数
  • 「艦載機」が選択された際に、それに応じた「対空値」をセットする→setAircraft関数、submitAircraft関数

3つの機能が必要だ(本当はページ読み込み時に「艦種」に「正規空母」などをセットする関数と、対空値を計算する関数もあるがそれは今回の内容とは関係ないので割愛する)。

これらの関数を6つのform分用意するのは面倒くさい。しかし、積載数は6隻分別々に用意された行列に登録しなければならない。
そしてこれは一つのform内でも同じ問題が生じる。スロットは4つあり、対空値を登録するときには当然、それに応じた行列に値を登録しなければならない。となると、スロット4つ分、関数を用意することになってしまうが、それもやはり冗長だ。

故に、ない頭を振り絞って考える。どうにかこれらの関数を一つにまとめることはできないか…。難しいのは、selectで何かが選択された時に、同一form内の別のselectの内容を変更させたい、という部分だ。具体的には、艦種で「正規空母」を選んだら艦名には「赤城改」などをセットし、「軽空母」を選んだら「鳳翔改」などをセットする、といった具合だ。別のselectの内容を変更する以上、そのselectをidなりnameなりで特定しなければならない。それをform6つ分、一つの関数で処理する、というところが難しい。
いろいろ考えて、一つの解決策を思いついた。鍵となったのはformタグでselectタグを囲んでいることであった。

formは艦ごとに用意されているから、そのnameを確認することで何隻目を選択しているのか確認することができる。具体的にはこうした。

function setShipvar(selected){
 var num = selected.selectedIndex;
 var shipvar = selected.options[num].text;
 var formobj = selected.parentNode;
 var jid = formobj.shipname.id;

 switch(shipvar){
  case '正規空母':
   //"jid"を使って正規空母が選択された時の処理を記述。jidは、この関数を起動したformにおける艦名選択のselectのid。

鍵となっているのはvar formobj = selected.parentNode; と var jid = formobj.shipname.id;だ。同時に、関数に引数を設定した。それぞれのselectタグは、何か項目を選択されたときに自分自身を引数として関数を呼び出すようにした。

例えば艦1のformで艦種「正規空母」を選んだとする。(初期段階では空欄の選択肢だが、ページ読込完了時に艦種を6つのformにまとめてセットするようにしている。)するとonChangeで設定されている関数が呼び出される。この場合、自身を引数としてsetShipvar関数が呼び出される。
関数側では渡された引数をselectedという名前で扱っている。これでひとまず、setShipvar関数で6隻分扱うことについての最初の一歩を踏み出したことになる。
selected = document.ship1.shipvar なので、選ばれた艦種は

var num = selected.selectedIndex;
var shipvar = selected.options[num].text;

で取得できる。これで「shipvar」には「正規空母」が代入されていることになる。
次なる問題は、どうやって「艦名」のselectを取得するのか、ということになる。6隻分の艦名selectに一意のidを付与すれば取得できるが、それでは関数をひとつにまとめることができない。ここを前述の「鍵」でクリアすることにした。

var formobj = selected.parentNode;
var jid = formobj.shipname.id;

ここでは「var formobj = selected.parentNode;」でselected、即ち引数として渡されたselectタグの親となるタグ、つまりformタグを取得できる。艦1のformであれば「document.ship1」に当たる部分ということだ。
次に「var jid = formobj.shipname.id;」がある。これは艦種が選択されたformの、shipnameというnameを持つselect(つまり一つ下のselect)のidをjidに代入する、という意味だ。あとはこのjidを使ってjQueryを使うなりなんなりして、selectを操作できる。
formで囲んだselectを扱う際には、「document.(form名).(select名)」と言った形で扱う。となれば、form名は一意の名前とし、同じ機能を必要とするselectの名前を同じにすると、form名を指定すれば特定のselectを取得することができ、かつ関数を一つにまとめることができる。この仕様を使って、一意のidを付与しつつ、そのidを直接指定することなく関数を設計することで、複数のformで扱える関数を作ることができた。


結論
  • 同じ操作を必要とするselectは複数のformに渡って同じnameにする。
  • selectのonChangeで関数を呼び出す際、自身を引数にする。
  • 関数側で引数のparentNode(formオブジェクト)を取得し、それを基に別のselectのnameを指定すれば、ベタでIDやnameを指定することなく複数のformに関して、一つの関数で別のselectの操作を行える。

正直言ってjavascriptでやるには不向きなものだったような気もする。

2015/05/04

Windows PhoneをドイツAmazonで買った。

ついに買ってしまった、WindowsPhone。買ったのはLumia 640 LTEだ。日本では発売されていないので、海外からの個人輸入になった。
スマホの個人輸入といえば有名なのはexpansysと1shopmobileだろう。これは香港から発送されるので比較的輸送の時間も短く、利用者も多いので安心できる。
ただし、両者ともLumia 640 LTE Dual(SIMカード2枚挿せる)は早々に発売されたのだが、Lumia 640 LTEがなかなか発売されない。私はSIMカード2枚挿しに興味はないし、Dualのほうが少し高くなるのでLumia 640 LTEの発売を待っていた。そんな中、ドイツのAmazonで割と安くLumia 640 LTEを売っているのを発見したので、購入することにした。
購入方法は「ドイツ Amazon 購入」などと検索すれば色々情報があるので、特に躓くことはなかった。アカウントは以前アメリカのAmazonで作ったものをそのまま使えたので、住所の登録などを省けたのも大きかった。日本以外のAmazonはアカウントを共有できるらしいので、今後英語圏以外のAmazonで何か購入することがあれば、アメリカのAmazonで先にアカウントを作ることをおすすめする。英語ならまだなんとかなるが、ドイツ語はさすがにわからない。

配送業者はUPS。日本の業者と同じく、追跡番号で荷物がどこにあるのかを確かめることができる。発送日は確か4月30日だった。暇人なのでしょっちゅうチェックすると、あっという間に飛行機に載せられたようだ。到着予定日は5月7日。
いや待て、遅くないか。確かに私はドイツに行ったことがないから、どれくらい時間がかかるかわからない。しかし1週間はさすがにかからないだろう。グライダーで運んでいるわけでもあるまい。
まさかと思って調べると、UPSは土日祝日の配送はしないらしく、それでGWを挟んだ7日が到着予定日になっているようだ。しかも平日も日中のみ配達らしい。学校があって受け取れないじゃないか。
こんな人のためにUPSはヤマト運輸に配送を振り替えすることができるらしい。どうせ再配達をヤマトに頼むことになるなら、と思い物は試し、問い合わせセンターに日中不在の旨を伝え、ヤマトに振り替えてもらえないか聞いてみたところ、日本到着後、ヤマト運輸に引き渡され、2日には無事手元に到着した。(ヤマトはGWも配送している。)

早速色々いじくりまわして遊んでいる。レビュー的なことは今後することにしたい。Lumia640はWindows10にアップデートできて、Win10からはアプリが移植されやすくなってアプリ不足も解消される、かもしれないし。ビッグウェーブが来ていると思っているのは、私だけじゃない、と信じたい。

2015/05/01

FC2とWordPressとわたし

※この記事は、Bloggerへの移転前のWordpress時代に書かれた記事です。

紅茶さんが、FC2からWordPressへ移動した私がFC2とWordPressについてどう思っているかに興味があるらしく、私もいつか書こうと思っていたのでいい機会だし書くことにする。
そもそも何故WordPressを選んだのか、というのも紆余曲折あったのだが、それは別の機会にしようと思う。

まずWordPressの機能面のお話だが、不満はない。素の状態では機能面でFC2より劣っているかもしれない(デフォルトではTwitter連携もできない。)ただしプラグインが凄まじく充実しているので、やりたいことはだいたいできるし、やりたくないことまでやろうと思えばできる。プラグインまで考慮にいれれば、WordPressのほうが色々やれると思う。
FC2がプラグインよりは本体でカバーする範囲が広い一方、WordPress本体はあくまでブログの基礎の「き」だけをカバーし、他はプラグインに任せるようにしているのだろうと思う。この辺は設計思想の違いだろう。

とは言っても、私はブログ自体にそれほど面白い機能は求めていない。それこそFC2くらいの機能で十分で、WordPressにもその程度のプラグインしか入れていない。ならFC2でいいじゃねえか、という指摘はごもっともである。
アクセス数を比較すれば、旧ものぐさブルーライト(FC2)は更新なしで1日10近く(7~8程度)、新ものぐさブルーライト(WordPress)は週1程度の更新で同じく1日10近く(12前後)で、大差無い。最も、FC2旧ものぐさは更新すれば当日と翌日くらいは50アクセス、多ければ100アクセスくらいは行くので、まあ影響力というか、リーチはFC2旧ものぐさのほうが長い。
 それでも何故WordPressでぬくぬくしているかと言えば、意識高いっぽい言い方をすれば、コンセプトが違うからだ。

FC2旧ものぐさは、一言で言えばオナニーだった。旧ものぐさの記事から一番のお気に入りを選べと言われればこれを選ぶくらい、個人的には会心の出来の記事だ。旧ものぐさはだいたいがメイプルプレイの絵日記で、何度も言うように何故あんなブログを1日100人も見ていたのか、書いている本人が理解できなかった。言い方を変えれば、自分が書いたブログでなければ、旧ものぐさにアクセスしようとは思わないだろう、ということだ。いっそどこかにスパム報告したいくらいだ。
一方でWordPress新ものぐさブルーライトは、「多くの人でなくても、数少ない誰かの役に立つ記事を書きたい」という動機で書いている。結果として誰の役にも立たず自己満オナニーで終わるかもしれないが、最初から自己満のつもりで書いていた旧ものぐさブルーライトとは根本的に異なる、と自分では思っている。
新ブログにはコメントがほとんどつかないが、それも別にどうでもいいと思っている。私がプログラミング関連で調べる際にお世話になったブログにコメントは全くしていないが、それでも役に立ったと感謝している。そういう存在になれるのが理想なのだ。

もっとも、この記事も属する「ものぐさなつぶやき」カテゴリはどちらかというと長文Twitter、自己満要素の強い記事の集まりなのだが、今のところカテゴリ別記事数を見れば分かる通り、プログラミング関連の記事のほうが多い。
それとアクセス解析を見て密かに喜んでいるのだが、GOD EATER 2 RAGE BURST(GE2RB)で「セルフアバカ」への検索エンジンからのアクセスが非常に多い(あくまでこのブログ内の相対的なものだが。繰り返すが、アクセス数だけ見ればFC2には及ばない)。このブログのコンセプトに合った記事になっているのではないか、と自画自賛している。

旧ブログで最後、メイプルブログについて考えた時、

 ブログの性格が「周りとの環境によって決まる」なら、メイプルブログとしてはじまったこのブログには未だメイプルブログとしての関係がベタベタと貼り付いているわけで、その意味でこのブログではメイプルブログであることをやめることはできないのかもしれない。
と書いたように、あのブログは7年間の足跡を消すことはできないし、それが悪いことだとも思っていない。ただ新しくやりたいことと合致しそうにないからWordPressへ移ってきて、そのコンセプトからしても、アクセス数が少なかろうが旧ブログに戻ることはまず無いだろうと思う。(ただし、上述のように、それがWordPressでなければいけなかったわけではない。例えば新しくFC2のアカウントを作って新ブログを作る、というのも悪くない選択肢ではあったと思う。)