2014年12月29日月曜日

Ruby Mechanize の文字コードエンコーディング変換



最近はやり方が大部スマートになってるんですね。


encoding変換部分がフックできるようになっているのでそこでUTF-8に変換すれば良いだけです。


jpegだとかを間違って処理しないようにtextという文字をContent-Typeに含む物だけを変換しています。


コンテンツ本体は、body_ioを使ってファイルストリームのように扱います。



require 'mechanize'
require 'nkf'

agent = Mechanize.new

agent.content_encoding_hooks << Proc.new do |s, uri, response, body_io|
if %r|text/html| =~ response["Content-Type"]
body_io.rewind #念のため巻き戻し(多分不要)
tmp=NKF.nkf("-Ewm0",body_io.read);# readで読み込んでEUCからUTF-8にnkfで変換
tmp.force_encoding("utf-8");
body_io.rewind #巻き戻して、utf-8で書き直す
body_io.write(tmp);
response["Content-Type"]="text/html; charset=utf-8"
end
end





2014年12月10日水曜日

WMVファイルの作成日時を調べる



ファイルプロパティヘッダに1601/1/1から100ナノ秒単位で数えた秒数が入っているので、それを計算すればOK。



#!/usr/local/bin/ruby
require 'date'
data=$stdin.read(4096);
pos=data.index(["A1DCAB8C47A9CF118EE400C00C205365"].pack("H*")) + 16*3;
puts Date.new(1601,1,1) + data[pos,8].unpack("Q")[0] * 1e-7 / 60 / 60 / 24


参考にしたサイトは↓(時刻の計算方法が書いてないので注意)


http://uguisu.skr.jp/Windows/format_asf.html





MP4,movファイルの日付



mp4box(gpac-mp4box)をインストールした上で以下のコマンドでファイル日付が得られる



mp4box -std -diso 調べたいファイル名 |grep Creation|ruby -ne 'd=$_.split(/\"/)[1]; puts Time.at(d.to_i + Time.local(1904).to_i ).to_s.split[0];exit'






2014年12月5日金曜日

バンドパスフィルタをHW化すれば8bitマイコンでもいけそう。



しなぷす さんに教えて貰ったMSGEQ7というバンドパスフィルタを使えば前回いっていたリズム検知が簡単に実装できそうなのでためしてみた。(実チップでの処理ではなくデータシートから読み取ったインチキシミュレータです)


https://www.switch-science.com/catalog/585/


初音ミクの「イノセンス」のサビ部分(83秒付近)を処理するとこんな感じ、サビに入る部分はリズムがちょっとつぶれてるけど、それ以外はリズムが取れてる。リズムで電飾光らせるぐらいなら、十分だと思う。


f:id:akira_you:20141205061246p:image


横軸の単位は(秒)です。


赤線が積を取った信号(ちょっと正規化してるけど)。緑線はそれにさらにローパス(立ち上がりのみローパスなし)フィルタをかけたもの。


緑と赤が共にぎゅんと上がって、その後離れる点をビート点とすればよさそう。





マイコン側の処理は以下のように5チャンネル分の積をとって正規化するのと、ローパスのみ。これを100Hz周期で繰り返す事を想定してます。100Hz周期で取ってくるのでMSGEQ7の63Hzや130Hzバンドは信用できない状況になっているのでとりあえずデータを捨てています。



class LPF
def initialize
@rate=0.9
@outValue=0.0
end
attr_accessor :rate,:outValue;
def putp(v)
@outValue=v if(@outValue<v)
@outValue=(1.0-@rate)*v+@rate*@outValue;
return @outValue
end
end
#
#(略)以下メインループ
#
#ここでretにMSG7EQの出力が入る
m=1.0
a=0.0
ret[-5..-1].each { |r| m *= r ;a+= r} #低周波はあまり信用できないはず
v=m
v=m/(a**2 + 1.0E-100) #綺麗に正規化まではしない。音量と相関値との中間ぐらいの特徴量
r=[v,llpf.putp(v)] #ここで出力信号が入る
puts r.join("\t")






実験コード





#!/usr/local/bin/ruby19
# -*- coding: utf-8 -*-
#データの前処理は以下の通り
#sox input.mp3 -t raw -B -e floating-point -b 32 -c 1 -r 96000 input.raw

'In maxima
F:96000;
C:0.1;
H(z,p,c):=(z-1)*(z+1)/((z-c*exp(p*%i*%pi))*(z-c*exp(-p*%i*%pi)))*p;
define(G(f,p,c), 10*log(10)*log(abs( H(exp(-1*%i*2*%pi*f/F),2*p/F, 1- (1-C)*p/F*2 ))));
plot2d([G(x,63,C),G(x,160,C),G(x,400,C),G(x,1000,C),G(x,2500,C),G(x,6250,C),G(x,16000,C)] , [x,20,22000],[logx]);


係数
a0: 1
a1: 0
a2: -1
b1: 2*c*cos(%pi*p)
b2: -c^2
'

class LPF
def initialize
@rate=0.9
@outValue=0.0
end
attr_accessor :rate,:outValue;
def put(v)
@outValue=(1.0-@rate)*v+@rate*@outValue;
return @outValue
end

def putp(v)
@outValue=v if(@outValue<v)
@outValue=(1.0-@rate)*v+@rate*@outValue;
return @outValue
end
end
class BPF
def initialize
@N=2
@inValue=[0.0,0.0]
@outValue=[0.0,0.0]
end
def set(p,c)
#$stderr.puts "set p=#{p} c=#{c}"
@b1=2.0*c*Math::cos(Math::PI*p)
@b2=-c*c
@gain=p
end
def out()
return @outValue[0]*@gain
end
def put(v)
o= v - @inValue[1] + @b1*@outValue[0] + @b2*@outValue[1]
@outValue[1]=@outValue[0]
@inValue[1]=@inValue[0]
@outValue[0]=o
@inValue[0]=v
return o * @gain;
end
end
class MSG7
def initialize
@F=96000.0
@C=0.1
@BINSIZE=@F/100; #30Hzで取り込むなら @F/30を指定
@count=0
@bpf=Array.new
[63,160,400,1000,2500,6250,16000].each do |f|
p= 2*f/@F;
c= 1- (1-@C)*f/@F*2
@bpf.push(BPF.new)
@bpf[-1].set(p,c)
end


@lpf=Array.new
@bpf.size.times { @lpf.push(LPF.new) }
@peak=Array.new
@peak.fill(0.0,0,@bpf.size())
end
def put(v)
@bpf.size.times do |i|
tmp=@bpf[i].put(v).abs
@peak[i]=tmp if(@peak[i]<tmp)
end
@count += 1
return nil if @count < @BINSIZE


ret=Array.new(@bpf.size)
@bpf.size.times do |i|
ret[i]=@lpf[i].putp(@peak[i]);
end
@peak.fill(0.0,0,@bpf.size())
@count=0
return ret
end
end

msg=MSG7.new
llpf=LPF.new
llpf.rate=0.85

while(true) do
data=$stdin.read(4*96000/10)
break if (data==nil)
data.unpack("g*").each do |d|
ret=msg.put(d)
next if ret == nil
#ここでretにMSG7EQの出力が入る
m=1.0
a=0.0
ret[-5..-1].each { |r| m *= r ;a+= r} #低周波はあまり信用できないはず
v=m
v=m/(a**2 + 1.0E-100) #綺麗に正規化まではしない。音量と相関値との中間ぐらいの特徴量
r=[v,llpf.putp(v)]
puts r.join("\t")
end
end






2014年11月28日金曜日

簡単な処理でリズム検知したい。



ある程度雑でいいから、マイコンでリズム検知できたらいいなぁ。と思いつつ。


実験。曲によってはビート取り出せる。


とりあえずsoxコマンドで10kHzサンプリングにかえてから



sox input.mp3 -t raw -B -e floating-point -b 32 -c 1 -r 10000 input.raw



以下のソフトに通す。


やってる事は以下の通り




  1. 10このバンドパスフィルタで各周波数帯ごとのエネルギーを取得

  2. 各バンドのエネルギーを掛け合わせる (打楽器系は全周波数帯域にエネルギーが出る)

  3. 積をとったエネルギーの変動具合を、ローパスフィルタとの差分で見る。






#!/usr/local/bin/ruby
# -*- coding: utf-8 -*-
class LPF #ローパスフィルタ
def initialize
@rate=0.99
@outValue=0.0
end
def put(v)
@outValue=(1.0-@rate)*v+@rate*@outValue;
return @outValue
end
end
class BPF #バンドパスフィルタ
def initialize
@inValue=[0.0,0.0]
@outValue=[0.0,0.0]
end
def set(p,c) #ピーク周波数と、フィルタが抽出バンド幅をを指定
@b1=2.0*c*Math::cos(Math::PI*p);
@b2=-c*c
end
def put(v)
o=v - @inValue[1];
o+=@b1*@outValue[0] + @b2*@outValue[1];
@inValue.unshift(v)
@inValue.pop
@outValue.unshift(o)
@outValue.pop
return o;
end
end

data=$stdin.read().unpack("g*")
bpf=Array.new
lpf=Array.new
llpf=LPF.new
lllpf=LPF.new

16.times do |i|
p=1.0/16*i
bpf.push(BPF.new)
bpf[-1].set(p,0.95)
lpf.push(LPF.new)
end
data.each do |d|
dd=Array.new
bpf.size.times do |i|
#各バンドのエネルギーにローパスをかけてdd配列にいれる
dd.push( lpf[i].put(bpf[i].put(d)**2))
end
sum=1.0
dd.each do |v|
sum*=v
end
sum=sum ** (1.0/dd.size())
dd.unshift(sum)
lsum = llpf.put(sum)
v= lsum-lllpf.put(lsum)
puts v

end





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








2014年9月7日日曜日

windows環境でKiCadのpcbnewのps出力をトナー転写用のPDF原稿に直す。



以下の3つをインストル




  • sed


http://ac206223.ppp.asahi-net.or.jp/adiary/memo/adiary.cgi/hirosugu/GNU%20sed%20%E3%82%92Windows%E3%81%A7%E4%BD%BF%E3%81%86




  • gohostscript 64bit

  • inkspace


sedとghostscriptにPATHを通しておく。





PSファイルを作る




  • プロットメニューで線幅の設定を最小にする。(0を指定すると勝手に最小幅に修正される)

  • プロットメニューで反転描写にする。

  • ファイル⇒ページ設定をA4などの小さな紙に設定しておかないと、基板がはみ出て真っ白なPDFになるので注意。


psの追加工


kiCadは塗りつぶし領域の外側に線を引くんですが、最小幅にしておいてもプリンタ側でプリンタ内部の1pixに広げられてしまうので、モニタで確認したサイズよりも1ピクセル線が太くなって、印刷がつぶれてしまいます。


以下のバッチファイルを通してファイルを修正します。



sed -E "s/grestore stroke/grestore/" < %1 > %1_conv.ps



(バッチファイルに↑の一行をかいて、ドラッグ&ドロップすればOK、_conv.psが追加されたファイルが加工後のファイルです)


Inkspaceでの加工


加工後の_conv.psファイルをinkspaceにドラッグ&ドロップすれば読めるはずです。読めないときはghostscriptにちゃんとPATHが通っているか確認してください。


加工後は、PDF形式で保存してから印刷acrobat readerで印刷して下さい。





2014年3月1日土曜日

samba4.1 をActive Directoryに参加させてみた



会社などですでにActiveDirectoryがあって、そこに自分のパソコンを登録させる時の話です。


ネットワーク管理者からは以下の情報が各パソコン所有者に伝えられてるはず。




  • 参加するドメイン(ワークグループ):CORP

  • レノム(ドメインと称してるかも): CORP.WAGASYA.LOCAL

  • ドメインに参加するためのユーザ名: domain_adder


FreeBSD10.0とnet/samba41で確認しました。~


samba3系列とは設定方法が違うので気をつけて下さい


0.前準備


しなくても大丈夫だけど、合わせておくとあとで混乱せずに済みます。



rc.confのホスト名設定やhostsの設定をすべて
corp.wagasya.localドメインに書き換え


1.秘密鍵などをsambaに用意させる


色々試行錯誤して、全てをリセットするために行った作業です。portsから入れた直後なら無視してもいいかもしれません。





samba4系列をとりあえずダミーで設定(秘密鍵などを作らせる)



rm -r /var/db/samba4/*
samba-tool domain provision --realm=CORP.WAGASYA.LOCAL --domain=CORP
--server-role=member --adminpass 'some#complex!Passowrd'


ここで指定しているパスワードはこのサーバに対する管理者パスワードです。どうせ使う事は有りません。複雑度が低いと跳ねられるので適当に複雑なのを指定します。


2./usr/local/etc/smb4.confに以下を記述



[global]

dos charset = CP932
unix charset = UTF8
#↓ドメイン名
workgroup = CORP
realm = CORP.WAGASYA.LOCAL
#↓自分のマシン名:ADドメイン管理者が余り短い名前はNGって設定してるときもあるので注意
netbios name = ORE_NO_MACHINE
security = ADS
encrypt passwords = yes
#winbind use default domain = no
#winbind separator =\
idmap config *:backend = autorid
idmap config *:rane = 1000000-1999999
autorid:rangesize = 1000000
dns forwarder = 172.31.20.10
#おまけ1.で使う設定(後述)
template homedir = /home/corp/%U
template shell = /bin/tcsh 

#この行以下はグループ共有フォルダの作成例
#WAGABUSYOユーザとしてアクセスできます
[WAGABUSYO]
path = /home/WAGABUSYO
guest ok = No
read only = No
#許可するユーザの一覧を書く「ドメイン名\ユーザ名」で書く (環境によっては\で表示される)
#↓ダミーユーザWAGABUSYOを含めないと誰もアクセスできないので注意
valid users =
WAGABUSYO,CORP\akira,CORP\yoko,CORP\muji,CORP\zara,
#read list= CORP\akira,,,,,#読める人一覧で指定する場合
#write list= CORP\yoko,,,,,#書き込める人一覧で指定する場合
#↓ここにアクセスするひとはWAGABUSYOだとみなしてアクセスする
force user= WAGABUSYO


4.グループアクセス用ダミーアカウント追加


データ処理ユニットを意味する適当なユーザ & グループを追加(ユーザ名、グ


ループ名共にWAGABUSYO)


5.ドメインに参加する


domain_addrはActiveDirectory管理者から通知された、ドメイン参加のためのユーザ名です。(普通に作業するアカウントと違うので注意)



#rc.confにsamba_server_enable="YES"と書いているのを確認してから
service samba_server start
net ads join -U domain_addr


6.テストする


smbclientはnet ads~で指定したkerberosをのユーザ名・パスワードを使ってログインするので、パスワード聞いてきません。-Uでユーザを指定しても無視されるので注意



net ads kerberos kinit -U 自分のアカウント名
smbclient '\\ORE_NO_MACHINE\WAGABUSYO' -k






おまけ、UNIXマシンをActiveDirectoryに参加させる



sshのログインをActive Directoryのパスワードをつかって出来るようにする事もできます。sshでそれをやることはまぁ、無いでしょうが、PAMを使えるとwebだったり、svnだったり色々活躍するシーンはあるかと思います。


おまけ1. /etc/nssswitch.confにwinbindを追加する


(ユーザ情報[ログインシェルの設定等]をsmb.confから拾ってこれるようにする)



#
#group: compat
#group_compat: nis
group: files winbind
hosts: files dns
networks: files
#passwd: compat
#passwd_compat: nis
passwd: files winbind
shells: files
services: compat
services_compat: nis
protocols: files
rpc: files


おまけ2. /etc/pam.d/sshd の編集 (PAMの設定 for ssh)


パスワード認証をsambaに投げます。


(webだとかsvnサーバの設定はきっとこれに類似していると思う)


なおsystem等を設定すれば、コンソールからのログインもできるようになるはず



# auth
auth sufficient pam_opie.so no_warn no_fake_prompts
auth requisite pam_opieaccess.so no_warn allow_local
#↓以下の行を追加
auth sufficient /usr/local/lib/pam_winbind.so
#auth sufficient pam_ssh.so no_warn try_first_pass
auth required pam_unix.so no_warn try_first_pass

# account
account required pam_nologin.so
account required pam_login_access.so
account required pam_unix.so

# session
#session optional pam_ssh.so want_agent
session required pam_permit.so

# password
password required pam_unix.so no_warn try_first_pass


おまけ3. SSHでPAMを使う様に設定する


/etc/ssh/sshd_configの設定でUsePAM yesとなっている事を要確認


これで slogin 'CORP\muji'@ip_address とするとログインできるはず。


設定後はservice sshd restartとしてsshdを再起動。リモートからsshで入って作業中であってもsshdを再起動しても接続が切れることはありませんが、


別ターミナル画面などから、ちゃんとログインできる事を確認してから、作業中の接続を切るようにして下さい。泣きを見ますよ。





2014年2月12日水曜日

Macで「バッテリーの交換修理」と出たときはMagsafeコネクタを掃除する。



えっ、て思うけれども。Macでバッテリー関連のエラーが出たときは、Magsafeコネクタを疑った方よい。


(充電回数が500回オーバーだとか、バッテリが膨らんでいるのは除く)





事の経緯




  1. 「バッテリの交換修理」って出る。

  2. SMCリセットや、バッテリーの最適化(容量計測のやりなおし)をやってみて

  3. 徒労に終わる

  4. 翌朝「充電できません」にステータスアップ!!

  5. あれ?このメッセージの既視感・・・あ、Magsafeが汚れてるだけか。これで「バッテリの交換修理」に戻れるぞ!

  6. 綿棒で掃除

  7. バッテリ「正常やで」・・・「バッテリの交換修理」なおっとるやんけ。





Magsafeは定期的に掃除しよう


Magsafeは普通に使うと、磁石部分の保護プレートが削れたり、そのへんのホコリを噛んだりして、鉄粉だか炭素だか酸化皮膜だかよくわからないけれども、黒ずんできます。その状態を放置すると危険です。45Wないし60Wの大電力がその黒ずみを通過するので、黒ずみがちょうど電熱ヒーターのグルグルのやーつの働きをして熱をもちます。(コネクタが小さいので、発生した熱を逃がしきれない)


最悪の場合Magsafeコネクタが焦げます。焦げるとそこから出てきた炭に電気を通す場合がほとんどです。(私のMac late2008)は黒く焦げたのでその可能性が高いです。焦って掃除して焦げをおとしました。


http://d3j5vwomefv46c.cloudfront.net/photos/large/838508495.jpg





普通のPCの電源コネクタも掃除が必要?


目視で汚れてなければ不要です。コネクタやスイッチなどは全て接点とよばれるんですが、通常は自己洗浄機能があります。普通の丸いコネクタの場合、外側のバネで押さえつけながらこすることで、ゴミがない状態を作ります。(想定されている表面状態ならば・・・なので。コネクタのメッキがはがれてガタガタになったら交換してください。Magsafeのように燃える危険性たかいっすよ)


参考:(これはスイッチのだけど) http://www.jpo.go.jp/shiryou/s_sonota/hyoujun_gijutsu/small_switch/a-1-1-4.htm


Magsaeってダメなんじゃないの?


いいえ、このレベルのことを常識として知っている人向けの製品です。だからMacbook "Pro"なのさ。(orz)





2014年1月31日金曜日

Macでnslookupはできるのにpingしようとするとそんなホスト名前解決に失敗する時は



DNS問い合わせでSOAレコードがないとpingやweb閲覧がこけます。


どんな時に起きるかというとunboundでイントラネットのAレコードを設定する時。Aレコードだけ設定してもそれなりに動いてるように見えるけどMacはコケルのではまる。


unbound.confの例



server:


username: unbound


directory: /var/unbound


chroot: /var/unbound


pidfile: /var/run/local_unbound.pid


auto-trust-anchor-file: /var/unbound/root.key


interface: 0.0.0.0


do-ip4: yes


do-ip6: yes


access-control: 192.168.1.0/24 allow





#↓これ以降が問題の場所 


local-zone: "local." static


local-data: "local. IN SOA server.local server.local 1505907 300 180 604800 180"


local-data: "local. IN NS server.local"


#↓下の1行だけを書く例がググると見つかるけどMacじゃだめ。


local-data: "server.local. IN A 192.168.1.2"






2014年1月28日火曜日

FreeBSD 10.0-RELEASEにアップデート時にはpkgの入れ直し



注意:以下の説明はすでにpkgngを導入し終えた環境が前提です。


あと、「freebsd-update install」コマンドは3回叩く事になるんですが、


そのうち2回目での作業です。


(3回目でFreeBSD-9.xのライブラリに依存するソフトは動かなくなる)





10.0-RELEASEではABI(windowsでいうwin32API)が変更になってるので、smartmontoolやらなんやら動かないものが出てくる。


てなことで、安全のためpkgを全部入れ替える必要がある。



pkg upgrade -fy



で大部分はいけるんだけど。fを忘れて悲しい事になったりする。


中途半端に10用のが入ったり、昔のが残ったり。


また全部入れ直すのは悲しいので以下のコマンドを叩くとよい。



pkg query -e '%q != freebsd:10:x86:64' %o | xargs pkg install -fy



freebsd:10:x86:64の部分は32bitOSと64bitOSで違うので気をつけて下さい。


それでも、入れ直しが出来ないものがあるので残りはportupgradeなり


補足


10.0にアップグレードしてからpkg2ngした時は上の方法は使えない。



pkg query %t |sort -n |tail -n 1


結果:1391375822



と言う風にpkg2ngの時の終了時刻が得られるので、pkg upgrade後にそのタイムスタンプ以前のタイムスタンプになってるものはportsで入れ直そうっていう方針でOKやと思います。





2014年1月15日水曜日

「初音ミク実体化の情熱」展に作品をだしてみようと思った理由



自分でも動機がはっきりしてないのだけど、色々考えてみた結果、最終的には「ニコ技の布教」です。


展示では「ニコ技の中のイノベーションってコレだったよね。」というモノを見る事ができればと思うのです。


おそらくそうすれば、「ローテクでもいい、むしろ余白の多いローテクでウケればニコ技のイノベータになれる」という事が理解でき、


技術的には未熟な新参者が末席から入るという姿勢じゃなく、堂々と正面から殴り込めるという事が理解して貰えると思うです。(ローテクな新参者歓迎というのが今回の勧誘姿勢)


ちなみにイノベーションっていうのは、ココではある作品に対抗(or参考)して別の作品を作るという連鎖を生み、動画投稿数や累計再生数の増大に寄与する事です。





しょっぱなから、飛ばしすぎて意味わからないですね。まずニコニコ百科のニコニコ技術部の説明から一部を抜粋しましょう。



ニコニコ技術部は、技術レベルが高く世間から注目される斬新な開発を公開している人もいる。そのためアマチュア研究家や科学少年から「いつかはニコニコ技術部に」と、あこがれの対象として見られる側面もある。


と書くと、ハードルが高いように思われる「ニコニコ技術部」であるが、このタグをつけることに制限は無い。むしろ自主的につけることが望まれている。遠慮して作品が埋もれてしまうのはもったいない。仮に、技術が素朴であったり失敗に終わったとしても、そのような作品はむしろ好評であることが多い。



技術レベルの高さに定評があるけれども、そうじゃない人がむしろウケる事ががある。と歯切れの悪い事を言っています。たしかに技術が高いものには素直に感動します。でもニコニコ技術部タグの始まりが「時計」や「メトロノーム」だって事もあり、何となくローテクでしょうも無い失敗をしている動画も直感的には大切な気がしているという所だと思います。


次はこの「何となくローテクも大切」という感じがどこから来てるのか?ということを考えてみたいと思います。





作品の連鎖(イノベーション)について


では何故連鎖は起きるのでしょうか?色々ある気がしますが、「新しい視点」「余白」がキーとなっていて、それを「タグ」が強力に加速しているのではと思っています。(異論は認める)


そもそもの発端。ニコニコ技術部タグについて考えてみましょう。


(参考: http://www.fumi2kick.com/rrtalk/archives/1007 に黎明期の話が載っています。)


事の始まりはこの動画です。当時は「初音ミクってなんだ?すげー!」といった雰囲気で空前のミクブームの始まりの時期でした。その中で現れたのは、ロイツマガールをミクにやらせてみたこの作品です。



D


その動画をうけて、工作で表現しようとしたのが、ニコ技最初の動画と言われる時計でネギ回しをした動画です。



D


コレを見てrerofumi氏は



初音ミク祭りの中で1人PCから離れて工作という形で初音ミクを楽しもうとする姿にピコーンと来るものがあって、反応動画を作成した。



と言っています。まさにコレが上で言っていた作品のイノベーションがおきた瞬間です。


http://www.fumi2kick.com/rrtalk/archives/873 の「その他」参照)


つまり、時計の作品を通してピコーンと「新しい視点」を得たんだと思います。





ちなみに私も同じ頃にネギ振り作品を作っていますが、時計等の作品は知らずに作っており、


初めて知ったのは「ニコニコ技術部」のタグが出来てからです。



D


そのタグ開いてみると、似てるけれども違うアプローチの作品が出てくるじゃないですか!


自分が一番乗りじゃないのは残念でしたが、おぉ、すげぇ居たよ同じ考えの人が!と嬉しかったです。


そして、こんな風に動画を元ネタにして、工作をして遊ぶ事を「ニコニコ技術部」と呼ぶ。という事をなんとなく理解しました。そして、何となく理解した「ニコニコ技術部」をターゲットに動画を作り始めました。


ニコニコ技術部という名前があるおかけげ、既存人気動画を元ネタに工作で面白い事をやろう!という事をはじめたようなものです。そういう意味では「タグ」の力は偉大です。


ほかにもタグの力が大きかったのは小型化戦争でしょう。次の動画が小型化戦争のきっかけです。コメントもタグもなしに見てみて下さい。外部動力と共振を使えば小さいもの動かせるよ~程度の動画です。



D


「ほぅ・・・~~とな」と喧嘩は売ってますが、この動画に「小型化戦争」というタグつくと印象が大きく代わります。このタグがつくことで、技術競争の側面が強く強調されます。ルールはよくわからないが、小さいほうがいいんだろ?という技術競争ですね。





さて、最後に「余白」ついて触れましょう。



D


時計・メトロノームでのネギ振りに続き、ワイパー、ブラインド、うちわ等様々なネギ振りが現れました。


もはや「この動きってネギ振りに見えるよね」という大喜利状態です。



D



D



D



D


実はここにもう一つのキーワード「余白」があると思うのです。


作品は「時計でネギ回しにみえるよね」といいつつ、肩ごと回してたり、そもそもはちゅねミクはネギを回さずに振りますという、色々つっこみ所が多いものでした。


ただ、このつっこみ所は逆に後に続くものに対して、大きな余白を残したとも言えます。初めから完璧なミクロボが完璧にネギを振った動画が投稿されたとしましょう。


だれが、ワイパーでネギ振ってみたという発想ができるでしょうか?





このように、「新しい視点」「余白」「タグ」が作品の連鎖の要だと言えると思っています。(異論はみとめる)


ローテクなモノでも動画や作品での表現を工夫すれば、ニコ技作品群の元祖(元凶)として崇められるのです。


ただ、振り返って後出しの理屈を付けるのは簡単ですが、狙ってやるのは難しいかもしれません。


数打ちゃあたるの精神で頑張りましょう。


「初音ミク実体化の情熱」展について


表題に立ち戻って、展示内容を確認してみましょう。


http://www.meiji.ac.jp/manga/yonezawa_lib/exh-miku.html


の内容に加え、ざっくりと@myrmecoleonさんにニコ技中心に聞いてみました。



展示全体の主旨:


キャラクターを実体化して出会いたい,という情熱・活動について,初音ミクを題材に一覧できる。


一覧なので、ミクの実体化例ならなんでも良い(広く展示作品を公募中)。


2Fでの展示(作品単体):




  • みさいるさんの等身大初音ミクロボット

  • アミッドPのアミッドスクリーン

  • MikuMikuDance

  • VR・AR作品など

  • その他公募したミク作品(技術部だけじゃなく、フィギュア・手芸も)


1F(レンタルショーケース)での展示:


ネギ振りを中心にニコ技紹介パネル・


パネル展示は作品一覧と違い、テーマをもって展示している、そのなかで紹介できる小さな作品も募集中。




  • 技術部の「祭り」の例として小型化戦争を中心に紹介予定非常に短期間に連投され,みるみる小型化していく様子展示 (ネギ振り以外も触れる可能性がある)



実は私はこの展示とは別に以下のような事を考えてみました。





このときはまだ上の「新しい視点」「余白」「タグ」について深くは考えておらず。


こんなに「沢山の視点」が作れるだよ。と展示したら面白いと考えていました。


対して、今回の展示会は小型化戦争という「一つの視点」を掘り下げて、連鎖の熱意を伝えようとしています。


(ネギ振り全般の話をして、さらに小型化を掘り下げるパネルになる予定らしいです)


この二つの展示方針は表面上大きく違うけれども、連鎖を生みたいという思いでは同じなんじゃないんでしょうか?ならばタダノリしてやろうというのが私(akira_you)としての打算です。


ミニマムサクセスとしてはこの全体展示の趣旨の通り「なんか凄い情熱だ、こいつら楽しそうだな」と思って貰えれば十分です。超エクストラサクセスとしては、NHKの子供向け工作番組程度の工作スキルでも、この情熱の火付け役になれる。つまり、自分もこんな連鎖を起こせるし、いっちょやってみるかーと思って貰えればなと思います。



「ローテクでもいい、むしろ余白の多いローテクでウケればニコ技のイノベータになれる」



今回は連鎖のみに着目したので、若干ローテク持ち上げ過ぎかもしれないですが、ハイテクにもちゃんと意味があって「すげー」だとか「ついにここまで来たか」という賞賛はそこで生まれると思っています。


単発で凄い動画が集まるのも、ニコ技という大きなタグがあるメリットですね。