MJHD

エモさ駆動開発

指定の要素にYoutubeをはっつける

こんな感じ.

https://jsfiddle.net/0b7dtvqc

Youtube Iframe APIとかいうの使った.

jquery.youtube.js

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

        function loadPlayer(element, settings, callback) {
            $.getScript("//www.youtube.com/iframe_api");
            // スコープ注意
            window.onYouTubeIframeAPIReady = function () {
                var options = {
                    videoId: settings.videoId,
                    playerVars: {
                        rel: 0,
                        controls: 0,
                        showinfo: 0,
                        showsearch: 0,
                        hd: settings.hd ? 1 : 0,
                        wmode: "transparent",
                        loop: settings.loop ? 1 : 0,
                        playlist: ""
                    },
                    events: {
                        onReady: function (e) {
                            player.mute();
                            player.playVideo();
                        },
                        onStateChange: function (e) {
                            if (e.data == 2 || e.data == 0) {
                                player.playVideo();
                            }
                        }
                    }
                };

                player = new YT.Player(element.attr("id"), options);

                callback(player);
            };
        }

        function resizePlayer(element, ratio) {
            element.css({
                width: $(window).width(),
                height: $(window).width() * (1 / ratio)
            });
        }

        var defaults = {
            videoId: "",
            loop: true,
            hd: false,
            ratio: 16/9
        };

        var setting = $.extend(defaults, options);

        var $this = this;

        loadPlayer($this, setting, function (player) {
            $this = $("#" + $this.attr("id"));
        });

        resizePlayer($this, settings.ratio);

        var isResizing = false;
        $(window).resize(function (e) {
            if (isResizing) {
                return;
            }

            resizePlayer($this, settings.ratio);
            
            isResizing = true;

            resizingTimer = setTimeout(function () {
                isResizing = false;
            }, 10);
        });
    }
})(jQuery);

使う側

<div id="player">
</div>

<script type="text/javascript">
$(function () {
	$("#player").youtubePlayer({
  	videoId: "seLF3oCjCv8"
  });
});
</script>

JetDrive 520 240GBを買ってみた

今までは…

MacBookAir 2012 Mid,128GBを使っていたが, 128GB中,125GBを常に使用するというひもじい生活を送っていた.

そこで,買いました

f:id:wait0000:20160301202347j:plain

開けました

f:id:wait0000:20160301202609j:plain f:id:wait0000:20160301202619j:plain f:id:wait0000:20160301202639j:plain f:id:wait0000:20160301202737j:plain

まずはJetDriveにUSB変換コネクタをつなげます

f:id:wait0000:20160301202805j:plain f:id:wait0000:20160301203147j:plain

Macに接続して,ディスクのコピーを行います

f:id:wait0000:20160301203017j:plain

緑に光ったり,青に光ったりします

f:id:wait0000:20160301204508j:plain f:id:wait0000:20160301203728j:plain

もし,Could not recognize /dev/(null)とか言われたら,編集からロックを解除をしましょう

開けます

f:id:wait0000:20160301210435j:plain

取り出します

f:id:wait0000:20160301210759j:plain

装着して完了

f:id:wait0000:20160301210626j:plain

最後にこれを足にはっつけておわり

f:id:wait0000:20160301211355j:plain

幸せ…

f:id:wait0000:20160301221624p:plain

PayPalで定期支払いをする

PayPalでは公式のサンプルコードが手に入り,それを使うことでExpressCheckoutという一番簡単な決済方法を使うことができる. だがPayPalにはもう一つの支払い方法として定期支払い(Recurring)が存在する. 今回はそのメモ.

ちなみに,今回使うpaypalfunctions.phpファイルはここで手に入る.

定期支払い関数を作る

paypalfunctions.phpを編集して,以下のコードを追加する.


    function CallRecurringExpressCheckout( $billingDescription, $currencyCodeType, $paymentType, $returnURL,
                                      $cancelURL)
    {
        //------------------------------------------------------------------------------------------------------------------------------------
        // Construct the parameter string that describes the SetExpressCheckout API call in the shortcut implementation
        
        $nvpstr="&L_BILLINGTYPE0=RecurringPayments";
        $nvpstr = $nvpstr . "&L_BILLINGAGREEMENTDESCRIPTION0=" . $billingDescription;
        $nvpstr = $nvpstr . "&RETURNURL=" . $returnURL;
        $nvpstr = $nvpstr . "&CANCELURL=" . $cancelURL;
        
        $_SESSION["currencyCodeType"] = $currencyCodeType;    
        $_SESSION["PaymentType"] = $paymentType;

        //'--------------------------------------------------------------------------------------------------------------- 
        //' Make the API call to PayPal
        //' If the API call succeded, then redirect the buyer to PayPal to begin to authorize payment.  
        //' If an error occured, show the resulting errors
        //'---------------------------------------------------------------------------------------------------------------
        $resArray=hash_call("SetExpressCheckout", $nvpstr);
        $ack = strtoupper($resArray["ACK"]);
        if($ack=="SUCCESS" || $ack=="SUCCESSWITHWARNING")
        {
            $token = urldecode($resArray["TOKEN"]);
            $_SESSION['TOKEN']=$token;
        }
           
        return $resArray;
    }

    function CreateRecurringPaymentsProfile($fromDate, $description, $amount, $currencyCodeType, $period, $frequency, $token) {
        $nvpstr="&PROFILESTARTDATE=" . $fromDate;
        $nvpstr = $nvpstr . "&CURRENCYCODE=" . $currencyCodeType;
        $nvpstr = $nvpstr . "&AMT=" . $amount;
        $nvpstr = $nvpstr . "&DESC=" . $description;
        $nvpstr = $nvpstr . "&BILLINGPERIOD=" . $period;
        $nvpstr = $nvpstr . "&CURRENCYCODE=" . $currencyCode;
        $nvpstr = $nvpstr . "&BILLINGFREQUENCY=" . $frequency;
        $nvpstr = $nvpstr . "&TOKEN=" . $token;
        
        $_SESSION["currencyCodeType"] = $currencyCodeType;    
        $_SESSION["PaymentType"] = $paymentType;

        //'--------------------------------------------------------------------------------------------------------------- 
        //' Make the API call to PayPal
        //' If the API call succeded, then redirect the buyer to PayPal to begin to authorize payment.  
        //' If an error occured, show the resulting errors
        //'---------------------------------------------------------------------------------------------------------------
        $resArray=hash_call("CreateRecurringPaymentsProfile", $nvpstr);
        $ack = strtoupper($resArray["ACK"]);
        if($ack=="SUCCESS" || $ack=="SUCCESSWITHWARNING")
        {
            $token = urldecode($resArray["TOKEN"]);
            $_SESSION['TOKEN']=$token;
        }
           
        return $resArray;
    }

そして,この関数を呼び出すPHPファイルは以下のように記述する.


      $planAmount = 3980;
      $planDescription = "定期支払い(毎月) ".$planAmount."円";
      $returnURL = "http://localhost/review.php";
      $cancelURL = "http://localhost/";

      // 後で使う
      $_SESSION["desc"]   = $planDescription;
      $_SESSION["amount"] = $planAmount;

        $resArray = CallRecurringExpressCheckout ($planDescription, $currencyCodeType, $paymentType, $returnURL, $cancelURL);

    $ack = strtoupper($resArray["ACK"]);
    if($ack=="SUCCESS" || $ack=="SUCCESSWITHWARNING")
    {
        $token = urldecode($resArray["TOKEN"]);
        $_SESSION['reshash']=$token;
        RedirectToPayPal ( $token );
    } 
    else  
    {
        //Display a user friendly Error on the page using any of the following error information returned by PayPal
        $ErrorCode = urldecode($resArray["L_ERRORCODE0"]);
        $ErrorShortMsg = urldecode($resArray["L_SHORTMESSAGE0"]);
        $ErrorLongMsg = urldecode($resArray["L_LONGMESSAGE0"]);
        $ErrorSeverityCode = urldecode($resArray["L_SEVERITYCODE0"]);
        
        if ($ini["debug"]) {
            echo "SetExpressCheckout API call failed. ";
            echo "Detailed Error Message: " . $ErrorLongMsg;
            echo "Short Error Message: " . $ErrorShortMsg;
            echo "Error Code: " . $ErrorCode;
            echo "Error Severity Code: " . $ErrorSeverityCode;
        }
    }

ちなみにこの段階では定期支払いの期間,料金の設定などは要らないらしい.

そして,GetShipmentDetail関数を呼び出すreview.phpを作成し, その後,定期支払いを確定する以下のPHPスクリプトを作成する.

(POSTでreview.phpからGetShipmentDetailで取得したTOKENを受け取ってる前提)


            $currencyCodeType = "JPY";

            $resArray = CreateRecurringPaymentsProfile((new DateTime())->format("c"), $_SESSION["desc"], $_SESSION["amount"], $currencyCodeType, "Month", 1, $_POST["token"]); // 一ヶ月の定期支払い
            
            $ack = strtoupper($resArray["ACK"]);
            if ($ack == "SUCCESS" || $ack == "SUCCESSWITHWARNING") {
                info("支払いに成功しました.");
            } else {
                fatal("支払いに失敗しました.", var_dump($resArray));
            }

ページのプログレスバーを表示する

二、三時間うーんうーん言ってみたけど良いタイトルが思いつかないので,とりあえず「ページのプログレスバー」と,やつを呼ぶことにする.

こんなやつ. f:id:wait0000:20160213033540p:plain

これをCSSだけで実現したいと思う.

https://jsfiddle.net/ctp4j3zc/2

before擬似要素によって直線を表現し,after要素によってマルポチを表現している. classなしが白抜きの丸,activeが二重丸,disabledが黒丸となっている.

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