zuzuの開発日記

iMona@zuzu等の開発者であるzuzuの趣味や業務で学んだ事などを書き連ねるブログ

adb pullでもMAX_PATH問題で処理が止まる。

adb pullを利用してスマホの内蔵ストレージをバックアップしていた時の話。

adb pull /storage/sdcard0 ./sdcard_20150820bk

といったコマンドを利用してバックアップを行っていたのだが、何回やっても中途半端にエラーが起きて止まる。
「cannot create」といったエラーがなので、ファイルかディレクトリが作れないエラーであるとはすぐ分かった。
どうやら「adb pull」コマンドでもWindowsのMAX_PATH問題は起きるようで、260文字を超えるファイルパスのファイルを作ろうとしていたのが原因だった。
問題の箇所は「Pocket」だった。こいつのオフラインキャッシュのファイル名がハッシュ文字列であり長すぎたのが問題だった。
アプリの設定でオフラインキャッシュを作らないように設定することで、無事内蔵ストレージを全てバックアップすることの成功しました。

このWindowsのMAX_PATH問題どうにかならないですかねorz

Wijmo5のFlexgridで選択範囲を変える方法

前々回に引き続きWijmo5のモジュールのお話。
Wijmo5における高機能な表を表示するためのモジュールであるFlexgridにおいて、選択範囲を変える方法が分かったのでメモしておきます。

// 選択範囲を解除
grid.selection = new wijmo.grid.CellRange(-1,-1,-1,-1)
// 選択範囲を設定
grid.selection = new wijmo.grid.CellRange(0,0,0,0)

このようにFlexgirdのオブジェクトが持つselectionオブジェクトに新しい選択範囲を導入すればよい。
選択を解除したければ四隅に-1を設定することで実現が出来る。

実装コードはjsfiddleに上げました。

以下、参考ページ
http://wijmo.c1.grapecity.com/5/docs/topic/wijmo.grid.CellRange.Class.html

サーブレット・フィルタは上から順に適用されるという話

フィルタは上から順に適用されるという話。
ちゃんとサーブレットを学んだ方々にとっては当然の話だと思います。
ちなみにJava1.7+Spring MVCでの開発を前提とした話です。

社内で開発中のWebアプリにおいて、ファイルアップロード時に文字化けが発生するというトラブルが起きた。
どうやらFormタグのenctype属性を「multipart/form-data」にした際にサーブレットが勘違いをして文字コードをISO-8859-1と思ってしまうのが、
問題のようだった。
このトラブルが起きたのは数か月前、その際は場当たり的に、

new String(formData.getComment().getBytes("iso-8859-1"), "utf-8")

という風に1フィールドずつUTF-8に戻していた。


つい最近、個人的な開発でこのトラブルに遭遇した際に調べなおしたら、web.xmlに「characterEncodingFilter」フィルタを追加すると解決するという記述*1があったため、試してみたら文字化けは解決しなかった。
最初、私はネットに書いてあった記述をそのままweb.xmlの下部に追記する形で利用していた。
ふと思い立ってフィルタの中でもっとも最上部に移動させてみたら、あら不思議文字化けは解消したという話。


サーブレット・フィルタの仕組みを考えれば至極当然のことだった。
ファイルアップロードを担うMultipartFilterの下でcharacterEncodingFilterを記述していても、
MultipartFilterを通って文字化けしたコードに対いて文字コード変換が行われるだけで、
まったくもって意味がなかったのだった。


こういうのは根っこの技術を学んでおらず、業務の一環で技術を学ぶSE・プログラマーが遭遇するトラブルかなと思います。
特にSpringフレームワークのような色々な部分が外部ファイルで設定できるものでは、
設定の記述順序が重要になるというのは考えれば当然ですが、遭遇してみないと気づきませんでした。

SpreadJSにおけるデータバインド機能備忘録

現在、今年5月に発売されたばかりの次世代JavascriptコンポーネントWijmo5とSpreadJSを活用したWebアプリケーションを作成している。 最新のJavascriptを触れるのは刺激的であるが、中々に大変だ。

さて、その開発中にWijmoやSpreadJSが持つオブジェクトとのデータバインド機能を利用した際に配列をうまくセルごとにバインドさせる方法が見つからなかったので、ここに備忘録として記述していく。 今後、備忘録その2が出るかもしれない。

SpreadJS.Sheet setBindingPathで配列にアクセスする方法

function setBindingPath( 
   row : number,
   col : number,
   path : string
) : any;

setBindingPathは行列と対象のオブジェクトを指定することで、その行列とオブジェクトを紐づけることが出来る。

ただし厄介なのは、setBindingPathの第3引数では、DataSourceに指定されたオブジェクトが持つフィールド名を指定する仕様となっている。

以下が例文となる。

var person = {name: "Wang feng", age: 25, address: {postcode: "710075"}};
var source = new $.wijmo.wijspread.CellBindingSource(person);
activeSheet.setBindingPath(0, 0, "name");
activeSheet.setBindingPath(1, 1, "age");
activeSheet.setBindingPath(3, 3, "address.postcode");
activeSheet.setDataSource(source);

では、DataSourceが連想配列ではなく配列だった場合はどうするのか?

以下が例となる。

var persons = [
{name: "Wang feng", age: 25, address: {postcode: "710075"}}.
{name: "August dog", age: 20, address: {postcode: "610075"}}
];
var source = new $.wijmo.wijspread.CellBindingSource(person);
activeSheet.setBindingPath(0, 0, "0.name");
activeSheet.setBindingPath(1, 1, "0.age");
activeSheet.setBindingPath(3, 3, "0.address.postcode");
activeSheet.setBindingPath(0, 1, "1.name");
activeSheet.setBindingPath(1, 2, "1.age");
activeSheet.setBindingPath(3, 4, "1.address.postcode");
activeSheet.setDataSource(source);

このように要素番号をまるでフィールドのように記述することでアクセスが可能となる。

これは下記に示す、BindingPathによるプロパティへのアクセス処理の実装を見れば納得できるだろう。

BindingPathをドットで区切り、区切ったものを対象のオブジェクトの要素名としてアクセスしているのだ。

※obj = 対象のオブジェクト。 p = ドットで区切ったアクセサ。

_BindingHelper.getValueByPath = function(obj, path)
{
    if (!obj || !path)
    {
        return keyword_null
    }
    var subpaths = path.split("."),
        subpathCount = subpaths.length;
    var i = 0;
    do
    {
        var p = subpaths[i];
        if (typeof(obj[p]) === 'function')
        {
            obj = obj[p]()
        }
        else
        {
            obj = obj[p]
        }
        if (obj === keyword_null || typeof(obj) === const_undefined)
        {
            return keyword_null
        }
    } while (++i < subpathCount);
    return obj
};
return _BindingHelper

.net frameworkのRadioButtonはTabStopをFalseにしておくと良いというコネタ

今日の業務で覚えたコネタ
.net frameworkで利用できるRadioButtonはTabStopプロパティをFalseにしておかないと、
アプリケーション起動時に勝手にチェックが入ってしまうことがある。

とあるアプリケーションでPanelとRadioButtonを組み合わせ、選択ボタンのようなものを作ろうとした際に遭遇。
すぐ気付いたからいいものの気付かなければどつぼに嵌ってしまいそうでした。

ラブライブやらナナシスなど所謂スマホゲーをroot端末で起動して遊ぶ方法

最近のスマホゲーでは起動時などにroot端末では起動できないように、root端末かどうか判断を行っています。

最近では、そのチェックをくぐり抜けるためによくsuを無効化するだけではなく、XposedモジュールのRootCloakにてroot端末ではないと偽装する手法が出てきました。

RootCloak:rootチェック機能付アプリからroot状態であることを隠すXposedモジュール | juggly.cn

これなら毎回suを無効化するという煩わしい作業もしなくてよいのでかなり楽ちんです。

続きを読む

excelで図のリンク先を一括変更する方法

ついさっきまで休日出勤してシステムのテストを行っていました。

一通り完了したので提出して帰ろうと思ったのですが、そこで恐ろしいミスに気付いてしまいました。

何かというと、excelの1ブックとして作られたテストケース表を全結合して1つのファイルにまとめたのですが、

その際に各シートの上部ヘッダー真っ白になっておりました。

どうやら各ブックにあったヘッダーというシートを「図」にしてリンク貼り付けすることでヘッダーを再現していました。

ですが私の行ったシート結合のせいでもう存在しない元のブック内のヘッダーシートを絶対参照してしまい真っ白になっていました。

急いで修復しなければならかったのですが、時間はなく手作業では間に合わなかったため、

VBAマクロでさくっとできないか調べてみたらできました。

。。。といった流れを経て今日も今日とて新しいマクロを作りました。

記事のタイトル通り、excelで図のリンク先を一括変更するマクロです。

前提としては選択中のシートにおいて対象の図のリンクが全て同じ場所にあることです。

選択中のシートの一番上にある図のリンク先を変更するマクロ。

 

ではでは必要なお方はご自由にお使いください。