2016年7月17日日曜日

駅の発車メロディ/ベルを再現するソフト 「発メロ駅気分」

さて、僕は昔、「発メロ駅気分」というフリーソフトを公開しました。
...それからはや1年。アップデートも済ませ、ようやく安定軌道に乗っております。そんな中で、このブログで発メロ駅気分の紹介をするに至りました。

発メロ駅気分の概要

最新バージョン(2016年6月現在) 1.1.16.2
主に鉄道駅で使用されている発車メロディを再現します。
このソフトはフリーソフトで、完全無料です。寄付なども含め、金銭類は一切請求いたしません

このソフトでできること

  • 好きな音源・戸閉放送を使用して、駅の発車メロディその他を再現できます。
  • 実物のボタンと接続することができます。
  • ボタン押下音(ボタンを押したときの「カチ」という音)を鳴らせます。
  • 新幹線発車メロディのように、発車メロディを鳴らし始めて一定時間経過後に戸閉放送をかぶせる(逆も可)ことができます。(New!)
詳しくは下の方に説明動画を添付しておりますのでご覧ください。

動作環境

  • Windows Vista以上
  • .NET Framework 2.0以上がインストールされていること(Windows Vista以上なら大丈夫です)

発メロ駅気分の使い方

発メロ駅気分の使用方法です。なお、この動画は1.0.15.1(旧バージョン)時のものです。現段階の最新バージョンにある、「戸閉放送をかぶせる」機能の説明はありません。

「戸閉放送をかぶせる」の使い方


バージョン1.1.16.2を起動した直後の状態です。下の方に追加されている「戸閉放送をかぶせる」というのが今回の新機能です。
チェックボックスにチェックを入れてみてください。そして、右側の入力欄を「9000」にして、発車メロディを鳴らしてみましょう。

どうでしょう?新幹線みたいですよね?これが今回の新機能となります。
なお、今「9000」と入力した欄が遅延の長さを設定するところです。単位はミリ秒で、1ミリ秒は1000分の1秒です。
ここの欄を調整することで、ON押から放送が流れるまでのタイムラグが調節できます。いろいろ試して、いい値を見つけてみてください。マイナスの値(つまり、戸閉放送が先に鳴る)も設定できます。

ダウンロード

ダウンロードはVectorからお願いします。

2016年7月8日金曜日

[PHP]ノロノロ関数、array_pushは極力使うな・count()よりもisset()

今回はPHPのお話です。
PHPには「これでもか」と多くの配列関数があります。

その中でも大変遅い関数がありますので紹介しようと思います。

array_push()

コイツは遅い。ため息が出るほど遅いです。

そもそもarray_push()は、配列の最後に値を追加する関数です。

$hoge = array('ね', 'うし', 'とら');

array_push($hoge, 'う', 'たつ');
/*
[
    "ね",
    "うし",
    "とら",
    "う",
    "たつ"
]
*/
でもこうするくらいだったら、
$hoge[] = 'う';
$hoge[] = 'たつ';
こうしたほうが早いです。ネット情報によると、10倍近く速度が違うらしいです。
ここまで差が出ると、中では一体何をしてるんだと疑いたくなります(^_^;;)。買い物を頼んだら1週間かかって帰ってくるようなものです。
array_push()は追加後の要素数を返しますが、それならcount()を使って個別に調べたほうがいいと思います。

count()

count()は目立って遅い関数ではありません。しかし、使い方によっては速度面で損をしているかも。
count()は配列の要素数を返します。でも、場合によっては要素数を知らなくても済むことだってあるのです。
例えば、
//こうするくらいだったら、
if(count($hoge) === 0){
//こうしたほうが早い
if(isset($hoge[0])){

//また、こうするくらいだったら、
if(count($hoge) >= 6){
//この方が早い
if(isset($hoge[5]){
isset()は関数のような見た目をしていますが、実は違います。これ、if()while()と同じ、言語構造なのです。当然、呼び出しのオーバーヘッドがない分早いです。
ちなみに、empty()も言語構造です。

まとめ

他にもネット上にはいろいろな情報が転がってます。array_search()は遅い、型が事前にわかってるなら==より===のが速い、intval()strval()よりキャストした方がいい、など。

ただ、時と場合によりけりです。具体的な配列の要素数を知りたいなら上で紹介した方法よりもcount()の方がましでしょう。確かにPHPには遅い関数や構文が多いですが(そもそも言語自体遅い)、場面に応じて使い分けられるようにしましょう。

2016年3月31日木曜日

プログラミングに「メモ帳」を使うな?BOM・改行コードについて考える


お久しぶりです。chiko ryoです。

さて今回は、Windowsにデフォでついてくる「メモ帳」でテキストファイルを保存したときに頭を悩ませる「BOM」と「改行コード」について考えてみようと思います。

メモ帳でUTF-8を使うとBOMがついてくる

メモ帳で「名前を付けて保存」すると嫌でもBOMが付いてきます。BOMなしUTF-8を得るには何かしらのツールが必要になります。
そもそもBOMというのは、「このファイルの文字コードはUTF-8ですよー」という意味の制御コードです。文字化け防止にもなるいい奴なのですが、プログラミングでは邪魔になります。
<meta charset="utf-8">
<?php
  echo file_get_contents(/* BOMつきUTF-8空ファイル */);
?>
<div style="background-color:#000;color:#fff;">上に隙間があるはずです。開発者ツールでみると制御記号が入っているのがわかります。</div>
黒いdivの上に変な隙間があるのがお分かりいただけるかと思います。これがBOMの仕業です。

BOM対策

対策としては、
  • メモ帳を使わない(他のソフトを使う)
  • 保存後に手作業で削除
あたりでしょうか。メモ帳ではBOMなしUTF-8が保存できないのでこうすることになります。

メモ帳では改行コードがCR+LFになる

これもなかなかの問題です。

Windowsでは基本的に改行コードはCR+LFです。きっとWindowsで作成したテキストがMac(CR派)やLinux(LF派)でも表示されるように、という配慮(であってほしい)です。

ただ、文字コードがCRだけ/LFだけのテキストファイルをメモ帳で開こうとすると、
メモ帳は「改行はCR+LF」と思っている → LF(CR)が単独でくる → メモ帳は改行だと思わない
といった具合で改行が潰れます。

改行コード問題への対策

  • メモ帳を使わない(他のソフトを使う)
  • 変換する
メモ帳以外のソフトとしては、いろいろと選択肢があります。ちなみに私はサクラエディタを使っています。
また、改行コード問題に関しては、moreコマンドを使えばWindows標準で変換できるようです。詳しくは テキスト・ファイルの行末コードを変更するとかの情報が参考になると思います。

いかがでしょうか。今回はメモ帳のBOMと改行コードについてここまで論じてきましたが、結論としてはMSが強制メモ帳ではできないので他の策を講じる、ということになりそうです。