• Home
  • Categories
  • search
avatar LamDN Full-stack developer.
Specializing in RoR, JavaScript.
linkedin Email linkedin LinkedIn github Github
search
AWS CDK

Overview And Key Techniques In CDK

AWS Cloud Development Kit (CDK) là một framework mạnh mẽ cho phép sử dụng ngôn ngữ lập trình thông dụng như TypeScript, Python, Go… để định nghĩa và triển khai hạ tầng trên AWS. CDK giúp chúng ta dễ dàng quản lý resources bằng cách chuyển đổi từ mã nguồn sang mô hình hạ tầng dưới dạng CloudFormation. Để tìm hiểu kỹ hơn về CDK bạn có thể đọc qua bài viết IaC With AWS CDK. Dưới đây là tổng hợp các khía cạnh quan trọng khác mà bạn cần nắm vững để sử dụng CDK một cách hiệu quả. Phases CDK hoạt động theo ba phase chính: synth time, deploy time, và runtime. Mỗi phase có vai trò khác nhau trong việc xây dựng và quản lý hạ tầng trên AWS. Synth Time Ở giai đoạn này, CDK tổng hợp (synthesize) mã nguồn của bạn thành một tập hợp các tệp JSON dưới dạng CloudFormation Template. Không có resource nào được tạo trong giai đoạn này, nó chỉ đơn thuần là việc tạo ra mô tả hạ tầng. Khi bạn chạy lệnh cdk synth, CDK sẽ tạo ra template CloudFormation mô tả toàn bộ hạ tầng của bạn. Deploy Time Đây là giai đoạn triển khai (deploy) thực sự. Các template CloudFormation được gửi lên AWS và triển khai resources theo mô tả trong template. Lệnh cdk deploy sẽ triển khai các thay đổi của bạn lên tài khoản AWS. Trong quá trình này, AWS sẽ tạo, cập nhật hoặc xóa resource. Runtime Đây là giai đoạn khi các resource của bạn đang hoạt động trên AWS sau khi đã được triển khai. Các dịch vụ như Lambda, EC2, S3 sẽ hoạt động theo logic đã định nghĩa và bạn có thể bắt đầu tương tác với chúng. Resources Mỗi resource trong AWS được định nghĩa thông qua Construct. Tập hợp nhiều constructs tạo nên một Stack. Ví dụ về construct: new s3.Bucket(this, 's3-bucket', { versioned: false, autoDeleteObjects: true, removalPolicy: cdk.RemovalPolicy.RETAIN, }); Ví dụ về stack: import * as cdk from 'aws-cdk-lib'; import * as s3 from 'aws-cdk-lib/aws-s3'; import * as iam from 'aws-cdk-lib/aws-iam'; import { Construct } from 'constructs'; interface S3Props extends cdk.StackProps { allowPolicies: Array<iam.Policy>; } export class S3Stack extends cdk.Stack { constructor(scope: Construct, id: string, props: S3Props) { super(scope, id, props); const bucket = new s3.Bucket(this, 's3-bucket', { versioned: false, autoDeleteObjects: true, removalPolicy: cdk.RemovalPolicy.RETAIN, }); props.allowPolicies.forEach((policy) => { bucket.grantReadWrite(policy); }); } } Bất cứ resource nào trong CDK sẽ luôn được xác định dựa vào scope và ID. Trong một scope không được phép xuất hiện 2 resources có cùng ID. Khi thay đổi scope hoặc ID của một resource, CDK sẽ xoá resource cũ và replace nó bằng một resource mới. Vì vậy với những resource như S3, RDS, Elasticache… việc thay đổi trên có thể làm mất dữ liệu. Do đó bạn cần quản lý chúng thông qua removalPolicy một cách cẩn thận. Stack References Trong một project CDK, bạn cần nhóm những resources có liên quan vào trong một stack, điều này giúp bạn quản lý resources tốt hơn. Lý tưởng nhất là khi các stacks hoạt động độc lập, sự thay đổi trong stack này không ảnh hưởng đến các stacks khác. Việc có quá nhiều resources trong một stack sẽ phát sinh vấn đề khi deploy. Nếu có bất kỳ lỗi nào xảy ra trong quá trình này thì toàn bộ stack sẽ bị rollback. Đôi khi điều này sẽ làm tốn khá nhiều thời gian của bạn. Nhưng nếu thiết kế một stack có ít resources hơn thì bạn sẽ cần tạo ra nhiều stacks hơn, các stacks cũng sẽ ràng buộc với nhau phức tạp hơn. Vì vậy việc thiết kế stack là rất quan trọng. Trong trường hợp không tránh khỏi việc ràng buộc giữa các stacks, bạn có thể sử dụng những cách dưới đây để truyền thông tin giữa chúng. Sử dụng Properties Đây là cách đơn giản nhất, bạn chỉ cần truyền properties từ stack này sang stack kia thông qua stack props: const vpcStack = new VpcStack(scope, 'vpc-stack', { env: props.env }); const webStack = new WebStack(scope, 'web-stack', { env: props.env, vpc: vpcStack.vpc, }); new S3Stack(scope, 's3-stack', { env: props.env, allowPolicies: [webStack.policy] }); Trong ví dụ trên web-stack nhận vào vpc được tạo từ vpc-stack. Policy được tạo ra trong web-stack sau đó được truyền vào s3-stack để thực hiện grant bucket cho policy này. cdk.CfnOutput và cdk.Fn.importValue Bạn có thể sử dụng cdk.CfnOutput để export thông tin trong một stack. Các stack khác có thể sử dụng cdk.Fn.importValue để import những thông tin cần thiết. Quay lại ví dụ trên, ở vpc-stack sẽ thực hiện export vpcId : import * as cdk from 'aws-cdk-lib'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; import { Construct } from 'constructs'; export class VpcStack extends cdk.Stack { constructor(scope: Construct, id: string, props: cdk.StackProps) { super(scope, id, props); const vpc = new ec2.Vpc(this, 'main-vpc'); new cdk.CfnOutput(this, 'mainVpcId', { value: vpc.vpcId, exportName: 'mainVpcId', }); } } web-stack sẽ import giá trị này vào để sử dụng: import * as cdk from 'aws-cdk-lib'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; import { Construct } from 'constructs'; export class WebStack extends cdk.Stack { constructor(scope: Construct, id: string, props: cdk.StackProps) { super(scope, id, props); const vpcId = cdk.Fn.importValue('mainVpcId'); const vpc = ec2.Vpc.fromVpcAttributes(this, 'vpc', { availabilityZones: ['ap-northeast-1a', 'ap-northeast-1c'], vpcId: vpcId, }); } } Với cách này, việc chia sẻ thông tin giữa các stack trở nên linh hoạt hơn, bạn không cần phải truyền trực tiếp thông tin từ stack này sang stack kia. Tuy nhiên nó không giải quyết được vấn đề ràng buộc giữa các stack. Nếu không quản lý tốt, bạn có thể gặp phải tình huống hai stacks bị phụ thuộc vào tham số export từ stack còn lại dẫn đến việc lock lẫn nhau. Bạn sẽ không thể thực hiện update hay delete một trong hai stack. Sử dụng SSM Parameter Store SSM Parameter Store được sử dụng để lưu trữ các tham số, như các thông tin cấu hình, secret key. Chúng có thể được truy xuất bằng API hoặc SDK từ các dịch vụ AWS hay các ứng dụng khác. Bạn cũng có thể dùng nó để chia sẻ thông tin giữa các stack nằm trong các dự án cdk khác nhau. Với SSM chúng ta sẽ viết lại vpc-stack như sau: import * as cdk from 'aws-cdk-lib'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; import * as ssm from 'aws-cdk-lib/aws-ssm'; import { Construct } from 'constructs'; export class VpcStack extends cdk.Stack { constructor(scope: Construct, id: string, props: cdk.StackProps) { super(scope, id, props); const vpc = new ec2.Vpc(this, 'main-vpc'); new ssm.StringParameter(this, 'main-vpc-id', { parameterName: '/main-vpc/id', stringValue: vpc.vpcId, }); } } Tương tự, web-stack sẽ lockup parameter main-vpc-id để sử dụng: import * as cdk from 'aws-cdk-lib'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; import * as ssm from 'aws-cdk-lib/aws-ssm'; import { Construct } from 'constructs'; export class WebStack extends cdk.Stack { constructor(scope: Construct, id: string, props: cdk.StackProps) { super(scope, id, props); const vpcId = ssm.StringParameter.valueFromLookup(this, '/main-vpc/id'); const vpc = ec2.Vpc.fromLookup(this, 'vpc', { vpcId }); } } Như vậy web-stack không còn phụ thuộc vào vpc-stack nữa, nó sẽ chỉ phụ thuộc vào parameter store. Cách làm này thích hợp khi có nhiều dự án cùng sử dụng chung một resource ví dụ như RDS, ALB… Lúc này bạn có thể lưu thông tin như ID, ARN của các resources này lên store, dự án khác muốn dùng chỉ cần lookup các thông tin cần thiết để import vào. Conclusion Sử dụng AWS CDK đòi hỏi sự hiểu biết về các phase hoạt động cũng như cách quản lý resource thông qua stack và chia sẻ thông tin giữa các stack với nhau. Bằng cách nắm vững các kỹ thuật này bạn sẽ có thể xây dựng và quản lý hạ tầng trên AWS một cách hiệu quả và tối ưu hơn.
Sep 15, 2024
Vue

SPA With Vue And Rails

Ứng dụng SPA đang ngày càng trở nên phổ biến bởi những ưu điểm mà nó mang lại. Có thể kể đến như tốc độ tải trang nhanh, trải nghiệm mượt mà, tách biệt logic frontend và backend, giúp chuyên môn hoá từng bộ phận trong dự án. Khó khăn khi phát triển ứng dụng SPA nằm ở việc kết nối giữa và đảm bảo tính đồng bộ giữa hai server frontend và backend. Đây là những vấn đề mà bạn không bao giờ gặp ở một ứng dụng SSR. Chưa kể việc tạo ra nhiều server có thể gây lãng phí vì thực tế chỉ có server backend chịu tải chính, server frontend sẽ chỉ lưu các tài nguyên như html, css, js… Có một hướng tiếp cận đơn giản hơn giúp bạn sử dụng SPA cho dự án của mình mà không phải lo lắng đến các vấn đề trên. Bài viết này sẽ giúp bạn thực hiện điều đó với Vue và Rails.
Aug 20, 2024
AWS CDK

IaC With AWS CDK

Các hệ thống được xây dựng trên Cloud ngày càng trở nên phức tạp. Thường xuyên thay đổi, mở rộng hệ thống để đáp ứng với những yêu cầu mới. Xây dựng, sửa đổi cấu trúc hệ thống bằng cách thao tác trên màn hình dần trở nên không hiệu quả với những hệ thống lớn. Có thể kể đến như việc không tái sử dụng được config dẫn đến việc không apply thay đổi đồng loạt nhiều môi trường. Không thể overview trước những thay đổi hay kiểm soát trạng thái của hệ thống. Infrastructure as Code sinh ra để giải quyết những vấn đề trên.
Apr 07, 2024
AWS

AWS Basic Structure

AWS là nhà cung cấp dịch vụ cloud phổ biến nhất hiện nay. Tất cả những gì bạn cần ở một ứng dụng web bạn đều có thể tìm thấy trên AWS. Thay vì phải xây dựng hệ thống máy chủ vật lý phức tạp, AWS có thể cung cấp mọi tài nguyên mà bạn cần trên cloud. Tài nguyên trên AWS được ảo hoá nhưng chúng vẫn tuân theo kiến trúc của các hệ thống vật lý thông thường.
Apr 05, 2024
NetWorking

All You Need To Know About IPv4

Khi muốn liên lạc với một người, bạn sẽ cần có địa chỉ của người đó, có thể là số điện thoại, email hay địa chỉ nhà. Nhưng dù là gì thì những địa chỉ đó luôn là duy nhất. Trên mạng internet cũng vậy, các máy tính muốn giao tiếp được với nhau sẽ cần có một địa chỉ IP. Vậy địa chỉ IP là gì, chúng ta sẽ cùng đi tìm hiểu nó trong bài viết này.
Apr 01, 2024
NetWorking

Networking With The Real Story

Chúng ta sử dụng internet hàng ngày và thường không để ý đến các thiết bị mạng trong nhà trừ khi chúng gặp sự cố khiến bạn không truy cập internet được nữa. Hệ thống mạng thoạt nhìn có vẻ phức tạp nhưng nếu thay đổi góc nhìn, bạn sẽ thấy nó cũng rất gần gũi với cuộc sống hàng ngày.
Mar 24, 2024
Linux

Permission in Linux

Trong quá trình làm việc, Linux luôn đóng vai trò là môi trường chính để mình phát triển các dự án. Tuy đã làm việc với Linux trong một thời gian khá lâu nhưng nhiều khi mình vẫn thấy bối rối khi không thể chỉnh sửa hay chạy một file nào đó. Lỗi đơn giản chỉ là không có quyền thực hiện các tác vụ đó. Những lúc như thế mình thường thêm sudo vào đằng trước câu lệnh vừa nãy hay cục xúc hơn là sử dụng chmod 777 mà không cần biết tại sao. Dù hơi muộn nhưng vẫn hơn không, ngày hôm nay mình sẽ dành ra một buổi tối để tìm hiểu về vấn đề này.
Mar 18, 2024
LangChain LLMs

Chat With Documents

Khi cần tìm thông tin liên quan đến một tài liệu, bạn sẽ cần nhiều thời gian để đọc và hiểu nội dung của tài liệu đó. Sẽ thật tốt nếu như có một chatbot giúp bạn. Bạn chỉ cần đưa tài liệu cho chatbot, sau đó có thể hỏi nó bất kỳ điều gì. Điều này là hoàn có thể và bạn cũng không cần lo dữ liệu sẽ bị lộ ra bên ngoài vì chatbot sẽ chạy hoàn toàn dưới local. Và đặc biệt, bạn không cần phải code một dòng nào.
Mar 08, 2024
Linux

Linux File System

Nếu là một lập trình viên backend chắc hẳn bạn cũng không còn xa lại gì với Linux. Đây là hệ điều hành phổ biến thuộc họ UNIX với nhiều biến thể khác nhau, nó cũng là nhân của Android. Nếu như trên Windows, chúng ta thường không để tâm đến các thư mục hệ thống, mọi thao tác đều có thể thực hiện bằng giao diện đồ hoạ. Trên Linux, mọi thứ sẽ không dễ dàng như vậy. Khi thao tác với các file hay muốn biết những gì đang diễn ra trong hệ thống bạn có thể sẽ phải làm việc trên command line và cần biết cách tổ chức cũng như mục đích của từng thư mục.
Feb 22, 2024
LangChain

LangChain

LangChain là một framework được viết bằng Python và JavaScript, nó cung cấp các công cụ để thao tác và xây dụng ứng dụng dựa trên LLMs. Bạn có thể xem hướng dẫn cài đặt LangChain tại đây. LangChain hướng đến việc giải quyết các vấn đề khi làm việc với LLMs vì vậy dưới đây cũng chính là những core modules của LangChain.
Feb 18, 2024
LLMs

Interact With LLMs

Với một người dùng bình thường, sẽ rất đơn giản để sử dụng AI của các bên thứ 3 như Chat-GPT, Google Gemini… nhưng đồng thời bạn sẽ phải cung cấp những thông tin quan trọng, đôi khi là nhạy cảm cho các ứng dụng đó. Lúc này hãy nghĩ đến việc tự xây dựng cho riêng mình một ứng dụng chat sử dụng AI. Để thực hiện điều này, bạn cần học cách sử dụng những model LLMs và đó cũng là nội dung chính ngày hôm nay chúng ta sẽ tìm hiểu.
Feb 06, 2024
LLMs

About an AI model

Trí tuệ nhân tạo hiện nay đang là một lĩnh vực rất phát triển và nhận được nhiều sự quan tâm. Sự ra đời của Chat-GPT cùng hàng loại các ứng dụng AI khác càng khiến nó được chú ý. Sử dụng AI đúng cách có thể giúp bạn nâng cao hiệu quả công việc trong hầu hết các lĩnh vực.
Feb 02, 2024
Sidekiq

Kill Sidekiq When It Reaches Memory Threshold

Như đã nói ở bài viết Sidekiq Memory Problem, nếu như tất cả các giải pháp mà bạn sử dụng không thể giải quyết triệt để được vấn đề memory của Sidekiq thì việc restart lại Sidekiq có thể sẽ là phương án bạn nên thử. Thông thường, nếu sử dụng cloud services, hệ thống của bạn sẽ có cơ chế healthcheck, nó sẽ tự động kiểm tra và restart lại những instance đang gặp vấn đề. Vì vậy, trong bài viết này chúng ta sẽ tập trung vào việc xử lý kill Sidekiq.
Jan 12, 2024
Sidekiq

Sidekiq Memory Problem

Nếu đã từng sử dụng Sidekiq trong ứng dụng Rails, chắc hẳn bạn đã nghe hoặc gặp phải vấn đề liên quan đến memory. Dễ thấy nhất là việc memory mà Sidekiq chiếm dụng ngày một tăng lên và không có dấu hiệu giảm mặc dù không có job nào đang chạy. Có nhiều nguyên nhân dẫn đến tình trạng này, nhưng dưới đây có thể được xem như là những nguyên nhân chính.
Jan 10, 2024
DesignPattern

Some Patterns You Should Know

Khi xây dựng một ứng dụng web, bạn sẽ thường sử dụng framework hay libraries hỗ trợ. Mặc dù bản thân chúng đã có cấu trúc và các rules rõ ràng nhưng trong nhiều bạn vẫn không biết nên viết code ở đâu để có thể tái sử dụng hay để dễ dàng maintain sau này. Vì vậy, dưới đây sẽ là một số design patterns phổ biến mà bạn nên biết.
Dec 16, 2023
Encapsulation

View Encapsulation with Shadow DOM

Với sự phát triển mạnh mẽ của các frameworks, công việc phía font-end cũng ngày một trở nên dễ dàng hơn. Xu hướng chia trang web thành các components khác nhau để quản lý và có thể tái sử dụng đang dần phổ biến. Các component được đóng gói và chỉ giao tiếp với nhau thông qua public API, tương tự như trong lập trình hướng đối tượng. Mỗi framework sẽ có những giải pháp khác nhau cho vấn đề này, tuy nhiên với HTML, bạn cũng hoàn toàn có thể đóng gói các components trong trang web của mình thông qua Shadow DOM.
Sep 12, 2023
Async

Sleep and Mutex in Ruby

Giống như những ngôn ngữ lập trình bậc cao khác, Ruby hoạt động trên kiến trúc multi-threaded. Để xử lý các tác vụ khác nhau tại một thời điểm, chúng ta phải tạo ra các threads tương ứng với mỗi tác vụ đó. Điều này là khác so với cách mà một ngôn ngữ single-threaded như JavaScript làm. Tuy nhiên, ở một vài khía cạnh chúng vẫn có những điểm tương đồng.
Sep 10, 2023
ActiveSupport

ActiveSupport: What You Didn't Know

Trong quá trình làm việc với Ruby on Rails, khi gặp phải vấn đề đặc biệt cần giải quyết, nếu như không tìm hiểu kỹ, ta sẽ dễ tự tay xây dựng và giải quyết mọi thứ trong khi bản thân framework đã có sẵn những công cụ hỗ trợ cho vấn đề đó. Vì vậy thay miệt mài tìm giải pháp, hãy lướt qua ActiveSupport một lượt, rất có thể bạn sẽ tìm được ngay thứ mà mình cần.
Aug 28, 2023
ActiveRecord

Exploring ActiveRecord Eager Loading

Khi sử dụng ActiveRecord để load dữ liệu, đôi lúc chúng ta sẽ bắt gặp những trường hợp mọi thứ không hoạt động như những gì ta mong muốn. Đó là do tuỳ vào từng điều kiện, ActiveRecord sẽ lựa chọn hoặc kết hợp các phương thức eager load lại với nhau để thực thi truy vấn một cách hiệu quả, nhưng đó không phải lúc nào cũng là phương án tốt nhất. Vì vậy, việc hiểu rõ cách hoạt động của các phương thức eager load trong ActiveRecord sẽ giúp bạn tìm được phương án tối ưu nhất cho từng bài toán thực tế.
Aug 26, 2023
ActiveRecord

How ActiveRecord Builds Query

Nếu là một Rails developer, chắc hẳn bạn cũng đã từng làm việc với ActiveRecord và thấy được sức mạnh của nó. Nhưng đã bao giờ bạn tự hỏi, làm thế nào nó có thể tạo ra được những câu query phức tạp như vậy. Ngày hôm nay chúng ta sẽ đi tìm câu trả lời cho câu hỏi này.
Aug 22, 2023
ActiveRecord Ransack

Custom Ransack Matcher

Ransack hay ActiveRecord sử dụng abstract syntax tree (AST) để compose query thay vì build query trực tiếp. AST sẽ bao gồm các node (Arel::Nodes::Node) chứa thông tin để tạo thành từng SQL fragment. Mỗi node được tạo nên bởi hai thành phần chính là attribute và predicate. Hiểu được điều này, chúng ta có thể chuyển hầu hết các case sử dụng query thuần sang AST thông qua việc định nghĩa các node tương ứng.
Aug 12, 2023
Multithread

Puma vs Unicorn, Which is Better?

Trong các app server được sử dụng cho ứng dụng Rails thì có lẽ Puma, Unicorn và Passenger là những cái tên được nhắc đến nhiều nhất. Tuy nhiên do Passenger là một app server có tính phí nên ngày hôm nay chúng ta sẽ chỉ nói về Puma và Unicorn, cùng với đó, chúng ta sẽ đi tìm câu trả lời cho câu hỏi đâu mới là app server mạnh mẽ hơn.
Sep 16, 2020
Transaction Multithread

Handling Transactions in Ruby Multithreading

Nếu như đã từng làm việc với Nodejs, chắc hẳn bạn sẽ thấy với những công việc mất nhiều thời gian, việc đưa chúng vào một promise rồi sau đó sử dụng Promise.all sẽ là một giải pháp thực sự hiệu quả. Nếu như bạn đang làm việc với Ruby on Rails và vẫn muốn sử dụng tính năng đó cho project của mình thì gem concurrent-ruby có thể là một lựa chọn dành cho bạn. Trong phần này mình không đi sâu vào cách sử dụng của concurrent-ruby, tuy nhiên việc sử dụng nó cũng rất đơn giản nên các bạn hoàn toàn có thể tự tìm hiểu trước khi chúng ta cùng tiếp tục nhé.
Jul 21, 2020
Async

What's Inside async/await?

Bạn có thể làm việc với Javascript như một ngôn ngữ lập trình hàm. Nếu không thích, bạn cũng hoàn toàn có thể xây dựng ứng dụng của mình theo hướng đối tượng cũng chỉ với JavaScript. Có lẽ chính vì điều này mà bản thân cú pháp của Javascript chứa rất nhiều dạng syntactic sugar.
Jun 19, 2020
Async

How Does JavaScript Execute Asynchronously?

“JavaScript chạy bất đồng bộ”. Nếu như đã từng làm việc với JavaScript chắc hẳn bạn sẽ thường xuyên nghe thấy điều đó. Nhưng cho dù nghe thấy rất nhiều nhưng không phải ai cũng có thể khẳng định mình đã hiểu rõ về nó. Nếu bạn là một trong số đó hoặc muốn có một cái nhìn khác về bất đồng bộ trong JavaScript thì chúng ta hãy cùng bắt đầu nhé.
May 02, 2020
Prototype

How Does JavaScript Create Objects

JavaScript là một ngôn ngữ rất linh hoạt, tuy nhiên ban đầu mình thực sự không có cảm tình với nó cho lắm. Có lẽ do đã quen với OOP và đem cái tư tưởng đó đi để tìm hiểu về nó, mình đã luôn cảm thấy mọi thứ ở đây lúc nào cũng rất lộn xộn. Function và object có ở khắp mọi nơi, chúng hòa trộn vào nhau làm cho bản thân mình nhiều khi không biết điều gì đang xảy ra. Nhưng sau cùng thì mình lại cảm thấy thích nó và nếu như nhìn vào quá trình phát triển và mục đích mà nó hướng tới thì bạn có thể hiểu phần nào lý do mà JavaScript đã trở nên như vậy.
May 02, 2020
Vue

Integrating Vue into Rails

Nếu như đã từng làm việc với Laravel, chắc hẳn các bạn cũng biết Vue là framework mà Laravel lựa chọn để hỗ trợ cho phía frontend. Laravel đang là một trong những framework PHP phổ biến nhất hiện nay, vì thế sẽ không quá ngạc nhiên khi độ nổi tiếng của Vue cũng một phần do đó mà tăng lên dù bản thân Vue cũng đã mang trong mình sức mạnh, sự linh hoạt của những người đi trước như React, Angular…
Jan 19, 2020
Mailgun

Creating Mail System with Mailgun

Mailgun là một hệ thống các API mạnh mẽ, hỗ trợ việc gửi, nhận và quản lý các email từ hệ thống của bạn cho tới các email được gửi từ các dịch vụ email khác. Trong bài viết này, chúng ta sẽ xây dựng một thệ thống email nội bộ dựa trên một số tính năng mà Mailgun cung cấp.
Dec 20, 2018
RubyClass

Inside Ruby Class

Trong chủ đề lần này chúng ta sẽ đi sâu vào tìm hiểu về hai khái niệm rất quen thuộc trong ruby đó là class và object. Hàng ngày chúng ta bắt gặp và làm việc với chúng nhưng không giống như trong những ngôn ngữ lập trình khác, class và object trong Ruby thực sự rất thú vị.
Jul 19, 2018
Comparison

Ruby Comparison Operators

Trong quá trình tìm hiểu về Ruby chắc hẳn chúng ta đã sử dụng hoặc nhiều lần bắt gặp các Equity method. Trong một số trường hợp chúng cho các kết quả giống nhau điều này đặt ra một câu hỏi là tại sao Ruby lại hỗ trợ nhiều method phục vụ cho việc so sánh như vậy? Để hiểu rõ hơn vấn đề này, chúng ta sẽ cùng nhau đi tìm hiểu từng method để biết chúng được sử dụng trong những trường hợp nào và sự khác nhau giữa chúng là gì.
Jan 05, 2018
no-result-found

No results

Published ongithub/dongoclam