消えたソースを探せ!

12月 16th, 2011

Processing Advent Calendar 2011(16日目)

おやおや、ProcessingIDEがクラッシュしてしまったようですね。
ソースの保存をしていなかったのですか?
せっかくうまく動いていたのに、さぞ残念なことでしょう。

魔法のコード

そんなときでも大丈夫。Processingはスケッチの実行時に、仮フォルダを作成しています。
このフォルダの中を探せば、消えてしまったソースを復活させることができるんです。

実行の度にフォルダを作るので、過去のスケッチを取りだすことだってできちゃうんです。

そんな魔法のようなソースをあなたの手元に。

void setup() {
  try {
    println(File.createTempFile("tmp", "").getParent());
    println(System.getProperty("java.io.tmpdir"));
 
    //  tmpフォルダを探す
    File[] files = File.createTempFile("tmp", "").getParentFile().listFiles(new P5FileFilter());
    List fileList = Arrays.asList(files);
    Collections.sort(fileList,this.comparator);
    Collections.reverse(fileList);
 
    //  見つかったフォルダ名を出力する
    for (File f : files) {
      println(f);
    }
  }
  catch(IOException e) {
    e.printStackTrace();
  }
 
}
 
//  ファイルを新しい順に並べるための比較関数
Comparator comparator=new Comparator() {
  public int compare(Object o1, Object o2) {
    File f1 = (File)o1;
    File f2 = (File)o2;
 
    return (int)(f1.lastModified() - f2.lastModified());
  }
};
 
 //  Processingのtempフォルダを探すためのフィルタークラス
class  P5FileFilter implements FileFilter {
  public boolean accept(File file) {
 
    //  フォルダ名末尾が"temp"になっているかをチェック
    boolean isProcessingFile =  file.isDirectory() && file.getName().matches(".+temp");
    if (isProcessingFile) {
      File[] files = file.listFiles(new FilenameFilter() {
        public boolean accept(File file, String name) {
 
          //  フォルダの中にjavaファイルがあれば、それをProcessingフォルダとみなす
          boolean ret = name.endsWith(".java");
          return ret;
        }
      }
      );
      if (files.length > 0) {
        return true;
      }
    }
    return false ;
  }
};

ファイルの救出

実行してしばらくすると、Processingのコンソール部分に、パスが表示されます。
WindowsでもMacでも、どちらでも動きます。


これが、Processingが作成した仮フォルダです。日付順の新しい順で並ぶので、上の方から探していけば、目的のスケッチにたどり着けるでしょう。

このパスにWindowsならExplorer、MacならFinderなどで移動して、javaファイルを救出しましょう。

仮フォルダ内にあるjavaファイルは、pdeファイルに、「Processingの実行に必要なimportや宣言を加えたもの」です。そこで「先頭にある大量のimport宣言」と「public class hogehoge extends PApplet { の記述」及び「最後のstatic public void main(String args[]) { の記述」を削除したものをProcessingのエディタに張り付ければ、復活させることができます。

コードが消えてしまう場面としては、println()を大量に実行した場合や、無限ループを作ってしまった場合、また、Processing自体の不具合で突然クラッシュしまう時などです。また、単純に保存し忘れなどでも、書いたコードは消えてしまいます。
そんな時は、あなたの助けになるでしょう。そう、この魔法のコードならね。

Tags:
Posted in Processing Advent Calendar2011 | No Comments »

Comments

Leave a Reply

 Comment Form