私の会社(アルファサード株式会社)では、第13期から電子公告を始めました(ちゃんと定款変更もしました)。

電子公告を始めた経緯というか考えなどはまた別の機会に書こうと思いますが、ここでは表題の通り貸借対照表のマークアップを取り上げます。

「貸借対照表(B/S)」こそ「複雑なデータテーブル」ですね。

アクセシビリティ・サポーテッド(AS)情報:H43

見解としては「要注意(スクリーンリーダーによるサポートが十分とはいえない。)」

id属性とheaders属性を使わないですむように、できるかぎり単純な構造にしたほうがよい。

ということで、表を3分割することも検討したのですが、流動資産と流動比率を対比してみたい(流動比率とかを見たい)とかだと同じ表のほうがいいだろうかとか、でもそうなると空のセルをつくってセルの位置を調整したほうがいいんだろうかとか。そもそも経営指標って様々な切り口があるので「何と何を並べるのがいいのか」など、決算公告ってPDFで提供してる会社が多いですが「貸借対照表の公開について」みたいなのを国(法務省)や東証がガイドラインを示すとかしてもいいんじゃないかと思ったりした次第です。

資産の部、負債の部、資本の部を別のテーブルに分割する方法も検討した

現在のところ結論があるわけではないですが、結局は idとheaders属性によるひも付けを選択しました。ご意見などありましたらいただけると嬉しいです。今後のユーザーエージェントの対応に期待します。

ということで、以下マークアップ。

<table>
<caption>貸借対照表</caption>
<tbody>
<tr>
    <th scope="col" colspan="2" id="assets"><strong>資産の部</strong></th>
    <th scope="col" colspan="2" id="liabilities"><strong>負債の部</strong></th>
</tr>
<tr>
    <th id="asset-1">現金・預金合計</th>
    <td headers="assets asset-1">254,325,832</td>
    <th id="liability-1">仕入債務合計</th>
    <td headers="liabilities liability-1">5,768,438</td>
</tr>
<tr>
    <th id="asset-2">売上債権合計</th>
    <td headers="assets asset-2">37,361,649</td>
    <th id="liability-2">他流動負債合計</th>
    <td headers="liabilities liability-2">70,318,782</td>
</tr>
<tr>
    <th id="asset-3">棚卸資産合計</th>
    <td headers="assets asset-3">534,600</td>
    <th id="liability-3">流動負債合計</th>
    <td headers="liabilities liability-3">76,087,220</td>
</tr>
<tr>
    <th id="asset-4">他流動資産合計</th>
    <td headers="assets asset-4">523,689</td>
    <th id="liability-4">固定負債合計</th>
    <td headers="liabilities liability-4">84,331,000</td>
</tr>
<tr>
    <th id="asset-5">流動資産合計</th>
    <td headers="assets asset-5">292,745,770 </td>
    <th id="liability-5"><strong>負債合計</strong></th>
    <td headers="liabilities liability-5">160,418,220</td>
</tr>
<tr>
    <th id="asset-6">有形固定資産計</th>
    <td headers="assets asset-6">36,334,934</td>
    <th scope="col" colspan="2" id="capital"><strong>資本の部</strong></th>
</tr>
<tr>
    <th id="liability-6">無形固定資産計</th>
    <td headers="liabilities liability-6">7,163,609</td>
    <th id="capital-1">資本金合計</th>
    <td headers="capital capital-1">10,000,000</td>
</tr>
<tr>
    <th id="asset-7">投資その他の資産合計</th>
    <td headers="assets asset-7">18,205,477</td>
    <th id="capital-2">利益剰余金合計</th>
    <td headers="capital capital-2">184,031,570</td>
</tr>
<tr>
    <th id="asset-8">固定資産合計</th>
    <td headers="assets asset-8">61,704,020</td>
    <th id="capital-3">純資産合計</th>
    <td headers="capital capital-3">194,031,570</td>
</tr>
<tr>
    <th id="capital-4"><strong>資産合計</strong></th>
    <td headers="capital capital-4">354,449,790</td>
    <th id="assets-capital"><strong>負債・純資産合計</strong></th>
    <td headers="assets assets-capital">354,449,790</td>
</tr>
</tbody>
</table>

CMS大阪夏祭り2016 にて「オーサリングツールとしてのCMSとWebアクセシビリティ」というタイトルのセッションを持たせていただくことになりました。地元大阪で話す機会が最近あまりなかったので、ほぼ1年ぶりですね。

CMS大阪夏祭りビジュアル

去年も「祭り」のつくイベントにいくつか参加させていただいてお話させていただいたのですが、今年もお話します。お祭り男と呼んでください!

会社設立からもう13年、ずっとwebアクセシビリティのことに取り組んでいたんですけど、CMSを事業の中心に据えてからまもなく10年、ATAG(Authoring Tool Accessibility Guidelines (ATAG)) 2.0についても自分自身、再度見直す機会になればと思っています。

また、少し前になりますが、AccSellのポッドキャストに呼んでいただきまして、ツール屋目線でのwebアクセシビリティ語りをさせていただく機会をいただきました。参加いただく方は時間があれば(早送りででも)ざっとお聞きいただければバックグラウンドなどわかっていただけるかもしれません(長いですがw)。

都知事選は行きませんでいた。てか、都知事選への選挙権がないので。法人都民税は払ってんですけどね。東京の都政ってのは東京だけで済まない問題ですから、これから東京都政が良くなって景気が上向いてくれることを願っています。

さて、ログインが必要なページをシェアするのはあまり好みではないのですが。

「倒産」、実は減らず 25年ぶり低水準でも…:日本経済新聞

「ここまで倒産が減ったのは25年ぶりのことだ」。安倍晋三首相は6月1日の記者会見で胸を張った。確かに2015年の倒産は8812件(東京商工リサーチ調べ)と、1990年以来の水準に減少した。今年上半期も改善傾向が続き、中小企業を襲った淘汰の嵐はやみつつあるようにもみえる。しかし、この数字から浮かび上がるのは一つの断面にすぎない。

(中略)

東京商工リサーチの集計では、休廃業や解散といった形で15年に事業の継続を断念した企業は2万6699件。00年と比べると6割増え、倒産件数の3倍に達する。後継者が見つからずに廃業する例もあるとはいえ、法的整理から私的整理などへ企業の末路は移り変わっているようにみえる。

理由の一つとして「金融円滑化法」があるようです。金融機関には金融機関の「貸せない理由」があるわけで、単に返済猶予に応じたところで抜本的な収益改善を図らなければ問題を先延ばしにしているに過ぎません。帝国データバンクや東京商工リサーチのレポートを見るたびに感じていた違和感(そんなに景気が良くなってんだろうかという違和感)ですが、少しだけ腑に落ちました。

私自身、今の商売はともかく、若いころに事業がうまく行かず、それでも借金して引っ張って傷を大きくしてしまった経験があります。その時の経験が「資金繰りに追われだしたら、中小企業の経営者はまともに経営なんてできない」という現在の考えにつながっているわけですが、大切なのは返済を猶予してもらうことではなく、なぜこうなったのか、何を改善したら窮地を脱することができるのかを考えることです。

ま、金融機関担当者の多くが池井戸潤の小説「陸王」にでてくる銀行員 坂本太郎みたいな人ならいいんでしょうけどね(珍しく銀行員が善人?に描かれていました。足袋作り百年の老舗が、ランニングシューズに挑むストーリーです)。

ま、大本営発表は鵜呑みにせず、景気のせいにもせず、精進あるのみです。中小企業の経営ってもんは。

既にPowerCMSでやっているものなのですが、再整理の意味で、メモ(てか、ブログサボってたのでリハビリがてらw)。

config.yaml

permissions:
    system.access_cms:
        label: Can Access CMS
        order: 2000
    system.administer:
        inherit_from:
            - system.access_cms

これで、ユーザーの編集画面にシステム権限「Can Access CMS(CMSへのアクセス)」が追加して表示されます。system.administer... 以下を追加しているので、「システム管理者」にチェックを入れると「Can Access CMS(CMSへのアクセス)」にもチェックが入ります。

管理画面のシステム権限設定エリア

ただ、このまま「保存」しても「MT::Authorに can_access_cms メソッドがない」というエラーが出ます。社内で聞いてみたところ「アクセサを定義する必要があります。」とのこと。

config.yaml

callbacks:
    init_app: $myplugin::MyPlugin::Plugin::_cb_init_app

MyPlugin::Plugin::_cb_init_app

sub _cb_init_app {
    require MT::Author;
    *MT::Author::can_access_cms = sub {
        my $author = shift;
        if ( @_ ) {
            $author->permissions(0)->can_access_cms( @_ );
        }
        else {
            $author->is_superuser()
                || $author->permissions(0)->can_access_cms( @_ );
        }
    };
}

これで、あとはMT側がよしなに処理してくれます。もちろん、この権限の有無による振る舞いの分岐はそれぞれの処理に実装する必要があります。

人気記事を表示するのに GoogleAnalyticsを使ってページビューの順に表示させるという方法(PowerCMSなど)がありますがコメント機能が使われていてコメントが活発にやりとりされているサイトの場合、最近 n日のコメント数を基準にするという方法もありますね。話題になっている記事を抽出するのになかなか適した方法かと思います。

https://github.com/junnama/mt-plugin-lively-discussion-entries

<mt:LivelyDiscussionEntries days="7">
# mt:Entriesと同じタグが利用できる
</mt:LivelyDiscussionEntries>

このような処理の時は MT::Object の count_group_byメソッドを使います。

my $group_iter = MT->model( 'comment' )->count_group_by( {
                                            blog_id => $blog_id,
                                            visible => 1,
                                            created_on => { '>' => $ts } } , {
                                            (),
                                            group => [ 'entry_id' ],} );
my $ids = {};
while ( my ( $count, $entry_id ) = $group_iter->() ) {
    $ids->{ $entry_id } = $count;
}
my $i = 0;
my @entries;
for my $entry_id (sort { $ids->{ $b } <=> $ids->{ $a } } keys %$ids) {
    my $entry = MT->model( 'entry' )->load( $entry_id );
    if ( $entry && $entry->status == MT::Entry::RELEASE() ) {
        push ( @entries, $entry );
        $i++;
        if ( $i >= $lastn ) {
            last;
        }
    }
}

アルファサードでは社内イントラで Xtalk を利用して情報共有を図っています。ま、これは YammerChatter みたいなもんと思ってもらえればいいです。

で、PowerCMSの導入が決まったとか、クライアントのサイトがローンチしたとか大口案件の検収が終ったとか新サービスリリースしたとかのニュースを #goodnews ハッシュタグを付けて投げているのですが、どうもここのところそれが中々定着しない。ただ、これがすごく大切なんだと私は思うのですね。少しその理由を書いてみたいと思います。

会社の空気が悪いニュースに支配されがちな理由

トラブルや問題発生ってのは共有されやすいものです。もちろん組織によるところも多いと思いますが、表立つ、立たないに関わらず「あの件が大変みたいやで」って情報は広がっていきやすい。悪いニュースに頭の中が支配されていると会社の空気がしんどくなるんですね。

良いニュースは共有されにくい

自己矛盾になりますが、ウチのような中小企業の場合、社員に危機感を持たせたり慢心を防ぐ意味から、あまり順調で好業績だよってしょっちゅういわなくなるんですね。どっちかと言えば「まだ目標に到達できていない」「計画までまだ上乗せが必要」というポーズをとることが多くなる。もちろん相当な好業績のときは別ですが、計画到達・未達かどうかはまだ蓋を開けるまでわかんないよ、ってときはそうなりがちです。

#goodnewsは意図的に、少し大げさなくらいに共有したほうがいい

なので、些細なことでも良いニュースは意図的、大げさなくらいに共有、拡散していくといいです。個人でも会社でもそうですけど、良いニュースを積極的に共有しているときは会社の雰囲気っていいんですね。ウチの会社では PowerCMSが軌道に乗り始めた頃は、1導入決まるたびに(その頃は #goodnews ではなく「ワショーイ」発言だったw)共有されてました。ただ、慣れてきちゃうんですね。 なので、そういうの、心がけた方が仕事楽しいよ、っていう話しでした。

この記事は、「やはりお前らのMTMLは間違っている」シリーズ連載第n回目の連載です。

12303936_1018612871539819_7627081906549621209_o

MTタグが数千、下記の例では7500個書いてあるテンプレートの話しです。

    <mt:SetVar name="master_table" key="12000" value="JR山手線">
    <mt:SetVar name="master_table" key="19200" value="東京メトロ千代田線">
    ....同じような記述が7500個くらい記述が続く

DB接続するようなMTタグが一切無いにも関わらず、再構築に数十秒かかります(手元環境では30秒から45秒)。MTSpeenMeterタグを使うとビルドにかかっているのはたかだか3〜4秒。

であれば、ビルドに入る前段階で時間を食っていると考えるのが自然。

時間がかかっているのは MT::Builder の sub compile{}です。要するに正規表現でMTタグをパースする処理。MTタグが多ければ多いほどここに時間がかかります。

要するに、PHPでも以下紹介した事象がスタティックでも発生するということです。しかもPerl、スタティックのパース結果はキャッシュされない(同一リクエスト内ではキャッシュされる模様)。

対策は、MTSetVars、MTSetHashVarsを使うか、素直にデータベースを使う

MTタグの数が少なければパース時間は短くなるため、MTSetVars、MTSetHashVarsを使って纏めて記載する。

でも、この手のデータだったらカスタムオブジェクトでも何でも良いけど素直にデータベース管理が良いと思います。

こんなページができていて、いい傾向じゃないの(上から目線w)、と思ってまして。

ツッコミと言うわけではないですが、僕も最近色々思ってたことが触れられてたので。

ま、同じことなんですけど、何でこういうエントリを書いてるかというと、PerlでMTMLやHTMLを突っ込むのについついPerlのヒアドキュメントを使っちゃうことがあるからなのです。ひとつのファイルで完結するからどうしても手を抜いてそういう実装をしがちなのですが。

僕なら、テンプレートを tmpl/include に置いた上でこう書きます。

sub template_param_edit_entry {
    my ( $cb, $app, $param, $tmpl ) = @_;
    $app->{ plugin_template_path } =
        File::Spec->catfile( MT->component( 'AwesomePlugin' )->path, 'tmpl' );

    my ( $node, $attr, $include );

    $node = $tmpl->getElementById( 'header_include' );
    $attr = { name => 'include/edit_entry_header.tmpl' };
    $include = $tmpl->createElement( 'include', $attr );
    $tmpl->insertBefore( $include, $node );

    $node = $tmpl->getElementById( 'title' );
    $attr = { name => 'include/edit_entry_title.tmpl' };
    $include = $tmpl->createElement( 'include', $attr );
    $tmpl->insertBefore( $include, $node );
}

DOMに慣れている方なら直感的かと思うし。どっちがいいということではなくて、自分が理解しやすい方法で書けばいいと思います、ええ。

※どっちかと言えば各MTタグにidが振られてないとかそういうのが問題かと思う(一回バージョンアップでidが変わったことあるぜ!!)

追記:天野さんから指摘あり。

plugintemplatepath を使う方法は、複数のプラグインで同じことをしようとした時に片方が効かなくなる。

さらに追記

    $app->{ plugin_template_path } =
        File::Spec->catfile( MT->component( 'AwesomePlugin' )->path, 'tmpl' );

    # の代わりに

    $attr = { name => 'include/edit_entry_header.tmpl',
              component => 'AwesomePlugin' };

とする。

sort_by sort_order 指定してみたんだけど、効かない。

  • MT::Template::Tags::Blog::_hdlr_blogs

ハードコーディングされてるんだから。。。

$args{'sort'} = 'name';
$args{direction} = 'ascend';
my @blogs = MT::Blog->load( \%terms, \%args );

こういうところを何とかして欲しいものです。

<mt:Websites>
<mt:WebsiteId setvar="website_id">
<mt:SetHashVars name="website_data">
    name=<mt:WebsiteName>
    url=<mt:WebsiteURL>
</mt:SetHashVars>
<mt:SetHashVar name="websites">
    <mt:SetVar name="$website_id" value="$website_data">
</mt:SetHashVar>
</mt:Websites>
<mt:Loop name="websites" sort_by="key" >
    blog_id : <mt:Var name="__key__">
    blog_name : <mt:Var name="__value__" key="name">
    blog_url : <mt:Var name="__value__" key="url">
</mt:Loop>

追記 : blog_id が10超えるときは 別途並び順用の変数にキーのみ入れて MTLoop sort_by="value numeric" というツッコミが入りました。誰か修正版やっといて。。

追記: GetHashVarプラグインを使うか ObjectLoop プラグインを使えば素直に解決できる

<mt:LoopWithSort name="websites" kind="num" scope="key" order="ascend">
</mt:LoopWithSort>

<mt:ObjectLoop model="website" sort_by="id" sort_order="ascend">
</mt:ObjectLoop>

リッチテキストエディタの是非は別にして、リセットしたいなら局所化しとけよと思ったんだけど、これ普通なんか?エンジニアに必要なのは「想像力」でなはいだろうか?ウェブアクセシビリティ然り。自分の書いたコードがどんな使い方をされるのかを想像できない人はこの仕事向いてないと思うんだが。普通なのかこれ?

html, body, div, span, object, iframe /*略*/ {
  margin: 0;
  padding: 0;
  border: 0;
  outline: 0;
  font-size: 100%;
  vertical-align: baseline;
  background: transparent;
}

リセットされたスタイル。構造が視覚的に把握できない

Facebook

Twitter

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

最近のコメント

Powered by Movable Type 6.2.6