Excelで時間の合計を出したいときのやり方。

1:20:41みたいな表記がいくつもあって、
全部で何時間なのか知りたいときのやり方。
普通にSUM関数で合計を出そうとするとよくわからない結果になる。
どうやら書式が正しくないっぽい。
それを修正するには、

1.合計の値が入ったセルを右クリック、セルの書式設定を選択
2.表示形式タブを選択
3.分類からユーザー定義を選択
4.種類から[h]:mm:ssを選択。なければ種類のところに自分で入力してOKを選択

これで正しい表記で表示される。書式の説明は↓

記号 説明
h 時刻 (0〜23) を表示します。
hh 1 桁の時刻には 0 を付けて時刻 (00〜23) を表示します。
m 分 (0〜59) を表示します。
mm 1 桁の分は、0 を付けて分 (00〜59) を表示します。
s 秒 (0〜59) を表示します。
ss 1 桁の秒は 0 を付けて秒 (00〜59) を表示します。

[h]という表記は、

記号 説明
[h]:mm 24 時間を超える時間の合計を表示します。
[mm]:ss 60 分を超える分の合計を表示します。
[ss] 60 秒を超える秒の合計を表示します。

かっこがないと24時間を越えた分は表示されなくなるらしい。
合計時間が変だったのはこれが理由だった。
今回は合計時間を出したかったんだけど、
他にも便利そうな書式があったので紹介する。

記号 説明
h AM/PM 12 時間表示で時刻の後に AM または PM を表示します。
h:mm AM/PM 12 時間表示で時間と分の後に AM または PM を表示します。
h:mm:ss A/P 12 時間表示で時間と分と秒の後に A または P を表示します。

SUM関数はこちらを参考に。
合計値を入力したいセルを選択して、

=SUM(L7:L8)

という感じで関数を入力する。
上記はL7からL8までの合計を出すという意味。
セル番号を変えれば指定した部分の合計が出せる。

参考:
Excel のセルの表示形式で  ユーザー定義  に使用できる書式記号について
Excel(エクセル)基本講座:合計の関数

FirefoxでMTのカテゴリ選択ができなくなった。

調べたらfirefoxのアップグレードで追加されたDOM APIの新しいプロパティとMTのjsで使っているプロパティ名が同じで名前がかぶってた。
Firefox 16 のサイト互換性に関わる修正のまとめ
itemIdというプロパティがそれ。
MT側では2つのjsファイルの複数箇所で使われてた。
一部を書き出すとこんな感じ。

mt_core_compact.jsの399行目

var itemId=ancestor.itemId;

List.jsの315行目

div.itemId = items[ i ].id;

プロパティ名って予約語とは違うし、
どんな名前にするかはプログラマが決めれたほうがいいと思う。
でもW3Cが草稿として書いてるならそっちが優先されるのは仕方ないなと思った。
ブラウザはその草稿を早めに実装するものだから。うーんという感じ。
itemIdってつい書いてしまいそうなのでMT以外にも影響がでそうな予感。

モジラのページには独自のプロパティを使うときは、
datasetプロパティを使ったほうがいいと書いてあるのでどんなものか見てみた。
要素のプロパティはdata属性を使って記述するようだ。
それを取得して要素の属性にアクセスする。
data属性の名前は以下の規則に沿うとのこと。

  • どんな場合でもxmlから始めてはいけない
  • セミコロンを含んではいけない
  • 大文字のAからZを含んではいけない

最初の項目の意味がよくわからないんだけどどういうことだろう。
data属性は以下のルールでキーに変換されるとのこと。

  • ハイフンは削除される
  • ハイフンのあとに続く文字は、ハイフンが削除される前に大文字に設定される

サンプルのコピペだけどこうなるらしい。

<div id="user" data-id="1234567890" data-user="johndoe" data-date-of-birth>John Doe
</div>

var el = document.querySelector('#user');

// el.id == 'user'
// el.dataset.id === '1234567890'
// el.dataset.user === 'johndoe'
// el.dataset.dateOfBirth === ''

el.dataset.dateOfBirth = '1960-10-03'; // set the DOB.

// 'someDataAttr' in el.dataset === false

el.dataset.someDataAttr = 'mydata';
// 'someDataAttr' in el.dataset === true

ところがdatasetプロパティはIEでは未実装。
そんでもってW3Cの草稿に書かれているということは、
Firefox以外のモダンブラウザでもそのうち実装される。
そうなれば今のところFirefox以外のブラウザでは動いてるコードが動かなくなるんだなー。
違うブラウザ使えば大丈夫、というのは問題の先送りってことか。
公式で配布されてるパッチを適応するのがよさそう。
Firefox 16 でカテゴリおよびフォルダの選択が保存できない。

IE9でflashのTextField部分が表示されない

こんなのがあって、日付の差分からあと何日って表示するコード。

var dif:int = Math.ceil(milSec / (24 * 60 * 60 * 1000));
countDown.text = "" + dif + "";

なぜかIE9だけTextFieldを使ってる数字部分がでない。
int型をString型にしてるから?と思って型をあわせてみたけど違うっぽい。
いろいろ悩んで、ふと気づく。
ブラウザから直接swfを開いたときはうまく動くけどhtmlに埋め込むとでない。
これはhtml側になにかありそう。
head内で見慣れないswfobject_modified.jsってのを読み込んでる。
なんだこれは!調べたらDreamweaverでswfを挿入するときに使われるらしい。
調べたらここがでてきた。
再生は止まらないけどヒントになりそうだ。
wmodeってなんですか?と見てみたらいろいろでた。

wmodeのもたらす不具合

IEのFlash Playerが遅い件と、wmodeとの悩ましい関係

HTMLへSWFをEmbedする時のパラメータ WMODEって?

Flash の埋め込みパラメータ wmode で発生したトラブルいろいろ

全然知らなかったんだけどこれは普通に困る。
これかなーと思い、

      <param name="wmode" value="opaque" />

      <param name="wmode" value="window" />

にしてみる。うまくいった!
テキスト部分がflashの裏側にあって非表示になってたってことなのかな。
なんでIE9だけなんだろうか。
OSやブラウザやflashのバージョンによって違うみたいで完全に調べるのは大変そうだ。
でも文字位置が他ブラウザと違ってズレてるしサイズもなんか小さい。
なんだこれ。んー困った!

PHPUnitでテスト

まずはPHPUnitのインストールから。PEARは入ってるので、

pear config-set auto_discover 1
sudo pear install pear.phpunit.de/PHPUnit

と入力する。
関係ないけどComposerってまだ使ったことないんだよな。便利なのかな。
インストールが終わったら入ったか見てみる。

phpunit --version
PHPUnit 3.7.8 by Sebastian Bergmann.

おっけい。
テスト書いてみる。

<?php

require_once 'PHPUnit/Autoload.php';

class Unagi extends PHPUnit_Framework_TestCase
{
  public function testlistElement()
  {
    $stack = array();
    $this->assertEquals(0,count($stack));
    array_push($stack,'foo');
    $this->assertEquals('foo',$stack[count($stack)-1]);
  }

  public function testclassName()
  {
    $classname = get_class($this);
    $this->assertSame('Unagi',$classname);
  }
}

テストの書き方にはまったく書いてないけどPHPUnit/Autoload.phpを読み込まないとエラーがでるよ。
ここに書いてあった。当然といえば当然だけど素直な人はハマるよ。
test.phpとして保存。テストが書けたから動かす。

phpunit test.php

テストが通れば以下のように表示される。

PHPUnit 3.7.8 by Sebastian Bergmann.

..

Time: 0 seconds, Memory: 2.50Mb

OK (2 tests, 3 assertions)

メソッド名の最初に"test"を付けないとテスト対象にならない。
テストを書いた開発の流れはここがわかりやすい。

FlashDevelopでAIRアプリ開発の設定

FlashuBuilderではなくFlashDevelopの方でもAIRをやってみようと思って設定をした。
JavaやNET Frameworkはインストールされてて、FlashDevelopが動くという前提で進めるよ。
それもまだならこちらを見てインストールする。

プロジェクト作成

FlashDevelopを立ち上げて最初にプロジェクトを作成。AIR Mobile Flex Appというのを選択する。プロジェクト名は好きな名前をつける。
無事にプロジェクトが作成されると、右側にプロジェクトのディレクトリが表示されるので、AIR_Android_readme.txt(iPhoneの場合はAIR_iOS_readme.txt)というファイルを開く。そのファイルに書かれた手順で設定を行う。

証明書の作成

プロジェクト内のbat\SetupSDK.batというファイルを右クリック。実行を選択する。Flex SDKAndroid SDKのパスはそのままで大丈夫だと思う。
続いて、bat\CreateCertificate.batというファイルを右クリック。実行を選択する。ここでエラーがでた。どうやら証明書の作成に失敗したみたい。ここを参考にして環境変数のPathを修正。一旦、FlashDevelopを終了して再度立ち上げ、application.xmlの2行目

<application xmlns="http://ns.adobe.com/air/application/●●">

の●●の部分に現在のAIR SDKのバージョンを入力する。FlashDevelopのインストール時にAIR SDKも一緒にインストールしてるなら

C:\Program Files\FlashDevelop\Tools\flexsdk\AIR SDK Readme.txt

にバージョン番号が書いてあるのでそれを入力。
再度、bat\CreateCertificate.batを右クリックして実行を選ぶ。コマンドプロンプトが表示されて少ししたら証明書が作成される。完了したらパスワードが表示されるのでメモしとく(何に使うのか分からないけど念のため)。certフォルダの中に証明書が作成されていればOK。

実行ファイルのビルドとアプリケーションの実行/デバッグ

F8を押してビルド。その後F5を押して実行/デバッグするとデスクトップ上でAIRが動作する。この時点でデスクトップ上で開発ができるようになる。ここでやめて開発に入ってもいいけど実機で動かしたいなら次のステップへ。

デバイスにAirRuntimeをインストール

bat\InstallAirRuntime.batを右クリックして実行。USB接続してるAndroidにAirRuntimeがインストールされる。そしてRun.batを開き、

::goto android-debug

コメントアウトを解除する。代わりにgoto desktopをコメントアウト。F5を押して実行/デバッグすればAndroidAIRが実行される。これで設定は完了。

エクセルの画像をコピーする

エクセルに直接貼り付けられた画像。
コピーしてphotoshopで開くと画質が荒くなってて困る。
なにかいい方法はないかと思って試した方法を紹介。

1・左上のファイルからWebページとして保存を選択
2・htmファイルと関連するフォルダが作られるのでそのフォルダを開く
3・欲しい画像がpngファイルとして生成されてるのでそれを使う

今回はこれでなんとかなった。
別のやり方でこんなのもあるみたい。

jQueryのresize()を実行後にページを再読み込みしたい

ウインドウのリサイズイベントでページの再読み込みをしたくて以下のコードを書いた。

$.fn.reload = function(){
  $(window).resize(function(){
    location.reload();
  })
}

試しにウインドウサイズを変更したけどなぜか無反応。
でもこっちは動く。

$.fn.reload = function(){
  $(window).resize(function(){
    location.href = location.href;
  })
}

ちなみにbindも同じ。

$.fn.reload = function(){
  $(window).bind('resize',function(){
    location.href = location.href;
    //location.reload();うごかない
  })
}

これと同じだと思う。
それぞれの違いは、

  • location.href 新しくhttpリクエストをしてページを開く
  • location.reload 開いたページを再読み込み

なんだけど原因がわからない。
jQueryのソース読んでみようかな。
これとか?と同じだと思う。