Monday, May 12, 2014

tkinter callback update GUI

Tkinter is a python standard GUI package, it is easy to use if you want to do some simple GUI tasks. To control the widget action, we need to add callback method. while the GUI won't update until the callback method finished. For example, if I want to display a image in a window, and click a button to change to photo to another one.
class ClientGUI(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        self.initUI()
    def initUI(self):
        self.parent.title("demo")
        self.pack(fill=BOTH, expand=1)
        self.changeButton = Button(self, text="changePic", width = 10, height = 1, command=self.onClick)
        self.changeButton.place(x=10,y=100)
        self.initialImage = Image.open('pic1.jpg')
        tkimage = ImageTk.PhotoImage(self.initialImage)
        self.imgLabel = Label(self,image=tkimage)
        self.imgLabel.image = tkimage
        self.imgLabel.place(x=10,y=150)
       
    def onClick(self):
        imagedata = Image.open("pic2.jpg")
        img = ImageTk.PhotoImage(imagedata)
        print img,"\n"
        self.imgLabel.configure(image = img)
        self.imgLabel.image = img
This code works fine to display the picture and change the picture when button clicked. But if we add some code in the onClick method, like this:
for i in range(0,10):
    time.sleep(1)
Then after clicking the button, it will take 10 seconds before the image change. Same thing happens when there is a loop in the callback method, unless the loop is finished, this method won't callback. So what if we want to update the picture immediately we click the button, it means update the GUI, actually we only need to add one single line to solve this problem, add
self.update()

Wednesday, April 2, 2014

list update

If you need to modify the sequence you are iterating over while inside the loop (for example to duplicate selected items), it is recommended that you first make a copy. Iterating over a sequence does not implicitly make a copy. The slice notation makes this especially convenient:

for w in words[:]:  # Loop over a slice copy of the entire list.
    if len(w) > 6:
        words.insert(0, w)

#words: ['defenestrate', 'cat', 'window', 'defenestrate']

Sunday, March 16, 2014

Dimension Unit Measurements Supported in Android

Pixels px
Actual screen pixels

Inches in
Physical measurement

Millimeters mm
Physical measurement

Points pt
Common font measurement unit

Screen density independent pixels dp
Pixels relative to 160dpi screen(Preferable for dimension screen compatibility)

Scale-independent pixels sp
Best for scalable font display

Friday, March 7, 2014

how to send a running program to backgroud in linux?

Type
Ctrl + Z && bg
then the program will run in background and you can't kill it by ctrl + C unless you use
fg
then the program will back to foreground.

If you want to run a program at the beginning, (you may want to use the same terminal while the programming is running), add & at the end.
./program &

website for self-learning programming

Here are some websites you can learn how to code by yourself online.

1. Codecademy

2. Treehouse

3. One Month Rails

4. Hackerrank

Sunday, March 2, 2014

reclaim unused space for mysql

The problem is that mysql will not release the disk space after delete operations to an InnoDB table. That means the disk usage of mysql will not change even you delete half of the data in the database, which will be a large waste for disk usage.

There are two ways to reorganize the physical storage of table data and associated index data to reduce storage space.

1. Use OPTIMIZE TABLE or MYSQLCHECK.
 OPTIMIZE TABLE tb1_name
but optimize table can only be performed for one table, if you want to optimize all the databases, you could either write a script to do it or use mysqlcheck command instead.
MYSQLCHECK -o --all-databases

2.  Resize the InnoDB Tablespace (if not use innodb_file_per_table?)
  1. use mysqldump to dump all the InnoDB tables, including InnoDB tables located in MySQL database.
  2. stop the server.
  3. remove all the existing tablespace files (*.ibd), including the ibdata and ib_log files. Do not forget to remove *.ibd files for tables located in the MySQL database. 
  4. remove any .frm files for InnoDB tables.
  5. configure a new tablespace.
  6. restart the server
  7. import the dump files. 
If your databases only use the InnoDB engine, it may be simpler to dump all databases, stop the server, remove all databases and InnoDB log files, restart the server, and import the dump files.

References
  1. http://stackoverflow.com/questions/1270944/mysql-innodb-not-releasing-disk-space-after-deleting-data-rows-from-table 
  2. http://dev.mysql.com/doc/refman/5.6/en/innodb-data-log-reconfiguration.html