11/11/2022

Swift: Sinh chuỗi ngẫu nhiên

 Trong một vài trường hợp mình cần sinh chuỗi ngẫu nhiên dài 8 kí tự, 16 kí tự chẳng hạn. Nếu như ta chấp nhận tất cả các byte trong các kí tự này thì ta sử dụng lớp UUID. Tuy nhiên nếu bài toán của chúng ta chỉ chấp nhận các kí tự alphanumeric (kí số và kí tự trong bảng chữ cái Tiếng Anh) thì chúng ta sử dụng đoạn mã sau đây (Swift 4.2+):


  func randomString(length: Int) -> String {
  let letterList = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
  return String((0..<length).map{ _ in letterList.randomElement()! })
}

24/10/2022

View SwiftUI không lấp đầy màn hình

 Có bao giờ bạn bị tình trạng như ảnh chưa?

Cái view màu trắng bên trong không lấp đầy màn hình mà phía trên và phía dưới còn hai dãy màu đen dù cho trong cấu hình bạn đã chọn "Require show full screen" rồi.
Nguyên nhân là do XCode bị cache hay bị lỗi gì đó mà XCode hiểu là bạn đang thiếu cấu hình "Launch Screen".
Tìm hiểu trên mạng thấy mọi người chỉ nhiều cách nào là thêm vào file Info.plist, nào tạo LaunchScreen.storyboard và cấu hình lại "Launch Screen". Tuy nhiên trong trường hợp của mình thì mình chỉ cần gõ chữ bất kì chỗ tên Launch Screen, save lại là vấn đề được giải quyết.


21/10/2022

Lặp lại một công việc gì đó trong 1 khoảng thời gian trong RxSwift

Trong một số tình huống chúng ta cần thử lại một công việc gì đó trong một số lần hay một khoảng thời gian nhất định. Trong RxSwift chúng ta làm điều này thế nào? Đoạn code sau đây sẽ làm lại công việc trong maxRetry lần và khoảng cách giữa hai lần thử lại là retryDelay giây

       observable.retry { errors in
            return errors.enumerated().flatMap{ (index, error) -> Observable<Int64> in
                if error is AppError {
                    let appError = error as! AppError
                    if appError.code == AppError.retryError.code {
                        return index < maxRetry ? Observable<Int64>.timer(retryDelay,
                        scheduler: MainScheduler.instance) : Observable.error(error)
                    }
                }
                return Observable.error(error)
            }
        }
    }
}

Trên đoạn code trên nếu muốn retry lại thì observable cứ quăng error là AppError.retryError thì observable được lặp lại.

20/10/2022

Tắt thanh trạng thái trong iOS

Có những ứng dụng cần tắt thanh trạng thái (status bar) đi thì ta phải làm sao?
Thêm vào file info.plist các dòng sau đây:

 <key>UIStatusBarHidden</key>
    <true/>
    <key>UIViewControllerBasedStatusBarAppearance</key>
    <false/>
 
 
Dễ không các bạn? Chúc các bạn thành công.

10/10/2022

Swift 5.7: Điểm mới trong if let (Optional Binding)

Trong phiên bản 5.6 trở về trước thì các câu lệnh sau đây sẽ báo lỗi:

func printName() {
let name:String?="Folami"
if let name {
print(name)
}
}

Mà code đúng phải là:

func printName() {
let name:String?="Folami"
if let name = name {
print(name)
}
}

Trong Swift 5.7 thì các bác cứ thoải mái dùng cú pháp như trong đoạn code đầu tiên nha. Cách ghi này gọi là dạng viết tắt của Optional Binding Tuy nhiên có một giới hạn là chúng ta không thể truy xuất đến property của một đối tượng. Điều này có nghĩa là cách viết tắt của Optional Binding không hỗ trợ Optional Chaining. Như vậy đoạn code sau sẽ báo lỗi khi biên dịch:

class Person {
 var name:String?
 init(name:String){
  self.name = name
 }
}
func printName() {
let name:String?="Folami"
if let name {
print(name)
}
}
let author = Person(name:"Folami")
if let name = author.name {
 print(name)
}
if let author.name {
//Se bao loi dong phia tren
print(author.name)
}

24/09/2022

Chuyển vòng lặp for từ Object-C sang Swift

 Hôm qua gặp một cái bug khá vui. Mình và bạn khác nữa làm dự án Port code cũ Object-C sang Swift. Bạn này sau khi kết thúc giai đoạn coding thì rời dự án và mình tiếp tục test và fix bug. Mình chạy test case trên code cũ và code mới thấy kết quả khác nhau. Mình review từng dòng code thấy không có vấn đề gì (tuy cả ngàn LOC nha). Cái mình nghi ngờ nhất là hai vòng for lồng nhau mình chèn code xuất log và phát hiện chính xác nguyên nhân là do cách port vòng for.

Trong Object-C vòng for sau đây:


for (int i = 1; i <= 10; i++)
{
    //do something
}

được chuyển sang Swift như sau:

for i in 1..<11 {
//do something
}
và vấn đề phát sinh khi trong thân của vòng lặp chúng ta thay đổi biến đếm i. Ở phiến bản Object-C thì mỗi lần quay lại vòng lặp biến i được tăng thêm 1 và so sánh 10 xem i đã vượt quá 10 chưa nếu chưa thì tiếp tục thực hiện các câu lệnh bên trong vòng lặp. Ở phiên bản Swift thì 1..<11 là một iterable (xem thêm về IteratorProtocol) nên khi mỗi lần vòng lặp quay lại thì i=iterable.next() và giá trị của i bên trong vòng lặp đã bị ghi đè, huỷ bỏ. Kết quả hai phiên bản chạy hoàn toàn khác nhau.

Trong trường hợp này trong Swift nên dùng vòng lặp while thay cho vòng lặp for.

19/06/2022

Bài 5, Đề Toán Tuyển sinh lớp 10 (Hà Nội), năm 2022

 Đề bài:

Với các số thực không âm x và y thoả mãn $x^2+y^2=4$, tìm giá trị nhỏ nhất của biểu thức $P=x+2y$

Bài giải:

Ta có:

$4=x^2+y^2=(x+y)^2-2xy \le (x+y)^2$

$\Rightarrow x+y \ge 2$

$\Rightarrow P = x+2y \ge 2+y \ge 2$

$\Rightarrow Min(P) =2$

Dấu "=" xảy ra khi $-2xy = 0 \land y =0 \Rightarrow y =0 \Rightarrow x=2$

Vậy $Min(P)=2$ khi $x=2 \land y=0$

Ta cũng có thể tìm $Max(P)$

Áp dụng bất đẳng thức Bunhiacopxski cho hai bộ số (1,2) và (x,y) ta có:

$(1.x+2.y)^2 \le (1^2+2^2)(x^2+y^2)=5.4=20$

$\Rightarrow P =x+2y \le 2\sqrt{5}$

Vậy $Max(P)=2\sqrt{5}$

Dấu "=" xảy ra khi và chỉ khi $\frac{1}{x}=\frac{2}{y} \iff y=2x=\frac{4\sqrt{5}}{5}$


13/06/2022

Những tuồng cải lương có sự góp mặt của Thanh Sang

Tên Tuồng Tên Tác giả Tên vai diễn
Anh hùng xạ điêu Hà Triều, Hoa Phượng Quách Tĩnh
Bên cầu dệt lụa Thế Châu Trần Minh
Bà chúa đồi trà &Quy Sắc Anh Quyên
Bạch Viên Tôn Các Thế Châu Tôn Các
Bây giờ em ở đâu Ngọc Linh, Minh Ngọc, Văn Đức Duy
Bên dòng sông Trẹm Vân Hà Triệu Vỹ
Bến nước tình yêu   Hiếu
Bóng tối và ánh sáng Ngọc Linh, Hoa Phượng Vĩnh
Ca dao em và tôi Huỳnh Thanh Tuấn Ông Thoại
Chung Vô Diệm Thế Châu Tề Tuyên Vương
Chuyện hai quả cân Vương Kinh Thành Minh
Chuyện tình An Lộc Sơn Thế Châu Triệu Quân Tường
Con cò trắng Thu An Lộc
Cô gái bán sầu riêng Viễn Châu Hoàng
Cô gái Đồ Long Hà Triều, Hoa Phượng Kim Mao sư vương Tạ Tốn
Cuốn theo chiều gió Nguyên Thảo Lão Tam
Dấu chân cỏ dại Nguyễn Thị Khánh An Hoàng Thọ
Dưới cội bồ đề Quy Sắc Sơn
Đãi yến Đoàn Hồng Ngọc Bạch Mai Địch Luông
Đêm lạnh chùa hoang Yên Lang Bạch Long Sứ
Đêm vĩnh biệt Hà Triều, Hoa Phượng Nhân
Điên vì yêu Trang Châu Nở Thi
Đời cô Hạnh Ngọc Điệp Ba Của Hạnh
Đời cô Lựu Trần Hữu Trang Võ Minh Thành
Đôi mắt người xưa Ngọc Linh, Kiều Vân Bác sĩ Vũ
Đôi tay vàng Huỳnh Minh Nhị Mạnh Khang
Đường gươm Nguyên Bá Hoa Phượng Vua
Đường lên xứ Thái Mộc Linh Minh Trung
Dương Quý Phi Nhị Kiều Đường Huyền Tông
Gánh cỏ sông hàn Thu An Lê Nhu
Gió giao mùa Huỳnh Anh, Yên Hà Ô Mã Nhi
Hai chiếc ngai vàng Viễn Châu Vua
Hành khất đại hiệp
(Ru em vào mộng)
Loan Thảo Lão hành khất
Hắc Sa thôn huyết hận Yên Hà, Ngọc Điệp Lý Nhị Lang
Hoa chùm gởi Trần Hà Bác sĩ Hoàng
Hoa đồng cỏ nội Nhị Kiều, Phương Ngọc Phúc
Hoa Mộc Lan tùng chinh Viễn Châu Lý Quảng
Hoả Sơn Thần nữ Yên Lang Vũ Đạt Trung
Hoàng hậu không đầu Bạch Mai Lâm Quốc Hùng
Hoàng hôn màu nước mắt Lam Tuyền Đảo
Khi rừng mới sang thu Quy Sắc Tạ Tử Lăng
Kiếm sĩ dơi Yên Trang, Mai Bình Tân Cương
Kiếp nào có yêu nhau Nguyên Thảo, Hạnh Trung Lý Trọng Phu
Kiếp phong trần Vũ Chí Thanh Thạch
Kiều Phong – A Tỷ   Du Thản Chi
Lá sầu riêng Hoàng Dũng, Hà Triều Út Bửu
Lá trầu xanh Viễn Châu Dũng
Lan và Điệp Loan Thảo Nhà sư
Lấy chồng xứ lạ Ngọc Điệp Tâm
Lỡ bước sang ngang Thu An, Hoàng Khâm Ninh
Lục Vân Tiên - Kiều Nguyệt Nga Nhà hát Trần Hữu Trang, Ngọc Cung Lục Vân Tiên
Một chiều biệt ly
(Thần thủ phi tiêu)
Lưỡng Nghi, Trúc Chi Hồng Bá Lương
Một kiếp phong trần Lam Tuyền Tư Thạch
Mùa xuân ngủ trong đêm Nguyên Thảo, Vân Hà Hàn Phong Trần
Mưa ngâu đã dứt Nguyễn Thành Châu Ngưu Lang
Mưa rừng Hà Triều, Hoa Phượng Khanh
Mỵ Châu Trọng Thủy Lộng Chương, Minh Quân, Đào Việt Anh An Dương Vương
Nàng chết trên quê hương tôi Trung Nguyên Chế Bồng Nga
Nắng sớm mưa chiều Nhị Kiều, Ngọc Linh Thiện
Người gọi đò bên sông Yên Lang, Mộc Linh Nhật lão quan
Người phu khiêng kiệu cưới Nguyên Thảo, Yên Lang Xuyên Đảo Băng Hồ
Người tình Huỳnh Thanh Tuấn Ông Thìn
Ngưu Lang Chức Nữ Kiên Giang Ngưu Lang
Nhân quả
(Chuyện hai quả cân)
Dương Kim Thành Minh
Nữ hoàng về đêm Hoàng Khâm Ông Bầu Địa
Nửa đời hương phấn Hà Triều, Hoa Phượng Cang
Nước biển mưa nguồn Nguyễn Thành Châu Bác sĩ Tuấn
Oan tình nơi am tự Đức Hiền Đạo Ngộ
Phạm Công Cúc Hoa Thanh Tòng Phạm Công
Sân khấu về khuya Năm Châu Lĩnh Nam
Sau ngày cưới Lê Duy Hạnh Trung uý Thành
Sở Vân Nhị Kiều, Thế Châu Lý Quảng
Sương mù trên non cao Nhị Kiều, Thế Châu Hoa Phượng, Hà Triều
Tấm lòng của biển Hà Triều, Hoa Phượng Tấn
Tần Nương Thất
(Nổi buồn con gái)
Hà Triều, Hoa Phượng Đảnh
Tây Lương nữ quốc Bạch Mai Đường Tăng
Thái hậu Dương Vân Nga Hoa Phượng, Chi Lăng, Hoàng Việt, Thể Hà Vân Lê Hoàn
Thuyền ra cửa biển Phong Anh, Yên Trang Diệp Chấn Phong
Thương nhớ một mình Nhị Kiều Chương
Tiếng chuông Thiên Mụ Bạch Diệp, Minh Nguyên Lâm Hoàng
Tiếng hạc trong trăng Loan Thảo, Yên Ba Tô Điền
Tiếng trống Mê Linh Việt Dung, Vĩnh Điền, Nhóm Thanh Minh Thi Sách
Tô Hiến Thành xử án Bùi Trọng Nghĩa Tô Hiến Thành
Trăng nước Lạc Dương thành Nhị Kiều Vũ Bình Phương
Trăng thượng tuần sắp lặn Hà Triều, Hoa Phượng Bình Lương
Tuyết phủ chiều đông Bạch Yến Lan Đông Nhật
Tuyệt tình ca Hoa Phượng, Ngọc Điệp Lê Long Hồ
Vườn hạnh sau chùa Kiên Giang, Hoa Phượng Tiêu Hoá Long

Tiếp tục cập nhật khi nào mình biết thêm thông tin. Các bạn thấy thiếu thông tin vui lòng comment bên dưới. Xin cám ơn.

07/05/2022

Hình học 7-Dạng 1-Bài 2 (Ôn tập thi HK2 2021-2022)

Cho $\triangle ABC$ cân tại B có $\widehat{BAC}=53^o$, BN là tia phân giác của góc B.
a) Tính số đo của góc ABC
b) Chứng minhg: $\triangle BAN = \triangle BCN$
c) Kẻ $AE \perp BC$ ($E\in BC$), $CI \perp AB$ ($I \in AB$). Chứng minh: $\triangle CEA = \triangle AIC$
d) Chứng minh: $AC // IE$
e) Gọi S là giao điểm của AE và CI. Chứng minh: B,S,N thẳng hàng
Bài giải:

a) Tính số đo góc ABC:
Do $\triangle ABC$ cân tại B nên: $\widehat{BCA}=\widehat{BAC}=53^o$
Ta có:$\widehat{ABC}+\widehat{BCA}+\widehat{BAC} = 180^o$
$⇔ \widehat{ABC} + 53^o+53^o=180^o$
$⇔ \widehat{ABC} + 106^o=180^o$
$⇔ \widehat{ABC} = 180^o - 106^o$
$⇔ \widehat{ABC} = 74^o$
Vậy $\widehat{ABC} = 74^o$
b) Chứng minhg: $\triangle BAN = \triangle BCN$
Ta có: $\begin{cases} BA = BC \text{ (} \triangle ABC \text{ cân tại B)}\\ BN \text{ cạnh chung}\\ \widehat{ABN}=\widehat{CBN} \text{( BN là tia phân giác)} \end{cases}$
$\Rightarrow \triangle BAN = \triangle BCN$ (c-g-c)
c) Chứng minh: $\triangle CEA = \triangle AIC$
Xét hai tam giác vuông CEA và AIC:
$\begin{cases} \text{Cạnh huyền } AC \text{ chung}\\ \widehat{ECA}=\widehat{IAC} \text{ (} \triangle ABC \text{ cân tại B)} \end{cases}$
$\Rightarrow \triangle CEA = \triangle AIC$ (cạnh huyền-góc nhọn)
d) Chứng minh: $AC // IE$
Từ $\triangle CEA = \triangle AIC$
$\Rightarrow CE = AI$
$\Rightarrow BE = BI$
$\Rightarrow \triangle BEI$ cân tại B
$\Rightarrow \widehat{BEI} = \widehat{BCA} = \frac{180^o-\widehat{EBI}}{2}$ (ở vị trí đồng vị)
$\Rightarrow AC //IE$
e) Chứng minh B,S,N thẳng hàng
Xét $\triangle ABC$: $\begin{cases} CI \perp AB\\ AE \perp BC\\ S = CE \cap CI \end{cases}$
$\Rightarrow S$ là trực tâm của $\triangle ABC$
Ngoài ra $\triangle ABC$ cân tại B nên đường phân giác BN cũng là đường cao
$\Rightarrow S \in BN$
hay B,S,N thẳng hàng

04/05/2022

Hình học 7-Dạng 1-Bài 1 (Ôn tập thi HK2 2021-2022)

Đề: Cho $\triangle CEF$ cân tại C, tia phân giác của góc C cắt EF tại M.
a. Chứng minh: $\triangle CME = \triangle CMF$
b. Chứng minh: M là trung điểm của EF
c. Kẻ $MH \perp CE$ tại H, $MK \perp CF$ tại K. Chứng minh: $CH = CK$.
d. Chứng minh: $HK // EF$.
e. Từ F vẽ đường thẳng vuông góc với đường thẳng HM, cắt HM tại O. Chứng minh $\triangle MKO$ cân.
Bài giải:

a. Chứng minh: $\triangle CME = \triangle CMF$
$\begin{cases} CE = CF \text{ (do } \triangle CEF \text{ cân tại C)}\\ \widehat{ECM} = \widehat{FCM} \text{ (do CM là tia phân giác)}\\ CM \text{ chung} \end{cases}$
$\Rightarrow \triangle CME = \triangle CMF$ (c-g-c) (đpcm)
b.Chứng minh: M là trung điểm của EF
Do $\triangle CME = \triangle CMF$ (chứng minh câu a)
nên $ME = MF$
$\Rightarrow M$ là trung điểm của EF (đpcm)
c.Chứng minh: $CH = CK$.
Xét hai tam giác vuông CHM và CKM.
Ta có: $\begin{cases} \widehat{HCM} = \widehat{KCM} \text{ (do CM là tia phân giác)}\\ CM \text{ chung} \end{cases}$
$\Rightarrow \triangle CHM = \triangle CKM$ (cạnh huyền-góc nhọn)
$\Rightarrow CH = CK$
d. Chứng minh $HK // EF$
$\triangle CEF$ cân tại C, $CM$ là phân giác $\Rightarrow CM$ cũng là đường cao $\Rightarrow CM \perp EF$
$CH = CK \Rightarrow \triangle CHK$ cân tại C $\Rightarrow CM$ cũng là đường cao $\Rightarrow CM \perp HK$
Suy ra $HK // EF$ (đpcm)
e. Chứng minh $\triangle MKO$ cân:
Xét hai tam giác vuông HME và OMF
Ta có:
$\begin{cases} ME = MF \text{ (chứng minh ở câu b)}\\ \widehat{EMH} = \widehat{FMO} \text{ (đối đỉnh)} \end{cases}$
$\Rightarrow \triangle HME = \triangle OMF$
$\Rightarrow MH = MO$(1)
Mà: $ \triangle CHM = \triangle CKM$ (chứng minh ở câu c)
$\Rightarrow MH = MK$(2)
Từ (1) và (2) ta có: $MK = MO \Rightarrow \triangle MKO$ cân tại M (đpcm)