Blog xaie

Entries tagged as ‘programming’

Bahasa Pemrograman “Go” dari Google

15 November 2009 · Tinggalkan sebuah Komentar

Holy crap! A new programming language from Google!

http://golang.org/

Busyet, gw mesti lihat yang satu ini. Dari contoh program yang diberikan nampaknya Python-ish dengan rasa C. Saya bersemangat dengan prospek bahasa ini, bukan karena nama besar Google dibelakangnya tapi karena sederet feature yang masih “katanya” (soalnya belum coba sendiri :D ). Baguslah, saya sedang tunggu-tunggu yang seperti ini: fleksibilitas Python dengan power dan workflow C.

Yang paling penting menurut gw, ini bukan interpreted language! Kalau memang betul bisa kompilasi dengan cepat, seperti Object Pascal, maka asik juga bisa menyaingi Python yang (IMHO) bagus tapi sayangnya interpreted. Artinya Go, dari kesan yang gw dapat setelah membaca sekilas, memiliki kecepatan kompilasi seperti Object Pascal, menghasilkan native object bukan intermediate yang dijalankan oleh VM seperti Python atau Java, tapi dengan sifat ekspresif seperti Python.

Hmm.. very interesting. Pertanyaannya sekarang, apakah bahasa ini akan “sukses”?

Kategori: Uncategorized
Ditandai: , ,

updateln.py

18 Juni 2009 · Tinggalkan sebuah Komentar

A Python script to update links under a path to use new prefix.


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os, sys, getopt;
options = {'start': None, 'oprefix': None, 'nprefix': None, 'simulate': True};

class PathError (Exception):
  pass;

def ShowUsage():
  progname = os.path.split(sys.argv[0])[1];
  print progname;
  print '-'*len(progname)
  print " Usage: %s [-w] [-s startpath] -o oldprefix -n newprefix\n" % progname;
  print " Parameters: "
  print " -w, --write       Dont run the program run in simulation mode.\n";
  print " -s, --start-path  Use custom starting directory.\n";
  print " -o, --old-prefix  Find link(s) with prefix as specified by this parameter.\n";
  print " -n, --new-prefix  New prefix for the offending link(s) to use.\n";
####  

def GetOptions():
  global options;
  ret = 0;

  arguments = sys.argv[1:];

  try:
    wnt, dummy = getopt.getopt(arguments, "o:n:s:w", ["old-prefix=",
                    "new-prefix=", "start-path=", "write"]);
    for name, val in wnt:
      if name in ('-o', '--old-prefix'):
        options['oprefix'] = val;
      elif name in ('-n', '--new-prefix'):
        options['nprefix'] = val;
      elif name in ('-s', '--start-path'):
        options['start'] = val;
      elif name in ('-w', '--write'):
        options['simulate'] = False;
    ##

    if options['start'] == None:
      options['start'] = os.getcwd();
  except getopt.GetoptError:
    ret = -1;
  ##

  if (options['oprefix'] == None) or (options['nprefix'] == None): ret = -1;
  if ret != -1:
    print "Start      : %s" % options['start'];
    print "Old prefix : %s" % options['oprefix'];
    print "New prefix : %s" % options['nprefix'];
    if options['simulate'] == False:  print "WARNING    : This program may change links.";
    print;
  ##

  return ret;
####

def ProcessPath(curPath, recursive):
  proccount = 0;
  files = os.listdir(curPath);

  if len(files) > 0:
    print "Examining %s" % curPath;

  for entry in files:
    curFile = os.path.join(curPath, entry);

    if os.path.islink(curFile):
      linkPath = os.readlink(curFile);
      if linkPath.find(options['oprefix']) == 0:
        # we need to update this one
        newLinkPath = linkPath.replace(options['oprefix'], options['nprefix'],
                                      1);
        print "Fixing %s\n   Old path: %s\n   New path: %s" % (curFile,
          linkPath, newLinkPath);

        if options['simulate'] == False:
          # these two lines will modify/regenerate the symbolic link
          os.unlink(curFile);
          os.symlink(newLinkPath, curFile);
          proccount += 1;
        ##
      else:
        # good link, skip it
        pass;
    elif os.path.isdir( curFile ) and recursive:
      proccount += ProcessPath(curFile, recursive);
  ##    

  return proccount;
####

def main():
    if GetOptions() == 0:
      i = ProcessPath(options['start'], True);
      print;
      print ["Nothing processed by this program", \
             "There are %s link(s) processed" % i][i > 0] + '.';
    else:
      ShowUsage();
####

if __name__ == '__main__':
    main();
##

Kategori: Ilmu
Ditandai: , , ,

Firebird’s UNION use for multipe SELECT result

20 Desember 2008 · Tinggalkan sebuah Komentar

I would like to post this one just in case I’ll need it someday in the future.

UNION can be used to ‘append’ multiple SELECT result into one stream of rows. This is not a JOIN. There are few situations where a UNION should be used to get a certain result. Here’s one:

I’ve got a table, a view to be exact, like this :


V_EMPLOYEERELATION
+------------+-------------+----------+
|  EMPLOYEE  |  EMPLOYEE_2 | RELATION |
+------------+-------------+----------+
|  101       |  203        | 45       |
+------------+-------------+----------+
|  104       |  108        | 40       |
+------------+-------------+----------+
|  102       |  79         | 45       |
+------------+-------------+----------+

As you can see this is a table that stores relationship between employees. The task is to get all employee entries having a certain Relation ID.

Right, now here’s the query:


SELECT EMPLOYEE AS "ID" FROM V_EMPLOYEERELATION WHERE RELATION = %d
UNION
SELECT EMPLOYEE_2 AS "ID" FROM V_EMPLOYEERELATION WHERE RELATION = %d';

This query will return rows of employee ID satisfying a relation ID. If you know Python or Delphi, you might know the formatting string there. For people who don’t know, the %d is a replacement for an integer value. In this example I’m using integer as foreign key to a RELATION table.

One can use this SQL query like this:


const
  SQUERY_GETEMP =
  'SELECT EMPLOYEE AS "ID" FROM V_EMPLOYEERELATION WHERE RELATION = %d ' +
  'UNION ' +
  'SELECT EMPLOYEE_2 AS "ID" FROM V_EMPLOYEERELATION WHERE RELATION = %d';

...
// RunQuery is a function that takes string SQL query and a dataset, returning an integer
if ( RunQuery(Format(SQUERY_GETEMP, [iRelationID, iRelationID]), Table1) = 0 ) then
begin
  while (not Table1.EOF) do
   ...

Please note that UNIONs requires each ’source-stream’ (a.k.a SELECT statements) to have the same fields number, type and size.

Kategori: Ilmu
Ditandai: ,

Back to C++, in Engrish

10 November 2007 · Tinggalkan sebuah Komentar

cee.pngI’m back to C++, at least for now. I’m in a process re-writing some of my (personal) apps to C using MFC (or wxWidgets). I’m doing this because I’m looking forward to code in C++ a lot more in the future. I’m quite satisfied with my current knowledge of Delphi, and frankly understanding Delphi’s (Object Pascal) programming helps my (re)transition to C++.

I worked my way through C++ basic (again) for a few hours, and some other quirks in C and how to do basic things done in C++. I’m using my free copy of VS.NET express, but that’ll (probably) change soon as I’m downloading wxDev C++. From the words I’ve heard about it, it sounds like ‘okay’ and might stand a chance as a good alternative for someone like me –someone coming from GUI-based IDE.

From my experience (so far) I realized that Delphi really has it’s own good points, and I did struggle with C++ to ‘do things’ like the way I used to in Delphi. As it turns out although not actually the same, now I know how to ‘do things’ C++ way. And these C++ ways of ‘doing things’ makes me really appreciate Delphi.

I guess it’s true then, you’ll appreciate the things you don’t have even more than the ones you have.

Nah, I guess that’ll change too. I’ll see where this fascinating world of C will take me.

Kategori: Orang bego punya kegiatan
Ditandai: , ,