決戦IndexedDB

これは何?

ブラウザに無限のストレージが用意されました。

  1. COOKIEは4KBまで
  2. LocalStorageは5MBまで
  3. 外部ファイル?セキュリティのためアクセスできません。

この軛がようやく解消された。

どうして決戦なのか

どうしてこの仕様になったかわからない仕様だらけ。この苦難のため2年ほど足踏みした。どうしてもクライアントサイドで大量データを扱わなければいけないので・・・

  1. 非同期、非同期非同期の連続、そしてバージョンという概念
    1. UIスレッドをノンブロッキングなのはわかりますが・・・非同期処理のいなし方知らないと詰む・・・
  2. キーが外部もちとデータ内保持と二種類あった。
    1. ここを理解しないと目的のデータを取り出せない。
      1. キーが外部もち:KVSのようなイメージ:OutLine−Key
      2. キーがデータ内保持:RDBMSの様に一部のプロパティーがキー:InLine−Key
      3. なにも知らずにデータ投入するとキーが外部もちになって自動連番がキーに成るため、目的のレコードを取り出せなくなってしまう。
      4. 数万オーダーのデータ処理を考えると取り出すときに全件取得はありえない。多分メモリ不足でブラウザが落ちる。
    2. DBのバージョンという概念がありまして・・・
      1. 追加、修正、削除、CRUDのCUDはバージョンアップが必要
      2. バージョンを正確に記述しないとObjectStoreの削除と作成がうまくできない。
      3. 一つのDBの中に複数のObjectStoreが有る状態で同時複数のDropCreateをトランザくショナルにやろうとするとなかなか壮観な非同期入れ子状態に成る。
  3. 溢れるエラー
    1. DBのバージョン違いはひどかった
    2. エラーの内容もわかりづらい。UnknownErrorってなんなんだー
      1. もちろんPK違反はわかるんだけどね。ConstraintError
  4. KeyPathという未解明の仕様
    1. 名前からしてパスのようにKeyを構成できるように聞こえるが利用方法がよくわからない。
    2. keyにピリオドは入れられない。
    3. もしかしたら1オブジェクトストア内に入れ子でデータ持って検索できるかもと思ったがに駄目だった。
  5. めまぐるしく変わる仕様
    1. 仕方ないのだが、実装も仕様も安定しなかった。
      1. CRUDでのバージョン取り扱いが以前は必要だったり
      2. ChromeAPI実装が標準から離れていたり
    2. ようやく現在はまともに動くように。
      1. Chrome37ではRangeにundefinedを渡すとエラーに成る。

どうあれば嬉しかったか

  1. 普通のSQLだったら良かったのに
    1. WebSQLが退けられた理由をまだ把握していない。
  2. 非同期の他に同期のオプションもあればよかったのに
    1. 非同期はハードル高いよ

特徴

以下RDBMSに比較して

  1. キーは基本一個です。
    1. 複数キーは出来るようだが、めんどくさくてやってない。
  2. 検索にはキーを使えます。
    1. 範囲絞り込みが可能です。
      1. RDBMSの様に使おうとするとキー設計に親子関係を練り込むことを考えてしまいます。
      2. jsに処理を移譲するのはやはりですね・・・ネイティブで済ませられるならソレで。
    2. 複数のキーを連携させることはできません。できる?
      1. Indexは複数作成可能なようですが。
  3. Indexで検索が出来るようです。
    1. できるようです。
  4. ただし、複雑な条件を受け付けるAPIはないです。
    1. いったんjs上にオブジェクトを展開してそこで比較するなどの条件適用が必要になります。
    2. JOIN系、GroupBy、UnionのAPIは無いです。
  5. 非同期につぐ非同期なので変な処理をはさむと遅いです。
  6. 変な処理がなければLocalStorageよりは速い気がする。
  7. FirefoxChromeは普通に動く。
    1. SafariもIE10以降も動くらしいが、悪いな家にはLinuxしかないんだ。
  8. Chromeには削除する方法があるがFirefoxCookie前消しでのみ対応
    1. 自前でDB初期化ロジックが必要

展望

何もかもDBに突っ込もうぜ!
  1. 画像
  2. 設定
クラサバが復権する

有る意味悪夢

WebRTCと組み合わせれば

夢の認証以外ストレージレスサービスが構築可能に。

セキュリティ

まあ暗号化しておかないと見る人見たら丸バレだよね

  1. ChromeとかBookmarkletとかとか。

漫画を毎週1枚挙げる体制作成に向けて。

志は高く

現状漫画を書きたいが書けていないので掛けるシステムの導入を図る。(5年越し)

やりたいこと

週イチで所要時間3時間ほどで漫画を1ページアップしたい。

  1. 内容はストーリー漫画であること
  2. 最終アウトプットの手間はボタンひとつ(チェックボックスも可)
現状

現状は以下の手順が必要

  1. 漫画のストーリーを描く必要がある
    1. プロットを作る
    2. 内容の整合性と演出を考慮する。
    3. ページにちぎって
    4. コマを割ってネームにする。
  2. コマを割る
  3. 噴き出しを描く
  4. 噴き出しに文字を入れる
  5. 下書きをする
  6. ペン入れする
  7. エフェクトを入れる
  8. png,jpeg等の出力画像に落とす
  9. 公開先サービスに投稿する、投稿文を記述する。

上記の手順を踏むと3時間では当然収まらないわけで

解決手段

手順を以下のうように変えてみたい。

  1. 平日にストーリーを構築、ネーム切るまでを完了させる。
  2. まとまった作画対応が取れる日に最終作成を行う。
システムとしての支援

結局業務系のシステムと同じでどこまで手順を目視可能にするかが鍵に思っている。
脇を締めて力を逃さず少ない力で目標に打ち込む。

  1. 文字をデバイスをまたいで一箇所にプールする。
    1. スマフォでもPCでも見れるし動く※iPhoneは除く
    2. ストック形式、量ともにツイッター式の方がいいのではと思っている。
      1. 編集作業は材料があったほうが格段に楽である。
    3. 書いた断片を整理する手段を提供する。
      1. トゥギャッターのように順番を修正できるようにする
      2. タグで振り分けられるようにする。
  2. システムが単位を管理
    1. 利用者はこの単位に従い情報を蓄積する。
    2. 考えられる区分けとしては、シリーズ、作品(話)、ページ、コマ、吹き出し、擬音、エフェクトなど
  3. ゴールまでのステップをシステムが明示する。
    1. ゴールまでに完了していないステップを提示する。
  4. 利用者に報酬を与える。
    1. アクティビティマップを提示
    2. 消化ステップ数を挙げる。
  5. ペースメーカーとなる。
    1. 埋めていく速度を記録して過去の実績との比較で線を提示する。
    2. 成功確率も上げていく
  6. 下書きまでをWebでサポートする。
    1. そのまま公開できるようににもする
      1. Pixiv,Twitterその他

ちなみにプラットフォームはWeb
それもクロスプラットフォームで作動することが高確率で期待できるFirefoxChromeが対象。

到達したい地平線。


・非常に容易に安価に入手が可能(5000円程度)
・ネットワーク機能を搭載
・バッテリを搭載
・5vで作動し、5Vのバッテリが潤沢に供給されている
・持ち運ぶのに支障がないサイズ
・計算機ノードとして申し分ないスペック
・簡易なディストリビュートが可能な手段がある。
Androidスマフォしかない。(Appleの製品は自由さ、互換性、速度、メモリ容量に劣るので使いたくはない。)

Linuxは64bitからUEFI対応なのに32bit版UEFIで32bitしか対応しない

多分ここを見る人はうんこな仕様のWindowsタブレットLinuxを入れようと奮闘しているのだと思う。
Linuxは基本UEFIは64bit以降の対応で、32bitには対応しないが、Atom3XXXなWindowsタブレットの初期の製品は32bitUEFIにしか対応しない。でもCPUは64bitOKである。多分テスト時間がなかったんだろう。

とりあえず、

http://forum.xda-developers.com/showthread.php?t=2500078
からbootia32.efiをダウンロードして/EFI/bootに突っ込むと解消される

http://togetter.com/li/705263

Ubuntu14.04LTSのCasperBootなイメージをいじる。

Casperを使うのがLiveCDで、以下の手順でLiveCDいじることが出来る。
目的は以下の通り

  • ライブCDを起動した時点でSSHで入れるようにしたい。
    • これは画面のない、または表示ができないマシンのセットアップに重宝する。
    • ただ、vncserver経由でのUnity起動がうまく行かないのでインストーラ正常に作動しない。ここが何とかなれば面白いのだが・・・

実際のコマンド

mkdir mnt
sudo mount -o loop ubuntu-14.04.1-desktop-amd64.iso mnt
mkdir extract-cd
sudo rsync --exclude=/casper/filesystem.squashfs -a mnt/ extract-cd
sudo unsquashfs mnt/casper/filesystem.squashfs
sudo mv squashfs-root edit
さてCapserイメージ内に入る
sudo cp /etc/resolv.conf edit/etc/
sudo cp /etc/hosts edit/etc/
sudo mount --bind /sys/ edit/sys
sudo mount --bind /proc/ edit/proc
sudo mount --bind /dev/ edit/dev
sudo mount --bind /dev/pty edit/dev/pty
sudo chroot edit

このあとapt-getしてssh入れて、ユーザ作る。
sshサーバやらなんやら自動起動設定にもしてく

後しまつと起動用ISOファイルの作成
sudo umount edit/dev/pty
sudo umount edit/dev
sudo umount edit/sys
sudo umount/ edit/proc
sudo chroot edit dpkg-query -W --showformat='${Package} ${Version}\n' > extract-cd/casper/filesystem.manifest
sudo cp extract-cd/casper/filesystem.manifest extract-cd/casper/filesystem.manifest-desktop
sudo sed -i '/ubiquity/d' extract-cd/casper/filesystem.manifest-desktop
sudo sed -i '/casper/d' extract-cd/casper/filesystem.manifest-desktop
sudo rm extract-cd/casper/filesystem.squashfs
sudo mksquashfs edit extract-cd/casper/filesystem.squashfs -b 
printf $(sudo du -sx --block-size=1 edit | cut -f1) > extract-cd/casper/filesystem.size
cd extract-cd
sudo rm md5sum.txt
find -type f -print0 | sudo xargs -0 md5sum | grep -v isolinux/boot.cat | sudo tee md5sum.txt
sudo mkisofs -D -r -V "$IMAGE_NAME" -cache-inodes -J -l -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o ../ubuntu-14.04.1-desktop-amd64-custom.iso .

ubuntu-14.04.1-desktop-amd64-custom.isoを起動用USBメモリに焼けば作業完了

余談

WindowsタブレットのファックなUEFIの仕様への対応

Xcode5がEclipse4.3より残念な点

まずは断っておこう。

自由ソフトウェア主義者の私のPCの使用時間はWindowsLinuxMacOSXだ。
したがってキーバインドWindows、それもThinkPadのキーボドがお気に入りでMacもこのThinkPadのキーボドをSynergy経由で触っている。

では本題だ。

現在、MacOSXiPhoneアプリを開発している。なんだな、あまりに原始的なObjective-CJavaと比べるならJavascriptの方がまだ似ていると言えるかもしれない。なのでクラスがあーだこーだでからみ合ってソースが残念になっていくAndroidよりはマシなのかもしれない。タイプセーフもクソもクラスという概念がJavascript並に希薄だからね。

で、Eclipseから見た場合なのだが

  • バージョン管理システムの統合具合が甘い。なんでリビジョン番号もバージョンツリーも見えないんだよ・・・もちろんEGitも完璧とは言いがたいが、バージョンツリーは見える。
  • ②検索と置換が最悪。というか機能がほとんど実装されてないと言ってもいいかもしれない。
    • 置換のショートカットキーが見当たらない。というか見つけられていない。
    • 検索をかけても目の前の文字すらひかからない場合がある。
    • 検索の条件で単語単位、正規表現という選択肢がない。サクラエディタのほうがはるかにマシ。
  • ③定義参照が貧弱
  • ④画面分割の挙動が謎い
    • これは多分使い慣れていないだけだろうが、未だに挙動を把握できていない。
  • Objective-Cの話ではあるがパッケージ管理がないのは大規模開発を考えると辛い。これはJavascriptも同じか。
  • MacのキーボードのCltlキーとコマンドキーがわかれているのがもどかしい。これのせいでSynergy経由ではキーバインドが厳しいことに
    • MacOSXになれるとWin、LinuxでCltlキーのショートカットのキーボード操作がうまくできない。
    • Win,Linuxに慣れてまた触るとMacOSXで操作ミスが頻発して生産性が著しく落ちる。
    • 以上はコマンドキーの割付をWindowsキーじゃなくてCtrlキーにすれば解決なのだが、MacOSX上のターミナルにおけるショートカットはCtrlキーなので混乱に拍車がかかる。
      • Synergy使うのやめろは正しいが、ポインタが画面またいで動いて、使い慣れたキーボードとクリップボードの共有はやめられない。机の面積は有限だ。
  • Macのフォント・・なんで日本語はline-heightが変わるんだよ・・・

ただ、言えるとことは、使えるものなら不自由なXcodeではないIDEが使いたいし
Eclipseも残念なのでNetBeansとかでもいいように思う。

SwiftはOSSのプロジェクト名を乗っ取た挙句、なぜECMASript6準拠にならなかったのか・・・そこは残念。

Ubuntuのリカバリ方法

ここ最近KVMの長年放置したマシンのアップデートをしたらapt-getでぶっ壊れる事象が発生したので自己流に解決した手段をメモっておく。
まあ、Windows(※XPまでしか触ったことはない)のリカバリーコンソールよりはだいぶましでは有る。なにせ普段使っているコマンドはそのまま使えるから。youがどこにUbuntu入れていても、シリアル番号とかないので安心して使える。いい時代に成ったものだ。
ただし、Canonicalリポジトリ公開が前提なので、サポートが切れてリポジトリが閉鎖されているバージョンのUbuntuは神に祈りながらsudo do-releaseupdateをおこなってバージョンアップしよう。多分無理なのでサポート期限にはくれぐれも注意するか、自前のリポジトリに移行すること。LTSなら4年は大丈夫だが・・・

ゴール

  1. apt-getしてパッケージ管理システムがエラーなしで作動するようにすること。
  2. パッケージシステム以外の状況は関知しない。

状況

うろ覚えなので日本語で

カーネルがアップデートできない

/bootを別パーティーションにしているとカーネルイメージが溜まりすぎてハマる。
アップデート前にsudo apt-get autoremoveをやっておいたほうが良い。

  1. この場合/boot配下のカーネルバージョンが付いたファイルを最新の一個を残して消す。
  2. 再度以下のコマンドを流す。

sudo apt-get install -f

  1. それでも容量たりない(/bootは別パーティションじゃなかった)はまずapt-get cleanをやりましょう。
②sudo dpkg --configure -aしろって言われてやってもできないんですけど

多分依存関係。ssh経由のコンソール上で作業中に寝落ちしても同様のことになる。

  1. 依存関係でエラーを吐くパッケージがリストアップされるのでそいつらを次のコマンドで追い出す。

sudo apt-get purge パッケージなにがし

  1. その後再インストールする。

sudo apt-get install パッケージなにがし

  1. linux-serverとかカーネルイメージも消して再インストールはセフセフ。メモリ上にロードされてるからその間は大丈夫。
  2. もちろんこの間にマシン再起動してしまったら・・・・④に進む
③apt-get purgeで最後にリストが出てきてシステムぶっ壊れてもいい?やる場合はsay yes yah!とかなんとか言われて怖い場合

システムの根幹のパッケージまで消してしまう場合はそんなことが言われます。

  1. しょうが無いのでリストアップされた連中の依存関係を無視して削除する。

sudo dpkg -r --force-depends パッケージなにがし

  1. 全部消し終わったら

sudo apt-get install -f

  1. もういちど消した連中の存在確認もかねてインストールしておく。

sudo apt-get install パッケージなにがし

  1. もちろん設定ファイルがなくなったり、パーミッションが初期化されたりするので頑張ってください。
④うわーん起動すらしなくなっちゃったよ〇〇えも〜ん

起動に必要なパッケージが消えた状態で再起動してしまったよおっかさん状態ですね。

  1. インストールしているUbuntuと同じか非常に近いインストールisoイメージを用意する。
    1. 実機の場合はUSBメモリに起動ディスクとして用意する。
    2. カーネルバージョンさえ合えば別ディストリでも出来なくはないだろうが怖くてやってない。
  2. でライブCDとしてUbuntuを起動する。(Ubuntuを試すのほうね。)
  3. 起動したら必要なパッケージを入れる。
    1. 個人的には以後SSH経由でターミナル開いて使い慣れたキーボードとコピペ生活をしたいのでSSHを入れる。
    2. あとLVM使ってたらlvm2も入れてvgconfig -aだっけか?でボリュームを見えるようにしておく。
  4. どっか適当なところにマウントしてchrootを行う。

sudo mount /dev/vda5 /mnt
sudo mount /dev/vda1 /mnt/boot
sudo mount -o bind /proc /mnt/proc
sudo mount -o bind /dev /mnt/dev
sudo mount -o bind /dev/ptc /mnt/dev/ptc
sudo mount -o bind /sys /mnt/sys
sudo cp /etc/resolv.cof /mnt/etc/resolv.cof
sudo chroot /mnt /bin/bash

  1. このあとは普通にapt-get updateしてapt-get install -fから始めれば良い。

まあそんな感じで復旧できます。