私は元気です

本日30時間ぶりに、なんとか自宅に帰りつき寝ていました。
減水で、水がちょろちょろしかでない状態ですので、お風呂に入れないのがつらいですが、被災地の方はもっと大変だと思うと、言葉に詰まります。

私にできることといえば、寄付することと、できるだけ電気を使わないことくらいしかありませんが、なんとかこの難局を乗り越えていきましょう。

Share

輸入のpogoplugもgeolocationで自動的に日本のサーバにつながるようになりました

以前、

サポートにメールすると輸入版のpogoplugの接続先を海外から国内のサーバに1週間できりかえてくれるらしい。

とのこと。

引用元: NAL-6295の舌先三寸 » Blog Archive » pogoplug輸入版の接続先を海外サーバから国内サーバに変更できる.

な記事を書きましたが、状況が変わり、3月から使っている場所に合わせて自動的に最寄りのサーバにつながるようになったようです。
まぁ、つまり日本のサーバにつながるようになったということですね。

Share

#pogoplug access for smartphoneをGoodReaderとComicGlassに対応してみた

というわけで、#pogoplug access for smartphoneをGoodReaderとComitGlassに対応してみた。
そして、対応するサービスが増えたときのために、ファイル名をクリックしたときに、別ページに遷移してサービスを選択できるようにした。
画面のイメージを貼っておくと、

ログイン画面
Login

コンテンツリストを表示している画面

ファイル名を押した後の画面

となっています。
今後の課題としてはファイル名による検索を実装する事です。

Share

クライアントスクリプトでpogoplug apiを操作する その4 ログイン時にファイルリストを表示するようにした。そして難点。 #pogoplug

pogoplugの web apiをhtml+jqueryで操作するサンプル第4弾。
今までの操作を踏まえて、ログイン時に、デフォルトのデバイスのルートディレクトリのファイルリストを最初から表示するようにした。
まぁ、APIのレスポンスが返ってきたら、次のAPIを叩いているだけなので、単に自分が欲しかっただけというのもある。
また、APIの結果がエラーだったときに一律でメッセージを表示する処理を追加した。
これは、jqueryの$.getをオーバライドして中で$.ajaxを呼ぶことで共通の簡易的な対応とした。

実際に動作するサンプルはこちら
htmlとjsファイルをまとめたzipはこちら

本当は、ファイルアップロードに対応したかったのだが、難点が一つあり実現出来ていない。
pogoplugにファイルアップロードを行うには次の二つのAPIを利用する必要がある。

  • craeteFile を呼んで、新しいファイルのためのIDを用意する。
  • datastream APIをPUTで利用する

最初のcreateFileはうまく行くのだが、どうもjqueryからPUTでファイルをアップロードするのがうまくいかないので、成功していない。
これは、今後の課題。

index.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html manifest="pogoplug.manifest" xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>pogoplugTest</title>
        <script type="text/javascript" src="http://code.jquery.com/jquery-1.5.1.min.js">
        </script>
        <script type="text/javascript" src="main.js">
        </script>
    </head>
    <body>
        <h1>pogoplug Web API サンプル </h1>
        <div id="page">
            <form id="loginForm" action="GET">
                <div>
                    <ul>
                        <li>
                            mail Address: <input type="text" id="mailAddress" />
                        </li>
                        <li>
                            password: <input type="password" id="password" />
                        </li>
                    </ul>
                </div><input type="button" id="login" value="Login" />
            </form>
            <form id="downloadform" action="GET">
                <div id="devicedata">
                </div>
                <div id="servicedata">
                </div>
                リンクをクリックするとダウンロードできます。
                <br/>
                ボタンを押すと、そのディレクトリに移動します。
                <br/>
                 
                下の方向ボタンで、ページを切り替えて表示しきれなかったファイルリストを表示します。
                <br/>
                <input type="button" id="previousPage" value="<<" /><input type="button" id="nextPage" value=">>" />
                <div id="breadclumbs">
                </div>
                <div id="filedata">
                </div>
            </form>
        </div>
    </body>
</html>

main.js

//$.getに共通のエラー処理を追加するために、オーバライドする。
$.get = function(sendurl, successfunc){
    $("#page").fadeOut();
    $.ajax(
    {       
        type:"GET",
        url:sendurl,
        success: function(data){
            successfunc(data);$("#page").fadeIn();
        },
        error :function(request,textmessage,errorThrown){$("#page").fadeIn();alert(errorThrown);}
    }
    );
}
        var valtoken = "";
    $(document).ready(function(){
        $("#downloadform").hide();
        //Loginボタンをクリックしたときに発行されます。
        //valtokenを取得することで、次以降のステップのサービスが利用できるようにします。
        $("#login").click(function(){
            $.get("https://service.pogoplug.com/svc/api/loginUser?email=" 
                    + $("#mailAddress").val() + 
                    "&amp;password=" + $("#password").val(), 
                    function(data){
                        jsondata = jQuery.parseJSON(data);
                        valtoken = jsondata.valtoken    ;
                        getListDevices();
                    
            });
        
        $("#nextPage").click(function(){
            $.get(createQueryForNextPage(), function(data){createfileLink(data);});
        });
        
        $("#previousPage").click(function(){
            $.get(createQueryForPreviousPage(), function(data){createfileLink(data);});
        });

    });
});
    
    function getListDevices()
    {
        $.get("https://service.pogoplug.com/svc/api/listDevices?valtoken=" + valtoken, 
        function(data){
        
            jsondata = jQuery.parseJSON(data);                                  
            
            var $select = $('<select id="devices" />');
            $.each(jsondata.devices, function() {
            $('<option value='+ this.deviceid +' />').append(
            this.name
            ).appendTo($select);
            });
            $('#devicedata').empty().append($select);   
            getListServices();      
        });

    }
    
    function getListServices()
    {
        $.get("https://service.pogoplug.com/svc/api/listServices?valtoken=" 
                    + valtoken + "&amp;deviceid=" + $("#devices").val(), 
            function(data){
                jsondata = jQuery.parseJSON(data);                                  
    
                var $select = $('<select id="services" />');
                    $.each(jsondata.services, 
                    function() {
                          $('<option value='+ this.serviceid +' />').append(
                                this.name
                          ).appendTo($select);
                        });
                        $('#servicedata').empty().append($select);
                        $.get(createQueryForMoveDirectory(), function(data){createfileLink(data);});
                        $('#loginForm').hide();
                        $('#downloadForm').show();
                        $("#devices").change(function(){ getListServices();});                    
                        $("#services").change(
                            function(){
                                $.get(createQueryForMoveDirectory(), 
                                    function(data){
                                        createfileLink(data);
                                        }
                                    );
                                }
                            );
            }); 
    }
    


    var pageIndex = 0;  
    function createQueryForMoveDirectory(targetId)
    {
        pageIndex = 0;
        return createQueryForListFiles(targetId);
    }
    
    function createQueryForNextPage()
    {
        pageIndex++;
        if(parentList.length == 0)
        {
            return createQueryForListFiles(null,pageIndex);
        }else{          
            return createQueryForListFiles(parentList[parentList.length -1].id,pageIndex);
        }
    }

    function createQueryForPreviousPage()
    {
        if(pageIndex > 0){
            pageIndex--;            
        }
        if(parentList.length == 0)
        {
            return createQueryForListFiles(null,pageIndex);
        }else{          
            return createQueryForListFiles(parentList[parentList.length -1].id,pageIndex);
        }
    }   
    
    function createQueryForListFiles(parentId,pageIndex)
    {
        var listFilesUrl = "https://service.pogoplug.com/svc/api/listFiles?valtoken=" +
                            valtoken +
                            "&amp;deviceid=" +
                            $("#devices").val() +
                            "&amp;serviceid=" +
                            $("#services").val();
        if(parentId){
            listFilesUrl += "&amp;parentid=" + parentId;  
        }
        if(pageIndex){
            listFilesUrl += "&amp;pageoffset=" + pageIndex;           
        }
        return listFilesUrl;
    }

    var parentList = [];
    //ファイルリストのリンクを作成します。ディレクトリの時はディレクトリ移動のボタンが作成されます。
    function createfileLink(data)
    {
        jsondata = jQuery.parseJSON(data);                                  
        if(jsondata.count == 0)
        {
            return;
        }
                        
        var $ul = $('<ul />');
        //親ディレクトリに戻るボタンを作成
          if (parentList.length == 1) {
            $('<li />').append($('<input type="button" />').click(function(){
                $.get(createQueryForMoveDirectory(), function(data){
                    parentList.pop();createfileLink(data);
                });
            }).val("..")).appendTo($ul);
          }else if(parentList.length > 1)
          {
            $('<li />').append($('<input type="button" />').click(function(){
                $.get(createQueryForMoveDirectory(parentList[parentList.length-2].id), function(data){
                    parentList.pop();createfileLink(data);
                });
            }).val("..")).appendTo($ul);          
          }

            $.each(jsondata.files, function() 
            {
                //ファイルタイプがファイルだったらリンクを、ディレクトリだったらサブディレクトリのファイルリスト取得のリンクを作成
                if(this.type == 0)
                {
                  $('<li />').append(
                        $('<a href="https://service.pogoplug.com/svc/files/' 
                            + valtoken + '/' 
                            + $("#devices").val() + '/' + 
                            $("#services").val() + '/' + this.fileid 
                            + '/dl/" />').text(this.name)).appendTo($ul);
                }else
                {
                    var fileid=this.fileid;
                    var filename = this.name;
                  $('<li />').append(
                        $('<input type="button" />').click(function(){
                            $.get(createQueryForMoveDirectory( fileid), function(data){parentList.push({id:fileid,name:filename});createfileLink(data);});
                        }).val(this.name)).appendTo($ul);
                }
            });
        $('#filedata').html($ul);
        $('#breadclumbs').html(createBreadCrumbs());
        $('#fileLists').hide();
        $('#downloadform').show();

    }

    function createBreadCrumbs()
    {
        var crumbs = "";
        $.each(parentList,function()
        {
            crumbs += this.name + "&amp;gt;&amp;gt;";
        })
        return crumbs;
    }


Share

クライアントスクリプトでpogoplug apiを操作する その3 改ページ操作 #pogoplug

前回に引き続きサンプルに機能を追加した。
ひとつのディレクトリに大量のファイルがある時、一定数のファイルリストしか戻してこないので、
listFilesリクエストにpageoffsetを与えて改ページして、表示しきれないファイルリストを表示できるようにした。
今回から、さすがに長くなってきたので、htmlとjavascirptを別ファイルにした。

動作するサンプルはこちら
htmlとjsをまとめたzipファイルはこちら

index.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>pogoplugTest</title>
        <script type="text/javascript" src="http://code.jquery.com/jquery-1.5.1.min.js">
        </script>
        <script type="text/javascript" src="main.js"></script>
    </head>
    <body>
        <h1>pogoplug api サンプル</h1>
        <form id="loginForm" action="GET">
            Step1:ログインします。
            <div>
                <ul>
                    <li>
                        mail: <input type="text" id="mailAddress" />
                    </li>
                    <li>
                        password: <input type="password" id="password" />
                    </li>
                </ul>
            </div><input type="button" id="login" value="Login" />
        </form>
        <form id="deviceLists" action="GET">
            Step2:登録されているpogoplugのリストを取得します。<input type="button" id="getdevices" value="getDevices" />
        </form>
        <form id="serviceLists" action="GET">
            Step2:選択したdeviceにぶらさがっているサービス(ストレージ等)のリストを取得します。
            <div id="devicedata">
            </div>
            <input type="button" id="getservices" value="getServices" />
        </form>
        <form id="fileLists" action="GET">
            Step3:選択したserviceのルートにあるファイルの一覧を取得します。
            <div id="servicedata">
            </div>
            <input type="button" id="getfiles" value="getFiles" />
        </form>
        <form id="downloadform" action="GET">
            Step4:リンクをクリックするとダウンロードできます。<br />
                ボタンを押すと、そのディレクトリに移動します。<br /> 
               下の方向ボタンで、ページを切り替えて表示しきれなかったファイルリストを表示します。<br />
            <input type="button" id="previousPage" value="<<" />
            <input type="button" id="nextPage" value=">>" />
            
            <div id="filedata">
            </div>
            
        </form>
    </body>
</html>

main.js

$(document).ready(function(){
                    var valtoken = "";
                    $("#deviceLists").hide();
                    $("#serviceLists").hide();
                    $("#fileLists").hide();
                    $("#downloadform").hide();
    //Loginボタンをクリックしたときに発行されます。
    //valtokenを取得することで、次以降のステップのサービスが利用できるようにします。
    $("#login").click(function(){
        $.get("https://service.pogoplug.com/svc/api/loginUser?email=" 
                    + $("#mailAddress").val() + 
                    "&amp;password=" + $("#password").val(), function(data){
                    jsondata = jQuery.parseJSON(data);
                    valtoken = jsondata.valtoken    ;
                    $("#loginForm").hide();
                    $("#deviceLists").show();
        });
    });
    
    //getDevicesボタンをクリックしたときに発行されます。
    //ぶら下がっているpogoplugのリストをセレクトボックスに表示し、、次以降のステップで選択できるようにします。
    $("#getdevices").click(function(){
        $.get("https://service.pogoplug.com/svc/api/listDevices?valtoken=" 
                    + valtoken, function(data){
                    jsondata = jQuery.parseJSON(data);                                  

                    var $select = $('<select id="devices" />');
                            $.each(jsondata.devices, function() {
                              $('<option value='+ this.deviceid +' />').append(
                                    this.name
                              ).appendTo($select);
                            });
                            $('#devicedata').empty().append($select);
                    $("#deviceLists").hide();
                    $("#serviceLists").show();
                            
        });
    });


    //getServicesボタンをクリックしたときに発行されます。
    //選択したpogoplugにぶら下がっているストレージ等のリストをセレクトボックスに表示し、、次以降のステップで選択できるようにします。
    $("#getservices").click(function(){
        $.get("https://service.pogoplug.com/svc/api/listServices?valtoken=" 
                    + valtoken + "&amp;deviceid=" + $("#devices").val(), function(data){
                    jsondata = jQuery.parseJSON(data);                                  

                    var $select = $('<select id="services" />');
                            $.each(jsondata.services, function() {
                              $('<option value='+ this.serviceid +' />').append(
                                    this.name
                              ).appendTo($select);
                            });
                            $('#servicedata').empty().append($select);
                    $("#serviceLists").hide();
                    $("#fileLists").show();
                            
        });
    });

    var pageIndex = 0;  
    function createQueryForMoveDirectory(targetId)
    {
        pageIndex = 0;
        return createQueryForListFiles(targetId);
    }
    
    function createQueryForNextPage()
    {
        pageIndex++;
        if(parentList.length == 0)
        {
            return createQueryForListFiles(null,pageIndex);
        }else{          
            return createQueryForListFiles(parentList[parentList.length -1],pageIndex);
        }
    }

    function createQueryForPreviousPage()
    {
        if(pageIndex > 0){
            pageIndex--;            
        }
        if(parentList.length == 0)
        {
            return createQueryForListFiles(null,pageIndex);
        }else{          
            return createQueryForListFiles(parentList[parentList.length -1],pageIndex);
        }
    }   
    
    function createQueryForListFiles(parentId,pageIndex)
    {
        var listFilesUrl = "https://service.pogoplug.com/svc/api/listFiles?valtoken=" +
                            valtoken +
                            "&amp;deviceid=" +
                            $("#devices").val() +
                            "&amp;serviceid=" +
                            $("#services").val();
        if(parentId){
            listFilesUrl += "&amp;parentid=" + parentId;  
        }
        if(pageIndex){
            listFilesUrl += "&amp;pageoffset=" + pageIndex;           
        }
        return listFilesUrl;
    }

    var parentList = [];
    function createfileLink(data)
    {
                    jsondata = jQuery.parseJSON(data);                                  

                                    
                    var $ul = $('<ul />');
    
                      if (parentList.length == 1) {
                        $('<li />').append($('<input type="button" />').click(function(){
                            $.get(createQueryForMoveDirectory(), function(data){
                                parentList.pop();createfileLink(data);
                            });
                        }).val("..")).appendTo($ul);
                      }else if(parentList.length > 1)
                      {
                        $('<li />').append($('<input type="button" />').click(function(){
                            $.get(createQueryForMoveDirectory(parentList[parentList.length-2]), function(data){
                                parentList.pop();createfileLink(data);
                            });
                        }).val("..")).appendTo($ul);
                        
                      }
        
                        $.each(jsondata.files, function() 
                        {
                            //ファイルタイプがファイルだったらリンクを、ディレクトリだったらサブディレクトリのファイルリスト取得のリンクを作成
                            if(this.type == 0)
                            {
                              $('<li />').append(
                                    $('<a href="https://service.pogoplug.com/svc/files/' 
                                        + valtoken + '/' 
                                        + $("#devices").val() + '/' + 
                                        $("#services").val() + '/' + this.fileid 
                                        + '/dl/" />').text(this.name)).appendTo($ul);
                            }else
                            {
                                var fileid=this.fileid;
                              $('<li />').append(
                                    $('<input type="button" />').click(function(){
                                        $.get(createQueryForMoveDirectory( fileid), function(data){parentList.push(fileid);createfileLink(data);});
                                    }).val(this.name)).appendTo($ul);
                            }
                        });
                    $('#filedata').html($ul);
                    $("#fileLists").hide();
                    $("#downloadform").show();

    }

    //getFilesボタンをクリックしたときに発行されます。
    //選択したストレージのルートに存在するファイルをダウンロードするためのリンクをはります。
    $("#getfiles").click(function(){
        $.get(createQueryForMoveDirectory(), function(data){createfileLink(data);});
    });

    $("#nextPage").click(function(){
        $.get(createQueryForNextPage(), function(data){createfileLink(data);});
    });
    
    $("#previousPage").click(function(){
        $.get(createQueryForPreviousPage(), function(data){createfileLink(data);});
    });

});
Share

pogoplugのLAN内でのipの調べ方 #pogoplug

MyPogoplugでSSHでのアクセスを許可したものの、IPアドレスってどうやって調べるんだっけ。というところで止まっていましたが、
前回の記事

pogoplugにはweb apiが提供されていて、それを利用する事で、カスタムアプリを作成する事ができる。

というわけで、とりあえずブラウザ上で叩いて遊んでみた。
ブラウザ上でpogoplug web apiをたたいて遊んでみた。 #pogoplug

を書いた結果、pogoplugと同じLAN内でまず、ログインするapi

https://service.pogoplug.com/svc/api/loginUser?email=test@pogoplug.com&password=test

をたたき、その後デバイスリストを取得するapi

http://service.pogoplug.com/svc/api/listDevices?valtoken=<ログインで取得したvaltokenを指定>

を叩いて戻ってきたレスポンスの内容の中にapiurlというものがあり、そこにLAN内でのIPアドレスが書いてある。

実際に、このIPでsshにつなぐ事が出来るようになる。

Share

Cent OSをインストールしてyumが403エラーでうまく動作しないとき

Cent OSをHyper-Vにインストールして、統合コンポーネントをインストールするために、yumを使って各種インストールをしようとしたんだけど、yumを使うたびに

403:Forbidden

と出て、うまく動作しない場合、属しているネットワークがプロキシサーバを利用していますので、プロキシサーバのアドレス等を聞いて、

/etc/yum.conf

proxy=http://サーバのアドレスとポート

を設定しましょう。

wget等も同様に設定がありますので、/etc/wgetrc等を設定しましょう。

Share

比例代表制を全国区にするということ

いまや、物理的な場所が離れていても、ネット上で同じ思想を持つ人達のコミュニティがたくさんある時代。
そんな時代であるからこそ、選挙も物理的な場所に依存する割合を減らしたほうが良いのではないだろうか。

そこで、比例代表制の区分けをやめて全国区にしてしまえば良いのではないかと昔から思っていた。
そうすることで、物理的な制約を排除した国という枠組みで挙党する事が可能になるのではないか。

そうすることで他にも昔からあるような

  • 地域間の1票の格差がなくなる(全国区だから)
  • 地元への利益誘導優先な短い視点での投票が減る
  • ブロック分けする事で発生する死票が減る

などの利点がある。

一番期待しているのは、今までに無かったような「これから」という人たちが全国から集まって挙党すること。
こういう行動が増えることで若年層の政治への関心が増えるかもしれないし、より未来を見据えた国家運営ができるかもしれない。

ちなみに、1980年まで参議院で全国区という制度が取られていたんだね。でもその時は比例じゃなく個人選挙だった。

Share