วันจันทร์ที่ 25 สิงหาคม พ.ศ. 2557

[iOS dev tutorial] มาเริ่มเขียนภาษา Swift กัน : ตอนหนึ่ง แนะนำตัวน้อง Swiftการแสดงผล และตัวแปร

ในส่วนนี้เจ้าของบล็อกออกตัวเลยว่า สนใจภาษานี้ แต่ไม่เคยเขียน Objective-C ถึงแม้จะก็อปเนื้อหาทั้งหมดใน iTune U แต่ก็ยังไม่มีเวลาอ่านและดูวิดีโอการสอนซะที มาตอนนี้มี Swift ที่เข้าใจง่ายกว่า Objective-C ด้วย เลยอยากศึกษา แล้วเอามาใช้บ้าง เนื่องจากความที่เป็น iOS development ในไทยค่อนข้างน้อยด้วย อยากเขียน mobile programming ได้ทุก iOS ด้วย เลยมาศึกษาภาษาใหม่นี้คะ



เมื่อวันที่ 3 มิถุนายน 2557 ทาง apple ได้เปิดตัวภาษา Swift อย่างเป็นทางการแล้ว ซึ่งจะรองรับฟีเจอร์ของภาษาโปรแกรมยุคใหม่ ซึ่งจะมาแทนที่ Objective-C ในไม่ช้า เนื่องจากมีประสิทธิภาพดีกว่า Objective-C ในทุกๆด้าน (เพื่อนเราที่เป็น iOS ยังบอกเลยว่า Objective-C กำลังจะตาย) โดยสามารถทำงานร่วมกับ Cocoa และ Objective-C ด้วย (ซึ่งใน iBook มีให้โหลดแล้วเช่นกัน ความหนาประมาณร้อยหน้ากว่าๆ)

 

สามารถโหลด The Swift Programming Language ได้ทาง iBook เพื่อนำไปศึกษาได้เลยจ้า มี update มาให้อย่างสมํ่าเสมอเลย ความหนาประมาณ 700 หน้ากว่าๆ ทาง apple ได้มีหน้าหลักของภาษา Swift ไว้ให้ developer ได้ศึกษากันด้วย (สำหรับคนที่ไม่มีอุปกรณ์ iOS หรือสะดวกอ่านในคอมมากกว่า เข้าไปที่หน้าเว็บได้เลยคะ เนื้อหาเดียวกันเลย) และมีหน้าเว็บหลักของภาษานี้ด้วยนะ

วันนี้เราอ่านภาษา Swift แล้ว 1 หน้านะคะ #ผิด
ภาษา Swift เป็นภาษาใหม่สำหรับการเขียน application ลง iOS และ OS X apple ได้มีการพัฒนามาในช่วงปี 2010 (หรือเมื่อ 4 ปีที่แล้ว) ข้อดีของ Swift คือ
- ง่าย : สั้น เข้าใจง่าย
- เร็ว : รันโค้ดหลายล้านบรรทัดในเวลาไม่กี่วินาที สามารถทำงานซับซ้อนได้
- ยืดหยุ่น : ใช้ได้ในทุกๆแขนง ทั้งด้านธุรกิจ วิศวกรรม วิทยาศาสตร์
- เป็น parallel programming : สามารถรันหลายๆโปรแกรมพร้อมกันได้
- ใหม่กว่า Objective-C
- safety กว่าในเรื่อง type, การเข้าถึง pointer และการจัดการ memory
ความเห็นส่วนตัวของเราต่อภาษานี้ หน้าตาจะคล้ายๆ JavaScript และ Python หน่อยๆนะ

มาดูเรื่อง syntax ของภาษานี้กันบ้าง

คำสั่งแรกที่เรียนมาเป็นพื้นฐาน คือ การแสดงผลออกหน้าจอ โดยการ print คือ

  • println("Hello, world!")

ไม่ต้องสร้าง function หรือ import อะไรเลย เหมือน python
หน้าตาคำสั่งคล้ายๆ System.out.println() ของ Java ซึ่งภาษานั้นกว่าจะ print ได้ ต้อง import library และสร้าง class หลักก่อน ซึ่งยุ่งยากน่าดูในช่วงแรก55 (สามารถดูการ print ของภาษาอื่นๆได้ที่นี่คะ)

การกำหนดตัวแปร ใช้ let สำหรับ constant ค่าคงที่ และใช้ var สำหรับ variable ตัวแปร เช่น

let pi = 3.14 //constant
var radius = 4 //variable

และตัว constant เราสามารถเปลี่ยนค่าได้ตามต้องการอยู่แล้ว

var radius = 6 //variable

ถ้าเราจะระบุ type ของตัวแปร เราใส่ : ไว้หลังชื่อตัวแปร เช่น

var radius:float = 4 //variable

เริ่มจะเห็นความง่ายอีกอย่างแล้ว คือ ไม่ใส่ ; เหมือนพี่เหลือมเลย
เราสามารถแปลง type ของตัวแปรได้ด้วย และการนำ String มาต่อกัน ใส่ + ไปได้เลยเหมือนของ python และ Java

  • let label = "The width is "
  • let width = 94
  • let widthLabel = label + String(width)

การ print ค่า variable หรือ constant ในภาษา C เราจะใช้ %<type_var> แล้วกำกับด้วยชื่อตัวแปรด้านหลัง หรือใน python จะใส่ชื่อของค่านั้นลงไปเลย แล้วใส่ + เพื่อต่อกับ String ใน Swift จะมี syntax ที่แปลกต่างชาวบ้าน คือ ใช้ \(<var_name>) เช่น

  • let print_circum = "This cycle have radius \(radius) cm. and circumference is \(r2*pi*radius)."

การสร้าง array และ dictionary ใช้ [] เหมือนภาษาอื่นๆ โดย array สร้างและเรียกใช้เหมือนในภาษาอื่นๆ และ dictionary หลักการจะเหมือนใน python

  • var shoppingList = ["catfish", "water", "tulips", "blue paint"] //array building
  • shoppingList[1] = "bottle of water"

  • var occupations = [
  • "Malcolm": "Captain",
  • "Kaylee": "Mechanic",
  • ] //dictionary building
  • occupations["Jayne"] = "Public Relations" //input new value

การสร้าง array และ dictionary เปล่า ทำได้โดยไม่ต้องใส่อะไรเลยใน [] ดังนี้

var shoppingList = []
var occupations = [:]

และสร้างตัวแปรเปล่าที่เรากำหนด type ของตัวแปรได้ด้วย

  • let emptyArray = [String]()
  • let emptyDictionary = [String: Float]()

ตอนนี้ทุกๆท่านก็ได้ความรู้เบื้องต้นของภาษา Swift แล้วนะคะ ไม่ยากเลยเนอะ
ตอนต่อไปของ Swift จะเป็นเรื่องที่ซับซ้อนขึ้น คือ เรื่อง loop, condition, function และ class คะ

ป้ายกำกับ: ,

วันศุกร์ที่ 15 สิงหาคม พ.ศ. 2557

ep7 python : การแตกไฟล์ .zip ด้วยพี่เหลือม (extract .zip file by coding python)

พอดีมีงานที่ต้องเขียนโค้ด โดยให้แตก .zip ออกมา โดยไม่ต้องให้ user ทำอะไรเลย แต่ user ไม่สามารถเห็นโค้ดเราได้ (และมีรายละเอียดอื่นอีก ไม่บอกแล้วกันเนอะ) เราคิดว่าพี่เหลือม ทำ .exe file ได้ เลยมาลองกับพี่เหลือมเลยคะ พี่เหลือมมี library ที่จัดการ .zip file ด้วย และมี library มากมายให้เลือกใช้

โจทย์ในประเด็นนี้คือ มี .zip อันนึง โครงสร้างภายในมี folder ชื่อเดียวกับไฟล์ แล้วค่อยเจอไส้ใน ดังนี้

ไส้ในควรมีมากกว่า 1 ไฟล์ เพื่อความชัวร์คะ
แล้วเราถามกู๋ ลองทำตามโค้ดในเว็บนึง ดังนี้

import os, zipfile

def unzip(path, zip):
  isdir = os.path.isdir
  join = os.path.join
  norm = os.path.normpath
  split = os.path.split

  for each in zip.namelist():
    if not each.endswith('/'):
    root, name = split(each)
    directory = norm(join(path, root))
    if not isdir(directory):
      os.makedirs(directory)
      file(join(directory, name), 'wb').write(zip.read(each))
if __name__ == '__main__':
  zip = zipfile.ZipFile('Python.zip', 'r')
  unzip('', zip)
  zip.close()

อธิบายเพิ่มเติม
- zip.namelist() ดูว่าใน zip file ของเรานั้น ไส้ในมีไฟล์อะไรบ้าง
- os.makedirs(directory) สร้าง directory มีอีกตัวคือ os.mkdir(directory, 0777) ตัวเลขคือ mode ของเขา ใส่อะไรไปก็ได้ ค่ามาตรฐานของเขาคือ 0777
- ตัว zip จะมีการเรียกไฟล์โดยใช้ zipfile.ZipFile('ชื่อไฟล์', 'โหมดการอ่าน') โดยมี file permission 3 ตัว คือ 'r' read, 'w' write และ 'a' execute โดยการยัดไฟล์เข้า zip ใช้คำสั่ง zip.write('ไฟล์ที่เราต้องการใส่') เมื่อเปิดแล้ว จะมีการปิด คือ zip.close()
- ในตัวอย่าง มีการ split โดยใช้ library ของ os เป็นอีกวิธีนอกจากใช้ library ของ string ซึ่งจะมีตัวอย่างในโค้ดอันหลังคะ ให้ผลเหมือนกัน
- join (os.path.join)เป็นการรวม 2 string เข้าด้วยกัน โดยมี "\\" คั่นระหว่าง 2 string นั้น เช่น
>>> join("test", "test33")
'test\\test33'
ส่วน norn (os.path.normpath) อันนี้เป็นการ link path directory ตามความเข้าใจของเรานะ
ในเว็บพี่เหลือมมีการอธิบาย library os ลองอ่านดูเพื่อความเข้าใจมากขึ้น 

ปรากฏว่า extract ได้แค่ไฟล์แรกในนั้น โค้ดเหมือนจะถูกหมด เลยลองถูกลองผิดกันไป
เปลี่ยนโค้ดไปเรื่อยๆ พบว่า ติดปัญหาที่ folder ชื่อไฟล์ที่สร้างขึ้นเอง มีปัญหา Permission denied
เลยลองตรวจดูว่า  folder ชื่อไฟล์ที่เราสร้างนั้น มันมีอยู่หรือเปล่า ไม่มีก็ให้สร้าง จะได้ไม่มีปัญหา

สุดท้าย ออกเลย

import sys
import string
import zipfile
inport os

#ขอยก unzip มาแก้อันเดียวนะคะ
def unzip(path, zip):
  isdir = os.path.isdir
  join = os.path.join
  norm = os.path.normpath
  split = os.path.split

  for each in zip.namelist():
    root, name = string.split(each,"/") //แยกส่วนคือ ส่วน path file กับชื่อไฟล์
    if len(name) == 0: //แยกโฟลเดอร์ด้านนอกออก
      continue
    else:
      directory = norm(join(path, root)) # result is .zip name, str type
        #ดูว่า มี directory นี้ไหม มีโค้ด 2 บรรทัดเองเนอะ
        if not os.path.exists(directory): #check folder exist
          os.makedirs(directory) #build folder
        #ส่วนที่ comment เป็นส่วนที่ผิดนะคะ อธิบายแต่ละบรรทัดเลย
        #b = open("D:\\mikki/work/python_zip/"+i, 'wb') #อันนี้ยัด path เข้าไปตรงๆเลย
        #b = open(directory + name, 'wb') #all files are changed file name and extract all outside (เปลี่ยนชื่อไฟล์ทั้งหมดเป็น directory และ extract ออกมาข้างนอก)
        #b = open(name, 'wb') #all files extract outside (extract ออกมาข้างนอก)
        #b = open(join(directory, name), 'wb') #have directory and extract 1 file from all (directory มาแล้ว แต่ไส้ในออกมาอันเดียวเองง่ะ)
        #b = open(each, 'wb') #have directory and extract 1 file from all เหมือนกับด้านบน
        #b = open(directory, 'wb') #no directory
        b = open(directory + '\\' + name, 'wb')
        b.write(zip.read(each))
        b.close()

ตอนนี้ก็ได้ตาม requirement เรียบร้อย ในขั้นแรก

ถ้าเราใส่ password แล้วต้องการให้ใช้โปรแกรมนี้ extract ออก ใช้คำสั่ง
zip.setpassword(<password>) ก่อน for loop นะ

การทำงาน function คือ unzip(<path>, <zip_file>)
ถ้าอยากแตกไฟล์ที่อื่น ใส่ directory ที่ต้องการ ไว้ที่ <path>
ถ้าต้องการแตกไฟล์ที่เดียวกับ zip file ให้ใส่ '' ตามตัวอย่างเลยคะ :)
>> https://github.com/mikkipastel/pythonZipAttach

ป้ายกำกับ: ,