徒書

徒に何か書いています。


自己流パイプフラッグ制作

※この記事は 川崎フロンターレ Advent Calendar 2016 の12月20日分として寄稿するものです(遅れてすみません)。12月19日の記事は 【蹴/川崎】フロンターレ女子は経済効果をうみだす力を持っている?|ほぼ日発、はれときどきフロンターレ、12月21日の記事は 〈フロンターレアドベントカレンダー 寄稿〉ぼくがMind-1ユニを脱げない訳|mimozo_kf|note です。合わせてご参照下さい。

北村曉と申します。この blog の更新もかなり久しぶりとなりましたが、その間に紆余曲折を経て今ではすっかり川崎フロンターレを応援する人となっています。ふだんは等々力競技場のゴール裏(バックスタンド寄り)で旗を振って応援していたり、Twitter にてフロンターレに関することやそれ以外のことを呟いております。

本記事では自分が応援に使用している旗、いわゆるパイプフラッグ(パイフラ)を作る上で、今までの経験から得たこつのようなものを紹介させて頂ければと思います。

そもそもパイプフラッグとは

パイプフラッグは旗竿に塩ビパイプを使った旗のことです。パイプのしなりを利用して、観客席(自由席や立見席)のような比較的狭いスペースでも、頭上で旗が振れることが利点だと思います。ゴール裏席の最前列で振られるような大旗は、主に金属ポールの旗竿が使われていますが、パイプフラッグは客席の中ほどで振られることが多いです(この辺りは個々人の応援スタイルによっても変わりますが)。

想定する旗のサイズ

自分が作っている旗の布の大きさはだいたい 120cm x 160cm くらいの大きさです。市販のLフラッグ よりやや大きい程度ですが、自分にはこのくらいが扱いやすくてよい感じです。振り旗の最も重要な役割は動きで選手・味方を鼓舞することであり、大きさにはさほどこだわることはないと考えています。

国旗などだと縦横の比率が 2:3 のものが多いですが、振るための旗としてはやや横長なようで、かなり勢いをつけて振っても上端が垂れてしまいます。なので自分は今のところ 3:4 の比率としています。(最近のGゾーンで振られている旗は正方形に近い形が多いですね)

旗竿の長さは 280cm くらいです。この長さは 公式のフラッグケース に入る長さ x 2 という理由により決めたものです。旗竿については、旗が周囲の(特に後ろの)人の視線を遮らないよう、ある程度の長さを確保しておく方がよいと思います。

旗布と旗竿の接合について

手っ取り早い旗作りでよく用いられる手法として、旗の片側を袋状に縫い、その中に旗竿を差し込む、というのがあります。前述のLフラッグや、時々観客席に配られるフロンターレ後援会の小旗もこの仕組みですね。旗作りの取っ掛かりとしては分かりやすいですが、長く常用する旗にはあまり向いていないのではないかと思っています。

振り旗のための布には、少しの風でも効果的にはためくよう、なるべく軽い布を使うことが望ましいです。そうすると必然的に布の強度としては弱いものとなってしまうため、それを旗竿との接合にも使うとなると、旗竿との摩擦による消耗がかなり激しいことになります。

また、旗の組み立てが案外面倒、ということもあります。旗布が 1m 以上の大きさともなると、狭い袋状の布に旗竿を入れるのは結構手間がかかるものです。

そんな訳で、自分は旗布の3点を紐で竿に接合する、という方法を取っています。そうすることで旗布と旗竿との接点は限りなく小さいものとなり、また仮に紐が摩耗しても紐だけを交換すればよいことになります。実際にどのように加工しているかは以下の制作例にて述べたいと思います。

実際の制作例

旗布の加工

先に述べた通り、旗布にはポリエステルなどのなるべく軽い布を使うのがよいと思います。自分で布を買って縫い合わせるもよし、業者さんにデザインしてもらうのもよし。

自分で青と黒の布を買って縫い合わせるのであれば、昔の 川崎華族さんのページ に色分割のサンプルが掲載されているので、参考になるかと思います。

布(化学繊維)の切断には、ほつれ防止のため、ヒートカッターと呼ばれる熱で切断する工具があると便利です。自分は以下の工具を秋葉原で購入して使っております。ほつれた箇所の修復にも役立ちます。

いま自分が主に使っているカワサキまるこの旗は、フロンターレのビッグフラッグでもお馴染み 染太郎 さんに作成を依頼しました。デザインデータは自分で用意し、依頼したのは布の染色の部分(周囲はヒートカット)のみなので、そこそこの値段で作って頂いています。

MARUKO attr-acive!

旗布の旗竿側には、6cm ほどの幅を木綿の布(ブロード、シーチング等)にて補強しています。ちなみに以下の写真では旗のデザインに合わせて補強布の色も変えたりしていますが、今になってみるとそこまでこだわることもなかったかなとも思ったり。補強布を手縫いで縫い付けるのは直線とはいえ大変なので、ミシンがあると便利です。

補強布(上)

補強布をつけた後は上・中央・下にハトメ(10mm)をつけます。布にハサミなどで切れ目をつけて 10mm の穴をあけ、両側からハトメで止めます。この穴はほつれたままでもハトメで覆われるので問題ないです。

中央のハトメは、旗布を二つに折り畳むことを考慮し、真ん中からすこしずらした位置につけるといいかもしれません。

補強布(中央)

旗竿の加工

旗竿の塩ビパイプには、自分は VP13 という型のものをつかっています。全長 280cm ということで 140cm のパイプが2本必要になるわけですが、売っている長さは 1m や 2m なので、2m のものを切って使います。麻生区なら ビーバートザン 五月台店 にて入手できます。麻生グラウンドへの練習見学ついでに寄ってみたりしてはいかがでしょう。

その他の材料としては VP13 にあうキャップ、接手となるソケット、あとT字型の接手などを使います。

キャップ、ソケット、T字接手(チーズ)

接手の部分に関しては、強度を重視するならネジ式のバルブソケットを使うのも一つの選択です。自分はどちらかというと組み立て・取り外しの容易さ、それによる旗の持ち運びの便利さを重視して、単にはめるだけのソケットを使用しています。等々力でのバス待ちで旗を持って場外に出る時などには便利です。

旗竿の上半分の加工は以下の写真のようになります。

旗竿上半分・上部

旗竿上半分・下部

キャップは接着剤でつけます。灰色の一段大きい輪のようなものは、T字接手から 1cm ほどで切断したものです(3つ必要になるためT字接手を使っているわけです)。この輪を養生テープ(白い部分)で止めています。養生テープは縦にも避けやすいので、1/4 くらいの幅に切ったものを何枚か重ねて止めています。このキャップと輪の間・輪と輪の間が、紐で結ぶための箇所となります。

なお旗布の中央部分には、旗竿には特に何も加工していません。中央は紐で旗竿に結ぶだけの状態となります。

旗竿の下半分には、上部に接手となるソケットをつけます。こちらも養生テープで止めています。

旗竿下半分

旗布と旗竿は以下のように紐で接合します。

旗布と旗竿の接合・上部

旗布と旗竿の接合・下部

紐は蝶結びなどで竿に結びつけても構わないのですが、より手間を省くため写真中の黒くて丸い部品を使っています。これはコードストッパー という名前で手芸店などで売っています。よほど風が強い時とかでない限り、これでも十分かと思います。(不安があるようであれば、コードストッパーの上から更に紐を結ぶことも可能です)

終わりに

サッカーの応援に参加する人にとって、自分の作った道具(旗・ゲーフラ・その他独自のグッズ等)を使って応援することは一つの楽しみであり、またその道具をどうより良いものにしていくかを工夫することも楽しみになるかと思います。この記事を読まれた方で、「自分は応援用の道具・グッズを作るときにこのようにしている」というようなアイディアや作成例などがあれば、それをぜひ公開してほしいものと思います。

勢いで一気に書いた記事となったため、誤字脱字、認識違い等々ありましたらご指摘頂ければ幸いです。

付記

2017年の新体制発表会見に青歌隊で参加します。1月22日はよろしくお願いします。


HTML5の要素を条件付きコメントなしでIEで使う

今更ながら、ここもHTML5にしてみようかなという気持ちが湧いてきています。以前は、一旦公開した文書の形式を無闇に変えるのはよくないという思いが強かったのですが、個人のページなのだし色々と実験的なことをもっと試してもいいのでは、と思うようになったので。

さて、HTML5導入にあたり一番気にしていたのが、IEでHTML5の新しい要素を使う方法のことでした。今だと html5shiv を使って以下のようなコメントを入れるのが一般的になっているようです。

<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->

しかしながら、HTML文書というのは様々な環境で利用されるための文書形式だと自分は考えているので、その中に(コメントとは言え)特定のブラウザのための記述を入れることには抵抗があったのでした。そこで、上記のような条件付きコメントを使わずに、IEでHTML5の新しい要素を使う方法をここ数日模索しており、何とか方法が見つかりましたので以下に紹介する次第です。

ひとまずサンプルをどうぞ。

他に使用しているファイルは以下の通りです。

見ての通り、以前に角丸の表示で利用していた、IEの DHTML Behaviors を利用しました。これだとHTML文書に適用するCSSの中で、

body {
  behavior:url(./html5.htc);
}

というようなルールを追加するだけなので、HTML5文書自体には余計な記述を追加することなく利用できます。

なお、html5.htc の中では html5shiv のコードをほぼそのまま利用しています。

* * *

この html5.htc を作る過程の試行錯誤で、2点ほど学んだことがあったので覚え書き。

htcファイルの中から、HTML文書のdocumentオブジェクトは直接参照できない。 htcファイルのscript要素で document と書くと、それは「htcファイルのdocumentオブジェクト」ということになるようです。一方、behavior を適用した要素(body要素)は element で参照できるので、HTML文書の document オブジェクト、window オブジェクトを得るには以下のようにする必要がありました。

var doc = element.document;
var win = doc.parentWindow;

最後に element.innerHTML の更新が必要。 これをしなくてもhtcファイルのscript要素のスクリプトは実行されていたので、それで問題ないように思っていたのですが、実際はそれだけだとスタイルが適用されませんでした。色々試す中で、半ば自棄で element.innerHTML = element.innerHTML というコードを入れてみたところ、思いがけずそれでうまく行ってしまったのでした。おそらく代入によりHTML5新要素のタグが改めて解析されたのだろうと推測しますが、自身を代入することで結果が変わるというのは何とも不思議な感じです。

コードをより短くするため、element.innerHTML += '' と変更しました。


Mojolicious wikiにあるORLiteの例をUnicode対応にする

Mojolicious::LiteでData::Modelを使ってみたという記事で、

MojoliciousのWikiにORLiteを使ったサンプルがあったのですが、残念ながらそのままでは日本語には対応していないので、…

という文を見かけたので、その Working with ORLite inside Mojolicious にあるサンプルを日本語でも使えるようにできないか、調べてみました。

Mojolicious::Liteにおける文字エンコーディング周りの動作を調べてみたところ、Mojolicious::Liteの内部では、文字列はあくまでPerlの内部文字列として扱われることを知りました。具体的に言うと:

なので、 $self->param('type') のようにして取得したデータは、その時点で内部文字列となっているし、また、データベースから取得したデータをテンプレートに埋め込むならば、内部文字列とした上で埋め込む必要がある、ということになります。

そうすると修正はデータベース寄りということになりそうです。調べると、ORLiteが使用するDBD::SQLiteには、入出力データを内部文字列として扱うための属性(sqlite_unicode)がありました。しかしORLiteではその属性を使用していないようです。

そこで、以下のように package Model のところで connect メソッドを上書きすることで、日本語文字列のポスト・表示にも対応することができました。

追記(2012年2月3日): ORLite がバージョン1.52以降で unicode オプションをサポートしたため、以下のソースも変更しました。

#!/usr/bin/env perl

package Model;
use strict;
use ORLite {
    file   => 'sample.db',
    create => sub {
        my $dbh = shift;
        $dbh->do(
            'CREATE TABLE motorcycles (
             id INTEGER PRIMARY KEY,
             type TEXT NOT NULL, 
             brand TEXT NOT NULL,
             color TEXT)'
        );

        # just use $dbh->do(...) if you need more
        # tables
        return 1;
    },
    # ORLite >= 1.52
    unicode => 1,
};

#{
#    # use unicode character (ORLite < 1.52)
#    my $connect = sub {
#        DBI->connect( $_[0]->dsn, undef, undef, {
#            PrintError => 0,
#            RaiseError => 1,
#            sqlite_unicode => 1,
#        } );
#    };
#    no warnings 'redefine';
#    *connect = $connect;
#}

package main;

use Mojolicious::Lite;
use utf8;

get '/' => sub {
    my $self = shift;
    $self->stash(motorbikes => [Model::Motorcycles->select('order by type')]);
} => 'index';

post '/' => sub {
    my $self = shift;
    Model::Motorcycles->create(
        type  => $self->param('type'),
        brand => $self->param('brand'),
        color => $self->param('color')
    );
    $self->redirect_to('/');
};

app->start;

__DATA__

@@ index.html.ep
<!DOCTYPE html>
<html>
  <head>
    <title>Motorcycles</title>
    <style>td { background-color:#dee; } </style>
  </head>
  <body>
    <h1>Motorcycles</h1>
    <table>
    % foreach my $cycle (@{$motorbikes} ) {
      <tr>
        <td><%= $cycle->type %></td>
        <td><%= $cycle->brand %></td>
        <td><%= $cycle->color %></td>
      </tr>
    % }
    </table>
     
    <p>Enter a new motorcycle here (バイクを登録して下さい)</p>
    <p>
      <%= form_for '/' => (method => 'post') => begin %>
% foreach (qw/type brand color/) {
        <%= uc($_) %>: <%= input_tag $_, 'type' => 'text' %><br />
% }
        <%= submit_button 'Submit motorcycle' %>
      <% end %>
    </p>
  </body>
</html>

スクリプト内部(__DATA__ 以下)のテンプレートで日本語文字列を使うような場合は、内部文字列として扱われるように use utf8; を追加しておくとよさそうです。


weakenは何に対して効くか

PerlのScalar::Util にある weaken について学んでいたところ、誤解していた点があったので覚え書き。

以下のように、同じリファレンス値を持つ変数を2つ作り、片方だけを weaken することを考えます。

use strict;
use warnings;
use feature qw(say);
use Scalar::Util qw(weaken isweak);

my ($a, $b);
$a = $b = {};
weaken $a;

say "\$a = $a is ", isweak $a ? 'weak' : 'strong';
say "\$b = $b is ", isweak $b ? 'weak' : 'strong';

自分は、$aも$bもリファレンスとしては同じ値なのだから、$aをweakenすれば$bも弱くなる、という風に思っていたのですが、結果は以下の通りでした。

$ perl a.pl
$a = HASH(0xc43ad8) is weak
$b = HASH(0xc43ad8) is strong

リファレンスの値としては同じにも関わらず、$aのみが弱くなっています。

これはつまりどういうことかと考えたところ、weakenはHASH(0xc43ad8)というようなリファレンスとしての値に対して働くのではなく、リファレンスを格納する変数名(のようなもの)に対して働くものなのだ、と解釈すると納得が行きました。

※「変数名(のようなもの)」の例:

引数の値ではなく変数名に対して働くということで言うと、weaken は my や local に似ているように思いました。

* * *

もう少し実際の利用例に近い形で言うと、例えば以下のように、互いに参照し合うオブジェクトがあり、一方の参照を弱くすることでブロック終端でオブジェクトの変数が開放されることを示す例を考えます。(コードは404 Blog Not Found:perl - Data::Decycle で悪循環を断とう!の記事にあったものを元にしてます)

use strict;
use warnings;
use feature qw(say);
use Scalar::Util qw(weaken);

{
    package Foo;
    sub new { bless {}, $_[0] }
    sub DESTROY { warn "destroy $_[0]" }
}

{
    package main;
    my $parent = Foo->new;
    my $child = Foo->new;
    $parent->{child} = $child;
    $child->{parent} = $parent;
    weaken $child->{parent};
}

warn "end";

__END__
$ perl a.pl
destroy Foo=HASH(0xc43c70) at a.pl line 9.
destroy Foo=HASH(0xc9b510) at a.pl line 9.
end at a.pl line 21.

で、このweakenの行において、$child->{parent} = $parent だからと言って weaken $parent としては意味がない、ということです。

* * *

なお、この辺りのことはScalar::UtilのPODにも以下のように説明されていました。

Note that if you take a copy of a scalar with a weakened reference, the copy will be a strong reference.

    my $var;
    my $foo = \$var;
    weaken($foo);                       # Make $foo a weak reference
    my $bar = $foo;                     # $bar is now a strong reference

インストールされているPerlモジュールはinstmodshで見れる

Perlで、インストールされているモジュールの一覧を取得するには ExtUtils::Installed を使うとよいという記事をよく見かけていたので、自分もよくそのようにしていました。

しかし本日、perlbrewでperl-5.12.2をインストールした後、bin/ 配下に置かれるコマンドをなんとなく眺めていたところ、instmodsh というコマンドがあることに気付きました。これを使うと、

$ instmodsh
Available commands are:
   l            - List all installed modules
   m <module>   - Select a module
   q            - Quit the program
cmd? l
Installed modules are:
   App::cpanminus
   HTML::Parser
   HTML::Tagset
   LWP
   Perl
   Time::HiRes
   URI
cmd? q
$

という感じで、簡単なシェルインターフェースを介してインストールされたモジュールの一覧を得ることができます(上記はまだperlインストール直後なので出力が少ないですが)。

ソースを見たところ、こちらも内部では ExtUtils::Installed を使用しているようなのですが、それでも perl -MExtUtils::Installed -le 'print for ExtUtils::Installed->new->modules' といった、ExtUtils::Installedという長いモジュール名を2回も書くような onliner を思い出しつつ打つよりは楽でよいと思いました。

ちなみに、UIを介さずに直接一覧を出力したりファイルにリダイレクトさせたい場合には、以下のようにするとよいかと思います。

$ echo -e "l\nq" | instmodsh > instmod.log

最初のメッセージやプロンプトを削りたいのなら、こんな感じで。

$ echo -e "l\nq" | instmodsh | perl -ne 'next if 1 .. /^c/; print if /^\s/'

検索した限りだとこの instmodsh について言及した日本語記事はあまり見かけない様子で、折角デフォルトでperlに入っているのに、知られていないのは勿体無いなと思ったのでした。