MJHD

エモさ駆動開発

jQueryとSVGでクリッカブルマップ

クリッカブルマップというのは,こんなの.

f:id:wait0000:20160104214251p:plain

今回はクリッカブルという名のもとでクリック機能に対応していないのだが,便宜上クリッカブルマップと呼ぶ. 実際,クリック対応も数行追加するだけで楽々と対応できる.

用意するもの

マップ画像の作成

f:id:wait0000:20160104214800p:plain
inkscapeを使い,適当に日本地図を書く.
そして,inkscapeXMLエディタを開き,各地域,都道府県などにidを追加する.
あとは,PlainSVGとして書き出すだけ.(今回はjapan-map.svgとして書き出した)

jQueryプラグインを書く

jquery.svg-japan-map.js

(function($) {
    $.fn.svgJapanMap = function(options) {

        function composeIdName(prefix, name, area) {
            var id = "#";
            
            if (prefix != "") {
                id += prefix + "-";
            }

            if (name != "") {
                id += name + "-"
            }

            id += area;
            return id;
        }

        var defaults = {
            svgFile: "",
            prefix:  "",
            onHover: function(e) {},
            onOut: function(e) {},
            associated: []
        };
        var setting = $.extend(defaults, options);

        setting.associated.push("");

        // SVGに設定したid
        var areas = [
            "hokkaido",
            "tohoku",
            "kanto",
            "chubu",
            "hokuriku",
            "kansai",
            "chugoku",
            "shikoku",
            "kyushu",
            "okinawa"
        ];

        var $this = this;

        $.get(setting.svgFile, function (data) {
            var in_event = "mouseenter";
            var out_event = "mouseleave";

            // たまにIEでうまく動かない対策
            if (navigator.userAgent.match("MSIE") || navigator.userAgent.match("Trident")) {
                in_event  = "mouseover";
                out_event = "mouseout";
            }

            $this.append($(data.documentElement));

            $.each(areas, function(i, area) {
                $.each(setting.associated, function(j, name) {
                    $(composeIdName(setting.prefix, name, area)).bind(in_event, function (e) {
                        e.areaName = area;
                        setting.onHover(e);

                        $.each(setting.associated, function (k, name2) {
                            $(composeIdName(setting.prefix, name2, area)).css({
                                "opacity": "0.5"
                            });
                        });

                        return false;
                    }).bind(out_event, function(e) {
                        setting.onOut(e);

                        $.each(setting.associated, function (k, name2) {
                            $(composeIdName(setting.prefix, name2, area)).css({
                                "opacity": "1.0"
                            });
                        });

                        return false;
                    });
                });
            });
        });

    };
})(jQuery);

こんな感じでSVGajax的にダウンロードしてDOMに無理やり埋め込む.
こうすることでjQueryのidセレクタを使い,各図形にイベントを設置できる.

今回は,合わせて左の丸や,地域名にも反応させたかったため,associateという設定項目を用意した.
合わせて,各図形にcircle-kanto,text-kantoなどとidを設定した.

使うだけ

<!DOCTYPE html>
<html>
    <head>
        <script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
        <script src="./jquery.svg-japan-map.js"></script>
    </head>
    <body>

        <div id="map-holder"></div>
        <div id="map-popup" style="position: absolute; left: -100px; top: 0; width: 100px; height: 30px;"></div>

        <script>
$(document).ready(function() {
    $("#map-holder").svgJapanMap({
        svgFile: "./japan-map.svg",
        prefix: "",
        onHover: function(e) {
            $("#map-popup").text(e.areaName);
            $("#map-popup").css({
                "left": e.clientX + 10,
                "top":  e.clientY + 10
            });
        },
        onOut: function(e) {
            $("#map-popup").css({
                "left": -100,
                "top":  0
            });
        },
        associated: ["circle","text"]
    });
});
        </script>

    </body>
</html>

こんなコードを書いて完成.無事,ホバーに反応する日本地図ができた.

mfiler4のすゝめ

mfiler4という2画面ファイラがある。

f:id:wait0000:20150901223759p:plain

Windowsあふという2画面ファイラを使ったことのある人もいるかと思うが、あれを参考にしたらしく、見た目キーバインディングなど共通点が沢山ある。

mfiler4のすごいところは内部にxyzshという独自シェルを持っていて、そのシェルスクリプトによって強力にカスタマイズできる点。(なんとオブジェクト指向もできるらしい)

GCも付いていて、シェルとの親和性の高い一つのプログラミング言語となっている。

ZOOMERのスピードメーターを交換する[3]

結論

動きました。

f:id:wait0000:20151229133658j:image

スピードメーターも、タコメーターも、フューエルメーターも、気温計も、すべて動いています。  
完璧です。  
  
ただ一点を除いて…

問題点

元々の燃料警告灯の配線を外していなかったため、ずっと点滅してますww  
かなりウザいですが、まぁ…あとでカプラできちんと配線し直す際に取り外したいと思います。  

以上!

所要時間、6時間ちょっとでした。もっとしっかり準備をすれば4時間ぐらいで出来るかな?  
配線加工は必須なので、その辺の準備を忘れないように  
初心者でも十分できる作業だと思いました。

追記

配線を、元修理業者の友人の指導の元、全部やり直しました。
カプラとギボシで半田付けを置き換えていきました。
燃料警告灯の線も外し、実はフューエルセンダーの接続もうまくできてなかったため、その辺も直しました。
半田付けは引っ張られる力に弱いらしく、「こんなんじゃすぐ取れちゃうよ!」と怒られましたw
f:id:wait0000:20160127105533j:image

ZOOMERのスピードメータを交換する[2]

前回より…

さて,燃料計の無いズーマーに燃料計付きのデジタルメーターを付けたいという話でしたが,
今日ついにSP武川のマルチ汎用メーターが届きました.

開封の儀

f:id:wait0000:20151227155950j:plainf:id:wait0000:20151229020901j:plainf:id:wait0000:20151229020904j:plain

さっそく取り付けにかかる…がしかし

f:id:wait0000:20151228090207j:plain

なんと,フロント部分のボルトが硬すぎて,手持ちの工具では緩めることができませんでした.

そこで,レンチセットを購入.使ってみて気づきましたが,これすっごい便利です.
めっちゃ楽に力を込めて外すことができました. f:id:wait0000:20151229014314j:plain

ここで友人K氏に助けを依頼し,
友人とバンバン取り外しにかかります. f:id:wait0000:20151228184148j:plainf:id:wait0000:20151228184450j:plain

フューエルセンダの交換

前回も説明したとおり,ズーマー純正のフューエルセンダはアレです.1L以下になった場合のみ反応します.
前回の記事で説明したとおり,AF57のフロートセンサと入れ替え作業を行います. f:id:wait0000:20151228185449j:plainf:id:wait0000:20151228185212j:plain f:id:wait0000:20151228185209j:plain
これがズーマー純正のフューエルセンダ.シンプル…

f:id:wait0000:20151228190458j:plain
バンバン取り外していきます.スターウォーズのロボットみたいな奴が現れます.

f:id:wait0000:20151229020951j:plain
もう素っ裸です.初めてこいつの真の姿を見た….
ケーブル類がかなり奥まった部分に格納されているため,電気系統をいじりたければ前のパネルを外す必要があります.

f:id:wait0000:20151228210035j:plain
さっそく,メータの説明書にしたがってバンバン配線をしていきます.
基本的には,純正メータに接続されている端子を付け替えるだけです.
ただ,純正メータはカプラで接続されているので,これをキボシに張り替える作業が大変でした.

別にカプラ,キボシどっちでも良いと思うんですけど,今回はメータに合わせてキボシに変更しちゃいました.
カプラは全て根本で切断です.(この時友人はひたすら「パイプカット!!パイプカット!!」と叫んでいました.) 追記: 基本、線は切断しない方がいいです。細長い棒でカプラの端子を押しながら引き抜くことで切らずに付け替えられます。

いや,多分もっといい方法あるので各自がんばりましょう.

動作テスト

電源,アース,速度メータ,RPMメータ,などを取り付けた時点で,一度キーをIGNITIONまで回してみます.
f:id:wait0000:20151228210042j:plain

うまく行きましたね.まだ燃料計には接続していないので非表示です.

燃料計を接続

f:id:wait0000:20151228231309j:plain
交換したフューエルセンダからもともと存在するフューエルセンダのカプラを切断(ダメ)し,そこにまさかのハンダ付けしました. (黄色を青/白へ,緑をアース(緑)へ接続します.)
ハンダ付けのゴリ押し感大好きです.(ダメ)
いつガソリンが爆発するか怖かったけどね.

このままだと,燃料警告灯に接続されているだけなので,新メータの燃料計端子,黄色の端子に先ほどハンダ付けした端子を接続します.
中々長いケーブルが必要になります.注意です.

f:id:wait0000:20151229014753j:plain
そしてデジタルメータにて510 Ωの抵抗値を設定することで,正常に燃料の表示が行えました. その他の設定項目は少し曖昧だったので,みなさん適当に設定してください…

問題点

スイッチをオンにした瞬間,一回警告灯が光るのがちょっと怖い.
燃料警告灯もう要らないので切断して別のメッセージにしようかな?

次回,果たしてエンジンはかかるのか・・・?速度が表示されるのか…?

ZOOMERのスピードメータを交換する[1]

f:id:wait0000:20151226022737p:plain
Honda|バイク|ズーマー|フォトライブラリー

ホンダのZOOMER,愛好者も多い点で原付の中では珍しいバイクなのだが,実は1つ大きな問題点がある.

燃料計がない.
なんと,5L入るタンクが残り1Lになった時点でランプが点灯するだけ,という遠出したい時など,かなり怖い仕組みなのだ.
実際,何度もガス欠に見舞われてガソリンスタンドまで押して歩いた…(しんどかった.)

慣れてくると,オドメータと燃費(km/L)で計算できるようになってくるのだが,給油する度にメータの値をメモるのも面倒.
そこで,燃料計をつけるついでに,多機能メータに総取替えすることにした.

俺のZOOMERについて

2006年製のキャブ車,ZOOMERの白です.(中古なので,以前の持ち主がフレームを赤に交換した模様)
走行距離14000kmでございます.まだまだ乗ります.

フューエルセンダの入手

本当にアレだと思うのだが,まず純正の燃料センサー自体が燃料の残量を測ることができない.
1L未満になった時のみ,抵抗値が変化する?(この辺は詳しく調べてない)ようなセンサーらしいのだ.
そこで,一般的には専用の燃料計キット(参考:Amazon.co.jp: キタコ(KITACO) フュエルメーターキット ズーマー 752-1125200: 車&バイク)を使用してセンサーまるごと取り換え,メーターを追加する.

しかし,今回はせっかくなので純正スピードメータも取り外し,汎用多機能スピードメータに取り替えてしまうことにした.
そのためには,まずは燃料の残量に応じて抵抗値の変わるまともなフューエルセンダを入手する必要がある.

基本的にホンダの原付バイクはAF56(Dio)~AF58(ZOOMER)まで共通の形状らしい.
よって,AF56, AF57のフューエルセンダを流用することが出来るらしい.

というわけで,AF57(スマートDio Z4)の中古ガソリンタンクをポチりました. f:id:wait0000:20151222192849j:plain

きったねぇ…
ヤフオクで1500円です….

センサー取り外しf:id:wait0000:20151222193147j:plain

栓が伸びてる蓋部分を押さえて,グリっと回します.
左方向にしかまわらんかった.
少しだけ力が入ります. f:id:wait0000:20151222193233j:plain こんなんで上の蓋が外れます.

f:id:wait0000:20151222193302j:plain

ニュルッとセンサーが出てきます.
新しいタンクに入れる際,サビなどが付着しているとタンクに良くないので,今のうちにフキフキしときましょう.

抵抗値測定

ちゃんと動くのかどうか,テストも兼ねて簡単な回路に接続してみます.

f:id:wait0000:20151222225352j:plain

センサのフロート(黒い部分)の動きに合わせてLEDの明るさが変化しているのが確認できました.

また, 電圧,電流を測定することで最大510Ωの可変抵抗であることもわかりました.

次回,メータの取り付け&センサの交換

次回,スペシャルパーツ武川 スクエアLCD S&Tメーター SQLST1 05-05-0006が届き次第,交換作業を始めようと思います.

YAUC2015メモ

YAUC

YAUC 2015
会津大学宇都宮大学の合同発表会.宇都宮大学,UU-KISS(宇都宮大学感性情報科学研究会,韓国の6人グループではない)主催.

2015/12/19日(土).

13:00より開始

  • 伊藤先生によるUU-KISSの紹介
    年に数回このような研究会を開いているらしく,今回もその1つらしい.
    情報と人間の感覚・感性について研究交流している様子.

13:15より,及川さんご講演

グーグルでChrome開発に関わった及川卓也氏が「Qiita」開発元Incrementsの14人目の社員に | TechCrunch Japan
及川卓也さんが,ご自身の経験から大学生へのメッセージを発表された.

  • 進路はいくらでも変えられる(日本はアメリカに比べて進路を早く決めすぎ)
  • 点と点は繋がるというお話
  • 嫌だからやめるのではなく,新しいことをしたいからやめるという理由であるべき
  • 開発者支援の道へ Qiita
  • スタートアップでは自動化が大事(SlackのBot,Qiitan( DocomoruでBOTと雑に会話する - Qiita参照),CIなど)
  • 日本はなぜか質問回答サイトでは盛り上がらない.よって知識共有サイトへ

14:00あたりより,LT大会

  • 機械学習まとめ.顔認識(識別),Exileの前の方に同級生がいるお話
  • DBF(Database Firewall)を作成したお話,色んな対策法があるらしい
  • Where WareというSNSサイトを,他学科の人が作ったお話
  • 建築業界,製薬分野でも情報系の人材が重宝されているというお話
  • WebGLとは何かというお話,シェーダーのお話
  • スマートハウスをRasPiなどで作成するお話,会津は寒いみたい
  • HSP部屋,実はGolangについても少し語りたかった(タイマーを見たら残り40秒だった)
  • 連鎖ゲームを解く競技プログラミングで6位とったお話
  • Kotlinかわいい.Scalaなども試したけどメソッド数に上限があったらしい.Android開発.
  • FPGAのお話,開発コストのお話
  • デザインのお話,地元の事務所と提携したり雑誌出したり
  • 授業でAV女優をランキングするWebサービスを作ったお話
  • モンゴルのお話,モンゴルではIT分野のスタートアップが増えてる
  • Sketchアプリのすすめ
  • 車の診断情報などを読み取ると楽しいお話
  • 蔵を工場化するお話,ホットプレートは偉大らしい
  • 及川さんの追加ご講演

17:30より懇親会

  • 乾杯
  • 寿司,ローストビーフ,スナック菓子3~4種,ジュース各種

それでも夜は星を連れて

Capo: 1

A E F#m C#m
夕暮れの道を 並んで歩く

D A D E
酔いにまかせて 次の店まで

A E F#m C#m
口をすべらせ 君の瞳が曇る

D A D E
そんなつもりじゃ なかったんだけれど

A E F#m C#m
愛してるなんて 言い訳 みたいだね

D A D E
君がいないと まるでダメなのに

A E F#m C#m
そばにいて欲しい なんて かっこわるいね

D A D E
飲みすぎただけさ 気に留めないで


A E Em
それでも夜は星をつれて なんでもない顔して 旅に誘うよ

D Dm A F#m
トランクの中には 四つ葉のクローバー

D E A
この風が吹くならば

D E A
君と歩いてゆける

D E A
この風が吹くならば

D E F#m
いつの日も何度でも

D E A
君と歩いて行ける