Home Blog Page 197

Xây dựng một Search-Engine Optimized (SEO) PWA (Progressive web application) bằng Angular – Phần 1

Tác giả: Rajat S

Không quan trọng ứng dụng bạn xây dựng là gì, để nó có thể đến được tay người dùng thì nó phải đến được mắt người dùng trong các kết quả tìm kiếm trước cái đã. Đấy là lý do vì sao Search Engine Optimization (SEO) là một thứ rất quan trọng mà mỗi một lập trình viên khi xây dựng ứng dụng của mình phải chú ý đến.

Trở lại năm 2017, các cuộc khảo sát đã cho thấy rằng, khoảng 27% người dùng điện thoại bỏ qua cửa hàng ứng dụng trên điện thoại của mình, mà tìm đến những công cụ tìm kiếm khác như Google hay Bing.

Chỉ mở cửa hàng ứng dụng trên thiết bị của bạn lên và tìm kiếm một thứ gì đó đơn giản như máy tính bỏ túi chẳng hạn. Thứ bạn nhận được chính là một hằng hà sa số các ứng dụng có thể làm điều tương tự – tính toán.

Điều này chứng tỏ ứng dụng có vị trí top trong các công cụ tìm kiếm là một điều cực kì quan trọng cho mọi lập trình viên. Bởi người dùng tìm kiếm ứng dụng thường không bao giờ xem quá trang đầu hoặc trang hai của kết quả tìm kiếm.

Để hiểu được cách làm việc của công cụ tìm kiếm, hãy xem qua một bài viết khác của Rajat S, “How To Write Better Code in React”.

https://blog.bitsrc.io/how-to-write-better-code-in-react-best-practices-b8ca87d462b0

Nếu bạn vào Google và gõ “React” trên thanh tìm kiếm, thì tại thời điểm Rajat S viết bài này bạn chỉ có thể tìm ra nó ở trang thứ 5!

Nhưng nếu bạn tìm với một từ khóa khác như “better code react”,  thì bài của Rajat S sẽ nhảy ngay lên trang nhất!

Vậy là tạm thời đủ về SEO rồi. Giờ hãy cùng xem qua một PWA (Progressive Web App) là gì nhé!

Dựa theo khái niệm của Google, PWAs có một chút khác biệt với ứng dụng mobile truyền thống. Nó giống như là một trang Web được điều chỉnh để có thể chạy trên mobile vậy. Từ khóa ở đây là “Progressive”, nghĩa là đây là những những ứng dụng/websites mà có thể dần được điều chỉnh phù hợp với cài đặt của thiết bị đầu cuối.

Ở bài này, chúng ta sẽ xây dựng một PWA hoàn toàn mới sử dụng Angular. Bạn sẽ tự tay trải nghiệm làm việc với những thứ như “service workes” và “Angular Resolvers”.

BẮT ĐẦU

Xây dựng một Project Angular

Hãy bắt đầu bằng việc tạo mới một Project Angular trên hệ thống của bạn. Nếu bạn chưa cài đặt Angular CLI thì hãy gõ câu lệnh sau vào cửa sổ câu lệnh của bạn:

$ npm install -g @angular/cli

Sau đó, tạo mới một thư mục trên project vừa tạo tên là comicstore. Để có thể routing trong ứng dụng của chúng ta và sử dụng SASS thay vì CSS truyền thống, thì chúng ta cần phải thêm một số flags sau câu lệnh ng new như sau:

$ ng new comicstore --routing --style scss 
// wait for installation to complete
$ cd comicstore

Chạy câu lệnh ng serve để khởi động Angular Development Server. Server sẽ chạy một ứng dụng angular căn bản trên trình duyệt của bạn với địa chỉ mặc định là localhost:4200.

Nhưng chúng ta không cần những cái mà Angular đã cung cấp sẵn ở đây. Nên hãy loại bỏ nó bằng cách mở file src/app/app.component.html và thay thế toàn bộ code có sẵn với dòng code sau:

<h1>DC Comics Rebirth</h1>

Bootsrap

Chúng ta sẽ sử dụng Bootstrap khá nhiều ở ứng dụng này, đơn giản bởi vì nó sẽ tiết kiệm thời gian viết HTML và CSS của chúng ta.

Truy cập trang web BootstrapCDN và sao chép đường dẫn cho gói CSS hoàn chỉnh. Sau đó trong thư mục project, mở file style.scss và dán đường dẫn vừa sao chép trong import.

@import url(https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css)

Inline File HTML và Style

Khi mà tôi bắt đầu làm việc với Angular, tôi nhận thấy rằng mỗi component trong Angluar có 4 file:

  • File Component Class
  • File Component’s HTML mẫu
  • File Component’s StyleSheet
  • File Component’s Test

Tôi nhận ra rằng mọi thứ sẽ trở nên dễ dàng hơn nếu tôi có thể di chuyển file HTML và file StyleSheet từ các file riêng biệt vào trong file Component Class. Điều này sẽ giảm bớt số lượng file có trong mỗi Component và cũng không phải mở từng file để chỉnh sửa khi muốn sửa code.

Để bắt đầu, xóa file app.component.htmlapp.component.scss từ thư mục src/app. Sau đó vào file app.component.ts và đổi tên thuộc tính templateUrl thành template. Và cũng đổi nội dung của thuộc tính này như sau:

template: `
  <h1>DC Comics Rebirth</h1>
  <router-outlet></router-outlet>
`,

Tương tự, đổi tên thuộc tính styleUrls thành styles và thay đổi nội dung như sau:

styles: [`
  h1{
    color: #0476F2;
  }
`]

Chúng ta cũng ần phải cài đặt cho Angular biết rằng chúng ta sẽ viết HTML và Style CSS trong component. Để làm được thế thì chúng ta sử dụng câu lệnh ng config như sau:

$ ng config schematics.@schematics/angular.component.inlineStyle true
$ ng config schematics.@schematics/angular.component.inlineTemplate true

Sau đó chúng ta sẽ thấy vài thay đổi với object schematics trong file angular.json.

Xây dựng Application Layout

Thay vì tốn thời giờ xây dựng layout từ đầu, chúng ta có thể sử dụng câu lệnh module ui để tạo một ứng dụng đơn giản. Layout này sẽ bao gồm một component cho header, footer và body của layout.

Câu lệnh module ui được sử dụng với câu lệnh ng generate như sau:

$ ng generate module ui --module App

Câu lệnh này sẽ tạo ra một thư mục mới tên là ui bên trong thư mục src/app. Angular sẽ tạo một dòng code import cho thư mục này trong file app.module.ts.

Tiếp theo, chúng ta cần tạo component cho Header, Footer, và Layout của ứng dụng.

$ ng generate component ui/containers/layout 
$ ng generate component ui/containers/header 
$ ng generate component ui/containers/footer

Những dòng lệnh này sẽ tạo một file component chính và một file test cho mỗi component.

Tiếp theo, mở file app-routing.module.ts và thêm vào route mặc định cho LayoutComponent như bên dưới:

const routes: Routes = [{
  path: '',
  component: LayoutComponent,
  children: [],
}];

Bằng cách này, ứng dụng của chúng ta sẽ cài đặt render nội dung của LayoutComponent. Bạn cũng sẽ thấy rằng ứng dụng của chúng ta vẫn hiển thị tag h1 mà chúng ta đã viết bên trong file app.component.ts. Để cho đơn giản hơn, hãy di chuyển nó vào trong file layout.component.ts.

Đầu tiên, vào file app.component.ts, và xóa mảng styles. Và cũng xóa tag h1 trong thuộc tính template.

Bây giờ vào file layout.component.ts được đặt ở trong thư mục app/ui/containers/layout, và viết lại thuộc tính template như bên dưới:

template: `
  <app-header></app-header>
  <div class="container my-8 py-8">
    <router-outlet></router-outlet>
  </div>
  <app-footer></app-footer>
`,

Nếu bị lỗi trên trình duyệt của bạn, hẳn là Angular chưa import RouterModule vào file ui.module.ts. Nếu gặp trường hợp này, hãy xử lý như sau:

@NgModule({
  imports: [
    CommonModule,
    RouterModule
  ],
  declarations: [
    LayoutComponent, 
    HeaderComponent, 
    FooterComponent
  ]
})

Như là tên của của ứng dụng này, thì nó sẽ dùng để lưu truyện tranh. Mà tôi lại là fan của DC Comics, nên tôi sẽ lưu loại này. Vậy nên tôi sẽ vào google và kiếm logo của DC và lưu nó vào thư mục src/assets với tên là logo.svg.

Bây giờ ta sẽ thêm logo vào component header. Mở file header.component.ts và thêm vào những thuộc tính sau cho class HeaderComponent.

public logo = 'assets/logo.svg';
public title = 'DC Comics Rebirth';
public links = [{
  label: 'Comics',
  url: '/Comics',
}]

Xóa nội dung của thuộc tính template. Thay vào đó, chúng ta sẽ thêm vào tag nav như sau:

template: `
  <nav class=navbar navbar-expand navbar-blue fixed-top>
`

Bạn sẽ để ý rằng ở đây sẽ xuất hiện một dòng màu đen dày ở đầu của trình duyệt. Tiếp theo, hãy thêm vào logo và tiêu đề cho header này. Phía sau tag nav, thêm vào như sau:

<a routerLink="/" class="navbar-brand">
  <img [attr.src]="logo" [attr.alt]="title" width="30" height="30>
  {{title}}
</a>

Chúng ta cũng tạo một đường dẫn tên Comics. Vậy chúng ta cũng sẽ thêm đường dẫn này vào component header. Dưới tag a, thêm tag div mới như sau:

<div class="collapse navbar-collpase">     
  <div class="navbar-nav">         
    <a class="nav-item nav-link" *ngFor="let link of links"
    [routerLink]="link.urk" routerLinkActive="active"
    [routerLinkActiveOptions]="{ exact: true }">         
    {{ link.label }}         
    </a>     
  </div> 
</div>

Cuối cùng, header của chúng ta sẽ trông như thế này:

Hãy xử lý luôn component footer. Vào file footer.component.ts và xóa mọi thứ trong thuộc tính template. Vào thêm vào thẻ nav trong thuộc tính template với cùng class như cái ở trong header.

template: `
  <nav class="navbar navbar-expand navbar-dark bg-dark fixed-bottom">
`

Ta sẽ thấy xuất hiện viền màu đen lớn ở cuối trang. Đây sẽ là footer của ta. Bạn sẽ có thể viết bất kỳ thứ gì ở đây. Ví dụ như sau:

<div class="navbar-text m-auto text-white">
  The comics and characters and everything else presented here belongs to DC Comics.
</div>

Lấy dữ liệu trên Angular

Hãy bắt đầu bằng việc tạo mới route tên comic.

$ ng g m comic --routing

Câu lệnh này sẽ tạo một thư mục mới tên là comic bên trong thư mục app.

Mở file app-routing.module.ts và tạo 2 route ới bên trong mảng children.

children: [{
  path: '',
  pathMatch: 'full',
  redirectTo: '/comics',
  }, {
  path: 'comics',
  loadChildren: './comic/comic.module#ComicModule'
}],

Route đầu tiên sẽ dẫn người dùng từ route chưa định nghĩa sang route comics. Route thứ 2 chính là route comics thật.

Bây giờ khi tải lại trang, nó sẽ tự động dẫn vào route comics.

Tiếp theo, Hãy thêm module mới tên là comic:

$ ng g cl comic/models/comic

Bây giờ ta sẽ có một thư mục mới tên là models bên trong thư mục comic. Nó sẽ chứa một file tên comic.ts. Thêm những thuộc tính sau bên trong file này:

export class Comic {
  public id: string;
  public name: string;
  public description: string;
  public image: string;
  public price: number;
}

Tiếp theo, tạo một cặp container để giúp lấy dữ liệu và truyền dữ liệu đó vào những component khác.

$ ng g c comic/containers/comic-list
$ ng g c comic/containers/comic-detail

Những câu lệnh này sẽ tạo ra 2 container components comic-listcomic-detail.

Mở file comic-routing.module.ts và thêm một route vào ComicListComponent. Đường dẫn của route này sẽ trở thành một chuỗi rỗng. Tương tự, thêm một route vào ComicDetailComponent với đường dẫn đổi thành :id.

const routes: Routes = [{     
  path: '',     
  component: ComicListComponent, 
}, {     
  path: ':id',     
  component: ComicDetailComponent, 
}]

Mở file comic-list.component.ts và đặt thuộc tính template thành comics.

template: `
  {{comics | json}}
`,

Làm điều tương tự cho thuộc tính template của file comic-detail.component.ts.

Trong class component của comic-list.component.tscomic-detail.component.ts, thêm một thuộc tính comics mà có kiểu Comic[] và khởi tạo nó như một mảng rỗng.

public comic: Comic[] = new Comic();

Sau đó mở file comic-detail.component.ts và inject ActivatedRoute trong constructor. Việc này sẽ cho phép truyền thuộc tính id từ đường dẫn. Và cũng gán this.comic.id vào this.route.snapshot.paraMap.get('id') trong ngOnInit.

constructor(private route: ActivatedRoute) {}
ngOnInit() {
  this.comic.id = this.route.snapshot.paramMap.get('id');
}

Và để chắc chắn rằng ActivatedRoute được import vào file này:

import { ActivatedRoute } from ‘@angular/router’;

…[Còn tiếp]… 

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

Gửi các push notification giao dịch quan trọng bằng Pusher Beams

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

Chúng tôi vui mừng thông báo rằng Pusher Beams đã kết thúc giai đoạn beta và có thể dùng cho các ứng dụng sản phẩm của bạn!

Chúng tôi tự hào có hơn 10.000 nhà phát triển đang sử dụng Beams để gửi những thông báo giao dịch quan trọng.

Dưới đây là những gì có trong Beams:

  • API đã được hợp nhất để gửi các push notification tới thiết bị iOS, Android và MacOS
  • Có dịch vụ từ máy chủ để quản lý vòng đời của token thiết bị cho các ứng dụng iOS và Android
  • SDK của Android iOS được tạo thủ công bao hàm các bản cập nhật FCM và APN mới nhất
  • Interests để gửi thông báo, bằng cách sử dụng mô hình đăng ký/ đưa tin linh hoạt
  • Insights để báo cáo thông tin phản hồi và các sự kiện mở rộng một cách trực tiếp từ phía khách hàng
  • Debug Console mô tả một log sự kiện thông báo thời gian thực theo chu kỳ

Bạn có thể dùng thử ngay hôm nay, tham khảo tài liệu docs hoặc bắt đầu với một hướng dẫn iOS hoặc Android.

Hiển thị khi thông báo được gửi

Khi chúng tôi phát hành một API push notification phiên bản beta, chúng tôi biết rằng các nhà phát triển thiếu khả năng hiển thị thông báo sau khi  gửi. Ngay cả gateway thông báo của cả Apple (APN) và Google (FCM) cũng không đảm bảo cung cấp điều này.

Thông báo là dịch vụ sống của các ứng dụng để cảnh báo người dùng khi việc giao dịch đang diễn ra, khi tin tức bị hỏng, đôi lúc là một dấu hiệu cho sự thích thú của người dùng hoặc cuộc gọi hội thảo bắt đầu – nhưng  các lập trình viên thường tự hỏi liệu thông báo đã được gửi hay mở chưa.

Khi một thông báo được gửi đến một thiết bị bằng Beams, SDK từ phía khách hàng sẽ báo phản hồi lại bằng một sự kiện xác nhận khi nhận được thông báo. Nếu người dùng nhấn vào thông báo để mở ứng dụng, SDK này sẽ báo cáo lại sang sự kiện mở.

Một nửa trong số tất cả các thông báo mở của Beams  được mở trong vòng một phút rưỡi,cho thấy đây là tiện ích vô cùng mạnh mẽ để tiếp cận người dùng, dù họ đang ở bất cứ đâu.

Bạn có thể xem báo cáo được tổng hợp từ ứng dụng của mình và các sự kiện mở qua Insights hoặc cũng như log sự kiện thời gian thực trong Debug Console.

Dừng việc lãng phí thời gian bằng việc xây dựng gateway

APN và FCM được sử dụng miễn phí, nhưng các lập trình viên  xây dựng cơ sở hạ tầng xung quanh các gateway này gây đau đầu. Trên thực tế, hơn 80% lập trình viên Beams đã cố gắng trực tiếp tích hợp thông báo thông qua APN / FCM trước khi bắt đầu sử dụng Beams.

Đây là lý do tại sao bạn sẽ tiết kiệm  thời gian với Beams:

  • 3 trong số 4 lập trình viên đã có thể nhận được dịch vụ thông báo dạng thử nghiệm được thiết lập với Beams trong 30 phút hoặc ít hơn.
  • Mùa hè này, APNs / FCM đã làm mới 1 trong 10 token của thiết bị được Beams quản lý.Các  nhà phát triển không cần phải lo lắng vì SDK của Beams giữ token thiết bị được cập nhật phía dưới giao diện.
  • API đã sẵn sàng mở rộng quy mô. Bạn có thể gửi thông báo tới 1 triệu thiết bị iOS mỗi phút và 1 triệu thiết bị Android mỗi 17 giây.

Tại Pusher, Beams tự hào cung cấp cơ sở để các lập trình viên dựa vào xây dựng các ứng dụng tốt nhất.

Bước tiến tiếp theo cho Beams là gì? 

Dự định cung cấp cho các lập trình viên tính linh hoạt nhiều hơn nữa đối với mục tiêu thông báo tới người dùng, tăng tính minh bạch cho sự ổn định dịch vụ và cải thiện khả năng phân phối  trên tất cả các thiết bị của bạn.

Beams có một cộng đồng các nhà phát triển năng động – đặc biệt gửi lời cảm ơn đến cộng đồng đã hỗ trợ React Native SDK – và họ rất vui khi nghe ý tưởng của bạn về những điều cần nên làm tiếp theo!

Tham gia cộng đồng Pusher trên Slack hoặc liên hệ bằng cách sử dụng Intercom chat trên docs hoặc dashboard.

Nếu bạn hứng thú với nội dung trên, bạn có thể tương tác thông qua tweet hoặc gắn sao cho SDK trên iOS và trên các Android SDK trên Github.

10 Công cụ Go-To Tech dành riêng cho các Software Developer

Người dịch: Đặng Thanh Hiền

Phát triển phần mềm là một nhiệm vụ đòi hỏi sự tập chung rất lớn về trí tuệ. Nó liên quan đến nhiều vấn đề phức tạp, do đó các nhà phát triển phần mềm luôn phải đi đầu trong việc tạo ra phần mềm tốt nhất trong cuộc chơi của mình.

Là một nhà phát triển phần mềm, để duy trì vị thế dẫn đầu của cuộc chơi, người ta cần phải thay thế sự phức tạp bằng cách đơn giản nhất có thể trong nhiều trường hợp .

Các lập trình viên giỏi đang ở đó, xây dựng các công cụ để giúp cho công việc và cuộc sống của các lập trình viên khác được dễ dàng và thuận tiện hơn.

Nếu không nói về việc quảng cáo, tôi muốn chia sẻ mười công cụ hàng đầu để cải thiện quy trình làm việc của mình và tôi tin rằng họ cũng sẽ tạo nên điều kỳ diệu với bạn.

Tuyển dụng Software Developer mới nhất

Firebase:

Firebase vẫn là giải pháp cho các công cụ truy cập  vào database trên phần mềm của mình. Công cụ tuyệt vời này cung cấp database với thời gian thực và chương trình hỗ trợ phía sau.

Firebase tích hợp tốt với các ứng dụng di động và nó cũng tích hợp với các ứng dụng web.

Với Firebase tôi có thể xây dựng các ứng dụng trong thời gian nhanh chóng mà không phải tự quản lý cơ sở hạ tầng database.

Firebase cung cấp phân tích giá trị di động, cải thiện các quy trình ,quyết định khác nhau có liên quan đến phát triển phần mềm.

Firebase tự động cân đối cho tất cả các ứng dụng. Điều này khiến tôi có thời gian để xây dựng những thứ tốt hơn.

CircleCI:

Không ngừng hội nhập là điều quan trọng trong quá trình phát triển phần mềm ngày nay vì nó đóng một vai trò rất lớn trong các dự án trung bình đến các dự án khủng.

Circle CI giúp tôi đánh dấu các việc cần phải làm của mình để không ngừng hội nhập

Đầu tiên, Circle CI  có các kế hoạch miễn phí cho các dự án mã nguồn mở vì vậy khi xây dựng các dự án mã nguồn mở quan trọng tôi không cần phải tốn kinh phí.

Công cụ này cũng làm việc với Docker – như một người yêu các ứng dụng được đóng gói – không phức tạp. Nói về không phức tạp; Circle CI cũng dễ thiết lập và tích hợp tốt với các dịch vụ cloud hiện có, vì vậy tôi có thể bắt đầu và chạy trong thời gian nhanh nhất.

Code Climate:

Để đánh giá code tự động, code climate là công cụ ưa thích nhất của tôi.

Sau mỗi lần bàn giao Git, nó sẽ tự động phân tích đoạn code của tôi và cung cấp một phân tích vững chắc về các tình huống không tốt khi đưa ra thực tiễn. Điều này đảm bảo rằng code của tôi luôn ở bên trên trạng thái tốt nhất và sau đó tôi có thể cấu trúc lại code của mình ngay lập tức.

CodeClimate cũng phát hiện ra các  code bị trùng lặp, cộng với việc nó có một giao diện người dùng đáng yêu và nên biết rằng công cụ tuyệt vời này là hoàn toàn  miễn phí cho các dự án mã nguồn mở.

CodeClimate không chỉ giúp tôi viết code một cách tốt nhất mà còn giúp tôi trở thành một lập trình viên giỏi hơn.

RollBar:

Là nhà phát triển phần mềm, chúng tôi luôn phải nhấn mạnh sự cần thiết phải xây dựng một hệ thống mạnh mẽ nhất.

Để cải thiện chất lượng phần mềm, chúng ta cần nắm bắt mọi phát sinh trước khi việc sử dụng nó trở thành một trải nghiệm khủng khiếp cho người dùng.

Với Rollbar, tôi có thể nắm được những lỗi phát sinh bị bỏ sót do sự không hoàn hảo của con người. Tất cả những gì tôi cần làm là cài đặt SDK và thực hiện phần còn lại của công việc. Rollbar sẽ xử lý tất cả các lỗi phát sinh.

Bên cạnh việc thiết lập dễ dàng , Rollbar cũng cung cấp việc báo cáo các lỗi một cách đáng kinh ngạc và tôi có thể xem qua lịch sử lỗi cho các ứng dụng của mình.

Docker Cloud:

Sau khi cố gắng làm việc chăm chỉ để xây dựng các ứng dụng hoặc dịch vụ của mình, chúng tôi sẽ triển khai nó. Đáng buồn thay, hóa ra từ trải nghiệm cá nhân và triển khai không phải là quá trình dễ dàng nhất. Phải mất rất nhiều năng lượng của tôi.

Docker Cloud đã  thay đổi cuộc chơi cho tôi. Nó cung cấp một bộ công cụ duy nhất để quản lý tất cả các vùng chứa của tôi trên nhiều clouds; nó cũng cung cấp một mức trừu tượng tuyệt vời vì vậy tôi không phải lo lắng về nhiều thứ khi triển khai các ứng dụng của mình.

BrowserStack:

Nếu bạn viết phần mềm đủ lâu, bạn sẽ  găp phải việc này một vài lần – phần mềm của bạn mặc dù hoạt động tốt trên máy của bạn nhưng sẽ gặp lỗi ở một máy khác.

Vâng, tôi cũng đã trải qua điều này trong một số dự án – bây giờ tôi có thể nói rằng điều đó chỉ còn là quá khứ. Nhờ các browser farms  như BrowserStack, tôi có thể thực hiện các thử nghiệm ứng dụng đa nền tảng của mình trước khi giao hàng cho người dùng.

Tôi có thể sử dụng BrowserStack để kiểm tra cả web và ứng dụng dành cho thiết bị di động. Một điểm cộng lớn là nó cũng tự động kiểm tra. Nó chạy thử nghiệm tự động trên lưới Selenium của nó cho các trang web, và Appium, Espresso cho các ứng dụng di động.

Amazon Web Services:

Đối với cơ sở hạ tầng đám mây, chỉ có một vài đối thủ có thể cạnh tranh với Amazon Web Services. Nhưng không chỉ là về cái tên đi kèm , Amazon Web Services nó đã chứng minh mình vô cùng hữu ích .

Nó rẻ, vì tôi chỉ trả tiền cho những gì tôi sử dụng. Bên cạnh đó, nó là một dịch vụ lưu trữ đám mây đáng tin cậy. Trong sự nghiệp của tôi với tư cách là một nhà phát triển phần mềm, tôi đã lắng nghe mọi người kể cho tôi nghe những câu chuyện về những cơn ác mộng của họ với những dịch vụ lưu trữ đám mây không đáng tin cậy – thật may mắn cho tôi; Tôi không phải đối mặt với những rắc rối như vậy kể từ khi sử dụng AWS.

AWS cũng cung cấp rất nhiều tính năng dịch vụ đám mây, các chương trình và API của bên thứ ba để làm cho quy trình phát triển phần mềm tốt hơn.

Slack:

Trong việc sử dụng các phương pháp nhanh , giữ liên lạc giữa mọi người với nhau nó là một phần rất quan trọng trong việc phát triển phần mềm.

Giữ liên lạc là khẩu hiệu – và Slack giúp tôi điều đó.

Slack đi kèm với một bộ công cụ khổng lồ và các tính năng để làm cho công việc phát triển phần mềm dễ dàng hơn. Điều khiến Slack nổi bật so với các tùy chọn tin nhắn khác là nó tích hợp với rất nhiều công cụ văn phòng.

Slack không chỉ cung cấp bộ công cụ và tùy chọn phong phú với chi phí trải nghiệm hợp lý với người dùng, và nó rất dễ sử dụng.

Redash:

Nếu chúng ta nhìn vào biểu đồ hình tròn của tất cả các quy trình liên quan đến xây dựng phần mềm, thì việc mã hóa sẽ chiếm tỷ lệ lớn nhất. Tuy nhiên, các khía cạnh khác của phát triển phần mềm như sự khôn ngoan trong kinh doanh không nên đi với các khoản tiền phạt.

Trang tổng quan có thể giúp bạn tập trung vào các nhiệm vụ khác nhau có liên quan đến quá trình phát triển phần mềm và Redash sẽ là công cụ hoàn hảo. Redash rất dễ sử dụng và có rất nhiều cách để trực quan hóa dữ liệu.

Trello:

Cộng tác là yếu tố quan trọng đối với mọi dự án phát triển phần mềm và Trello giúp tạo sự cộng tác suôn sẻ giữa các nhà phát triển.

Nó là một công cụ cộng tác trực quan để lập kế hoạch các nhiệm vụ và dự án.

Với Trello, tôi có thể tạo, tổ chức và ưu tiên các hành động và xác định luồng công việc, giao nhiệm vụ cho các thành viên khác của nhóm phát triển phần mềm.

Thông qua việc sử dụng thẻ để tạo và quản lý các tác vụ, việc xác định luồng công việc thú vị hơn rất nhiều.

Conclusion

Hiện nay có rất nhiều công cụ để cải thiện quy trình làm việc trong quá trình phát triển phần mềm. Do đó, danh sách các công cụ tuyệt vời để làm cho cuộc sống dễ dàng hơn cho các nhà phát triển không dừng lại ở đây.

Ví dụ, một công cụ như SauceLabs có thể là một sự thay thế tuyệt vời cho BrowserStack, Airbrake có thể là một sự thay thế tốt cho Rollbar và tất cả phụ thuộc vào sở thích cá nhân.

Bạn sử dụng công cụ nào để cải thiện quy trình phát triển phần mềm của mình? Hãy Cho chúng tôi biết.


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

Hướng dẫn Push Notifications cơ bản trong iOS

Hướng dẫn Push Notifications cơ bản trong iOS

Người dịch: Lê Minh Nhựt

Lưu ý: Hướng dẫn này đã được cập nhật lên Xcode 8.3 và Swift 3.1 bởi József Vesza.

Thật thú vị, Push Notifications cho phép nhà phát triển tiếp cận người dùng và thực hiện các tác vụ nhỏ ngay cả khi người dùng không chủ động sử dụng ứng dụng!

Push Notifications đã trở nên ngày càng mạnh mẽ hơn kể từ khi nó được ra mắt lần đầu tiên. Trong iOS 10, Push Notifications có thể :

  • Hiển thị tin nhắn văn bản ngắn
  • Phát âm thanh thông báo
  • Đặt số huy hiệu trên biểu tượng của ứng dụng
  • Cung cấp các hành động mà người dùng có thể thực hiện mà không cần mở ứng dụng
  • Hiển thị tệp đính kèm phương tiện
  • Im lặng, cho phép ứng dụng chạy ngầm và thực hiện tác vụ

Tìm việc ios làm online tại nhà cho bạn

Hướng dẫn push notifications này sẽ xem xét cách push notifications hoạt động và cho phép bạn thử các tính năng của chúng.

Trước khi bắt đầu, bạn sẽ cần những điều sau đây để kiểm tra push notifications :

  • Thiết bị iOS : Thông báo đẩy không hoạt động trong máy ảo, vì vậy bạn sẽ cần một thiết bị thực tế.
  • Thành viên của Chương trình dành cho nhà phát triển Apple : Kể từ Xcode 7, bạn có thể thử nghiệm các ứng dụng trên thiết bị của mình mà không cần phải là thành viên của chương trình. Tuy nhiên, để cấu hình các thông báo đẩy bạn cần một chứng chỉ thông báo đẩy cho ID ứng dụng của bạn, yêu cầu phải có tư cách thành viên chương trình.
  • Pusher : bạn sẽ sử dụng ứng dụng này để gửi thông báo tới thiết bị. Để cài đặt, hãy làm theo hướng dẫn tại đây .

Bắt đầu 

Có 3 nhiệm vụ chính phải được thực hiện để gửi và nhận push notification :

  1. Ứng dụng phải được định cấu hình đúng và được đăng ký với Dịch vụ push notification của Apple (APNS) để nhận push notification khi khởi động.
  2. Máy chủ phải gửi push notification tới APNS hướng đến một hoặc nhiều thiết bị cụ thể.
  3. Ứng dụng phải nhận được push notification ; sau đó nó có thể thực hiện các tác vụ hoặc xử lý các hành động của người dùng bằng cách sử dụng callbacks trong  application delegate .

Nhiệm vụ 1 và 3 sẽ là trọng tâm chính của hướng dẫn này vì chúng là trách nhiệm của nhà phát triển iOS.

Nhiệm vụ 2 cũng sẽ được trình bày ngắn gọn, chủ yếu cho mục đích thử nghiệm. Gửi push notification là trách nhiệm của máy chủ ( server ) của ứng dụng và thường được triển khai khác nhau từ ứng dụng này sang ứng dụng khác. Nhiều ứng dụng sử dụng các bên thứ ba (bạn có thể tìm thấy một số ví dụ tốt ở đây ) để gửi push notification, trong khi các ứng dụng khác sử dụng các giải pháp tùy chỉnh và / hoặc các thư viện phổ biến (ví dụ: Houston ).

Để bắt đầu, hãy tải xuống dự án khởi động của WenderCast . WenderCast là nguồn truy cập của mọi người cho các podcast trên mạng và tin tức mới nhất.

Mở WenderCast.xcodeproj trong Xcode và xem nhanh xung quanh. Xây dựng và chạy trong trình mô phỏng iPhone để xem các podcast mới nhất (bạn sẽ sớm sử dụng thiết bị thực!):

Hướng dẫn Push Notifications cơ bản trong iOS

Vấn đề với ứng dụng là nó không cho phép người dùng biết khi nào một podcast mới có sẵn. Nó cũng không thực sự có bất kỳ tin tức nào để hiển thị. Bạn sẽ sớm khắc phục tất cả những điều đó với sức mạnh của push notifications !

Định cấu hình ứng dụng hướng dẫn push notification

Thông báo đẩy yêu cầu nhiều bảo mật. Điều này khá quan trọng vì bạn không muốn bất kỳ ai khác gửi thông báo đẩy tới người dùng của mình. Thật không may, điều này có nghĩa là có một số nhiệm vụ cần thiết để định cấu hình ứng dụng cho push notification.

Bật dịch vụ thông báo đẩy

Bước đầu tiên là thay đổi ID ứng dụng. Chuyển đến App Settings -> General và thay đổi Bundle Identifier thành một thứ duy nhất:

Hướng dẫn Push Notifications cơ bản trong iOS

Trong Signing ngay bên dưới mục này, hãy chọn Nhóm phát triển của bạn . Một lần nữa, đây phải là tài khoản nhà phát triển có trả phí. Nếu bạn không thấy bất kỳ nhóm nào, trước tiên bạn cần phải thêm nhóm phát triển của mình qua Xcode -> Preferences -> Accounts -> + .

Tiếp theo, bạn cần tạo ID ứng dụng trong tài khoản nhà phát triển của mình đã bật quyền push notification . Mai mắn là , Xcode có một cách đơn giản để làm điều này. Chuyển đến App Settings -> Capabilities và lật nút gạt để bật Push Notifications thành On .

Sau khi tải một số, nó sẽ giống như thế này:

Hướng dẫn Push Notifications cơ bản trong iOS

Nếu có bất kỳ sự cố nào xảy ra, hãy truy cập Trung tâm nhà phát triển Apple . Bạn có thể chỉ cần đồng ý với giấy phép nhà phát triển mới, mà Apple muốn cập nhật và thử lại. Trường hợp xấu, bạn có thể cần phải thêm các push notification theo cách thủ công bằng cách sử dụng các nút + và Edit .

Điều này tạo ra ID ứng dụng và sau đó cho phép nó thêm các push notification . Bạn có thể đăng nhập vào Trung tâm nhà phát triển Apple và xác minh điều này:

Hướng dẫn Push Notifications cơ bản trong iOS

Đó là tất cả những gì bạn cần phải cấu hình ngay bây giờ.

Đăng ký thông báo đẩy

Có hai bước để đăng ký thông báo đẩy. Trước tiên, bạn phải có được sự cho phép của người dùng để hiển thị bất kỳ loại thông báo nào, sau đó bạn có thể đăng ký các thông báo từ xa. Nếu mọi việc suôn sẻ, sau đó hệ thống sẽ cung cấp cho bạn device token mà bạn có thể coi là “địa chỉ” cho thiết bị này.

Trong WenderCast, bạn sẽ đăng ký thông báo đẩy ngay sau khi ứng dụng khởi chạy.

Mở AppDelegate.swift và thêm mục nhập sau vào đầu tệp:

import UserNotifications

Sau đó thêm phương thức sau vào cuối AppDelegate:

func registerForPushNotifications() {
  UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) {
    (granted, error) in
    print("Permission granted: \(granted)")
  }
}

Cuối cùng, thêm cuộc gọi registerForPushNotifications()vào cuối application(_:didFinishLaunchingWithOptions:):

func application(
  _ application: UIApplication,
  didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
  // ... existing code ...
  registerForPushNotifications()
  return true
}

Hãy đi qua phần trên: UNUserNotificationCenterđã được giới thiệu trong iOS 10 trong khung UserNotifications. Nó chịu trách nhiệm quản lý tất cả các hoạt động liên quan đến thông báo trong ứng dụng.

Bạn gọi requestAuthorization(options:completionHandler:)đến (bạn đoán nó) yêu cầu ủy quyền cho các thông báo đẩy. Tại đây, bạn phải chỉ định các loại thông báo mà ứng dụng của bạn sẽ sử dụng. Các loại (được đại diện bởi UNAuthorizationOptions) có thể là bất kỳ sự kết hợp nào sau đây:

  • .badge cho phép ứng dụng hiển thị số ở góc của biểu tượng ứng dụng.
  • .sound cho phép ứng dụng phát âm thanh.
  • .alert cho phép ứng dụng hiển thị văn bản.
  • .carPlay cho phép ứng dụng hiển thị thông báo trong môi trường CarPlay.

Bạn gọi registerForPushNotificationsbên trong application(_:didFinishLaunchingWithOptions:)để đảm bảo ứng dụng demo sẽ cố gắng đăng ký thông báo đẩy bất kỳ khi nào ứng dụng được khởi chạy.

Xây dựng và chạy. Khi ứng dụng khởi chạy, bạn sẽ nhận được lời nhắc yêu cầu quyền gửi thông báo cho bạn.

Hướng dẫn Push Notifications cơ bản trong iOS

Nhấn OK và poof! Ứng dụng hiện có thể hiển thị thông báo. Tuyệt quá! Nhưng giờ thì sao? Điều gì xảy ra nếu người dùng từ chối quyền? Thêm phương thức này vào bên trong AppDelegate:

func getNotificationSettings() {
  UNUserNotificationCenter.current().getNotificationSettings { (settings) in
    print("Notification settings: \(settings)")
  }
}

Phương pháp này rất khác với phương pháp trước. Trong phương pháp trước, bạn đã chỉ định cài đặt bạn muốn , nhưng phương thức này trả về cài đặt mà người dùng đã cấp .

Điều quan trọng là phải gọi getNotificationSettings(completionHandler:)trong trình xử lý hoàn tất requestAuthorization, điều này xảy ra bất cứ khi nào ứng dụng kết thúc khởi chạy. Điều này là do người dùng có thể, bất cứ lúc nào, đi vào ứng dụng Cài đặt và thay đổi quyền thông báo.

Cập nhật requestAuthorizationđể gọi getNotificationSettings()trong vòng kết thúc hoàn thành như sau:

func registerForPushNotifications() {
  UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) {
    (granted, error) in
    print("Permission granted: \(granted)")

    guard granted else { return }
    self.getNotificationSettings()
  }
}

Bước 1 bây giờ đã hoàn tất, và bây giờ bạn đã sẵn sàng đăng ký các thông báo từ xa!

Cập nhật getNotificationSettings()với những điều sau đây:

func getNotificationSettings() {
  UNUserNotificationCenter.current().getNotificationSettings { (settings) in
    print("Notification settings: \(settings)")
    guard settings.authorizationStatus == .authorized else { return }
    UIApplication.shared.registerForRemoteNotifications()
  }
}

Ở đây bạn xác minh authorizationStatuslà .authorized, nghĩa là người dùng đã cấp quyền thông báo và nếu có, bạn gọi UIApplication.shared.registerForRemoteNotifications().

Thêm hai phương pháp sau đây để kết thúc AppDelegate; chúng sẽ được gọi để thông báo cho bạn về kết quả của registerForRemoteNotifications:

func application(_ application: UIApplication,
                 didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
  let tokenParts = deviceToken.map { data -> String in
    return String(format: "%02.2hhx", data)
  }
  
  let token = tokenParts.joined()
  print("Device Token: \(token)")
}

func application(_ application: UIApplication,
                 didFailToRegisterForRemoteNotificationsWithError error: Error) {
  print("Failed to register: \(error)")
}

Như tên được đề xuất, hệ thống sẽ gọi application(_:didRegisterForRemoteNotificationsWithDeviceToken:)nếu đăng ký thành công, nếu không nó sẽ gọi application(_:didFailToRegisterForRemoteNotificationsWithError:).

Việc thực hiện hiện tại có application(_:didRegisterForRemoteNotificationsWithDeviceToken:)vẻ khó hiểu, nhưng nó chỉ đơn giản là lấy deviceTokenvà chuyển đổi nó thành một chuỗi. Mã thông báo thiết bị là thành quả của quá trình này. Nó là một mã thông báo được cung cấp bởi APNS xác định duy nhất ứng dụng này trên thiết bị cụ thể này. Khi gửi thông báo đẩy, ứng dụng sẽ sử dụng mã thông báo thiết bị làm “địa chỉ” để gửi thông báo tới thiết bị chính xác.

Lưu ý: Có một số lý do khiến đăng ký có thể không thành công. Hầu hết thời gian là do ứng dụng đang chạy trên trình mô phỏng hoặc vì cấu hình ID ứng dụng không được thực hiện đúng cách. Thông báo lỗi thường cung cấp một gợi ý tốt cho những gì sai.

Đó là nó! Xây dựng và chạy. Đảm bảo bạn đang chạy trên thiết bị và bạn sẽ nhận được mã thông báo thiết bị trong đầu ra của bảng điều khiển. Đây là những gì tôi trông giống như:

Hướng dẫn Push Notifications cơ bản trong iOS

Sao chép mã thông báo này ở nơi nào đó tiện dụng.

Bạn có nhiều cấu hình hơn để thực hiện trước khi bạn có thể gửi thông báo đẩy, vì vậy hãy truy cập Trung tâm thành viên của nhà phát triển Apple và đăng nhập.

Tạo chứng chỉ SSL và tệp PEM

Trong trung tâm thành viên của bạn, chuyển đến Certificates, IDs & Profiles -> Identifiers  -> App IDs và chọn ID ứng dụng cho ứng dụng của bạn. Trong Application Services , Thông báo đẩy sẽ hiển thị dưới dạng Có thể Configurable :

Hướng dẫn Push Notifications cơ bản trong iOS

Nhấp vào Edit và cuộn xuống Push Notifications :

Hướng dẫn Push Notifications cơ bản trong iOS

Trong Development SSL Certificate , hãy nhấp vào Create Certificate … và làm theo các bước để tạo CSR . Khi bạn có CSR của mình, hãy nhấp vào continue và làm theo các bước để Generate chứng chỉ của bạn bằng CSR. Cuối cùng, tải xuống chứng chỉ và nhấp đúp vào chứng chỉ, nó sẽ thêm nó vào Keychain của bạn, được ghép nối với khóa riêng:

Quay lại trung tâm thành viên, ID ứng dụng của bạn hiện đã bật thông báo đẩy để phát triển:

Hướng dẫn Push Notifications cơ bản trong iOS

Đó là rất nhiều thứ để vượt qua, nhưng tất cả đều đáng giá – với tệp chứng chỉ mới của bạn, bạn đã sẵn sàng gửi Push Notification đầu tiên của mình!

Gửi thông báo đẩy

Gửi thông báo đẩy yêu cầu kết nối SSL tới APNS, được bảo mật bằng chứng chỉ đẩy bạn vừa tạo. Đó là nơi Pusher bước vào.

Khởi chạy Pusher . Ứng dụng sẽ tự động kiểm tra các chứng chỉ đẩy trong Keychain và liệt kê chúng trong danh sách thả xuống. Hoàn thành các bước sau:

  • Chọn chứng chỉ đẩy của bạn từ menu thả xuống.
  • Dán mã thông báo thiết bị của bạn vào trường “Mã thông báo đẩy thiết bị”.
  • Sửa đổi phần thân yêu cầu để trông như thế này:
{
  "aps": {
    "alert": "Breaking News!",
    "sound": "default",
    "link_url": "https://raywenderlich.com"
  }
}
  • Trên thiết bị bạn đã chạy WenderCast trước đó, bật ứng dụng hoặc khóa thiết bị, nếu không thiết bị sẽ không hoạt động *
  • Nhấp vào nút Push trong Pusher.

Hướng dẫn Push Notifications cơ bản trong iOS

Bạn sẽ nhận được thông báo đẩy đầu tiên của mình:

Hướng dẫn Push Notifications cơ bản trong iOS

Lưu ý: Bạn sẽ không thấy bất cứ điều gì nếu ứng dụng đang mở và chạy ở nền trước. Thông báo được gửi nhưng chưa có ứng dụng nào xử lý được. Chỉ cần đóng ứng dụng và gửi lại thông báo.

Các vấn đề chung

Có một vài vấn đề có thể phát sinh:

Một số thông báo nhận được nhưng không phải tất cả: Nếu bạn đang gửi nhiều thông báo đẩy đồng thời và chỉ một vài thông báo được nhận, đừng sợ! Đó là hành vi dự định. APNS duy trì một hàng đợi QoS (Chất lượng dịch vụ) cho mỗi thiết bị với một ứng dụng push. Kích thước của hàng đợi này là 1, vì vậy nếu bạn gửi nhiều thông báo, thông báo cuối cùng sẽ bị ghi đè.

Sự cố khi kết nối với Dịch vụ thông báo đẩy: Một khả năng có thể là có tường lửa chặn các cổng được APNS sử dụng. Đảm bảo bạn bỏ chặn các cổng này. Một khả năng khác có thể là khóa riêng và tệp CSR là sai. Hãy nhớ rằng mỗi ID ứng dụng có một kết hợp khóa riêng và CSR riêng.

Giải phẫu thông báo đẩy cơ bản

Trước khi bạn chuyển sang Nhiệm vụ 3, xử lý thông báo đẩy, hãy xem phần thân của thông báo bạn vừa gửi:

{
  "aps": {
    "alert": "Breaking News!",
    "sound": "default",
    "link_url": "https://raywenderlich.com"
  }

Đối với JSON-uninitiated, một khối được giới hạn bởi dấu ngoặc nhọn {} chứa một từ điển bao gồm các cặp khóa / giá trị (giống như một Swift Dictionary).

Tải trọng là một từ điển có chứa ít nhất một mục, aps , mà chính nó cũng là một từ điển. Trong ví dụ này, “aps” chứa các lĩnh vực alertsoundvà link_url. Khi nhận được thông báo đẩy này, nó sẽ hiển thị một giao diện cảnh báo với văn bản “Breaking News!” Và phát hiệu ứng âm thanh chuẩn.

link_url thực sự là một trường tùy chỉnh. Bạn có thể thêm các trường tùy chỉnh vào tải trọng như thế này và chúng sẽ được gửi đến ứng dụng của bạn. Vì bạn chưa xử lý nó bên trong ứng dụng, cặp khóa / giá trị này hiện không có gì.

Có sáu phím bạn có thể thêm vào apstừ điển:

  • alert. Đây có thể là một chuỗi, như trong ví dụ trước hoặc từ điển. Là một từ điển, nó có thể bản địa hóa văn bản hoặc thay đổi các khía cạnh khác của thông báo.
  • badge. Đây là một số sẽ hiển thị ở góc của biểu tượng ứng dụng. Bạn có thể xóa huy hiệu bằng cách đặt biểu tượng này thành 0.
  • thread-id. Bạn có thể sử dụng phím này để nhóm thông báo.
  • sound. Bằng cách đặt khóa này, bạn có thể phát âm thanh thông báo tùy chỉnh trong ứng dụng thay cho âm thanh thông báo mặc định. Âm thanh thông báo tùy chỉnh phải ngắn hơn 30 giây và có một số hạn chế.
  • content-available. Bằng cách đặt khóa này thành 1, thông báo đẩy sẽ trở thành thông báo im lặng. Điều này sẽ được khám phá sau trong hướng dẫn thông báo đẩy này.
  • category. Điều này xác định danh mục của thông báo, được sử dụng để hiển thị các hành động tùy chỉnh trên thông báo. Bạn cũng sẽ sớm khám phá điều này.

Ngoài những điều này, bạn có thể thêm bao nhiêu dữ liệu tùy chỉnh tùy ý, miễn là tải trọng không vượt quá kích thước tối đa 4096 byte.

Khi bạn đã có đủ niềm vui khi gửi thông báo đẩy tới thiết bị của mình, hãy chuyển sang phần tiếp theo. :]

Xử lý thông báo đẩy

Trong phần này, bạn sẽ tìm hiểu cách thực hiện các hành động trong ứng dụng của mình khi nhận được thông báo đẩy và / hoặc khi người dùng chạm vào chúng.

Điều gì sẽ xảy ra khi bạn nhận được thông báo đẩy?

Khi ứng dụng của bạn nhận được thông báo đẩy, phương thức UIApplicationDelegateđược gọi.

Thông báo cần được xử lý khác nhau tùy thuộc vào trạng thái ứng dụng của bạn khi nhận được:

  • Nếu ứng dụng của bạn không chạy và người dùng khởi chạy ứng dụng bằng cách nhấn vào thông báo đẩy, thông báo đẩy sẽ được chuyển đến ứng dụng của bạn trong launchOptionssố application(_:didFinishLaunchingWithOptions:).
  • Nếu ứng dụng của bạn đang chạy ở nền trước hoặc nền, application(_:didReceiveRemoteNotification:fetchCompletionHandler:)sẽ được gọi. Nếu người dùng mở ứng dụng bằng cách nhấn vào thông báo đẩy, phương pháp này có thể được gọi lại, vì vậy bạn có thể cập nhật giao diện người dùng và hiển thị thông tin có liên quan.

Trong trường hợp đầu tiên, WenderCast sẽ tạo mục tin tức và mở trực tiếp lên phần tin tức. Thêm mã sau vào cuối application(_:didFinishLaunchingWithOptions:), trước câu lệnh return:

// Check if launched from notification
// 1
if let notification = launchOptions?[.remoteNotification] as? [String: AnyObject] {
  // 2
  let aps = notification["aps"] as! [String: AnyObject]
  _ = NewsItem.makeNewsItem(aps)
  // 3
  (window?.rootViewController as? UITabBarController)?.selectedIndex = 1
}

Mã này thực hiện ba điều:

  1. Nó kiểm tra xem giá trị UIApplicationLaunchOptionsKey.remoteNotificationcó tồn tại không launchOptions. Nếu có, đây sẽ là tải trọng thông báo đẩy bạn đã gửi.
  2. Nếu nó tồn tại, bạn lấy apstừ điển và chuyển nó vào createNewNewsItem(_:), đó là một phương thức trợ giúp được cung cấp để tạo một NewsItemtừ điển và làm mới bảng tin tức.
  3. Cuối cùng, nó thay đổi tab đã chọn của bộ điều khiển tab đến 1, phần tin tức.

Để kiểm tra điều này, bạn cần chỉnh sửa lược đồ của WenderCast:

Trong Chạy -> Thông tin , chọn Chờ để thực thi được khởi chạy :

Hướng dẫn Push Notifications cơ bản trong iOS

Tùy chọn này sẽ làm cho trình gỡ rối chờ ứng dụng được khởi chạy lần đầu tiên sau khi cài đặt để đính kèm vào nó.

Xây dựng và chạy. Sau khi cài đặt xong, hãy gửi lại một số tin tức mới. Chạm vào thông báo và ứng dụng sẽ mở ra một số tin tức:

Hướng dẫn Push Notifications cơ bản trong iOS

Lưu ý: Nếu bạn ngừng nhận thông báo đẩy, có thể mã thông báo thiết bị của bạn đã thay đổi. Điều này có thể xảy ra nếu bạn gỡ cài đặt và cài đặt lại ứng dụng. Kiểm tra kỹ mã thông báo thiết bị để đảm bảo.

Để xử lý trường hợp khác, hãy thêm phương thức sau vào AppDelegate:

func application(
  _ application: UIApplication,
  didReceiveRemoteNotification userInfo: [AnyHashable : Any],
  fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
  
  let aps = userInfo["aps"] as! [String: AnyObject]
  _ = NewsItem.makeNewsItem(aps)
}

Phương thức này trực tiếp sử dụng hàm trợ giúp để tạo một hàm mới NewsItem. Bây giờ bạn có thể thay đổi lược đồ trở lại để khởi động ứng dụng tự động nếu bạn muốn.

Xây dựng và chạy. Giữ ứng dụng chạy ở nền trước và trên phần Tin tức. Gửi một thông báo đẩy tin tức khác và xem khi nó xuất hiện một cách kỳ diệu trong nguồn cấp dữ liệu:

thông báo đẩy hướng dẫn

Đó là nó! Ứng dụng của bạn hiện có thể xử lý tin tức vi phạm theo cách cơ bản này.

Một cái gì đó quan trọng xem xét: nhiều lần, thông báo đẩy có thể bị bỏ qua. Điều này là ổn cho WenderCast, vì có danh sách đầy đủ các tin tức không phải là quá quan trọng cho ứng dụng này, nhưng nói chung bạn không nên sử dụng các thông báo đẩy như cách duy nhất để cung cấp nội dung.

Thay vào đó, các thông báo đẩy sẽ báo hiệu rằng có sẵn nội dung mới và cho phép ứng dụng tải xuống nội dung từ nguồn (ví dụ: từ API REST). WenderCast là một chút hạn chế trong ý nghĩa này, vì nó không có một thành phần phía máy chủ thực sự.

Thông báo hành động

Thông báo có thể thực hiện cho phép bạn thêm các nút tùy chỉnh vào chính thông báo. Bạn có thể đã nhận thấy điều này trên thông báo qua email hoặc Tweets cho phép bạn “trả lời” hoặc “yêu thích” ngay tại chỗ.

Thông báo có thể thao tác được xác định bởi ứng dụng của bạn khi bạn đăng ký thông báo bằng cách sử dụng danh mục . Mỗi loại thông báo có thể có một vài hành động tùy chỉnh đặt trước.

Sau khi đăng ký, máy chủ của bạn có thể đặt danh mục thông báo đẩy; các hành động tương ứng sẽ có sẵn cho người dùng khi nhận được.

Đối với WenderCast, bạn sẽ xác định danh mục “Tin tức” với hành động tùy chỉnh có tên “Chế độ xem” cho phép người dùng xem trực tiếp tin bài trong ứng dụng nếu họ chọn.

Thay thế registerForPushNotifications()trong AppDelegatenhững điều sau:

func registerForPushNotifications() {
  UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) {
    (granted, error) in      
    print("Permission granted: \(granted)")
    
    guard granted else { return }
    
    // 1
    let viewAction = UNNotificationAction(identifier: viewActionIdentifier,
                                          title: "View",
                                          options: [.foreground])
    
    // 2
    let newsCategory = UNNotificationCategory(identifier: newsCategoryIdentifier,
                                              actions: [viewAction],
                                              intentIdentifiers: [],
                                              options: [])
    // 3
    UNUserNotificationCenter.current().setNotificationCategories([newsCategory])
    
    self.getNotificationSettings()
  }
}

Dưới đây là những gì mã mới thực hiện:

  1. Ở đây bạn tạo một hành động thông báo mới, với tiêu đề Xem trên nút, mở ứng dụng ở nền trước khi được kích hoạt. Hành động có một số nhận dạng riêng biệt, được sử dụng để phân biệt giữa các hành động khác trên cùng một thông báo.
  2. Tiếp theo, bạn xác định danh mục tin tức, sẽ chứa hành động xem. Nó cũng có một định danh riêng biệt, mà tải trọng của bạn sẽ cần phải chứa để xác định, rằng thông báo đẩy thuộc về thể loại này.
  3. Cuối cùng, bằng cách gọi setNotificationCategories(_:), bạn đăng ký thông báo hành động mới.

Đó là nó! Xây dựng và chạy ứng dụng để đăng ký cài đặt thông báo mới.

Nền ứng dụng và sau đó gửi tải trọng sau thông qua Pusher :

{
   "aps" : {
     "alert" : "Tin tức mới nhất!" ,
     "sound" : "mặc định" ,     "link_url" : "https://raywenderlich.com" ,
     "category" : "NEWS_CATEGORY"   } 
}

Nếu mọi việc suôn sẻ, bạn sẽ có thể kéo xuống thông báo để hiển thị hành động Xem:

Hướng dẫn Push Notifications cơ bản trong iOS

Tốt đẹp! Khai thác trên nó sẽ khởi động WenderCast, nhưng nó sẽ không làm bất cứ điều gì. Để hiển thị mục tin tức, bạn cần thực hiện một số thao tác xử lý sự kiện khác trong ủy nhiệm.

Xử lý các hành động thông báo

Bất cứ khi nào một hành động thông báo được kích hoạt, UNUserNotificationCenterthông báo cho đại biểu của nó. Quay lại trong AppDelegate.swift , thêm phần mở rộng lớp sau vào cuối tệp:

extension AppDelegate: UNUserNotificationCenterDelegate {
  
  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              didReceive response: UNNotificationResponse,
                              withCompletionHandler completionHandler: @escaping () -> Void) {
    // 1
    let userInfo = response.notification.request.content.userInfo
    let aps = userInfo["aps"] as! [String: AnyObject]
    
    // 2
    if let newsItem = NewsItem.makeNewsItem(aps) {
      (window?.rootViewController as? UITabBarController)?.selectedIndex = 1
      
      // 3
      if response.actionIdentifier == viewActionIdentifier,
        let url = URL(string: newsItem.link) {
        let safari = SFSafariViewController(url: url)
        window?.rootViewController?.present(safari, animated: true, completion: nil)
      }
    }
    
    // 4
    completionHandler()
  }
}

Đây là cuộc gọi lại mà bạn nhận được khi ứng dụng được mở bởi một hành động tùy chỉnh. Có vẻ như có rất nhiều thứ đang diễn ra, nhưng thực sự không có gì mới ở đây:

  1. Lấy apstừ điển.
  2. Tạo NewsItemtừ từ điển và điều hướng đến phần Tin tức.
  3. Kiểm tra mã định danh hành động, được chuyển thành dạng identifier. Nếu đó là hành động “Xem” và liên kết là một URL hợp lệ, nó sẽ hiển thị liên kết trong a SFSafariViewController.
  4. Gọi bộ xử lý hoàn thành được hệ thống truyền cho bạn sau khi xử lý hành động.

Có một bit cuối cùng: bạn phải thiết lập ủy nhiệm UNUserNotificationCenter. Thêm dòng này vào đầu application(_:didFinishLaunchingWithOptions:):

UNUserNotificationCenter .current (). Delegate = self

Xây dựng và chạy. Đóng lại ứng dụng, sau đó gửi thông báo tin tức khác với trọng tải sau:

{
  "aps": {
    "alert": "New Posts!",
    "sound": "default",
    "link_url": "https://raywenderlich.com",
    "category": "NEWS_CATEGORY"
  }
}

Chạm vào hành động, và bạn sẽ thấy WenderCast trình bày một trình điều khiển Safari View ngay sau khi nó khởi chạy:

Hướng dẫn Push Notifications cơ bản trong iOS

Xin chúc mừng, bạn vừa triển khai một thông báo có thể hành động! Gửi thêm một số thông tin khác và thử mở thông báo theo các cách khác nhau để xem cách hoạt động của thông báo.

Thông báo đẩy im lặng

Thông báo đẩy im lặng có thể đánh thức ứng dụng của bạn một cách im lặng để thực hiện một số tác vụ trong nền. WenderCast có thể sử dụng tính năng này để lặng lẽ làm mới danh sách podcast.

Như bạn có thể tưởng tượng, với một thành phần máy chủ thích hợp, điều này có thể rất hiệu quả. Ứng dụng của bạn sẽ không cần phải thăm dò liên tục dữ liệu – bạn có thể gửi thông báo đẩy im lặng bất cứ khi nào có dữ liệu mới.

Để bắt đầu, hãy đi tới Cài đặt ứng dụng -> Capabilites và bật Chế độ nền cho WenderCast. Kiểm tra tùy chọn cuối cùng, Thông báo từ xa :

Hướng dẫn Push Notifications cơ bản trong iOS

Bây giờ ứng dụng của bạn sẽ thức dậy dưới nền khi ứng dụng nhận được một trong các thông báo đẩy này.

Bên trong AppDelegate, thay thế application(_:didReceiveRemoteNotification:)bằng phiên bản mạnh mẽ hơn này:

func application(
  _ application: UIApplication,
  didReceiveRemoteNotification userInfo: [AnyHashable : Any],
  fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
  
  let aps = userInfo["aps"] as! [String: AnyObject]
  
  // 1
  if aps["content-available"] as? Int == 1 {
    let podcastStore = PodcastStore.sharedStore
    // Refresh Podcast
    // 2
    podcastStore.refreshItems { didLoadNewItems in
      // 3
      completionHandler(didLoadNewItems ? .newData : .noData)
    }
  } else  {
    // News
    // 4
    _ = NewsItem.makeNewsItem(aps)
    completionHandler(.newData)
  }
}

Hãy đi qua mã:

  1. Kiểm tra xem liệu content-availablecó được đặt thành 1 hay không, để xem liệu đó có phải là thông báo im lặng hay không.
  2. Làm mới danh sách podcast, cuộc gọi mạng và do đó không đồng bộ.
  3. Khi danh sách được làm mới, hãy gọi trình xử lý hoàn thành và cho phép hệ thống biết liệu có bất kỳ dữ liệu mới nào được tải hay không.
  4. Nếu nó không phải là một thông báo im lặng, giả sử nó là tin tức một lần nữa và tạo ra một mục tin tức.

Hãy chắc chắn để gọi xử lý hoàn thành với kết quả trung thực. Hệ thống đo mức tiêu thụ pin và thời gian mà ứng dụng của bạn sử dụng trong nền và có thể điều chỉnh ứng dụng của bạn nếu cần.

Thats tất cả để có nó; để kiểm tra nó, đẩy tải trọng sau đây thông qua Pusher :

{
   "aps" : {
     "content-available" : 1   } 
}

Nếu mọi việc suôn sẻ, không có gì xảy ra! Để xem mã đang chạy, hãy thay đổi lược đồ thành “Chờ cho thực thi được khởi chạy” một lần nữa và đặt một điểm ngắt trong application(_:didReceiveRemoteNotification:fetchCompletionHandler:)để đảm bảo nó chạy.

TopDev via raywenderlich.com

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

Tương lai của JavaScript ra sao trong thế giới Front-End?

tuong-lai-cua-javascript-ra-sao-trong-the-gioi-front-end

Nếu bạn đã tham gia vào phát triển front-end trong vài năm qua, bạn biết rằng có quá đủ để cung cấp cho ai đó ‘analysis paralysis’. Các framework và thư viện mới xuất hiện thường xuyên. Các công ty trên toàn thế giới đang phải đối mặt với nhiệm vụ khó khăn trong việc lựa chọn đúng công nghệ cho việc xây dựng dự án của họ. Đó là một thách thức lớn, ngoài việc làm việc chăm chỉ, cần theo kịp các xu hướng mới nhất cùng lúc.

Ngay cả đối với một số nhà phát triển front-end tận tâm, có một thời điểm khi công nghệ trở thành lựa chọn cá nhân. Điều có thể được ưu tiên hơn lựa chọn công nghệ là phương pháp đúng hoặc sai để giải quyết các vấn đề.

Khi cuộc đua đang trở nên quyết liệt với tốc độ nhanh nhất, hiệu năng cao nhất, các framework và plugin dễ sử dụng nhất, người ta chỉ thắc mắc: khi nào thế giới JavaScript sẽ hợp nhất thành một công nghệ chính thống? Tương lai của JavaScript trông như thế nào? AI sẽ góp phần vào công nghệ này như thế nào?

Việc làm front end lương cao các công ty nổi tiếng

Background của JavaScript

Kể từ khi thành lập vào năm 1995, JavaScript đã phát triển thành ngôn ngữ phổ biến, phổ biến nhất trong lĩnh vực phát triển web. Trong thập kỷ qua, việc sử dụng JS không ngừng tăng lên, chưa cho thấy có dấu hiệu chậm lại.

Theo khảo sát hàng năm của StackOverflow , 69,8% số người được hỏi và 71,5% các nhà phát triển chuyên nghiệp đang sử dụng JavaScript hiện nay. Với sự phổ biến của nhiều thiết bị hỗ trợ web hơn, cuộc đua để tìm ra ‘kích thước phù hợp nhất với mọi giải pháp’ tốt nhất sẽ lớn hơn. Đây là một tin tuyệt vời cho các nhà phát triển, những người biết JS hoặc đang có kế hoạch để tìm hiểu nó. Đối với những người không ở mảng front-end, đề xuất dành cho họ để thử và có được (thậm chí cơ bản) trải nghiệm với nó. Trích dẫn này tóm tắt hoàn toàn:

“Nó [JavaScript] có lẽ là skill đang có nhất mà mọi developer cần phải có và chuyên sâu trong tương lai”

Các Frameworks & Web Component – Tương lai có thể đoán trước

Sau các cuộc chiến giữa các framework trong thập kỷ qua, ‘The Big Three’, giống như một số người muốn gọi về chúng, đang dẫn đầu với một tương lai ổn định và được xác định rõ ràng hơn. React, Vue và Angular là những framework và thư viện JavaScript nổi bật nhất hiện nay. Trong bài viết này, tôi sẽ phân loại chúng theo thứ tự phổ biến và hứa hẹn rằng chúng tiếp tục dẫn đầu trong tương lai.

React

Được xây dựng và hỗ trợ bởi Facebook, React là một nhà phát triển được yêu thích trong việc xây dựng và duy trì sản phẩm, cho dù là một quick POC hay hệ thống phần mềm doanh nghiệp lớn. Nó hiện đang được sử dụng bởi nhiều công ty hàng đầu như Instagram, Netflix, Walmart, Whatsapp và hơn thế nữa. Các lợi ích của React bao gồm kiến trúc dựa trên kiến trúc component-based, Virtual DOM cho hiệu suất tuyệt vời, học siêu nhanh và sự phổ biến giữa các nhà phát triển với một cộng đồng hỗ trợ rất lớn.

Vue

Tạo bởi Evan You và được duyệt bởi Alibaba, Vue đang trở thành một framework nhanh chóng được yêu thích với những người bắt đầu tìm hiểu nó. Lý do là, Vue ban đầu được thiết kế để giúp các nhà thiết kế có ít kinh nghiệm lập trình. Mục đích là để giúp họ tập trung vào việc tạo ra các giao diện chức năng hơn là lo lắng về việc tự viết code. Điều này làm cho nó rất dễ dàng để tìm hiểu với một ngưỡng lối vào tối thiểu. Hơn nữa, Evan, một cựu nhân viên của Google, đã quan sát những thứ cồng kềnh hoặc có thể được cải thiện trong Angular và áp dụng chúng cho Vue. Ông đã làm như vậy khi React được phát hành và đã có thể đưa ra một phương tiện mà bây giờ đã trở thành một trong những khuôn khổ hứa hẹn nhất để tìm hiểu và áp dụng. Ngoài ra, Vue.js hỗ trợ hiển thị khai báo, cập nhật DOM không đồng bộ, ràng buộc dữ liệu hai chiều, tuân thủ chặt chẽ các đặc tả thành phần web và tích hợp đơn giản với các mẫu HTML.

Việc làm Javascript online không yêu cầu cao

Angular

Được xây dựng và hỗ trợ bởi Google và được sử dụng bởi Youtube, Paypal, Google Maps, vv Angular đã là một lựa chọn hàng đầu cho việc triển khai doanh nghiệp cho đến nay. Phiên bản mới nhất của nó, Angular 6, đưa ra hai điểm nổi bật chính. Một lời hứa với Ivy, người đề xuất để tăng tốc độ render trong ứng dụng và các Agular element cho phép sử dụng các Angular component ngoài Angular, chẳng hạn như trong Vue hoặc React. Sử dụng Elements Package, bạn có thể tạo các Angular component và xuất chúng thành các thành phần Web, sau đó có thể được sử dụng trong bất kỳ trang HTML nào. Đối với những người đến từ nền OOP hoặc nền Java, Angular dễ dàng hơn để phát triển và học hỏi.

Cùng với các framework, gần đây chúng ta đã thấy sự gia tăng của các web component, nhưng chúng là gì và tại sao chúng lại quan trọng?

Từ một cộng đồng chán nản trong các khuôn khổ mệt mỏi, Web Components là thứ lớn nhất tiếp theo nhận được lực kéo từ HTML5. Nhưng chúng là gì? ‘Các web component là một tiêu chuẩn W3C mạnh mẽ mới đã được tất cả các trình duyệt chính chấp thuận và có thể được sử dụng hiện nay trong các ứng dụng của chúng ta (với một polyfill) . Đó là một bổ sung cho DOM có khả năng biến trang web thành các thành phần nhỏ, có thể tái sử dụng và mô-đun, được gắn với bất kỳ khung công tác nào, nhưng được xây dựng hoàn toàn bằng HTML, CSS và JS ‘.

Web components có kích thước gói nhỏ loại bỏ nhu cầu gửi thành phần tùy chỉnh được triển khai. Họ được ca ngợi vì khả năng sử dụng lại của họ. Bởi vì các thành phần web được xây dựng và hỗ trợ nguyên bản trong trình duyệt, chúng có thể được sử dụng ở mọi nơi, trong bất kỳ khung công tác nào hoặc không có khung công tác nào cả. Cuối cùng, họ được yêu thích vì sự đơn giản của họ. Không cần phải học một khuôn khổ nhất định nếu bạn không muốn. Nếu bạn đã biết JS cơ bản và các API DOM cơ bản, thì bạn có thể tương tác với một web component.

Ionic / Stencil

Ionic là một framework- library mạnh mẽ, bất khả tri để xây dựng các ứng dụng di động và web apps mới, có quyền truy cập trực tiếp vào các tính năng của thiết bị gốc. Và với bản phát hành Ionic 4 mới nhất, sự ra đời của Stencil sẽ không chỉ làm cho nó mạnh hơn và hiệu quả hơn bằng cách cho phép các nhà phát triển sử dụng nó bên ngoài Angular. Là sao? Stencil là một trình biên dịch thành phần web xây dựng các thành phần web hiện đại nhanh và nhỏ. Bằng cách tạo các thành phần giao diện người dùng của chúng tôi với các Web compennts thay vì các components cụ thể như React hoặc Angular, chúng tôi có thể tái sử dụng các component này trong bất kỳ framework nào hỗ trợ chúng hoặc tất cả.

Polymer

Polymer là thư viện JS do Google phát triển và được Google Earth và Youtube sử dụng. Nó sử dụng các thành phần web để xây dựng các ứng dụng web và cung cấp khả năng soạn JS, CSS và HTML kèm theo như các phần tử tùy chỉnh trong khi tận dụng các công nghệ gốc của trình duyệt thay vì dựa vào các thư viện JS.

Tuy nhiên, Polymer vẫn chưa đạt đến mức trưởng thành và gặp một vài thách thức. Đầu tiên, vì nó tạo ra DOM, sau đó bất kỳ tương tác hay thao tác DOM nào sẽ ở dạng JavaScript cơ bản, bổ sung thêm mã soạn sẵn, giúp việc tổ chức và quản lý ứng dụng lớn hơn khó khăn hơn. Một lý do tại sao React và các thư viện khác xuất hiện. Thứ hai, Polymer tạo chỗ dành sẵn cho các biến trong chuỗi để cải thiện hiệu suất và giải quyết vấn đề chuyển đổi dữ liệu thành chuỗi chỉ để chuyển đổi nó trở lại thành một đối tượng. Nhưng bằng cách sử dụng các trình giữ chỗ này, bạn đã gắn ứng dụng của mình một cách rõ ràng với Polymer bởi vì trình giữ chỗ không có trong thông số Web Components. Hai thử thách cuối cùng là: phải tải xuống toàn bộ thư viện và các tệp Polyfills và thiếu sự hỗ trợ phía máy chủ.

AI sẽ thay đổi thế nào đến việc develop Front End (hoặc có thể không) trong tương lai? 

Ngoài các thư viện và fraemwork , AI và machine learning sẽ định hình tương lai của phát triển giao diện người dùng như thế nào? Đó là một câu hỏi được nhiều người hỏi, nhưng một số ít công ty đã dẫn đầu trong cuộc tấn công. Họ đang sử dụng các kỹ thuật khác nhau với hy vọng phá vỡ một lĩnh vực đã trải qua các chu kỳ khác nhau của các framework và thư viện. Các phương pháp được chia thành hai.

Một bên nhằm mục đích hỗ trợ các nhà phát triển bằng cách tạo mã khởi đầu từ wireframes và các tệp phác thảo hoặc tạo ra toàn bộ đầu ra đầu cuối. Điều này giúp các nhà phát triển tập trung vào các phần phát triển quan trọng hơn, chẳng hạn như logic ứng dụng và các tính năng xây dựng. Nó tăng tốc độ lặp lại của các giai đoạn thiết kế và sửa đổi. Những công ty từ Airbnb gần đây đã xây dựng AI để biến các tệp phác thảo thành mã thô, Uizard sử dụng một mạng học tập / ML (neurual network) mà họ đã đào tạo để chụp ảnh màn hình giao diện đồ họa và dịch thành các dòng thô mã. Điều ấn tượng với Uizard là: một văn bản đơn giản để GUI renderer sẽ làm việc trên nhiều nền tảng như iOS, Android và giao diện dựa trên Web và thuật toán, do đó đến nay hoạt động với độ chính xác 77%.

Sau đó , ứng dụng Ink to Code của Microsoft , người cũng đã đâm vào phần mềm này và làm cho phần mềm của họ có sẵn để tải xuống miễn phí từ Windows Store. Và cuối cùng, Supernova , một công ty khởi nghiệp với nhiệm vụ đẩy nhanh tiến trình phát triển ứng dụng của các nhà thiết kế di động và các nhà phát triển đã xây dựng một công cụ, ứng dụng MacOS Supernova Studio hứa hẹn sẽ tự động chuyển đổi các thiết kế ứng dụng di động được tạo ra trong Sketch. nhằm thu hẹp khoảng cách giữa tạo mẫu và thiết kế , phát triển giao diện người dùng.

Phía bên kia đã đưa AI tiến thêm một bước nữa và nhận được máy móc để làm toàn bộ mã hóa giao diện người dùng. BAYOU , một dự án được tài trợ bởi quân đội và Google ra khỏi Rice University, sử dụng một công cụ học tập sâu về cơ bản hoạt động như một công cụ tìm kiếm để viết mã. Thông qua việc đọc mã nguồn của 1500 ứng dụng Android (~ 100 triệu dòng Java), “neurual network” của BAYOU giờ đây là một AI có thể lập trình phần mềm khác.

Web-Assembly ở đâu trong tất cả những điều này? 

Web-assembly là một định dạng nhị phân có thể được giải mã nguyên bản, trong tất cả các trình duyệt, nhanh hơn nhiều so với JS có thể được phân tích cú pháp. Đây là một thuật ngữ đã được xung quanh trong cộng đồng nhà phát triển. Nó thực sự có thể trở thành ngôn ngữ được sử dụng nhiều nhất trong tương lai gần như là bổ sung cho JavaScript.

Tại sao? Bởi vì nó cho phép thực hiện bằng cách giảm TTI (thời gian để tương tác) làm cho ứng dụng web nhanh, cũng như đa dạng hóa các ngôn ngữ có thể phát triển giao diện người dùng. Điều này cho phép các nhà phát triển sử dụng ngôn ngữ yêu thích của họ hoặc khả năng xây dựng một vài phần của ứng dụng web với web-assembly trong khi tăng tốc và rời khỏi phần còn lại của ứng dụng trong JS.

Kết luận

Thế giới của giao diện người dùng mà chúng ta hiểu ngày nay đang bị chi phối bởi ba framework lớn: React, Vue và Agular. Tuy nhiên, khi biết các vòng đời trước đây của các Framework, sẽ không có gì ngạc nhiên nếu một framework mới đi kèm nhanh hơn, hiệu quả hơn và giải quyết các vấn đề mà các framework hiện đang gặp phải.

Tương lai tôi hình dung tuy nhiên sẽ là một của tất cả mọi thứ có sẵn ngày hôm nay. Trong đó một framework được định nghĩa là dễ nhất để các nhà phát triển chấp nhận và đưa ra giải pháp hoàn chỉnh, sử dụng các kỹ thuật bổ sung như các web component, web-assembly và AI, để tạo ra giải pháp cuối cùng cho phát triển ứng dụng.

Các phần cốt lõi của ứng dụng sẽ được xây dựng bằng cách sử dụng các web component để chúng được sử dụng và chia sẻ dễ dàng.

Web assembly sẽ phục vụ như là tăng tốc độ trong các phần của ứng dụng để làm cho ứng dụng nhanh hơn và có hiệu suất tốt hơn.

AI sẽ phục vụ để đẩy nhanh quá trình phát triển, cho dù việc cung cấp mã bắt đầu giảm bản mẫu, hoặc được sử dụng để xác nhận chất lượng của mã được viết.

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

Xem thêm các vị trí tuyển it lương cao cho bạn

Laravel 5.5 – Tạo Mã ReCaptcha của Google

Người dịch: Đinh Quốc Hội

Hôm nay, chúng tôi sẽ chia sẻ với các bạn trong bài viết này về cách triển khai mã reCaptcha của google trong Laravel với việc xác thực. Nói chung sử dụng captcha trong đăng ký, đăng nhập là hình thức và bạn có thể thấy trong nhiều trang web gần như trang web sử dụng google reCaptcha. Nhưng bạn cũng có thể làm điều này với nhiều. nhưng google captcha là tốt nhất và nhiều gói laravel cũng có sẵn bằng cách sử dụng gói đó bạn có thể dễ dàng thực hiện chức năng này trong ứng dụng của bạn. Gói anhkohbo / no-captcha là tốt nhất cho nó và chúng tôi đang triển khai google reCaptcha bằng gói này.

Trong hướng dẫn này, chúng tôi đang triển khai google reCaptha dưới dạng contactus. nhưng bạn có thể sử dụng nó dưới mọi hình thức.

Sau khi thực hiện hướng dẫn này, kết quả của bạn sẽ trông giống như sau: 

Tham khảo thêm các việc làm Laravel lương cao cho bạn.

Tại sao phải sử dụng Captcha

Trong captcha đơn giản được sử dụng để ngăn chặn dữ liệu spam. ví dụ bạn có một hình thức đơn giản mà không cần thêm Captcha thì một số tin tặc có thể thêm dữ liệu giả bằng cách lặp lại nhiều lần. vì vậy, tránh hoạt động spam kiểu này ở bên cạnh bạn nên Captcha là tùy chọn tốt nhất.

Install Package

Đầu tiên, chúng ta cần cài đặt gói anhskohbo / no-captcha trong ứng dụng Laravel của bạn. Chạy lệnh đơn giản sau và cài đặt. 

composer require anhskohbo/no-captcha

Cấu hình

Sau khi cài đặt gói thành công, chúng ta nên cấu hình nhà cung cấp dịch vụ trọn gói này trong file config / app.php.

'providers' => [
	....
	Anhskohbo\NoCaptcha\NoCaptchaServiceProvider::class,
],

Đặt khóa Google

Tiếp theo, Truy cập vào khóa trang và khóa bí mật của Google reCaptcha . bạn có thể lấy khóa biểu mẫu bấm vào liên kết này Google reCaptcha Amin và lấy chìa khóa của bạn.

Sau khi nhấp vào liên kết dưới đây bạn có thể xem trang sau.

Nếu bạn muốn thử nghiệm bản demo này trong localhost. chỉ cần đặt localhost làm tên miền trong phần tên miền.
Sau khi gửi biểu mẫu này thì google chuyển hướng một trang khác và trong trang này, bạn có thể hiển thị khóa Site và khóa Secret của mình
Bây giờ, mở tập tin .env của bạn và đặt cả hai khóa ở đây.

NOCAPTCHA_SECRET=[secret-key]
NOCAPTCHA_SITEKEY=[site-key]	

Tạo Route

Tiếp theo, mở file web.php của bạn và thêm vào sau một tuyến đường trong đó.

Route::get('contactus', 'ContactUsController@getContactus');
Route::post('contactus', 'ContactUsController@postContactus')->name('contactus');

Tạo Controller

Tiếp theo, chúng ta đã tạo ra bộ điều khiển ContactUsController.php trong thư mục App / Http / Controllers . và cũng tạo phương thức getContactus () và postContactus () trong đó.

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Input;
use Validator;
use Redirect;

class ContactUsController extends Controller
{    
    public function getContactus()
    {
        return view('contactus');
    }

    public function postContactus(Request $request)
    {
        $this->validate($request, [
            'fullname' => 'required',
            'email' => 'required',
            'description' => 'required',
            'g-recaptcha-response' => 'required|captcha',
        ]);

        // Write here your database logic

        \Session::put('success', 'Youe Request Submited Successfully..!!');
        return redirect()->back();
    }
}

Mã xác thực PHP chính

Nếu bạn tích hợp trong php cốt lõi thì bạn có thể sử dụng mã sau để xác thực xác thực lại bằng google recaptcha.

$secretKey = "Your-Secret-Key";
$ip = $_SERVER['REMOTE_ADDR'];
$response=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$secretKey."&response=".$input['g-recaptcha-response']."&remoteip=".$ip);
$responseKeys = json_decode($response,true);
if(intval($responseKeys["success"]) !== 1) {    
    // validation false message set here...
} else {
    // validation success message set here...
}

Tạo Blade

Tiếp theo, chúng ta đã tạo file contactus.blade.php trong resources/views/

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <div class="panel panel-default">
                <div class="panel-heading">Register</div>

                <div class="panel-body">
                    <form class="form-horizontal" method="POST" action="{{ route('contactus') }}">
                        {{ csrf_field() }}

                        <div class="form-group{{ $errors->has('fullname') ? ' has-error' : '' }}">
                            <label for="fullname" class="col-md-4 control-label">Full Name</label>

                            <div class="col-md-6">
                                <input id="fullname" type="text" class="form-control" name="fullname" value="{{ old('fullname') }}" autofocus>
                                @if ($errors->has('fullname'))
                                    <span class="help-block">
                                        <strong>{{ $errors->first('fullname') }}</strong>
                                    </span>
                                @endif
                            </div>
                        </div>

                        <div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}">
                            <label for="email" class="col-md-4 control-label">E-Mail Address</label>

                            <div class="col-md-6">
                                <input id="email" type="email" class="form-control" name="email" value="{{ old('email') }}">
                                @if ($errors->has('email'))
                                    <span class="help-block">
                                        <strong>{{ $errors->first('email') }}</strong>
                                    </span>
                                @endif
                            </div>
                        </div>

                        <div class="form-group{{ $errors->has('description') ? ' has-error' : '' }}">
                            <label for="description" class="col-md-4 control-label">description</label>

                            <div class="col-md-6">
                                <textarea id="description" class="form-control" name="description"></textarea>
                                @if ($errors->has('description'))
                                    <span class="help-block">
                                        <strong>{{ $errors->first('description') }}</strong>
                                    </span>
                                @endif
                            </div>
                        </div>

                        <div class="form-group{{ $errors->has('g-recaptcha-response') ? ' has-error' : '' }}">
                            <label class="col-md-4 control-label">Captcha</label>

                            <div class="col-md-6 pull-center">
                                {!! app('captcha')->display() !!}

                                @if ($errors->has('g-recaptcha-response'))
                                    <span class="help-block">
                                        <strong>{{ $errors->first('g-recaptcha-response') }}</strong>
                                    </span>
                                @endif
                            </div>
                        </div>

                        <div class="form-group">
                            <div class="col-md-6 col-md-offset-4">
                                <button type="submit" class="btn btn-primary">
                                    Submit
                                </button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Nội dung file layout.blade.php

Dán đoạn script sau vào trong thẻ </head>:

<script src='https://www.google.com/recaptcha/api.js'></script>

Dùng bootstrap để khỏi tốn thời gian tạo form
<linkrel="stylesheet"href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

Hoặc bạn có thể thêm thẻ <div> Capcha trực tiếp vào blade nếu bị lỗi

<div class="g-recaptcha" data-sitekey="6LeGsW4UAAAAAPHUhm7ryLvk-VJ5b9RzAJet21EV"></div>

Bây giờ tại thư mục project gốc chúng ta đã sẵn sàng để chạy ví dụ dưới lệnh:

php artisan serve

Bây giờ bạn có thể mở URL dưới đây trên trình duyệt của bạn:
http://localhost:8000/contactus

TopDev via Laravel Code

Flutter là gì? Ưu điểm vượt trội và cơ hội việc làm hấp dẫn

flutter-trong-mobile-app-la-gi

Khi nhắc đến lập trình di động Cross-Platform, chúng ta không thể không nhắc đến 2 nền tảng lớn nhất hiện nay là React Native và Flutter. Dù ra đời sau nhưng Flutter đang vượt lên và trở thành Framework lập trình di động được yêu thích nhất hiện nay. Trong bài viết này, mình sẽ cùng các bạn tìm hiểu về Flutter là gì, các kiến thức cơ bản về Flutter và cách tiếp cận làm quen với Flutter và lộ trình học để trở thành 1 lập trình viên Flutter. Cùng bắt đầu nhé!

Flutter là gì?

Flutter là 1 framework dành cho việc lập trình di động Cross-Platform, nó giúp các lập trình viên có thể tạo ra các ứng dụng chạy trên nhiều nền tảng như Web, Android, iOS (hiện tại và dự định tương lai Flutter còn có thể build được ứng dụng chạy trên cả Window, MacOS và Linux nữa).

Flutter được tạo ra bởi ông lớn Google và được cho ra mắt vào năm 2017, đến nay Flutter được cho phát hành phiên bản mới nhất 3.1.0 vào cuối tháng 5 vừa qua. Chính Google cũng sử dụng Flutter là phương thức chính để tạo ra các ứng dụng cho hệ điều hành Google Fuchsia – 1 hệ điều hành thời gian thực dựa trên năng lực vi hạt nhân.

flutter cơ bản

Flutter sử dụng ngôn ngữ lập trình Dart – một ngôn ngữ hướng đối tượng và tất nhiên cũng được phát triển bởi Google.

Flutter có đầy đủ các tính năng hot nhất hiện nay dành cho lập trình di động: hỗ trợ Hot Reload, Debug Devtool, nhiều IDE support: Android Studio, Visual Code. Các bạn cũng có thể hoàn toàn thử code và tạo ra ứng dụng Flutter mà không cần cài đặt bất cứ thứ gì bằng cách sử dụng Web Editor: https://dartpad.dev/flutter. Tuy nhiên trong series bài viết này mình sẽ hướng dẫn các bạn sử dụng IDE Android Studio, đơn giản vì nó cũng là 1 sản phẩm thuộc về Google khác.

Thành Phần Của Flutter

Flutter là một framework phát triển ứng dụng di động mã nguồn mở được phát triển bởi Google. Nó cho phép các nhà phát triển xây dựng các ứng dụng di động cho cả hệ điều hành iOS và Android chỉ với một codebase duy nhất. Các thành phần chính của Flutter bao gồm:

Flutter SDK

SDK (Software Development Kit) là bộ công cụ phát triển phần mềm cung cấp các thư viện và công cụ cần thiết để xây dựng các ứng dụng Flutter. SDK bao gồm:

  • Dart SDK: Dart là ngôn ngữ lập trình được sử dụng để viết các ứng dụng Flutter. Dart SDK cung cấp trình biên dịch và các công cụ cần thiết để làm việc với Dart.
  • Flutter Engine: Flutter Engine là lõi của Flutter, được viết bằng C++, cung cấp các công cụ cần thiết để render giao diện người dùng và thực hiện các tác vụ như xử lý sự kiện, vẽ đồ họa và quản lý các thành phần UI.
  • Framework: Framework của Flutter được viết bằng Dart, bao gồm các thư viện và widget để xây dựng giao diện người dùng, quản lý trạng thái, điều hướng và nhiều chức năng khác.

Widgets

Widgets là thành phần cơ bản của giao diện người dùng trong Flutter. Mọi thứ trong Flutter đều là widget, từ các thành phần UI cơ bản như nút bấm và văn bản đến các cấu trúc phức tạp như bố cục và hoạt ảnh. Flutter cung cấp hai loại widget chính:

  • Stateless Widgets: Widgets không thay đổi trạng thái trong suốt vòng đời của chúng. Chúng chỉ phụ thuộc vào dữ liệu đầu vào và hiển thị giao diện người dùng dựa trên đó.
  • Stateful Widgets: Widgets có thể thay đổi trạng thái trong suốt vòng đời của chúng. Chúng có thể phản ứng với các sự kiện và cập nhật giao diện người dùng dựa trên trạng thái hiện tại.

Dart

Dart là ngôn ngữ lập trình chính được sử dụng trong lập trình Flutter. Nó được thiết kế để xây dựng các ứng dụng front-end nhanh chóng và hiệu quả. Dart hỗ trợ cả biên dịch JIT (Just-In-Time) cho việc phát triển và biên dịch AOT (Ahead-Of-Time) cho hiệu suất tốt hơn khi triển khai ứng dụng.

Flutter DevTools

Flutter DevTools là bộ công cụ phát triển tích hợp được cung cấp để giúp các nhà phát triển gỡ lỗi, phân tích và tối ưu hóa các ứng dụng Flutter. DevTools bao gồm:

  • Inspector: Công cụ để kiểm tra và chỉnh sửa cấu trúc widget của ứng dụng.
  • Logging: Công cụ để xem và phân tích log từ ứng dụng.
  • Performance: Công cụ để phân tích hiệu suất của ứng dụng, bao gồm theo dõi khung hình và phân tích CPU.

Packages and Plugins

Flutter hỗ trợ việc sử dụng các package và plugin để mở rộng chức năng của ứng dụng. Các package là các thư viện Dart có thể được chia sẻ và sử dụng lại, trong khi các plugin cung cấp giao diện để tương tác với mã gốc (native code) trên các nền tảng iOS và Android.

>> Bài viết liên quan: Hướng dẫn cài đặt Flutter

Khác biệt so với “người anh” Android ?

Chắc hẳn không ít người đang thắc mắc, chẳng phải Google đã có bộ SDK cho di động, có tên gọi Android rồi hay sao. Nhưng với Google, thế giới mobile là quá rộng chỉ với một giải pháp duy nhất là Android. Với việc ra mắt phiên bản beta 1 này, giờ đây họ có trong tay hai bộ SDK cho ứng dụng di động: Android và Flutter. Và điểm khác biệt cơ bản giữa Flutter và Android: tạo ra các ứng dụng chạy trên cả iOS và Android.

Là một bộ SDK đa nền tảng, các ứng dụng Flutter có thể hoạt động trên cả iOS và Android. Nó như một thủ thuật khôn khéo để tương thích được với framework UI trên cả hai hệ điều hành này. Các ứng dụng này không biên dịch trực tiếp với các ứng dụng native của Android và iOS.

Thay vào đó, chúng chạy trên engine render Flutter (được viết bằng C++) và Flutter Framework (được viết bằng Dart, cũng như các ứng dụng Flutter), cả hai bộ này đều được đóng gói cùng với mọi ứng dụng. Sau đó bộ SDK sẽ đóng gói lại vào trong một ứng dụng để sẵn sàng chạy trên mỗi nền tảng. Bạn tạo ra ứng dụng của mình, một engine mới sẽ chạy các đoạn code, và các đoạn code native vừa đủ để nền tảng Flutter chạy trên cả Android và iOS.

Đóng gói cả một engine đi kèm cùng ứng dụng sẽ làm cho kích thước bộ cài đặt lớn hơn hẳn. Trang Hỏi đáp của Flutter cho biết, một ứng dụng “trống” thông thường sẽ chỉ khoảng 6-7MB trên Android, vì vậy dù là ứng dụng nào, phần kích thước tăng lên cũng là rất nhiều. Nhưng lợi ích của việc này là các ứng dụng này sẽ rất nhanh.

Flutter được thiết kế từ đầu để đạt tới tốc độ khung hình 60fps. Trong khi đây không phải là một con số hiếm gặp trên iOS, nhưng với Android, bạn có thể cảm thấy sự khác biệt rõ rệt ngay lập tức. Cũng nhờ việc xuất xưởng cùng với cả một nền tảng cho ứng dụng của mình, các nhà phát triển sẽ tránh được nhiều vấn đề về sự phân mảnh của Android.

Tại sao Flutter lại được yêu thích bởi các lập trình viên?

Theo thống kê từ Stack Overflow, Flutter đạt số điểm 68,8% về mức độ danh mục công nghệ được yêu thích (từ việc bắt đầu và tiếp tục sử dung nó), trong khi đó số điểm của React Native hiện tại chỉ là 57,9%.

Tại sao Flutter lại được yêu thích bởi các lập trình viên?

Còn theo Google Trends, mức độ phổ biến của Flutter gần gấp đôi so với React Native.

compare flutter and react native

Câu hỏi đặt ra ở đây là tại sao Flutter lại được yêu thích và quan tâm đến vậy? Để trả lời cho câu hỏi đó, chúng ta cùng đi vào điểm mạnh của Flutter dưới đây:

  • Đầu tiên phải nhắc đến đó là Flutter chính là con đẻ của Google, 1 ông lớn thực sự với gia tài hệ sinh thái đồ sộ liên quan đến lập trình di động. Đó là hệ điều hành Android, là IDE Android Studio, ngôn ngữ Kotlin, Dart, các thư viện mà gần như ai làm mobile cũng sẽ dùng như Firebase, Google Map, … Và quả thực thì Flutter được lợi rất nhiều từ việc Google cung cấp cho nó rất nhiều các package có sẵn, chỉ cần import vào để sử dụng.
  • Khác với cách tiếp cận của React Native, Flutter được team Google viết mới hoàn toàn bộ render UI. Điều đó có nghĩa là bạn sẽ có 1 bộ UI chung dành cho các nền tảng khác nhau (Flutter đặt tên cho chúng là các widgets), điều này tạo ra sự thống nhất trên các thiết bị giúp có được sự trải nghiệm tốt hơn cho người dùng.
  • Phát triển 1 ứng dụng bằng Flutter thực sự rất nhanh. Dart là 1 ngôn ngữ khá dễ hiểu, trong khi Flutter cũng đã cung cấp bộ Widgets và tài liệu thực sự chi tiết dành cho bạn. 
  • Tối ưu về performance: mặc dù là 1 cross-platform, tuy nhiên Flutter lại mang lại được trải nghiệm về hiệu năng ứng dụng rất tốt. Để so sánh với React Native, chúng ta có thể đi sâu 1 chút vào kiến trúc và quy trình làm việc của 2 framework này.
  • Framework hiện đại và reactive: Dễ dàng tạo giao diện người dùng của bạn với framework hiện đại, reactive của Flutter và tập hợp các platform, layout và widget phong phú. Giải quyết các thách thức giao diện người dùng khó khăn của bạn với các API mạnh mẽ và linh hoạt cho 2D, animation, gesture, hiệu ứng và hơn thế nữa.
  • Truy cập các tính năng và SDK native: Làm cho ứng dụng của bạn trở nên sống động với API của platform, SDK của bên thứ ba và native code. Nó cho phép bạn sử dụng lại mã Java, Swift và ObjC hiện tại của mình và truy cập các tính năng và SDK native trên iOS và Android.
  • Phát triển ứng dụng thống nhất: Flutter có các công cụ và thư viện để giúp bạn dễ dàng đưa ý tưởng của mình vào cuộc sống trên iOS và Android. Nếu bạn chưa có kinh nghiệm phát triển trên thiết bị di động, thì Flutter là một cách dễ dàng và nhanh chóng để xây dựng các ứng dụng di động tuyệt đẹp. Nếu bạn là một nhà phát triển iOS hoặc Android có kinh nghiệm, bạn có thể sử dụng Flutter cho các View của bạn và tận dụng nhiều code Java / Kotlin / ObjC / Swift hiện có của bạn.

quy trình làm việc của react native và flutter

React Native sử dụng JS Bridge để giao tiếp với các native module, đây chính là vị trí thường xuyên gây nghẽn cổ chai trong ứng dụng được viết bằng ngôn ngữ JS này. Flutter thì khác, kiến trúc ngôn ngữ Dart được tạo ra giúp chúng có thể giao tiếp thông qua chính các native interface, tất nhiên nó cũng là 1 dạng bridge, nhưng nó nhanh hơn rất nhiều vì “cầu rộng hơn và lại có nhiều cầu”, yên tâm gần như không bị nghẽn cổ chai được.

Tìm việc làm Flutter được cập nhật mỗi ngày tại đây!

Tất nhiên, Framework hay ngôn ngữ nào cũng có nhược điểm của nó. Flutter dù được Google chống lưng rất nhiều, tốc độ phát triển hiện nay rất tốt tuy nhiên nó cũng không tránh được các vấn đề của nó:

  • Điều đầu tiên đương nhiên là về cộng đồng sử dụng và hỗ trợ. Ra mắt sau nên Flutter hiện nay cũng chưa phải là sự lựa chọn của các công ty hay tập đoàn lớn. Việc làm liên quan đến Flutter còn hạn chế, sẽ phải mất 1 thời gian nữa cùng với sự đầu tư của ông lớn Google thì điều này mới có thể cải thiện tốt lên được.
  • Flutter chưa đủ hoàn thiện để xử lý các dự án phức tạp. Đây là điểm mấu chốt mà các công ty chưa chọn Flutter làm nền tảng để phát triển 1 ứng dụng lớn của mình. Lý do cơ bản là việc Google sinh ra Flutter là dành cho sự tiện lợi, nhanh chóng, rút ngắn thời gian thử nghiệm và tạo ra 1 ứng dụng. Nếu bạn cần thử nghiệm 1 ứng dụng với chi phí và thời gian eo hẹp, hãy chọn Flutter vì nó rất nhanh; sau đó nếu thành công, hãy cân nhắc việc viết lại ứng dụng bằng native code. Những pattern như Flux, Redux nổi tiếng trên React Native chưa cho thấy sự tiện lợi trên Flutter để có thể giải quyết logic phức tạp; trong khi đó BloC – thứ được Google giới thiệu thì lại cho thấy sự khó hiểu, khó học của nó đối với các lập trình viên.

Flutter cho Mobile App – Quá tốt so với phần còn lại

Mấy nay thấy nhiều người quan tâm Flutter nên mình cũng đi tìm hiểu xem sao. Dù chỉ mới tìm hiểu thôi nhưng mình thật sự ấn tượng với Flutter với những điểm sau, tóm tắt ngắn gọn lại cho mọi người tham khảo:

1. Sử dụng DART. Một ngôn ngữ lập trình hướng đối tượng do Google phát triển. DART là một static type language nên nó là AOT (Ahead of Time), compile xong hết rồi mới chạy. Trong khi đó nó cũng là JIT (Just in Time) giống như các dynamic type language. Khi dev thì nó sử dụng JIT để hỗ trợ Hot Load và build release thì dùng AOT để tối ưu hiệu năng như một native code bình thường. Lại magic nữa !!

flutter

2. Ngoài ra DART cũng hướng tới việc trở thành một ngôn ngữ có thể chạy trên nhiều platform khác nhau, nó cũng có máy ảo (VM) làm nhiệm vụ dịch source code sang bytecode như Java. Hiện tại DART có thể transpile ra các ngôn ngữ khác như JS để chạy trên trình duyệt. Cái này không liên quan mobile lắm tuy nhiên đây cũng là 1 ưu điểm lớn của ngôn ngữ này nên không thể bỏ qua.

3. Vậy còn native module ? Khác với JS Bridge, Flutter “nói chuyện” với các native module bằng chính các native interface. Mặc dù vẫn được gọi là “bridge”, tuy nhiên nó nhanh hơn rất nhiều và gân như không bị “thắc cổ chai” như React Native. Ngoài ra các module này được kiến trúc theo “plugin”, các module viết cho Flutter phải tuân thủ các rule trong này. Cá nhân mình thấy viết native module cho Flutter rất tự nhiên, không cần phải học các syntax macro C/C++ như RN.

4. Theo doc của Flutter Engine, có tới 4 threads (runners) được sử dụng trong app: Platform Task Runner, UI Task Runner, GPU Task Runner và IO Task Runner. Các threads này độc lập và không share memory với nhau, chúng giao tiếp với nhau thông qua channels… tới đây ai fan golang sẽ hiểu và rất thích pattern này.

5. Về document: sở hữu bộ doc phải nói là không bỏ sót thứ gì. Đi từ cài đặt, hướng dẫn viết app cơ bản cho tới CI/CD, debug, test và profiling. Bộ profiling của Flutter cũng cực kì hay dùng để đo đạc các chỉ số về performance khá chi tiết.

6. Các ví dụ và kiến trúc ứng dụng: Có hẳn 1 repository trên Github đủ hết các example cho Redux, mvc, mvu… tha hồ quẹo lựa.

flutter

flutter

Với các đặc tính trên và tốc độ phát triển rất nhanh như hiện tại, đây sẽ là lựa chọn hàng đầu cho mobile development. Có lẽ điểm yếu rõ ràng nhất của Flutter hiện nay là… học cái này rồi ở đâu tuyển ?!?

Một Số Ứng Dụng Được Xây Dựng Từ Flutter

Lập trình Flutter đã được sử dụng để phát triển nhiều ứng dụng di động nổi tiếng trên toàn thế giới. Dưới đây là một số ví dụ điển hình:

Google Ads

Google Ads là một ứng dụng quản lý quảng cáo dành cho các nhà quảng cáo Google. Ứng dụng này cho phép người dùng xem hiệu suất quảng cáo, cập nhật ngân sách và chiến dịch, và nhận thông báo quan trọng.

Alibaba

Alibaba, nền tảng thương mại điện tử lớn nhất Trung Quốc, đã sử dụng Flutter để phát triển một số ứng dụng di động của mình. Flutter giúp Alibaba tạo ra trải nghiệm người dùng mượt mà và nhất quán trên cả iOS và Android.

Reflectly

Reflectly là một ứng dụng nhật ký và quản lý căng thẳng cá nhân, sử dụng AI để cung cấp các phân tích và phản hồi cho người dùng. Ứng dụng này được xây dựng hoàn toàn bằng Flutter, mang lại giao diện người dùng đẹp mắt và tương tác mượt mà.

Tencent

Tencent, một trong những công ty công nghệ lớn nhất Trung Quốc, đã sử dụng Flutter để phát triển một số ứng dụng và dịch vụ của mình. Flutter giúp Tencent tiết kiệm thời gian và chi phí phát triển bằng cách duy trì một codebase duy nhất cho cả hai nền tảng.

BMW

BMW đã sử dụng Flutter để phát triển ứng dụng My BMW. Ứng dụng này cung cấp các tính năng như theo dõi xe, điều khiển từ xa, và quản lý bảo dưỡng. Flutter giúp BMW đảm bảo trải nghiệm người dùng nhất quán trên các thiết bị khác nhau.

Cơ hội việc làm lập trình viên Flutter tại Việt Nam

Với sự phát triển mạnh mẽ của công nghệ di động và nhu cầu tạo ra các ứng dụng nhanh chóng và hiệu quả, các công ty ngày càng tìm kiếm những Flutter Developer tài năng. Nhiều công ty, từ các startup đến các tập đoàn lớn, đều ưu tiên sử dụng Flutter để giảm thời gian và chi phí phát triển.

Flutter Developer có lợi thế cạnh tranh lớn trong thị trường việc làm nhờ khả năng tạo ra ứng dụng cho nhiều nền tảng từ một codebase duy nhất. Điều này giúp các công ty tiết kiệm tài nguyên và tăng tốc độ đưa sản phẩm ra thị trường, làm cho các Flutter Developer trở thành ứng viên hấp dẫn trong mắt nhà tuyển dụng.

Trong bài viết đầu tiên của Series này, mình đã giới thiệu cho các bạn về Flutter cơ bản, những đặc trưng thế mạnh của Framework này so với các đối thủ khác hiện nay. Trong các bài viết tiếp theo mình sẽ đi sâu hơn vào cách tiếp cận và học để trở thành 1 lập trình viên Flutter. Cảm ơn sự theo dõi của các bạn.

Có thể bạn muốn xem thêm:

Việt Trần

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

Có gì mới trong bản phát hành Laravel 5.7?

Laravel là một framework PHP phổ biến nhất, được hỗ trợ tích cực và đóng góp cho dự án mã nguồn mở, sắp đạt được bản phát hành tiếp theo 5.7 vào tháng 8 năm 2018.

Bản phát hành sẽ nhận được bản sửa lỗi cho đến tháng 2 năm 2019 và các bản sửa lỗi bảo mật cho đến tháng 8 năm 2019.

Bản phát hành này tiếp tục cải tiến cho phiên bản 5.6 trước đó và cũng bao gồm một số tính năng mới thú vị.

Trong bài đăng trên blog này, tôi liệt kê một số tính năng thú vị đã được nhóm Laravel công bố và lấy một số tài liệu tham khảo từ kho lưu trữ github.

Tôi sẽ tiếp tục cập nhật bài đăng này lên đến bản phát hành cuối cùng được công bố từ nhóm chính thức, vì yêu cầu kéo mới đến từ các cộng tác viên cộng đồng.

Tuyển dụng Laravel lương cao up to 2000 USD

1. Laravel Nova

Thư viện Laravel được chờ đợi nhiều nhất đã được Taylor công bố trong Laracon US 2018, và đây là một gói bảng quản trị đẹp cho ứng dụng Laravel. Đây là một bảng điều khiển quản trị mã cho dự án Laravel mới hoặc hiện tại của bạn. Phiên bản trước của Laravel vẫn hỗ trợ Nova, vì nó là một gói trình soạn thảo đơn giản. Để biết sâu hơn về nó theo các tài liệu chính thức, cũng đi qua bài viết giới thiệu trên Medium của Taylor.

Laravel Nova chính thức được phát hành vào ngày 22 tháng 8 năm 2018, bản phát hành đầu tiên v1.0. * (Orion) hiện có sẵn để mua từ website chính thức .

2. Xác minh email

Framework giới thiệu tính năng xác minh email tùy chọn với bản phát hành này. Để sử dụng tính năng này, bạn phải thêm cột thời gian email_verified_at vào bảng user thông qua famework migration.

Để tư vấn cho người dùng mới tham gia xác minh email của họ, mô hình Người dùng sẽ triển khai giao diện MustVerifyEmail.

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements MustVerifyEmail
{
    // ...
}

Sau khi triển khai giao diện, các thành viên mới được đăng ký sẽ nhận được email chứa liên kết xác minh đã đăng ký. Khi người dùng nhấp vào liên kết này, ứng dụng sẽ tự động cập nhật cơ sở dữ liệu và chuyển hướng người dùng đến vị trí dự định.

Tính năng mới này cũng giới thiệu một phần mềm trung gian đã được xác minh. Nếu bạn muốn bảo vệ các route của ứng dụng của bạn từ các thành viên được xác minh, nó có thể được gắn vào các route ứng dụng.

'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,

3. Cổng / Chính sách người dùng của khách

Phiên bản trước của Laravel được sử dụng để trả về false nếu người dùng chưa được xác thực muốn truy cập vào ứng dụng. Tuy nhiên, với phiên bản mới (5.7) nó bây giờ sẽ cho phép khai báo một gợi ý kiểu “tùy chọn” hoặc cung cấp một giá trị mặc định null để cho phép người dùng khách vượt qua các kiểm tra ủy quyền.

Gate::define('update-product', function (?User $user, Product $product) {
    // ...
});

4. Symfony Dump Server

Symfony của dump-server đang tích hợp tới Laravel 5.7. Nó là một lệnh thông qua gói được xây dựng bởi một thành viên cộng đồng của Laravel, Marcel Pociot.

Tính năng này sẽ hữu ích khi gỡ lỗi trên ứng dụng của bạn mà không làm gián đoạn thời gian chạy ứng dụng.

Lệnh chạy ở chế độ nền và thu thập dữ liệu được truyền từ ứng dụng và hiển thị đầu ra thông qua chế độ console.

php artisan dump-server

// Output to the HTML file.
php artisan dump-server --format=html > report.html

Package là một mã nguồn mở, đóng góp nếu bạn có bất kỳ ý tưởng nào về nó.

5. Trình tạo URL và Cú pháp có thể gọi

Để tạo các URL cho các hành động controller, Laravel bây giờ hỗ trợ cú pháp mảng có thể gọi, thay vì chỉ các chuỗi.

Trước đây,

$url = action('BlogController@index');

$url = action('BlogController@view', ['id' => 1]);

Bây giờ,

use App\Http\Controllers\HomeController;

$url = action([BlogController::class, 'index']);

$url = action([BlogController::class, 'view'], ['id' => 1]);

6. Liên kết Paginator

Bây giờ, bạn có thể kiểm soát số lượng liên kết pagination trên mỗi bên của thiết kế URL được phân trang. Theo mặc định, sẽ có ba liên kết được tạo trên mỗi bên của liên kết paginator. Phương thức vừa được giới thiệu onEachSide () cho phép điều khiển chúng bằng Laravel 5.7.

{{ $pages->onEachSide(5)->links() }}

7. Read / Write Streams method in Filesystem

Laravel 5.7 introduces new methods for the Filesystem integration.

Storage::disk('s3')->writeStream(
        'destination-file.zip',
        Storage::disk('local')->readStream('source-file.zip')
    );

8. Thông báo Localization

Giờ đây, bạn có thể chỉ định ngôn ngữ cho các thông báo gửi khác với ngôn ngữ hiện tại.

Lớp Illuminate \ Notifications \ Notification thêm phương thức miền địa phương mới để gán ngôn ngữ mong muốn.

$user->notify((new NewUser($user))->locale('np'));

Bạn cũng có thể sử dụng mặt tiền để đặt localization cho nhiều mục nhập thông báo.

Notification::locale('np')
        ->send($subscribers, new WeeklyNewsletter($newsletter));

9. Thông báo lỗi được cải thiện

Bây giờ bạn có thể theo dõi tốt hơn các thông báo lỗi của bạn bằng ứng dụng Laravel của bạn. Như của Laravel 5.7, bạn sẽ nhận được một thông báo súc tích gọn gàng hơn rằng phương thức này không tồn tại trên mô hình cụ thể.

10. Thay đổi thư mục Resources

Một chút thay đổi đối với thư mục resources đi kèm với bản phát hành mới.

Sự thay đổi này đã được Taylor công bố với một tweet, vì tài sản trực tiếp sẽ biến mất và js, sass, lang, lượt xem sắp ra vào thư mục resources.

Laravel 5.7 resources directory changes.

Khi bạn nâng cấp ứng dụng của mình lên 5.7, bạn không cần phải tạo lại thư mục resources / asset theo cấu trúc thư mục mới hơn. Cấu trúc cũ hơn sẽ vẫn hoạt động.

11. Kiểm tra các lệnh Artisan

Nhân viên đầu tiên của Laravel (Mohamed Said) gần đây đã đóng góp một tính năng tuyệt vời trong khuôn khổ để kiểm tra các lệnh thủ công. Ông đã thông báo qua tweet của mình về tính năng này, và cũng được ghi lại trong tài liệu chính thức. Bây giờ, với phần bổ sung này, framework bây giờ cung cấp một API đơn giản để thử nghiệm các ứng dụng console yêu cầu nhập liệu vào của người dùng.

{
    public function testInstallTest()
    {
        $this->artisan('app:setup', [
            'name' => 'Setup New Project'
        ])
            ->expectsQuestion('Are you sure you want to start installation ?', 'Yes')
            ->expectsOutput('Initializing...')
            ->expectsQuestion('Please select your preferred version', 'v2.5')
            ->expectsOutput('Installing...')
            ->expectsQuestion('Do you want to run composer dump -o ?', 'Yes')
            ->expectsOutput('Generating Optimized Autoload Files...')
            ->assertExitCode(0);
    }
}

Phần kết luận

Cảm ơn bạn đã đọc bài viết này cho đến khi kết thúc, hãy làm theo bài viết này vào những ngày sau để biết thêm nhiều tính năng mới sắp được phát hành 5.7.

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

Sublime Text là gì? Hướng dẫn cài đặt Sublime Text 3 chi tiết

Sublime Text là gì? Cách cài đặt Sublime Text 3 cực đơn giản

Trình soạn thảo code là thứ không thể thiếu đối với các lập trình viên. Hiện nay có rất nhiều trình soạn thảo như VS code, VS studio, Dreamweaver hay Sublime Text. Với giao diện trực quan, tốc độ xử lý nhanh và khả năng tùy biến cao, Sublime Text đã trở thành một trong những lựa chọn hàng đầu của nhiều lập trình viên. Bài viết này sẽ giúp bạn hiểu rõ Sublime Text là gì và cách cài đặt Sublime Text 3, phiên bản mới nhất hiện nay.

Sublime Text là gì?

Sublime Text là một trình soản thảo code miễn phí dành cho lập trình viên do Jon Skinner tạo ra vào tháng 1 năm 2008. Sublime Text cho phép người dùng cài đặt nhiều plug-in miễn phí và hỗ trợ trên nhiều hệ điều hành phổ biến như Windows, Mac và Linux.

Hiệu năng của Sublime Text khá nhẹ, khởi động nhanh, tốn ít tài nguyên do base từ 2 ngôn ngữ lập trình nhanh mạnh là Python và C++ và có giao diện trực quan, dễ dàng tùy biến, rất bắt mắt. Đặc biệt nó hỗ trợ cực mạnh các plugin hay package từ cộng đồng nên giúp cho việc viết và maintain code trở nên dễ dàng hơn bao giờ hết. Tóm gọn lại:

  • Được sử dụng miễn phí nhưng thực ra là bản unregistered, thỉnh thoảng hiện sẽ ra pop-up thông báo bạn đang dùng thử và nhắc bạn mua bản chính thức nhưng bạn có thể bỏ qua và tiếp tục sử dụng.
  • Nhẹ, khởi động nhanh, tốn ít tài nguyên.
  • Nhiều tính năng hữu ích như chỉnh sửa tại nhiều vị trí một lúc, soạn thảo toàn màn hình, soạn thảo với layout nhiều cột…
  • Hỗ trợ nhiều plugin mạnh mẽ bởi cộng đồng developer đông đảo.
  • Giao diện đơn giản, tinh tế, có sẵn và hỗ trợ cài đặt nhiều theme.

Cài đặt các bạn có thể tham khảo trên trang chủ của Sublime Text. Bài này mình sẽ list các tác vụ giúp tối ưu Text editor trong quá trình làm việc, tối ưu nhiều thì bạn đỡ tốn thời gian.

  Vì sao tôi chuyển từ Visual Studio Code sang Sublime Text

Cách tải và cài đặt Sublime Text 3

Tải Sublime Text 3

Để cài đặt Sublime Text 3 trên Windows hoặc macOS bạn truy cập vào trang tải sublime text 3 và chọn phiên bản phù hợp với hệ điều hành của mình.

Khởi động nhanh 1 folder code

Do mình dùng Mac và Linux nên thường gõ lệnh trên Terminal, còn các bạn Win thì mọi người google thêm:

subl [folder_path]: Mở folder với sublime text
subl [file_path]: Mở file với sublime text

Install thêm plug-in nên có

  1. Package Control: phải cài cái này để bạn có thể search và cài trực tiếp các package cho Sublime Text. Để mở màn hình command line, bạn dùng tổ hợp phím Ctrl + Shirt + P.
  2. Emmet: hỗ trợ soạn thảo HTML siêu nhanh. Cách cài đặt Sublime Text 3 cực đơn giản
  3. Sidebar EnhancementsCách thêm plug-in trong Sublime Text 3
  4. Git Gutter: Package này giúp thông báo những thay đổi phiên bản của bạn với Git server
  5. DocBlockr: Tự động tạo comment đúng chuẩn
  6. CodeIntel: Dễ dàng tìm ra các function,class,.. đang sử dụng được viết từ đâu
  7. Bracket HighLighter: Package này giúp cho bạn có thể dễ nhìn thấy phần mở/ đóng của thẻ nằm ở chỗ nào.
  8. AutoFileName: Package này sẽ hiển thị ra tất cả các file có trong thư mục để các bạn có thể nhúng file đơn giản hơnCách thêm plug-in trong Sublime Text 3
  9. ColorHighlighter: Hiển thị màu sắc trong code css Thêm plug-in trong Sublime Text 3
  10 theme Sublime Text tốt nhất

Cài đặt cấu hình

Để cấu hình các option như cỡ chữ, độ dài blah blah…bạn vào Preferences -> Setting và chỉnh sửa các file Preferences.sublime-settings - User

Cài đặt cấu hình trong sublime text 3

Các phím tắt trong Sublime Text

Phím tắt thường dụng

  • Shift + Alt + (1/2/3/4/5/8/9): Chia thành nhiều màn hình
  • Shift + F11: Toàn màn hình
  • Ctrl + P: Mở nhanh một file
  • Ctrl + Shirt + T: Mở file vừa đóng.
  • Ctrl + Tab: Chuyển đến tab đang mở gần đây nhất.
  • Alt + number: Chuyển đến tab theo số thứ tự
  • Ctrl + PgUp/PgDown: Chuyển tab theo vòng tròn
  • Ctrl + W: Đóng tab đang xem / Thoát Sublime Text

Phím tắt ở 1 tab

  • Ctrl + F: Tìm kiếm
  • Ctrl + H: Tìm kiếm và thay thế
  • Ctrl + Shift + K: Xóa dòng hiện tại
  • Ctrl + Shift + D: nhân đôi dòng hiện tại
  • Ctrl + Shift + ↑ (↓): Di chuyển dòng/cụm, tự động đưa vào brackets (các dấu đóng mở hàm)

Phím tắt trong sublime text

  • Ctrl + /: comment
  • Ctrl + Shift + /: comment dạng block
  • Ctrl + R: List các hàm.
  • Ctrl + KU: Chuyển thành chữ hoa
  • Ctrl + KL: Chuyển thành chữ thường
  • Ctrl + X: Xóa dòng hiện tại nhưng đồng thời lưu nó vào bộ nhớ đệm.

Phím tắt điều hướng

  • Ctrl + G <số dòng> : Di chuyển tới dòng
  • Ctrl + P :<số dòng> : Di chuyển tới dòng
  • Ctrl + D: Bôi đen từ hiện tại
  • Ctrl + M: Di chuyển tới dấu đóng ngoặc gần nhất
  • Ctrl + Shirt + M: Bôi đen toàn bộ nội dung trong cặp ngoặc.
  • Ctrl + Shirt + Mũi tên trái: Bôi đen đến đầu từ về phía bên trái.
  • Ctrl + Shirt + Mũi tên phải: Bôi đen đến đầu từ về phía bên phải.
  • Ctrl + L: Bôi đen dòng hiện tại và chuyển con trỏ tới dòng tiếp theo.

Tóm lại Sublime Text là một công cụ vô cùng mạnh mẽ với những tính năng nổi bật và khả năng tùy biến cao được khá nhiều developer ưa chuộng hiện nay. Trên đây là hướng dẫn chi tiết cách cài đặt Sublime Text 3, chúc bạn thành công!

Truy cập ngay công việc IT đãi ngộ tốt trên TopDev

Đằng sau thành công của một Tập đoàn Tech: Xem trọng Software developer hơn cả tiền bạc

Kỷ nguyên công nghệ mới vẫn chưa có dấu hiệu chậm lại, nhưng nhóm các Chief vẫn đang vật lộn với những vấn đề rất cơ bản gọi là chuyển đổi digital (digital transformation). Một lý do làm cho thách thức này trở nên khó nhằn đó là ta không thể giải quyết nó theo cách mà ta xử lý các chuyển đổi khác được – bằng tiền bạc và các chuyên viên tư vấn quản lý. Mà nó đòi hỏi chuyên môn cao hơn của một dạng leader mới của doanh nghiệp: các kĩ sư phần mềm.

Systems engineer configuring servers in data center.

Nền kinh tế toàn cầu đang tăng cường lăn bánh trên lối mòn công nghệ mới, và công ty nào cũng ít nhiều trở thành công ty công nhệ mới, và nhu cầu săn tìm developer chất lượng nhất được ưu tiên hơn bao giờ hết. Tuy nhiên, theo nghiên cứu mới đây của Stripe and Harris Poll đã tìm ra đến 61% các sếp Chief tin rằng việc tiếp cận các developer xuất chúng có thể là một mối đe doạ đến công ty của họ. Sốc hơn là, tính từ khủng hoảng tài chính của 1 thập kỷ trước, nỗi lo về “mối đe doạ” này được xếp trên cả khó khăn về vốn.

Chưa hết, mặc dù được gọi là “tài nguyên quý giá” nhất của công ty, các developer thường bị “lãng phí tài năng” trong đó. Nhìn chung hằng năm, các công ty có thể mất đến 300 tỉ USD để trả nợ kĩ thuật, vì các dev phải chôn hết thời gian của họ vào bảo trì hệ thống hoặc xử lý những phần hao hụt từ phần mềm xấu.

Sự thật này như một “cục nhọt” vậy, và nó cũng đem đến không ít ảnh hưởng đến tâm lý của developer lên sự thành công của công ty. Không phải kĩ sư phần mềm có tiếng vì nhiều ý tưởng tốt, nhưng set kĩ năng của họ làm họ trở nên thật sự đặc biệt đề đầu tư cho sự đổi mới, năng suất, và các cầu nối kinh doanh mới. Nếu được khai thác đúng cách, họ có thể làm tác nhân “nhân số doanh thu” cho công ty họ – ảnh hưởng mạnh trực tiếp kết quả của team và công ty của họ.

Xem tuyển dụng software developer đãi ngộ tốt trên TopDev

Nếu các developer là resource gây cản trở nhất trong công ty bạn, thì câu hỏi cần được trả lời nhất ở hiện tại đó là: Làm thế nào để tăng năng suất của họ? Là một Chief executive, có 3 cách cho bạn để khai thác nhân tố này:

1. Hiểu rõ chi phí hiện tại và chi phí cơ hội. 

Đối với các CFO, nó đồng nghĩa bạn phải tập trung phân tích phần phân chia đầu tư cho các dev nhiều tương đương như bạn phân tích phần cho công ty vậy.

2. Outsource.

Hãy mở lòng với cloud. Không chỉ dành để lưu trữ và điện toán, mà cho nhiều tính năng khác trong kinh doanh mà không phải là thế mạnh của công ty bạn – từ messaging, thanh toán và CRM đến planning, kế toán kiểm toán, quản lý hàng tồn,… Từ đó đẩy dev của bạn lên các project chuyên sâu hơn, khó hơn. Nếu bạn còn cân nhắc giữa mua hay build, đơn giản thôi: mua.  Trừ phi bạn là những gã khổng lồ như Amazon hay Microsoft, thì đừng nên phân chia kĩ sư vào build các data center. Đồng thời, các dev cảu bạn cũng nên tập trung vào những thứ làm nên lợi thế kinh doanh của công ty bạn mà thôi.

3. Tuyển các leader có background/ kinh nghiệm về tech. Nếu không phải dàn chief, thì cũng nên các manager cấp cao.

Việc có thêm các kĩ sư phần mềm trực tiếp tham gia vào các quyết định về strategic planning sẽ đảm bảo cho bạn một lối đi product đúng đắn, một team giỏi và một hướng đi công nghệ phù hợp nhất cho các project dài hơi — và bạn cũng sẽ tránh được những hố đen như nợ technical và không lãng phí thời gian phát triển của các dev.

Trong thời đại chuyển đổi số hiện nay, quan trọng là phải truyền cảm hứng được cho dev bằng các tool, cơ sở hạ tầng và hướng đi rõ ràng để cùng nhau tiến nhanh hơn, chắc hơn. Thông qua cách đầu tư vào “hệ số nhân di động” này, bạn hoàn toàn có thể tận dụng được hết những tài nguyên mình đang có, và mở đường tiến vào những cú nhảy kinh doanh bức phá hơn.

Will Gaybrick, CFO của Stripe. Gaybrick cũng là một thành viên của Hiệp hội CFO Toàn cầu của CNBC

TopDev via CNBC

Những ngôn ngữ lập trình tốt nhất cho bạn năm 2024 – So sánh đầy đủ

Đây là hướng dẫn dứt khoát cho bất kỳ ai sẵn sàng chọn con đường sự nghiệp ngôn ngữ lập trình đúng vào năm 2024.

Và hãy để tôi hiểu rõ điều gì đó:

Đây không phải là một “ngôn ngữ nóng nhất hàng đầu” què quặt ném một loạt các tên và buzzwords theo ý kiến ​​của một ai đó.

Đây là một đánh giá khách quan và thực tế của tình trạng hiện tại, xu hướng và dự đoán an toàn trong tương lai gần của ngành công nghiệp CNTT vào đầu năm 2018.

Nó dựa trên dữ liệu thống kê từ các nguồn đáng tin cậy khác nhau và là kết quả của một nghiên cứu chuyên sâu hai tuần.

Mục tiêu của bài đăng này là giúp bạn đưa ra quyết định sáng suốt về các ngôn ngữ mà thị trường CNTT đang tìm kiếm vào năm 2024, đó là thời gian và nỗ lực để làm chủ và biến thành một nghề nghiệp thành công và có lợi nhuận với tư cách là nhà phát triển phần mềm .

Khi cố gắng quyết định ngôn ngữ lập trình nào tạo ra con đường sự nghiệp tốt nhất, các nhà phát triển thường tìm kiếm bốn đặc điểm sau:
  1. Lương cao
  2. Phổ biến – nhiều cơ hội việc làm, đa dạng
  3. Xu hướng nhận được nhu cầu cao hơn cho tương lai
  4. Tốt hơn là dễ học và dễ làm việc  Đối với mỗi ngôn ngữ được nêu trong danh sách,bạn sẽ thấy Giới thiệu ngắn gọn giúp bạn làm quen với ngôn ngữ, loại tùy chọn nghề nghiệp nào có thể cung cấp và điều thú vị về nó
  5. Biểu đồ phổ biến ngôn ngữ theo TIOBE và GitHub Octoverse
  6. So sánh mức lương dựa trên dữ liệu từ Indeed.com và khảo sát năm 2017 của StackOverflow
  7. Xu hướng nhu cầu trong năm năm qua theo Google Trends
  8. Đoạn mã ví dụ ngắn để cung cấp cho bạn ý tưởng trực quan về cú pháp ngôn ngữ
Cuối cùng, tôi đã bao gồm bốn ngôn ngữ ít được biết đến đã đạt được sự phổ biến nhanh chóng trong vài năm qua và dự kiến ​​sẽ có nhu cầu rất cao cho năm 2018.
Hãy đi sâu vào ngay với lựa chọn số một.

1. JavaScript 

JavaScript là ngôn ngữ phổ biến nhất theo khảo sát hàng năm của StackOverflow với 62,5% số người được hỏi tuyên bố sử dụng nó.

Chắc chắn ngôn ngữ thống trị của trang web và sự tăng trưởng của JavaScript trong thập kỷ qua là rất lớn. Tại sao? Chỉ cần nhìn xung quanh và đếm số lượng thiết bị hỗ trợ web mà bạn có thể xem.

Người đồng sáng lập và nhân vật lập trình nổi tiếng của Stack Overflow, Jeff Atwood, nổi tiếng nói:

“Bất kỳ ứng dụng nào có thể được viết bằng JavaScript, cuối cùng sẽ được viết bằng JavaScript.”

Có nghĩa, là an toàn để nói rằng sẽ không có thiếu cơ hội JavaScript trong năm 2018 và xa hơn nữa. Kiến thức JavaScript sinh ra nhiều khuôn khổ front-end như Angular, React, Ember, Backbone, và các framework khác, cũng như môi trường chạy Node.js, cho phép chạy JavaScript trên backend với hiệu quả cao.

Ba trong số bốn frameworks phổ biến nhất cho năm 2023 theo StackOverflow là dựa trên JavaScript.

Nếu bạn sử dụng nó và bạn sẽ thích ngay lập tức, hãy xem kết quả công việc của bạn đang hoạt động, ví dụ như tạo các thành phần web tương tác, JavaScript là một ý tưởng tốt cho bạn. Hãy nhớ rằng việc sử dụng JavaScript có nghĩa là bạn cũng nên có kiến thức với HTML và CSS, mà về cơ bản là những trang web được tạo ra. Các công cụ như Apache Cordova hoặc React Native cho phép sử dụng JavaScript cho các ứng dụng di động. Thậm chí có thể phát triển trò chơi hoặc phát triển ứng dụng dành cho máy tính để bàn với các dự án như Electron.

Xu hướng phổ biến của JavaScript trong 5 năm qua: Tăng ổn định

JavaScript code ví dụ:

document.addEventListener("DOMContentLoaded", function(event) {
  var e = document.getElementById("myForm");
  var msg = "";
 
  // Wait for user to click the button
  e.addEventListener("change", function () {
    var myColor = this.color.value;

    if (myColor == "Blue") {
      msg = "Just like the sky!";
    } else if (myColor == "Red") {
      msg = "Quite daring!";
    } else if (myColor == "Green") {
      msg = "Like... grass?";
    }   

    // Output message
    document.getElementById("msg").innerHTML = msg;
  }, false);
});

Phần kết luận

JavaScript chắc chắn là một trong những ngôn ngữ phổ biến nhất trong năm 2018 và hơn thế nữa. Thật khó cho một ngôn ngữ của tầm cỡ này để đứng cao trong bảng xếp hạng lương như hầu hết các vị trí được khảo sát có thể là cơ sở. Không giống như các ngôn ngữ ít phổ biến 

2. Swift

Swift là một ngôn ngữ lập trình tương đối mới được phát hành bởi Apple vào năm 2014. Đây là ngôn ngữ để phát triển các ứng dụng iOS hoặc macOS gốc. Nó được coi là một cải tiến về khả năng sử dụng và hiệu suất so với Objective-C – ngôn ngữ được sử dụng cho hệ điều hành iOS và OS X của Apple.

Swift thường được các nhà phát triển ưa thích, đứng ở vị trí thứ 4 trong danh sách các ngôn ngữ được yêu thích nhất trong năm 2017, sau khi đạt vị trí số 1 trong năm 2015 . Nếu bạn chọn một nghề nghiệp với Swift, rất có thể bạn sẽ thích nó. Nếu bạn muốn tham gia phát triển di động, bạn chắc chắn nên xem Swift như một con đường sự nghiệp được trả lương cao. Nói chung, các ứng dụng iOS đã được chứng minh là có lợi hơn so với các ứng dụng Android.

Xếp hạng TIOBE là chỉ báo về mức độ phổ biến của ngôn ngữ lập trình. Xếp hạng dựa trên số lượng kỹ sư có tay nghề trên toàn thế giới, khóa học, nhà cung cấp bên thứ ba và công cụ tìm kiếm.

2. GitHub Octoverse: #13

Thống kê nhanh về mức độ phổ biến và so sánh mức lương 1. TIOBE Rating: # 12 (January 2018) Xếp hạng TIOBE là một chỉ số về mức độ phổ biến của các ngôn ngữ lập trình. Xếp hạng dựa trên số lượng kỹ sư có tay nghề trên toàn thế giới, khóa học, nhà cung cấp bên thứ ba và công cụ tìm kiếm.

Thống kê từ cuối năm 2017 Các ngôn ngữ phổ biến nhất trên GitHub bằng các yêu cầu kéo mở (được hiển thị bằng hàng triệu). GitHub là nơi có các dự án nguồn mở của 24 triệu người dùng, được viết bằng 337 ngôn ngữ lập trình duy nhất trong 67 triệu kho lưu trữ.

3. Mức Lương của Mỹ tại Indeed.com: Cao

Indeed.com là một công cụ tìm kiếm liên quan làm việc trên toàn thế giới cho công việc danh sách. Execognized on 60 quốc gia and 28 language.Vào tháng 10 năm 2010, Indeed.com đã chuyển Monster.com để trở thành trang web làm việc có giá trị truy cập cao nhất tại Hoa Kỳ.

4. Mức Lương Trong StackOverflow: Trên Mức Trung bình

Thống kê từ năm 2017, hơn 64 000 nhà phát triển được khảo sát.StackOverfllow được cho là cộng đồng nhà phát triển lớn nhất với hơn 50 triệu lượt truy cập mỗi tháng. Mỗi năm kể từ năm 2011, StackOverflow đã tiến hành một cuộc khảo sát yêu cầu các nhà phát triển về các công nghệ, mã hóa và thói quen làm việc yêu thích của họ.

Xu hướng nhanh chóng phổ biến trong 5 năm qua: Tăng chậm 

Đoạn mã ví dụ Swift:

import UIKit
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.navigationController!.navigationBar.barTintColor = UIColor.yellow        
        self.navigationController!.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.black]
        
        let navBgImage:UIImage = UIImage(named: "bg_blog_navbar_reduced.jpg")!
        self.navigationController!.navigationBar.setBackgroundImage(navBgImage, for: .default)
    }
 
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

Phần kết luận

Swift là ngôn ngữ mới và có vẻ tốt hơn cho các ứng dụng iOS và macOS so với ngườitiền nhiệm Objective-C của nó.

Chỉ trong vài năm, Swift đã trở nên nổi tiếng và đã đánh bại Objective-C trong hầu hết các bảng xếp hạng. Ngôn ngữ này được các nhà phát triển yêu thích và cũng trả tiền tốt – bạn có thể hỏi thêm gì từ một con đường sự nghiệp.

3. Python

Python là một ngôn ngữ mục đích chung mà bạn có thể tìm thấy gần như bất cứ nơi nào ngày hôm nay. Có thể là ứng dụng web, ứng dụng dành cho máy tính để bàn, máy chủ mạng, học máy, công cụ truyền thông và các ứng dụng khác.

Nó được sử dụng bởi những Công ty lớn như NASA hay Google, nơi mà người sáng tạo Python Guido van Rossum được tuyển dụng trong khoảng 8 năm viết chủ yếu … Python.

Code Python là gọn gàng, dễ đọc và được cấu trúc tốt. Thụt lề đúng đắn không chỉ dành cho vẻ đẹp ở đây – nó xác định việc thực thi mã.

Các khuôn khổ phát triển web dựa trên Python như Django và Flask ngày càng phổ biến hơn. Ngoài ra, ngôn ngữ này còn được trang bị đầy đủ các máy tính học tập và thư viện phân tích dữ liệu như Scikit-learn và Pandas .Trên toàn bộ, con đường sự nghiệp với Python là khác nhau và ở đây. Đó là một lựa chọn tốt cho các nhà phát triển mới bắt đầu, vì nó là ngôn ngữ cấp cao và dễ đọc và dễ hiểu.

So Sánh:

Xu hướng nhanh chóng phổ biến trong 5 năm qua: Cực mạnh 

Đoạn mã ví dụ Python:

import itertools

def iter_primes():
     # an iterator of all numbers between 2 and +infinity
     numbers = itertools.count(2)

     # generate primes forever
     while True:
         # get the first number from the iterator (always a prime)
         prime = numbers.next()
         yield prime

         # this code iteratively builds up a chain of
         # filters...slightly tricky, but ponder it a bit
         numbers = itertools.ifilter(prime.__rmod__, numbers)

for p in iter_primes():
    if p > 1000:
        break
    print p

Phần kết luận

Trở thành master của Pyhton chắc chắn sẽ là sự lựa chọn tốt nhất ở hiện tại cho bạn và trong tương lai gần. Đơn giản là nó đứng đầu ở gần như tất cả các hạn mục.

[Còn tiếp…] 

TopDev via My First IT Job

Ứng dụng mới cực hot từ Google: Android Sunflower

Ứng dụng mới cực hot từ Google: Android Sunflower

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

Đây là một ứng dụng làm vườn để trình bày các phương pháp hay nhất được phát triển bằng Android Jetback. 

(Bài viết này cũng có bằng tiếng Trung Quốc tại WeChat / 中文 参考 WeChat)

Google đã công bố Android Jetpack tại Google I/O 2018. Jetpack là một tập hợp các thành phần phần mềm Android để giúp cho bạn phát triển các ứng tuyệt vời một cách đơn giản hơn. Các thành phần này giúp bạn đi theo các phương pháp hay nhất, bạn sẽ thoải mới vì code đã được viết sẵn và đơn giản hóa các tác vụ phức tạp, do đó bạn có thể tập trung vào code mà bạn quan tâm.

Để giúp các lập trình viên tìm hiểu cách tổng hợp các thành phần Jetpack vào trong chính ứng dụng của mình, chúng tôi đã tạo ra Sunflower, đây là một ứng dụng làm vườn mô tả các phương pháp hay nhất về phát triển Android với Android Jectpack. Nếu bạn mới sử dụng Jetback, để tốt hơn bạn nên xem nội dung về Jetpack trên developer.android.comtạo ứng dụng Jetpack đơn giản đầu tiên của bạn trước khi tiếp tục.

Bài viết này về Sunflower là phần đầu trong chuyên đề. Nó sẽ đưa bạn vào một chuyến hành trình Sunflower và giải thích ngắn gọn về các thành phần Jetpack được bao hàm trong ứng dụng này. Các bài viết trong thời gian tới sẽ thảo luận về phát triển Jetpack và Android và tìm hiểu sâu hơn về các chủ đề cụ thể như Navigation và đặt  lịch trình cho các tác vụ có tính chu kỳ với WorkManager.

Tuyển lập trình android lương cao trong tháng

Làm nhanh một chuyến tham quan vườn

Khi ứng dụng được chạy lần đầu, ban đầu người dùng nhìn thấy màn hình ”My Garden” trống. 

Hãy thêm một cây trồng vào! Đến danh sách cây trồng bằng cách chạm vào menu hamburger và mở Navigate drawer lên.

Mỗi cây trồng được liên kết với Grow Zone, cái mà được xác định bởi vĩ độ và chỉ ra khu vực phù hợp nhất cho cây phát triển tốt. Bạn có thể lọc danh sách các cây trồng bằng cách nhấn vào cây trồng trong danh sách lọc để chọn ra một Grow Zone.

Nhấn vào chi tiết cây trồng, sẽ đưa đến màn hình Plant Detail.

Màn hình chi tiết  hiển thị tên, mô tả, nhu cầu tưới nước của cây và hình ảnh của cây. Người dùng có thể thêm cây vào khu vườn của họ từ màn hình này bằng cách nhấn vào nút Floating Action Button. Họ cũng có thể Share giống cây trồng này thông qua tùy chọn menu.

Sau khi một hoặc nhiều cây trồng được thêm vào, từng cây mới sẽ xuất hiện trong màn hình  “My Garden”, cùng với ngày được trồng và nhu cầu được tưới sắp tới. Hãy quay trở lại “My Garden” để xem lại màn hình lúc này, thì chúng ta đã thêm một hoặc hai loại cây vào rồi.

Màn hình “My Garden” lúc này hiển thị những cây được thêm vào, cùng với ngày chúng được trồng cũng như lần cuối được tưới là khi nào.

Sử dụng các thành phần Jetpack

Sunflower sử dụng nhiều thành phần Jetpack. Dưới đây là tổng quan ngắn gọn về vai trò của  mỗi thành phần:

  • Sunflower được viết hoàn toàn bằng Kotlin, sử dụng Android KTX. Android KTX là một tập hợp các tiện ích mở rộng dành cho Kotlin để tối ưu hóa các API nền tảng Jetpack và Android , nhờ đó có mã Kotlin ngắn gọn và độc đáo hơn.
  • Ứng dụng sử dụng một Activity với nhiều Fragment. Chuyển tiếp giữa các fragment sử dụng thành phần Navigation hiệu ứng chuyển tiếp.
  • Các màn hình sử dụng các fragment layout, được tạo bằng cách sử dụng ConstraintLayoutData Binding
  • Lưu trữ dữ liệu trên thiết bị về danh sách  và các mục nhập cây trồng được quản lý với Room ở cấp cơ sở dữ liệu và hiển thị với giao diện người dùng thông qua ViewModelsLiveData
  • AppCompat được sử dụng để duy trì chức năng chính của ứng dụng dành cho các phiên bản quá cũ của Android
  • Các tác vụ nền được xử lý bởi WorkManager
  • Các chi tiết về cây trồng có thể được chia sẻ với các ứng dụng khác trên thiết bị , hoặc được sao chép vào bộ nhớ tạm một cách đơn giản
  • Kiểm thử được thực hiện bởi các trình kiểm tra bằng bằng JUnitEspresso Android UI

Các cải tiến trong tương lai

Sunflower hiện đang đã phát hành bản alpha và đang không ngưng phát triển, với các tính năng mới và thường xuyên tích hợp các thành phần chuyên sâu hơn. Một số cải tiến sắp tới bao gồm việc lọc danh sách cây trông dựa trên vị trí của người dùng đối với AndroidX và thông báo khi một khu đất cần tưới tiêu.

Tạo tài khoản và bình chọn cho các giải pháp mà bạn muốn xem hoặc khám phá trên GitHub.

Trong các bài viết tới, chúng ta sẽ tìm hiểu cách sử dụng các thành phần Jetpack khác trong Sunflower như sự chuyển hướng qua lại và nhiệm vụ định kỳ, vì vậy hãy chú ý theo dõi. Cảm ơn vì đã đọc!

Chân thành cảm ơn những cá nhân tuyệt vời trong nhóm Android Developer Relations và đội ngũ Jetpack vì những đóng góp của họ cho Sunflower và bài viết này.
Bài viết gốc được đăng tải tại Medium

Xin đừng return mảng kết hợp!

Người dịch: Trần Thanh Dân

Tôi ghét phải xử lý mảng kết hợp khi đang viết code cho client. Vấn đề với mảng là nó không có ngữ cảnh, không có kiến thức gì đặc biệt. Mảng đơn giản là một phần data được gói gọn theo một format nhất định không được thuận tiện lắm. Tồi tệ nhất là chúng ràng buộc ta vào một cách triển khai nhất định.

Tôi không có ý nói rằng bạn không nên trả về các mảng có dữ liệu thống nhất (return arrays that have uniform data). Việc trả về mảng của một loại đối tượng là tốt, dù cho bạn không dám chắc được là nó sẽ chỉ chứa một số loại data nhất định qua API.

Mảng có thể hoạt động như phần dữ liệu đại diện cho một số lớp (class) nội bộ, và xin nhấn mạnh là nội bộ – là state hợp lí nhất mà nó nên xuất hiện. Cái tôi muốn nói tới là 

Xem xét đoạn mã sau:

class AcmeFileSender implements FileSender
{
    public function sendFiles(FileCollection $files): array
    {
        $sent = 0;
        $errors = [];
        foreach ($files as $file) {
            try {
                $this->send($file);
                $sent++;
            } catch (SenderException $exception) {
                $errors[] = $exception->getMessage();
            }
        }
        return [
            "sent" => $sent,
            "failed" => count($errors),
            "errors" => $errors
        ];
    }

    public function send(File $file): void {//...}
}

Vấn đề trong trường hợp này là, Chúng ta không thể biết được cấu trúc chính xác của mảng này. Điều này có nghĩa là khi chúng ta viết code ở phía client chúng ta sẽ phụ thuộc vào việc thực hiện phương thức sendFiles(). Chúng ta phải biết được chính xác khóa (key) là gì và loại dữ liệu (sort of data) của khóa đó.

Trong hướng đối tượng (OOP) chúng ta không nên quan tâm đến chi tiết thực hiện của các lớp khác, chúng ta chỉ cần quan tâm đến các phương thức hiện tại (interfaces method).

Gần đây tôi có bị vấp phải một điều gì đó có thể là một vi phạm nguyên trọng hơn:

public function processStuff($stuff): array
{
    //...
    return [$someArray, $someObject];
}

//... in client code
list($someArray, $someObject) = $this->processor->processStuff($stuff);

Bây giờ, nó là một cách để trả tồi tệ (this kind of abominations) từ phương thức riêng tư (private methods). Nhưng khi bạn đang bắt đầu thiết kế API công bố (API public) của bạn thì tất cả các hy vọng sẽ bị mất đi. Điều này có nghĩa là bạn đang xử lý với mã thủ tục (procedural code base). Trong mã thủ tục mọi thứ đều là dữ liệu và có thể sẽ bị chi phối.

Trong trường hợp trên vấn đề là thiếu định nghĩa văn bản (context). Điều này có nghĩa là khi nào bạn nhận một someArray và một someObject cùng thời điểm? Tại sao nó trả về cùng thời điểm? Rõ rang việc thực hiện phương thức processStuff() sẽ biết được về cách mà nó được sử dụng. Vì vậy nó không được thiết kế để dán cùng với một vài mã ở client. Mã client được kết hợp chặt chẽ với việc thực hiện của phương thức processStuff().

Trong nhiều trường hợp, có một số nhầm lẫn là cách xác định nhiệm vụ. Mã làm gì đó và trả về dấu hiệu thành công đến client. Không có nhiều sự tương tác giữa server và client.

Chúng ta cần làm gì để cho ví dụ ban đầu tốt hơn? Giá trị các đối tượng. sendFile() sẽ có nhiều ý nghĩa hơn bằng cách sử dụng giá trị của đối tượng.

interface SenderReport
{
    public function sent(): int;
    public function failures(): int;
    public function errors(): Iterator;
    public function print(): string;
}

Chúng ta sẽ cập nhật FileSender và implementations nó.

class AcmeFileSender implements FileSender
{
    //...
    public function sendFiles(FileCollection $files): SenderReport
    {
        //...
        return new FileSenderReport($sent, count($errors), $errors);
    }
}

Bây giờ chúng ta có thể dựa vào interface của SenderReport thay vì triển khai FileSender::sendFiles(). Bây giờ chúng ta đã có định nghĩa văn bản (context). Ngoài ra, chúng ta có thể thực hiện thay đổi việc triển khai (implementations) FileSender một cách tự do.

Tóm lại, làm ơn, đừng return mảng kết hợp từ public API. Hãy đánh giá lại kể cả khi phải return value. Và nếu bắt buộc thì cũng return cái khác có interface mà bạn và user có thể tin tưởng dùng.  

TopDev via dev.to

  JavaScript Arrays và Objects thật ra không khác gì sách và báo

iOS – Tạo chứng chỉ phân phối và tệp .p12 trên MacOS

iOS-MacOS

Chứng chỉ phân phối xác định nhóm / tổ chức của bạn trong hồ sơ cấp phép phân phối và cho phép bạn gửi ứng dụng của mình tới Apple App Store.

Tệp .p12 chứa các chứng chỉ mà Apple dùng để tạo và xuất bản ứng dụng.

Các bước dưới đây sẽ hướng dẫn bạn qua quá trình tạo Chứng chỉ phân phối iOS và tệp .p12. Để đọc thêm về chứng chỉ và cách chúng hoạt động trong App Store của Apple, vui lòng truy cập Trung tâm phát triển iOS và tham khảo tài liệu chính thức của Apple.

Lưu ý: Các bước này phải được thực hiện trên máy Mac mà bạn sẽ sử dụng để gửi và xuất bản ứng dụng của mình lên Apple App Store. Mặc dù bạn có thể chuyển quyền truy cập vào máy tính Mac khác, chúng tôi khuyên bạn nên làm theo các bước sau trên máy thực tế mà bạn sẽ sử dụng để gửi ứng dụng.

Trước khi bắt đầu 

Tìm việc làm ios lương cao cho bạn

Cách tạo chứng chỉ phân phối

1. Trên máy Mac, hãy vào thư mục Ứng dụng > Tiện ích và mở Keychain Access.

Trên máy Mac, vào thư mục Applications> Utilities và mở Keychain Access.

2. Truy cập Keychain Access > Certificate Assistant > Request a Certificate from a Certificate Authority.

Truy cập Keychain Access> Trợ lý chứng chỉ> Yêu cầu chứng chỉ từ Tổ chức phát hành chứng chỉ.

3. Điền thông tin vào cửa sổ Thông tin chứng chỉ như được chỉ định bên dưới và nhấp vào “Tiếp tục”.

  • Trong trường Địa chỉ email người dùng , nhập địa chỉ email để xác định bằng chứng chỉ này
  • Trong trường Tên thường dùng , nhập tên của bạn
  • Trong nhóm Yêu cầu , hãy nhấp vào tùy chọn “Đã lưu vào đĩa”
Điền thông tin vào cửa sổ Thông tin chứng chỉ như được chỉ định bên dưới và nhấp vào "Tiếp tục".

4. Lưu tệp vào ổ cứng của bạn.

Trợ lý tạo tệp Yêu cầu ký chứng chỉ (CSR) chứa cặp khóa công khai / riêng tư.

Lưu tệp vào ổ cứng của bạn.

5. Để đăng nhập vào Bảng điều khiển dành cho nhà phát triển iOS và nhấp vào Tài khoản ở trên cùng

Để đăng nhập vào Bảng điều khiển dành cho nhà phát triển iOS goto <https://developer.apple.com> và nhấp vào Tài khoản ở trên cùng

6. Nhấp vào “Chứng chỉ, số nhận dạng & hồ sơ”.

Nhấp vào "Chứng chỉ, số nhận dạng & hồ sơ".

8. Chuyển đến Chứng chỉ> Sản xuất và nhấp vào nút “+” để thêm chứng chỉ mới.

Đi tới Chứng chỉ> Sản xuất và nhấp vào nút "+" để thêm chứng chỉ mới.

9. Chọn “App Store và Ad Hoc” từ tùy chọn Sản xuất và nhấp vào “Tiếp tục”.

Lưu ý: Để sử dụng chứng chỉ của bạn, bạn phải có chứng chỉ ký trung gian trong keychain hệ thống OS X. Điều này được cài đặt tự động bởi Xcode. Tuy nhiên, nếu bạn cần cài đặt lại chứng chỉ ký trung gian, hãy nhấp vào liên kết ở cuối trang.

Chọn "App Store và Ad Hoc" từ tùy chọn Sản xuất và nhấp vào "Tiếp tục".

10. Nhấp vào “Tiếp tục” một lần nữa.

Bạn đã tạo tệp CSR của mình trong các bước trước, do đó không cần phải tạo một tệp khác.
Nhấp vào "Tiếp tục" một lần nữa.

11. Nhấp vào “Chọn tệp” và chọn tệp CSR bạn đã tạo trước đó và sau đó nhấp vào “Tạo”.

Nhấp vào "Chọn tệp" và chọn tệp CSR bạn đã tạo trước đó và sau đó nhấp vào "Tạo".

12. Nhấp vào nút “Tải xuống” để tải xuống tệp .cer về máy của bạn và sau đó nhấp vào “Xong”.

Nhấp vào nút "Tải xuống" để tải tệp .cer xuống máy của bạn và sau đó nhấp vào "Xong".

13. Nhấp đúp vào tệp .cer để cài đặt nó trong Keychain Access.

Nó sẽ có tên “iPhone Distribution <firstname> <lastname>” và sẽ hết hạn một năm kể từ ngày hôm nay.

Bấm đúp vào tệp .cer để cài đặt nó trong Keychain Access.

Cách xuất Chứng chỉ phân phối dưới dạng tệp .p12

Tệp .p12 là tệp được mã hóa và định dạng đặc biệt chứa chứng chỉ phân phối của bạn. Nó được nhúng bởi mag + Cổng thông tin xuất bản khi xây dựng ứng dụng của bạn. iTunes Connect kiểm tra tệp này khi bạn gửi một ứng dụng và sẽ chỉ chấp nhận ứng dụng nếu nó chứa tệp .p12 khớp với những gì bạn đã định cấu hình trong tài khoản iTunes Connect của mình.

1. Trên máy Mac của bạn, khởi chạy Keychain Access, chọn mục nhập chứng chỉ và nhấp chuột phải vào nó để chọn “Xuất”.

Tất cả chứng chỉ bạn đã cài đặt sẽ nằm trong “đăng nhập” keychain (Nhãn 1) trong danh mục “Chứng chỉ của tôi” (Nhãn 2).

Trên máy Mac của bạn, khởi chạy Keychain Access, chọn mục nhập chứng chỉ và nhấp chuột phải vào mục đó để chọn "Xuất".

2. Trong cửa sổ xuất hiện, đảm bảo Định dạng tệp được đặt thành “Trao đổi thông tin cá nhân (.p12)” và nhấp vào “Lưu” để lưu nó vào máy của bạn.

Trong cửa sổ xuất hiện, đảm bảo Định dạng tệp được đặt thành "Trao đổi thông tin cá nhân (.p12)" và nhấp vào "Lưu" để lưu nó vào máy của bạn.

3. Khi được yêu cầu nhập mật khẩu, hãy để trống và nhấp vào “Ok”.

Khi được yêu cầu nhập mật khẩu, hãy để trống và nhấp vào "Ok".

4. Khi được yêu cầu nhập mật khẩu máy tính, hãy nhập mật khẩu đó và nhấp vào “Cho phép”.

Khi được yêu cầu nhập mật khẩu máy tính, hãy nhập mật khẩu đó và nhấp vào "Cho phép".

5. Tệp .p12 của bạn sẽ được lưu ở vị trí bạn đã chỉ định.

Tệp .p12 của bạn sẽ được lưu ở vị trí bạn đã chỉ định.

6. Đăng nhập vào cổng + Xuất bản cổng thông tin và đi tới Ứng dụng> iOS> Chứng chỉ và Cung cấp tệp.

7. Nhấp vào “Chọn tệp” bên dưới tiêu đề Giấy chứng nhận phân phối, chọn chứng chỉ phân phối của bạn và nhấp vào “Lưu”.

Nhấp vào "Chọn tệp" bên dưới tiêu đề Giấy chứng nhận phân phối, chọn chứng chỉ phân phối của bạn và nhấp vào "Lưu".

Tạo ứng dụng: Các bước tiếp theo

Tạo chứng chỉ phân phối và tệp .p12 chỉ là một bước trong việc tạo ứng dụng iOS để phân phối. Vui lòng tham khảo các bài viết bổ sung trong phần này để biết thông tin về cách thiết lập hồ sơ cấp phép và định cấu hình mua hàng trong ứng dụng. Các mục này tương ứng với các thiết lập trong cổng thông tin mag + Publish. Cổng thông tin sẽ thực sự xây dựng ứng dụng iOS tùy chỉnh của bạn. Sau đó, bạn sẽ tải ứng dụng này lên Apple App Store hoặc tới các máy chủ phân phối nội bộ của riêng bạn (chỉ dành cho khách hàng doanh nghiệp).

Tác giả: Khánh Lê

Tại sao bây giờ là thời điểm thích hợp để học GraphQL?

Chào anh em đồng nghiệp trong năm 2018, ở Balan hiện giờ đã vào đông, tuy kì nghĩ mùa đông của chúng tôi rất ngắn, nhưng tại Treehouse chúng tôi vẫn đang theo sát tôc độ phát triển của các web development, chúng tôi sẽ cố gắng hết sức để phân loại và sắp xếp các xu hướng đã qua từ những công nghệ mà về cơ bản sẽ thay đổi những gì chúng tôi đã dạy cho sinh viên của mình. Gần đây tôi đã tìm thấy một đầu mối cho tương lai dưới dạng một câu trích dẫn tư Sacha Greif, một trong những nhà đồng xuất bản 2017 State Of JavaScript Survey:

“…Tôi muốn nói nên hãy chú ý đến GraphQL. Đó là công nghệ đem lại lãi suất rất lớn nhưng thực tế ngược lại thì số lượng người dùng hiện tại lại rất thấp, điều này có thể cho thấy một phần đáng kể của hệ thống tiếp cận GraphQL trong năm 2018…”

Nếu phải đoán (chúng tôi phải làm điều này tại Treehouse) tôi phải nói rằng anh ta đúng. Năm 2018, GraphQL đã sẵn sàng cho một sự hưởng ứng to lớn từ cộng đồng web development, các junior developers sẽ học cách làm việc với nó và nó sẽ trở thành một yêu cầu mới trong nghành công nghệ. Nhưng điều gì khiến cho GraphQL bị đặt qua một bên trong ngày hôm nay, dù thế nào đi nữa mọi thứ cuối cùng vẫn sẽ là GraphQL:

Điều dễ nhất để nhận ra rằng loại API duy nhất đã từng là REST API. Nếu bạn đã học về development web trong 5 năm, REST API có lẽ là loại API duy nhất bạn đã sử dụng. Một số công nghệ và framework có hướng dẫn và quy tắc chung khá nhiều, lần đâu tiên một ý tưởng về REST API được đề xuất bởi Roy Fielding trong năm 2000 như một cách để giúp việc truy cập  và sử dụng API dễ hơn so với các định dạng tiêu chuẩn khác trong cùng thời điểm. Những hướng dẫn và nguyên tắc đơn giản này có thể dễ dàng tích hợp với các tài nguyên bên ngoài vào các ứng dụng web khác và REST API đã sớm được chấp nhận như là Amazon Web Services, Flickr và EBay, đã trở thành một phần không thể thiếu của Internet.

Nhưng REST API luôn tồn tại một số vấn đề. Trong REST API, một URL được dành riêng cho một tài nguyên cụ thể, dữ liệu được trả về từ tài nguyên sau khi được sửa lỗi. Nó hoạt động tốt trong một số vấn đề được dự đoán trước, nhưng khi vấn đề chúng tôi yêu cầu API sử lý trở nên lớn hơn và khó dự đoán hơn, số lượng yêu cầu chúng tôi phải thực hiện cho một số kết thúc khác nhau trong REST API để có thể tăng tốc độ của các ứng dụng web.

Bắt đầu với GraphQL như một giải pháp, GraphQL là một ngôn ngữ truy vấn có cấu trúc, được nhập vào đầu trang của một API cho phép các nhà phát triển truyền đạt thêm thông tin về dữ liệu họ gửi và nhận. Điều đó nghĩa là gì? Xem sét ví dụ API về nhân khẩu của một thành phố. Giả sử chúng ta muốn tạo một ứng dụng với API này cung cấp tổng số người sở hữu thú cưng trong một khu phố nhất định.

“ GraphQL là một ngôn ngữ truy vấn có cấu trúc, được nhập vào đầu trang của một API cho phép các nhà phát triển truyền đạt thêm thông tin và dữ liệu của họ ’’

Trong REST API, chúng ta có thể bắt đầu tạo lập những câu hỏi từ điểm kết thúc của thành phố cho một danh sách của khối thành phố. Chúng ta sẽ chờ thông tin trả lại, và sau đó lọc các thông tin theo khu vực phù hợp để đạt được kết quả gần như mong muốn của chúng ta. Khi chúng ta đã có được thông tin khối nhà mong đợi, chúng ta có thể thiết lập yêu cầu đến điểm kết thúc của các khối nhà đó, một yêu cầu cho môt khối nhà, để nhận được thông tin của các ngôi nhà trong khối thành phố đó. Có thể điểm kết thúc của các khối thành phố được thiết kế để giới hạn lại thông tin trên con người ở trong những ngôi nhà ấy, tuy nhiên để tìm ra liệu là mỗi người trog số đó có nuôi thú cưng, chúng ta lạ phải đặt ra hàng tá cá câu hỏi khác đến những người khác để biết thêm chi tiết. Điều này khiến các câu hỏi cứ chất chồng lên nhau, ngay cả khi nếu chúng ta đẩy nhanh tốc độ của quy trình bằng việc chạy các câu hỏi song song.

Nhưng với GraphQL, chúng tôi đang tiến hành tạo ra những câu hỏi đến các điểm kết thúc của thành phố và với những yêu cầu này, chúng tôi cũng sẽ gửi một câu hỏi để điểm kết thúc biết chúng tôi chỉ muốn các khối trong các vùng cụ thể. Chúng tôi chỉ cần biết 1 danh sách của các nhà cho mỗi khối, vì vậy chúng tôi cũng sẽ đặt câu hỏi cụ thể. Sau đó chúng tôi sẽ tạo một yêu cầu đến điểm cuối các ngôi nhà với yêu cầu khác nhằm yêu cầu danh sách dân cư trong mỗi nhà, và cụ thể là chúng tôi muốn biết liệu là mỗi người có đang sở hữa một con thú cưng hay không?

Nếu như may mắn, API có thể được thiết kế để có điểm kết thúc thành phố và thêm vào đó là các thông tin của các ngôi nhà, con người và thú cưng có thể được bao gồm trong câu hỏi. Bằng việc sử dụng ngôn ngữ truy vấn của GraphQL, chúng ta giảm thiểu được hàng chục các câu hỏi xuống còn 2 đến 7 câu. Đó là một hiệu xuất lớn trong hệ thống của chúng tôi !

Khi làm việc với GraphQL bạn sẽ thấy được các lợi ích từ hệ thống này, như khả năng phát hiện hình dạng của dữ liệu chúng ta nhận và nhận được nhiều thông tin chi tiết về dữ liệu cũng như các lỗi được gửi từ API thong qua 1 loại hệ thống đơn giản của GraphQL.

GraphQL thậm chí còn có khả năng cung cấp cho chúng tôi một vài mã code cơ bản trong khi chúng tôi viết request.

Để càng ngày càng nhiều công ty như Github, Facebook, Amazon, và Twitter triển khai các điểm cuối GraphQL vào các API công cộng của họ và ngày càng nhiều nhà phát triển trở nên quan tâm đến việc học loại công nghệ này, GraphQL sẵn sàng trở nên cần thiết cho nhà phát triển cơ sở để học như các yêu cầu của REST API đã được triển khai trong thập kỷ qua.

Issac Lee

Tác giả: Đặng Thanh Hiền

Lộ trình để trở thành Frontend Developer cho người mới 2024

Tác giả: Kamran Ahmed

Tại sao tôi lại làm ra cái roadmap này ư? Tôi đã là một Fullstack Developer được 5 năm và hiện là kĩ sư lead cho tajawal. Nó không chỉ là sở thích mà cũng là một phần trọng trách của tôi phải nắm bắt các xu hướng và hướng dẫn các dev thật khác vững vàng. Tôi có thể thấy rất nhiều bạn mới vào nghề bối rối về việc bắt kịp tiến độ. Cũng rất nhiều bạn đã email hỏi xin lời khuyên về việc họ nên học cái gì từ năm 2017 đến nay. Vì thế cũng để tôi không bị “trùm bao bố” và giúp các bạn thì tôi đã quyết định làm các chart này 1 lần và mãi mãi.

Thật ra ban đầu chúng chỉ là một số đề xuất nhỏ về tool nhưng sau đó tôi muốn nó theo cấu trúc một tí, thêm một số chi tiết và thiết kế lại theo bước để bạn dễ hiểu hơn mà chọn và sắp xếp.  

Tôi còn làm cho Backend nữa, các bạn có thể xem thêm tại đây.

Trước khi đi giải thích từng điểm, tôi phải nói vài dòng trước:

Mục đích của roadmap này là giúp bạn hình dung được bức tranh tổng quát và sẽ dẫn lối cho bạn nếu như đang không biết phải học gì tiếp theo, chứ không ủng hộ bạn chạy theo trào lưu đang hot làm gì. Bạn cần phải hiểu rõ tại có 1 tool này lại thích hợp trong một số trường hợp nhất định, và việc trở thành trào lưu không đồng nghĩa là nó sẽ phù hợp cho công việc.

Bắt đầu thôi – từ ảnh dưới đây, và tôi sẽ giải thích từng cái cho bạn.

Xem tuyển dụng frontend developer đãi ngộ tốt trên TopDev

Học một số cái căn bản của HTML

HTML đem đến cho page một cấu trúc rõ rệt. Nó giống như bộ xương sống giúp bạn đứng thẳng vậy. Cái đầu tiên cần biết đó là syntax và tất cả những thứ liên quan trong đó. Bạn nên tập trung vào học những thứ sau:

  • Học những cái cơ bản và học viết semantic HTML
  • Hiểu cách chia page thành các section và cách sắp xesp DOM hợp lý

Task —  Sau khi đã nắm những điều cơ bản về HTML, hãy tạo ít nhất 5 page HTML. Tôi khuyên bạn chọn bất kì website nào ví dụ, một profile page github bất kì hoặc login page của twitter. Sau đó tập trung vào nội dung. Có thể nó hơi xấu ban đầu nhưng đưunfg lo lắng quá và cứ tập trung vào structure chính.

Học CSS

Sau khi đã tạo được phần xương sườn của page, chúng ta sẽ cho nó một vài lớp áo và tô điểm cho nó đẹp một chút. Dùng CSS — Cascading stylesheets để làm đẹp cho các page HTML.

  • Đầu tiên phải biết về syntax và phải quen với các CSS property.
  • Học về box model và học cách chuẩn bị các layout bằng Grid và Flexbox
  • Sau khi đã xong, học cách làm responsive web bằng các media query.

Task –– Một khi đã xong phần cơ bản, tiếp theo bạn cần phải chọn style cho các trang HTML bạn làm ở bước cuối. Ví dụ, nếu bạn viết trang HTML cho Github profile, bạn nên áp dụng CSS và làm cho nó trông giống như một Github profile page. Cứ làm thế với cả 5 page đã viết trước đó.

Học cái căn bản của JavaScript

JavaScript sẽ giúp bạn làm cho các trang HTML tương tác hơn. Ví dụ, với mọi slider, popup và noti bạn thấy trên website và khi nó reload một phần nhỏ của trang mà không phải reload nguyên trang, đó là do nó đã được xử lý bởi JavaScript. Trong bước này, bạn sẽ phải học JavaScript căn bản để chuẩn bị thật tốt

  • Học syntax và các cấu trúc căn bản.
  • Học cách thông thạo DOM bằng JavaScript ví dụ cách remove một số element khỏi page, cách add thêm element, add hoặc remove các class, apply các style của CSS,… bằng JavaScript.
  • Sau đó, hãy học thêm và hiểu các topic như scopes, closures, hoisting và event bubbling, v.v.
  • Học cách tạo các HTTP call bằng XHR hoặc Ajax. Ajax sẽ giúp bạn thao tác mà không phải reload page.
  • Tiếp đến hãy học về feature mới ES6+. ES6 là một phiên bản JavaScript gồm nhiều update mới như classes, nhiều cách để declare các variable, add thêm các method mới vào array, string concatenation v.v. Hầu hết các bài viết bạn đọc online họ sẽ dùng Babel để giải thích về ES6 – một transpiler mà convert JavaScript bản mới thành bản cũ vì nó không được các browser cũ support. Nhưng khoan hẵn lo về Babel, chỉ cần hiểu trước ý tưởng và dùng nó cho cac browser mới hơn có support ES6. CHúng ta sẽ quay lại ES6 sau.

Bây giờ mọi thứ đã bắt đầu thật hơn, nếu đã đến được đây thì chúc mừng bạn nhé. Đây đều là những thứ quan trọng nhất bạn cần phải hiểu để làm tiếp

Có nên học jQuery không?

Có một thời mà ai cũng phát cuồng về jQuery, và thực sự thì nó là một library rất quyền lực cung cấp vỏ bọc cho JavaScript và để bạn thao tác mọi thứ trên browser một cách thuận tiện nhất. Nhưng ngày đó đã qua đi, bây giờ người ta đã không còn dùng nó quá nhiều trong các project mới nữa nhưng đương nhiên vẫn còn người dùng nó. Không nhất thiết phải học nhưng nó khá dễ và cũng có ích nếu bạn có tìm hiểu.

Thực hành

Đừng học nếu không thực hành, chứ không thực hành thì tôi không hiểu bạn nhớ được cái gì nữa. Lúc mới học xong thì có thể bạn sẽ nhớ và hiểu sâu hiểu xa, nhưng đó chỉ là nhất thời và sẽ bay đi đâu mất ngay. Hãy thực hành càng nhiều càng tốt trong suốt quá trình này.

Hãy tiếp tục là một số các responsive web và add thêm tính tương tác bằng JavaScript. Bạn cũng có thể copy một webpage bất kì mà bạn thấy hay ho nhưng hãy nhớ sử dụng hết những thứ mình đã học đến thời điểm hiện tại.

Sau khi đã tạo được vài website thì bây giờ sẽ bắt đầu công việc thực sự. Vào github.com và search thêm project và mở một số pull request trên các project nguồn mở. Một số gợi ý cho pull request như sau:

  • Đầu tư thêm vào UI, tạo thêm các trang demo hoặc cải thiện phần design
  • Xem các vấn đề mở mà bạn có thể giải quyết
  • Refactor code bất kì mà bạn nghĩ là cần cải thiện

Xem thêm this repository này, nói rằng bạn đang học và xin feedback cho phần PR cũng như bạn có thể cải thiện phần nào.

Ở phần này bạn cũng cần có một số kiến thức về git. Bạn có thể không làm nhưng nếu có thì tôi cam đoan là bạn sẽ không hối hận, bạn sẽ bị sốc khi thấy có bao nhiêu người sẵn lòng giúp đỡ.  Bạn có thể tìm thấy rất nhiều resources git miễn phí, ví dụ như cái này.

Tự tạo động lực cho bản thân

Nếu học mọi thứ đàng hoàng, bạn hoàn toàn có thể tìm một số job freelance hoặc thậm chí cả fulltime. Tuy nhiên, đừng dừng lại ở đó, chặng đường vẫn còn dài nếu như bạn muốn một công việc thật ổn định và mỹ mãn.

Package Managers

Để chuẩn bị cho bước này, nếu trước đây bạn dùng các thư viện ngoài ví dụ một plugin hoặc một widget ngoài bất kì, bạn phải down các file JavaScript và CSS thủ công và để vào trong project. Các thư viện hoặc plugin nếu ra version mới cũng phải update ngay và chèn vào project, một khâu hết sức phức tạp. Thì package manager sẽ giúp bạn dỡ bớt sự phức tạp này khỏi workflow. Nó sẽ tự mang các library và plugin ngoài vào project của mình, và bạn sẽ không phải lo về việc copy các library thủ công nữa hay phải update phiên bản mới. Có sẵn yarnnpm. Cả hai khá giống nhau, nên bạn có thể chọn cái nào cũng được, học một cái thì cũng sẽ biết dùng cái còn lại.

Sử dụng hết những cái đã học

Sau khi đã hiểu căn bản về package manager thì bạn có thể install một số library ngoài trên webpage ví dụ như cài đặt một số toast plugin và khi user click vào một nút, sẽ hiển thị một tin nhắn popup hoặc tạo một login form và tiến hành xác thực bằng các thư viện cho xác thực hoặc thao tác với nhiều option và xem xem cách cài đặt các version khác của nó.

CSS Preprocessors

Preprocessors đã trau dồi thêm cho CSS với rất nhiều tính năng mà không có mặc định. Có rất nhiều option như Sass, Less, Stylus v.v. Nếu tôi phải chọn một, thì Sass là câu trả lời. Tuy nhiên, PostCSS gần đây thu hút khá nhiều sự chú ý, nó như một dạng “Babel” của CSS. Bạn có thể chỉ dùng nó hoặc cùng Sass. Tôi khuyên bạn nên học Sass trước và tìm đến PostCSS sau nếu có thời gian.

Các framework CSS

Bạn không cần phải học framework nữa, tuy nhiên nếu vẫn muốn thì có rất nhiều lựa chọn cho bạn. Qua những cái đã thử tôi thích nhất là Bootstrap, Materialize và Bulma. Nhưng nếu nhìn vào thị trường hiện tại, tôi sẽ chọn Bootstrap để bắt đầu.

Sắp xếp CSS

Khi app càng ngày càng lớn, thì CSS cũng trở nên bừa bộn hơn và khó quản lý. Có rất nhiều cách để kiến thiết lại CSS, ví dụ, OOCSS, SMACSS, SUITCSS, Atomic và BEM. Bạn nên tìm hiểu sự khác nhau giữa chúng, nhưng cá nhân tôi thích BEM hơn.

Build tools

Các tool giúp bạn build/bundle và làm app JavaScript. Loại này bao gồm các linter, task runner và các bundler.

Đối với các task runner, trước đây có rất nhiều lựa chọn như npm scripts, gulp, grunt v.v. Nhưng hiện tại thì webpack đã giúp bạn xử lý gần như mọi thứ mà bạn làm với gulp, Chỉ cần duy nhất một npm script trong task runner dùng để tự động hoá các task mà  webpack có thể làm. Không nhất thiết phải học Gulp, tuy nhiên sau này nếu bạn có thời gian, cứ tìm hiểu thêm và xem xem liệu nó có giúp được gì cho app của bạn không.

Về các linter, cũng đã từng có rất nhiều option như ESLint, JSLint, JSHint và JSCS. Nhưng hiện tại ESLint làm gần như mọi thứ.

Đối với module bundler, ngày xưa thì có Parcel, Webpack, Rollup, Browserify v.v. Bây giờ nếu phải chọn thì hãy chọn Webpack. Rollup cũng khá phổ biến nhưng nó nên dùng cho các thư viện; còn khi nhắc đến app, đã có webpack. Thế nên hãy tự học webpack và thăm lại section này bằng Rollup nếu muốn.

(tiếp tục) Thực hành — Tạo ra cái mới

Chúc mừng bạn! Giờ đây bạn đã ở mức 75% của một JavaScript developer rồi. Bây giờ hãy cùng tạo ra cái mới với tất cả những gì đã học đến giờ. Bạn có thể tạo một dạng library có dùng Sass và JavaScript. Rồi dùng Webpack để convert Sass thành CSS và dùng babel trong đó để transpile ES6 code. Khi đã xong thì bạn có thể, release nó lên Github và npm.

Chọn một Framework

Trong roadmap cũ thì section này thường ngay sau phần kiến thức căn bản nhưng tôi đã dời nó lại sau Sass, buils tool và các package managers vì bạn sẽ dùng hết chúng trong framework và nếu không học trước thì vô dụng cả thôi.

Lựa chọn thì vô vàn. Dạo này thì có React, VueAngular là phổ biến nhất. Nhu cầu về React.js thì càng ngày càng nhiều. Bạn có thể chọn bất kì cái nào bạn muốn, cá nhân tôi thiên về React hoặc Angular. Có một lưu ý nhỏ ở đây, nếu là newbie, có thể bạn sẽ thấy Angular tương đối đơn giản, căn bản là vì nó support gần như mọi thứ ví dụ powerful router có support tình trạng lazy loading, HTTP client có support các interceptor, dependency injection, component CSS encapsulation v.v mà không phải lo về các thư viện ngoài. Tuy nhiên React chắc chắn cao tay hơn trong việc tìm kiếm cộng đồng quanh nó và đội ngũ tại Facebook đang làm việc để cải thiện nó. Hãy đảm bảo rằng bạn không chọn nó vì độ hot, mà chọn cái nào phù hợp nhất với mình.

Đường học trong graph dưới đây đã mặc định là bạn đã biết về TypeScript và Rx.JS. Có một số tiêu chuẩn và feature mà angular cho nhiều hơn thông thường, nhưng nó không đồng nghĩa rằng React không tốt, cái nào cũng có ưu thế riêng của nó cả.

Sau khi đã chọn được framework phù hợp, vẫn còn một số thứ bạn cần phải học. Ví dụ, nếu bạn chọn React; bạn cần học thêm Redux hoặc Mobx để quản lý state, phụ thuộc vào size của app mà bạn đang làm. Mobx thì thích họp cho app cỡ vừa và nhỏ, còn các app lớn nặng đô thì nên dùng Redux.

Nếu bạn chọn chọn Angular thì bạn cần thực hiện TypeScript (thực ra bạn không cần đến nó khi là app Angular nhưng có nó thì tốt hơn) và Rx.js cũng sẽ giúp ích cho app của bạn nhiều. Đây là một thư viện khá mạnh và phù hợp với functional programming.

Và nếu bạn chọn Vue.js, bạn sẽ cần học Vuex tương tự như Redux dùng riêng cho Vue.

Lưu ý một điều là Redux, Mobx và Rx.js không ràng buộc với các framework này, bạn hoàn toàn có thể dùng nó cho app JavaScript nữa. Đồng thời, nếu bạn chọn Angular, nhớ là dùng Angular 2+ chứ không phải Angular 1+

Thực hành-time

Giờ đây bạn đã biết *mọi thứ* cần để build được một app JavaScript. Hãy tạo thêm app từ framework bạn đã chọn. Bạn có thể lấy ý tưởng từ ideas directory trên repository rồi bắt đầu ngay.

Khi đã xong, nhớ đọc thêm về đo lường và keep track để cải thiện hiệu suất. Bạn có thể xem Interactivity Time, Page Speed Index, và Lighthouse Score v.v

Progressive WebApps

Khi đã done bạn có thể tìm hiểu về các service worker cũng như cách tạo nên progress web app.

Testing

Tuỳ vào mục đích mà có rất nhiều tool để bạn chọn. Tôi thuường dùng tổ hợp Jest, Mocha, Karma và Enzyme. Tuy nhiên, phải tìm hiểu và biết điểm khác nhau giữa chúng là gì để chọn được cái thích hợp nhất.

Static Type Checker

Static type checker giúp bạn add thêm type checking vào JavaScript. Bạn không cần đến chúng nhưng chúng thật sự rất hữu ích và chỉ cần vài tiếng tập trung là bạn có thể hiểu nó. CHủ yếu nó là TypeScript Flow. Tôi rất thích TypeScript và sẽ chọn nó trước, nhưng bạn có thể check hết cả 2 để xem thử.

Server Side Render

Đừng chỉ dừng ở Checker vì đây là một phần cần thiết trong lộ trình làm Frontend của bạn.

Hãy tìm hiểu thêm về server side rendering trên framework bạn đã chọn. Ví dụ, nếu bạn chọn React, thì có Next.jsAfter.js rất phổ biến. Đối với angular thì có Universal. Và với Vue.js đã có Nuxt.js.

Chắc chắn vẫn còn một số điểm chưa được nhắc đến trên roadmap nhưng căn bản đây là những gì bạn cần để trở thành một “Frontend Engineer”. Và đừng quên, điểm quan trọng nhất đó là, thực hành nhiều nhất có thể. Ban đầu sẽ còn bỡ ngỡi và nhiều vấn đề, nhưng theo thời gian và luyện tậo bạn sẽ quen dần và lên tay rất nhanh thôi.

Bài viết nguồn tham khảo được đăng tải tại Medium

Tìm việc làm ngành IT mới nhất TopDev

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

“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ó” – Do đó, Đâ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 chờ đã!, 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.

Tuyển android lương cao hoặc tìm việc làm ios hấp dẫn

Đ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:

Build Android chat application using Android Studio

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:

Create iOS messaging application

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:

Build android chat application

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.   

Tác giả: Dương Đình Tuấn

Hướng dẫn sử dụng filebeat để đọc và quản lý logs hệ thống nginx trên ubuntu

Hướng dẫn sử dụng filebeat để đọc và quản lý logs hệ thống nginx trên ubuntu

Cài đặt elasticsearch, kibana, filebeat (Phiên bản 6.4 bản mới nhất)

Vì tìm hiểu đến filebeat thì chắc hẳn mọi người đã cài đặt rồi nên mình sẽ không hướng dẫn cài đặt nữa. Còn với những bạn chưa cài đặt thì có thể dễ dàng cái đặt theo hướng dẫn trên trang chủ elastic theo đường dẫn dưới đây:

https://www.elastic.co/downloads

– elasticsearch trong phần hướng dẫn này để indeces dữ liệu mà filebeat đọc được từ hệ thống logs của nginx

– kibana để quản lý và xem tổng quan logs của nginx.

Cài đặt plugins elasticsearch geoip và user agent

Module nginx của filebeat yêu cầu phải cài đặt plugin elasticsearch geoip và plugin elasticsearch user agent, có thể dễ dàng cài đặt thông qua command line:

sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-user-agent

sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-geoip

Cấu hình filebeat

Để cấu hình filebeat trên ubuntu, chúng ta cần tìm đến file cấu hình theo đường dẫn /etc/filebeat/filebeat.yml, mở file này (sudo vim /etc/filebeat/filebeat.yml) và chỉ cần để ý các dòng sau :

filebeat.inputs:

– type: log

enabled: false

paths:

– /var/log/*.log

Giải thích:

Trong hướng dẫn này chúng ta chỉ cần để ý đến hai tham số “enabled” và “paths”

– enabled: theo mặc định là false, điều này có nghĩa là filebeat sẽ không indeces dữ liệu đọc được từ logs đến elasticsearch và khi truy cập vào kibana để xem và quản lý logs chúng ta sẽ nhận được thông báo lỗi như sau:

Đổi tham số này thành true để xem logs trên kibana.

– paths: Đường dẫn đến file log, chúng ta nên để mặc định để đọc được tất cả các file logs (sử dụng cho modules redis,mysql,…)

Enabled và cấu hình modules nginx

sudo filebeat modules enable nginx

Chúng ta sẽ mở file cấu hình của modules nginx theo đường dẫn /etc/filebeat/modules.d/nginx.yml, nội dung trong file như sau:

Hướng dẫn sử dụng filebeat để đọc và quản lý logs hệ thống nginx trên ubuntu

# Access logs chỉ quan tâm đến dòng #var.paths

var.paths:   [“/var/log/nginx/access.log*”]

# Error logs tương tự như ở access logs

var.paths:   [“/var/log/nginx/error.log*”]

Cài đặt kibana dashboards

sudo filebeat setup

Khởi động elasticsearch, kibana, filebeat.

Chúng ta cần khởi động lại các service này sau khi cấu hình.

sudo service elasticsearch restart

sudo service kibana restart

sudo service filebeat restart

Đến đây thì chúng ta có thể truy cập vào kibana dashboard để xem logs của hệ thống nginx

Hướng dẫn sử dụng filebeat để đọc và quản lý logs hệ thống nginx trên ubuntu

Nếu nhìn thấy dữ liệu trong kibana dashboard thì các cài đặt cơ bản của filebeat để sử dụng modules nginx đã thành công.

Chúng ta có thể tìm hiểu thêm và filebeat và các modules khác của filebeat tại địa chỉ dưới đây của elastic:

https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-overview.html

Tác giả: Trần Thanh Dân

Xem thêm các vị trí tuyển dụng it manager tại Topdev

IOS Hướng dẫn Lottie cho người mới bắt đầu: Tạo hoạt ảnh tuyệt vời trong ứng dụng iOS

Hoạt ảnh giao diện người dùng tốt có thể cải thiện đáng kể trải nghiệm người dùng của ứng dụng dành cho thiết bị di động nếu nó được thực hiện đúng. Nó thường là một trong những yếu tố phân biệt một ứng dụng tốt và chưa tốt . Thiết kế một hình ảnh động có ý nghĩa và hơi rất khó. Đặc biệt, để chuyển đổi hoạt ảnh hoặc chế độ xem thì hơi phức tạp, và khó khăn cho các nhà phát triển iOS thêm nó vào ứng dụng.

Tuyển dụng ios không yêu cầu cao, đi làm ngay

Giả sử bạn không phải là nhà phát triển độc lập, có thể bạn đang làm việc trong một nhóm các nhà phát triển và nhà thiết kế UI / UX. Đã bao nhiêu lần bạn gặp tình huống này? Nhà thiết kế của bạn cho bạn thấy một hoạt hình đẹp và thú vị và yêu cầu bạn kết hợp nó trong ứng dụng. Bạn nghĩ rằng hình ảnh động trông rất tuyệt, nhưng nó hoàn toàn khó và một quá trình dài để thực hiện nó.

Bây giờ với Lottie, được tạo ra bởi Airbnb, các nhà phát triển có thể dễ dàng render hình động mà không cần phải viết dòng và dòng mã. Bạn có thể chụp ảnh động từ Adobe After Effects và sử dụng chúng trực tiếp trong dự án Xcode của bạn. Nó thực sự tuyệt vời và giúp bạn tiết kiệm rất nhiều thời gian từ việc triển khai hoạt ảnh.

Trong hướng dẫn này, tôi sẽ chỉ cho bạn một vài điều:

  • Lottie là gì?
  • Bạn có thể tải các tập tin hoạt hình Lottie ở đâu?
  • Làm thế nào để bạn sử dụng nó trong các dự án iOS của bạn?

Lottie là gì?

Trước tiên, Lottie là gì? Được phát triển bởi Airbnb, Lottie là thư viện iOS, macOS, Android và React Native, kết xuất hoạt ảnh After Effects trong bất kỳ ứng dụng gốc nào. Ảnh động được xuất dưới dạng tệp JSON thông qua phần mở rộng After Effects nguồn mở được gọi là Bodymovin . Lottie tải dữ liệu hoạt ảnh ở định dạng JSON và hiển thị hoạt ảnh theo thời gian thực.

Nói cách khác, bạn có thể thả các tệp JSON, do nhà thiết kế của bạn truyền, ngay vào dự án Xcode của bạn và để Lottie tải hoạt ảnh cho bạn. Đừng hiểu lầm tôi. Bạn vẫn cần phải viết một số mã để tạo ra các hình ảnh động, nhưng như bạn sẽ thấy sau này, Lottie tiết kiệm cho bạn một số lượng lớn thời gian từ mã hóa các hình ảnh động.

Lottie bây giờ là mã nguồn mở và có sẵn trên GitHub. Nó cũng đi kèm với một dự án mẫu và một tập hợp các hình động mẫu. Hãy xem bên dưới để biết một số hình động mẫu mà bạn có thể tạo trong ứng dụng iOS với Lottie.

 

 

 

 

 

 

Tập tin hoạt hình Lottie

Trước khi sử dụng Lottie, điều đầu tiên bạn cần là dữ liệu hoạt ảnh được xuất dưới dạng tệp JSON. Nếu bạn đã có hoạt ảnh After Effects, hãy sử dụng phần mở rộng có tên Bodymovin để tạo tệp JSON.

Nếu bạn không sử dụng After Effects thì sao? Làm thế nào bạn có thể chuẩn bị các hình ảnh động?

Bạn có thể thuê một nhà thiết kế để tạo hoạt ảnh cho bạn hoặc bạn học cách sử dụng After Effects.

May mắn thay, có một tùy chọn khác: Lottie Files

Lottie Files là một trang web có bộ sưu tập các hình động chất lượng cao có sẵn ở định dạng tệp của Lottie. Nó cũng cho phép các nhà thiết kế chia sẻ và giới thiệu hoạt ảnh của họ. Tất cả các tệp hoạt ảnh đều miễn phí để tải xuống. Giống như tôi, nếu bạn không có bất kỳ kinh nghiệm với After Effects, bạn chắc chắn sẽ tìm thấy thư viện tuyệt vời.

Sử dụng Lottie trong Xcode

Giả sử bạn có một tệp hoạt ảnh, điều tiếp theo là chuẩn bị dự án Xcode của bạn. Tương tự như các thư viện iOS khác, cách dễ nhất để kết hợp Lottie trong dự án Xcode của bạn là sử dụng CocoaPods.

Hãy xây dựng một bản demo nhanh để xem cách bạn làm việc với Lottie.

Đầu tiên, hãy kích hoạt Xcode và tạo một dự án mới bằng cách sử dụng mẫu Single View Application. Đặt tên cho dự án LottieDemo (hoặc bất kỳ tên nào bạn thích) và lưu nó.

Cài đặt thư viện Lottie bằng CocoaPods

Khi bạn tạo dự án, hãy thoát Xcode và sau đó mở Terminal. Chúng ta sẽ tạo một Podfile để cài đặt thư viện Lottie. Tôi giả sử bạn có một số kinh nghiệm với CocoaPods, và có nó được cài đặt trên máy Mac của bạn.

Trong terminal, hãy chạy lệnh sau để tạo một Podfile :

pod init

Sau đó mở và chỉnh sửa Podfile như sau:

target 'LottieDemo' do

  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks

  use_frameworks!

  # Pods for LottieDemo

  pod 'lottie-ios'

end

Chúng tôi chỉ cần thêm một dòng pod 'lottie-ios'để cho biết nhóm chúng tôi cần cho dự án này. Bây giờ quay trở lại Terminal và chạy lệnh dưới đây:

pod install

CocoaPods sau đó sẽ tải xuống thư viện Lottie và gói nó trong dự án Xcode của bạn. Khi quá trình hoàn tất, bạn sẽ tìm thấy một tệp dự án mới có tên LottieDemo.xcworkspace. Mở tệp này bằng Xcode và bắt đầu viết mã.

Thêm tệp JSON hoạt hình

Nó sẽ là tuyệt vời nếu bạn có tập tin hoạt hình của riêng bạn để thử nghiệm Lottie. Nhưng nếu bạn không có, hãy tải xuống hoạt ảnh miễn phí này dưới dạng tệp JSON từ lottiefiles.com. Chúng tôi sẽ sử dụng nó cho bản demo nhanh.

Bây giờ hãy kéo tệp JSON ( servishero_loading.json) vào trình điều hướng dự án của dự án Xcode của bạn. Đặt nó vào LottieDemonhóm.

Tạo LOTAnimationView

Nó bây giờ đến phần thú vị. Trong ít hơn 10 dòng mã, bạn sẽ có thể triển khai hoạt ảnh mẫu.

Mở ViewController.swiftvà thêm một dòng mã để nhập Lottiethư viện:

import Lottie

Tiếp theo, cập nhật viewDidLoad()phương thức như sau:

override func viewDidLoad() {

    super.viewDidLoad()

    if let animationView = LOTAnimationView(name: "servishero_loading") {

        animationView.frame = CGRect(x: 0, y: 0, width: 400, height: 400)

        animationView.center = self.view.center

        animationView.contentMode = .scaleAspectFil 

        view.addSubview(animationView)

        animationView.play()

    }


}

Đó là đoạn mã bạn cần để hiển thị hoạt ảnh. Lottie có một lớp có tên LOTAnimationViewtải dữ liệu hoạt hình từ tệp JSON. Để hiển thị hình ảnh động, bạn phải tạo một LOTAnimationViewđối tượng có tệp JSON mà bạn đã tải xuống trước đó.

LOTAnimationViewlà một lớp con UIView, vì vậy bạn chỉ cần triển khai nó giống như bất kỳ chế độ xem nào khác. Chúng tôi xác định kích thước khung hình, căn giữa nó và đặt chế độ nội dung của nó thành Aspect Fill . Sau đó, chúng tôi gọi addSubviewđể thêm chế độ xem hoạt ảnh vào chế độ xem chính. Cuối cùng, chúng tôi gọi play()phương thức của chế độ xem hoạt ảnh để bắt đầu hoạt ảnh.

Bây giờ hãy chạy dự án và xem giao diện của ứng dụng. Ngay sau khi ứng dụng khởi chạy, nó sẽ hiển thị hoạt ảnh theo thời gian thực.

Lặp lại hoạt ảnh

Theo mặc định, hoạt ảnh chỉ phát một lần. Nếu bạn muốn lặp lại hoạt ảnh, bạn có thể đặt thuộc loopAnimationtính truenhư sau:

animationView.loopAnimation = true

Các LOTAnimationViewlớp học này cũng cung cấp một số tài sản để tùy chỉnh các hình ảnh động. Giả sử, nếu bạn muốn làm chậm hoạt ảnh, bạn có thể chỉ cần thay đổi thuộc animationSpeedtính như sau:

animationView.animationSpeed = 0.5

Tải tệp JSON hoạt hình từ máy chủ từ xa

Không chỉ bạn có thể lưu trữ tệp JSON cục bộ, bạn có thể đặt dữ liệu hoạt ảnh của mình trên máy chủ từ xa. Lottie đã đi kèm với API cho các nhà phát triển để tải tệp JSON từ một URL từ xa. Hãy thử thay thế việc khởi tạo animationViewbằng mã bên dưới và xem bạn sẽ nhận được hoạt ảnh nào.

let animationView = LOTAnimationView(contentsOf: URL(string: "https://github.com/airbnb/lottie-ios/raw/master/Example/Assets/PinJump.json")!)

Áp dụng Chuyển đổi cho Chế độ xem Hoạt ảnh

Giống như UIViewLOTAnimationViewhỗ trợ các loại biến đổi khác nhau. Bạn có thể xoay, thay đổi kích thước và định vị lại hoạt ảnh bằng cách đặt biến đổi thích hợp cho thuộc transformtính. Dưới đây là biến đổi mẫu, xoay hình ảnh động 45 độ theo chiều kim đồng hồ:

lete  rotateTransform = CGAffineTransform(rotationAngle: 45.0)

animationView.transform = rotateTransform

Tương tự, bạn có thể áp dụng hoạt ảnh UIView trên hoạt ảnh giống như UIViewđối tượng chuẩn khác . Hãy tạo một hình động thay đổi kích thước trên đầu trang của hình ảnh động hiện tại. Thay thế viewDidLoad()phương thức bằng đoạn mã này:

override func viewDidLoad() {


    super.viewDidLoad()


    if let animationView = LOTAnimationView(name: "servishero_loading") {

        animationView.frame = CGRect(x: 0, y: 0, width: 400, height: 400)

        animationView.center = self.view.center

        animationView.loopAnimation = true

        animationView.contentMode = .scaleAspectFill

        animationView.animationSpeed = 0.5



        // Applying UIView animation

        let minimizeTransform = CGAffineTransform(scaleX: 0.1, y: 0.1)

        animationView.transform = minimizeTransform

        UIView.animate(withDuration: 3.0, delay: 0.0, options: [.repeat, .autoreverse], animations: {

            animationView.transform = CGAffineTransform.identity

        }, completion: nil)

        view.addSubview(animationView)

        animationView.play()

    }

}

Chạy ứng dụng và bạn sẽ nhận được một cái gì đó như thế này. Thú vị đúng không?

Tiếp theo là gì?

Hoạt ảnh giao diện người dùng tuyệt vời có thể đưa ứng dụng iOS của bạn lên cấp độ tiếp theo và cung cấp cho người dùng trải nghiệm hấp dẫn. Trước khi giới thiệu Lottie, nó thực sự khó khăn và tốn thời gian để chuyển đổi một hình ảnh động được xây dựng với After Effects để thực hiện thực tế. Bây giờ thư viện hoạt hình mạnh mẽ này chỉ làm cho việc triển khai dễ dàng.

Trong hướng dẫn này, bạn nên học cách sử dụng Lottie cho các dự án iOS. Ở đây tôi chỉ trình bày những điều cơ bản về Lotties. Bạn có thể xem thêm tài liệu của Lottie trên GitHub . Hơn nữa, chúng ta sẽ xem xét điều gì đó tiên tiến hơn trong hướng dẫn tiếp theo bằng cách xây dựng một hình ảnh động tích hợp tuyệt vời.

Hãy theo dõi. Nếu bạn yêu thích hướng dẫn này, xin vui lòng để lại cho tôi một bình luận và chia sẻ nó với bạn bè của bạn.

Để tham khảo, bạn có thể tải xuống dự án Xcode mẫu trên GitHub.

Tác giả: Lê Minh Nhựt

Tham khảo thêm các vị trí việc làm ios tại Topdev.vn

Hướng dẫn tạo quyền truy cập quản lý website mà không phải chia sẻ thông tin đăng nhập tại Hostinger

Hướng dẫn tạo quyền truy cập quản lý website mà không phải chia sẻ thông tin đăng nhập tại Hostinger

Nếu bạn là chủ nhiều dự án website hoặc chủ nhiều tên miền, sẽ có lúc bạn cần chuyển quyền quản lý tới cho cấp dưới, đồng nghiệp, lập trình viên, đối tác hoặc khách hàng của bạn phải không? Bài hướng dẫn này sẽ giúp bạn thực hiện việc này thông qua tính năng Quản Lý Truy Cập cho các dịch vụ như là hosting hoặc tên miền mua tại Hostinger Việt Nam, mà không phải chia sẻ thông tin nhạy cảm như là tên đăng nhập và mật khẩu. Bạn sẽ giữ lại quyền sở hữu dịch vụ, và chỉ cần chuyển quyền quản lý là được.

Hướng dẫn chuyển quyền quản lý dịch vụ hosting hoặc tên miền

Bạn có thể dễ dàng trao quyền cho một người khác để họ có thể truy cập vào tài khoản của bạn (chẳng hạn như nhà phát triển) bằng các bước sau:

Đăng nhập vào khu vực thành viên chọn Quản lý truy cập

Sau khi bạn bạn mua thành công một trong các dịch vụ của Hostinger, bạn sẽ có thể truy cập vào khu vực quản lý thành viên. Tại đây, hãy click vào vào phần Quản lý truy cập khi di chuột vào avatar như hình bên dưới:

Hướng dẫn tạo quyền truy cập quản lý website mà không phải chia sẻ thông tin đăng nhập tại Hostinger

Ở trang Quản lý truy cập, bạn sẽ thấy 2 mục là Cấp Phép Truy Cập, và Yêu Cầu Truy Cập. Vì mục đích của bạn là chuyển quyền quản lý nên bạn chỉ cần chú ý phần Cấp Phép Truy Cập.

Thiết lập quản lý truy cập

Hướng dẫn tạo quyền truy cập quản lý website mà không phải chia sẻ thông tin đăng nhập tại Hostinger
Figure 1 Cấp phép truy cập Hostinger

Bước 1: Điền email được cấp quyền truy cập

Ở phần email, bạn hãy điền email bạn muốn mời truy cập vào quản lý tên miền hoặc hosting của bạn. Địa chỉ email này sẽ nhận được một lời mời và cần click vào link trong lời mời đó.

Lưu ý: nếu email người nhận đã có tài khoản của Hostinger, họ cần đăng nhập vào https://www.hostinger.vn/dang-nhap-cpanel trước rồi hãy click vào link trong lời mời để vào thẳng trang quản trị.

Nếu email người nhận chưa có tài khoản của Hostinger, việc click vào link trong lời mời sẽ tạo tài khoản cho người nhận, để họ có thể truy cập giao diện quản lý của Hostinger.

Bước 2: Chọn lớp truy cập

Tại phần lớp truy cập (mức độ), bạn sẽ có thể chọn 2 mức khác nhau để trao quyền.

Mức 1: Quản lý dịch vụ

Mức này người được mời chỉ có thể truy cập vào trang quản lý các dịch vụ hosting, tên miền, VPS được chỉ định. Họ có thể thực hiện thay đổi trên tài khoản như truy cập Trình quản lý File, thêm website, tạo subdomain, thêm parked domain, chỉnh sửa thông tin DNS cho tên miền, …

Mức 2: Quản lý các dịch vụ và có thể mua hàng dùng phương thức thanh toán được lưu trữ

Mức này sẽ trao thêm quyền thanh toán cho người được mời, và người này cũng có toàn quyền như mức 1. Nếu bạn có lưu sẵn phương thức thanh toán trong tài khoản để tiện thanh toán thì người được mời này sẽ có thể tự động gia hạn dịch vụ cho bạn, mua thêm dịch vụ mới, vâng vâng.

Bước 3: Chọn dịch vụ

Ở phần chọn dịch vụ, tùy vào bạn đang có dịch vụ nào tại Hostinger thì bạn có thể chọn loại dịch vụ đó. Có thể là tên miền hoặc là dịch vụ hosting.

Sau khi hoàn tất thiết lập, hãy nhấn đồng ý quy định sử dụng tính năng và nhấn vào nút Cấp Phép Truy Cập

Bước 4: Yêu cầu người được mời click vào link xác nhận

Nếu bạn thấy khóa màu vàng hiện lên như hình sau:

Hướng dẫn tạo quyền truy cập quản lý website mà không phải chia sẻ thông tin đăng nhập tại Hostinger

Tức là bạn đã trao quyền thành công.

Người được mời quản lý dịch vụ của bạn sẽ không thực hiện được:

  1. Thêm phương thức thanh toán mới
  2. Thực hiện trao quyền truy cập cho một người khác nữa.
  3. Xem hoặc đổi thông tin về tài khoản (ví như tên, email, số điện thoại, địa chỉ)
  4. Đối với tên miền, người được mời sẽ không thể chuyển tên miền, mở khóa tên miền, đổi thông tin whois, bán tên miền, vâng vâng

Việc này nhằm để đảm bảo an toàn cho tài khoản của bạn, tránh người quản lý thực hiện các thay đổi lớn làm ảnh hưởng đến tài khoản thành viên của bạn.

Lời kết

Vậy là xong, bạn đã thành công trong việc gán quyền truy cập cho một tài khoản email khác mà không phải tiết lộ thông tin đăng nhập của bạn. Cách làm này rất tốt cho các web developer muốn tạo nhiều website bán cho khách hàng mà không cho khách hàng truy cập vào các website khác trong cùng tài khoản. Hoặc phù hợp cho một chủ website chỉ muốn chuyển quyền quản lý cho lập trình viên hoặc đối tác mà vẫn giữ lại quyền sở hữu của website.

Xem thêm việc làm it manager lương cao cho bạn