2014年10月22日水曜日

10秒コメント撮影のコツ



ivrc(http://ivrc.net )で撮影のボランティアをしているんだけれども、そこで10秒コメントっていうものがある。作品の前に立って10秒強で説明するってものなんだけど、学生だということもあってちょっと難しいみたいなので、やんわりと指導する事がある。でも、この内容ってNT(ニコ技の展示会)やMakeでも言える事だし、何かの役に立つかもと思って撮影注意事項を公開しておきます。


コンテスト・展示会では作者の主張を尊重する事が絶対的に大切なんだけど、分かりにくかったらやり直させるってのも優しさとして有りだと思うんだ。




  • 撮影の際に「10秒」に強く拘る必要はありません10秒言っても15秒ぐらいになるものです。

  • 技術的に頑張った作品には、「なにができるのか?」を必ず含めてもらってください。

  • コンテンツとして頑張った作品には「どう面白いのか?(どこが肝なのか?)」を含めて貰って下さい。

  • VRにちょっと興味がある程度の一般人では理解不能な専門用語は言い換えさせて下さい。


 (簡単な専門用語のふりして、自分たちだけの独自用語をしれっと使うチームがあるので超注意)


 お母さんにかろうじて通じるレベルの一般用語に直してくれと頼めば大体OK


 例「フレキシブルなディスプレイを体験できます⇒画面を自由に変形させて映像で遊ぶ事が出来ます」




  • 説明しているようで説明していない説明は言い直させて下さい


 例「力覚提示によって面白い体験ができます。(どう面白いかは言っていない)⇒思いもよらない衝撃がやってくる事で、「おっ」という驚きと共にスッキリする体験ができます」








「専門用語」「説明になってない説明」を使う場合は、本人たちがまだ整理できてない時があります。


誘導にならない程度に、「この作品で一番やたかった事」を聞き出して、説明と照らし合わせて、どう改良すれば良いか相談にのってあげてください。





2014年10月17日金曜日

セキュリティ的にイケてないソフトを何となく探すテスト



ふとした思いつきで、簡単にセキュリティ的にイケてないソフト探す事ができるかもしれないなと思ったのでイケてないソフトを探すソフトを作ってみた。


やってる事




  1. C言語の文字列操作関数を使っているか調べる(セキュリティホールになりやすい)

  2. スタック保護がなかった時代のVisualC++を使っているか調べる

  3. DLL/EXEの作成日時を調べる


C言語の文字列関数を使っているDLL/exe(といっても文字列探索してるだけ)を見つけたら表示します。作成年が2003年とか古かったらメンテナンスされていない可能性のある要注意ソフトです。


さらに後ろにtrue/falseと表示してますが、trueの倍スタック保護がなかった(or 弱かった)時代のVisualC++を使っているソフトです。


実行例


以下はFirefoxでの実行例です



C:\Program Files (x86)\Mozilla Firefox/d3dcompiler_46.dll 2013 true


C:\Program Files (x86)\Mozilla Firefox/uninstall/helper.exe 2010 true















使い方:


ruby installerでrubyをインストールした後に


以下のソースを拡張子.rbで保存して、実行すればいいです。(c:\以下を探索)


(実行時にパスを引数として渡すと、そのパス以下を処理します)


(installerはバージョン2.0系を使っとけばとりあえず無難かなと。)



#!/usr/bin/ruby
# coding: ASCII-8BIT
def dumpTime(file)
dangerFunc = false
oldVC=false
begin
content = File.binread(file);#.binread()
rescue
return
end
year=2014
pos=content[0..2000].index("PE\0\0")
if(pos!=nil)then
date=content.getbyte(pos+8)+
content.getbyte(pos+9)*2**8+
content.getbyte(pos+10)*2**16+
content.getbyte(pos+11)*2**24
year = Time.at(date,0).strftime("%Y").to_i
end
psFlag=false
sprintFlag=false
content.split(/[\s\0]+/).each do |line|
oldVC = true if (/(MFC\.DLL)|(MFC42\.DLL)|(MFC70\.DLL)|(MFC80\.DLL)|(MSVCRT\.DLL)/i =~ line)
psFlag = true if(/\%s/ =~ line && !(/CLSID(\\)*\%s/=~line) )
sprintFlag = true if(/sprintf/ =~ line)
dangerFunc = true if(sprintFlag && psFlag)
dangerFunc = true if(/strcat/ =~ line) #strcpy getは当面除外
end

puts "#{file}\t#{year}\t#{oldVC}" if(dangerFunc && (oldVC || year <2009 || 2030<year) )
end

def run(dir)
#$stderr.puts "DIR: #{dir}"
begin
dd=Dir.open(dir)
rescue
return
end
dd.each do |f|
next if( f=="." || f == ".." || /^\$/=~f )
file=dir +( "/" + f)
run(file) if FileTest.directory?(file)
dumpTime(file) if(( f=~ /\.exe$/i || f=~ /\.dll$/i|| f=~ /\.ocx$/i ) && FileTest.file?(file))
end
end

start=ARGV[0]
start="c:/" if(start==nil)

run start
$stderr.puts "End===press any key to exit===="
$stdin.gets






2014年10月4日土曜日

サビツキーゴーレイの係数を求める@ C++/Eigen



昔Rubyで書いたサビツキーゴーレイ係数を求めるプログラムをC++に書き直してみた。


Rubyでは処理時間気にしてゴリゴリ各要素計算した部分があったけど、


読みにくいだけなので、書き直しました。


元々はhttp://www.empitsu.com/wp/?p=112の記事を参考に実装しましたが今回は昔Ruby で書いたコードを信じていの移植です。





使い方



#include "savi.h"
.......
Savi savi;
savi.init(何次関数を使うか,フィルタ長);
savi.coeff(0);//微分なしのFIRフィルタ係数
savi.coeff(1);//1次微分したときのFIRフィルタ係数


フィルタ長は指定した長さがnだとすると2n+1の長さのFIRフィルタ係数が得られます


以下ライブラリ本体(savi.h)



#ifndef _SAVI_H
#define _SAVI_H
//OriginalCode is
//Copyright 2010 akira_you niconico-tech.
//Rewrite to c++ by akira noda 2014

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wconversion"
#pragma clang diagnostic ignored "-Wsign-conversion"
#include <Eigen/Dense>
#pragma clang diagnostic pop
#include<cmath>
namespace SAVI{


template<typename T>
class Savi {
private:
int hlen;
int order;
public:
Savi(){
hlen=-1;
}
typedef Eigen::Matrix<T,-1,1> Vec;
typedef Eigen::Matrix<T,-1,-1> Mat;
Mat svm;//savizky golay matrix

void init(int in_order,int in_hlen){ //actual filter len is hlen*2+1
if(hlen==in_hlen && order==in_order)return;
hlen=in_hlen;
order=in_order;
assert(0<order);
assert(1<in_hlen);
assert(order <1+2*in_hlen -1 );
Mat xm(order+1,order+1);
for(int i=0;i<=order;i++)
for(int j=i;j<=order;j++){
T sum=0;
for(int a=-hlen;a<=hlen;a++){
sum+=(T)pow(a,i+j);
}
xm(j,i)=xm(i,j)=sum;
}
Mat xm_inv=xm.inverse();
Mat xx(order+1,hlen*2+1);
xx.row(0)=Vec::Ones(hlen*2+1);
for(int i=0;i<hlen*2+1;i++)xx(1,i)=i-hlen;
for(int di=2;di<=order;di++){
xx.row(di)=xx.row(di-1).array()*xx.row(1).array();
}
svm= xm_inv*xx;
}
Vec coeff(int diffOrder=0){
double a=1;
for(int i=2;i<=diffOrder;i++)a*=i;
return a*svm.row(diffOrder);
}
};
};
#endif





ちなみに、フィルタの中心部分を求めるように処理をしていますが、以下の2つを書き換えると中心位置をずらせます。(0が入る場所が中心)


中心位置は0.5だけずらすという事もできて、そうすると内挿ができます。(参考http://d.hatena.ne.jp/akira_you/20110428