Nugroho's blog.: 2014

Tuesday, December 30, 2014

Gnome 3 on Freebsd (self documentation)

install it using

#pkg install gnome3

/etc/fstab 

proc           /proc       procfs  rw  0   0

/etc/rc.conf

gdm_enable=“YES”
gnome_enable="YES"

The menu is missing

install Parallel Tools

#cd /usr/ports/emulators/parallels-tools/ && make install clean

but it need kernel source. 

Install via svn

#pkg install devel/subversion

# svnlite checkout http://svn0.eu.freebsd.org/base/releng/10.0/ /usr/src

run it again

#cd /usr/ports/emulators/parallels-tools/ && make install clean











Playing with FreeBSD


Got boot-only iso and managed to install it on my Parallel Desktop on my Macbook Air with Yosemite. 

Of course it just CLI.

Strange, the root shell have tab completion feature, but the normal users didn’t.

(DuckDuckGo-ing)

The answer come from 2003 and 2005 Mailing-List, :)

To enable tab completion
 
$chsh -s /bin/tcsh
 
(it didn’t enable tab completion actually , it change shell with tab completion feature :) )
We could so use
 

$chsh -s /bin/csh 

 
tcsh shell support tab completion too.

 
Another thing is, normal user can’t use sudo command (because it’s not installed, :P )
So,  install sudo first (I used pkg command instead of pkg_add)
 
#pkg install sudo 
 
 
edit /usr/local/etc/sudoers as root and visudo command (don’t edit it using regular vi editor, or ANY editor)

%visudo

add this

username ALL=(ALL) ALL

 
and life become more easier...


 
 

Monday, December 22, 2014

Compare Native Loop Time in Python with "homemade" Fortran Module

This code print d and e as result of two matrix addition, e's using python native code, d's using fortran module compiled with F2PY

The code
import numpy as np
import aravir as ar
import time

n = 1000

u = np.ones((n,n))
v = np.ones((n,n))
e = np.ones((n,n))

t = time.clock()
d = ar.add3(u,v)
tfortran= time.clock()-t

t = time.clock()
for i in range (n):
for j in range (n):
e[i,j] = u[i,j]+v[i,j]
tnative = time.clock()-t

print 'fortran ', d
print 'native', e
print 'tfortran = ', tfortran, ', tnative = ', tnative


The fortran module I imported to python
        subroutine add3(a, b, c, n)
double precision a(n,n)
double precision b(n,n)
double precision c(n,n)

integer n
cf2py intent(in) :: a,b
cf2py intent(out) :: c,d
cf2py intent(hide) :: n
do 1700 i=1, n
do 1600 j=1, n
c(i,j) = a(i,j)
$ +b(i,j)

1600 continue
1700 continue
end

save it as aravir.f and compile using
$ f2py -c aravir.f -m aravir

And here the result
$ python cobamodul.py 
fortran [[ 2. 2. 2. ..., 2. 2. 2.]
[ 2. 2. 2. ..., 2. 2. 2.]
[ 2. 2. 2. ..., 2. 2. 2.]
...,
[ 2. 2. 2. ..., 2. 2. 2.]
[ 2. 2. 2. ..., 2. 2. 2.]
[ 2. 2. 2. ..., 2. 2. 2.]]
native [[ 2. 2. 2. ..., 2. 2. 2.]
[ 2. 2. 2. ..., 2. 2. 2.]
[ 2. 2. 2. ..., 2. 2. 2.]
...,
[ 2. 2. 2. ..., 2. 2. 2.]
[ 2. 2. 2. ..., 2. 2. 2.]
[ 2. 2. 2. ..., 2. 2. 2.]]
tfortran = 0.069974 , tnative = 1.202547

The Desktop, :)


Friday, December 19, 2014

Using 'Home-Made' Fortran Binary as Python module

Python is easy to use, but it's slow, especially for loop computation. So I compute it using fortran like this

        subroutine subs(a, b, n)
double precision a(n)
double precision b(n)
integer n
cf2py intent(in) :: a
cf2py intent(out) :: b
cf2py intent(hide) :: n
! b(1) = a(1)
do 100 i=2, n
b(i) = a(i)-1
100 continue
end


save it as aravir.py and do the following command
$ f2py -c aravir.f -m aravir

To use the module on the python I use the code below
import numpy as np
import aravir as ar

a = np.linspace(0,1,100)

b = ar.subs(a)

print a
print b

:)


3D Waterwave Simulation using Python

I used Numpy  Matplotlib with Animation and 3d Plot module on my OS X Yosemite.

The code is still messy and clearly not efficient (there's slow loop here and there) but it works, :)
Here The Result
The Code
import numpy as np

n = 8;
g = 9.8;
dt = 0.02;
dx = 1.0;
dy = 1.0;

h = np.ones((n+2,n+2))
u = np.zeros((n+2,n+2))
v = np.zeros((n+2,n+2))

hx = np.zeros((n+1,n+1))
ux = np.zeros((n+1,n+1))
vx = np.zeros((n+1,n+1))

hy = np.zeros((n+1,n+1))
uy = np.zeros((n+1,n+1))
vy = np.zeros((n+1,n+1))

nsteps = 0
h[1,1] = .5;

def reflective():
h[:,0] = h[:,1]
h[:,n+1] = h[:,n]
h[0,:] = h[1,:]
h[n+1,:] = h[n,:]
u[:,0] = u[:,1]
u[:,n+1] = u[:,n]
u[0,:] = -u[1,:]
u[n+1,:] = -u[n,:]
v[:,0] = -v[:,1]
v[:,n+1] = -v[:,n]
v[0,:] = v[1,:]
v[n+1,:] = v[n,:]

def proses():
#hx = (h[1:,:]+h[:-1,:])/2-dt/(2*dx)*(u[1:,:]-u[:-1,:])
for i in range (n+1):
for j in range(n):
hx[i,j] = (h[i+1,j+1]+h[i,j+1])/2 - dt/(2*dx)*(u[i+1,j+1]-u[i,j+1])
ux[i,j] = (u[i+1,j+1]+u[i,j+1])/2- dt/(2*dx)*((pow(u[i+1,j+1],2)/h[i+1,j+1]+ g/2*pow(h[i+1,j+1],2))- (pow(u[i,j+1],2)/h[i,j+1]+ g/2*pow(h[i,j+1],2)))
vx[i,j] = (v[i+1,j+1]+v[i,j+1])/2 - dt/(2*dx)*((u[i+1,j+1]*v[i+1,j+1]/h[i+1,j+1]) - (u[i,j+1]*v[i,j+1]/h[i,j+1]))

for i in range (n):
for j in range(n+1):
hy[i,j] = (h[i+1,j+1]+h[i+1,j])/2 - dt/(2*dy)*(v[i+1,j+1]-v[i+1,j])
uy[i,j] = (u[i+1,j+1]+u[i+1,j])/2 - dt/(2*dy)*((v[i+1,j+1]*u[i+1,j+1]/h[i+1,j+1]) - (v[i+1,j]*u[i+1,j]/h[i+1,j]))
vy[i,j] = (v[i+1,j+1]+v[i+1,j])/2 - dt/(2*dy)*((pow(v[i+1,j+1],2)/h[i+1,j+1] + g/2*pow(h[i+1,j+1],2)) - (pow(v[i+1,j],2)/h[i+1,j] + g/2*pow(h[i+1,j],2)))

for i in range (1,n+1):
for j in range(1,n+1):
h[i,j] = h[i,j] - (dt/dx)*(ux[i,j-1]-ux[i-1,j-1]) - (dt/dy)*(vy[i-1,j]-vy[i-1,j-1])
u[i,j] = u[i,j] - (dt/dx)*((pow(ux[i,j-1],2)/hx[i,j-1] + g/2*pow(hx[i,j-1],2)) - (pow(ux[i-1,j-1],2)/hx[i-1,j-1] + g/2*pow(hx[i-1,j-1],2))) - (dt/dy)*((vy[i-1,j]*uy[i-1,j]/hy[i-1,j]) - (vy[i-1,j-1]*uy[i-1,j-1]/hy[i-1,j-1]))
v[i,j] = v[i,j] - (dt/dx)*((ux[i,j-1]*vx[i,j-1]/hx[i,j-1]) - (ux[i-1,j-1]*vx[i-1,j-1]/hx[i-1,j-1])) - (dt/dy)*((pow(vy[i-1,j],2)/hy[i-1,j] + g/2*pow(hy[i-1,j],2)) - (pow(vy[i-1,j-1],2)/hy[i-1,j-1] + g/2*pow(hy[i-1,j-1],2)))

#dh = dt/dt*(ux[1:,:]-ux[:-1,:])+ dt/dy*(vy[:,1:]-vy[:,:-1])
reflective()
return h,u,v
'''
for i in range (17):
#print h
proses(1)
'''

import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
from mpl_toolkits.mplot3d import Axes3D
a = n
x = np.arange(n+2)
y = np.arange(n+2)
x,y = np.meshgrid(x,y)

fig = plt.figure()

ax = fig.add_subplot(111, projection='3d')

def plotset():
ax.set_xlim3d(0, a)
ax.set_ylim3d(0, a)
ax.set_zlim3d(0.5,1.5)
ax.set_autoscalez_on(False)
ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
cset = ax.contour(x, y, h, zdir='x', offset=0 , cmap=cm.coolwarm)
cset = ax.contour(x, y, h, zdir='y', offset=n , cmap=cm.coolwarm)
cset = ax.contour(x, y, h, zdir='z', offset=.5, cmap=cm.coolwarm)

plotset()

surf = ax.plot_surface(x, y, h,rstride=1, cstride=1,cmap=cm.coolwarm,linewidth=0,antialiased=False, alpha=0.7)

fig.colorbar(surf, shrink=0.5, aspect=5)


from matplotlib import animation


def data(k,h,surf):
proses()
ax.clear()
plotset()
surf = ax.plot_surface(x, y, h,rstride=1, cstride=1,cmap=cm.coolwarm,linewidth=0,antialiased=False, alpha=0.7)
return surf,

ani = animation.FuncAnimation(fig, data, fargs=(h,surf), interval=10, blit=False)
#ani.save('air.mp4', bitrate=512)
plt.show()

and the snapshot






Thursday, December 18, 2014

3D Surface Plot Animation using Matplotlib in Python

And here's the animation
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from mpl_toolkits.mplot3d import Axes3D

def data(i, z, line):
    z = np.sin(x+y+i)
    ax.clear()
    line = ax.plot_surface(x, y, z,color= 'b')
    return line,

n = 2.*np.pi
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x = np.linspace(0,n,100)
y = np.linspace(0,n,100)
x,y = np.meshgrid(x,y)
z = np.sin(x+y)
line = ax.plot_surface(x, y, z,color= 'b')

ani = animation.FuncAnimation(fig, data, fargs=(z, line), interval=30, blit=False)

plt.show()

The result

The snapshot



3D Surface Plot using Matplotlib in Python

It's slightly modified from before

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from mpl_toolkits.mplot3d import Axes3D

n = 2.*np.pi
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x = np.linspace(0,n,100)
y = np.linspace(0,n,100)
x,y = np.meshgrid(x,y)
z = np.sin(x+y)
line = ax.plot_surface(x, y, z,color= 'b')

plt.show()


the result


the snapshot



Wednesday, December 17, 2014

Matplotlib Animation in Python

Here is the update from before

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

def simData():
t_max = n
dt = 1./8
k = 0.0
t = np.linspace(0,t_max,100)
while k < t_max:
x = np.sin(np.pi*t+np.pi*k)
k = k + dt
yield x, t

def simPoints(simData):
x, t = simData[0], simData[1]
line.set_data(t, x)
return line
n = 2.
fig = plt.figure()
ax = fig.add_subplot(111)
line, = ax.plot([], [], 'b')
ax.set_ylim(-1, 1)
ax.set_xlim(0, n)

ani = animation.FuncAnimation(fig, simPoints, simData, blit=False,\
interval=100, repeat=True)
plt.show()

and the result

Tuesday, December 16, 2014

Playing with Matplotlib Animation in Python

Coding like this

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation

fig = plt.figure()
n = 10
x = np.linspace(0,2*np.pi,100)



def init():
pass
def animate(k):
h = np.sin(x+np.pik)
plt.plot(x,h)


ax = plt.axes(xlim=(0, 2*np.pi), ylim=(-1.1, 1.1))

anim = animation.FuncAnimation(fig, animate,init_func=init,frames=360,interval=20,blit=False)

plt.show()

The result

Friday, December 5, 2014

Playing (again) with 'Home Made' Vector in Delphi

Here it is. I create a vector as new type, which is in itself is three dimension array.

Then I declared u as vector with three dimension;
u (h,i,j)

where h = 0, 1, 2  as physical component (eg: height, velocity, momentum)
i , j = 0, 1, 2, ..., n as row n column


So if we read u[0,1,1], it means height value at coordinate (1,1); u[1,1,1] is the velocity value; [2,1,1] is the momentum value at the same coordinate.


Trying some of properties of it. I found out that we can initialize all component of vector-u with this one line code

u:=fu(h[i,j],i,j);

so the component u(h,i,j) will filled. Notice that the function has vector (or in this case array) return value.



The code below show how I fill the value of component u(0, i, j)

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
const n=3;
type vector=array[0..2,0..n,0..n]of real;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
function fu(a:real;i,j:integer):vector;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation{$R *.dfm}

function tform1.fu(a:real;i,j:integer):vector;
begin
fu[0,i,j]:=a;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i,j:integer;
h:array[0..n,0..n]of real;
u:vector;
begin
for i:=0 to n do begin
for j:=0 to n do begin
h[i,j]:=1;
u:=fu(h[i,j],i,j);
end;
end;
memo1.Text:='';
memo1.Lines.Append('h[1,1]='+floattostr(h[1,1]));
memo1.Lines.Append('u[0,1,1]='+floattostr(u[0,1,1]));
memo1.Lines.Append('u[0,2,1]='+floattostr(u[0,2,1]));
end;

end.

:)

Wednesday, November 26, 2014

Returning Function as Array in Delphi

Do you wonder how to do vector operation in Delphi? No, of course, :).

We could go like this.

function tform1.adv(a,b:real):real;
begin
adv:=a+b;
end;

The problem is the return is real, which is single value only. We want a and b as vector. Wait...

How we define vector in Delphi? I don't know. I used to treat a vector in Delphi as array. So I coded it like this

var a,b:array[0..1]of real;

So far I had no problem. Lately, I am going crazy with overuse functions in Delphi, and trying operating vectors using function too.

But if I write the code like this
function tform1.adv(a,b:array[0..1]of real):real;
begin
adv:=a[0]+b[0];
{a[1]+b[1]?}
end;

It will only return one value. So I improvised by modify it



like this

function tform1.adv(a,b:array[0..1]of real):array[0..1]ofreal;
begin
adv[0]:=a[0]+b[0];
adv[1]:=a[1]+b[1];
end;

But it won't compile. (it will give error message "identifier expected but ARRAY found"). So I try another approach
type
vector=array[0..1] of real;

function tform1.adv(a,b:vector):vector;
begin
adv[0]:=a[0]+b[0];
adv[1]:=a[1]+b[1];
end;

It works, :).

Here my last night tinkering with "vector" in Delphi, :)

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Math;
type
vector=array[0..1] of real;

type
TForm1 = class(TForm)
procedure proses;
function mux(a:real;b:vector):vector;
function dot(a,b:vector):real;
function norm(a,b:vector):vector;
function adv(a,b:vector):vector;
function suv(a,b:vector):vector;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
n=3;
var
Form1: TForm1;
r,v:array[1..n] of vector;
implementation

{$R *.dfm}
function tform1.adv(a,b:vector):vector;
begin
adv[0]:=a[0]+b[0];
adv[1]:=a[1]+b[1];
end;
function tform1.suv(a,b:vector):vector;
begin
suv[0]:=a[0]-b[0];
suv[1]:=a[1]-b[1];
end;
function tform1.mux(a:real;b:vector):vector;
begin
mux[0]:=a*b[0];
mux[1]:=a*b[1];
end;

function tform1.dot(a,b:vector):real;
begin
dot:=a[0]*b[0]+a[1]*b[1];
end;
function tform1.norm(a,b:vector):vector;
var mag,i,j:real;
begin
i:=b[0]-a[0];
j:=b[1]-a[1];
mag:=sqrt(power(i,2)+power(j,2));
if mag<>0 then begin
norm[0]:=i/mag;
norm[1]:=j/mag;
end;
end;
procedure tform1.proses;
var direction:vector;
vi,vj,swap:real;
i,j:integer;
begin
j:=2;i:=1;
direction:=norm(r[j],r[i]);//call function
vi:=dot(v[i],direction);
vj:=dot(v[j],direction);
swap:=vj-vi;
v[i]:=adv(v[i],mux(swap,direction));
v[j]:=suv(v[j],mux(swap,direction));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
proses;
end;

end.

Monday, November 17, 2014

Delphi: Click a Cell on Stringgrid to Toggle its Value

Here we are. The code below is a part of (unfinished) array of JK flip-flop that draw the output on stringgrid. The problem is, we want to change input (J and K) at  the runtime which is easy if the code is not flexible (just add several button), but as we can see, the code is flexible so there is big no no for the manually added button. So we want to click the corresponding cell and the value changed (in this case toggled, 1 to 0 or otherwise).

Here the code



unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, Buttons;

type
TForm1 = class(TForm)
Button1: TButton;
StringGrid1: TStringGrid;
procedure proses;
function toStr(a:boolean):string;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
private{ Private declarations }
public{ Public declarations }
end;
const n=5;
var
Form1: TForm1;
J,K,Q,nQ:array[0..n-1]of boolean;
clock:boolean=true;
jalan:boolean=false;
implementation

{$R *.dfm}
function tform1.toStr(a:boolean):string;
begin
toStr:=inttostr(-1*strtoint(booltostr(a)));
end;
procedure tform1.proses;
var i:integer;
begin
if clock=false then begin
//flip-flop1
if J[0]<>k[0] then Q[0]:=J[0] else begin
if J[0]=true then Q[0]:= not Q[0];
end;
nQ[0]:=not Q[0];
for i:=0 to n-1 do begin
stringgrid1.Cells[2,i+1]:=tostr(J[i]);
stringgrid1.Cells[3,i+1]:=tostr(K[i]);
stringgrid1.Cells[4,i+1]:=tostr(Q[i]);
stringgrid1.Cells[5,i+1]:=tostr(nQ[i]);
end;
end;
stringgrid1.Cells[1,1]:=tostr(clock);

end;
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
for i:=0 to n-1 do begin
J[i]:=false;
K[i]:=false;
Q[i]:=false;
nQ[i]:=false;
end;
stringgrid1.ColCount:=6;
stringgrid1.RowCount:=6;
stringgrid1.Cells[1,0]:='clock';
stringgrid1.Cells[2,0]:='J';
stringgrid1.Cells[3,0]:='K';
stringgrid1.Cells[4,0]:='Q';
stringgrid1.Cells[5,0]:='nQ';
for i:= 1 to n do begin
stringgrid1.Cells[0,i]:='FlipFlop'+inttostr(i);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
jalan:=not jalan;
while jalan = true do begin
clock:=not clock;
proses;
application.ProcessMessages;sleep(300);
end;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
var i:integer;
begin
if ACol=2 then begin
for i:=1 to n do begin
if ARow=i then begin
J[ARow-1]:=not J[ARow-1];
stringgrid1.Cells[2,i]:=toStr(J[Arow-1]);
end;
end;
end;
if ACol=3 then begin
for i:=1 to n do begin
if ARow=i then begin
K[ARow-1]:=not K[ARow-1];
stringgrid1.Cells[3,i]:=toStr(K[Arow-1]);
end;
end;
end;

end;

end.

Here the result

Digital Counter with Reset and Preset/Clear

This code's updated version from flexible one (whic is by itself is updated version from this) :) .

It has added feature so we could reset the counter if it reach a certain denary (decimal, it is :) ) and preset it to certain denary.

To be able to do that we have to convert the denary to binary and distribute it among Q[0] to Q[n-1].



Here the code
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, Math;

type
TForm1 = class(TForm)
Button1: TButton;
StringGrid1: TStringGrid;
function toString(var a:boolean):string;
function denary:string;
function toBool(a:integer):boolean;
procedure proses;
procedure tlsStrgrd;
procedure deRes(a:integer);
procedure dePres(a:integer);
procedure resPres(a:integer);
procedure counter(l:integer);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const n=6;
var Form1: TForm1;
Q,Qr,Qp:array[0..n-1]of boolean;
l:integer=0;o:integer=0;
jalan:boolean=false;clock:boolean=true;
implementation{$R *.dfm}
procedure tform1.resPres(a:integer);
var i:integer;
begin
if o<=n-1 then begin
if Q[a]=Qr[a] then begin
o:=o+1;
if o=n then begin
for i:=0 to n-1 do Q[i]:=Qp[i];
end else resPres(o);
end;
end;
end;
function tform1.toBool(a:integer):boolean;
begin
if a=1 then toBool:=true else toBool:=false;
end;
procedure tform1.deRes(a:integer);var i:integer;
begin
a:=a+1;
for i:=0 to n-1 do begin
Qr[i]:=toBool(a mod 2);
a:=a div 2;
end;
end;
procedure tform1.dePres(a:integer);var i:integer;
begin
for i:=0 to n-1 do begin
Qp[i]:=toBool(a mod 2);
a:=a div 2;
end;
end;
function tform1.denary; var i,j:integer;begin
j:=0;
for i:=0 to n-1 do begin
j:=j+round(strtoint(toString(Q[i]))*Power(2,i));
end;
denary:=inttostr(j);
end;
function tform1.toString(var a:boolean):string;begin
toString:=inttostr(-1*strtoint(booltostr(a)));
end;
procedure tform1.counter(l:integer);begin
if l<=n-1 then begin
Q[l]:=not Q[l];
if Q[l]=false then begin
l:=l+1;
counter(l);
end;
end;
{menghitung biner tempat mereset}
deRes(13);
{di-reset ke nilai berapa (dalam biner)}
dePres(11);
{masukkan ke sini}
o:=0;
resPres(o);
end;
procedure tform1.tlsStrgrd;var i:integer;begin
for i:=0 to n-1 do begin
stringgrid1.Cells[i+2,1]:=toString(Q[i]);
end;end;
procedure tform1.proses;
begin
clock:=not clock;
if clock=false then
begin
l:=0;
counter(l);
tlsStrgrd;
end;
stringgrid1.Cells[1,1]:=toString(clock);
stringgrid1.Cells[n+2,1]:=denary;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
jalan:= not jalan;
while jalan=true do begin
proses;
application.ProcessMessages;sleep(300);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
stringgrid1.ColCount:=n+3;
stringgrid1.Cells[1,0]:='clock';
stringgrid1.Cells[n+2,0]:='denary';
stringgrid1.Cells[n+2,1]:=denary;
stringgrid1.Cells[1,1]:=toString(clock);
for i:=0 to n-1 do begin
Q[i]:=false;
stringgrid1.Cells[i+2,0]:='Q'+inttostr(i);
stringgrid1.Cells[i+2,1]:=toString(Q[i]);
end;
end;
end.
<\pre>

Friday, November 14, 2014

Discrete Fourier Transform

It's not flexible one.



unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, Grids;

type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
BitBtn1: TBitBtn;
Edit1: TEdit;
procedure proses;
procedure BitBtn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure tform1.proses;
var i,j:integer;
fm:real;
begin
for i:=0 to 50 do begin
fm:=0;
for j:=0 to 10 do begin
{untuk fungsi rect(x)}
fm:=fm+1*cos(2*PI*j*i/10/11);
end;
stringgrid1.Cells[0,i+1]:=floattostr(i);
stringgrid1.Cells[1,i+1]:=floattostr(i/10);
stringgrid1.Cells[2,i+1]:=floattostr(fm);
edit1.Text:=floattostr(fm);
application.ProcessMessages;sleep(200);
f(x)=cos(x)+cos(2x)+cos(3x)+cos(4x)}
end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
proses;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
stringgrid1.RowCount:=51;
stringgrid1.Cells[0,0]:='no';
stringgrid1.Cells[1,0]:='m';
stringgrid1.Cells[2,0]:='f[m]';
//stringgrid1.Cells[3,0]:='no';
end;

end.

Discrete Fourier Transform in Delphi (in progess)

Here we go...

I plan to coding it in a way that it has flexibility in term of function. So I create two variable ft and ff, represent time domain and frequency domain function as two dimensional array, with the first index as 'function name' so it can be (in future) ft[0,i] as rect(x), ft[1,i] as cos(x) and so on.



unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Grids, StdCtrls, Math;

type
TForm1 = class(TForm)
Button1: TButton;
StringGrid1: TStringGrid;
Image1: TImage;
Edit1: TEdit;
function fourier(a,k:integer):real;
procedure proses;
procedure fungsi(a:integer);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Image1Click(Sender: TObject);
private{ Private declarations }
public{ Public declarations }
end;
const n=37;m=5;
var
Form1: TForm1;
ft,ff: array[0..m,0..n]of real;
x0,y0:integer;
sx:real=3;
sy:real=17;

implementation

{$R *.dfm}
procedure tform1.fungsi(a:integer);
var i:integer;
begin
for i:=0 to n-1 do begin
ft[a,i]:=cos(i)+cos(2*i);
stringgrid1.Cells[1,i+1]:=inttostr(i);
stringgrid1.Cells[2,i+1]:=floattostr(ft[a,i]);
image1.Canvas.Pen.Color:=clblack;
image1.Canvas.MoveTo(x0+round(sx*i),y0);
image1.Canvas.lineTo(x0+round(sx*i),y0-round(sy*ft[a,i]));
end;
end;
function tform1.fourier(a,k:integer):real;
var i:integer;jml,j:real;
begin
jml:=0;
for i:=0 to n-1 do begin
j:=i;
jml:=jml+ft[a,i]*cos(2*PI*k*j/n);
edit1.Text:=floattostr(jml);
//application.ProcessMessages;sleep(500);
//fm:=fm+1*cos(2*PI*j*i/10/11);
end;
fourier:=jml;
end;

procedure tform1.proses;
var a,i:integer;z:real;
begin
a:=0;
stringgrid1.Cells[3,0]:='f(rect(t))';
for i:=0 to n-1 do begin
ff[a,i]:=fourier(a,i);
stringgrid1.Cells[3,i+1]:=floattostr(ff[a,i]);
stringgrid1.Cells[4,i+1]:=inttostr(round(ff[a,i]));
z:=ff[a,i];
//z:=strtofloat(stringgrid1.Cells[3,i+1]);
image1.Canvas.Pen.Color:=clblue;
image1.Canvas.moveto(x0+round(sx*i),y0);
image1.Canvas.lineTo(x0+round(sx*i),y0-round(sy*z));
stringgrid1.Cells[0,0]:=floattostr(z);
stringgrid1.Cells[0,1]:=inttostr(floor(z));
//application.ProcessMessages;sleep(500);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
proses;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
x0:=round(image1.Width/2);
y0:=round(image1.Height/2);
image1.Canvas.pen.Color:=cllime;
image1.Canvas.MoveTo(0,y0);
image1.Canvas.lineto(image1.Width,y0);
image1.Canvas.MoveTo(x0,0);
image1.Canvas.lineto(x0,image1.Height);
stringgrid1.RowCount:=n+1;
//rect(x)
fungsi(0);
//tulis stringgrid
stringgrid1.Cells[0,0]:='no';
stringgrid1.Cells[0,0]:=inttostr(round(1.5));
stringgrid1.Cells[1,0]:='t';
stringgrid1.Cells[2,0]:='rect(t)';

end;

procedure TForm1.Image1Click(Sender: TObject);
begin

end;

end.


Flexible Digital Counter using Delphi (with Recursive Procedure)

Updated version from before




unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, Math;

type
TForm1 = class(TForm)
Button1: TButton;
StringGrid1: TStringGrid;
function toString(var a:boolean):string;
function denary:string;
procedure proses;
procedure tlsStrgrd;
procedure counter(l:integer);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const n=5;
var Form1: TForm1;
Q:array[0..n-1]of boolean;
l:integer=0;
jalan:boolean=false;
clock:boolean=true;

implementation{$R *.dfm}

function tform1.denary;
var i,j:integer;
begin
j:=0;
for i:=0 to n-1 do begin
j:=j+round(strtoint(toString(Q[i]))*Power(2,i));
end;
denary:=inttostr(j);
end;

function tform1.toString(var a:boolean):string;begin
toString:=inttostr(-1*strtoint(booltostr(a)));
end;

procedure tform1.counter(l:integer);
begin
if l<=n-1 then begin
Q[l]:=not Q[l];
if Q[l]=false then begin
l:=l+1;
counter(l);
end;
end;
end;

procedure tform1.tlsStrgrd;
var i:integer;
begin
for i:=0 to n-1 do begin
stringgrid1.Cells[i+2,1]:=toString(Q[i]);
end;
end;

procedure tform1.proses;
begin
clock:=not clock;
if clock=false then
begin
l:=0;
counter(l);
tlsStrgrd;
end;
stringgrid1.Cells[1,1]:=toString(clock);
stringgrid1.Cells[n+2,1]:=denary;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
jalan:= not jalan;
while jalan=true do begin
proses;
application.ProcessMessages;sleep(300);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
stringgrid1.ColCount:=n+3;
stringgrid1.Cells[1,0]:='clock';
stringgrid1.Cells[n+2,0]:='denary';
stringgrid1.Cells[n+2,1]:=denary;
stringgrid1.Cells[1,1]:=toString(clock);
for i:=0 to n-1 do begin
Q[i]:=false;
stringgrid1.Cells[i+2,0]:='Q'+inttostr(i);
stringgrid1.Cells[i+2,1]:=toString(Q[i]);
end;
end;
end.

Thursday, November 13, 2014

Recursive Procedure on Delphi.

Yup, recursive procedure (not recursive function, :) ).

I use it to create a simulation about digital asynchronous binary n-bit counter, complete with the denary representation.

n-bit means it's very flexible, you can change n and its output (stringgrid, thats it) automatically adjust itself, :)

Here's the code




unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, Grids, math;

type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
BitBtn1: TBitBtn;
function denary:integer;
function tostring(a:boolean):string;
procedure counter(m:integer);
procedure proses;
procedure isiStringgrid;

procedure BitBtn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

const n=3;
var
Form1: TForm1;
Q:array[0..(n-1)]of boolean;
clock:boolean=true;
l,denary:integer;
running:boolean=false;
implementation

{$R *.dfm}
function tform1.denary:integer;
var i,j:integer;
begin
j:=0;
for i:=0 to n-1 do begin
j:=j+round(power(2,i))*strtoint(tostring(Q[i]));
end;
denary:=j;
end;

function tform1.tostring(a:boolean):string;
begin
{}
tostring:=inttostr(-1*strtoint(booltostr(a)))
end;
procedure tform1.counter(m:integer);
begin
if l<=n-1 then begin
Q[l]:=not Q[l];
if Q[l]=false then begin
l:=l+1;
counter(l);
end;
end;
end;
procedure tform1.proses;
begin
clock:= not clock;
if clock=false then begin
l:=0;
counter(l);
isiStringgrid;
end;
stringgrid1.Cells[1,1]:=tostring(clock);
end;

procedure tform1.isiStringgrid;
var i:integer;
begin
for i:=0 to n-1 do begin
stringgrid1.Cells[2+i,1]:=tostring(Q[i]);
end;
stringgrid1.Cells[n+2,1]:=inttostr(denary);
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
running:=not running;
if running=true then bitbtn1.Caption:='stop'else bitbtn1.Caption:='run';
while running=true do begin
proses;
application.ProcessMessages;sleep(500);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
stringgrid1.ColCount:=n+3;
bitbtn1.Caption:='run';
stringgrid1.Cells[1,0]:='clock';
stringgrid1.Cells[1,1]:=tostring(clock);
for i:=0 to n-1 do begin
Q[i]:=false;
stringgrid1.Cells[2+i,0]:='Q'+inttostr(i);
stringgrid1.Cells[2+i,1]:=tostring(Q[i]);
end;
stringgrid1.Cells[n+2,0]:='Denary';
stringgrid1.Cells[n+2,1]:=inttostr(denary);
end;

end.

The screenshot.

And the result, :)

Friday, November 7, 2014

iOS and OS X's Note

Want to edit Pages document 'on the fly' but don't have a Pages on iPhone? It's OK.

Copy the content of your Page document by select all -> copy, then paste to Note app on OS X. Wait a moment, it will sync with the Note app on iPhone, complete with the formatting and the images, :)





Friday, October 31, 2014

My New Toys, :)

Action Script3

(just for self documentation)

Notice how it differs from ActionScript 2, onRelease, onEnterFrame stuff.

Anyway, I'll tinker with this for next couple days, because it could be published as androidApps.apk via Adobe Air, for iOS too.





var vx:Number = 17;
var vy:Number = 3;
var jalan:Boolean = false;
var batasDrag:Rectangle = new Rectangle(0,0,stage.stageWidth,stage.stageHeight);
addEventListener(Event.ENTER_FRAME, utama);
/* Touch and Drag Event*/
Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
kotak.addEventListener(TouchEvent.TOUCH_BEGIN, tekanKotak);
kotak.addEventListener(TouchEvent.TOUCH_END, lepasKotak);
tbStart.addEventListener(TouchEvent.TOUCH_TAP, toggleStart);
function utama(evtObj :Event):void
{
info.text = 'hallo';
if (jalan)
{
//kotak.y = 156.9;
kotak.x +=  vx;
kotak.y +=  vy;
info.text = "vx = " + String(vx);
info.appendText("\nvy = " + String(vy));
if (((kotak.x+kotak.width) >= stage.stageWidth) ||(kotak.x<0))
{
vx *=  -1;
}
if (((kotak.y+kotak.height) >= stage.stageHeight) ||(kotak.y<0))
{
vy *=  -1;
}

}
}
function toggleStart(event:TouchEvent):void
{
jalan = ! jalan;
}
function tekanKotak(event:TouchEvent):void
{
event.target.startTouchDrag(event.touchPointID, false, batasDrag);
jalan = false;
//kecepatan.text = "0";
}
function lepasKotak(event:TouchEvent):void
{
event.target.stopTouchDrag(event.touchPointID);
jalan = true;
}

/*tbStart.addEventListener(MouseEvent.CLICK,tbStartRelease);
function tbStartRelease(event:MouseEvent):void
{
jalan = ! jalan;
}
*/



Tuesday, October 21, 2014

Enable SMS Forwarding between iOS 8.1 and Yosemite

No code's shown on Mac?

Me too. 

I have this solution after googling  DuckDuckGoing. 

here the excerpt 

I've found a solution on another forum and it worked for me:

Try this: Go to your iPhone Messages settings and turn off iMessages and turn it on again. Then go to the iMessages Settings on your Mac and do the same. After that it worked for me. Also make sure to activate your telephone number in the iMessages settings on your Mac.
and yeah, it works, :)











Keynote on Linux

No, there's no native iWork on my Debian Sid.

It has done via iCloud Drive and iCloud Keynote.

My keynote, wrote it using my old OS X Maverick (or maybe even when my MacBook is still using Lion or Snow Leopard, I forgot), can be accessed via Chrome browser.


Monday, October 20, 2014

Stuck on "Upgrading" iCloud Drive

Well, nothing we can do about it.

But, just remember that sometime the process time on apple based device (and others platform as well) didn't as reliable.

The "1 minute remaining" installation message that took 2 hours to finish.

The Mail app sending message that tell "34 minute remaining" but actually it's sent and we got bewildered when receiving reply of our message that "didn't" sent yet.  

So, be patient, :)

You could soft reset it, power-off and then turn it on again, or another reset, press home button and power button at same time until the device turned off and boot by itself.

Got some solution from discussions.apple.com, flip the airplane switch to on, it'll gave the error message, flip it to off again, and all is well, the iCloud drive status is on. Weird, not pretty solution, but worked, so no problem for me.

But that won't guarantee the problem is solved for everyone, :)

Some succeed by using it and some didn't.

The alternative is, again, be patient, :)


Trace Animation on Keynote

I used it on my OS X Yosemite, still prefer Anagram+Anvil/Appear combo though, :)



Crazy wifi.id Hotspot Corner Speed

Bagaimana kecepatan di wifi.id? Pake speedy instan? 

I’m using intel voucher and what the…  

The 10 Mbps speed is reached, 

wow. 

I upgraded my Garage Band, all iWorks suite (Page, Numbers, Keynote), iMovie, and others (that means download almost 5GB data), and it done under 15 minutes, heheh...

Pake Windows 8.1 di  virtual machine pun masih ok, download hampir 1 giga update-an pun gak sampe 15 menit.

Agak beda dengan Ubuntu Virtual Machine, saat download update hanya mencapai 3Mbps, but, have been deal with 512Kbps before, it's still crazy speed.

Here's some screenshot











Tuesday, October 14, 2014

Coherence on Ubuntu 14.04

When entering Coherence mode in my Ubuntu 14.04 virtual machines, using unity desktop, it asked to disable display visual effects in the virtual machine. 

After DuckDuckGo-ing, it happened that not just the visual effect that must be disabled, but entire unity desktop and have to add gnome-session flshback, :( 

Anyway, the coherence is not what I expect.

Top panel still there, bottom panel is still present

It is the same gnome with OS X background, so I back to Unity again, no coherence mode. It's okay. :)









The Safer Ubuntu

Usually, UNIX-like have weakness (at least that what I though) on password changing. Take the OS X, by default we don't have root password, but we could just $sudo su and then #passwd and tadaa..., we have super users password, we are super user.

but take a look at my ubuntu terminal

nugroho@ubuntu:~$ passwd
Changing password for nugroho.
(current) UNIX password:
Enter new UNIX password:
Retype new UNIX password:
Bad: new and old password are too similar
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
nugroho@ubuntu:~$ passwd
Changing password for nugroho.
(current) UNIX password:
Enter new UNIX password:
Retype new UNIX password:
Sorry, passwords do not match
passwd: Authentication token manipulation error
passwd: password unchanged
nugroho@ubuntu:~$
nugroho@ubuntu:~$ passwd
Changing password for nugroho.
(current) UNIX password:
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
nugroho@ubuntu:~$
.

Monday, October 13, 2014

Finally, Ubuntu 4.10 on Parallels Desktop

Express installs make Parallels Tool installed by default.

It created some problem
Problem warning at first boot
No desktop at all, just plain background, no top bar nor side unity menu

It can be solved with this

enter commandline mode using fn-ctrl-option-f1
enter username and password
type commad below
$ cd /etc/X11
$ ls (there should be file named xorg.conf.XXXXXXXX )
$ sudo mv xorg.conf.XXXXXXXX /usr/share/X11/xorg.conf.d/xorg.conf
$ export DISPLAY=:0
$ gsettings reset org.compiz.core:/org/compiz/profiles/unity/plugins/core/ active-plugins

now reboot using $ sudo init 6

yup, the top bar is there, also side Unity bar, but


the desktop is blank, if apps launched it’ll covered with that black veil, the apps is there but there is no way we can look or access it.

so
go to commandline mode again using ctrl-option-fn-f1
enter username and password
on menu, "choose reinstall parallel tools”
type this command
$ cd /media/nugroho/Parallels\ Tools/
$ sudo ./install
on choice whether we want to reinstall or remove, choose remove
after it done reboot using $ sudo init 6
after login, go back to commandline mode
$ cd /media/nugroho/Parallels\ Tools/
$ sudo ./install
this time choose install (it does autmatically anyway, :) )
after done choose reboot
done

The desktop is normal again, as normal a particular 14.10 as to be :)

The fact is, I write this post using firefox on Ubuntu 14.10, pasting it from note on my Macbook Air running OS X Mavericks.

The image too, using shared files between host and guess




 







Saturday, October 11, 2014

Chaotic OS WeekEnd


It happened because of parallel desktop,  

on my Macbook Air with OS XMavericks. 

We know, it have good relationship with Windows, so installing 7 or even 8.1 is breeze. 

But, how about linux? well, not so 


First I used the traditional established method, at least by Parallels. Ubuntu we go, download its compressed pre-cooked package about 1.6GB. 

It works, flawless, but it 13.04, an unsupported distro, no update, in fact the source list have to be modified to oldrelease to be able to got 'update'. 

And the user name is Parallels, :(

(no problem actually, just do this:

$sudo adduser aravir
$sudo usermod -aG sudo aravir
$sudo init 6
login with aravir
$sudo userdel parallels 

and all was well)

The problem arise after ‘update’ using oldrelease repo, suddenly the display went blank, oh my…

So, without think further, delete it. 

Download the 14.04, install it, hey, Parallels recognise it, help the process using express install.

And, after installation finished, restat to boot for first time, the display went blank. Or it doesn’t ‘went’ blank, but it’s blank from the start, who know.

Tired with ubuntu, Install Debian, because it’s way more stable than ubuntu (at least that’s what I thought about the distro) my main desktop on my room’s installed with it. Still have the iso, so go with it.

Install it with no problem. And the first boot is promising. But the Gnome won’t all out. It keep using fallback mode (even ) so I suspect there’s something wrong about it. 

Check the setting, tadaa…, that’s it, video memory only at 64, the official-from-parallels-ubuntu have 256. So I change the setting and restart it. No change. So, move this VM image to trash.

Curious, I didn’t configure my 14.04 video memory, maybe that’s culprit of my blank display.

Reinstall 14.04, this time I configured the hardware so it has 256 video memory. 
(…)
firstboot, and…
blank screen, duh…

OK, maybe it’s tinme to use new distro. So I downloaded the top rank distro according to distrowatch.com, linux mint, the cinnamon flavor.

install it,

no luck, jeez…

Hm, maybe I have to use the last package to be able to boot graphically. So i went to another route, net install. This time using Debian.

my average 512kbps connection help a lot, :)

after a hour instalation, it finally come to the first boot, and it’s gnome-fallback, ckckck…

another route, net install, but using ubuntu mini.iso.

a hour and half, and then the first boot serving me with the unity like desktop, horay…

but wait, when it go fullscreen, the VM still using its not-widesreen resolution, leaving two black stripe at both edge.

The solution for it’s easy, install parallels tools
$cd /media/{cdroom}
$sudo ./install

done

reboot

and problem solved, :) 










323f (5) amp (1) android (12) apple (7) arduino (18) art (1) assembler (21) astina (4) ATTiny (23) blackberry (4) camera (3) canon (2) cerita (2) computer (106) crazyness (11) debian (1) delphi (39) diary (286) flash (8) fortran (6) freebsd (6) google apps script (8) guitar (2) HTML5 (10) IFTTT (7) Instagram (7) internet (12) iOS (5) iPad (6) iPhone (5) java (1) javascript (1) keynote (2) LaTeX (6) lazarus (1) linux (29) lion (15) mac (28) macbook air (8) macbook pro (3) macOS (1) Math (3) mathematica (1) maverick (6) mazda (4) microcontroler (35) mountain lion (2) music (37) netbook (1) nugnux (6) os x (36) php (1) Physicist (29) Picture (3) programming (189) Python (109) S2 (13) software (7) Soliloquy (125) Ubuntu (5) unix (4) Video (8) wayang (3) yosemite (3)