Home Blog Page 195

6 điều tôi vỡ lẻ khi tự học code (P1)

Tôi được khuyến khích và muốn chia sẻ kinh nghiệm tự học code của mình để bản thân vui hơn, vì vậy tôi viết bài này để các bạn đến sau hiểu được nhiều hơn con đường mình đi. Hãy lưu ý rằng chuyên ngành của tôi là phát triển web, vì vậy stack của tôi phản ánh điều đó.

1. Hãy sẵn sàng vứt bỏ tất cả mọi thứ, kể cả những thứ tốt nhất, giải pháp hợp lí mới giải quyết mọi vấn đề.

Điều này đúng với mọi khía cạnh từ code đến các ngôn ngữ lập trình đến ý tưởng. Lập trình thay đổi rất nhanh và có rất nhiều cách hay để tiếp cận các vấn đề, nhưng cần nhớ rằng tìm ra giải pháp mới là lý do của lập trình. Mục đích chính là giải quyết vấn đề thành công chứ không phải về quá trình tìm ra cách giải quyết. Bạn chắc hẳn sẽ rất tức giận hoặc có những hành động bồng bột khi gặp tình huống sau: Bạn dành 2 ngày để viết code hoặc xây dựng một page, bỗng nhiên có người bước ngang qua và chỉ ra một giải pháp nhanh hơn / tốt hơn?!

Nếu bạn tập trung vào giải pháp tốt nhất, nó sẽ giúp bạn giải quyết code dễ dàng hơn. Gần đây, tôi đã dành 2 ngày xử lý một số flexbox cho một dự án và đối tác kinh doanh của tôi ( họ không phải là dân tech) đã quyết định rằng không có tính năng đó sẽ tốt hơn cho chiến lược phát triển của họ. Trực giác của tôi mách bảo rằng tôi sẽ phát điên lên và không muốn thay đổi code cho dù có chuyện gì xảy ra, nhưng sau khi hít thở sâu vài lần và nghĩ thật thông, tôi nhận ra đối tác của tôi đã nói đúng.

Hơn nữa, nếu tôi trung thực, khách hàng của tôi có thể tiết kiệm được một khoảng thời gian quan tâm đến số giờ tôi đã làm việc để tạo ra widget x hoặc code của y đẹp đến mức nào. Họ chỉ muốn sản phẩm của họ tốt nhất có thể.

2. Ngôn ngữ lập trình bạn đang học không quan trọng bằng ý kiến của mọi người

Tôi chưa bao giờ là fanboy của một công nghệ cụ thể nào, và yêu thích Windows 10. Chưa kể có một máy tính xách tay khác chạy Kubuntu mà tôi rất thích. Ngoài ra tôi cũng thích sử dụng MacBook của vợ tôi.

Tôi đã tiếp cận nhiều ngôn ngữ lập trình cùng một cách. Tôi đã quyết định học vài ngôn ngữ lập trình để phục vụ cho việc kinh doanh của tôi (HTML / CSS / JS * Tôi biết html và css không hẳn là ngôn ngữ lập trình.) và sau đó tôi chọn một vài thứ tôi muốn học, (SQL, Python, Perl, Java), rồi tôi học thêm C vì tôi muốn bổ sung vào trình độ compsci thấp của mình với một ngôn ngữ cơ bản hơn.

Sau khi học xong, tôi đã học được rằng mọi thứ mình học đều có giá trị về lâu về dài. Nếu bạn không có nhu cầu cấp bách học một ngôn ngữ cụ thể nào, hãy thử nhiều thứ cùng lúc và tìm ra ngôn ngữ phù hợp nhất. Hãy tìm hiểu về ngôn ngữ bạn sử dụng nhiều nhất, và quyết tâm học nó bất kể mọi người nói gì. Nếu bạn đam mê ngôn ngữ assembly, nó sẽ giúp bạn đi rất xa trong mảng này.

3. Lập trình (và tự học code) thực sự khó như mọi người nói.

Khi tôi mới bắt đầu, tôi thực sự nghĩ rằng tôi là một thiên tài có thể hiểu mọi thứ trong vài giờ học. C và CSS đã khiến tôi tỉnh mộng. Tôi đã dành rất nhiều thời gian để hiểu các khái niệm trong CSS khiến tôi có chút thất vọng về bản thân, vì thế tôi đã thay đổi phương châm thành ” Dành đủ thời gian, stack overflow, ghi chép lại để tìm hiểu sâu hơn.”

Nếu bạn hiểu rằng lập trình là khó để theo đuổi, và khi đó bạn sẽ tiếp cận nó với tâm thế sẽ rất khác, bạn sẽ cố gắng hơn, khi gặp khó bạn sẽ coi đó là điều đương nhiên và ít nản lòng hơn, thậm chí xác suất bỏ cuộc giữa chừng cũng thấp hơn. Thay vì thất vọng khi gặp bug hoặc trang bị sập, tôi đã hiểu ra nó là một phần của quá trình và khiến tôi đỡ đau đớn hơn. Đó là sự thật sau một sự kiện không thể tìm ra một dấu chấm phẩy sau hơn 4 tiếng tìm kiếm vào lúc 3 giờ sáng.

Phần 2: 6 điều tôi vỡ lẻ khi tự học code (P2)

Top 10 thư viện Python tốt nhất cho Data Scientist nửa đầu năm 2024

Khi Python ngày càng nhận được nhiều sự quan tâm của cộng đồng Data Science trong những năm gần đây, tôi đã muốn tổng hợp cho các data scientists và engineers những thư viện được sử dụng nhiều nhất, dựa trên kinh nghiệm làm việc của bản thân.

Và vì tất cả các thư viên đều là nguồn mở, nên chúng tôi đã thêm các commits, số lượng các contributors và các chỉ số khác từ Github với vai trò là các chỉ số proxy thể hiện mức độ nổi tiếng của thư viện đó.

1. NumPy (Commits: 15980, Contributors: 522)

Khi bắt đầu giải quyết task về khoa học bằng Python, tập hợp phần mềm được thiết kế riêng cho scientific computing trong Python sẽ không thể không hỗ trợ SciPy Stack của Python (đừng nhầm lẫn với thư viện SciPy – là 1 phần của stack này, và cộng đồng của stack này). Tuy nhiên, stack này khá rộng, có hơn cả tá thư viện trong nó và chúng ta thì lại muốn tập trung vào các core packages (đặc biệt là những packages quan trọng nhất).

Package cơ bản nhất, khi computation stack về khoa học được xây dựng là NumPy (viết tắt của Numerical Python), cung cấp rất nhiều tính năng hữu ích cho các phần operations trong n-arrays & matrics trong Python. Thư viện này cung cấp khả năng vector hóa các vận hành về toán trong type array NumPy, giúp cải thiện hiệu suất và theo đó là tốc độ execution.

  Năm 2024 rồi, tình hình ngôn ngữ Python như thế nào?

2. SciPy (Commits: 17213, Contributors: 489)

SciPy là 1 thư viện phần mềm cho engineering và khoa học. Một lần nữa bạn cần phải hiểu sự khác biệt giữa SciPy Stack và thư viện SciPy. SciPy gồm các modules cho đại số tuyến tính, optimization, tích hợp và thống kế. Chức năng chính của thư viện SciPy được xây dựng trên NumPy, và arrays của nó sẽ tận dụng tối đa NumPy. Nó mang đến rất nhiều hoạt động hữu ích liên quan đến số như tích hợp số, optimization… qua các submodules chuyên biệt. Các hàm trong tất cả các submodules của SciPy đều được document tốt.

3. Pandas (Commits: 15089, Contributors: 762)

Pandas là 1 package Python được thiết kế để làm việc với dữ liệu đơn giản, trực quan, được “gắn nhãn” và có liên hệ với nhau. Pandas là công cụ hoàn hảo để tinh chỉnh và làm sạch dữ liệu. Pandas được thiết kế hỗ trợ cho các thao tác, tập hợp và visualize dữ liệu.

Có 2 data structure chính trong thư viện này:

“Series” — 1 chiều

“Data Frames”, 2 chiều

Ví dụ, khi muốn nhận Dataframe mới 2 loại structure này, bạn sẽ nhận DF bằng cách nối 1 hàng đơn với 1 DataFrame bằng cách đem tới 1 Series:

Danh sách những thứ bạn có thể làm với Pandas:

  • Dễ dàng xóa và thêm cột từ DataFrame
  • Chuyển data structures đến các objects DataFrame
  • Xử lý các data bị mất, như NaNs
  • Khả năng bhóm lại theo chức năng

Lịch sử Google Trends

trends.google.com

Lịch sử pull requests của GitHub

datascience.com/trends

4. Matplotlib (Commits: 21754, Contributors: 588)

Một core package của SciPy Stack và 1 thư viện Python khác được xây dựng riêng cho việc generation các visualizations mạnh mẽ, đơn giản là Matplotlib. Matplotlib là 1 phần của phần mềm giúp cho Python (cùng với sự hỗ trợ của NumPy, SciPy và Pandas) trở thành đối thủ nổi bật với các công cụ khoa học như MatLab hoặc Mathematica.

Tuy nhiên, thư viện này ở cấp độ thấp, đồng nghĩa là bạn sẽ cần phải viết nhiều code hơn để tiếp cận các cấp độ visualization cao cấp và bạn sẽ phải nỗ lực hơn so với khi sử dụng các công cụ cấp cao, tuy nhiên nỗ lực này là hoàn toàn xứng đáng.

Chỉ cần nỗ lực 1 chút, bạn có thể tạo được các visualization bất kì:

  • Line plots;
  • Scatter plots;
  • Bar charts và Histograms;
  • Pie charts;
  • Stem plots;
  • Contour plots;
  • Quiver plots;
  • Spectrograms.

Có rất nhiều công cụ để tạo nhãn, lưới, các biểu tượng/ kí hiệu/ chú giải và rất nhiều yếu tố format khác với Matplotlib. Về cơ bản, mọi thứ đều có thể custom được.

Thư viện này còn được rất nhiều platform hỗ trợ và tận dụng các GUI kít khác nhau để mô tả các visualizations kết quả. Thay đổi các IDEs (như IPython) sẽ hỗ trợ chức năng của Matplotlib.

Có vài thư viện bổ sung giúp việc visualization trở nên dễ dàng hơn.

Việc làm python lương cao cho bạn

5. Seaborn (Commits: 1699, Contributors: 71)

Seaborn hầu như tập trung vào việc visualization của các models thống kê; các visualizations như thế gồm heat maps tổng hợp dữ liệu nhưng vẫn mô tả được toàn bộ mức độ phân tán. Seaborn được phát triển dựa trên Matplotlib.

  Sự khác nhau giữa Method và Function trong Python

6. Bokeh (Commits: 15724, Contributors: 223)

Một thư viện visualization cực hay khác là Bokeh, hướng đến các visualization tương tác. Trái ngược với thư viện trước, Bokeh hoàn toàn độc lập so với Matplotlib. Bokeh tập trung chính vào tính tương tác và nó tạo các presentations qua các hệ điều hành hiện đại theo style của Data-Driven Documents (d3.js).

7. Plotly (Commits: 2486, Contributors: 33)

Plotly là toolbox cho web để xây dựng các visualizations, APIs được xây dựng bằng vài ngôn ngữ lập trình (như Python chẳng hạn). Có rất nhiều graphics mạnh mẽ, sáng tạo trên trang plot.ly. Để sử dụng Plotly, bạn sẽ cần set up API key riêng. Các graphics sẽ được xử lý phía server và được post lên internet, tuy nhiên vẫn có cách để ngăn việc này.

Lịch sử Google Trends

trends.google.com

Lịch sử pull requests của Github

datascience.com/trends

8. SciKit-Learn (Commits: 21793, Contributors: 842)

Scikits là các packages bổ sung của SciPy Stack được thiết kế cho các chức năng chuyên biêt như xử lý ảnh và hỗ trợ Machine Learning. Riêng với mảng Machine Learning, một trong những ưu điểm nổi bật của các packages này là scikit-learn. Package được xây dựng trên nền tảng của SciPy và tận dụng các operations về toán.

Scikit-learn có giao diện đơn giản, nhất quán, exposes a concise and consistent interface to the common machine learning algorithms, hỗ trợ việc mang Machine Learning vào các hệ thống production trở nên đơn giản hơn. Thư viện này bao gồm các code chất lượng và documentation hay, dễ sử dụng, hiệu suất cao, là chuẩn mực thực tế cho xây dựng Machine Learning bằng Python.

Deep Learning — Keras / TensorFlow / Theano

Liên quan đến Deep Learning, 1 trong những thư viện nổi bật và tiện ích dành cho Python là Keras, có thể hoạt động trên nền tảng của TensorFlow hoặc Theano.

Xem chi tiết bên dưới.

9. Theano. (Commits: 25870, Contributors: 300)

Theano là package Python định dạng các arrays đa chiều tương tự như NumPy, đi kèm với các operation về toán và expressions. Thư viện này được compiled, chạy hiệu quả trên tất cả các architectures. Do đội ngũ Machine Learning của Université de Montréal, Theano được sử dụng chính cho các hoạt động liên quan đến Machine Learning.

Lưu ý là Theano tích hợp với NumPy ở mức độ operation cấp thấp. Thư viện này cũng tối ưu hóa khả năng sử dụng GPU & CPU, giúp cho hiệu năng của computation thiên về data nhanh chóng hơn.

Hiệu quả và sự ổn định cũng mang đến những kết quả chính xác hơn, dù đó là những giá trị rất nhỏ như computation của log(1+x) sẽ cho ra kết quả chính xác đối với các giá trị nhỏ nhất của x.

10. TensorFlow. (Commits: 16785, Contributors: 795)

Do các developer của Google phát triển, TensorFlow là thư viện nguồn mở của graphs computations thuộc luồng dữ liệu, thích hợp với Machine Learning. TensorFlow đáp ứng các requirement cao cấp trong môi trường Google để train Neural Networks và thư viện kế nhiệm của DistBelief – 1 hệ thống Machine Learning dựa trên Neural Networks. Tuy nhiên, TensorFlow không chỉ sử dụng cho mục đích khoa học trong Google mà có thể áp dụng trong các dự án thực tế.

Tính năng quan trọng của TensorFlow is hệ thống nút đa layer, cho phép huấn luyện các neural networks trên datasets lớn 1 cách nhanh chóng, hỗ trợ khả năng nhận diện giọng nói và định vị vật thể trong ảnh của Google.

Tóm lại, 

Trên đây là những thư viện được rất nhiều data scientist và engineers đánh giá cao. Bên dưới là biểu đồ chi tiết về hoạt động trên Github của mỗi thư viện:

Dĩ nhiên, danh sách này vẫn chưa hoàn thiện và còn rất nhiều thư viện, framewoks đáng lưu ý khác. Chẳng hạn như các packages khác nhau của SciKit tập trung vào các domains riêng biệt như SciKit-Image làm việc với hình ảnh.

Xem thêm các việc làm IT hot tại TopDev

Nguồn: Sưu tầm

Vì sao onsite nước ngoài được xem là điểm sáng trong sự nghiệp?

Onsite là gì? Lập trình viên đi onsite cần biết những gì?

Bạn nghĩ sao nếu một ngày đẹp trời mở mail lên, nhận được thông báo xuất ngoại đi onsite? Cảm giác lúc này của bạn là bất ngờ, sung sướng và xen lẫn cả sự hồi hộp? Vậy là bạn chuẩn bị ra nước ngoài, ăn đồ Tây, lương cũng nhảy lên mấy con số tính theo “vi-en-đi” (VNĐ).

Thế nhưng, bạn đã hiểu rõ ý nghĩa của việc đi onsite chưa? Và làm thế nào để được chọn đi onsite nước ngoài như mình mong muốn?

Onsite nghe hay hay, nhưng đó là gì vậy?

Đi onsite tương tự như việc bạn đại diện cho hình ảnh của công ty để làm việc cho công ty khách hàng ở trong hoặc ngoài nước (hiểu nôm na là “làm cho khách hàng ngay chính trụ sở khách hàng”). Bằng việc tham gia vào đội ngũ IT chuyên nghiệp đến từ nhiều công ty lớn, bạn sẽ có cơ hội thể hiện khả năng của mình trong các dự án tầm cỡ. Một lợi thế trong khi onsite là bạn được làm việc trực tiếp, trao đổi thông tin giữa mọi thành viên trong dự án để đưa ra giải pháp nhanh nhất. Từ đó giúp đảm bảo tiến độ, tiết kiệm thời gian, tiết kiệm chi phí lẫn nguồn lực. Và một trong những chuyến đi onsite được nhiều người trông đợi nhất chính là được cử sang nước ngoài.

  TOP 7 Yêu Cầu Tuyển Dụng Của Các Công Ty Nước Ngoài

Đếm ngược thời gian bay, vậy đi onsite nước ngoài sẽ được gì?

Môi trường mới, ngoại ngữ mới, dấu ấn mới

Khi xuất ngoại, điều gì trong mắt bạn cũng trở nên mới mẻ. Nếu bạn muốn trò chuyện làm quen với mọi người xung quanh thì phải biết dùng tiếng Anh. Bên cạnh đó còn tuỳ thuộc vào ngôn ngữ mà nơi đó sử dụng phổ biến nhất. Đi onsite nước ngoài chính là dịp để bạn rèn luyện kỹ năng ngoại ngữ của mình, giúp bạn tự tin hơn trong giao tiếp dù ở bất cứ đâu. Một mặt khác việc đi onsite cũng góp phần nâng cao hình ảnh cá nhân, xây dựng thương hiệu riêng. Một profile với kinh nghiệm đã từng đi onsite luôn tạo ấn tượng nổi bật trong mắt các nhà tuyển dụng. Đó là lý do tại sao nhiều lập trình viên vẫn mong muốn có được điểm cộng hoành tráng đó.

Kiến thức bồi đắp, kinh nghiệm vững vàng

Việc bạn mới tham gia vào những dự án tại nước ngoài có thể gặp vài thách thức. Áp lực là điều dễ nhận thấy vì yêu cầu đối với các dự án quy mô thường cao. Nhưng đó cũng là bước đệm để bạn phát triển, tôi luyện bản thân với những bài học và kinh nghiệm. Sẽ có lúc bạn vướng phải một vấn đề căng thẳng buộc phải nhanh chóng họp lại với team để đưa ra phương án giải quyết. Và điều này giúp bạn học được cách phòng tránh lỗi tương tự về sau, hiểu cách phân tích và fix lỗi để có thể tạo ra những sản phẩm hoàn thiện hơn. Đồng thời kỹ năng mềm của bạn trong quá trình đó cũng tăng lên, từ cách làm việc nhóm trong một đội ngũ lớn cho đến việc giám sát, đôn đốc, báo cáo – mọi thứ đều để lại cho bạn những kinh nghiệm nhất định.

Lương tăng vút, đãi ngộ vi vu

Đi onsite nước ngoài chính là cánh cửa dẫn đến mức thu nhập mơ ước. Nếu như mức lương ban đầu của bạn là 1,000 USD thì con số offer tại nước ngoài có thể tăng lên gấp vài lần. Các công ty nước ngoài thường có nhiều chính sách hấp dẫn nên đây cũng là dịp để bạn được trải nghiệm một môi trường làm việc với những đãi ngộ tốt nhất.

Làm sao để được chọn đi onsite nước ngoài?

Bất cứ ai cũng đều có thể chạm lấy điểm sáng onsite trong sự nghiệp. Điều này tuỳ thuộc vào quá trình vươn lên của mỗi người dựa trên các yếu tố:

  • Kỹ thuật chuyên môn
  • Số năm kinh nghiệm
  • Trình độ ngoại ngữ
  • Đam mê và nỗ lực

Để được chọn đi onsite, bạn cần phải chuẩn bị cho mình một nền tảng thật vững chắc. Trau dồi kiến thức mới, tích luỹ kinh nghiệm thực tế, đăng kí khoá học ngoại ngữ, tìm danh sách vị trí và công ty có cơ hội đi onsite nước ngoài…  đó là những gì bạn có thể chuẩn bị ngay lúc này để chạm lấy giấc mơ mà mình muốn. Bạn có thể tham khảo qua 9 cơ hội onsite nước ngoài hấp dẫn dưới đây để lấy làm động lực thực hiện:

FUTURE CTO (PHP, Java, Ruby on Rails, Python, .NET) | Study now
>> Cơ hội trải nghiệm môi trường làm việc tại Thái Lan, Indonesia…

Software QA Engineer (Tester) | CYBOZU Vietnam
>> Cơ hội công tác tại Mỹ, Nhật Bản, Trung Quốc

NodeJS Developer | PROVIEW tuyển dụng
>> Cơ hội làm việc tại Mỹ, các nước Châu Âu

Front-end Developer | W&S
>> Làm việc onsite tại Nhật theo mong muốn, nguyện vọng

Full-stack .NET/C# Developer | Futurify
>> Cơ hội onsite tại Canada, Singapore, Malaysia

Front-end Developer | Tripath
>> Cơ hội onsite tại Hàn Quốc

Fresher Software Engineer (Java, NodeJS, .NET, Front-End) | KMS Technology
>> Cơ hội onsite ngắn hạn, dài hạn tại Mỹ

Full-stack Developer (PHP, JavaScript, Laravel, SVN, Git) | Worknetics Singapore
>> Cơ hội làm việc tại Singapore

Onsite như cánh diều giúp bạn được bay lượn. Nhưng để diều bay cao thì cần phải ngược gió. Một khi biến thách thức thành cơ hội, bạn sẽ nhìn thấy con đường thành công của chính mình không còn xa nữa.

6 thư viện JavaScript xác thực người dùng

JavaScript-library

Tác giả: Jonathan Saring

“Xây dựng cho tôi một hệ thống xác thực người dùng trong hai tuần” là một cụm từ phổ biến trong các nhóm R & D những ngày này. Vì nhiều lý do, nhiệm vụ này luôn là một trong những nhiệm vụ để một nhà phát triển duy nhất trong nhóm sắp xếp.

Một mặt, bạn thực sự không muốn lãng phí nhiều thời gian để làm điều đó. Mặt khác, bạn lo ngại rằng hệ thống này có thể được xử lý tốt hơn bởi giải pháp của bạn, để nhân rộng tốt hơn sau này.

Khi các hướng dẫn mới xuất hiện trên web ( một nơi tốt để bắt đầu ) và nhiều nhóm đang cố gắng hiểu phương trình chi phí-lợi ích để thực hiện giải pháp của riêng họ so với sử dụng thư viện hoặc dịch vụ, tôi đã tập hợp một đánh giá ngắn về những gì ở đó. Hy vọng điều này có thể giúp tiết kiệm thời gian và đưa ra quyết định sáng suốt hơn. Hãy bình luận và chia sẻ những hiểu biết của riêng bạn.

Tham khảo các vị trí Javascript tuyển dụng từ các công ty HOT

1. Passport JS

Passport không chỉ là thư viện xác thực người dùng với 15 nghìn sao, đây có lẽ là cách phổ biến nhất để các nhà phát triển JS sử dụng thư viện bên ngoài để xác thực người dùng.

https://github.com/jaredhanson/passport

Với express: https://github.com/expressjs/session

2. Auth0

Mặc dù đây không phải là một thư viện mà là một dịch vụ, đó là một cách mạnh mẽ và nhanh chóng để hoàn thành công việc. Auth0 là một công ty khởi nghiệp (khá lớn) cung cấp nền tảng xác thực & ủy quyền phổ biến rộng rãi cho các ứng dụng web, di động và các ứng dụng kế thừa. Một số cho rằng, đó là giải pháp gần nhất với sự kiện Devise for Ruby on Rails, ngoại trừ bạn có thể kết nối bất kỳ ứng dụng hoặc API bằng bất kỳ ngôn ngữ nào. Có hơn 100 tích hợp được xây dựng sẵn và tại đây là một sự khởi đầu nhanh chóng với Node.js.

https://auth0.com/

3. Permit

Permit là một dự án 1k sao, nhằm mục đích cung cấp một thư viện xác thực không giới hạn của người dùng để xây dựng API Node.js. Permit cho phép bạn thêm lớp xác thực vào bất kỳ API Node.js nào và có thể được sử dụng với các frameworks như Express, Koa, Hapi và Fastify. Nó có thể được sử dụng với nhiều loại API từ REST đến GraphQL, do đó, thiết kế không được đề cập đến. Permit nhằm tập trung vào các API (yêu cầu không trạng thái) và các frameworks. Nó cũng đang được phát triển tích cực, điều này khiến Permit trở thành một lựa chọn thú vị để xem xét. chắc chắn đáng để mắt đến.

https://github.com/ianstormtaylor/permit

Xem ví dụ. Ở đây, một ví dụ với Express:

import { Bearer } from 'permit'
import express from 'express'

const permit = new Bearer({
  basic: 'username', // Also allow a Basic Auth username as a token.
  query: 'access_token', // Also allow an `?access_token=` query parameter.
})

function authenticate(req, res, next) {
  // Try to find the bearer token in the request.
  const token = permit.check(req)

  // No token found, so ask for authentication.
  if (!token) {
    permit.fail(res)
    return next(new Error(`Authentication required!`))
  }

  // Perform your authentication logic however you'd like...
  db.users.findByToken(token, (err, user) => {
    if (err) return next(err)

    // No user found, so their token was invalid.
    if (!user) {
      permit.fail(res)
      return next(new Error(`Authentication invalid!`))
    }

    // Authentication succeeded, save the context and proceed...
    req.user = user
    next()
  })
}

const app = express()

app.get('/', (req, res) => {
  res.send('Some unrestricted content.')
})

app.get('/restricted', authenticate, (req, res) => {
  res.send('Restricted content!')
})

app.listen(3000)

4. Grant

Một thư viện khá mới và đầy hứa hẹn cung cấp OAuth Middleware cho Express, Koa và Hapi – với hơn 180 nhà cung cấp được hỗ trợ và một live playground. Trong trường hợp bạn muốn sử dụng nó với nhà cung cấp OAuth riêng của mình, bạn có thể tự chỉ định khóa được yêu cầu. Mặc dù thư viện này đã được hơn 1K sao, nhưng tài nguyên tương đối khan hiếm, vì vậy hãy cẩn thận thử.

https://github.com/simov/grant

5. Feathers authentication management

Feathers là một open source (11K stars) real-time, một micro-service web framework cho NodeJS cho phép bạn kiểm soát dữ liệu của mình thông qua các tài nguyên RESTful, sockets và plug-ins linh hoạt.

Feathers cũng cung cấp các mô-đun quản lý xác thực cho phép bạn thêm xác minh đăng ký, thiết lập lại khi quên mật khẩu và các khả năng khác cho feathers-authentication cục bộ. Ý tưởng là kết hợp các phương thức xác thực khác nhau dưới một mái nhà, trong một cơ sở hạ tầng linh hoạt. Đây là một hướng dẫn từng bước để giúp bạn bắt đầu.

https://github.com/feathersjs/authentication

https://github.com/feathers-plus/feathers-authentication-management

6. Chỉ dùng Firebase Authentication (cho các app nhỏ)

Đây có thể không nhất thiết là giải pháp lâu dài để quản lý xác thực người dùng trong nền tảng mở rộng của bạn. Tuy nhiên, đây là một cách rất hữu ích để hoàn thành công việc, nhanh chóng và đơn giản, cho các ứng dụng của bạn được triển khai với Firebase.

Firebase Authentication cung cấp dịch vụ phụ trợ, SDK dễ sử dụng và thư viện UI được tạo sẵn để xác thực người dùng với ứng dụng của bạn. Nó hỗ trợ xác thực bằng mật khẩu, số điện thoại, nhà cung cấp nhận dạng liên kết phổ biến như Google, Facebook và Twitter. Tìm hiểu thêm tại đây.

Dưới đây, một hướng dẫn rất hay để xây dựng ứng dụng React tận dụng Firebase cho Người dùng Auth với Facebook, Twitter và GitHub:

https://blog.bitsrc.io/react-oauth-authentication-with-firebase-dfe0e8c5d0d4

Và ở đây, một hướng dẫn tương tự để xây dựng ứng dụng Vue.js với xác thực Firebase:

https://blog.bitsrc.io/build-a-vue-app-with-firebase-authentication-and-database-e7d6816f79af

Và với MERN stack:

https://blog.bitsrc.io/build-a-login-auth-app-with-mern-stack-part-1-c405048e3669

Bài viết gốc được đăng tải tại blog.bitsrc.io

Có gì mới trong Angular 7.0 và làm sao để nâng cấp?

Tác giả: Ankit Sharma

Giới thiệu

Angular đã phát hành phiên bản mới nhất của nó, Angular 7.0. Trong bài viết này, chúng ta sẽ khám phá các điểm sau:

  • Có gì mới trong Angular 7.0?
  • Tạo ứng dụng Angular 7.0 đầu tiên của bạn bằng Angular CLI
  • Cách cập nhật ứng dụng Angular hiện tại của bạn lên Angular 7.0

Có gì mới trong Angular 7.0?

  1. Khi tạo một ứng dụng Angular mới, Angular CLI sẽ nhắc người dùng chọn nếu họ muốn thêm các tính năng như định tuyến Angular hoặc kiểu định dạng mà họ muốn sử dụng trong ứng dụng của họ
  2. Các ứng dụng Angular 7.0 sẽ sử dụng tính năng Bundle Budget của Angular CLI.Điều này sẽ cảnh báo các nhà phát triển nếu kích thước gói ứng dụng vượt quá giới hạn được xác định trước. Giá trị mặc định cho cảnh báo được đặt thành 2MB và đối với lỗi là 5MB.Giá trị này có thể định cấu hình và có thể được thay đổi từ tệp angular.json.Tính năng này nâng cao hiệu suất của ứng dụng một cách đáng kể.
  3. Bộ phần mềm Dev Dev (CDK) của Angular Material cũng nhận được một số tính năng mới như là một phần của bản cập nhật này.Hai tính năng mới được thêm vào của CDK là:
  • Virtual Scrolling
    Nếu bạn đang cố tải một danh sách lớn các phần tử, thì nó có thể ảnh hưởng đến hiệu suất của ứng dụng. Thẻ <cdk-virtual-scroll-viewport> có thể được sử dụng để chỉ tải phần hiển thị của danh sách trên màn hình. Nó sẽ chỉ hiển thị các mục có thể vừa trên màn hình. Khi người dùng cuộn qua danh sách thì DOM sẽ tải và dỡ bỏ các phần tử một cách linh hoạt dựa trên kích thước hiển thị.
    Tính năng này không bị nhầm lẫn với cuộn vô hạn hoàn toàn là một chiến lược khác nhau để tải các yếu tố. Bạn có thể đọc thêm về Virtual Scrolling tại đây .
  • Drag and Drop
    Chúng ta có thể dễ dàng thêm tính năng kéo và thả vào một mục. Nó hỗ trợ các tính năng như kéo miễn phí một phần tử, sắp xếp lại các mục trong danh sách, di chuyển các mục giữa danh sách, animation, thêm tay cầm kéo tùy chỉnh và kéo hạn chế dọc theo trục X hoặc Y. Bạn có thể đọc thêm về Kéo và Thả ở đây .
  1. Trường mat-form-field bây giờ sẽ hỗ trợ việc sử dụng phần tử chọn gốc. Điều này sẽ cung cấp hiệu suất nâng cao và khả năng sử dụng cho ứng dụng. Tìm hiểu thêm về tính năng này ở đây .
  2. Angular 7.0 đã cập nhật các phụ thuộc của nó để hỗ trợ Bản in 3.1, RxJS 6.3 và Node 10.

Bây giờ chúng ta sẽ tiến hành tạo ứng dụng Angular 7 đầu tiên của chúng ta.

Điều kiện tiên quyết

  • Cài đặt phiên bản mới nhất của Node.js từ đây
  • Cài đặt Visual Studio Code từ đây

Cài đặt Node.js cũng sẽ cài đặt npm trên máy của bạn. Sau khi cài đặt Node.js, hãy mở dấu nhắc lệnh. Chạy bộ lệnh sau để kiểm tra phiên bản của nút và npm được cài đặt trên máy của bạn.

  • node -v
  • npm -v

Tham khảo hình ảnh dưới đây:

Cài đặt CLI gốc

Angular CLI là giao diện Command Line cho Angular. Nó giúp chúng ta khởi tạo, phát triển và duy trì các ứng dụng Angular một cách dễ dàng.

Để cài đặt Angular CLI, hãy chạy lệnh sau trong cửa sổ lệnh:

npm i -g @angular/cli

Điều này sẽ cài đặt Angular CLI 7.0 trên toàn cầu trong máy của bạn. Tham khảo hình ảnh dưới đây:

Để kiểm tra phiên bản CLI góc được cài đặt trong máy của bạn, hãy chạy lệnh sau:

Tham khảo hình ảnh dưới đây:

Tạo ứng dụng Angular 7

Mở Visual Studio Code và điều hướng đến View >> Terminal. Điều này sẽ mở cửa sổ thiết bị đầu cuối mã VS. Ngoài ra, bạn cũng có thể sử dụng phím tắt ctrl+` để mở cửa sổ đầu cuối.

Nhập chuỗi lệnh sau trong cửa sổ terminal. Các lệnh này sẽ tạo một thư mục có tên là “ng7Demo”. Sau đó tạo một ứng dụng Angular với tên “ng7App” bên trong thư mục đó.

  • mkdir ng7Demo
  • cd ng7Demo
  • ng new ng7App

Khi bạn chạy lệnh ng mới, Angular CLI sẽ yêu cầu bạn thực hiện các lựa chọn trong hai tùy chọn sau:

  1. Bạn có muốn thêm định tuyến Angular?(y / N)
  2. Kiểu định dạng nào bạn muốn sử dụng?

Khi bạn chọn các tùy chọn và nhấn enter, ứng dụng Angular 7.0 sẽ được tạo.

Tham khảo Gif dưới đây để hiểu rõ hơn.

Khi ứng dụng được tạo thành công, hãy chạy lệnh sau để mở dự án:

code .

Tham khảo hình ảnh dưới đây:

Điều này sẽ mở tệp mã của ứng dụng của chúng ta trong cửa sổ VS Code. Bạn có thể thấy cấu trúc tệp sau trong Solution Explorer.

Mở tệp pack.json và bạn có thể thấy rằng chúng ta đã cài đặt các gói Angular 7.0.0 mới nhất trong dự án của chúng ta.

{
  "name": "ng7-app",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "~7.0.0",
    "@angular/common": "~7.0.0",
    "@angular/compiler": "~7.0.0",
    "@angular/core": "~7.0.0",
    "@angular/forms": "~7.0.0",
    "@angular/http": "~7.0.0",
    "@angular/platform-browser": "~7.0.0",
    "@angular/platform-browser-dynamic": "~7.0.0",
    "@angular/router": "~7.0.0",
    "core-js": "^2.5.4",
    "rxjs": "~6.3.3",
    "zone.js": "~0.8.26"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~0.10.0",
    "@angular/cli": "~7.0.1",
    "@angular/compiler-cli": "~7.0.0",
    "@angular/language-service": "~7.0.0",
    "@types/node": "~8.9.4",
    "@types/jasmine": "~2.8.8",
    "@types/jasminewd2": "~2.0.3",
    "codelyzer": "~4.5.0",
    "jasmine-core": "~2.99.1",
    "jasmine-spec-reporter": "~4.2.1",
    "karma": "~3.0.0",
    "karma-chrome-launcher": "~2.2.0",
    "karma-coverage-istanbul-reporter": "~2.0.1",
    "karma-jasmine": "~1.1.2",
    "karma-jasmine-html-reporter": "^0.2.2",
    "protractor": "~5.4.0",
    "ts-node": "~7.0.0",
    "tslint": "~5.11.0",
    "typescript": "~3.1.1"
  }
}

Demo thực hiện

Tên của ứng dụng Angular của chúng ta là “ng7App” nằm trong thư mục “ng7Demo” .

Vì vậy, trước tiên chúng ta sẽ điều hướng đến ứng dụng của chúng ta bằng các lệnh dưới đây.

  • cd ng7Demo
  • cd ng7App

Bây giờ, chúng ta sử dụng lệnh sau để khởi động máy chủ web.

  • ng serve

Tham khảo hình ảnh dưới đây:

Sau khi chạy lệnh này, bạn có thể thấy rằng nó đang yêu cầu mở http://localhost:4200 trong trình duyệt của bạn. Vì vậy, hãy mở bất kỳ trình duyệt nào trên máy của bạn và điều hướng đến URL này. Bây giờ, bạn có thể xem trang sau.

Cách nâng cấp lên Angular 7

Nhóm góc đã cung cấp Hướng dẫn Angular Update Guide để đảm bảo nâng cấp mượt mà các phiên bản Angular. Điều hướng đến https://update.angular.io/ để truy cập nó. Nó là một ứng dụng tự giải thích và dễ sử dụng. Nó sẽ chỉ cho bạn các bước mà bạn cần phải làm theo trước khi cập nhật, trong khi cập nhật và sau khi cập nhật. Tham khảo hình ảnh dưới đây:

Nếu bạn muốn cập nhật ứng dụng của mình từ Angular 6 lên Angular 7 thì hãy chạy lệnh sau trong thư mục dự án:

ng update @angular/cli @angular/core

Phần kết luận

Chúng ta đã tìm hiểu về các tính năng mới của Angular 7.0. Chúng ta cũng đã cài đặt Angular CLI 7.0. Để tạo và thực thi một ứng dụng Angular 7.0, chúng ta đã sử dụng Angular CLI và VS Code. Chúng ta cũng đã khám phá phương pháp nâng cấp ứng dụng hiện có lên Angular 7.0.

Bài viết gốc được đăng tải tại Medium

10 điều mọi nhà phát triển ứng dụng Android nên biết về kiến trúc Architecture

10 điều mọi nhà phát triển ứng dụng Android nên biết về kiến trúc Architecture

Người dịch: Dương Đình Tuấn

Architecture trong hướng đối tượng cho ứng dụng có thể được mô tả đơn giản là cách sắp xếp các lớp trong hệ thống và cách thức chúng giao tiếp với nhau. Chúng ta tìm thấy cái nhìn tổng quan về vai trò và nhiệm vụ của các lớp này trong khi tạo ra chúng.

Tuyển lập trình viên android lương up to 30M

Dưới đây là một số điều có thể giúp chúng ta hiểu về kiến trúc này:

1 . Architecture là ngôn ngữ và là nền tảng bất khả tri

Architecture dựa trên các nguyên tắc lập trình. Những nguyên tắc hướng dẫn này có thể là nguyên tắc SOLID hoặc các mẫu thiết kế / architecture ổn định và architecture có thể được áp dụng trên các ngôn ngữ và nền tảng. Nên đầu tư thời gian vào architecture. Nó không chỉ giúp chúng ta thiết kế architecture tốt hơn mà còn cải thiện kỹ năng coding.

2. Sự mơ hồ về MVP / MVVM:

Nhiệm vụ của MVP (Model-View-Presenter) / MVVM (Model-View-ViewModel) là tách UI khỏi code. Chúng ta sử dụng Presenter / ViewModel để loại bỏ hết code logic ra khỏi View (Activity/Fragment). Việc phân tách này liên quan đến VP / VVM nhằm tách ra Model (M), M có nhiệm vụ cung cấp dữ liệu tới Presenter / ViewModel.

Những gì tôi thường thấy là PresenterViewModel được implement một cách chuẩn với các interfaceobserver nhưng ngoài ra nó còn khá rối. Tôi nghĩ rằng điều này có thể đổ lỗi cho việc sử dụng VP / VVM cho toàn bộ architecture của một ứng dụng và không thể định hình được Model (M). MVP / MVVM đóng một vai trò quan trọng như một mẫu kiến trúc nhưng kiến trúc của một ứng dụng vượt xa sự phân tách UI.

  1. Architecture rất quan trọng nhưng không cần thiết:

Việc học Architecture đến ở giai đoạn sau trong quá trình phát triển của một dev Android. Một trong những lý do là các ứng dụng của chúng ta có thể hoạt động tốt hơn ngay cả khi không có architecture nào, vậy tại sao phải mất thêm thời gian? Làm thế nào chúng ta sẽ thuyết phục sếp / khách hàng của mình rằng cần thêm thời gian để chúng ta dành cho việc này và có thể không có bất kỳ lợi ích nào ngay lập tức?

Chỉ sau một vài phiên bản, chúng tôi nhận ra sự lộn xộn nhưng sau đó đã quá muộn. Khi chúng ta tiếp tục gặp rắc rối hết lần này đến lần khác, chúng ta mới bắt đầu hiểu được sự cần thiết của architecture.

  1. Architecture cải thiện khả năng thay đổi:

Architecture sẽ rất quan trọng nếu chỉ có một phiên bản được phát hành cho  ứng dụng. Trong thực tế, đây là cách tiếp cận mà nhiều người trong chúng ta thực hiện, đó là  điều thiển cận khi phát triển ứng dụng.

Nếu tôi phải chỉ ra lợi ích lớn nhất của việc có một Architecture phù hợp thì đó sẽ là sự dễ dàng sửa đổi và hiệu quả của nó mang lại.

Sự thật là chúng ta không thể thấy trước mọi thứ mà ứng dụng có thể phát triển trong tương lai nhưng một Architecture tốt có đủ sự linh hoạt để điều chỉnh theo những thay đổi chưa biết này đấy.

  1. Architecture không đòi hỏi kiến thức đặc biệt:

Đối với một dev giỏi, thiết kế Architecture xuất hiện một cách tự nhiên. Điều này hơi liên quan ở luận điểm #1 nhưng nó rất quan trọng vì vậy tôi nghĩ nên sửa nó một chút và trình bày lại 😃

Dagger / RxJava hoặc bất kỳ công cụ nào khác yêu cầu chúng ta tìm hiểu những công cụ của nó. Trong trường hợp architecture, nó chỉ là các nguyên tắc và hướng lập trình. Chúng ta càng trở nên giỏi về code thì càng dễ hình dung được kiến trúc của một ứng dụng.

  1. Architecture đòi hỏi kỷ luật và sự kiên nhẫn

Architecture giống như một cái cây. Chúng ta không thể nhận được quả vào ngày chúng ta trồng nó. Phải mất thời gian và công sức để thiết kế một architecture và nó là một quá trình vẫn đang tiếp diễn. Mỗi thay đổi trong ứng dụng sẽ yêu cầu một quyết định cẩn thận trước khi thực hiện.

Thiệt hại lớn đến architecture của ứng dụng là khi chúng ta bắt đầu dùng phím tắt. Những cam kết trên (để làm sạch code sau này) cuối cùng bị phá vỡ hết lần này đến lần khác.

Chúng ta cần phải hiểu những gì chúng ta đang nhận được nếu không nó sẽ là một khởi đầu tuyệt vời và cuối cùng để mất sau này. Architecture  phải liên kết với vòng đời của một ứng dụng.


  1. Google Architecture components:

Năm 2017 Google đã giới thiệu Architecture Components. Architecture component chỉ để chuyển từ Activity / Fragment sang ViewModel. Các “Architecture” components có sẵn để tạo điều kiện cho chúng ta thiết kế kiến trúc của ứng dụng. Các thành phần này giúp dễ dàng thực hiện kiến trúc  này mà nếu không có thì sẽ là một công việc khó khăn.

Ví dụ như LiveData giúp dễ dàng quan sát các thay đổi trong dữ liệu vốn là thứ liên quan tới vòng đời của Activity/Fragment. Người ta có thể thấy ViewModel như một cách để lưu lại thay đổi nhưng ý nghĩa thực sự của nó là giúp chúng ta tách UI khỏi logic.

  1. Chúng ta không cần phải  trở thành một kiến trúc sư phần mềm Software Architect:

Mọi kiến trúc sư phần mềm là một dev nhưng không phải mọi dev đều là một kiến trúc sư. Trong một tổ chức lớn sẽ có chỉ định rõ ràng các kiến trúc sư phần mềm. Đối với họ, điều cần thiết là phải có kiến thức sâu rộng về các mẫu kiến trúc khác nhau và cách chúng vận hành.

Trong vai trò một dev, điều này giúp  có một cái nhìn về architecture để chúng ta có thể hiểu được các khái niệm trừu tượng được triển khai. Điều này trở nên quan trọng hơn nếu chúng ta đang làm việc tự do hoặc trong một công ty startup với nguồn lực hạn chế.  Trong trường hợp như vậy, sẽ có đủ kiến thức cơ bản về architecture.

Có nhiều mẫu và nguyên tắc đơn giản mà chúng ta có thể áp dụng để tạo ra một architecture tốt cho ứng dụng của mình mà không đi quá sâu vào thế giới architecture.

  1. Lợi ích của architecture:

Như đã đề cập trước đó, một trong những lợi thế là tính dễ thay đổi. Thêm các tính năng và sửa  mới trở nên dễ dàng và nhanh chóng nếu các thành phần được phân tách hợp lý và giao tiếp một cách có tổ chức. Sự tách biệt này dẫn đến nhiều lợi thế khác như khả năng kiểm tra, trong đó chúng ta có thể dễ dàng kiểm tra các thành phần độc lập.

  1. Bắt đầu từ đâu?

Architecture có ở khắp mọi nơi, hệ thống nhúng, ứng dụng web, phần mềm doanh nghiệp, ứng dụng điện thoại di động, v.v … Mỗi loại yêu cầu một kiểu kiến trúc khác nhau. Nếu chúng ta không muốn trở thành kiến trúc sư phần mềm, chúng ta phải cần chọn lọc thứ chúng ta muốn triển khai.

Để hiểu nhu cầu về architecture và việc triển khai nó thì cách tốt nhất là nên nghiên cứu Clean Architecture của Robert C. Martin (còn gọi là Uncle Bob) và một chút chuyên sâu là Domain-Driven Design: Tackling Complexity in the Heart of Software của Eric Evans.

Google cung cấp hướng dẫn về architecture của ứng dụng với sự liên kết theo một hướng nhưng đó là mức vừa đủ. Khi bạn đã nắm bắt được thứ bạn có thể triển khai một mẫu architecture  phân lớp thông qua hướng dẫn của Clean Architecture. Cách tiếp cận này dễ dàng và sẽ phù hợp với hầu hết các ứng dụng. Tôi đã tạo ra một ứng dụng mẫu theo các nguyên tắc này. Đây là repo Github của ứng dụng mẫu này.

Nếu bạn chưa quen với lập trình, tôi khuyên bạn nên bắt đầu với các nguyên tắc SOLID vì chúng sẽ giúp bạn sẵn sàng cho architecture 😉

TopDev via Medium

Tham khảo thêm các công việc ngành it khác tại Topdev

Tuyệt kỹ: Sử dụng cache để tăng tốc hệ thống

Bài viết của tác giả: Thanh Tú Phạm

Bạn đã bao giờ sử dụng cache để tăng tốc hệ thống?

Nếu dùng redis nó đã cung cấp cho bạn những cấu trúc cơ bản như hash, string, list, set, zset. Tuy nhiên bạn sẽ gặp 2 vấn đề, 1 là invalidate cache ko đơn giản, nhất là phải tính đến việc snapshot rồi replicas, 2 là khi object quá lớn, performance giảm đi nhanh chóng do vấn đề về ram và lạm dụng embeded objects.

Nếu tự tin về cấu trúc dữ liệu và giải thuật + lập trình mạng, bạn có thể build được hệ thống cache phục vụ cho mục đích riêng tối ưu hơn redis nhiều, lưu cả triệu tỉ dữ liệu, strong consistency, và tốc độ cao.

Bài dưới đây giúp bạn build được 1 database lưu 1 cấu trúc dữ liệu json bất kỳ, nhưng cho phép cập nhật được 1 value bất kỳ và truy vấn nó trực tiếp mà không cần phải serialize lẫn deserialize.

Từ đó giúp bạn build được các model dựa trên 1 object khổng lồ mà ko phải bận tâm đến các lệnh join where đau đầu của cơ sở dữ liệu truyền thống. Bởi vì bạn biết rằng, 1 object bất kỳ nó chỉ có 2 kiểu, list và hash, cuối cùng value là primative type mà thôi.

Sử dụng cache để tăng tốc hệ thống

Vấn đề là flattern nó ra, nhờ sự hỗ trợ của cấu trúc tree, tức cơ bản chúng ta cần list, tree và hash là đủ để mô phỏng lại datastructure lưu trong ram, từ đó giải quyết trực tiếp bài toán mà ko cần phải nghĩ đến lưu trữ database, ở dạng tự nhiên nhất.

– Xét về lưu trữ trong database, về cơ bản là gồm meta lưu chỉ mục và phần dữ liệu, meta thường là dạng các đoạn bytes chứa chuỗi key và phần còn lại chứa offset value đọc vào file value, nếu key lớn thường padding để chia hết cho 1 chunk size cố định.

Xét cơ bản nhất chúng ta cần lưu key-value, key đã được sắp xếp với btree, còn value thuần bytes, với cơ sở dữ liệu quan hệ value có thể gồm các đoạn byte liền nhau theo schema. Lý do ram đọc nhanh vì nó random access theo key từ hash được (bản chất là dùng mảng rồi hash(key) ra index là number), còn trên file phải tìm tuần tự, với btree nó giúp ích rất nhiều rồi.

– Bây giờ chúng ta sẽ ứng dụng 1 db key/value cơ bản như leveldb, về mặt xử lý nó sẽ giống kiểu sắp xếp merge file lớn bằng cách phân tán trên nhiều nodes, rồi chia tiếp trên mỗi node để fit vào ram, ở đây chúng ta sẽ tận dụng cấu trúc key/value trên 1 db duy nhất để build 1 tầng cache rồi sau đó flush cache này vào batch để update database.

Tham khảo thêm các vị trí tuyển dụng web developer lương cao tại Topdev.

2 cách commit để flush cache khi cache đầy

Có 2 cách 1 là chủ động gọi commit để flush cache khi cache đầy, 2 là dùng 1 lru-less recent used để quản lý cache hit, truy cập nhiều thanh ghi nhanh và đưa item ít truy cập ra thanh ghi chậm hơn và xoá hẳn, khi đó cần pre-images hay có thể coi là transaction logs để đẩy vào database, 1 dạng batch có thể get value nếu cache miss và chưa update db.

– Như trên thì việc quản lý cache và lưu trữ khá ổn, nhưng chúng ta ko chỉ lưu mỗi key-value, chúng ta cần lưu thêm các cấu trúc mở rộng khác, hầu hết sẽ là linked list – mô phỏng list trong ram, và tree – mô phỏng 1 json object trong ram.

Lúc này sẽ nẩy sinh vấn đề là conflict key giữa các cấu trúc, và ta sẽ giải quyết đơn giản bằng tính hash của tên object cần lưu + key của nó, sử dụng big.Int. Ví dụ lưu list tên là a, chèn thêm 1 object tên là b, thì key lưu vào sẽ là hash(a) + b. Để lưu được các cấu trúc như list và tree, cơ bản chúng ta cần meta ví dụ list là next key và back key, với tree là left key và right key, parent key, nếu lấy hash 32 bytes làm chuẩn, key length > 32 thì tính hash, chúng ta có thể dùng 64 và 96 byte đầu tiên lưu meta, còn lại là value.

Như vậy không phải serialize gì cả, đọc trực tiếp luôn giống như cơ sở dữ liệu quan hệ vậy, các key/value db hầu hết hỗ trợ đọc offset:limit của value luôn, mặc định nó đọc hết từ meta value của key lấy ra offset limit.

– Phần cuối cùng, đó là phân tán, lẫn strong consistency, về phân tán thì chúng ta sử dụng kademlia routing giống bittorrent, khi lưu batch thì chúng ta broad cast toàn mạng và các node cùng bucket sẽ đồng bộ dữ liệu, cơ bản cài đặt kiểu p2p protocol.

Còn để strong consistency chúng ta có 2 cách, 1 là theo checkpoint giống blockchain, tức block number, đóng gói lại thông tin root key lần gần nhất, và ko được thay đổi, cái này hợp giao dịch vì đã chuyển tiền là ko có sai lệch tài khoản được.

Cách thứ 2 là theo epoch, tức là 1 thời điểm nào đó với 1 duration nào đó sẽ strong consistency, lúc ấy trước khi truy vấn phải lấy về epoch và timeout sẽ ko có dữ liệu, còn pending sẽ đợi, từ đó có thể dựa vào tần suất update để loại những node ít update khi truy vấn latest item.

– Tổng hợp các ý trên bạn có thể build hệ thống cache cực lớn, ăn ít ram nhờ chung 1 db key-value duy nhất, tốc độ cao, và vẫn invalidate cache dễ dàng, nếu dựa vào hash làm reference của object tương tự reference trong bộ nhớ.

Cài đặt Ở đây

Buils một ứng dụng thời tiết sử dụng AngularJS

Người viết: Đinh Quốc Hội

Xin chào các bạn, bây giờ một ngày hầu hết mọi người thích xem báo cáo thời tiết của các thành phố cụ thể của họ. Vì vậy, tất cả mọi người có thể có nghi ngờ rằng làm thế nào các ứng dụng thời tiết được thực hiện / phát triển và khái niệm chính đằng sau này là gì. Vì vậy, không cần phải lo lắng và suy nghĩ về điều đó nhiều, bởi vì trong bài viết này, chúng ta sẽ xem làm thế nào chúng ta có thể phát triển ứng dụng Weather của riêng mình bằng cách sử dụng Angular JS.

Trước khi nói điều này, ta chỉ muốn thông báo cho bạn rằng bạn nên biết về Angular JS, REST Full API và JSON. Nếu bạn không biết về những công nghệ này, tôi sẽ chia sẻ một số tài liệu tham khảo và sau này tôi sẽ viết blog trên các công nghệ này, để bạn có thể có được một số ý tưởng.

Sau đây là các bước để phát triển Ứng dụng thời tiết bằng Angular JS

  • Nhận một WebService API thời tiết được cung cấp bởi bất kỳ nhà cung cấp dịch vụ nào.
  • Thiết kế một mẫu HTML.
  • Logic để xử lý API và hiển thị dữ liệu trên mẫu

Tham khảo cách sử dụng AngularJS tại đây

Bước 1: (Lấy API thời tiết)

Trong bước này, chúng ta cần có API thời tiết.

API thời tiết là gì: API thời tiết là dịch vụ, có một số chức năng hoặc phương pháp để cung cấp dữ liệu thời tiết (dưới định dạng JSON hoặc XML) của một vị trí cụ thể.

Cách nhận API thời tiết: Có rất nhiều nhà cung cấp dịch vụ để cung cấp báo cáo Thời tiết. Trong ví dụ này, chúng ta sẽ sử dụng API thời tiết do Openweathermap cung cấp.

Cách sử dụng API thời tiết: Nhà cung cấp dịch vụ API thời tiết cung cấp URL (ví dụ: URL API thời tiết). Khi chúng ta gọi URL, chúng ta sẽ nhận được một số dữ liệu ở định dạng cụ thể (ví dụ: JSON, XML, v.v.). Trong ví dụ này, chúng ta sẽ sử dụng dữ liệu định dạng JSON. Sau khi nhận được dữ liệu của bất kỳ định dạng nào, chúng ta cần viết logic để hiển thị dữ liệu trên Mẫu HTML. Sau đây là chi tiết về API thời tiết và cách sử dụng của nó cho ví dụ này,

Truy cập vào links https://home.openweathermap.org/api_keys đăng nhập và lấy api_keys. 

Chúng ta cần gọi URL sau: 

https://api.openweathermap.org/data/2.5/weather?appid=e89c7405a5f0c2f6ac5d813233606e24&units=metric&q=saigon

Màu đỏ là links api;

Màu cam (appid) là links api_key.

màu xanh dương (&units) :lấy nhiệt độ °C

Màu tím (&q=saigon): Thành phố

Truy cập vào link chúng ta sẽ có chuỗi json như sau:

Bây giờ những gì chúng ta phải làm là, chúng ta cần hiển thị các dữ liệu JSON này trong mẫu HTML. Làm thế nào để hiển thị dữ liệu JSON, chúng ta sẽ thấy trong các bước tiếp theo.

Bước 2: (Thiết kế mẫu HTML)

Sau đây là mã HTML để thiết kế mẫu, ở đây trong mẫu này, chúng ta cũng sẽ sử dụng biểu thức AngularJS để hiển thị dữ liệu. các bạn có thể tùy chỉnh css riêng cho đẹp hơn.

Tóm tắt về nội dung HTML 
1. Khai báo ng-app và ng-controller trong thẻ

<div ng-app = "MyApp" ng-controller = "MyCont"> 

mục đích là để thẻ <div sẽ nhận được dữ liệu từ từ các đoạn code xử lý bên angularjs truyền vào

2. Khai báo 1 ô input để nhập tên thành phố vào với directive ng-model = "cityName"

<input type = "text" ng-model = "cityName" id = "textData" placeholder = "Enter Your City Name">

và 1 button có sự kiện ng-click = "funGet()"  khi click sẽ hiển thị tên nhiệt độ tại thành phố đó.

<input class = "myBtn" type = "button" value = "GetDetails" ng-click = "funGet()">

3. Hiển thị dữ liệu ,các thành phần để hiển thị dữ liệu sẽ nằm trong  {{ name }}

các phần hiển thị nhiệt độ sẽ xử dụng filter numer có thành phần thập phân với độ dài là 1

{{ tmp | number : 1 }}

Có thể tham khảo thêm tại đây

Bước 3: Xử lý API và hiển thị dữ liệu trên mẫu HTML

Trong bước này, chúng ta sẽ viết logic để xử lý API thời tiết và hiển thị dữ liệu cuối cùng trên mẫu HTML được thiết kế ở bước trên. Về cơ bản chúng ta sẽ viết logic này bên trong bộ điều khiển như sau,

1. Khai báo tên ng-app var app = angular.module('MyApp', []);

Khai báo tên ng-controlllerMyCont và truyền vào 2 tham số $scope,$http app.controller('MyCont', function($scope, $http)

2. Code xử lý sự kiện khi click button ,tạo 1 biến url chứa links api và kết hợp nối chuỗi với $scope.cityName để nối với tên thành phố và sử dụng get để lấy dữ liệu và trả về html.

3. Nhìn vào dữ liệu ở dạng json ta sẽ lấy các trường như: temp,temp_min,temp_maxicon để hiển thị hình ảnh.

temp sẽ là nhiệt độ trung bình

để có chút khác biệt ở temp_mintemp_max,  ta sẽ lấy temp_min -1temp_max +1 để chênh lệnh nhau 1 °C 

Sau đây là code Angular js xử lý.

Code tổng quát :

Kết quả:

Chú thích :

Cấu trúc thư mục của bạn phải như sau

WeatherApp

          |

          |

          | —————–> index.html (Mã được đề cập trong Bước 1)

          |

          | —————–> script.js (Mã được đề cập trong Bước 2)

          |

Trong bài viết này, chúng ta chỉ thấy Ứng dụng thời tiết cơ bản với một số tính năng cơ bản, sau này tôi sẽ viết về một số tính năng nâng cao.

Reference: devinfo99.blogspot.com

Tạo và xuất bản một thư viện cho Android

Tạo và xuất bản một thư viện cho Android

Tác giả: Ahmed Dawoud

Tôi đã luôn muốn tạo ra một thư viện và “ đóng góp vào mã nguồn mở”, nhưng từ đó đến  giờ chưa thực sự có bất cứ thứ gì giá trị để đóng góp cả, cho đến khi tôi cần tự xuất bản một thư viện của mình , vì vậy, đây là hướng dẫn về cách làm và xuất bản thư viện!

Hiện tại  tôi đang làm việc trong một project mà tôi phải thực hiện một công cụ có thiết lập thời gian, vì vậy suy nghĩ đầu tiên của tôi là hiển thị hộp thoại TimePicker và sau khi người dùng đã chọn  Start Time, tôi sẽ hiển thị một mục khác trong đó để họ có thể chọn End Time.

Mặc dù điều này ổn, nhưng nó vô cùng tẻ nhạt đối với người dùng vì họ phải nhớ thời gian họ chọn và họ sẽ khó  truy cập trong trường hợp muốn thay đổi lại. Hơn nữa, tôi đã thấy đuối đối với các phương thức callback, bởi lẽ tôi chỉ có thể hiển thị hộp thoại thứ hai sau khi người dùng hoàn tức hộp thoại đầu tiên và tức nhiên tôi đã phải lưu thời gian được chọn này ở đâu đó, …

Từ đây, thư viện nhỏ của tôi, bottomSheetTimeRangePicker đã ra đời (tên nghe dài dòng đến nực cười, tôi biết!). Nó hiển thị một bottomSheetDialogFragment có hai tab, mỗi tab có TimePicker riêng, nơi người dùng có thể chọn giới hạn thời gian mong muốn và tùy ý thay đổi trước khi nhấn vào “Done”.

Tuyển dụng android đi làm gấp trong tháng

Tốt rồi, nhưng làm thế nào để bạn làm một thư viện?

Một thư viện về cơ bản là chỉ một project Android, khác ở việc đóng gói. Nó có thể bao gồm mọi thứ mà module làm, như các tệp tài nguyên(resource files), Android manifest và thậm chí cả các thành phần có liên quan bên ngoài. Tuy nhiên, thay vì biên dịch thành APK chạy trên thiết bị, nó sẽ biên dịch thành một file Android Archive (AAR) mà bạn có thể sử dụng như dependency cho module ứng dụng Android.

Để tạo module thư viện trong Android Studio, bạn chỉ cần thực hiện việc như sau:

  • Click File > New > New Module.
  • Trong cửa sổ Create New Module, chọn Android Library, sau đó chọn Next.
  • Đặt tên cho thư viện và chọn phiên bản SDK tối thiểu để code trong thư viện, sau đó nhấp vào Finish.

Đợi Gradle sync, sau đó module thư viện mới của bạn sẽ xuất hiện phía bên trái của bảng. Xin chúc mừng!

Bạn có thể tìm hiểu thêm qua các tài liệu chính thức ở đây

Ok, làm thế nào để tôi xuất bản thư viện này?

Có nhiều cách để phân phối, vì vậy, đây là một vài trong số đó

1. Jitpack

Đây có lẽ là một trong những cách dễ dàng nhất. Bạn đăng nhập bằng tài khoản Github của mình, thêm repo  và thế là bạn đã cài đặt rồi đó!

2. jCenter

jCenter () là một kho lưu trữ trung tâm được của Bintray và để xuất bản thư viện của bạn ở đó, bạn sẽ phải tạo một tài khoản trên bintray. Nếu bạn lên kế hoạch xuất bản một thư viện mã nguồn mở, bạn có thể đăng ký tài khoản miễn phí tại đây. Mặt khác, bạn có thể xem xét các gói trả phí  để lưu trữ vào các kho riêng.

Thêm một kho lưu trữ mới để lưu trữ dự án của bạn

Kho lưu trữ mới sẽ xuất hiện trên tài khoản của bạn. Mở nó và thêm vào package mới

Tạo một package bên trong kho lưu trữ mới của bạn

Nhận khóa API

Tiếp theo, bạn cần lấy khóa API để sử dụng nó để đưa thư viện của bạn từ Android Studio lên kho lưu trữ. Truy cập https://bintray.com/profile/edit và chọn API Key từ menu bên trái.

Đã gần xong rồi! Tất cả những gì bạn cần làm lúc này là thêm một số tập lệnh Gradle cho thư viện

Thêm tên người dùng và khóa API của bạn vào tệp local.properIES của bạn

Mở tệp local.properIES (đảm bảo rằng nó đã được thêm vào .gitignore!) và thêm vào như sau:

user=yourUsername
apiKey=yourApiKey

Thêm các plugin Bintray và Maven Gradle vào project của mình

Trong file build.gradle, hãy thêm vào dependencies các liên kết này vào buildscript

dependencies {
       classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4'
       classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
}

Tạo script để upload  thư viện của bạn lên Bintray

Nhờ thuộc tính module Gradle, chúng tôi có thể trích xuất tất cả các script cần thiết để thực hiện việc này và đặt chúng vào một file duy nhất. Trong gói thư viện của bạn, tạo một file mới gọi là Publish.gradle và dán code này vào đó.

apply plugin: 'maven-publish'
apply plugin: 'com.jfrog.bintray'

version '1.0' // your library version
group 'com.adawoud' // whatever group name you'd like

publishing {
    publications {
        Production(MavenPublication) {
            artifact("$buildDir/outputs/aar/bottomsheettimerangepicker-release.aar") // replace with your library name
            groupId this.group
            artifactId 'bottomsheettimerangepicker' // replace with your library artifact id
            version this.version

            pom.withXml {
                def dependenciesNode = asNode().appendNode('dependencies')

                // Iterate over the implementation dependencies (we don't want the test ones),
                // adding a <dependency> node for each
                configurations.implementation.allDependencies.each {
                    // Ensure dependencies such as fileTree are not included in the pom.
                    if (it.name != 'unspecified') {
                        def dependencyNode = dependenciesNode.appendNode('dependency')
                        dependencyNode.appendNode('groupId', it.group)
                        dependencyNode.appendNode('artifactId', it.name)
                        dependencyNode.appendNode('version', it.version)
                    }
                }
            }
        }
    }
}

bintray {
    user = project.hasProperty('user') ?: System.getenv('BINTRAY_USER')
    key = project.hasProperty('apiKey') ?: System.getenv('BINTRAY_API_KEY')
    publications = ['Production']
    configurations = ['archives']
    // Default: false. Whether to run this as dry-run, without deploying
    dryRun = false
    // Default: false. Whether to override version artifacts already published
    override = false
    // Default: false. Whether version should be auto published after an upload
    publish = true
    pkg {
        repo = 'BottomSheetTimeRangePicker' // the name of the repository you created on Bintray
        name = 'com.adawoud.bottomsheettimerangepicker' // the name of the package you created inside it
        version {
            name = this.version
            released = new Date()
            vcsTag = this.version
        }
    }
}

Sau đó, trong file build.gradle, hãy thêm dòng code sau vào dưới cùng: apply from: 'publish.gradle'

Điều duy nhất bạn cần quan tâm trong file này là ba dòng: groupId, artifactId, version. Đồng thời, chúng tạo liên kết đến thư viện của bạn, vì vậy người dùng có thể tải xuống bằng cách này:

implementation 'groupId:artifactId:version’

Upload lên Bintray

Điều cuối cùng còn lại phải làm là xuất bản thư viện mới của bạn lên bintray để  người khác có thể sử dụng nó. Vì vậy, build project của mình, kích hoạt terminal trong Android Studio và gõ lệnh này:

Nếu bạn dùng Windows

gradlew bintrayUpload

Nếu bạn dùng Linux / Mac

gradle bintrayUpload

Chỉ vậy thôi! Thư viện của bạn hiện đã được xuất bản và  người khác có thể sử dụng nó. Tôi hy vọng bạn cảm thấy hữu ích qua bài này. Bạn có thể xem code vận hành  trong thư viện của tôi ở đây.

Bài viết gốc được đăng tải tại Medium

Xem thêm các vị trí tìm việc ngành cntt khác tại đây

SQL Series: 5 mẹo dành cho SQL

1. Giữ tên cột và bảng đơn giản

  • Sử dụng một từ cho tên bảng thay vì hai. Nếu bạn cần sử dụng nhiều từ, hãy sử dụng dấu gạch dưới thay vì dấu cách hoặc dấu chấm.
  • Có dấu chấm “.” trong tên của các object sẽ gây nhầm lẫn giữa tên lược đồ và cơ sở dữ liệu. Mặt khác, sử dụng spaces có nghĩa là bạn cần phải thêm dấu ngoặc kép trong truy vấn của mình để cho nó có thể chạy.
  • Giữ tên cột và bảng được nhất quán bằng chữ thường để người dùng không phải nhầm lẫn nếu bạn chuyển sang cơ sở dữ liệu phân biệt chữ hoa chữ thường.

Tìm việc làm SQL mới nhất trong tháng

2. Xử lý vấn đề ngày, tháng, năm trong SQL

  • Chuyển đổi date thành datetime biểu để cải thiện hiệu suất.
  • Sẽ khó hơn khi làm việc với các ngày được lưu trữ dưới dạng chuỗi vì thế hãy đảm bảo những chúng không bao giờ được dùng để biểu thị ngày tháng.
  • Không chia nhỏ năm, tháng và ngày thành các cột riêng biệt. Điều này khiến cho các truy vấn khó viết và lọc hơn nhiều.
  • Luôn sử dụng UTC cho múi giờ của bạn. Nếu bạn có sự kết hợp giữa UTC và non-UTC, điều đó sẽ khiến cho việc hiểu dữ liệu khó khăn hơn nhiều.

3. Hiểu rõ thứ tự execute và chạy Query

  • Việc hiểu thứ tự truy vấn có thể giúp bạn hiểu cách truy vấn hoạt động cũng như lí do vì sao truy vấn của bạn sẽ không chạy.
FROM – Includes JOINs so consider using a CTE or subquery to do filtering first. 
WHERE - To limit the joined dataset. 
GROUP BY – Collapses fields down with aggregate functions (COUNT, MAX, SUM, AVG) 
HAVING - Performs the same function as the WHERE clause with aggregate values.
SELECT - Specifies values and aggregations remaining in the set after grouping.
ORDER BY – Returns the table sorted by a column or multiple columns. 
LIMIT – Specifies how many rows to be returned to avoid returning too much data.

4. Các hạn chế của NULL

  • NULL có nghĩa là giá trị không xác định, không phải 0 và không phải bị bỏ trống. Điều này làm cho nó khó so sánh các giá trị nếu bạn muốn so sánh NULL với NULL. Tùy thuộc vào những gì bạn đang yêu cầu mã của mình để làm sẽ ảnh hưởng đến chiến lược bạn cần phải thực hiện. Đọc thêm về NULL và cách giải quyết vấn đề tại đây.

5. Biết cách tạo bảng

  • Khi tạo bảng từ một bảng, hãy sử dụng `SELECT TOP 0` để tạo cấu trúc của bảng trước khi chèn dữ liệu vào.
  • Dù nó phải mất tới hai bước thay vì một nhưng bù lại sẽ giúp giảm thời gian xử lý.
insert into <table name2>
select [ID] ,
[CreatedDate] ,
[RegionName] ,
[SalesPerson]
from <table name1 >
  • Nếu bạn muốn cập nhật một bảng với dữ liệu mới, hãy sử dụng lệnh `TRUNCATE`. Nó sẽ xóa tất cả các hàng khỏi bảng mà không xóa định dạng và tiêu đề
truncate table <table name1> -- deletes the contents of the table


insert into <table name1>
select
[ID] ,
[CreatedDate] ,
[RegionName] ,
[SalesPerson]
from ...

Làm thế nào để tạo một bảng BI Dashboard bằng cách sử dụng một bảng Pivot và một thư viện biểu đồ?

Tác giả: Veronika Rovnik

Khi suy nghĩ về phân tích dữ liệu , có lẽ dữ liệu bảng tính là điều đầu tiên xuất hiện trong đầu bạn. Nhưng phân tích dữ liệu không chỉ là số lượng và văn bản khô. Nếu được tiếp cận chính xác và kết hợp với các thành phần trực quan , phân tích có thể thay đổi hoàn toàn cách bạn đang kinh doanh và mang nó đến một cấp độ phát triển mới.

Bất kể ngành công nghiệp bạn đang làm việc là gì, tôi chắc chắn rằng việc hình dung dữ liệu thuộc về các kỹ năng hàng đầu cần thiết trong thị trường lao động. Đó là lý do tại sao hôm nay tôi muốn mô tả cách tối đa hóa tiềm năng của bài trình bày của bạn với sự trợ giúp của việc xoay vònglập biểu đồ.

Thực hiện theo các nguyên tắc này, cuối cùng, bạn sẽ tìm hiểu cách tạo trang tổng quan tương tác với bảng tổng hợp và biểu đồ. Trong trường hợp của chúng ta, sự tương tác đơn giản có nghĩa là tất cả các thay đổi được áp dụng cho báo cáo sẽ được phản ánh trong các biểu đồ ngay lập tức.

Kỹ thuật hiển thị dữ liệu này giúp đạt được báo cáo hiệu quả và đưa ra quyết định sáng suốt.

Những điều cần nhớ trước khi bạn bắt đầu

Hãy để tôi cung cấp cho bạn một số mẹo về trực quan hóa:

  • Chọn công cụ để tóm tắt dữ liệu của bạn.
  • Chọn biểu đồ đúng và sử dụng các mẫu màu tự nhiên.
  • Biết tên miền và đối tượng của bạn để truyền đạt thông tin quan trọng.

Toàn bộ quá trình khá đơn giản và bạn chỉ cần biết những điều cơ bản về JavaScript để bắt đầu . Tôi sẽ cung cấp cho bạn mã code mẫu. Nếu bạn muốn nhận kết quả ngay lập tức, hãy kiểm tra bản demo CodePen ở cuối bài viết.

>>> Xem thêm: Codepen là gì ? Hướng dẫn sử dụng Codepen cơ bản

Công cụ cho Analytics

Chúng ta sẽ sử dụng các công cụ sau cung cấp tóm tắt dữ liệu và khả năng hiển thị:

  1. Bảng tổng hợp Flexmonster – thành phần bảng tổng hợp được làm giàu với cả tính năng báo cáo cơ bản và nâng cao – tổng hợp, lọc, sắp xếp, xuất và tùy chỉnh được tích hợp sẵn. Được viết bằng JavaScript, nó có thể được nhúng vào một ứng dụng một cách dễ dàng.
  2. Google Charts – một dịch vụ web chứng tỏ là một trong những công cụ tạo biểu đồ phổ biến nhất. Nó đơn giản để sử dụng do một API dễ hiểu. Có một danh sách đầy đủ các loại biểu đồ có sẵn có thể được tùy chỉnh theo bất kỳ yêu cầu thiết kế nào.

Bước 1 : Chuẩn bị dữ liệu của bạn

Trong hướng dẫn này, chúng ta viết một hàm trả về một mảng các đối tượng JSON.

Dưới đây là ví dụ về tập dữ liệu tiếp thị của tôi:

function getData() {
    return [{
            "Channel": "Organic Search",
            "Date": "2018-08-01",
            "Session": "Mobile",
            "Time on Site (seconds)": 980,
            "Country": "Canada"
        },
        {
            "Channel": "Organic Search",
            "Date": "2018-08-01",
            "Session": "Desktop",
            "Time on Site (seconds)": 230,
            "Country": "France"
        },
        //
    ]

Ở giai đoạn này, tôi khuyến khích bạn chọn dữ liệu của riêng bạn.

Bước 2: Xác định báo cáo trong bảng

Tôi đã làm theo hướng dẫn trong hướng dẫn Flexmonster có vẻ thân thiện với người mới bắt đầu. Kết quả – thành phần được xây dựng trong dự án của tôi.

Bây giờ là lúc để trả lời những gì bạn muốn xem trên lưới và trong biểu đồ .

Trong báo cáo này, tôi muốn phân loại các phiên trên trang web của mình theo lưu lượng truy cập và xem có bao nhiêu phiên trong một khoảng thời gian nhất định. Ngoài ra, tôi muốn kiểm tra phần trăm thời gian mà người dùng đã sử dụng trên trang web.

Hãy chuẩn bị lát cho báo cáo.

Đặt các trường vào cột, hàng, số đo và xác định hàm tổng hợp cho các số đo.

var pivot = new Flexmonster({
            container: "pivot-container",
            componentFolder: "https://cdn.flexmonster.com/",
            toolbar: true,
            report: {
                dataSource: {
                    data: getData()
                },
                formats: [{
                    maxDecimalPlaces: 2
                }],
                "slice": {
                    "rows": [{
                            "uniqueName": "Channel"
                        },
                        {
                            "uniqueName": "Country"
                        }
                    ],
                    "columns": [{
                            "uniqueName": "[Measures]"
                        },
                        {
                            "uniqueName": "Date.Year"
                        }
                    ],
                    "measures": [{
                            "uniqueName": "Session",
                            "aggregation": "count"
                        },
                        {
                            "uniqueName": "Time on Site (seconds)",
                            "aggregation": "percent"
                        }
                    ]
                },

            });

Bước 3 : Kết nối với Google Charts

Thứ nhất, thêm bộ nạp của Google Charts bằng cách bao gồm các tập lệnh của nó vào trang web. Thứ hai, thêm trình kết nối của Flexmonster:

<script src="https://www.gstatic.com/charts/loader.js"></script>
<script src="flexmonster/lib/flexmonster.googlecharts.js"></script>

Thêm đoạn mã sau đây để tải các gói và thiết lập một cuộc gọi lại để biết khi nào các biểu đồ được tải:

google.charts.load('current', {'packages':['corechart']});
google.charts.setOnLoadCallback(onGoogleChartsLoaded);

Bước 4 : Gửi dữ liệu đến biểu đồ

Bây giờ hiển thị dữ liệu từ lưới trong biểu đồ bằng cách sử dụng phương thức flexmonster.googlecharts.getData () . Nó thực hiện việc xử lý trước dữ liệu cho một loại biểu đồ nhất định. Chuyển các hàm gọi lại đến phương thức này được kích hoạt khi dữ liệu được tải vào bảng hoặc được cập nhật.

Xác định các hàm chịu trách nhiệm tạo và vẽ biểu đồ. Đừng quên chọn loại của nó:

function createGoogleChart() {
    if (googleChartsLoaded) {
        pivot.googlecharts.getData({
                type: "column"
            },
            drawChart,
            drawChart
        );
    }
}

function drawChart(_data) {
    var data = google.visualization.arrayToDataTable(_data.data);
    var options = {
        title: "Values by Categories",
        legend: {
            position: 'top'
        }
    };
    var chart = new
    google.visualization.ColumnChart(document.getElementById('googlechart-container'));
    chart.draw(data, options);
}

Bây giờ bạn đã thiết lập tất cả các chức năng cơ bản, hãy chuyển sang tùy chỉnh nâng cao.

Một ưu điểm thêm

Nếu bạn muốn làm nổi bật dữ liệu nói nhiều nhất và gây ấn tượng với đồng nghiệp hoặc bạn bè của mình bằng tính độc đáo của báo cáo, hãy thử sử dụng tính năng ‘Định dạng có điều kiện’. Hãy để tôi chỉ cho bạn những gì tôi có:

Tôi đã đặt “điều kiện” cho phiên bản bảng tổng hợp. Để không đặt nhiều mã, bạn có thể xem chi tiết trong bản trình diễn ở cuối hướng dẫn.

Bây giờ các màu từ biểu đồ tương ứng với màu của các ô và bảng điều khiển phân tích đã sẵn sàng để sử dụng.

Kết luận

Hãy tóm tắt những gì chúng ta đã đạt được với hướng dẫn đơn giản này:

  • Bảng tổng hợp được nhúng trong ứng dụng web của chúng ta. Nó chứa đầy dữ liệu chúng ta muốn phân tích.
  • Biểu đồ hiển thị nội dung từ bảng và phản ứng với bất kỳ thay đổi nào trong báo cáo. Thử thay đổi dữ liệu trong báo cáo động: kéothả các trường, lọc các bản ghi và xem biểu đồ được thay đổi như thế nào.

Bài viết gốc được đăng tải tại Medium

Khi ta kết hợp MotionLayout và ShapeOfView…

Tác giả: florent champigny

Bằng cách sử dụng MotionLayout, bạn có thể đưa ra một cách thiết kế hoàn toàn khác biệt và linh hoạt  cho ứng dụng của mình. Quên đi màn hình tĩnh không có bất kỳ animation nào, và hãy thêm một số chuyển động nào! 

 

 

 

 

 

 

 

 

MotionLayout

MotionLayout là một class mới có sẵn trong thư viện ConstraintLayout 2.0 để giúp các lập trình viên Android quản lý animation của chuyển động và widget trong ứng dụng.

Có thể định nghĩa các thay đổi  từ layout xml. Chúng ta xác định một chuyển động: một Swipe trên nút màu đỏ, và một giá trị khởi đầu: nằm bên phải của nút đó.

Sau đó, chúng ta cần xác định các ràng buộc ở vị trí điểm đầu và các ràng buộc ở vị trí điểm cuối. MotionLayout sẽ tự động tính toán chuyển động và xử lý các sự kiện và animation:

 

 

 

 

ayout description (xml/scene_06)

MotionLayout thực sự đang ở giai đoạn alpha, nhưng bạn có thể import vào để sử dụng trong gradle như sau:

implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2'

ShapeOfView

ShapeOfView là thư viện UI dành cho Android hiện có trên Github, có thể thay đổi hình dạng của view. Ví dụ: bạn có thể thêm một số RoundRects, Arcs hoặc diagonals vào layout. Ví dụ: có thể tạo hiệu ứng cho view, tôi có thể tạo hiệu ứng động cho phần dưới cùng bên trái của RoundRectShape này:

 

 

 

 

 

 

ShapeOfView đã được animated 

Bạn có thể import vào để sử dụng trong gradle như sau:

implementation 'com.github.florent37:shapeofview:1.4.4'

MotionLayout + ShapeOfViewanimated

Hãy thiết lập lại screen dưới đây:

Layout này chứa 3 view:

1) Một RecyclerView

2) Một ArcView, từ ShapeOfView, có chứa một ImageView (Tháp Eiffel)

3) Một TextView: “I Love Paris”

Tôi sắp xếp các view này trong MotionLayout như sau:

 

 

 

Chuyển động kéo trên RecyclerView là thứ mà chúng ta phải làm, sao cho nó di chuyển lên trên cùng của màn hình.

– Bắt đầu: ArcView được gắn trên đỉnh màn hình và chiều cao của nó là 240dp, góc hình cung được định nghĩa là 60dp, dùng CustomAttribute để làm điều này. RecyclerView có một ràng buộc ở phía dưới của ArcView. TextView được gắn vào giữa ArcView (các ràng buộc top, left, bottom, right), và có một textSize được thiết lập là 40 (sẽ sử dụng phương thức .setTextSize (float)).

 

– Kết thúc: ArcView được gắn ở phía trên cùng của màn hình, nhưng chiều cao của nó trở thành 80dp, góc hình cung của nó trở thành 0dp tròn trĩnh. Ràng buộc của RecyclerView không đổi, nó vẫn nằm dưới ArcView. TextView chỉ cần được gắn vào bên trái của ArcView: Tôi chỉ loại bỏ đúng các ràng buộc và thêm một layout_marginStart. TextSize cuối cùng của TextView được thiết kế là 20.

Kết quả thực sự mượt và tuyệt vời!

 

Bạn có thể sử dụng DiagonalView (ShapeOfView) như một cách xử lý khác cho vấn đề này :

Với MotionLayout, bạn có thể thêm một số thuộc tính vào view của mình và tạo hiệu ứng cho hầu hết mọi thành phần mà không cần tốn qua nhiều sức.

Bài viết gốc được đăng tải tại Medium

React Context API và các Higher-order Components

reactjs

Tác giả: Shems Eddine

Có thể bạn đã gặp qua React’s Context API mà không nhận ra nó, nó tương tự với High-Order-Components.

Nếu bạn đã từng làm việc với Redux, bạn sẽ có kinh nghiệm cả hai, React’s Context API và High-Order-Component, {connect} từ gói react-redux của họ. Hoặc @material-ui/core với withStyles.

Cả hai khái niệm này đều không khó nhưng tôi nghĩ việc nhận ra khi sử dụng chúng mới khó khăn.

Trong ứng dụng tôi đang làm việc, tôi đã có một đối tượng client được sử dụng để lưu trữ các giá trị mặc định và cài đặt mặc định của hệ thống cũng như các đối tượng có thể tái sử dụng (ứng dụng tôi xây dựng cũng có khái niệm về một middlware để các đối tượng trong đó có thể thay đổi dựa trên middlewares injected).

Script

Chúng tôi sẽ làm việc trên “theme” cho ứng dụng của chúng tôi. Chúng tôi có một đối tượng lưu trữ chủ đề mặc định của chúng tôi mà các trang của chúng tôi có thể sử dụng.

Kịch bản này có thể được xây dựng hoàn toàn với React’s Context API.

Context API

Hãy bắt đầu bằng cách tạo một tệp có tên ThemeContext.js.

import React from 'react';
export default React.createContext();

Trong mục nhập của ứng dụng của chúng tôi, chúng tôi muốn phần renders của chúng tôi như sau:

import React from 'react';
import ThemeContext from './ThemeContext';
const App = () => {
return (
    <ThemeContext.Provider value="dark">
      <Welcome />
    </ThemeContext.Provider>
  )
}
ReactDOM.render(<App />, document.getElementById("root"));

Và trong Welcome component:

import React from 'react';
import ThemeContext from './ThemeContext';
const Welcome = () => {
  <ThemeContext.Consumer>
    {theme => {
      return (
        <div style={{background: theme === "dark" ? "#000" : "#fff"}}>
          <h2 style={{color: theme !== "dark" ? "#000" : "#fff"}}>Welcome</h2>
        </div>
      )
    }}
  </ThemeContext.Consumer>
}
export default Welcome;

Điều này thể hiện sự đơn giản của React’s Context API. Trước tiên, chúng tôi đã xác định React’s Context API của mình. Chúng tôi xác định các Provider trong thành phần ứng dụng của chúng tôi ở đây vì điều này sẽ đảm bảo rằng context được cung cấp cho tất cả các component con khi cần thiết.

Tôi nghĩ rằng đó là điều bạn nên biết, nếu Provider không được xác định cao hơn consumer, thì bạn sẽ không bao giờ có thể nhận được các giá trị từ bên trong.

Tiếp theo, chúng tôi xác định consumer của mình, ở đây chúng tôi có thể truy cập context value theme mà chúng tôi có thể sử dụng để tùy chỉnh các component của chúng tôi.

Ví dụ này không khó về mặt kỹ thuật và bạn có thể thoát ra chỉ bằng cách chuyển sang chủ đề như là biện pháp phòng ngừa trong trường hợp này. Tuy nhiên, bạn cần phải tưởng tượng rằng trong một ứng dụng lớn, bạn có thể có hàng tá component cần thiết để truy cập vào giá trị này một cách khác nhau.

Higher-Order Components

Cá nhân tôi ghét cú pháp được sử dụng để sử dụng API Context Consumer và nó có thể mang lại sự mệt mỏi. Ngoài ra nếu theme object của tôi phức tạp, tôi có thể không cần tất cả các giá trị từ nó vì vậy tôi muốn có khả năng lựa chọn khi tôi cần chúng.

Giả sử theme object của tôi trông giống như sau:

const theme = {
  background: {
      color: {
    primary: "#f00",
    secondary: "#f0f"
   }
 }
...// more items here
};

Nếu tôi cần truy cập bất cứ thứ gì ở đây, các component của tôi sẽ bắt đầu trở nên thực sự lộn xộn. Điều gì làm cho nó tồi tệ hơn là nếu bạn có một Context khác mà bạn đang cố truy cập. Sự lồng ghép này sẽ trở nên khủng khiếp.

Vì vậy, hãy tạo Higher-Order Component.

import React from "react";
import ThemeContext from "./ThemeContext";
const defaultMergeProps = (themeProps) => ({
  ...themeProps
});
export const connect = (mergeProps = defaultMergeProps) => ComponentToWrap => {
  return class ClientComponent extends React.Component {
    render() {
      return (
        <ThemeContext.Consumer>
          {theme => {
            const props = {...mergeProps({ theme }), ...this.props};
            return <ComponentToWrap {...props} />;
          }}
        </ThemeContext.Consumer>
      );
    }
  };
};
export default connect;

Ở đây, chúng tôi đang tạo HOC của chúng tôi, được gọi là connect. Điều này có một hàm để chuyển đổi các thuộc tính được truyền vào component của chúng ta. Điều này cũng trả về một hàm có trong component của chúng ta và đưa các thuộc tính vào nó.

Hãy chia nhỏ thêm một chút nữa.

Chúng tôi có function defaultMergeProps có trong theme props. Function mặc định là chỉ trả về các giá trị của theme object.

Bây giờ bạn có thể thấy rằng trong hàm trả về, chúng ta sử dụng Context API (our ThemeContext) consumer và truyền vào theme object xuống hàm mergeProps. Điều này cho phép chúng tôi tùy chỉnh cách chúng tôi sử dụng để giải nén các

import React from 'react';
import { connect } from './connect';
const Welcome = ({primaryBackground, primaryText}) => {
  return (
    <div style={{background: primaryBackground}}>
      <h2 style={{color: primaryText}}>Welcome</h2>
    </div>
  )
}
const mergeProps = (theme) => (
  {
    primaryBackground: theme.background.primary, 
    primaryText: theme.text.color.primary
    }
);
export default connect(mergeProps)(Welcome);

Như bạn có thể thấy, thành phần chính nó là nhiều neater. Chúng tôi giải nén các thuộc tính chúng tôi cần từ các theme props và đưa chúng vào component của chúng tôi giống như chúng là các thuộc tính thông thường.

Như bạn có thể thấy, hai mô hình này có lợi thế nhưng tôi sẽ không đi lung tung. Nhiều khả năng, bạn sẽ không cần phải làm việc với nó và nhu cầu của bạn có thể được đáp ứng với các gói như Redux. Nhưng nếu bạn định làm điều đó, việc áp dụng hai mẫu chắc chắn sẽ giúp giữ cho các component của bạn đơn giản và rõ ràng hơn để đọc.

Provider

Nếu bạn đang phát triển gói này được các nhóm khác sử dụng và có khả năng tạo nhiều dự án, tôi cũng sẽ tạo một Provider component riêng biệt liên quan đến Context Provider thực tế, theme này sẽ một là tính năng.

import React from "react";
import ThemeContext from "./ThemeContext";
export default class Provider extends React.Component {
  render() {
    return (
      <ThemeContext.Provider value={this.props.theme}>
        {this.props.children}
      </ThemeContext.Provider>
    );
  }
}

Và trong file App.js, chúng tôi có thể ẩn việc thực hiện căn bản với việc sử dụng Provider này.

import React from 'react';
import Provider from './Provider';
const App = () => {
  let theme = {...};
  return (
    <Provider theme={theme}>
      <Welcome />
    </Provider>
  )
}
ReactDOM.render(<App />, document.getElementById("root"));

Tham khảo các vị trí tuyển dụng React hấp dẫn tại đây

Bài viết gốc được đăng tải tại Medium

Cloud-Native Microservices Với TIBCO: Khám phá dịch vụ bằng cách sử dụng Consul

Tác giả: Santosh Bhutkar

Một ứng dụng dựa trên microservices thường chạy trong một môi trường ảo hóa hoặc môi trường container trong đó số lượng các cá thể và các điểm cuối thay đổi động. Do đó, phải có một cơ chế để cho phép người dùng của các dịch vụ nhỏ này thực hiện các yêu cầu đối với một nhóm các dịch vụ thay đổi động.

Điều này gây ra một trong những vấn đề lớn nhất trong thế giới microservices: khách hàng của một dịch vụ như thế nào – cổng API hoặc một dịch vụ khác – khám phá vị trí của một trường hợp dịch vụ? Giải pháp cho vấn đề này là sử dụng một dịch vụ đăng ký, mà sẽ duy trì các thông tin điểm cuối của các dịch vụ thay đổi động và khám phá các thiết bị đầu cuối thông qua service registry này.

TIBCO cho phép các nhà phát triển xây dựng các ứng dụng dựa trên đám mây và hỗ trợ nhiều công cụ nguồn mở trong hệ sinh thái microservices. Consul là một trong những công cụ trong hệ sinh thái đó để đăng ký và khám phá dịch vụ. Cơ chế đăng ký và khám phá dịch vụ cho phép các dịch vụ thông báo tính khả dụng của chúng và cho phép khách hàng tự động tìm kiếm các dịch vụ này.

Trong hướng dẫn này, chúng ta sẽ học về cloud-native microservices với TIBCO bằng cách sử dụng service registry và discovery tool, Consul.

Hãy lấy một ví dụ về dịch vụ báo giá. Đây là sơ đồ dòng của dịch vụ báo giá:

Dịch vụ báo giá sẽ thực hiện cuộc gọi đến các dịch vụ nhỏ khác nhau để cung cấp báo giá cho khách hàng. Bốn microservices này – Sản phẩm, Giá, Hàng tồn kho và Giảm giá – có thể chạy trên các máy chủ khác nhau. Dịch vụ báo giá cần phải biết điểm cuối của từng dịch vụ này.

Dịch vụ đăng ký đóng một vai trò quan trọng trong kịch bản này. Mỗi dịch vụ tự đăng ký dịch vụ khi khởi động. Một khách hàng của dịch vụ truy vấn đăng ký dịch vụ để tìm ra các phiên bản dịch vụ có sẵn. Dịch vụ báo giá sẽ trông như sau trong môi trường TIBCO design-time.

Khám phá dch v bng cách s dng Consul

Mỗi dịch vụ cần phải tự đăng ký với service registry – trong trường hợp này là Consul. Đây là cấu hình design-time cho từng dịch vụ nhỏ:

  • Tài nguyên nguồn kết nối HTTP được sử dụng để lộ ra một REST service.
  • Đặt tên cho dịch vụ trong trường “Service Name”.

Nhà phát triển chỉ cần thực hiện các cấu hình được đề cập ở trên để kết nối HTTP để sử dụng cơ chế Service registry.

Để dịch vụ Trích dẫn hoạt động, nó cần gọi mọi dịch vụ được triển khai. Để thực hiện các cuộc gọi thành công, nó cần phải khám phá các điểm cuối dịch vụ trong thời gian chạy. HTTP client là tài nguyên được sử dụng để cấu hình bất kỳ cuộc gọi dịch vụ bên ngoài. Người dùng có thể cấu hình chi tiết điểm cuối của dịch vụ được gọi

Theo cấu hình design time được yêu cầu trong HTTP client cho cơ chế khám phá dịch vụ.

  • Kiểm tra hộp kiểm “Enable Service Discovery”.
  • Đặt tên cho dịch vụ trong trường “Service Name”.

Sau khi phát triển xong dịch vụ, lưu trữ triển khai xuất khẩu (tệp EAR) của Service. Cùng một EAR có thể được triển khai cho Docker hoặc Cloud Foundry tùy thuộc vào lựa chọn của bạn.

Sau đây là cấu hình thời gian chạy để triển khai Docker:

  • Ứng dụng hình ảnh docker có thể được xây dựng bằng cách sử dụng EAR và phiên bản BusinessWorks Container hình ảnh docker được cung cấp bởi TIBCO.
  • Khi hình ảnh ứng dụng đã sẵn sàng, hãy chạy vùng chứa docker bằng cách cung cấp URL máy chủ Consul và thuộc tính tên dịch vụ.
  • Cung cấp CONSUL_SERVER_URL dưới dạng biến môi trường.

Ví dụ: Lệnh sau sẽ đăng ký dịch vụ Giá với tên “getprice” đến máy chủ Consul được cung cấp:

docker run -d -e CONSUL_SERVER_URL=http://54.202.212.223:8500 -p
18082:8085 -e PriceService=getprice tibco/bwce:price

Tương tự, khởi động các thùng chứa Docker của mọi dịch vụ. Khi tất cả các dịch vụ được thiết lập và hoạt động, trạng thái của các dịch vụ có thể được nhìn thấy trên giao diện người dùng Consul.

Bây giờ, để kiểm tra phát hiện dịch vụ, hãy tạo và triển khai hình ảnh docker của dịch vụ trích dẫn. Trong lệnh này, máy chủ Consul, nơi tất cả các dịch vụ và đăng ký được cung cấp cùng với tên dịch vụ sẽ được phát hiện.

docker run -d -e CONSUL_SERVER_URL=http://54.202.212.223:8500 -e discountService=getDiscount -e inventoryService=getInventory - e priceService=getprice 
-e productService=getproduct -e getQuote=getquote -e BW_PROFILE=Docker -p 18084:8085 -p 8092:8090 tibco/bwce:quote

Khi dịch vụ được thiết lập và đang chạy, hãy kiểm tra dịch vụ bằng giao diện người dùng Swagger.

Bài viết gốc được đăng tải tại Medium

Page Block trong Voyager Laravel

Biên dịch: Đinh Quốc Hội

Chào Mừng Bạn Đến Với Voyager

Tài liệu Voyager phiên bản 1.1 (Vẫn đang trong quá trình phát triển)

Chào mừng bạn đến với Voyager  1.1. Đây là các tài liệu dạy bạn cách cài đặt, cấu hình, và sử dụng Voyager  để có thể tạo ra 1 số công cụ cần thiết. 

Trước khi cài đặt Voyager

Trước khi cài đặt Voyager, bạn có thể muốn dành một chút thời gian để tìm hiểu xem nó là gì và nó không phải là gì, chúng tôi sẽ làm điều đó trong phần tiếp theo. Nhấp vào ‘Voyager’ bên dưới để tiếp tục.

Voyager là gì

Trước khi cài đặt Voyager, điều quan trọng là phải dành một chút thòi gian để tìm hiểu xem nó là gì và không những điều không phải về Voyager.

Thế Voyager Là Gì?

  • Nó là 1 giao diện quản trị cho ứng dụng laravel của bạn
  • Nó có thể dễ dàng thao tác thêm,xóa, sửa các dữ liệu cho dứng dụng laravel của bạn
  • Một trình tạo menu (Xây dựng các menu cho ứng dụng của bạn)
  • Là một trình quản lý phuong tiện cho tiệp của bạn
  • CRUD/BREAD generator ( Tìm hiểu thêm về BREAD tại đây )
  • Voyager đơn giản là 1 trang quản trị cho ứng dụng. Bạn muốn thực hiện bất cứ điều gì trên giao diện người d ùng là hoàn toàn tùy thuộc vào bạn . Bạn có thể kiểm soát ứng dụng của mình và bạn có thể sử dụng Voyager để làm cho công việc của bạn dễ dàng hơn bằng cách thêm dữ liệu, chỉnh sửa người dùng, tạo menu và nhiều tác vụ quản trị khác.
  • Không phải về Voyager
    • Một hệ thống quản lý nội dung (CMS)
    • Một nền tảng blog
    • WordPress (Bleh! 😜)
  • Voyager không phải là CMS  và nền tảng blog. Nhưng nó có thể được sử dụng để tạo ra một CMS hoặc một nền tảng blog, Như đã nêu trong phần trước, bạn có toàn quyền kiểm soát những gì ứng dụng của bạn sẽ làm và cách nó hoat động
  • Với Laravel & Voyager bạn có thể tạo ra bất kỳ loại ứng dụng nào bạn bạn mong muốn, Laravel & Voyager chỉ đơn giản là công cụ để giúp bạn xây dựng dễ dàng hơn.

Đây là mô-đun được thiết kế để cung cấp cho các nhà phát triển khả năng dễ dàng thiết kế các khối trang, Người dùng quản trị để xây dựng trang frontend tuyệt đẹp.

1. Điều Kiện

2. Cài Đặt

# 1.cd  đến project laravel,mở terminal và gõ các lệnh sau
composer require pvtl/voyager-page-blocks

# 2. Cài đặt voyager-pages
php artisan  voyager-pages:install

# 3. Cài đặt voyager-page-blocks
php artisan voyager-page-blocks:install

#4 .Cấp quyền cho project để tránh lỗi Permission denied!

Giao diện sau khi cài đặt xong, nhưng khi chúng ta edit thì sẽ bị lỗi thiếu Feild meta_keywords

Vào database thêm vào 1 field:meta_keywords

Lưu lại và có thể edit page and block content

Thêm các Layout và block

Thư mục Layout

/var/www/html/voyager/vendor/pvtl/voyager-frontend/resources/views/layouts

Các block có sẵn

Các block

/var/www/html/voyager/vendor/pvtl/voyager-page-blocks/resources/views/block

3. Demo xây dựng hiển thị các block ra trang chủ

VD: Trang Home đang trống

Tạo và sửa đổi block

Các khối trang được tạo và định cấu hình bằng cách: Xác định khối – trong /config/page-blocks.php

Tham khảo thêm tại :https://github.com/pvtl/voyager-page-blocks

Xây dựng bố cục HTML của khối – tạo file create_html.blade.php

/var/www/html/voyager/vendor/pvtl/voyager-page-blocks/resources/views/block

Sau đó vào trang quản trị chọn Page

Đây là block html vừa thêm vào

Ví dụ: Nhúng game Flappy bird vào web

Nhúng code vào

Giao diện sau khi nhúng

Developer Controller Blocks

 Xây dựng blocks này dành cho nhà phát triển, bạn cũng có thể tùy biến giao diện dựa trên các controller viết sẵn hoặc tự viết 1 controller mới vd: hiển thị blocks hiển thị các bài post ra trang chủ

Hiển thị các bài viết từ 1 controller có sẵn

Pvtl\VoyagerFrontend\Http\Controllers\PostController::recentBlogPosts(2)
#recentBlogPosts(2) : Hiển thị ra 2 bài post

#1 :Blocks này có hiệu lực bạn cần chạy lệnh cài blog tại project
php artisan  voyager-blog:install

2 blog post vừa tạo

Và F5 lại trang chủ

Homepage

Và đây, là bức tranh tổng quát nhưng dẽ nắm bắt nhất cho bạn để hiểu được cách sử dụng Voyager Page Blocks!

Tham khảo thêm các việc làm Laravel hấp dẫn nhất tại đây

TopDev via GitHub

Hiểu về JavaScript bất đồng bộ – Event Loop

Hiểu về JavaScript bất đồng bộ - Event Loop

Tác giả: Giang Coffee 

Event Loop là gì và hoạt động thế nào?

Trước đây thi thoảng có làm Javascript và cũng có nghe nói qua về một số khái niệm cơ bản và hay ho của Javascript như nhân V8 của Google (quá oách), Event-Driven, Non-blocking I/O, Event Loop… những khái niệm giúp JS tận dụng sức mạnh của phần cứng và hàng chục lợi ích khác. Dạo gần đây có làm nhiều về JS, gặp nhiều lỗi quái đản mình mới tự đặt ra câu hỏi là rốt cục tất cả những thứ trên là cái gì?, hoạt động thế nào? và tại sao nó mang lại lợi ích?

Hôm nay qua một số google search và đặc biệt xem được bài thuyết trình này mình thấy Event Loop chính là thứ nguồn gốc, hay ho nhất và muốn chia sẻ, thảo luận cùng mọi người. Đấy là những gì mình hiểu ra chứ chưa chắc đã là chuẩn xác. Anh em có gì góp ý mình cực kỳ hoan nghênh và tiếp thu.

Tất cả các ngôn ngữ lập trình đều được sinh ra để làm thứ ngôn ngữ giao tiếp giữa người và máy. Dù là ngôn ngữ gì đi chăng nữa thì cuối cùng vẫn phải dịch ra mã máy, được load lên memory, chạy từng dòng lệnh, ghi các dữ liệu tạm thời ra bộ nhớ, ổ đĩa rồi giao tiếp các thiết bị ngoại vi… Thế nên để cho tiện mình xin nhắc lại một số khái niệm cơ bản sau.

1. Một số khái niệm cơ bản

1.1 Stack

Stack là một vùng nhớ đặc biệt trên con chip máy tính phục vụ cho quá trình thực thi các dòng lệnh mà cụ thể là các hàm. Hàm chẳng qua là một nhóm các lệnh và chương trình thì gồm một nhóm các hàm phối hợp với nhau. Mỗi khi một hàm được triệu gọi thì nó sẽ được đẩy vào một hàng đợi đặc biệt có tên là stack. Stack là một hàng đợi kiểu LIFO (Last In First Out) nghĩa là vào đầu tiên thì ra sau cùng. Một hàm chỉ được lấy ra khỏi stack khi nó hoàn thành và return.

Hiểu về JavaScript bất đồng bộ - Event Loop

Nếu trong một hàm (Foo) có triệu gọi một hàm khác (Bar) thì trạng thái hiện tại của hàm Foo được cất giữ trong stack và hàm Bar sẽ được chèn vào stack. Vì đây là hàng đợi LIFO nên Bar sẽ được xử lý trước Foo. Khi Bar xong và return thì mới đến lượt Foo được xử lý. Khi Foo được xử lý xong và return thì Stack rỗng và sẽ đợi các hàm tiếp theo được đẩy vào.

        Stack    
 -------------------- 
|                    |
 -------------------- 
|      Bar           | <--
 -------------------- 
|      Foo           |
 --------------------

1.2. Heap

Heap là vùng nhớ được dùng để chưa kết quả tạm phục vụ cho việc thực thi các hàm trong stack. Heap càng lớn thì khả năng tính toán càng cao. Heap có thể được cấp phát tĩnh hoặc cấp phát động bằng mấy lệnh kiểu alloc với malloc (đấy là những gì còn nhớ về C++).

2. Event Loop là gì

Event Loop là cơ chế giúp Javascript có thể thực hiện nhiều thao tác cùng một lúc (concurrent model), trước giờ vẫn nghe nói NodeJs có thể xử lý cả hàng ngàn request cùng một lúc mặc dù nó chỉ dùng một thread duy nhất (Single Threaded). Nếu như ở PHP hay Java thì với mỗi một request sẽ sinh ra một thread để xử lý request đó, các thread hoạt động độc lập, được cấp bộ nhớ, giao tiếp ngoại vi và trả về kết quả. Vậy làm thế nào để NodeJs có thể xử lý cả ngàn request một lúc với chỉ một thread duy nhất?.

Có một sự thật là trên web browser thì trong khi get data từ các url thì người dùng vẫn có thể thực hiện các thao tác khác như click button và gõ vào các ô textbox. Tất cả là nhờ có các web apis và cơ chế hoạt động của Event Loop. Tuy Js Runtime chỉ có một thread duy nhất nhưng các web apis giúp nó giao tiếp với thế giới multi thread bên ngoài, tận dụng các con chip đa nhân vốn rất phổ biến hiện nay. Web apis giúp đẩy các job ra bên ngoài và chỉ tạo ra các sự kiện kèm theo các handler gắn với các sự kiện. Kể cả đối với NodeJs khi không có web apis thì nó vẫn có các cơ chế tương đương khác giúp đẩy job ra bên ngoài và chỉ quản lý các đầu việc. Web Apis hoạt động như vậy thì Event Loop sẽ thế nào ?

3. Event Loop hoạt động như thế nào ?

Event Loop có tên như vậy bởi vì có một vòng lặp vô tận trong Javascript Runtime (V8 trong Google Chrome) dùng để lắng nghe các Event.

while (queue.waitForMessage()) {
  queue.processNextMessage();
}

 

Hiểu về JavaScript bất đồng bộ - Event Loop

Nhiệm vụ của Event Loop rất đơn giản đó là đọc Stack và Event Queue. Nếu nhận thấy Stack rỗng nó sẽ nhặt Event đầu tiên trong Event Queue và handler (callback hoặc listener) gắn với Event đó và đẩy vào Stack. Đặc điểm của việc thực thi hàm trong JS là sẽ chỉ dừng lại khi hàm return hoặc throw exception. Có nghĩa là trong khi hàm đang chạy thì sẽ không có một hàm khác được chạy, dữ liệu tạm của hàm cũng sẽ không bị thay đổi bởi một hàm khác hay cũng không bị dừng lại cho đến khi hoàn thành (ngoại trừ yield trong ES6).

Như các bạn thấy trên hình thì JS Runtime còn thao tác với một callback queue hay event queue ngoài stack ra. Event queue này khác với stack ở chỗ nó là queue kiểu FIFO (First In First Out). Mỗi khi có một Event được tạo ra, ví dụ user click vào một Button thì một Event sẽ được đẩy vào Event queue cùng với một handler (event listener) gắn với nó. Nếu một Event không có listener thì nó sẽ bị mất và không được đẩy vào Event queue. Để cho dễ hình dung cách thức hoạt động của Event Loop ta lấy một ví dụ như sau :

const fs = require('fs');

function someAsyncOperation(callback) {
  // giả sử đọc file hết 95ms
  fs.readFile('/path/to/file', callback);
}

const timeoutScheduled = Date.now();

setTimeout(function logInfo() => {
  const delay = Date.now() - timeoutScheduled;
  console.log(`${delay}ms have passed since I was scheduled`);
}, 100);


// đọc file xong sẽ tiếp tục chờ thêm 10ms
someAsyncOperation(function readFileAsync() => {
  const startCallback = Date.now();

  // chờ 10ms
  while (Date.now() - startCallback < 10) {
    // do nothing
  }
});

 

đầu tiên phần khai báo biến và hàm sẽ được chạy nhưng không được đẩy vào stack. Tiếp setTimeout() sẽ được đẩy vào stack và thực hiện. Hàm này không có trong Javascript Runtime mà là hàm tiện ích của Browser, nó sẽ khởi tạo một bộ đếm và sau đúng 100ms thì nó sẽ đẩy tham số đầu tiên logInfo (là một callback hoặc có thể gọi là một event listener cũng được) vào Event Queue. Kế đến sẽ chạy hàm someAsyncOperation và đẩy vào stack, vì hàm này async và có callback readFileAsync nên readFileAsync được đẩy luôn vào Event Queue mà không phải chờ như setTimeout để hứng sự kiện đọc xong file (sau 95ms).

         Stack                        Event Queue
 --------------------              -------------------
|                    |            | readFileAsync     |  <--
 --------------------              -------------------
|                    |            |                   |
 --------------------              -------------------
| someAsyncOperation | <--        |                   |
 --------------------              -------------------

 

Để ý là Stack LIFO nên someAsyncOperation sẽ nằm dưới cùng còn Event Queue FIFO nên readFileAsync sẽ nằm trên cùng. Sau khi readFileAsyncđược đẩy vào Event Queue thì someAsyncOperation return và được lấy ra khỏi Stack. Lúc này Stack không có gì nên Event Queue sẽ được đọc, nên nhớ là Event Queue chỉ được đọc khi Stack trống rỗng. readFileAsync sẽ được đẩy vào Event Queue trước vì nó chỉ mất có 95ms trong khi logInfo thì phải chờ 100ms. readFileAsync này sẽ được lấy khỏi Event Queue và đẩy vào stack để chạy.

       Stack                           Event Queue
 --------------------              -------------------
|                    |     ------ | readFileAsync     | 
 --------------------     |         -------------------
|                    |    |       | logInfo           | <--
 --------------------     |        -------------------
| readFileAsync      | <--        |                   |
 --------------------              -------------------

 

readFileAsync sẽ gặp vòng while và dừng ở đó 10ms. Vậy tổng cộng hàm đọc file sẽ mất 105ms để hoàn thành. Nhưng ở giây thứ 100 thì logInfođược đẩy vào Event Queue (lúc này đã rỗng) trong khi readFileAsync thì còn phải mất thêm 5ms nữa mới hoàn thành. Vì cơ chế của Javascript là chạy đến khi hoàn thành mới thôi nên logInfo không có cách nào để dừng readFileAsync lại để chiếm quyền điều khiển, trừ khi trong readFileAsynccó lệnh yield. Sau 105ms thì readFileAsync return và được lấy ra khỏi Stack.

       Stack                           Event Queue
 --------------------              -------------------
|                    |     ------ | logInfo           | 
 --------------------     |        -------------------
|                    |    |       |                   |
 --------------------     |        -------------------
| logInfo            | <--        |                   |
 --------------------              -------------------

 

Một lần nữa Stack lại trống và logInfo được đẩy vào Stack. Như vậy logInfo sẽ phải đợi tổng cộng 105ms để được chạy, chứ không phải 100ms như dự tính. Do đó tham số thứ 2 của setTimeout là thời gian tối thiểu để một Event được đẩy vào Stack và chạy chứ không phải là thời gian chính xác nó sẽ được chạy.

Giả sử bạn có một đoạn code jQuery như sau :

$('#button_1').click(function yield() {
  console.log('Ouch!');
});

 

thì một hoặc vài event sẽ được đẩy vào Event Queue như sau:

Stack                        Event Queue
 --------------------              -------------------
|                    |            | yield(Event)      |  <--
 --------------------              -------------------
|        Bar         |            |                   |
 --------------------              -------------------
|        Foo         | <--        |                   |
 --------------------              -------------------

 

đặt tên hàm là yield chỉ nhằm mục đích dễ theo dõi, ta hoàn toàn có thể bỏ tên hàm đi trong trường hợp này. Khi Bar và Foo return và được lấy ra khỏi Stack thì yield sẽ được đẩy vào Stack với tham số là DOM Element xảy ra sự kiện click.

Cơ chế run to completion của Javascript có một điểm bất lợi đó là nếu một hàm chạy quá lâu hoặc bị vòng lặp vô tận thì sẽ không có hàm nào được chạy nữa, kết quả là Browser sẽ bị đơ, không phản ứng với các sự kiện như click chuột … Ví dụ :

function foo() {
   console.log('i am foo!');
   foo();
}

foo();

hàm đệ quy không điểm dừng sẽ liên tục đẩy foo vào Stack cho đến khi đầy, và bạn đoán xem lúc này chúng ta sẽ có cái mà hàng ngày các develop đều tìm kiếm Stack Overflow

      Stack                           Event Queue
 --------------------              -------------------
| foo                |            | Event 1           | 
 --------------------              -------------------
| foo                |            | Event 2           |
 --------------------              -------------------
| foo                |            | Event 3           |
 --------------------              -------------------

Để tránh tình trạng Browser bị treo vì lỗi lập trình thì các Browser sẽ throw exception trong trường hợp này :

MAXIMUM CALL STACK SIZE EXCEEDED.

Hầu hết các thao tác trong Javascript đều là bất đồng bộ nhưng có một số ngoại lệ thú vị như hàm alert (hàm này là của Browser API, không có trong NodeJs). Khi hàm này được chạy thì bạn không thể thực hiện một thao tác nào khác ngoài click OK.

Đến đây ta có thể thấy cơ chế quản lý theo đầu việc là bí kíp giúp JS Runtime có thể xử lý hàng ngàn tác vụ cùng một lúc. Giống như bạn được giao một đống việc, bạn chia nhỏ từng việc và giao cho đám đệ tử của mình.

Bài viết gốc được đăng tải tại Giang Coffee

Tuyển lập trình viên Javascript lương cao tại đây

So sánh giữa Native App Development và Hybrid App Development

Tác giả: Surender Vikram Singh

Sự phát triển mạnh mẽ của thị trường điện thoại thông minh trong những năm gần đây đã dẫn đến tỷ trọng truy cập trang web trên điện thoại di động lên đến 52,2% trong năm 2018.

Tính sẵn có của điện thoại thông minh hiệu quả về chi phí dẫn theo sự gia tăng sự lệ thuộc của chúng tôi vào điện thoại thông minh, khiến các nhà phát triển khó lựa chọn giữa Native Mobile App Development hay Hybrid App Development.

. . .

Tầm quan trọng của UI / UX trong phát triển ứng dụng trên thiết bị di động

Trước khi chúng tôi xem xét nền tảng phát triển ứng dụng Native & Hybrid, có một khía cạnh quan trọng nhất của việc phát triển ứng dụng này là chính là khách hàng của bạn cần phải được xem xét.

Khách hàng của bạn ít quan tâm đến công nghệ cũng như nền tảng cung cấp cho ứng dụng mà họ đang sử dụng.

Hầu hết người dùng lo ngại về những gì họ có thể làm với ứng dụng thay vì những thứ tạo ra chúng. Vì vậy, trải nghiệm người dùng và giao diện người dùng (User Experience and User Interface) là khía cạnh quan trọng nhất của bất kỳ ứng dụng di động nào.

79% người dùng thử một đến hai lần cho bất kỳ ứng dụng nào nếu nó không hoạt động trong lần thử đầu tiên , trong khi chỉ 16% người dùng sẽ cố gắng thử nhiều hơn hai lần.

Trải nghiệm người dùng kém ngăn cản người dùng sử dụng ứng dụng.

. . .

Ứng dụng Native & Hybrid  – Khái quát nhanh

Native App Development

Ứng dụng di động gốc là ứng dụng được tạo ra chỉ để sử dụng trong một nền tảng hoặc thiết bị cụ thể, như Android, iOS, BlackBerry hoặc Windows.

Ứng dụng gốc được tạo và code đặc thù cho một nền tảng cụ thể bằng ngôn ngữ lập trình gốc của nó –

  • iOS (Objective-C or Swift)
  • Android (Java, Kotlin)
  • Windows Phone (C#)

Có các nguyên tắc khác nhau cho mỗi nền tảng và lập trình viên cần phải nắm bắt chúng vì chúng khác nhau về kiểu chữ, kiểu đồ họa, hoạt cảnh, hiệu ứng hình ảnh, đầu vào dữ liệu, v.v.

Hybrid App Development

Một ứng dụng hybrid được tạo dưới dạng một ứng dụng duy nhất để sử dụng trên nhiều nền tảng như Android, iPhone và Windows.

Ứng dụng hybrid thực tế là ứng dụng native và ứng dụng web được kết hợp với nhau.

Nó là một sản phẩm hoạt động trên nhiều hệ điều hành như iOS, Android, Windows,…

Chúng trông giống như một ứng dụng native nhưng thực sự được chạy trên website của công ty.Chúng được tạo ra bằng HTML5, CSS và JavaScript, về cơ bản là một chương trình dựa trên web đặt trong một vỏ ứng dụng native và được kết nối với phần cứng thiết bị.

. . .

Ưu điểm của Native App Development

Performance nhanh

Trong phát triển ứng dụng native mobile, chúng tôi phải code cho từng nền tảng khác nhau bằng các ngôn ngữ lập trình khác nhau cho mỗi hệ điều hành.

Vì vậy, chúng tôi có các version khác nhau của một ứng dụng được tạo riêng cho mỗi nền tảng, cụ thể cho hệ điều hành đó và nó chạy trơn tru trên đó.

Tốc độ

Xem xét ứng dụng đã được tối ưu hóa cho hệ điều hành iOS hoặc Android sẽ đạt được điểm số cao hơn trong các bài kiểm tra tốc độ và hiệu suất.

Trong khi phát triển các ứng dụng native, mọi thứ được đã bao gồm việc sử dụng bộ nhớ và pin của thiết bị.

Đơn giản trong phát triển ứng dụng native để thực hiện việc hỗ trợ cho ứng dụng và tích hợp các chức năng mới.

Trải nghiệm người dùng

Điều vô cùng quan trọng đối với các ứng dụng mobile là tạo ấn tượng tốt để không bị xóa ngay sau khi cài đặt chúng.

Trong các ứng dụng native, cảm nhận và trải nghiệm tốt hơn nhiều khi scroll tốt, nhận diện hành động cụ thể, hiệu ứng và hoạt ảnh có chiều sâu và nhiều yếu tố hấp dẫn hơn như vậy.

An toàn & Bảo mật dữ liệu

Để bảo vệ dữ liệu của bạn, yêu cầu đầy đủ về hiệu quả phần cứng và điều này chỉ có thể có trong native app development.

Tính linh hoạt

Ứng dụng native cung cấp khả năng truy cập nhanh các tiện ích thiết bị sẵn có như máy ảnh, GPS, lịch, micrô và các chức năng khác của điện thoại thông minh.

Tuy nhiên, phát triển ứng dụng hybrid có những hạn chế nhất định trong khi cấu trúc interface vì nó ra tạo một ứng dụng duy nhất để sử dụng trên nhiều nền tảng.

Trong các ứng dụng native, không có bất kỳ hạn chế nào, mọi thứ đều có thể được thực hiện do công nghệ đã được cấp.

Personalization

Với rất nhiều thiết bị Android cung cấp trên thị trường với kích thước màn hình khác nhau, chỉ phát triển ứng dụng native là cách điều chỉnh layout trên từng thiết bị.

Nhược điểm của Native App Development

Thời gian phát triển

Ứng dụng native cần nhiều thời gian hơn để phát triển so với các ứng dụng hybrid.

Tạo và triển khai thiết kế cho kích thước cho mọi thiết bị như nhiều tính bất đồng bộ của Android, iPhone, máy tính bảng, … làm mất nhiều thời gian hơn để hoàn thành ứng dụng.

Chi phí phát triển

Các lập trình viên thường có chuyên về một nền tảng, có thể là iOS, Android hay bất kỳ nền tảng nào khác.

Đội ngũ lập trình viên càng nhiều thì tốn nhiều ngân sách. Ngoài ra, các thay đổi hoặc cập nhật trong tương lai sẽ hao hụt chi phí nhân lên theo số lượng thành viên.

. . .

Ưu điểm của Hybrid App Development

Giảm chi phí phát triển

Nếu bạn là ngân sách trung tâm, phát triển ứng dụng chỉ làm ra một lần cho tất cả các nền tảng (Android, iOS, Windows) và nhờ đó bạn không cần thuê các lập trình viên khác nhau.

Bảo trì

Như chúng ta đã biết các ứng dụng hybrid là các ứng dụng web được tích hợp trong một lớp gốc, vì vậy nội dung của nó có thể được cập nhật nhiều lần khi bạn muốn hay cần .Do đó, các ứng dụng này cho phép bảo trì ở mức thấp.

Tốn ít thời gian để tiếp thị

Bạn muốn ứng dụng của mình hoạt động nhanh đến mức nào? Do có sự cạnh tranh cao trên thị trường và cùng một ý tưởng được nhiều nhà doanh nghiệp quảng cáo, bạn muốn giới thiệu ứng dụng của mình đến đối tượng người dùng nhanh nhất có thể. Trường hợp này, bạn nên đi theo Hybrid App.

Nhược điểm của Hybrid App Development

Performance

Các ứng dụng Hybrid thêm một lớp bổ sung giữa mã nguồn và nền tảng di động, đặc biệt là framework di động hybrid. Điều này có thể dẫn đến kết quả mất đi hiệu suất,ngoại trừ việc nó thay đổi qua lại giữa các ứng dụng.

Theo Mark Zuckerberg (người sáng lập Facebook) – “Sai lầm lớn nhất mà chúng tôi tạo ra khi công ty đặt cược vào HTML5 lên trên native.” Facebook chuyển đổi ứng dụng di động của họ từ HTML5 sang cụ thể từng nền tảng,  cho thấy sự khác biệt quan trọng đối với các ứng dụng doanh nghiệp có quan tâm đến.

Debugging

Lớp bổ sung từ framework phát triển lai cũng làm cho debugging trở nên lớn hơn. Các lập trình viên phải dựa vào framework này để chạy tốt hơn cùng với hệ thống ,cái mà không đưa ra bất kỳ bug mới nào trong ứng dụng.

Trải nghiệm người dùng

Khi so với native app development thì rất khó để duy trì trải nghiệm người dùng giữa ứng dụng Android và iOS. Nếu bạn tập trung nhiều hơn vào iOS, trải nghiệm người dùng Android sẽ tồi tệ hơn.

. . .

Tại sao lại chọn Native App Development?

Có nhiều hướng khác nhau để bạn có thể thực hiện ứng dụng của mình. Tuy nhiên để đưa ra lựa chọn đúng đắn, cần phải hiểu sự khác biệt giữa chúng và ưu và khuyết điểm của chúng vì mỗi tùy chọn đều có điểm mạnh và điểm yếu riêng, và quyết định cuối cùng phải phụ thuộc vào nhu cầu kinh doanh của bạn.

Các cuộc thảo luận vẫn còn có liên quan bởi lẽ, đối với cả hai cách tiếp cận, có những ưu và nhược điểm riêng biệt.

Bài viết gốc được đăng tải tại Hackernoon

Tại sao API của Facebook lại bắt đầu bằng một for loop?

API-facebook-developer

Nếu bạn đã từng kiểm tra các yêu cầu của mình đối với API của công ty lớn trong trình duyệt, bạn có thể đã nhận thấy một số javascript lạ trước chính JSON:

Facebook:  Facebook

Gmail:       Facebook

Tại sao họ sẽ lãng phí vài byte để vô hiệu JSON này?

Nói về API: Làm sao để bảo vệ dữ liệu của bạn

Nếu không có những byte quan trọng, nó có thể cho bất kỳ trang web truy cập dữ liệu này.

Lỗ hổng này được gọi là JSON hijacking, và cho phép các trang web trích xuất dữ liệu JSON từ các API đó.

Nguồn gốc

Trong JavaScript 1.5 và các phiên bản trước đó, có thể ghi đè lên constructor của Primitive Object và có phiên bản ghi đè này được gọi khi sử dụng ký hiệu ngoặc.

Điều này có nghĩa là bạn có thể làm:

function Array(){
    alert('You created an array!');
}
var x = [1,2,3];

Và cảnh báo sẽ bật lên!

Thay thế var x bằng tập lệnh sau, và kẻ tấn công có thể đọc email của bạn!

<script src="https://gmail.com/messages"></script>

Trích xuất dữ liệu

Mặc dù bạn đang ghi đè hàm tạo, mảng vẫn được xây dựng và bạn vẫn có thể truy cập nó qua this.

Đây là một đoạn mã sẽ cảnh báo tất cả các mảng dữ liệu:

function Array() {
  var that = this;
  var index = 0;
  // Populating the array with setters, which dump the value when called
  var valueExtractor = function(value) {
    // Alert the value
    alert(value);
    // Set the next index to use this method as well
    that.__defineSetter__(index.toString(),valueExtractor );
    index++;
  };
  // Set the setter for item 0
  that.__defineSetter__(index.toString(),valueExtractor );
  index++;
}

Khi tạo mảng, giá trị của chúng sẽ được cảnh báo!

Điều này đã được sửa trong đề xuất ECMAScript 4 , vì bây giờ chúng ta không còn có thể ghi đè prototype của hầu hết các nguyên thủy, chẳng hạn như Object Array.

  React Context API và các Higher-order Components

Mặc dù ES4 chưa bao giờ được phát hành, lỗ hổng này đã được sửa chữa bởi các trình duyệt chính ngay sau khi phát hiện ra nó.

Bạn vẫn có thể có hành vi tương tự trong javascript ngày nay, nhưng nó bị giới hạn trong các biến mà bạn tạo hoặc các mục tạo không sử dụng ký hiệu ngoặc.

Đây sẽ là phiên bản được điều chỉnh của payload trước đó:

// Making an array
const x = [];

// Making the overriden methods
x.copy = [];
const extractor = (v) => {
    // Keeping the value in a different array
    x.copy.push(v);
    // Setting the extractor for the next value
    const currentIndex = x.copy.length;
    x.__defineSetter__(currentIndex, extractor);
    x.__defineGetter__(currentIndex, ()=>x.copy[currentIndex]);
    // Logging the value
    console.log('Extracted value', v);
};

// Assigning the setter on index 0 
x.__defineSetter__(0, extractor);
x.__defineGetter__(0, ()=>x.copy[0]);


// Using the array as usual

x[0] = 'zero';
x[1] = 'one';

console.log(x[0]);
console.log(x[1]);

Và đây sẽ là một phiên bản sử dụng từ khóa Array để tạo mảng của bạn:

function Array(){
    console.log(arguments);
}

Array("secret","values");

Như bạn có thể thấy, dữ liệu bạn đã thêm vào mảng đã nhập, trong khi chức năng vẫn giữ nguyên!

Việc sửa chữa chính nó không phải là để ngăn chặn việc tạo function Array trong chính nó, nhưng để buộc ký hiệu ngoặc đơn của các mục tạo ra để sử dụng việc triển khai gốc, và không phải là chức năng tùy chỉnh của bạn.

Điều này có nghĩa là chúng ta vẫn có thể tạo một hàm Array, nhưng nó sẽ không được sử dụng với dấu ngoặc vuông ([1,2,3]). 

Nó vẫn sẽ được gọi nếu chúng ta sử dụng ký hiệu x = new Array(1,2,3) hoặc x = Array(1,2,3) mặc dù, nhưng điều này không giúp chúng ta với việc JSON hijacking.

Các biến thể hiện đại

Được rồi, vì vậy chúng tôi biết các phiên bản cũ của trình duyệt đã bị tấn công trong một thời gian trước đây. 
Điều này có ý nghĩa gì đối với chúng ta ngày nay?

Vâng, với bản phát hành gần đây của EcmaScript 6, các tính năng juicy mới đã được thêm vào như Proxies!

Gareth Heyes từ Portswigger đã viết ra một biến thể hiện đại của cuộc tấn công này, điều này vẫn cho phép chúng tôi lấy cắp dữ liệu từ các điểm cuối JSON!

Sử dụng Proxy thay vì Accessors cho phép chúng tôi đánh cắp bất kỳ biến nào được tạo ra, bất kể tên của nó là gì. 
Nó có thể hoạt động giống như một accessor nhưng đối với bất kỳ thuộc tính truy cập hoặc viết nào.

Sử dụng điều này và một cách khác, có thể ăn cắp dữ liệu một lần nữa!

UTF-16BE là một bộ ký tự nhiều byte và do đó hai byte sẽ thực sự tạo thành một ký tự. Ví dụ: nếu tập lệnh của bạn bắt đầu bằng [“điều này sẽ được coi là ký tự 0x5b22 không phải là 0x5b 0x22. 0x5b22 là biến JavaScript hợp lệ =). Bạn có thấy không điều này sẽ xảy ra?

Sử dụng như một kịch bản:

<script charset="UTF-16BE" src="external-script-with-array-literal"></script>

Với một chút dữ liệu được kiểm soát từ kịch bản này, cũng như các bit thực tế  chuyển đổi kịch bản để làm cho điều này một lần nữa rõ ràng, chúng tôi có thể exfiltrate dữ liệu một lần nữa!

Đây là POC cạnh cuối cùng của anh ấy, được lấy từ bài đăng trên blog của anh ấy:

<!doctype HTML>
<script>
Object.setPrototypeOf(__proto__,new Proxy(__proto__,{
    has:function(target,name){
        alert(name.replace(/./g,function(c){ c=c.charCodeAt(0);return String.fromCharCode(c>>8,c&0xff); }));
    }
}));
</script>
<script charset="UTF-16BE" src="external-script-with-array-literal"></script>
<!-- script contains the following response: ["supersecret","<?php echo chr(0)?>aa"] -->

Vì tôi sẽ không giải thích phương pháp của anh ta sâu, tôi khuyên bạn nên đọc bài viết của anh ấy để biết thêm thông tin.

Phòng tránh

Dưới đây là các khuyến nghị chính thức của OWASP, được lấy từ AJAX security cheat sheet

  • Sử dụng CSRF Protection
    Điều này ngăn cản việc khai thác bằng cách không trả lại dữ liệu nếu tiêu đề bảo mật hoặc mã thông báo csrf không có mặt.
  • Luôn trả về JSON với một đối tượng ở bên ngoài

Giải pháp cuối cùng này là thú vị.

Trong Firefox và IE, vì một số lý do, điều này là hợp lệ:

x = [{"key":"value"}]
x = {"key":"value"}
[{"key":"value"}]
{key: "value"}

Nhưng cái này thì không”

{"key":"value"}

Lý do tại sao nó không hợp lệ là Firefox và IE xem xét các dấu ngoặc đơn để bắt đầu một câu lệnh khối và không phải là tạo đối tượng. 

Ký hiệu không có dấu ngoặc kép, {key: "value"} được coi là một nhãn, với giá trị là một câu lệnh.

Chrome, không giống như, xem xét các trường hợp đó là một đối tượng sáng tạo, và do đó nó tạo ra một đối tượng mới.

Cảm ơn Matt (r0x33d) đã giúp làm sáng tỏ điều này!

Phần kết luận

Mặc dù các vectors này có thể không hoạt động ngày hôm nay, chúng tôi không bao giờ biết lỗi mới sẽ xảy ra vào ngày mai, và do đó chúng tôi vẫn nên cố gắng hết sức để ngăn không cho API bị khai thác. 

Nếu chúng tôi lấy this StackOverflow answer , chúng tôi sẽ dễ bị tổn thương bởi các phiên bản hiện đại và do đó vẫn có thể bị tấn công.

Câu trả lời của Google và Facebook là thêm các vòng javascript hoặc vòng lặp vô hạn không hợp lệ trước dữ liệu JSON của họ, nhưng có vài lựa chọn thay thế khác được liệt kê bởi OWASP.

  Top những thuật toán machine learning mà bất cứ Data Scientist nào cũng cần phải biết (Phần 2)

Biên dịch: Trương Đình Tuấn

Sức mạnh thành công tại HansenCX: trọng dụng nhân tài, không ngại đầu tư nguồn nhân lực

Đến với HansenCX, ở nơi này kỳ tích không đến từ những gì quá lớn lao, mà quan trọng nhất vẫn đến từ sức mạnh đoàn kết. Nỗ lực không ngừng ắt có ngày thành công!

Điều đặc biệt làm nên “sức mạnh HansenCX”

HansenCX được biết đến là nhà cung cấp hàng đầu thế giới về công nghệ thanh toán và chăm sóc khách hàng cho các nhà khai thác truyền hình, các công ty viễn thông và tiện ích Pay-TV. Trải qua hành trình 47 năm vận hành và phát triển, HansenCX hiện có hơn 1000 nhân sự và 34 văn phòng tại Úc, Hoa Kỳ, New Zealand, Trung Quốc, Thụy Sĩ, Ấn Độ, Việt Nam…phục vụ khách hàng tại hơn 80 quốc gia trên thế giới. HansenCX luôn đón đầu và cập nhật những xu hướng công nghệ mới nhất, đem lại tiện ích cũng như lợi thế dành cho khách hàng.

Các thành tựu đạt được trong những năm gần đây của HansenCX:

  • Hợp tác với Hệ thống tiện ích thông minh (SUS) để cung cấp nền tảng di động cho các tiện ích
  • Được lựa chọn bởi eRex để mở rộng trong thị trường dân cư bãi bỏ quy định của Nhật Bản
  • Ký hợp đồng với Tập đoàn Hinduja để hỗ trợ nền tảng HITS tại Ấn Độ
  • Hoàn thành ICC cho Univisa SA
  • Mua lại Giải pháp PPL, LLC (Giải pháp của Bỉ)
  • Mua lại Enoro – nhà cung cấp hàng đầu thị trường Bắc Âu của Hệ thống thông tin khách hàng (CIS) & Hệ thống quản lý dữ liệu đồng hồ (MDM) cho ngành năng lượng.

Những thành tựu mà HansenCX đạt được có thể nói nhiều vô kể, nhưng vẫn không thể nào phủ nhận được sự thành công đó đến từ những nỗ lực của mọi con người tại HansenCX. Với đội ngũ 1000 người, từ các chuyên gia lập trình, kiến ​​trúc sư và kỹ sư phần mềm đến các marketer và nhân viên bán hàng đến từ khắp châu lục, chính họ đã tạo ra sức mạnh đoàn kết – HansenCX coi điều đó chính là tài sản vô giá. Tại văn phòng ở nhiều quốc gia khác nhau, mỗi nơi đều có nét văn hóa riêng nhưng trong họ vẫn chung một mục tiêu phát triển. Từ kiến thức chuyên môn vững chắc cho đến sự cống hiến hết mình, chính nguồn nhân lực lớn mạnh đó đã mang đến những trải nghiệm sử dụng dịch vụ tốt nhất cho khách hàng suốt ngần ấy năm qua. Điều đó không chỉ có kinh nghiệm mới làm được mà còn phải có cái tâm của người làm nghề. Và cùng nhau, họ đã làm nên những điều tưởng chừng như không thể!

Không ngừng tìm kiếm nhân tài để đào tạo phát triển

Khi công nghệ ngày càng phát triển, con đường tương lai lại càng trở nên tươi sáng cho những ai đang theo đuổi sự nghiệp lập trình. Trong cuộc đua cạnh tranh về cơ hội việc làm, để tìm được một “bến đỗ” thích hợp giúp phát huy hết năng lực là điều mà ai cũng muốn. Thấu hiểu được khao khát đó của đại đa số, HansenCX đã tạo ra một môi trường bình đẳng để cùng nhau đi lên, đồng thời đẩy mạnh đầu tư vào yếu tố nguồn nhân lực.

Một góc tại văn phòng HansenCX

Trên đà phát triển lớn mạnh, HansenCX vẫn luôn tìm kiếm những nhân tài có tố chất đặc biệt, tinh thần bất diệt và đam mê phát triển với các sản phẩm và dịch vụ mới đóng góp cho mục tiêu lớn của công ty.
Bất cứ ai cũng có thể là nhân tố quan trọng mà HansenCX tìm kiếm. Liệu bạn có muốn đến với HansenCX để được nhận lấy chuỗi đãi ngộ:

  • Lương tháng 13 và các khoản thưởng hấp dẫn vào hằng năm;
  • Cấp laptop, hub, màn hình cấu hình mạnh;
  • Miễn phí khám sức khỏe định kỳ cho nhân viên và cả người thân;
  • Snack và đồ uống luôn có sẵn để nhâm nhi, trưa được hỗ trợ dùng bữa miễn phí;
  • Văn phòng tiện nghi hiện đại, có không gian cà phê thư giãn và khu giải trí riêng;
  • Cấp trên luôn lắng nghe, tận tụy với nhân viên, đội ngũ thân thiện và nhiệt tình;
  • Company trip chơi tẹt ga, Event sôi động xõa đúng đã.

Đặc biệt hơn cả, bạn sẽ được chạm tay đến những cơ hội rất giúp ích cho tương lai phát triển về sau:

  • Thoát khỏi “vùng an toàn” và khám phá ra nhiều tiềm năng vô hạn khác của bản thân;
  • Được “lăn xả” vào các project, nhiệm vụ mới và quy mô;
  • Tham gia các khóa học chuyên sâu để phát triển thêm kiến thức chuyên môn;
  • Kết nối với các đồng nghiệp quốc tế giúp nâng cao khả năng ngoại ngữ;
  • Cơ hội onsite đến các chi nhánh văn phòng khác trên thế giới của HansenCX.

Gõ cửa ngay 2 vị trí đang HOT được HansenCX gửi trao mức lương “khủng”:

  • Product Owner | Offer: Up to $2,500
  • Agile Development Manager (Scrum Master) | Offer: Up to $2,700

Cơ hội đang gần kề – Thể hiện ngay bản lĩnh tại HansenCX

Build một ứng dụng Chat cho Android & iOS bằng Contus Fly như thế nào?

Biên dịch: Dương Đình Tuấn

“Thành công của mỗi ứng dụng chat khác nhau về những chức năng riêng biệt mà nó có” – Vậy thì đâu là những tính năng đáng chú ý, thứ mà bạn mang vào trong chính ứng dụng chat của mình?

Cuộc chiến giữa các nhà cung cấp ứng dụng chat luôn ở mức cao trào!

Khi chúng ta hầu như đều nhận ra rằng các ứng dụng nhắn tin tự động đã thay đổi cách giao tiếp, thông qua việc sử dụng các  smartphone. Thói quen sử dụng smartphone đang tăng dần trong tất cả lĩnh vực và nó cũng cho thấy rằng số lượng người dùng nhắn tin qua ứng dụng chat đang phát triển mạnh, lên đến 2,48 tỷ người dùng trong năm 2021. Những thống kê này hoàn toàn là một dấu hiệu tốt cho các doanh nghiệp có khát khao và chuyên gia kinh doanh đối với việc đem ứng dụng chat ngay sau đây của bạn vào thị trường này.

Nhưng, làm sao để làm ra ứng dụng chat iOS/Android lung linh của bạn với khả năng đánh bại những gã khổng đã làm ứng dụng này trước đây?

Contus Fly, một giải pháp chat thời gian thực (real-time) hiện có mặt tại các doanh nghiệp có quy mô lớn và các công việc liên quan đến công nghiệp khác, để làm ra ứng dụng chat riêng cho họ, cách làm này phù hợp với bất kỳ giải pháp trò chuyện nào. Giải pháp chat hiện đại này được trang bị các tính năng và công nghệ có một không hai để  làm tăng trải nghiệm.

Tìm việc làm android hấp dẫn online tại nhà

Tuyển dụng ios lương cao cho bạn up to 30M

Điều gì làm cho một ứng dụng nhắn tin đúng chuẩn?

  1. Làm theo yêu cầu của khách hàng đã và đang là yêu cầu chính  bên cạnh việc xây dựng thành công của mọi ứng dụng chat, vì thế mà cách này có tiềm năng  tùy biến đối với bất cứ mứ độ nào.
  2. Công cụ Contus Fly chủ động hỗ trợ thêm nhiều tính năng để mang lại hiệu quả tố nhất cho ứng dụng chat của chính bạn.
  3. Nhờ vào giải pháp thanh toán một lần co hiệu lực ngay mà  các yêu cầu của bạn sẽ được phục vụ do một gói đầy đủ các tính năng  hoàn chỉnh và bao gồm cả công cụ bổ sung bên thứ ba.
  4. Ứng nhắn tin tự động này cung cấp toàn bộ nguồn code, Chat SDK và Messenger API’s để tùy chỉnh và WebRTC với các tính năng gọi điện thoại và gọi video.

Công nghệ Core Technology Stacks được sử dụng để tạo ra giao diện Front-end cho người dùng ứng dụng chat Android:

Ngôn ngữ lập trình: Contus Fly sử dụng ngôn ngữ lập trình Java để nâng cao tiềm năng so với các công nghệ tiên tiến khác, cung cấp tốc độ phản hồi tốt hơn và hiệu năng cao. Ngoài ra còn để thực hiện nhiều thao tác đồng thời một cách nhanh chóng.

Lưu trữ dữ liệu: Với một greenDAO Object Relation Mapping có tính năng tương đối và MySQL, đây là các công cụ dùng trong cơ sở dữ liệu, để xử lý một cách tương đối chức năng của ứng dụng chat dành cho hệ điều hành Android.  

Cơ chế lưu trữ : Nó sử dụng API SharedPreference để lưu trữ chung và truy xuất dữ liệu liên tục trong lúc ứng dụng Android bị ngừng hoạt động đột ngột.

Chức năng chat: Trong trường hợp này, cả ứng dụng chat chạy hệ điều hành Android và iOS đều được xây dựng trên trên giao thức XMPP để trao đổi dữ liệu trong thời gian thực giữa server và client.

Chức năng chat bằng video hoặc giọng nói: Khi nói đến ứng dụng Chat trên cả hai nền tảng Android và iOS đều được trang bị WebRTC, đây là tính năng cung cấp liên lạc thời gian thực liên tục bằng việc sử dụng trình duyệt web và các ứng dụng di động.

Sử dụng Key Technology Stack trong việc xây dựng giao diện Front-end cho ứng dụng Chat trên hệ điều hành iOS:

Ngôn ngữ lập trình: Objective- C và Swift là 2 ngôn ngữ chính sử dụng trong viết các script để xây dựng ứng dụng chat có cấu trúc code về UI đơn giản và không quá phức tạp.

Lưu trữ DataBase: nó sử dụng cơ sở dữ liệu đáng tin cậy, đó là Realm để lưu trữ và đồng bộ hai chiều theo nền tảng tương tác thời gian thực.

Cơ chế lưu trữ  : UserDefaults, đây là  giao thức sử dụng cho việc tương tác với người dùng mặc định  và cũng có thể tùy chỉnh để phù hợp với cách chọn lựa của người dùng.

Phát triển Back-end với Primary Technology Stacks:

Ngôn ngữ lập trình: Chính xác thì ứng dụng chat này sử dụng Erlang và PHP để làm phần backend cho cả Android và iOS, mặc dù hiện nay ngôn ngữ Server-side có khả năng cao trong phát triển, đáng tin cậy,  xử lý nhanh và có khả năng chạy trên Unix cả Unix và Windows.

Framework: Sử dụng nhiều framworks đơn giản và hiệu năng mạnh mẽ trong việc kết nối người dùng ở các máy chủ khác nhau như Ejabberd và Laravel.

Cơ chế tự động hóa: ứng dụng sử dụng ba phần mềm tự động hóa mạnh mẽ (Selenium, Tsung và Appium ) để tăng khả năng test các ứng dụng sử dụng giao thức Webdriver.

Cơ sở dữ liệu: Tập hợp lưu trữ toàn bộ dữ liệu thống nhất được thực hiện trên hai cơ sở dữ liệu có liên quan là MySQL   và PostgreSQL nhằm tăng hiệu năng, tính tin cậy và bảo mật của backend.

WebServer: Tính chất bắt buộc trong việc truyền tải tin nhắn là phải càng nhanh, ứng dụng này làm được điều này với việc sử dụng một số máy chủ dựa trên nền tảng web như Apache2/nginx, Ejabberd và PHP.

Web Hosting: IM được trang bị Amazon Web Services(AWS) để cho phép lưu trữ dữ liệu không giới hạn dưới một nền tảng lưu trữ an toàn.

Web Frontend: Để cung cấp chất  lượng trải nghiệm người dùng trực quan hơn, phần backend được xây dựng bằng các ngôn ngữ kịch bản(scripting language) như HTML5, JavaScript và CSS.

Cloud Storage: Hầu hết các nền tảng  nhắn tin tự động đều hợp tác với Amazon S3 Bucket để  bảo mật ba lớp trong việc truyền tải các luồng thông tin.

Xây dựng ứng dụng chat trên web với Significant Technology Stacks:

Giải pháp này sử dụng Nodejs (đây là hệ sinh thái mã nguồn mở sẵn có lớn nhất) vừa gọn nhẹ và vừa mang lại hiệu suất cao. Cũng như sử dụng các tính năng của strophe.js để phát triển ứng dụng chat tự động trên web với giao thức  XMPP chạy trên bất kỳ trình duyệt nào.

Các tính năng bổ sung của ứng dụng nhắn tin tự động IM (Instant Messaging):

Phương thức thanh toán: IM được trang bị các tùy chọn để thanh toán cho các yêu cầu của người dùng. Dù có thay đổi trong cách hình thức thanh toán nào đi nữa, IM cũng cung cấp ra code QR, đây là tính năng trả tiền nhanh dựa vào tính năng bảo mật 3 lớp cho ứng dụng trên web hay ngay trên ứng dụng.

Thông báo ngoại tuyến: Bất kỳ khi nào người dùng đang  trực tuyến hay ngoại tuyến đều đã được kích hoạt hệ thống thông báo ngoại tuyến,hệ thống sẽ truyền thông báo (push) tới người dùng thông qua thông tin mà người dùng đã dùng cung cấp trước đó.

Ngôn ngữ chat: Ứng dụng nhắn tin được trang bị trình biên dịch với tính năng chat cho phép người dùng biên dịch tin nhắn văn bản sang hơn 1000 ngôn ngữ ngay trên màn hình chat trong ứng dụng.

Kết luận:

Mọi nhà cung cấp ứng dụng chat trên Android và iOS đều cung cấp các tính năng độc đáo riêng, nhưng chỉ có một số ít nhà cung cấp có tiềm năng làm ra ứng dụng chat hoàn thiện trên cả hai nền tảng này,  với các tính năng vượt trội và mới mẻ để đáp ứng được nhu cầu trong tương lai. Có nhiều cách để tập trung phát triển phía lưu trữ dưới máy chủ để cung cấp khả năng mở rộng vô hạn. Vì vậy, Contus Fly cũng cung cấp dịch vụ lưu trữ giống xu hướng này và cách làm ra cả ứng dụng chat, từ đó có thể đem lại thu nhập cho chính bạn.

TopDev via Medium

Xem thêm các vị trí tuyển dụng it lương cao tại đây