Sunday, August 24, 2014

Long time no see!

Hi, it's Dr. NISHIO. Long time no see. I haven't wrote entries in English for three years. I'll have keynote speech on PyCon JP on mid-September. I'd like to use this opportunity to relaunch my blog and then increase output in English!

Tuesday, July 26, 2011

Extra information about QUMA

Hi, it is Dr. NISHIO Hirokazu. Did you already read Quma: 3D Motion-Capture Figure For 3D CG Production (Video) | TechCrunch or The Washington Post? I'm very glad to see a lot of people are interested in the project. Unfortunately, there are less information in English than in Japanese. I'll write about them.



Pronunciation
COO of 'cool' + MA of 'mama'. It is similar to the word 'KUMA'(bear) in Japanese. It is because early prototype was put in teddy-bear skin.

How much? It must be expensive!

There are no official announcement about the price. However, SoftEther said "the selling price will be between 10000 JPY and 20000 JPY" on 2009/10/30, with showing QUMA prototype. (ref. 1) In my humble opinion, it will cost much, 2 or 3 times. However it couldn't possibly imagine that it costs over 100000 JPY. Again, it is my humble opinion, not an official one.

About contributers

SoftEther said CELSYSViVienne, 3D-GAN and University of Tsukuba are the contributor of the project. (ref. 2)

CELSYS is selling software to make illustrations, comics and animations. It is nice if those soft supports QUMA directly. It seems possible.

ViVienne got a subsidy to a 3D-related project from MEXT(Ministry of Economy, Trade and Industry) (ref. 3). SoftEther got the subsidy form MEXT too. SoftEther colocates with Tsukuba Univ. It seems those three players are cooperating tightly.

Additionaly, the figure designer ASAI Masaki tweeted about his contribution. (ref. 4) He is very popular as a creator of figma, action figures with exchangeable faces and modules.

Modularity
SoftEther said, the joints of QUMA are modular and can be re-assemble, so you can make various animals like camels, snakes etc, not only human. In my humble opinion, no one use snakes as snakes, but tentacles. ;)

Reference
(ref. 1) 3Dキャラの動きをぬいぐるみで操作、個人用モーションキャプチャ -INTERNET Watch
(ref. 2) 報道発表資料 - 開発中の「QUMA」技術を応用した 3D モーションキャプチャ装置を公開
(ref .3) IPA:2007年度第I期「未踏ユース」採択概要
(ref. 4) http://twitter.com/#!/masakiapsy/status/93823167306530816

Thursday, January 20, 2011

'git add -p'

Hi, it is NISHIO Hirokazu. I just found "git add -p" is very nice. I show it.

Here is a sample script. I'm going to add new function on it.


def hallo():
print "hello!"


When I added new function 'bye', I also found there is a typo s/hallo/hello/. I fixed it too. Let me show 'git diff'


$ git diff
@@ -1,2 +1,5 @@
-def hallo():
+def hello():
print "hello!"
+
+def bye():
+ print "bye!!"


Now I wanted to commit it, but there are two changesets. I didn't want to commit all in one changeset. That's when I should use 'git add -p'!


$ git add -p
@@ -1,2 +1,5 @@
-def hallo():
+def hello():
print "hello!"
+
+def bye():
+ print "bye!!"
Stage this hunk [y,n,q,a,d,/,s,e,?]?


Git asked me whether choose the block of changes (hunk). But it contains both changes... I chose 's' to split it.


Stage this hunk [y,n,q,a,d,/,j,J,g,e,?]? s
Split into 2 hunks.
@@ -1,2 +1,2 @@
-def hallo():
+def hello():
print "hello!"
Stage this hunk [y,n,q,a,d,/,j,J,g,e,?]?


Now I pressed 'y' to choose the hunk, 'n' to skip another hunk and commit.

Stage this hunk [y,n,q,a,d,/,j,J,g,e,?]? y
@@ -2 +2,4 @@
print "hello!"
+
+def bye():
+ print "bye!!"
Stage this hunk [y,n,q,a,d,/,K,g,e,?]? n

$ git commit -m "fix typo"
[master 82bd7c6] fix typo
1 files changed, 1 insertions(+), 1 deletions(-)


Let me show 'git diff' again. The other modification left. Add it and commit it.

$ git diff
@@ -1,2 +1,5 @@
def hello():
print "hello!"
+
+def bye():
+ print "bye!!"

$ git add .
$ git commit -m "add new function: 'bye'"
[master fd5ab40] add new function: 'bye'
1 files changed, 3 insertions(+), 0 deletions(-)


How nice is it! Does other VCS (mercurial, subversion etc.) has such feature?

Tuesday, November 30, 2010

What is 4277075694

Hi, it is NISHIO Hirokazu. I encountered the magic number, 4277075694, when I hacked on Windows. I searched where it comes from. However, it doesn't appear on any code. I also searched 0xFEEEFEEE, 0xFEEE and 65262, and it neither.

Finally I found: 4277075694 (0xFEEEFEEE) comes from Windows NT's heap manager. When a memory released, it is set to 0xFEEEFEEE.

Here are other magic numbers:

0xBAADF00D : 3131961357
0xFDFDFDFD : 4261281277
0xCDCDCDCD : 3452816845
0xDDDDDDDD : 3722304989
0xFEEEFEEE : 4277075694


Here is good instruction: Win32 Debug CRT Heap Internals

Thursday, July 15, 2010

The shortest oneline brainf*ck interpreter in python (558 characters)

Hi, it is Dr. NISHIO Hirokazu. This code was written in 2006-09 but I didn't have publish yet in English.

get from here: http://gist.github.com/476940. It takes a filename as an argument and exec it as Brainf*ck code. All illegal characters are ignored.

exec(reduce(lambda x,y:x.replace(y[0],y[1:]),'Iz"d",|Jz"t",|K1),"|L.read(|Mimport |O,lambda|Psys.std|Q",0);z"|R"Yzp,|S}.get(code[|T)or |U"YZor z"p",p|Vifilter(bool,(|W)%256)or Z,"|X)for x in count())).next()|Y:lambda:|Zz"c",c+1)|q(globals().get(p,0)|zglobals().__setitem__('.split('|'),'Msys;from itertools Mcount,ifilter;z"cQpQj"O kYq==0)^(k==-1)and(Jc+kTI1TVId+{"]":-1,"[":1St],0)*kTd==0 or Jt+kXand z"c",t+1T1TZ);z"code",file(sys.argv[1])L));Vc==len(code)or({">U+K<U-K+Rq+1W-Rq+255W."YPout.write(chrq)TZ,",Rord(PinL1)W[":j(K]":j(-1),Sc]O:Z)()and NoneX'))

See this charm point!

>U+K<U-K+Rq+1W-Rq+255W

It's a definition of >, <, + and - !

Monday, July 12, 2010

Haskell Quiz Answer

Hi, it is Dr. NISHIO Hirokazu. This is an answer for Haskell Quiz. Please read it in advance.

Why some program show strange behavior? To answer the question, I should define what is "strange". For example the following behavior is strange.


// JS
var a = ***, b = ***, c = ***;
console.log(a < b); // true
console.log(b < c); // true
console.log(c < a); // true


In the case, "strange" means "different from mathematical behavior". Now the answer is clear, it is because those are not purely mathematical objects.


var a = "9", b = 10, c = "100";
console.log(a < b); // true
console.log(b < c); // true
console.log(c < a); // true


Haskell also shares some common "strangeness" with other languages.

Prelude> let x = *****
Prelude> x == x + 1
True

You may know the quiz in the other language. This "strangeness" come from the limited resolution of floating point number.

Prelude> let x = 2 ** 64
Prelude> x == x + 1
True


Now, return to the problem I posted.

In Haskell, you can overload different value on one name.
You may disagree. You may see "Multiple declarations of something" error.
But wait. Didn't you have ever defined 'show'? Isn't it overloaded?

Haskell is very different from C++/Java. In C++/Java, you can overload functions whose type of arguments are different. In Haskell, you can also overload functions whose type of return value are different. It is very important.

The quiz's tricks are,

  1. You can overload in Haskell
  2. You can overload functions whose return value are different
  3. and there are no need to take argument
  4. (+) and (==) are t -> t -> t, so it can be used to restrict arguments' type. x + (1::Int) says x is (x::Int).
  5. Number Literal (e.g. 0) are (Num a) => a, so it can be used as both (0::Int) and (0::Integer).


Now let me show my answer.


class Foo t where
a :: t
b :: t

instance Foo Int where
a = 0
b = 1

instance Foo Integer where
a = 1
b = 0

c :: Int
c = 0

d :: Integer
d = 0

main = do
print $ a + c == 0 -- True.
print $ a == c -- True. a::Int == c::Int == 0.
print $ c == 0 -- True.
print $ a + d == 1 -- True.
-- d is Integer. So the variable a is a::Integer,
-- which equals 1. "d == 1" is a misconception.
print $ b + c == 1 -- True. b::Int is 1.
print $ b + d == 0 -- True. However, b::Integer is 0.
print $ b == d -- True. Yes, both are 0::Integer;
print $ d == 0 -- True.
-- Why I use "d == 0" not "b == 0"?
-- Because it causes "ambiguous type" error.
-- You know, ":t 0" is "(Num t) => t". No way to determine
-- it is Int or Integer.

-- hints to make answer unique (perhaps...)
print $ sum([a, b, c]) -- 1: It is [0, 1, 0]::[Int]
print $ sum([a, b, d]) -- 1: It is [1, 0, 0]::[Integer]
print $ [a, b, c] !! a -- 0: (!!) take Int argument,
print $ [a, b, c] !! b -- 1: so it says (a::Int /= b::Int)
print $ [a, b, c] !! c -- 0
-- Why I didn't show [a, b, c] !! d is,
-- it causes error because d is Integer.

Friday, July 2, 2010

Real Point-free Haskell Program

Hi, it is NISHIO Hirokazu. I'm trying to make *REAL* point-free Haskell program. In other words, I want to make point-free (arguments-less) Haskell code with any point(.)

You may know, usually most of Haskell programmer use (.) operator to combine functions. However, it is not necessary. It can replace with (<*>) and const.


Prelude Control.Applicative> :t (.)
(.) :: (b -> c) -> (a -> b) -> a -> c
Prelude Control.Applicative> :t \x y z -> (const x <*> y) z
\x y z -> (const x <*> y) z :: (a -> b) -> (b1 -> a) -> b1 -> b


So anytime you want to use (.) operator, you can do it without (.)


Prelude Control.Applicative> (map . (+)) 1 [1, 2, 3]
[2,3,4]
Prelude Control.Applicative> (const map <*> (+)) 1 [1, 2, 3]
[2,3,4]


And it is also easy to remove points from float expression:


Prelude> 1.5
1.5
Prelude> 15e-1
1.5


The most biggest problem is how to remove this point.

import Control.Applicative
^