Tumgik
ngoclt · 5 years
Text
CHIA SẺ KINH NGHIỆM TÌM VIỆC IT Ở PHẦN LAN - Part 2
Sau bài viết thứ nhất, mình chưa quyết định viết ngay phần hai vì mình muốn dành một vài ngày để đọc kỹ lại rồi chỉnh sửa câu cú ngữ pháp và để đảm bảo rằng mình đã chia sẻ hết tất cả nội dung mình mong muốn cho các bước (cơ bản) ban đầu trên hành trình tìm việc ở Phần Lan. Nếu bạn chưa đọc nó, bạn có thể ngó qua ở đây.
Như có nói ở phần một, kinh nghiệm làm việc thực tế là một trong những yếu tố quyết định giúp bạn pass CV scanning. Với các bạn sinh viên mới ra trường, các bạn có thể bù đắp các yêu cầu kinh nghiệm làm việc thực tế này bằng cách tham gia các project ở trường, Demola, hay các side projects của chính bạn. Hầu hết các công ty vẫn đều rất xem trọng các kinh nghiệm thực tiễn này và xem nó là một trong những yếu tố quyết định họ có nên tiếp tục process với bạn hay không.
Vậy sau khi họ quyết định tiếp tục process với bạn thì các bước/vòng đó sẽ được thực hiện như thế nào, nội dung các vòng phỏng vấn đó là gì, mình nên chuẩn bị như thế nào cho tốt,… Các câu hỏi trên mình sẽ cố gắng chia sẻ hết dựa theo kinh nghiệm của bản thân. Và một lần nữa, mình xin nhắc lại, tất cả các chia sẻ này chỉ dựa vào kinh nghiệm và quan điểm của cá nhân mình, nó không hoàn toàn đúng, do đó bạn chỉ nên dùng nó như một sự tham khảo.
1. Phone / F2F scanning interview:
Chắc nhiều bạn sẽ thắc mắc tại sao lại có scanning interview sau khi đã scanning CV. Thực ra vòng này chỉ có ở một số công ty lớn có nhiều ứng viên ứng tuyển hoặc muốn chắc chắn rằng ứng viên thực sự match với yêu cầu của họ.
Vòng phỏng vấn này thường được thực hiện qua điện thoại cùng với HR, thời gian dao động từ 15 phút – 1 tiếng. Nội dung bao gồm:
Đầu tiên họ sẽ giới thiệu sơ về công ty, về vị trí bạn đang ứng tuyển, về các benefit mà công ty offer,…
Tiếp theo, họ sẽ yêu cầu bạn giới thiệu sơ về bản thân bạn. Câu hỏi này thường rất chung chung, nhưng thực sự, cái mà họ quan tâm chỉ những thông tin liên quan tới vị trí họ đang cần tuyển. Ví dụ, để tuyển cho vị trí web developer, và công ty yêu cầu biết ReactJS / Webpack… Họ sẽ quan tâm tới các kiến thức bạn có, các kinh nghiệm liên quan, các dự án bạn đã làm, ở công ty nào, và vai trò của bạn là gì. Thường bạn chỉ nên đưa ra các thông tin cơ bản nhất, không nên quá chi tiết và dài dòng. Nếu họ quan tâm họ sẽ hỏi thêm.
Từ những thông tin bạn chia sẻ, cùng với các yêu cầu tuyển dụng. Họ sẽ có thêm một vài câu hỏi và trao đổi với bạn.
Qua vòng phỏng vấn này, một lần nữa, HR sẽ kiểm tra và xác định thêm một lần nữa, bạn match với yêu cầu của họ.
2. Introductory interview
Vòng phỏng vấn này, thường họ sẽ mời bạn tới office của công ty để thực hiện. Thời gian thường hơn từ 1–2 tiếng. Mục đích của vòng phòng vấn này chủ yếu là giới thiệu về công ty, vị trí tuyển dụng cũng như tìm hiểu kỹ hơn về kinh nghiệm làm việc tổng quát.
Sau khi giới thiệu về bản thân và kinh nghiệm làm việc, bạn sẽ được hỏi về các công nghệ, các kỹ năng mà công ty yêu cầu:
Bạn đã làm việc với công nghệ này chưa? Những dự án nào? Vai trò của bạn trong dự án đó là gì? Với câu hỏi này bạn nên trả lời đúng trọng tâm của câu hỏi, có hoặc không, có thì kể ra một số dự án, mô tả sơ về dự án, vai trò của bạn trong dự án đó. Nếu không có kinh nghiệm làm việc với nó thì bạn có biết về công nghệ đó không? Biết ở mức độ nào? Bạn tự tin bao nhiêu phần trăm là mình có thể làm việc với nó… Trả lời một cách rõ ràng ngắn gọn, đừng dài dòng, và tìm cách trả lời một cách gợi mở để hướng người phỏng vấn hỏi những câu mà mình mong muốn họ hỏi mình. Với cách này bạn có thể dẫn dắt cuộc phỏng vấn theo ý bạn và có cơ hội thể hiện bản thân nhiều hơn.
Bạn thích làm việc một mình hay làm việc với team hơn? Bạn có phải là một team player không?   Đây cũng là một câu hỏi mình thường gặp khi đi phỏng vấn. Thật lòng, mình không biết họ mong chờ và đánh giá một câu trả lời tốt như thế nào. Tuy nhiên, theo mình nghĩ, với câu hỏi này, mình nên trả lời sao cho thể hiện được 2 điểm sau. Thứ 1, khả năng làm việc độc lập của mình, không phụ thuộc, hay cần quá nhiều mentorship,… Thứ 2, mình cũng phải là một team player, có thể làm việc tốt với người khác như thế nào, khả năng làm việc nhóm của mình ra sao,…
Agile practices & working methodologies (Scrum / Kanban / XP) Mỗi công ty có 1 process, một phương pháp làm việc khác nhau, vậy nên các công ty sẽ có thể hỏi hoặc không các kinh nghiệm hay kiến thức liên quan tới Agile/Scrum. Tuy nhiên, 90% công ty mình đã từng tham gia phỏng vấn, họ đều hỏi các câu hỏi liên quan tới Agile (Scrum/Kanban). Nếu bạn không có kiến thức hay kinh nghiệm về Agile bạn có thể tìm đọc thêm.
Một số câu hỏi khác bạn có thể tham khảo ở đây hay hỏi thêm bác Google.
3. Technical Interviews
Vì bản thân mình làm Software Developer nên phần này chỉ có thể chia sẻ các kinh nghiệm phỏng vấn dành riêng cho Software Developer. Nếu bạn theo một hướng khác, bạn có thể đọc tham khảo nhưng mình không chắc nó sẽ giúp ích được nhiều cho bạn.
Như nói ở trên, mỗi công ty có 1 quy trình tuyển dụng riêng nên cách thức phỏng vấn, đánh giá cũng có nhiều điểm khác nhau. Sau đây là một vài technical interviews mà mình đã tham gia.
a, Whiteboard / Paper coding challenge:
Bạn sẽ được cho 1 vài bài tập (challenges) và họ sẽ yêu cầu bạn viết code trên bảng hoặc giấy để giải quyết bài tập đó. Mục đích của việc này không phải để kiểm tra kỹ năng code mà là khả năng problem solving và communication của bạn:
Cách bạn tiếp cận vấn đề.
Cách bạn giải quyết vấn đề.
Cách bạn trình bày / giao tiếp / giải thích vấn đề và hướng giải quyết với người khác.
Kinh nghiệm của bạn thân mình cho vòng phỏng vấn này đó là:
Xác định vấn đề là gì? Thường interviewer sẽ cho giải thích cái problem là gì, cùng với đó là một vài samples (các bộ input và output). Từ đó mình sẽ có thể xác định được vấn đề cần giải quyết.
Tìm hướng giải quyết? Việc đầu tiên cần nhớ trước khi bắt đầu đó là, đừng mất quá nhiều thời gian để tìm ra phương án hoàn hảo. Vì c�� thể, khi thời gian đã hết, bạn vẫn không thể viết ra được dòng code nào. (Điều này tương tự với khi bạn làm việc, khi mà deadline đang dí thì bạn sẽ không bao giờ có đủ thời gian để viết code tối ưu hay hoàn hảo). Hãy bắt đầu với từng sample, và viết code để từ input này ra được đúng output mong muốn. Ví dụ: - Step 1: Từ input1 để ra được output1 mình viết ra function A1 - Step 2: Thay input 2 vào, kiểm tra kết quả có phải là output2 hay không. Nếu không thực hiện chỉnh sửa để cho output2 mà vẫn giữ được input1 cho output1. … - Cứ tiếp tục như vậy thử và chỉnh sửa code để đáp ứng thoả mãn được các sample cho sẵn. - Sau khi thử hết các sample có sẵn, tìm các unhappy cases, tự đưa ra các sample cho các unhappy case đó và đưa vào kiểm tra code của mình có chạy đúng không. Nếu không chỉnh sửa. - Cuối cùng, đọc lại toàn bộ code, tìm cách optimize nó.
Giao tiếp và trình bày? Trong quá trình tìm hướng giải quyết, theo kinh nghiệm của bản thân, bạn nên nói rõ ràng, trình bày, giải thích những gì bạn đang nghĩ trong đầu, ví dụ như: có các trường hợp nào xảy ra, nếu mình làm như vậy thì kết quả sẽ là gì, có vấn đề gì hay không,… Với cách thức này, ngoài việc cho thấy khả năng giao tiếp cũng như trình bày, thảo luận của bạn ra sao trong khi làm việc, đôi khi, bạn sẽ được có thêm hints từ interviewers, hay các nhận xét từ interviewers để hoàn thành challenge một cách tốt hơn.
b, Q&A challenge:
Đây là phần hầu như công ty nào cũng có. Các câu hỏi đưa ra sẽ xoay quanh tới các skills mà vị trí tuyển dụng yêu cầu:
Như frontend developer sẽ được hỏi các câu hỏi liên quan tới HTML/CSS, Javascript, ReactJS, Angular, Webpack, REST API,…. hay các câu hỏi advanced hơn như liên quan tới loading time optimization,…
Như mobile developer (iOS) sẽ được hỏi các câu hỏi liên quan tới Objective-C, Swift, iOS SDK, ViewController life cycle, Unit Test, UITest, CI, CD,…
Các câu hỏi này bạn có thể tìm thấy trên Google rất nhiều. https://lmgtfy.com/?q=interview+questions+for+mobile+developer https://lmgtfy.com/?q=frontend+interview+questions
Cách duy nhất để bạn có thể trả lời tốt cho các câu hỏi này đó là làm thật nhiều và khi làm, bạn cần hiểu và nắm rõ ngôn ngữ lập trình bạn dùng, framework và platform bạn làm việc với. Sau đó google các bộ câu hỏi phỏng vấn cho vị trí bạn nhắm tới, đọc câu hỏi, tham khảo câu trả lời. Cố gắng đảm bảo mình hiểu 100% câu trả lời. Tránh việc học thuộc, học vẹt :).
c, Assignment:
Hình thức kiểm tra này rất phổ biến ở Phần Lan, hồi ở Việt Nam, khi mình đi phỏng vấn xin việc, chỉ có 1 công ty duy nhất yêu cầu mình làm assignment trong 6 năm đi làm. Hầu hết, các công ty chỉ có whiteboard coding challenge và dạng Q&A mà thôi.
Các công ty sẽ yêu cầu bạn thực hiện 1 application nhỏ, web app (nếu vị trí bạn apply là web developer), mobile app (nếu bạn apply iOS / Android / mobile developer), web service/API (backend developer),…
Khi bạn nhận được yêu cầu, chú ý đọc kỹ yêu cầu, hiểu rõ công việc cần làm là gì. Ngôn ngữ nào, công nghệ gì,… Có yêu cầu gì đặc biệt hay không. Thường, các công ty sẽ không có quá nhiều yêu cầu đặc biệt và để bạn tuỳ chọn từ công nghệ đến thiết kế giao diện,….
Ok, vậy khi mình thực hiện assignment này, mình cần chú ý những gì:
Tránh đâm đầu vào code ngay, rất dễ dẫn tới việc code một nùi xong phát hiện ra mình hiểu sai vấn đề và làm lại từ đầu. Cố gắng, đọc kỹ yêu cầu, xác định các feature cần có của application mình làm.
Thiết kế cơ bản cho app của mình, bao gồm thiết kế giao diện nếu là web app hay mobile app, trường hợp là API thì nên tìm hiểu kỹ API của mình nhận params gì và trả về response gì, thiết kế JSON schema,…
Chọn architecture & design pattern mình sẽ follow. Đây là một trong những yếu tố quyết định bạn có pass được vòng này hay không. Thường các công ty sẽ cho bạn tuỳ chọn và không ràng buộc bạn theo architecture hay design patteren nào. Nhưng theo kinh nghiệm của bản thân, nếu trong job description có yêu cầu biết design pattern nào đó, thì bạn nên dùng nó, đó sẽ là một điểm cộng cho bạn.
Sử dụng version control system. Hầu hết các công ty mình đã phỏng vấn ở Phần Lan xài GIT. Và thường khi cho yêu cầu assignment, họ sẽ cung cấp cho bạn 1 repository để bạn push code lên. Nếu không, bạn nên tạo 1 private repository ở Github hoặc Gitlab để quản lý code của bạn và submit khi hoàn thành xong. Việc không sử dụng hoặc sử dụng Version Control không đúng cách sẽ là một điểm trừ khi team work. Vậy nên, bạn nên chú ý việc sử dụng cho đúng (như chia nhỏ các commit, commit có message rõ ràng, commit thường xuyên,…). Bạn có thể tham khảo thêm ở link sau.
Trong quá trình code, chú ý follow các coding best practices, follow coding standards & guideline mà community xài, follow các principles (như S.O.L.I.D),…
Sẽ là muốn điểm cộng lớn nếu bạn có Unit Test để cover cho các function của bạn.
Tạo README file, giải thích cách cài đặt, cách run application của bạn. Mô tả sơ về architecture, các libraries bạn sử dụng, lý do tại sao.
Tiêu chí đánh giá cho bài làm của bạn bao gồm:
Đúng với yêu cầu được giao, giải quyết được vấn đề.
Code clean, đẹp (như thế nào là code đẹp, xem ở đây) và có architecture rõ ràng.
Sử dụng đúng/tốt tech stacks mà công ty yêu cầu.
Có Unit Test (Optional, không phải là yếu tố quyết định nhưng nên có).
Sau khi bạn submit source code của mình, các công ty sẽ xem xét và quyết định có thực hiện tiếp process với bạn hay không. Nếu bạn qua ải assignment này thì chúc mừng bạn, bạn sẽ phải tham gia thêm 1 vòng technical interview tiếp theo :P. Và vòng đó sẽ được mình chia sẻ trong bài tiếp theo.
0 notes
ngoclt · 5 years
Text
Chia sẻ kinh nghiệm tìm việc IT ở Phần Lan
IT ở Phần "dễ" kiếm việc?
Đây là câu nói bạn thường thấy ở trong group WTF - Cộng đồng du học sinh Việt Nam tại Phần Lan khi lướt qua các câu hỏi về cơ hội việc làm ở Phần Lan.
Vậy có học IT có thực sự dễ kiếm việc ở Phần Lan?
Theo mình, trên đời này không có cái gì đơn giản mà đạt được. Tất cả mọi thành quả đều phải trả bằng mồ hôi công sức và sự nỗ lực của bản thân mới có được. Dễ kiếm việc ở đây có nghĩa là cơ hội việc làm cao hơn so với các ngành nghề khác. Nó không có nhiều sự rào cản về ngôn ngữ giao tiếp là tiếng Phần Lan như một số ngành nghề khác (một số công ty IT vẫn chỉ tuyển developer người Phần hay người biết nói tiếng Phần).
Do đó, để có được 1 công việc, bạn sẽ phải học hành đàng hoàng và mày mò nhiều để có thể chuẩn bị tốt cho bản thân trước khi chính thức apply vào một công ty nào đó. Đừng bao giờ thử apply khi mà bạn chưa có sự chuẩn bị kỹ càng và cảm thấy tự tin. Mỗi lần bạn apply và failed là một lần bạn mất đi 1 cơ hội, hãy quý trọng từng cơ hội mà bạn có được.
Các bước chuẩn bị cần thiết trước khi bắt đầu đi săn việc?
Trước hết, đây hoàn toàn là kinh nghiệm, và cách thức của riêng bản thân mình. Đừng nghĩ bạn sẽ xin được việc sau khi thực hiện các bước như mình. Đến bây giờ đi phỏng vấn và mình vẫn rớt như thường. Do đó, hãy dùng chia sẻ này như một sự tham khảo nhẹ và đúc kết ra cho bản thân bạn những bước cần thiết để chuẩn bị trước khi đi xin việc.
Bước 1: Công việc bạn mong muốn là gì?
Như bạn biết, làm IT có rất nhiều hướng để bạn đi, làm Software, Hardware, Network, DevOps, Machine Learning, Big Data, Automation, Robot,... Mỗi công việc và vị trí sẽ có yêu cầu về các kiến thức và kỹ năng riêng. Do đó bạn cần xác định được hướng đi cho riêng bạn (Xác định career path). Bạn định rõ hướng đi của mình càng sớm thì bạn càng có nhiều thời gian để chuẩn bị cho bản thân. 
Bạn không cần phải suy nghĩ nếu bạn chỉ mới bước chân vào học căn bản, khi bạn đủ kiến thức và trải nghiệm, bạn sẽ tự có câu trả lời cho bản thân. Bạn chỉ nên thực hiện bước này khi bạn đã có kiến thức căn bản về IT, như các kiến thức căn bản về lập trình, về OS, về Network,... 
Theo kinh nghiệm của mình, khi bạn ở ngưỡng năm thứ 3 hay năm thứ 4 của chương trình đại học là bạn hoàn toàn có thể bắt đầu nghĩ về nó. Và có thể đưa ra định hướng riêng cho bản thân.
Ở bước này, hoàn toàn phụ thuộc vào sở thích cá nhân hay đam mê của riêng bạn. Còn nếu bạn vẫn không xác định được, đừng quá lo lắng hay suy nghĩ nhiều, hãy dùng trải nghiệm để xác định. Sống là trải nghiệm mà.
Bước 2: Hướng đi đó, cần những gì? 
Sau khi đã có định hướng cho công việc mình mong muốn. Bạn cần tìm hiểu các kiến thức và kỹ năng cần thiết mình cần có để, trước hết là có thể thực sự làm việc được, thứ hai là để đáp ứng được các yêu cầu tuyển dụng từ các công ty. 
Cách đơn giản nhất đó là thử tìm kiếm các thông tin tuyển dụng của vị trí đó, công việc đó. Từ Job Description, bạn có thể thấy các kiến thức và kỹ năng cần thiết như ngôn ngữ lập trình, framework, kinh nghiệm và hiểu biết về Agile, các working methodologies... Take note, tìm mẫu số chung của các yêu cầu trên, tạo 1 check list bao gồm các yêu cầu trên. Check vào các mục mà bạn đã có. Phần còn lại sẽ chính là Todo list của bạn. Lên kế hoạch cho bản thân để  nghiên cứu và hoàn thiện các kỹ năng còn thiếu.
Trong quá trình tự học và nghiên cứu các kỹ năng trên, bạn nên tự tạo ra các side projects, làm việc với nó như đang làm việc thực sự. Cố gắng hoàn thành các side projects này thành các sản phẩm, không cần quá hoàn hảo, chỉ cần thấy được và sử dụng được. Nó sẽ giúp ích cho bạn rất nhiều trong quá trình bạn tham gia quá trình tuyển dụng về sau. Nhất là với các bạn sinh viên mới ra trường, chưa có kinh nghiệm làm việc thực tế, các side projects này sẽ đóng vai trò tương đương với kinh nghiệm làm việc của bạn.
Bước 3: Chuẩn bị CV
CV là ấn tượng đầu tiên về bạn với công ty. Mỗi công ty sẽ có một quy trình tuyển dụng khác nhau, nhưng về cơ bản, CV sẽ được HR scan trước. Họ sẽ đối chiếu các kỹ năng và kinh nghiệm làm việc của ứng viên với các yêu cầu của công ty. Khi họ thấy phù hợp, họ sẽ chuyển CV tới người sẽ thực hiện Technical Interview cho vị trí đó. Một lần nữa, người này sẽ kiểm tra kỹ hơn, chi tiết hơn về skillsets và kinh nghiệm bạn có. 
Làm sao tạo ấn tượng tốt trong CV của mình? 
Thường thường, khi scan một CV, theo kinh nghiệm của bản thân mình, (again, tất cả những chia sẻ này đều dựa theo kinh nghiệm của riêng mình, vậy nên nó có thể ko đúng hoàn toàn), sau đây là các mục mà HR và bộ phận tuyển dụng sẽ chú ý tới:
- Họ tên. - Giới thiệu tổng quát về bản thân. - Các kiến thức và working skills bạn có. - Chuyên ngành tốt nghiệp của bạn là gì ? Từ trường nào? (Nếu có, mục này thường sẽ không còn quan trọng sau khi bạn có tầm > 5 năm kinh nghiệm) - Kinh nghiệm làm việc bạn có (Nếu có, nếu bạn là sinh viên mới ra trường, bạn có thể đưa các side projects của bạn vào phần này).
Hầu hết HR và bộ phận tuyển dụng họ không thích mất quá nhiều thời gian vào việc scanning. Do đó, bạn nên rút gọn CV của bạn một cách ngắn gọn và súc tích nhất, nhưng vẫn đảm bảo thể hiện hết được tất cả kỹ năng bạn có và hoàn toàn phù hợp với công ty. Đừng mất quá nhiều thời gian kể lể những thứ không liên quan, không làm nổi bật được bản thân bạn so với các ứng viên khác hay những kỹ năng, kiến thức và kinh nghiệm công ty không cần hay không quan tâm. Một ví dụ nhỏ ở đây đó là, khi bạn mô tả các dự án mình đã thực hiện, bạn chỉ cần mô tả ngắn gọn dự án đó là gì, vị trí của bạn trong dự án đó, các skillsets yêu cầu. Nếu có thể, bạn nên đính kèm tới link của dự án đó, nếu là web thì link tới website đó, nếu là mobile app thì link tới app store, nếu là side projects thì link tới git repository,...  
Ngoài ra bạn có thể tham khảo rất nhiều mẫu CV trên mạng và đọc thêm các tip để hoàn thiện CV của bản thân.
Một khi bạn đã tự tin vào CV của mình... hãy chuẩn bị tinh thần sẵn sàng cho việc bị từ chối. Bị từ chối là một chuy��n rất bình thường nên đừng quá chán nản hay bỏ cuộc... Ngay cả khi chỉ nhận được một response sau khi apply hơn chục công ty. Sau mỗi lần bị từ chối cố gắng dành thời gian đọc lại CV của mình, xem xét mình có cần chỉnh sửa gì hay không, và làm sao để có thể cải thiện nó. 
Post tới đây đã quá dài, mình vẫn còn kha khá nhiều kinh nghiệm muốn chia sẻ thêm về quá trình tìm việc, tham gia tuyển dụng ví dụ như: có bao nhiêu vòng, nội dung các vòng đó ra sao, các kinh nghiệm của bản thân mình sau khi tham gia phỏng vấn ở các công ty ở Phần như thế nào. Mình sẽ dành tất cả chia sẻ trên ở post sau.
Cảm ơn bạn đã rảnh rỗi đọc hết post này của mình. Và như nói ở trên, post này hoàn toàn nhằm chia sẻ kinh nghiệm và ko có sự đảm bảo nào. Mình đã failed rất nhiều và đây là tất cả các kinh nghiệm mà mình đúc kết lại cho bản thân sau những lần failed đó.
Thân,
0 notes
ngoclt · 6 years
Text
Print all permutations of a string
With this practice, we will see the most useful update in Swift 4 compare with Swift 3.2. Now String is going back to a Collection of Characters again (same as in Swift 2). You can count the number of characters, loop over the characters without using characters property. As it is a collection, you can use  subscripting to get the character at index and also substring with range. 
extension String { public func permutation() { permutation(self, "") } private func permutation(_ str: String, _ prefix: String) { if str.count == 0 { print(prefix) return } for index in 0..<str.count { let rem = str[0..<index] + str[(index+1)..<str.count] permutation(rem, prefix + str[index]) } } } let permutedStr = "abc" permutedStr.permutation()
0 notes
ngoclt · 6 years
Text
Write a method which will remove any given character from a String.
The 2nd exercise that I did in the series cracking the coding interview with swift 4
With this exercise, I will write a method to remove a given character from a String. Let's check the code below.
extension String { func removeCharacter(keyword: String) -> String { let characters = Array(self) let filteredArray = characters.filter { (c) -> Bool in return keyword != String(c) } return String(filteredArray) } }
0 notes
ngoclt · 6 years
Text
Write code to check a String is palindrome or not?
Write code to check a String is palindrome or not? 
In the current project, we are using Swift 3.2 so I just want to study the new changes in Swift 4 by doing these practices. Also hopefully they would be useful for someone out there.
var str1 = "Hello" var str2 = "olleH" var str3 = "ollfH" extension String { subscript (i: Int) -> Character { return self[index(startIndex, offsetBy: i)] } subscript (i: Int) -> String { return String(self[i] as Character) } subscript (r: Range<Int>) -> String { let start = index(startIndex, offsetBy: r.lowerBound) let end = index(startIndex, offsetBy: r.upperBound) return String(self[Range(start..<end)]) } // For < Swift 4 func reverse() -> String { var reversedStr = "" for i in (0..<count).reversed() { let character: String = self[i] reversedStr += character } return reversedStr } func isPalindrome(of target: String) -> Bool { return self.reverse() == target } } print(str1.isPalindrome(of: str2)) print(str1.isPalindrome(of: str3))
0 notes
ngoclt · 11 years
Note
forgot to inlcude my contact information, you can contact me via my thumblr : sjoerd1987 . your help is appreciated! thanks, sjoerd
Hi Ngoclt, I’m experiencing the same problem as you did with respect to make the IAP plugin suitable for ARC projects. I saw you posted the solution, unfortunately I’m not able to make it work now - i’m fairly new to objective-c, could you send the InAppPurchaseManager.m &.h files? that would be of great benefit, thanks in advance, kind regards, sjoerd
Actually, there is a simple solution for this problem. We just need to add the flag to disable ARC for IAP plugin.
http://stackoverflow.com/questions/6646052/how-can-i-disable-arc-for-a-single-file-in-a-project
Anyway, I uploaded my code to github, you can clone it from here
Regards,
0 notes
ngoclt · 12 years
Text
InAppPurchaseManager Phonegap 2.1 plugin, ARC Project,
I've tried to use InAppPurchaseManager plugin (Phonegap plugin) to implement IAP into an iOS Project. But this plugin is very old now (Check here and here).
After googled, I found an update version for this plugin, made by usmart. This link is source code which is used for non-ARC Project (this is my problem, have to make this code work on ARC Project). 
First, I used Xcode Extract Refactoring Feature to convert that code to Objective-C ARC. Unfortunately it didn't work. There is some memory leak in new code (after converted):
ProductsRequestDelegate* delegate = [[ProductsRequestDelegate alloc] init]; delegate.command = self; delegate.successCallback = [arguments objectAtIndex:1]; delegate.failCallback = [arguments objectAtIndex:2]; productsRequest.delegate = delegate;
BatchProductsRequestDelegate* delegate = [[BatchProductsRequestDelegate alloc] init]; delegate.command = self; delegate.callback = [arguments objectAtIndex:0]; productsRequest.delegate = delegate; [productsRequest start];
The problem is delegates are typically held by weak or assign properties, then they are deallocated before called. So we need to hold onto a strong or retain reference to our ProductsRequestDelegate and BatchProductsRequestDelegate.
Hmmm, there are some "dirty trick" here :">.
Add 2 new properties into InAppPurchaseManager class:
@property (nonatomic, strong) ProductsRequestDelegate* productDelegate; @property (nonatomic, strong) BatchProductsRequestDelegate* batchDelegate;
@synthesize productDelegate=_productDelegate, batchDelegate=_batchDelegate;
And then replace 2 delegate objects (ProductsRequestDelegate and BatchProductsRequestDelegate objects) with self.productDelegate and self.batchDelegate.
self.productDelegate = [[ProductsRequestDelegate alloc] init]; self.productDelegate.command = self; self.productDelegate.successCallback = [arguments objectAtIndex:1]; self.productDelegate.failCallback = [arguments objectAtIndex:2]; productsRequest.delegate = self.productDelegate; [productsRequest start];
self.batchDelegate = [[BatchProductsRequestDelegate alloc] init]; self.batchDelegate.command = self; self.batchDelegate.callback = [arguments objectAtIndex:0]; productsRequest.delegate = self.batchDelegate; [productsRequest start];
That's this. It should work now.
0 notes
ngoclt · 12 years
Text
Unable to open log device '/dev/log/main' ?
Get this warning while running app on Android device ? Dont worry, this is solution:
1, Open: /system/etc/init.d/××× (not the same file on different ROMs, find the right file)
2, Find the line that says: rm /dev/log/mainChange the line to: # rm /dev/log/main (comments out the line, rm = remove, in case you were wondering)
3, Save and reboot device
I found this solution from Stackoverflow.
I got this issue when I tried to run my app on Sony Xperia S.
0 notes
ngoclt · 12 years
Text
Handle orientationchange event with Javascript in UIWebView (on iOS 4.x)
Don't know why on iOS 4.x onorientationchange handler not being called in UIWebView. So we can not handle orientation changes with javascript. But this problem can be fixed by setting the window.orientation property and calling window.onorientationchange in the willRotateToInterfaceOrientation method of the view controller that contains your UIWebView:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { switch (toInterfaceOrientation) { case UIDeviceOrientationPortrait: [webView stringByEvaluatingJavaScriptFromString:@"window.__defineGetter__('orientation',function(){return 0;});window.onorientationchange();"]; break; case UIDeviceOrientationLandscapeLeft: [webView stringByEvaluatingJavaScriptFromString:@"window.__defineGetter__('orientation',function(){return 90;});window.onorientationchange();"]; break; case UIDeviceOrientationLandscapeRight: [webView stringByEvaluatingJavaScriptFromString:@"window.__defineGetter__('orientation',function(){return -90;});window.onorientationchange();"]; break; case UIDeviceOrientationPortraitUpsideDown: [webView stringByEvaluatingJavaScriptFromString:@"window.__defineGetter__('orientation',function(){return 180;});window.onorientationchange();"]; break; default: break; } }
And this JavaScript method will handle orientationchanges event:
function updateOrientation(){ try { switch(window.orientation){ case 0: //show normal (portrait) break; case -90: //show right (landscape) break; case 90: //show left (landscape) break; case 180: //show upside-down (portrait) break; } } catch(e) { alert('ERROR:' + e.message); } }
NOTE: One more thing I can't understand is when I try to show an alert box in updateOrientation() method, the application will be hanged. It won't allow to cklick on OK button.
2 notes · View notes
ngoclt · 12 years
Text
Detecting iOS version using javascript
Last night I went to crazy with orientationchange event for UIWebView on iOS 4.There's a bug in iOS 4, so we can not handle rotation (without add some native code in didRotateFromInterfaceOrientation method). Then I tried to detect iOS version to execute some code only for iOS 5. And here is what I found:
This method will get iOS version:
checkVersion = function () { var agent = window.navigator.userAgent, start = agent.indexOf('OS '); if ((agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1) && start > -1){ return window.Number(agent.substr( start + 3, 3 ).replace( '_', '.' )); } return 0; }
3 notes · View notes