วันอังคารที่ 13 มิถุนายน พ.ศ. 2560

Building Software II : Schedule app commit update : functional test and comment

https://github.com/poklonas/schedule/commit/be65db79191b3cef2762a23fbee1463fe4c1d1e0

เปลี่ยนการ test ของ functional test ให้ตรงตามที่ได้แก้ไขไป เนื่องจากของเดิมจะมีการ แสดงรายชื่อผู้ใช้ทั้งหมด แต่ตอนนี้เปลี่ยนเป็นระบบ LOGIN แทนจึงจะไม่มีการ แสดงรายชื่ออีกแล้ว

https://github.com/poklonas/schedule/commit/c1637a1ae7c4ba4dbc95bcd389cd3d89ec66e4d4

ลบ การเทสบางส่วนที่ไม่จำเป็นใน unit-test และ เพิ่ม comment อธิบายฟังก์ชั่นใน view.py

วันอาทิตย์ที่ 11 มิถุนายน พ.ศ. 2560

Building Software II : Schedule app commit 11/6/2560

http://a5810164.pythonanywhere.com/schedule/
https://github.com/poklonas/schedule

--------------------------------------------------------------------------------------------------

Commit

การปรับขนาดของปุ่มยืนยัน - ประกอบด้วยส่วนที่เพิ่มเพื่อใช้ในการกำหนดขนาด และ ตำแหน่งของปุ่มยืนยันการเพิ่ม activity , yes, no และการปรับขนาดของช่อง ที่ใช้ในการแสดงบอก ผู้ใช้งานว่า กำลังจะเพิ่ม ข้อมูล activity อะไร

เตรียมการทำ ช่องสำหรับสมัคร user ใหม่ และ เปลี่ยน ข้อความแสดงด้านบน ใหม่ เป็น LOGIN  - เพิ่ม ช่อง input สำหรับ การใส่ email password และเปลี่ยนข้อความต้อนรับเป็น LOGIN
<input class="form-control" id="new_email" type="text" name="email" placeholder="user email" required>
<input class="form-control" id="new_pass" type="text" name="password" placeholder="user password" required>
ส่วนที่เพิ่มช่อง input และนอกจากนี้ยังมี การเตรียมการรับ ตัวแปรที่เป็น error massge อีกด้วย

เปลี่ยนจากการแสดงรายชื่อทั้งหมดเป็นช่อง input ไว้ให้ LOGIN ด้วยใช้ email , password  - นอกจากนี้ยังมีการเพิ่มส่วนที่ใช้ในการกำหนดว่าต้อง Login ก่อนถึงจะใช้ฟังก์ชั่นนี้ใน view ได้ซึ่งจะช่วยให้สามารถกรอง มีการ login หรือไม่ แต่ยังไม่ได้ทำงานอย่างถูกต้อง
@login_required(login_url='/')
เพิ่มส่วนนี้ขึ้นไปที่หัวฟังก์ชั่น ก็จะทำให้จำเป็นต้อง login ก่อนไม่อย่างนั้นจะทำการไปที่ ลิงค์ '/' แทน

เพิ่ม block สำหรับการสมัคร user ใหม่ จากตอนแรกไม่มี เป็นแค่ที่โล่งๆมี input ตอนนี้จะอยู่ใน block

แยกฟังก์ชั่นการสร้าง user ออกจากของเก่าที่รวมกันเงื่อนไขเพื่อแสดงผลหน้าเว็ป และสร้าง url สำหรับการสร้าง user ขึ้นมา - ปรับเปลี่ยน input type ในช่อง กรอก password จาก text เป็น password แทนเพื่อไม่ให้แสดงผลตัวอักษร สร้างฟังก์ชั่น create_user ขึ้นมาทำงานแยกกับฟังก์ชั่น home_page เพื่อเตรียมที่จะใช้ home_page post เพื่อเช็ค login แทน
url(r'^create_user$', views.create_user, name='create_user'),

เพิ่ม ให้ model user เก็บ email ได้ และเปลี่ยน input type ในช่องกรอก email จาก text > email  - ข้างล่างเป็นตัวอย่างการเปลี่ยนชนิด input และการเพิ่มให้ model เก็บค่า mail ได้
mail = models.EmailField(default="")
<input class="form-control" id="login_email" type="text" name="login_email" placeholder="user email"
required style="width:50%;height:7%">
<input class="form-control" id="login_email" type="email" name="login_email" placeholder="user email"
required style="width:50%;height:7%">

เช็คว่า user ที่ต้องการสมัครเพิ่มนั้น email ได้เคยถูกใช้มั้ยถ้าเคยจะ ส่ง error บอกและไม่ทำการสมัครใหม่ให้  - หลังจากเช็คโดยใช้ try - except โดยพยายาม จะ ดึงหาข้อมูลจาก model ที่มี email ที่ต้่องการ ถ้าไม่มีก็จะ return ด้านล่าง แต่ถ้ามัน except ก็คือมันไม่มี ก็จะเตรียมการสร้างเพิ่ม(commit นี้ยังไม่ได้ทำเพียงแต่เตรียมให้ error เวลา เจอ email ซ้ำไว้แล้ว)
return render(request, 'schedule/homepage.html', {'error_messege_new_user':"That email was alerdy used"})

เพิ่ม ระบบ login สามารถ LOGIN ได้แล้ว - โดยใช้
user = authenticate(username=user_name, password=password)
ในการ หา USER ที่ตรง
if user is not None:
ถ้าเจอ user ที่ user,pass ตรงกัน
login(request, user)
ก็ให้ login แล้ว
return redirect(reverse('schedule:user_page', kwargs={'user_id':user_pk}))
ไปที่หน้า user page ได้เลย

เพิ่มระบบ LOGOUT - เพิ่ม url logout
logout(request)
คำสั่งสำหรับ logout

เพิ่มเงื่อนไขที่ว่าหากว่า login แล้วเข้าหน้า หลัก ระบบจะทำการ ไปที่ หน้า logout
if request.user.is_authenticated:
return render(request, 'schedule/logoutpage.html')

เพิ่มส่วนที่ใช้ในการเช็คว่า ถ้าหากว่า user login แล้วเข้าไปที่หนัง userpage ของ id อื่นระบบจะเข้าไปที่หน้า logout แทน และปรับให้เมื่อ login อยู่เข้าหน้าหลักจะย้ายไปที่หน้า userpage ของตนเองแทน - เช่น
if(check_email_login(request, user.mail)):
return render(request, 'schedule/userpage.html', {'user': user})
else:
return render(request, 'schedule/logoutpage.html')

ถ้า login email != user.mail จะขึ้นหน้า logout ส่วนถ้าตรงก็ทำอะไรก็ตาม ตามเงื่อนไขฟังก์ชั่นเดิมที่ควรจะทำ เช่นแสดงผลหน้า userpage

แก้ไขคำแนะนำวิธีการใช้งาน app ให้ถูกต้อง - เปลี่ยนรูปภาพเป็นต้น


--------------------------------------------------------------------------------------------------
ภาพการใช้งานคร่าวๆล่าสุด
mail- admin@hotmail.com
pass- 123456

(เมลและพาสสำหรับผู้ต้องการทำลองโดยไม่ต้องการสร้าง user ใหม่เอง)

หน้าหลัก


ช่องสำหรับกรอกข้อมูลเพื่อสร้าง user 
(และตัวอย่างเมื่อใช้เมลที่เคยใช้ไปแล้ว)


ช่องสำหรับกรอกข้อมูลเพื่อ login
(ตัวอย่างเมื่อกรอก email หรือ password ผิด)


ตัวอย่างคำแนะนำวิธีการใช้งาน


ปุ่ม logout ที่หน้า userpage
(หาก login แล้วเข้าหน้าหลักจะเข้าหน้า userpage)


หากเปลี่ยน url ไปเป็นของ user คนอื่นจะเข้าหน้า logout ซึ่งจากภาพ คือ schedule/2 ซึ่งเรา login ที่ schedule/3 จึงเข้าหน้า logout แทน

Building Software II : Schedule app commit

https://github.com/poklonas/schedule/commit/71acf22e44de88652fae6015600db2b2a168597c

โค้ดส่วนที่มีการปรับแต่งขนาด และตำแหน่งของปุ่ม

Building Software II : GIT and Web

https://github.com/poklonas/schedule/commits/master

git - app schedule

http://a5810164.pythonanywhere.com/

homepage-app

วันพฤหัสบดีที่ 8 มิถุนายน พ.ศ. 2560

Python Data Analysis : Chapter 1 a simple application


.....................................................................................................

จากการทดสอบ หากเราต้องการ จะ สร้าง เวคเตอร์ a ที่ประกอบด้วย ลำดับของเลขที่ เกิดจาก ลำดับยกกำลัง 2 ส่วน b เป็น ยกกำลัง 3 แล้ว จาก Code ของ python ธรรมดา และ ส่วนของ numpy จะทำได้ดังนี้


def pythonsum(n):
   a = list(range(n))
   b = list(range(n))
   c = []
   for i in range(len(a)):
       a[i] = i ** 2
       b[i] = i ** 3
       c.append(a[i] + b[i])
   return c
print(pythonsum(10))
 ------------------------------------------------
 import numpy   
def numpysum(n):
  a = numpy.arange(n) ** 2
  b = numpy.arange(n) ** 3
  c = a + b
  return c
 
print(numpysum(10))

 ------------------------------------------------


จะเห็นได้ว่า numpy ไม่จำเป็นต้องใช้ loop for ในการช่วย เลย และยังสามารถ จัดการ บวกกันได้อย่างถูกต้อง ซึ่งช่วยให้เขียนง่ายขึ้นมาก
และยังช่วยให้การทำงานเร็วขึ้นอย่างมาก สามารถทำสอบได้โดยโค้ดต่อไปนี้

import sys
from datetime import datetime
import numpy as np 
def numpysum(n):
   a = np.arange(n) ** 2
   b = np.arange(n) ** 3
   c = a + b
   return c 
def pythonsum(n):
   a = list(range(n))
   b = list(range(n))
   c = []
   for i in range(len(a)):
       a[i] = i ** 2
       b[i] = i ** 3
       c.append(a[i] + b[i])
   return c 
size = int(sys.argv[1])
start = datetime.now()
c = pythonsum(size)
delta = datetime.now() - start
print("The last 2 elements of the sum", c[-2:])
print("PythonSum elapsed time in microseconds", delta.microseconds)
start = datetime.now()
c = numpysum(size)
delta = datetime.now() - start
print("The last 2 elements of the sum", c[-2:])
print("NumPySum elapsed time in microseconds", delta.microseconds)

ผลการ ทำงาน


พบว่า numpy นั้นสามารถ ดำเนินการได้เร็วกว่าเป็นอย่างมาก
แต่ ว่า อาเรย์ที่ ได้ print ออกมานั้น พบว่า ไม่มี , ซึ่งยังไม่ทราบว่าเพราะเหตุใด