Home Blog Page 98

RxSwift 9: Subjects

RxSwift 9: Subjects

Bài viết được sự cho phép của tác giả Lê Xuân Quỳnh

Trong bài 8, chúng ta đã biết cách tạo 1 observable factory, biết cách tạo nhiều loại observable khác nhau cho các subscribers.

Từ 8 bài, bạn đã nắm chắc được 1 observable là gì, cách tạo ra nó, cách đăng ký tới nó, và giải phóng khi nó hoàn thành. Observables là 1 phần cơ bản của RxSwift, nhưng nhu cầu cơ bản của phát triển ứng dụng là thêm thủ công các giá trị tới observable trong thời gian thực, sau đó gửi(emited) tới các subscribers. Những gì bạn muốn đồng thời là observable và observer. Và thứ đó được gọi là Subjects.

  10 theme Sublime Text tốt nhất
  Cách thiết lập một dự án Symfony để làm việc với Docker Subdomains

Trong bài này, chúng ta sẽ tìm hiểu sự khác nhau giữa các loại subject, cách nó làm việc và dùng nó trong trường hợp cụ thể nào.

Để bắt đầu, chúng ta tạo đoạn code thử nghiệm sau:

example(of: "PublishSubject") {
  let subject = PublishSubject<String>()    
}

Các bạn có thể tải code tham khảo tại:

https://github.com/lexuanquynh/RxLearning/tree/master/RxLearning/Playground/SubjectPlayground.playground

Trong đoạn code trên, chúng ta vừa tạo 1 PublishSubject. Giống như tên gọi, nó sẽ nhận các thông tin sau đó chuyển thông tin tới các subscribers, có thể sửa đổi thông tin trước khi chuyển. Nó thuộc kiểu String, vì vậy nó chỉ có thể gửi và nhận kiểu String. Sau khi được khởi tạo, nó sẵn sàng gửi và nhận String.

Thêm tiếp đoạn code sau vào ví dụ trên:

subject.onNext("Co ai nghe tui noi khong?")

Chúng ta vừa đặt 1 string vào subject, tuy nhiên chưa in ra gì cả vì chưa có subscriber nào đăng ký. Để tạo 1 subscriber, chúng ta thêm tiếp đoạn code sau:

let subscriptionOne = subject
  .subscribe(onNext: { string in
    print(string)
  })

Bạn vừa tạo 1 subscriber, nhưng vẫn chưa có gì hiển thị cả. Chính xác là khi subscriptionOne tạo ra, thì thông điệp onNext đã gửi trước đó, cho nên nó sẽ không nhận được nữa. Bây giờ thử thêm tiếp đoạn code sau vào dưới chương trình:

subject.on(.next("1"))

Kết quả như sau:

--- Example of: PublishSubject ---
1

Vì subscriptionOne đã tạo, cho nên khi 1 string phát ra từ PublishSubject, nó sẽ nhận được và hiển thị ra màn hình.

Vậy Subjects là gì?

Subjects đóng vai trò vừa là observable và observer. Nó có thể nhận sự kiện và gửi nó tới subscribers. Như chúng ta thấy, nó nhận sự kiện ở onNext, và đồng thời gửi chúng tới các subscribers. Có 4 loại subjects thường thấy:

  1. PublishSubject: Khởi tạo rỗng, và chỉ phát các phần tử cho các subscriber đã đăng ký với nó.
  2. BehaviorSubject: Khởi tạo với 1 phần tử ban đầu, và phát các phần tử mới nhất cho các subscriber đã đăng ký với nó.
  3. ReplaySubject: Khởi tạo với 1 dãy phần tử ban đầu, và phát lại toàn bộ các phần tử đó cho các subscriber đăng ký tới nó.
  4. Variable: Wrap 1 BehaviorSubject, giữ nguyên giá trị hiện tại của nó dưới dạng trạng thái, và chỉ phát lại giá trị mới nhất/ ban đầu cho các subscribers đăng ký mới. (Lưu ý: dạng này đã không còn dùng trong các phiển bản Rxswift mới nữa).

Vậy các subjects hoạt động như nào, chúng ta hãy tiếp tục theo dõi bài 10 nhé!

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

Có thể bạn quan tâm:

Xem thêm IT job hấp dẫn trên TopDev

Sự kiện cầu nối trong giao tiếp giữa các Vue.js component

Sự kiện cầu nối trong giao tiếp giữa các Vue.js component

Bài viết được sự cho phép của tác giả Kien Dang Chung

Trong bài Truyền dữ liệu vào Vue.js Component chúng ta đang dang dở ở ví dụ xây dựng greeting-component từ hai component là form-component và hello-component. Dữ liệu đã được truyền đi với chiều thuận từ component cha (component bao ngoài) là greeting-component vào cả hai component con. Chiều ngược lại là rất cần thiết, giống như một function có thể có tham số và cũng có thể trả về một kết quả.

  10 kinh nghiệm khi làm việc với các dự án lớn viết bằng Vue.js
  3 phút làm quen với Vue.js

Mô hình component bên trong component

Chiều ngược lại từ form-component (component con) ra greeting-component (component cha) – chiều số 2 được xử lý bằng các sự kiện trên component con, vì dữ liệu sẽ chỉ thay đổi khi có các sự kiện xảy ra.

Giao tiếp giữa component cha và component con

1. Truyền dữ liệu thông qua sự kiện với $emit

Chúng ta cùng quay lại hoàn thiện ví dụ từ đây bạn sẽ hiểu hơn cách thức truyền dữ liệu theo chiều ngược lại:

<!DOCTYPE html>
<html>
<head>
    <title>Component trong component - Example 4 - Allaravel.com</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
</head>
<body>
    <template id="hello-template">
        <div class="row">
            <div class="col-md-12">
                <h1>{{ message }} {{ uperCaseUser }}</h1>
            </div>
        </div>
    </template>
    <template id="form-template">
        <div class="row">
            <div class="col-md-3">
                <label for="name">Tên bạn là gì?</label>
            </div>
            <div class="col-md-9">
                <input class="form-control" :value="userName" type="text" @input="onInput">
            </div>
        </div>
    </template>
    <template id="greeting-template">
        <div>
            <form-component :user-name="userName" @emit-input="formInput"></form-component>
            <hello-component :user-name="userName"></hello-component>
        </div>
    </template>

    <div class="container" id="app">
        <greeting-component></greeting-component>
    </div>
    <script src="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
    <script type="text/javascript">
        Vue.component('hello-component',{
            data: function (){
                return {
                    message: 'Xin chào'
                }
            },
            computed: {
                uperCaseUser: function (){
                    return this.userName.trim().toUpperCase()
                }
            },
            props: ['userName'],
            template: '#hello-template'
        })
        Vue.component('form-component', {
            template: '#form-template',
            props: ['userName'],
            methods: {
                onInput: function (event){
                    this.$emit('emit-input', event.target.value)
                }
            }
        });
        Vue.component('greeting-component', {
            template: '#greeting-template',
            data: function () {
                return {
                    userName: 'Allaravel'
                }
            },
            methods: {
                formInput: function (val){
                    this.userName = val
                }
            }
        });
        new Vue({
            el: '#app'
        });
    </script>
</body>
</html>

Trong ví dụ này có một số thay đổi và chúng ta sẽ cùng nhau mổ xẻ những thay đổi này:

Thay đổi thứ nhất trong form-component:

<template id="form-template">
    <div class="row">
        <div class="col-md-3">
            <label for="name">Tên bạn là gì?</label>
        </div>
        <div class="col-md-9">
            <input class="form-control" :value="userName" type="text" @input="onInput">
        </div>
    </div>
</template>

Thay vì sử dụng v-model để gắn dữ liệu hai chiều giữa thẻ <input> và biến name, chúng ta sử dụng v-bind:value=”userName” sử dụng trực tiếp props userName vì v-bind chỉ gán một chiều từ props userName vào View nên ta bỏ qua biến name (Trong bài Truyền dữ liệu vào Vue.js component chúng ta sử dụng biến name để tránh thay đổi giá trị được truyền vào một cách trực tiếp, giờ sử dụng v-bind không cần đến). Chúng ta cũng quản lý sự kiện input trên ô nhập liệu này vì nó phát sinh dữ liệu thay đổi và mục đích cuối là cập nhật dữ liệu thay đổi ngược lại greeting-component.

Vue.component('form-component', {
    template: '#form-template',
    props: ['userName'],
    methods: {
        onInput: function (event){
            this.$emit('emit-input', event.target.value)
        }
    }
});

khi sự kiện onInput xảy ra nó sẽ phát sinh ra một sự kiện ’emit-input’ để greeting-component (component cha) quản lý bằng hàm this.$emit với hai tham số:

  • Tham số đầu là tên sự kiện muốn phát đến component cha.
  • Dữ liệu muốn gửi kèm đến sự kiện này.

Ở đây event.target.value chứa giá trị text hiện tại của ô nhập liệu tên.

Thay đổi thứ hai là ở greeting-component:

<template id="greeting-template">
    <div>
        <form-component :user-name="userName" @emit-input="formInput"></form-component>
        <hello-component :user-name="userName"></hello-component>
    </div>
</template>

Trong form-component chúng ta có thêm quản lý sự kiện v-on:emit-input (viết tắt @emit-input, xem thêm Quản lý sự kiện trong Vue.js). Khi sự kiện này phát sinh từ component con gửi đến component cha, chúng ta sẽ cập nhật giá trị được truyền qua sự kiện vào biến trên component cha:

Vue.component('greeting-component', {
    template: '#greeting-template',
    data: function () {
        return {
            userName: 'Allaravel'
        }
    },
    methods: {
        formInput: function (val){
            this.userName = val
        }
    }
});

như vậy formInput() sẽ nhận được event.target.value từ component con truyền lên, đây cũng là cách thức truyền dữ liệu theo chiều ngược từ component con lên component cha.

2. Rút gọn code component với v-model

Từ phiên bản Vue.js 2.2 trở đi, Vue.js cho phép sử dụng v-model với một component, đây là câu lệnh cho phép gán dữ liệu hai chiều trong một thẻ HTML. Vue.js component là một thẻ HTML tổng hợp hơn, làm được nhiều việc hơn, tại sao lại không dùng được v-model? v-model sử dụng trong component với hai nhiệm vụ:

  • Sử dụng thuộc tính value của component như là props
  • Sử dụng sự kiện input của component là sự kiện mặc định

Chúng ta cùng sử dụng v-model cho ví dụ ở trên, thay vì viết phức tạp:

<form-component :user-name="userName" @emit-input="formInput"></form-component>

methods: {
    formInput: function (val){
        this.userName = val
    }
}

Chúng ta chỉ cần sử dụng v-model như sau:

<form-component v-model="userName"></form-component>

Chạy thử code bạn thấy không hoạt động, tại sao vậy? v-model sử dụng sự kiện input mặc định mà chúng ta lại emit sự kiện emit-input thì hoạt động sao được:

this.$emit('emit-input', event.target.value)

cần sửa lại thành

this.$emit('input', event.target.value)

Ok, ví dụ hoạt động tốt rồi đấy, với cách dùng v-model với component chúng ta đã rút gọn được kha khá code. Với một số thẻ HTML không có có sự kiện input, khi đó các component được xây dựng trên thẻ này không thể sử dụng sự kiện mặc định input, vậy có thể thiết lập sự kiện khác thay thế không? Vue.js cho phép tùy chọn sự kiện khác thay thế cho sự kiện input mặc định. Tương tự như vậy với thuộc tính value, bạn hoàn toàn có thể thiết lập thuộc tính khác mặc định cho việc sử dụng v-model:

Vue.component('base-checkbox', {
  model: {
    prop: 'checked',
    event: 'change'
  },
  props: {
    checked: Boolean
  },
  template: '
    <input
      type="checkbox"
      v-bind:checked="checked"
      v-on:change="$emit('change', $event.target.checked)"
    >
  '
})

Khi đó bạn hoàn toàn sử dụng v-model như bình thường:

<base-checkbox v-model="lovingVue"></base-checkbox>

Giá trị của lovingVue sẽ được truyền vào prop checked. Thuộc tính lovingVue cũng được cập nhật khi component <base-checkbox>phát ra sự kiện change với một giá trị.

3. Giao tiếp giữa các component không có quan hệ

Từ đầu đến giờ chúng ta chủ yếu bàn luận về cách giao tiếp giữa các component có quan hệ cha con, tức là component cha sử dụng lại component con. Với mối quan hệ này, bạn chỉ cần ghi nhớ một câu “prop down emit up”.

Giao tiếp giữa component cha và component con

Trong ứng dụng không phải lúc nào quan hệ giữa các component cũng là quan hệ cha con, có khi hai component ngang hàng nhau cũng cần có sự giao tiếp với nhau. Khi các component không có quan hệ với nhau có thể sử dụng pattern event bus. Đầu tiên, chúng ta cần tạo ra event bus và export nó để các module khác hoặc component khác có thể sử dụng lại (nếu component dạng Single file component bạn cần đọc qua để hiểu phần tiếp theo). Tạo một file event-bus.js với nội dung:

import Vue from 'vue';
export const EventBus = new Vue();

Chúng ta vừa tạo ra một module với Javascript ES6 (ECMAScript 6), nó import Vue và export một Vue instance. Mọi việc tiếp theo là import thư viện này và export instance (EventBus) để sử dụng trong các component. Mỗi component sẽ có thể gửi đi một sự kiện và component khác có thể lắng nghe sự kiện thông qua event bus. Tất cả những gì cần làm chỉ gói gọn trong câu trên, tiếp theo chúng ta sẽ đi vào một ví dụ cụ thể để thấy rõ hơn.

3.1 Gửi đi một sự kiện

Tạo component-a theo kiểu Single file component (tạo file component-a.js):

<template>
  <div @click="emitMethod">Component A</div>
</template>
<script>
// import EventBus tạo ở trên
import { EventBus } from './event-bus.js';

export default {
  data() {
    return {
      clickCount: 0
    }
  },
  methods: {
    emitMethod() {
      console.log('Component A gửi đi một sự kiện vào event bus chung');
      // Sử dụng phương thức $emit để gửi sự kiện vào bus chung
      EventBus.$emit('component-a-clicked', this.clickCount);
    }
  }
}
</script>

3.2 Nhận một sự kiện

Tiếp theo, component-b còn lại sẽ lắng nghe sự kiện component-a phát ra bằng cách sử dụng phương thức ontrênEventBusinstance:EventBus.ontrênEventBusinstance:EventBus.on(channel: string, callback(payload1,…)). Tạo file component-b.js với nội dung:

// Import EventBus.
import { EventBus } from './event-bus.js';

// Lắng nghe component-a-clicked từ component-a
EventBus.$on('component-a-clicked', clickCount => {
  console.log('Nhận được ${clickCount} click từ component A')
});

Như vậy, khi sử dụng các component-a, component-b trong một ứng dụng (tạo file app.js), khi đó hai component-a và component-b đã giao tiếp với nhau:

import Vue from 'vue';
import ComponentA form './component-a'
import ComponentB form './component-b';

new Vue({
  el: "#app",
  components: {
    ComponentA,
    ComponentB
  }
});

3.3 Dừng lắng nghe sự kiện

Đôi khi chúng ta không muốn tiếp tục lắng nghe sự kiện để giao tiếp, có thể sử dụng phương thức $off trên EventBus instance:

EventBus.$off('component-a-clicked', clickHandler);

4. Lời kết

Component là khái niệm quan trọng trong Vue.js nó giúp mô đun hóa các ứng dụng lớn. Các component có thể giao tiếp với nhau với cả mô hình component cha con và mô hình component ngang hàng. Trong những bài tiếp theo chúng ta sẽ tiếp tục tìm hiểu về Vue component. Mọi thắc mắc bạn hãy để lại comment ở dưới bài nhé.

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

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Làm thế nào để trở thành một lập trình viên thực thụ?

Làm thế nào để trở thành một lập trình viên thực thụ?

Bài viết được sự cho phép của smartjob.vn

Xin chào các bạn! Hôm nay Smartjob sẽ chia sẻ cho các bạn một chủ đề hết sức thú vị và đang được rất nhiều người quan tâm: Lập trình viên là ai, họ đang làm những gì và cần có những phẩm chất nào để trở thành một lập trình viên.

Như các bạn đã biết hiện nay ngành công nghệ thông tin Việt Nam đang có những bước đột phá vượt bậc. Các sản phẩm của ngành này có thể kể đến như các trang web, phần mềm, những ứng dụng trên nền tảng di động và cả những chương trình game mới nhất. Để có đủ khả năng làm ra được một trong số những sản phẩm đó, bạn phải được trang bị đủ những kỹ năng cần thiết không chỉ về lập trình mà cần sự cộng hưởng của rất nhiều yếu tố khác.

  10 câu nói cực hay về lập trình
  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java

Công việc của lập trình viên (Developer hay Dev)

Nói về lập trình viên, nhiều bạn sẽ nghĩ ngay đến việc lập trình web, lập trình game, lập trình phần mềm,… Đơn giản họ là những người dùng những đoạn code (những câu lệnh, đoạn mã, …) để tạo ra một chương trình hoàn chỉnh. Với một dự án (web, game, phần mềm) sẽ có một nhóm người lập trình tham gia và một leader (trưởng nhóm) có nhiệm vụ phân công công việc cho từng người đồng thời giám sát quá trình thực hiện dự án đó. Sau khi thực hiện xong các phần công việc, có một người gọi là Tester chịu trách nhiệm chạy thử chương trình và “bới móc” ra các lỗi của người lập trình. Không chỉ có vậy, những kẻ tham gia công đoạn bắt lỗi của lập trình viên cũng nhiều vô số: Leader, quản trị web, người dùng sản phẩm, SEOer, thậm chí cả các đồng nghiệp. Nếu ngon nghẻ thì không sao chứ không tìm ra lỗi gì, không sửa được thì mọi thứ còn căng hơn dây đàn.

Đó là toàn bộ những gì cơ bản nhất mà người lập trình phải làm, phải đối mặt trong suốt một dự án. Ngoài ra có một điểm cần lưu ý là mỗi dự án đều có tính chất khác nhau, sử dụng những đoạn code khác nhau và có những ưu tiên khác nhau. Và còn vô vàn những vấn đề khác mà lập trình viên sẽ được trải nghiệm trong suốt những năm tháng làm việc của mình.

Lập trình viên cần gì?

Có thể thấy nghề lập trình là nghề cần lượng chất xám rất lớn. Không những thế, những yêu cầu cho một lập trình viên thực sự khắt khe hơn rất nhiều bạn có thẻ tưởng tượng. Dưới đây là những phẩm chất, kỹ năng bạn nên rèn luyện nếu muốn gắn bó lâu dài và thành công với nghề này:

  • Tư duy logic: Như đã nói, mỗi lập trình viên sẽ đảm nhận một phần công việc trong dự án. Vậy cần tư duy nhiều đến thế để làm gì? Bạn cần nghĩ xem người dùng sản phẩm cần gì, làm thế nào để chương trình đó trở nên tiện lợi nhất. Bên cạnh đó, cần cái đầu thật thông thoáng để nhận biết việc mình làm có gây ảnh hưởng đến phần việc của người khác không và nó có đi ngược lại với những gì Leader đề ra không. Đây là lý do vì sao 2 môn toán – tin luôn được đi kèm với nhau. Càng logic bao nhiêu bạn càng thành công bấy nhiêu.
  • Tiếp cận vấn đề: Đây cũng là một phần của tư duy logic. Trong cuộc đời mỗi lập trình viên sẽ trải qua rất nhiều dự án, với mỗi dự án mới bạn cần phải có cách tiếp cận thật hợp lý để nắm bắt được công việc chung cũng như phần việc của mình. Tiếp cận vấn đề là kỹ năng cực kỳ quan trọng nếu bạn muốn làm ra một chương trình thực sự bá đạo.
  • Làm việc nhóm và làm việc độc lập: Không có gì mẫu thuẫn ở đây cả. Làm việc nhóm khi bạn cần trao đổi, đối chiếu công việc lẫn nhau. Còn làm việc độc lập cần khi bạn tập trung vào phần việc của mình. Sẽ có những lúc bạn ngồi 1 mình trong thời gian rất dài, chẳng muốn đứng dậy bởi công việc còn rất bộn bề. Đó là lý do tại sao mỳ gói, bò húc, café là những người bạn thân thiết của nhiều lập trình viên.
  • Tự học và kiên trì: Học qua mạng, học qua Leader, học từ đồng nghiệp,… Một lập trình viên chắc chắn không bao giờ tận dụng được hết những gì đã học nhưng hãy cố gắng dùng chúng một cách tối đa. Không chỉ có thế, kiên trì là điều luôn luôn cần. Kiên trì học tập, kiên trì thực hành và fix lỗi, kiên trì làm việc,… Có rất nhiều chữ kiên trì mà bạn cần biết được và làm được.
  • Kỹ năng thiết kế: Trong thực tế, đôi lúc lập trình viên sẽ được giao thiết kế cho trang web hay phần mềm của mình khi công ty chưa có người thiết kế. Các chương trình của bạn phải dễ dùng, có tính ứng dụng cao và thu hút được người xem, người dùng. Nắm bắt được xu hướng trên thị trường, thói quen của khách hàng là điều vô cùng cần thiết. Càng nghiên cứu kỹ bao nhiêu sản phẩm của bạn càng thành công bấy nhiêu.

>>>Xem ngay: Tìm việc làm cho các lập trình viên

Mục đích của một lập trình viên

Tại Việt Nam, để kiếm được một công việc ưng ý về lập trình không phải dễ dù có rất nhiều doanh nghiệp có nhu cầu tuyển dụng. Điều mình muốn nhấn mạnh ở đây là một công việc ưng ý. Bạn có thể biết nhiều ngôn ngữ lập trình khác nhau, có nhiều kỹ năng, kinh nghiệm nhưng bạn cần một môi trường tốt nhằm thực hiện mục đích của mình.

Những người thích kiếm tiền cần doanh nghiệp chi trả xứng đáng sau mỗi dự án, mỗi năm làm việc. Họ có xu hướng làm việc bất chấp thời gian để có được càng nhiều tiền càng tốt. Cũng có những người muốn gắn bó với nghề lập trình nhưng vẫn được thoải mãi về thời gian, không phải chạy dự án, không phải đau đầu fix lỗi (những người này không có gánh nặng về kinh tế). Trên thực tế, dự án về lập trình luôn yêu cầu deadline rất gấp nên dù mục đích của bạn là gì, bạn cũng dễ bị cuốn theo guồng quay của công việc. Dự án này tiếp nối dự án khác, chồng chất lên nhau khiến bạn chẳng có thời gian để nghỉ.

Vì vậy, hãy cân nhắc trước khi theo đuổi nghề này. Bạn có thể làm việc trong các công ty của Nhật, Hàn,… hay những doanh nghiệp trong nước. Dù ở bất cứ đâu thì đam mê là cái không thể thiếu. Nó sẽ giúp bạn vượt qua những quãng thời gian khó khăn nhất và thực hiện được ước mơ của mình. Lập trình là một nghề vất vả nhưng nó không thể thiếu trong sự nghiệp phát triển ngành công nghệ thông tin nước nhà. Muốn đất nước đi lên thì đừng ngần ngại cống hiến. Cuối cùng, mình muốn những bạn đã trở thành lập trình viên, đã thành công trong sự nghiệp chia sẻ những kinh nghiệm cho thế hệ đi sau. Đó là liều thuốc tốt nhất giúp các em kiên định với sự lựa chọn của mình.

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

Có thể bạn quan tâm:

Xem thêm Jobs Developer hấp dẫn trên TopDev

Sử dụng EclipseLink thay thế Hibernate trong Spring Data JPA Starter

Sử dụng EclipseLink thay thế Hibernate trong Spring Data JPA Starter

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

Mặc định, khi các bạn sử dụng Spring Data JPA Starter trong Spring project của mình, Hibernate sẽ là default implementation được sử dụng. Thế nhưng, trong một số trường hợp, các bạn có thể không muốn sử dụng default implementation này. Ví dụ như mình: mình đang convert open source openid-connect này https://github.com/mitreid-connect/OpenID-Connect-Java-Spring-Server từ Spring MVC sang Spring Boot https://github.com/huongdanjavacom/openid-connect-spring-boot, opensource này đang sử dụng EclipseLink thay vì Hibernate. Trong trường hợp như mình, cách thay thế EclipseLink bằng Hibernate như thế nào? Mình sẽ hướng dẫn các bạn làm điều đó trong bài viết này các bạn nhé!

  Cài đặt TestNG trong Eclipse
  Hướng dẫn cách kết nối đến Database MySQL trong Eclipse

Đầu tiên, mình sẽ tạo mới một Spring Boot project:

Sử dụng EclipseLink thay thế Hibernate trong Spring Data JPA Starter

với Spring Data JPA Starter và PostgreSQL dependency như sau:

Sử dụng EclipseLink thay thế Hibernate trong Spring Data JPA Starter

Cấu hình thông tin database trong tập tin application.properties:

spring.datasource.url=jdbc:postgresql://localhost:5432/test
spring.datasource.username=khanh
spring.datasource.password=1

và chạy ứng dụng Spring Boot này, các bạn sẽ thấy log message như sau:

. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.5.0)

2021-05-26 20:56:58.926 INFO 8449 --- [ main] c.h.s.e.SpringBootEclipselinkApplication : Starting SpringBootEclipselinkApplication using Java 15.0.1 on Khanhs-MacBook-Pro.local with PID 8449 (/Users/khanh/Documents/workspace-spring-tool-suite-4-4.9.0.RELEASE/spring-boot-eclipselink/target/classes started by khanh in /Users/khanh/Documents/workspace-spring-tool-suite-4-4.9.0.RELEASE/spring-boot-eclipselink)
2021-05-26 20:56:58.930 INFO 8449 --- [ main] c.h.s.e.SpringBootEclipselinkApplication : No active profile set, falling back to default profiles: default
2021-05-26 20:56:59.402 INFO 8449 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2021-05-26 20:56:59.411 INFO 8449 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 3 ms. Found 0 JPA repository interfaces.
2021-05-26 20:56:59.743 INFO 8449 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2021-05-26 20:57:00.182 INFO 8449 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2021-05-26 20:57:00.223 INFO 8449 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]
2021-05-26 20:57:00.328 INFO 8449 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.31.Final
2021-05-26 20:57:00.562 INFO 8449 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
2021-05-26 20:57:00.709 INFO 8449 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL10Dialect
2021-05-26 20:57:01.094 INFO 8449 --- [ main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2021-05-26 20:57:01.105 INFO 8449 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2021-05-26 20:57:01.437 INFO 8449 --- [ main] c.h.s.e.SpringBootEclipselinkApplication : Started SpringBootEclipselinkApplication in 2.816 seconds (JVM running for 3.734)
2021-05-26 20:57:01.440 INFO 8449 --- [ main] o.s.b.a.ApplicationAvailabilityBean : Application availability state LivenessState changed to CORRECT
2021-05-26 20:57:01.441 INFO 8449 --- [ main] o.s.b.a.ApplicationAvailabilityBean : Application availability state ReadinessState changed to ACCEPTING_TRAFFICĐ

Đọc kỹ những dòng log trên, các bạn sẽ thấy việc Spring Data JPA Starter sử dụng Hibernate làm default implementation như thế nào.

Bây giờ, để thay thế Hibernate default implementation này bằng EclipseLink, đầu tiên, mình sẽ khai báo EclipseLink dependency như sau:

<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.jpa</artifactId>
<version>2.7.8</version>
</dependency>

Sau đó thì exclude Hibernate dependency trong Spring Data JPA Starter dependency như sau:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<exclusions>
<exclusion>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
</exclusion>
<exclusion>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
</exclusion>
</exclusions>
</dependency>

Spring Boot sử dụng class HibernateJpaAutoConfiguration để cấu hình hết tất cả những thông tin cần thiết cho Hibernate default implementation. Nếu các bạn take a look class HibernateJpaAutoConfiguration này, các bạn sẽ thấy, tất cả các thông tin liên quan đến Hibernate được Spring Boot cấu hình trong class HibernateJpaConfiguration:

/*
* Copyright 2012-2021 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.springframework.boot.autoconfigure.orm.jpa;

import javax.persistence.EntityManager;

import org.hibernate.engine.spi.SessionImplementor;

import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;

/**
* {@link EnableAutoConfiguration Auto-configuration} for Hibernate JPA.
*
* @author Phillip Webb
* @author Josh Long
* @author Manuel Doninger
* @author Andy Wilkinson
* @since 1.0.0
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ LocalContainerEntityManagerFactoryBean.class, EntityManager.class, SessionImplementor.class })
@EnableConfigurationProperties(JpaProperties.class)
@AutoConfigureAfter({ DataSourceAutoConfiguration.class })
@Import(HibernateJpaConfiguration.class)
public class HibernateJpaAutoConfiguration {

}

Class HibernateJpaConfiguration này extends từ class JpaBaseConfiguration. Đây là base class để chúng ta có thể extends và cấu hình JPA cho từng implementation mà các bạn muốn. Hibernate là một implementation và EclipseLink cũng là một implementation của JPA.

Chúng ta sẽ tạo mới class để cấu hình JPA cho EclipseLink:

package com.huongdanjava.springboot.eclipselink;

import java.util.Map;

import javax.sql.DataSource;

import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.jpa.vendor.AbstractJpaVendorAdapter;
import org.springframework.transaction.jta.JtaTransactionManager;

@Configuration
public class EclipseLinkJpaConfiguration extends JpaBaseConfiguration {

protected EclipseLinkJpaConfiguration(DataSource dataSource, JpaProperties properties,
ObjectProvider<JtaTransactionManager> jtaTransactionManager) {
super(dataSource, properties, jtaTransactionManager);
}

@Override
protected AbstractJpaVendorAdapter createJpaVendorAdapter() {
// TODO Auto-generated method stub
return null;
}

@Override
protected Map<String, Object> getVendorProperties() {
// TODO Auto-generated method stub
return null;
}

}

2 phương thức mà các bạn cần phải implement trong class EclipseLinkJpaConfiguration là createJpaVendorAdapter() và getVendorProperties().

Phương thức createJpaVendorAdapter() sẽ return lại implementation provider cho JPA. Mặc định thì Spring đã hỗ trợ Hibernate và EclipseLink:

Sử dụng EclipseLink thay thế Hibernate trong Spring Data JPA Starter

nên các bạn chỉ cần return lại đối tượng của class EclipseLinkJpaVendorAdapter là được.

@Override
protected AbstractJpaVendorAdapter createJpaVendorAdapter() {
return new EclipseLinkJpaVendorAdapter();
}

Phương thức getVendorProperties() giúp chúng ta định nghĩa một số cấu hình cụ thể cho từng implementation. Cho EclipseLink thì các bạn có thể sử dụng class PersistenceUnitProperties để add những properties mà nó hỗ trợ. Ví dụ như sau:

@Override
protected Map<String, Object> getVendorProperties() {
Map<String, Object> map = new HashMap<>();
map.put(PersistenceUnitProperties.WEAVING, "false");
map.put(PersistenceUnitProperties.LOGGING_LEVEL, SessionLog.FINER_LABEL);

return map;
}

Bây giờ, nếu chạy lại ứng dụng này, các bạn sẽ thấy log message như sau:

. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.5.0)

2021-05-26 22:04:26.403 INFO 10452 --- [ main] c.h.s.e.SpringBootEclipselinkApplication : Starting SpringBootEclipselinkApplication using Java 15.0.1 on Khanhs-MacBook-Pro.local with PID 10452 (/Users/khanh/Documents/workspace-spring-tool-suite-4-4.9.0.RELEASE/spring-boot-eclipselink/target/classes started by khanh in /Users/khanh/Documents/workspace-spring-tool-suite-4-4.9.0.RELEASE/spring-boot-eclipselink)
2021-05-26 22:04:26.405 INFO 10452 --- [ main] c.h.s.e.SpringBootEclipselinkApplication : No active profile set, falling back to default profiles: default
2021-05-26 22:04:26.747 INFO 10452 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2021-05-26 22:04:26.756 INFO 10452 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 3 ms. Found 0 JPA repository interfaces.
[EL Fine]: server: 2021-05-26 22:04:27.108--Thread(Thread[main,5,main])--Configured server platform: org.eclipse.persistence.platform.server.NoServerPlatform
[EL Finer]: metadata: 2021-05-26 22:04:27.126--Thread(Thread[main,5,main])--Searching for mapping file: [META-INF/orm.xml] at root URL: [file:/Users/khanh/Documents/workspace-spring-tool-suite-4-4.9.0.RELEASE/spring-boot-eclipselink/target/classes/].
[EL Finer]: metadata: 2021-05-26 22:04:27.13--Thread(Thread[main,5,main])--Searching for mapping file: [META-INF/eclipselink-orm.xml] at root URL: [file:/Users/khanh/Documents/workspace-spring-tool-suite-4-4.9.0.RELEASE/spring-boot-eclipselink/target/classes/].
[EL Finer]: metamodel: 2021-05-26 22:04:27.139--ServerSession(674233333)--Thread(Thread[main,5,main])--metamodel_type_collection_empty (There is no English translation for this message.)
2021-05-26 22:04:27.140 INFO 10452 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2021-05-26 22:04:27.254 INFO 10452 --- [ main] c.h.s.e.SpringBootEclipselinkApplication : Started SpringBootEclipselinkApplication in 1.08 seconds (JVM running for 2.108)
2021-05-26 22:04:27.255 INFO 10452 --- [ main] o.s.b.a.ApplicationAvailabilityBean : Application availability state LivenessState changed to CORRECT
2021-05-26 22:04:27.257 INFO 10452 --- [ main] o.s.b.a.ApplicationAvailabilityBean : Application availability state ReadinessState changed to ACCEPTING_TRAFFIC
[EL Finer]: 2021-05-26 22:04:27.268--Thread(Thread[SpringContextShutdownHook,5,main])--initializing session manager

Ứng dụng của chúng ta đang sử dụng EclipseLink rồi đó các bạn!

Làm việc với Tooltip trong Selenium

Làm việc với Tooltip trong Selenium

Bài viết được sự cho phép của tác giả To Thi Van Anh

Dòng Tooltip là một dạng message, nó thường xuất hiện khi chúng ta đưa chuột hoặc click vào một phần tử nào đó trên trang web.

Ví dụ cho dễ tưởng tượng luôn nhé!

  Các kiểu “đợi chờ” trong Selenium Webdriver: Implicit wait, Explicit wait và Fluent wait
  Giới thiệu công cụ kiểm thử tự động Selenium

Ở kênh 14 này, mình có tooltip và html của nó như hình dưới:

Làm việc với Tooltip trong Selenium

Hoặc bạn dùng trình duyệt mở trang này ra https://translate.google.com, khi bạn đưa chuột vào chữ Google ở góc trên bên trái, nó hiện một dòng nhỏ có chữ “Dịch” đó, cái chữ ấy chính là tooltip.

Làm việc với Tooltip trong Selenium

Hay khi đưa chuột vào biểu tượng danh sách ứng dụng ở góc bên phải thì cũng thấy dòng tooltip “Các ứng dụng của Google”.

Làm việc với Tooltip trong Selenium

Các tooltip như thế này thuộc loại tooltip HTML đơn giản, các tooltip là một thuộc tính thuộc một thẻ cụ thể nào đó, và thuộc tính này chính là title. Các ban xem cụ thể trong trích đoạn HTML dưới đây nhé:

Một loại khác, có tên là jQuery tooltip, loại này thì nói như nào được nhỉ – đại khái là khi bạn tương tác vào một phần tử (có tooltip) nào đó thì lúc đó nó sẽ sinh ra một thẻ abc-zyx nào đó nữa nằm bên trong thẻ cha ấy, và cái xuất hiện bên trong đấy mới là cái đoạn tooltip mình cần lấy.

Như ví dụ dưới này, thì khi mình thực hiện mouse hover vào khu vực nhập dữ liệu hiển thị dòng tooltip, trông có vẻ thì giống như kiểu trên, nhưng thực chất thì lại không phải :D. Các bạn xem ở link này nhé https://jqueryui.com/tooltip/ .

Để lấy được nội dung của tooltip, tương ứng với hai loại thì mình có các cách tương ứng để làm việc với chúng.

Tooltip: thuộc tính title trong thẻ HTML

Với loại tooltip này thì dễ làm việc hơn.

Đầu tiên, bạn cần tìm đến phần tử có tooltip cần lấy.

Sau đó, lấy ra dòng chữ tooltip bằng cách sử dụng method getAttribute(), với thuộc tính ở đây là “title”.

Cuối cùng là so sánh đoạn text lấy ra được với đoạn text mình mong muốn thôi.

Các bạn có thể tham khảo đoạn code dưới này của mình nhé:

//Mở trang tin tức kênh 14: 
driver.get("http://kenh14.vn/"); 
//Tìm đến phần tử có tooltip:
WebElement imgHeader = driver.findElementByCssSelector("div.khw-top-header h1 a");
// Lấy ra nội dung tooltip theo thuộc tính title của phần tử phía trên
String tooltipText = imgHeader .getAttribute("title"); 
// In ra nội dung tooltip:
System.out.println(tooltipText);

Tooltip: jQuery

Còn với loại này thực ra khi làm việc cũng không thấy khó chịu như mấy nhân viên hành chính nhà nước đâu, về cơ bản tóm tắt lại ta có mấy bước như này nhé:

Đầu tiên, tìm phần tử chứa phần tử có tooltip cần lấy

Sau đó thực hiện hover chuột đến vị trí vừa lấy đó

Tiếp sau đó, sau bước hover thì thực hiện tìm vị trí tương ứng của phần tử có nội dung tooltip bên trong bạn cần lấy, nó thể thể nằm trong một thẻ div khác, một thẻ a nào đó…

Sau cùng là lấy ra nội dung của tooltip và so sánh với giá trị mong muốn thôi. 😀

driver.get("https://jqueryui.com/tooltip/");
//Tìm phần tử to chứa tooltip
WebElement element2 = driver.findElementById("age");  
//Thực hiện mouse hover
Actions action = new Actions(driver); 
action.moveToElement(element2).build().perform(); 
//Sau đó tìm đích danh đứa chứa tooltip: 
WebElement toolTipElement = driver.findElementByCssSelector(".ui-tooltip"); 
//Cuối cùng gettext và in ra để xem thôi
String toolTipText2 = toolTipElement.getText(); 
System.out.println("Tool tip text: " + toolTipText2);

Hehehe, khá là đơn giản đúng không nào, chúc các bạn vận dụng thành công trong các case trong project nhé! 😀

Tham khảo:

https://www.guru99.com/verify-tooltip-selenium-webdriver.html

http://www.softwaretestingstudio.com/verify-tooltip-text-with-selenium-webdriver-using-java/

http://www.seleniumeasy.com/selenium-tutorials/how-to-verify-tooltip-text-with-selenium-webdriver-using-java

Bài viết gốc được đăng tải tại vananhtooo.wordpress.com

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Top 5 câu hỏi phỏng vấn Python không thể bỏ qua

Top 5 câu hỏi phỏng vấn Python không thể bỏ qua

Bài viết được sự cho phép của tác giả Kiên Nguyễn

Cùng thử sức với 5 câu hỏi phỏng vấn dưới đây để biết trình độ Python của mình đang ở mức nào nha. Bảo dễ chả dễ, nói khó cũng chẳng khó lắm đâu. Thử ngay thôi!

5. Đoạn code sau in ra gì?

Khởi động bằng một câu tương đối nhẹ nhàng với hai dòng code. Hầu hết các developer mới làm quen với Python cũng đều thấy thở vào nhẹ nhõm với câu hỏi này.

Tuy nhiên, trả lời đúng hay không thì còn chưa chắc

listA = ['1', '2', '3', '4', '5', '6']
print list[10:]
  • A – Index Error
  • B – []
  • C – 6

List chỉ có 5 phần tử, xong chưa?. Kết quả là:

Cần phải chú ý dấu hai chấm (:). Cái bẫy nằm ở đây, nếu gõ listA[10], kết quả chắc chắn là IndexError (do array chỉ có 6 phần tử). Tuy nhiên trường hợp này lại đang cố gắng slice List, nên kết quả không bao giờ là Index Error.

Rồi xong, mới một câu dễ ông đã sai tè le. Chán!.

Gì, mới chạy roda 1 câu, sai là bình thường thôi. Bao nhiêu câu hỏi phỏng vấn Python tôi trả lời được hết cơ mà!

Ok, làm câu nữa

Các công việc python bạn nên tham khảo

4. Đoạn code in ra gì?

 list = [ [ ] ] * 3
list[0].append(1)
print(list)
list[1].append(2)
print(list)
  • A – [[1], [], []] và [[1], [2], []]
  • B – [[1], [1], [1]] và [[2], [2], [2]]
  • C – [[1], [1], [1]] và [[1, 2], [ 1, 2 ], [ 1, 2 ]]

Đáp án: C

Ui vãi nồi, sao lại C. Cái bẫy là bẫy từ đầu ở chỗ [ [ ] ] * 3, cú pháp này tạo ra 3 phần tử trong list. Nhưng 3 phần tử này không độc lập để edit dữ liệu theo từng index.

[[]] * 3 chính xác tạo ra 3 item trong một list nhưng là references to the same list. Tức là cả ba đều tham chiếu tới cùng một giá trị.

Quả list[0].append(1) đầu tiên nạp ba thằng giá trị 1 cho kết quả [[1], [1], [1]] . Bồi thêm phát nữa list[1].append(2) cho ra kết quả [[1, 2], [ 1, 2 ], [ 1, 2 ]]

Ôi giời, cái này thì như cái trick (thủ thuật thôi). Ông nào cứ siêng đọc một loạt câu hỏi phỏng vấn Python thì nhớ, chứ có gì đâu mà phải CĂNG.

Ok, làm câu nữa. Lý thuyết cho khỏi ý kiến ha.

  Tại sao nên chọn Python để lập trình Web App?

3. Python có multi-threading không?. Có cách nào viết code Python chạy parallel không?

  • A – Chắc là có, cũng như Java – Parallel Stream các kiểu đồ (bạn nào chưa biết có thể đọc thêm về Parallel Stream tại Kieblog)
  • B – Làm gì có – chưa đọc câu nào phỏng vấn Python mà bảo có multi-threadting hết
  • C – Có multi-threading nhưng không triển khai parallel được

Đáp án là B. Không có.

Python có một cái gọi là Global Interpreter Lock (GIL). GIL đảm bảo rằng chỉ có duy nhất một thread được thực thi tại một thời điểm nhất định.

Ngoài ra, Python cũng có một cái gọi là Python’s threading package.

Trời má, câu này tui đúng nè má!. Làm câu lý thuyết nữa ha.

2. *args**kwargs là gì?. Sự khác biệt?

Không có ABC. Câu này thuộc dạng câu hỏi phỏng vấn Python dễ nhất rồi đấy!

*args được sử dụng khi ta KHÔNG BIẾT CHÍNH XÁC bao nhiêu đối số (arguments) được pass qua cho function. Hoặc khi ta muốn pass arguments là một list, một loại data đặc biệt.

**kwargs sử dụng khi BIẾT CHÍNH XÁC bao nhiêu arguments được truyền qua cho function.

Cũng có thể sử dụng *bob và**billy nhưng cũng khá ít người dùng.

Hai câu lý thuyết rồi, thôi quay lại list ha. Trời má, xúc luôn!

  Mẫu bảng mô tả công việc lập trình Python

1. Đoạn code sau cho kết quả là?

def extendList(val, list=[]):
list.append(val)
return list

list1 = extendList(5) #1
list2 = extendList(555,[])
list3 = extendList('Z') #3

Các giá trị được in ra lần lượt ở #1 và #3 là:

  • A – [5, ‘Z’] và [5, ‘Z’]
  • B – [5] và [‘Z’]
  • C – [5] và [5, ‘Z’]

Ủa chứ ông viết cái list2 vào làm cái b**p gì?.

Thì tôi viết, nhưng tôi không hỏi. Rồi sao?. Làm gì nhau?. Chọn đáp án đi kìa.

Đáp án là A. Cái list 2 thì dễ òm, kiểu gì nó chả in ra 555 vì có pass cái list [] đi kèm đó.

Trường hợp list1 và list3, nó chỉ truyền duy nhất một arguments. Đối với các câu hỏi phỏng vấn Python, cần nhớ rằng arguments trong def được tính toán khi function được define (định nghĩa ra). Chứ không phải lúc được gọi extendList()

Chính vì define một lần, nên ở lần gọi list1 và list3, nó lấy giá trị list cũ append giá trị mới vào -> Đáp án A, không lăn tăn.

Hết, cảm ơn các ông đã đọc bài. Nếu thấy hay thì LIKE và CHIA SẺ bài viết top 5 câu hỏi phỏng vấn Python này nha.

Làm đi lần sau tôi còn viết nữa!. CẢM ƠN

Trúng tủ nha!

Tham khảo thêm một số câu hỏi phỏng vấn Python

Hết rồi. Cảm ơn anh em đã đọc bài. Nhớ like và share Facebook page nha!

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

Có thể bạn quan tâm:

Xem thêm Việc làm IT hot hấp dẫn trên TopDev

Internationalization trong Spring Boot

Internationalization trong Spring Boot

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

Trong bài viết trước, mình đã giới thiệu với các bạn cách hiện thực internationalization trong các ứng dụng Spring MVC. Đối với các ứng dụng Spring Boot thì cách hiện thực internationalization sẽ như thế nào? Mình sẽ hướng dẫn các bạn trong bài viết này, các bạn nhé!

  Cấu hình JSP views trong InternalResourceViewResolver với Spring Boot JAR file
  Internationalization trong Spring MVC

Đầu tiên, mình sẽ tạo mới một Spring Boot project:

Internationalization trong Spring Boot

với Spring Web dependency:

để làm ví dụ.

Kết quả:

Internationalization trong Spring Boot

Mình sẽ cấu hình để sử dụng InternalResourceViewResolver trong ví dụ này.

Mình sẽ khai báo tomcat-embed-jasper dependency để render các tập tin JSP:

<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>

và JSTL dependency để làm việc với trang JSP:

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>

Tiếp theo, mình sẽ tạo mới HelloControler:

package com.huongdanjava.springboot.internationalization;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {

@RequestMapping("/hello")
public String home() {
return "home";
}
}

để hiển thị tập tin view home.jsp nằm trong thư mục src/main/webapp/WEB-INF/views với nội dung như sau:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@ page session="false" contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>Home</title>
</head>
<body>
<a href="<c:url value="?lang=vi"/>">
<spring:message code="app.lang.vi" />
</a> |
<a href="<c:url value="?lang=en"/>">
<spring:message code="app.lang.en" />
</a>

<h1>
<spring:message code="app.welcome" /> !
</h1>
</body>
</html>

Ở đây, mình đã khai báo sử dụng <spring:message /> để làm việc với internationalization trong Spring framework. Các bạn xem thêm bài viết Internationalization trong Spring MVC để hiểu thêm về nó nhé!

Mặc định, Spring Boot sẽ dùng Tomcat server để chạy nên các bạn để ý là để hiển thị đúng ngôn ngữ, chúng ta cần khai báo contentType với charset encoding UTF-8 nhé:

<%@ page session="false" contentType="text/html; charset=UTF-8" %>

Có vẻ như các runtime server khác thì không cần!

Và mình cũng cần khai báo trong tập tin application.properties như sau:

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

Bây giờ, chúng ta sẽ khai báo các bean cần thiết của Spring cho internationalization: messageSource, localeResolver và localeChangeInterceptor các bạn nhé!

Để cấu hình cho messageSource, mình sẽ tạo mới 2 tập tin messages.properties và messages_vi.properties trong thư mục src/main/resources/i18n với nội dung của mỗi tập tin như sau:

messages.properties:

app.lang.vi=Vietnamese
app.lang.en=English
app.welcome=Hello world

messages_vi.properties

app.lang.vi=Ti\u1EBFng Vi\u1EC7t
app.lang.en=Ti\u1EBFng Anh
app.welcome=Xin chào

Spring Boot hỗ trợ auto configuration cho messageSource với ResourceBundleMessageSource implementation. Các bạn có thể khai báo một số properties sau:

để sử dụng cấu hình mặc định của Spring Boot.

Ví dụ như mình có thể khai báo property:

spring.messages.basename=classspath:i18n/messages

để khai báo messageSource cho ứng dụng ví dụ của mình.

Ở đây, mình sẽ không sử dụng cấu hình mặc định mà sẽ khai báo bean để sử dụng class ReloadableResourceBundleMessageSource như sau:

@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:i18n/messages");

return messageSource;
}

Đối với localResolver mình cũng sẽ sử dụng CookieLocalResolver:

@Bean
public LocaleResolver localeResolver() {
return new CookieLocaleResolver();
}

Còn localeChangeInterceptor sẽ được cấu hình như sau:

package com.huongdanjava.springboot.internationalization;

import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;

@Component
public class InterceptorConfiguration implements WebMvcConfigurer {

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}

@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
lci.setParamName("lang");

return lci;
}
}

Ở đây, mình đang sử dụng WebMvcConfigurer để add LocaleChangeInterceptor vào ứng dụng của mình.

Chạy ứng dụng và click giữa các ngôn ngữ để xem kết quả nhé các bạn!

Của mình như sau:

và:

Internationalization trong Spring Boot

Hướng dẫn 3 bước khởi tạo nhanh WordPress

kiểm thử tự động
Hướng dẫn 3 bước khởi tạo nhanh WordPress

WordPress là một trong những công cụ phổ biến nhất được sử dụng để thiết lập một website với ưu điểm dễ sử dụng, chi phí hợp lý, phù hợp với nhu cầu xây dựng website ngay lập tức. 

Để giúp bạn khởi tạo WordPress một cách nhanh chóng, chỉ cần tập trung vào vận hành doanh nghiệp mà không cần quan tâm quá nhiều về hạ tầng, VNG Cloud ra mắt dịch vụ EasyAPP. Với trình cài đặt tự động của EasyAPP, bạn không cần tìm hiểu về cách cài đặt WordPress nữa, quá trình cài đặt nhanh gọn và hoàn toàn tự động sẽ giúp bạn tạo WordPress ngay.

Tìm việc làm cho lập trình WordPress từ các công ty HOT

3 Bước Thiết Lập WordPress Trên VNG Cloud

Bước 1: Khởi tạo dịch vụ tại VNG Cloud 

Đăng nhập/ đăng ký tài khoản và đi đến địa chỉ Đăng nhập EasyAPP

Hướng dẫn 3 bước khởi tạo nhanh WordPress

Trong đó: 

Name: Tên dịch vụ

App: Ứng dụng web đang muốn khởi tạo (Chọn WordPress với web stack là Nginx, PHP-FPM, WordPress và database là Mysql).

Bước 2: Lựa chọn cấu hình 

Về cơ bản, EasyAPP có nền tảng là ứng dụng chạy trên nền compute vServer và network VPC, nên bạn chỉ trả chi phí cho cấu hình tương ứng. Theo đó, vServer có cấu hình “v1.small2x4.b100” có:

  • 2 vCPU
  • 50G đĩa SSD (tốc độ đọc ghi 200 IOSPS).

Bước 3: Tiến hành thanh toán 

Với cấu hình “v1.small2x4.b100” sẽ có giá trị tương ứng:

  • 2 vCPU giá trị là 520,300 VND
  • Phân vùng đĩa 50G SSD giá trị 163,350 VND
  • Thời hạn dịch vụ đến “04/06/2021 00:00:00”

Chọn “Create Server” để tạo ứng dụng với chi phí trên và bấm xác nhận thanh toán để tiến hành khởi tạo.

Sau khi khởi tạo, bạn sẽ nhận được email hệ thống bao gồm thông tin đăng nhập SSH. Ngoài ra, tuỳ theo ứng dụng bạn lựa chọn, hệ thống sẽ gửi kèm thêm thông tin của ứng dụng, ở đây là thông tin user và mật khẩu đăng nhập WordPress.

Kiểm tra và quản trị ứng dụng

Tại VNG Cloud Portal

Quản lý toàn bộ ứng dụng bạn đã tạo tại trang quản lý như hình dưới: 

Kiểm tra ứng dụng tại WordPress

Để kiểm tra ứng dụng đã được khởi tạo hay chưa, đi đến địa chỉ IP Public đã được cấp trong email. Nếu khởi tạo thành công, màn hình sẽ hiển thị như bên dưới. 

Hướng dẫn 3 bước khởi tạo nhanh WordPress

Để login vào trang quản trị, đăng nhập vào địa chỉ http://IP public/wp-admin . Trong đó, IP public đã được cấp trong email. Ví dụ, IP public là 61.28.229.212, bạn đăng nhập vào địa chỉ http://61.28.229.212/wp-admin để vào trang quản trị bằng tài khoản gửi trong email.

Sau đó, bạn có thể thoải mái tuỳ chỉnh thêm post mới hoặc cài đặt plugin để đồng bộ dữ liệu từ website cũ. 

Để bạn có thể trải nghiệm khởi tạo website WordPress đơn giản, VNG Cloud dành tặng độc giả TopDev mã ưu đãi “TDV1TRIEU” trị giá 1.000.000đ credit dành cho tài khoản mới, hạn sử dụng đến hết ngày 30/06/2021. 

Truy cập ngay website: https://vngcloud.vn/tang-mot-trieu-dong-su-dung-dich-vu để nhận ngay quà tặng. 

Hướng dẫn cách tạo kết nối đến SQL Server thông qua SSMS

Hướng dẫn cách tạo kết nối đến SQL Server thông qua SSMS

Bài viết được sự cho phép của blogchiasekienthuc.com

Chào các bạn, trong bài viết trước mình đã cùng các bạn cài đặt Microsoft SQL Server và SSMS (SQL Server Management Studio) là một công cụ giao diện hỗ trợ thao tác với SQL Server. Và để tiếp tục cho nội dung của bài hôm trước thì trong bài viết tiếp theo này, mình sẽ cùng các bạn thực hiện việc kết nối tới SQL Server thông qua SSMS. Ok, bắt đầu ngay thôi nào !

#1. Khởi chạy SQL Server Management Studio

+ Bước 1: Đầu tiên các bạn mở SSMS lên, có rất nhiều cách mở. Các bạn có thể tìm kiếm trên thanh Taskbar hoặc tạo shortcut trên màn hình.

Ở đây mình dùng cách đơn giản nhất và nhấn tổ hợp Windows + S để mở Windows Search => và tìm kiếm với từ khóa Microsoft SQL Server như hình bên dưới.

Hướng dẫn cách tạo kết nối đến SQL Server thông qua SSMS

+ Bước 2: Bạn chờ một lát để cho SQL Server Management Studio khởi động.

+ Bước 3: Đây chính là giao diện ban đầu khi các bạn khởi tạo SSMS. Các bạn có thể bấm vào Connect như ảnh bên dưới để kết nối đến SQL Server thông qua xác thực của hệ điều hành (được thiết lập trong quá trình cài đặt).

#2. Tạo mới một connection

+ Bước 1: Vâng, sau khi có connection rồi thì các bạn có thể bấm vào tab Connect như hình bên dưới => rồi chọn Database Engine…

Hướng dẫn cách tạo kết nối đến SQL Server thông qua SSMS

+ Bước 2: Ở đây các bạn bấm vào ô lựa chọn Server name thì sẽ có một drop-down sổ xuống => Các bạn chọn là SQL Server Authentication.

=> Sau đó bấm Connect để thiết lập một kết nối thông qua xác thực của Server.

+ Bước 3: Các bạn sẽ phải nhập mật khẩu và tên đăng nhập.

Tên đăng nhập thì các bạn có thể nhập sa, còn password thì các bạn đặt theo đúng quy tắc bảo mật cơ bản – khoảng 8 ký tự, gồm chữ hoa, chữ thường, chữ số và ký tự đặc biệt.

=> Nếu mật khẩu khó nhớ các bạn có thể tích vào ô Remember password để khỏi cần nhập lại mật khẩu trong các lần tiếp theo.

+ Bước 4: Vậy là chúng ta đã có một kết nối mới đến SQL Server thông qua xác thực Server.

Một connection (kết nối) sau khi tạo ra sẽ có một vài thành phần như: Database, Security, Server Objects… Chúng ta chủ yếu sẽ làm việc với các Database.

Hướng dẫn cách tạo kết nối đến SQL Server thông qua SSMS

Các bạn cũng có thể kiểm tra kết nối đồng thời xem phiên bản của SQL Server bằng cách tạo mới một query (chuột phải vào Connection => New Query hoặc bấm vào New Query trên thanh taskbar của SSMS).

+ Bước 5: Bạn nhập query SELECT @@VERSION => rồi bấm Execute để chạy câu query.

Kết quả sẽ hiển thị trong tab Result như hình bên dưới với các thông tin về phiên bản SQL Server các bạn đang cài đặt.

  MSSQL Database Forensic (SQL Server)
  Chạy Postgresql trong Docker container

#3. Lời kết

Đó, việc tạo kết nối đến SQL Server thông qua SSMS tương đối đơn giản. Các bạn chỉ cần lưu ý là phải cài đặt cả hai trên máy rồi thì mới thao tác được.

Nhiều trường hợp các bạn không biết, chỉ cài SSMS mà không cài SQL Server thì cũng không thể kết nối được.

Trong bài viết tiếp theo thì mình sẽ cùng với các bạn tìm hiểu về các bước để tạo mới một database. Cách thêm xóa dữ liệu thông qua các table.

Hẹn gặp lại các bạn trong các bài viết tiếp theo nha !

Nguyễn Đức Cảnh – Bài viết gốc tại blogchiasekienthuc.com

Có thể bạn quan tâm:

Xem thêm Top IT Jobs hấp dẫn trên TopDev

Cài đặt FTP Server trên Windows Server

cài đặt FTP server

Bài viết được sự cho phép của BQT Kinh nghiệm lập trình

Trong bài viết này, mình sẽ hướng dẫn các bạn cài đặt FTP Server trên Windows Server “step by step”. Tại sao lại cần cài đặt FTP Server? Chắc hẳn nhiều người trong số chúng ta đã từng gặp vấn đề trong việc vận chuyển dữ liệu giữa các Server, đó là không thể copy/move dữ liệu lớn. Ý tôi ở đây là lớn hơn mức cho phép của trình copy trên máy trung gian. Có một số mẹo để xử lý nhanh vấn đề này, chúng ta có thể upload dữ liệu đó lên cloud, sau đó lại tải xuống từ cloud ở máy chủ khác. Tuy nhiên giải pháp này cũng gặp giới hạn do độ lớn của file được phép upload lên Cloud. Do đó FTP sẽ là giải pháp tối ưu hơn cả. Thay vì cố tìm các mẹo khác, hãy cùng nhau tìm hiểu cách làm phổ biến và được công nhận nào.

  Fix Lỗi FTP Client Windows Server "Current Security Settings Do Not Allow This File To Be Downloaded"
  Cách tạo REST API với JSON Server

FTP là gì?

FTP (Giao thức truyền tệp) là tên viết tắt của “File Transfer Protocol”. Như tên của nó, FTP được sử dụng để truyền tệp giữa các máy trên mạng. Bạn có thể sử dụng FTP để chia sẻ tệp giữa PC cục bộ và máy chủ từ xa và để truy cập kho lưu trữ phần mềm trực tuyến.

Trong bài viết này chúng ta sẽ lựa chọn cài đặt máy chủ FTP làm vai trò máy chủ web IIS, ngoài ra, bạn có thể sử dụng phần mềm khác, ví dụ: FileZilla Server, Titan FTP Server, Home Ftp Server, Ocean FTP Server.

Bước 1: Cài đặt máy chủ FTP trên Windows Server

Mở “Windows Server Control Panel” và tìm “Add roles and features”.

Cài đặt FTP Server trên Windows Server

Lựa chọn “Role-based or feature-based installation”.

Chọn máy chủ của bạn

Trong cửa sổ tiếp theo, hãy tích vào “IIS web server”.

Cài đặt FTP Server trên Windows Server

Chọn tiếp “Add features

Ấn Next tiếp.

Ở màn hình “Role services”, tích vào “FTP server”.

Check lại các feature sẽ cài đặt, và ấn “Install

Như vậy chúng ta đã hoàn tất bước 1, cài đặt FTP lên Windows Server.

Bước 2: Tạo một trang FTP trên máy chủ Windows

Mở “IIS Manager”. Nhấp chuột phải vào “Sites” và chọn “Add FTP Site” từ menu.

Nhập tên trang web và đường dẫn đến thư mục.

Tiếp theo, chọn địa chỉ IP của bạn trong danh sách thả xuống. Tích chọn “No SSL”.

Trong cửa sổ tiếp theo, chọn “Basic for authentication”. Chọn tiếp “Authorization – Specified roles or groups”, nhập tên của nhóm người dùng FTP (ví dụ ftp-group). Tích chọn vào cho phép “read” và “write”. Sau đó ấn “Finish”.

Trang web của bạn sẽ xuất hiện như dưới đây.

Bước 3: Tạo nhóm người dùng

Tạo một nhóm Windows là cần thiết để xác định người dùng sẽ có quyền truy cập vào máy chủ ftp. Mở Computer Management. Trong menu bên phải, chọn Groups. Click chuột phải và chọn tạo nhóm mới.

Nhập tên của nhóm, một mô tả nếu cần thiết. Để thêm người dùng, nhấp vào Add.

Nhập tên User, để kiểm tra, bấm Check Names. Nếu người dùng Windows tồn tại, bấm Ok.

Sau khi mọi thứ được thêm vào, hãy tạo một nhóm bằng nút Create .

Bước 4: Phân vùng người dùng

Để mỗi người dùng có được thư mục riêng của mình và không có quyền truy cập vào các tệp khác sau khi kết nối với máy chủ, cần phải thiết lập isolation. Để thực hiện việc này, hãy mở cài đặt trang ftp của bạn và chọn FTP User Isolation.

Tích chọn mục User name directory và nhấp vào Apply.

Sau đó, click chuột phải vào tên site ftp của bạn và chọn Add Virtual Directory.

Trong trường Alias , nhập tên hiệu hoặc tên, trong trường đường dẫn nhập đường dẫn đến thư mục người dùng, để thực hiện việc này, tạo thư mục con trong thư mục trang web ftp trên máy chủ Windows của bạn. Nhấn Ok.

Tiếp theo, cài đặt quyền truy cập cho folder ảo này. Chọn ftp site của bạn và chọn Edit Permission.

Chọn Security tab và click nút Advanced.

Ở màn hình tiếp theo, chọn Disable inheritance, chọn tiếp option đầu tiên trong màn hình confirm, rồi bấm Apply – Ok.

Quay trở lại tab Security  và nhấp vào nút Edit.

Xóa các nhóm người dùng không cần thiết, điều này để đảm bảo rằng chỉ chủ sở hữu thư mục mới được phép truy cập.

Bây giờ thêm một người dùng Windows, người sẽ có quyền truy cập đầy đủ vào thư mục. Nhấp vào nút Add.

Nhập tên người dùng, để kiểm tra, bấm Check Names. Nếu người dùng tồn tại, nhấp Ok.

Tiếp theo bạn cần thêm quyền để kiểm soát hoàn toàn thư mục. Chọn người dùng đã tạo và tích chọn Allow full quyền.

Tiếp theo, nhấp vào Áp dụng – Ok.

Bước 5: Thiết lập rule Firewall

Đối với kết nối bên ngoài đến máy chủ ftp, bạn phải thay đổi cấu hình tường lửa. Để thực hiện việc này, hãy mở Windows Firewall with Advanced Security. Trong menu bên trái, chọn Inbound rules, sau đó chọn New Rule.

Trong cửa sổ mở ra, chọn Predefined. Nhấn Next.

Đánh dấu vào tất cả các dòng và nhấn Next.

Trong bước tiếp theo, tích chọn Allow the connection và nhấp vào Finish. Để các quy tắc này có hiệu lực – khởi động lại máy chủ.

Bước 6: Kết nối với máy chủ FTP

Bạn có thể kết nối với máy chủ FTP theo nhiều cách, ví dụ, thông qua tiện ích Windows tiêu chuẩn – Explorer hoặc thông qua chương trình FileZilla.

Xem xét kết nối thông qua Explorer. Trong thanh địa chỉ, nhập:

ftp: // ip address

Cửa sổ nhập mật khẩu và đăng nhập sẽ mở ra, nhập tài khoản đã tạo và truy cập

Lưu ý: Ví dụ: máy chủ web IIS cho phép bạn định cấu hình linh hoạt kết nối với máy chủ FTP để phân chia mức độ hiển thị của không gian cho những người dùng khác nhau, để cho phép truy cập ẩn danh và định cấu hình quyền.

Kết quả là, bạn sẽ thấy nội dung của thư mục máy chủ FTP:

Done! Vậy là chúng ta đã thành công rồi đó. Các bạn có thắc mắc gì vui lòng comment bên dưới đây nhé.

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

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Lấy base URL trong Controller trong Spring MVC và Spring Boot

Khi làm việc với các ứng dụng web sử dụng Spring MVC hoặc Spring Boot, đôi khi chúng ta sẽ có nhu cầu lấy thông tin base URL của ứng dụng để làm gì đó.

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

Khi làm việc với các ứng dụng web sử dụng Spring MVC hoặc Spring Boot, đôi khi chúng ta sẽ có nhu cầu lấy thông tin base URL của ứng dụng để làm gì đó. Base URL ở đây là https://huongdanjava.com hoặc là https://google.com đó các bạn. Để làm được điều này, các bạn có thể dùng class ServletUriComponentsBuilder của Spring.

  Cách sử dụng properties trong tập tin cấu hình của Spring
  cURL là gì? Cách sử dụng Curl

Cụ thể class này nó có một phương thức tên là fromRequestUri() với tham số là đối tượng của class HttpServletRequest. Chúng ta sẽ lấy được base URL của ứng dụng với đối tượng của class HttpServletRequest này, cụ thể như sau:

String baseUrl = ServletUriComponentsBuilder.fromRequestUri(request)
.replacePath(null)
.build()
.toUriString();

Phương thức fromRequestUri() sẽ trả về schema (http hoặc https), host, port và context path của ứng dụng. Vì nhu cầu của chúng ta chỉ cần schema, host và port nên như các bạn thấy, chúng ta cần gọi thêm replacePath() với null value để remove context path này.

Full code:

package com.huongdanjava.springboot;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;

@Controller
public class HelloController {

@RequestMapping("/hello")
public String home(HttpServletRequest request) {
String baseUrl = ServletUriComponentsBuilder.fromRequestUri(request)
.replacePath(null)
.build()
.toUriString();

System.out.println(baseUrl);

return "home";
}
}

Kết quả:

Lấy base URL trong Controller trong Spring MVC và Spring Boot

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

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Những lập trình viên giỏi nhất thế giới đương đại – Phần 1

Những lập trình viên giỏi nhất thế giới đương đại – Phần 1

Bài viết được sự cho phép của smartjob.vn

Ngày này có rất nhiều lập trình viên thực sự rất giỏi nhưng bạn có bao giờ tự đặt ra câu hỏi ai là lập trình viên xuất sắc nhất? Mặc dù không có cách nào để khẳng định ai là người giỏi nhất nhưng ITWorld đã lùng sục những coder đình đám nhất và đưa lên các diễn đàn cũng như lấy ý kiến các chuyên gia để thảo luận. Và sau cuộc nghiên cứu với nhiều tiêu chí khác nhau, 15 gương mặt xuất sắc nhất đã lộ diện.

  10 Kỹ năng quan trọng cần có của Front-end để tìm công việc dễ dàng hơn
  Top 7 phương pháp tự học lập trình tốt nhất dành cho Developer

Lập trình viên Margaret Hamilton – Bộ óc siêu đẳng sau sự phát triển của Apollo

Những lập trình viên giỏi nhất thế giới đương đại – Phần 1

Bà là giám đốc Bộ phận kỹ thuật phần mềm tại phòng thí nghiệm Charles Stark Draper sau đó được phân công vào đội thiết kế và xây dựng phần mềm điều khiển bay của NASA của Apollo và thực hiện nhiệm vụ của Skylab. Dựa trên những gì đã trải nghiệm ở Apollo, say này Hamilton đã phát triển ngôn ngữ lập trình Universal Systems Language dựa trên biến hệ của Development Before the Fact (DBTF). Đó còn là người đi tiên phong trong những khái niệm “phần mềm không đồng bộ, lập kế hoạch ưu tiên và thiết kế phần mềm mang tính ứng dụng cao”. Đặt ra thuật ngữ “kỹ thuật phần mềm” (software engineering), đoạt giải Lovelace Augusta Ada vào năm 1986 và giành Giải thưởng hoạt động trong không gian đặc biệt của NASA năm 2003.

Nhận xét:

“Hamilton đã có rất nhiều phát minh, thử nghiệm thành công. Đó chính là cô gái rất phù hợp với danh hiệu Kỹ sư máy tính của Hoa Kỳ.” Ford_beeblebrox

“Tôi nghĩ rằng trước khi cô ấy xuất hiện (không được thừa nhận bao gồm cả Knuth), lập trình máy tính ở mức độ nào đó vẫn là một nhánh của toán học. Tuy nhiên một hệ thống điều khiển bay cho tàu vũ trụ hoàn toàn là mô hình khác.” Dan Allen

“Cô ấy là người đầu tiên đưa ra cụm từ “kỹ thuật phần mềm” và đã cho chúng ta một ví dụ tuyệt vời về việc làm cách nào để thực hiện điều đó.” David Hamilton

Lập trình viên Donal Knuth – Tác giả của Nghệ thuật lập trình máy tính

Tên đầy đủ là Donal Ervin Knuth, một nhà khoa học máy tính nổi tiếng tại Đại học Standford (Mỹ). Người viết cuốn sách Definition trên lý thuyết lập trình, tạo TeX hệ thống sắp chữ kỹ thuật số. Người giành giải thưởng Hopper Grace Murray của Hiệp hội máy tính ACM năm 1971. Đoạt giải ACM AM Turning năm 1974, Huy chương Khoa học Quốc gia vào năm 1979 và huy chương IEEE của Neumann John von năm 1995.

Nhận xét:

“…đã viết  Nghệ thuật lập trình máy tính và có lẽ đó là cuốn sách toàn diện nhất cho tới bây giờ” Anonymous

“Đó là chương trình máy tính lớn nhất mà tôi đã từng sử dụng với tỷ lệ lỗi là 0% – Don Knuth TeX” Jaap Weel

“Đó là người tuyệt với nhất nếu bạn hỏi tôi” Mitch Rees-Jones

Lập trình viên Ken thompson: Đồng sáng chế của Unix

Những lập trình viên giỏi nhất thế giới đương đại – Phần 1

Ông được biết đến với cái tên Ken trong giới hacker. Đồng sáng tạo (cùng với Dennis Ritchie) của Unix; tác giả của ngôn ngữ lập trình B, các chương trình mã hóa kỹ tự UTF-8, biên tập văn bản ed, đồng phát triển ngôn ngữ lập trình Go. Đồng đoạt giải AM Turning (cùng với Ritchie) vào năm 1983, Huy chương Quốc gia về công nghệ năm 1998,….

Nhận xét:

“ … có lẽ đó là lập trình viên xuất sắc nhất mà nhân loại từng có. Unix kernel, Unix tool, chương trình vô địch thế giới cờ vua Belle, kế hoạch 9, ngôn ngữ Go” Pete Prokopowicz

“Những đóng góp của Ken nhiều hơn bất cứ ai khác có thể nghĩ ra. Chúng rất cơ bản, thực tế và có sức sống vượt thời gian; vẫn luôn được chúng ta sử dụng hàng ngày” Jan Jannink

Lập trình viên Richard Stallman: Đấng tạo hóa của Emacs, GCC

RMS sinh năm 1953 tại New York, Mỹ. Ông đặt nền móng cho dự án GNU và tạo ra nhiều phần mềm như Emacs nguyên thủy, GDB (trình gỡ rối GNU), GCC (trình biên dịch GNU) đồng thời tạo ra phong trào phần mềm tự do. Đoạt giải Hopper Grace Murray của ACM năm 1990 và các giải thưởng của EFF vào năm 1998.

Ngoài ra, ông còn là người đứng đầu Tỏ chức phần mềm Tự do (Free Software Foundation – FSF) nhằm thu hút những lập trình phần mềm tự do và tạo ra một cơ sở hạ tầng hợp pháp cho phần mềm tự do.

Nhận xét:

“ Tôi có thể không đồng tình nhiều thứ về người đàn ông to lớn này nhưng tôi luôn cho rằng đó là lập trình viên hàng đầu dù ông ta còn sống hay đã chết” Marko Poutiainen.

“Thông qua những kiến thức tuyệt vời của mình về lập trình cùng với ý chí, nghị lực phi thường, ông đã tạo ra toàn bộ văn hóa lập trình và máy tính” Dan Dunay.

Lập trình viên Anders Hejlsberg – Cha đẻ của Turbo Pascal

Anders Hejlberg sinh năm 1960 tại Đan Mạch. Trong suốt cuộc đời mình, ông đã tham gia rất nhiều dự án thiết kế nhiều ngôn ngữ lập trình như Turbo Pascal, C#, J++, Delphi. Hiện tại ông đang đảm nhiệm chức vụ Thiết kế trưởng và kiến trúc sư của ngôn ngữ C# tại Microsoft. Năm 2001, ông đã vinh dự đoạt giải thưởng về lập trình Dobb’s Excellence.

Nhận xét:

“Ông đã viết, biên dịch hợp ngữ cho cả hai hệ điều hành máy tính chủ đạo (DOS và CPM). Nó được thiết kế để biên dịch, liên kết và chạy một chương trình trong vài giây thay vì vài phút.” Steve Wood.

“Tôi rất ngưỡng mộ người đàn ông này – ông đã tạo ra các công cụ phát triển mà tôi rất yêu thích qua 3 giai đoạn chính trong suốt quãng thời gian tôi phấn đấu thành một kỹ sư phần mềm chuyên nghiệp.” Stefan Kiryazov

Bài viết được dịch và tổng hợp từ ITWorld

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

Có thể bạn quan tâm:

Tìm việc IT lương cao, đãi ngộ tốt trên TopDev

TOP 7 Công ty IT Hàn Quốc giúp bạn tạo cú hích cho sự nghiệp lập trình

Công nghệ ngày càng phát triển và khẳng định tầm quan trọng không thể thiếu với đời sống của con người, nhất là trong khoảng thời gian dịch bệnh căng thẳng hiện nay. Sự xuất hiện của nhiều ứng dụng, nền tảng công nghệ mới, đã cho thấy Việt Nam là “mảnh đất màu mỡ” thu hút nhiều doanh nghiệp nước ngoài đến và đầu tư phát triển lâu dài, các công ty công nghệ Hàn Quốc cũng không ngoại lệ. Đây được xem là cơ hội lớn cho các lập trình viên Việt có nhiều lựa chọn tốt hơn cho sự nghiệp.

Tiếp nối thành công của dự án hợp tác 2020, KICC HCMC cùng TopDev tiếp tục mang đến chương trình hợp tác năm 2021 với thông điệp “Make Your IT Career Outstanding – Khởi sắc sự nghiệp IT của bạn”. Theo đó là những hoạt động phối hợp với mục đích kết nối các việc làm ngành CNTT tại các doanh nghiệp IT Hàn Quốc với đối tượng Lập Trình Viên Việt Nam. Từ đó hỗ trợ, hợp tác và thúc đẩy tuyển dụng việc làm công nghệ thông tin cho các công ty Hàn Quốc và tạo thêm nhiều cơ hội để các tài năng IT Việt Nam sở hữu những tấm vé gia nhập vào các doanh nghiệp công nghệ hàng đầu của Hàn Quốc hiện đang có mặt tại Việt Nam. 

Bạn đang tìm kiếm môi trường làm việc quốc tế để bứt phá trình code của bản thân? Cùng khám phá TOP 7 công ty công nghệ đến từ Hàn Quốc xuất hiện trong kỳ này để không bỏ lỡ cơ hội nhé!

1. POSCO ICT Vietnam

POSCO ICT Vietnam là thành viên của tập đoàn Thép POSCO Hàn Quốc. Với gần 10 năm hoạt động tại Việt Nam, công ty tự hào là đối tác tham gia nhiều dự án lớn như nhà máy thép POSCO VST, POSCO SS-VINA, Dự án nhà máy thép Formosa Hà Tĩnh, Dự án tàu điện ngầm Thành phố Hồ Chí Minh…

Không dừng lại ở đó, POSCO ICT Vietnam luôn tìm kiếm nhiều cơ hội đổi mới, hướng đến mục tiêu phát triển cao hơn. Điều đó được thể hiện thông qua sự hợp tác với các tập đoàn, viện nghiên cứu, doanh nghiệp trong nước và quốc tế, để nỗ lực tìm kiếm, phát triển và đổi mới nhằm mang lại giá trị tốt hơn cho khách hàng.

>>> POSCO ICT Vietnam đang có cơ hội dành cho IT Software Operator gia nhập và cùng góp phần tạo nên thành công của công ty trong tương lai. Nếu bạn đã có 2 năm kinh nghiệm trong tay thì đừng nên bỏ lỡ nhé!

2. Total Software Bank VietNam

Ra đời vào năm 1998, Total Soft Bank Ltd (TSB) là công ty chuyên cung cấp các giải pháp maritime logistics thông qua việc áp dụng công nghệ tiên tiến hàng đầu cùng đội ngũ phát triển giàu kinh nghiệm chuyên môn. Một số giải pháp tiêu biểu của công ty như: tự động hóa tàu biển, các giải pháp cảng,…

Nếu bạn mong muốn thử thách bản thân qua các dự án thuộc lĩnh vực logistics thì Total Soft Bank Vietnam chính là “đáp án” dành cho bạn! Khám phá ngay 1 trong 2 vị trí:

3. GO2JOY VIỆT NAM

Go2Joy là công ty có vốn đầu tư nước ngoài, chuyên về phát triển ứng dụng di động. Sau 4 năm hoạt động, công ty tự hào là đơn vị hàng đầu cung cấp ứng dụng đặt phòng theo giờ với hơn 100,000++ lượt tải xuống và 20,000++ người thật check-in từ ứng dụng.

Bên cạnh đó, tính đến hiện tại Go2Joy đã liên tục huy động vốn thành công với con số lên đến 6,1 triệu USD. Với nguồn lực tài chính vững mạnh, công ty đặt kỳ vọng nâng cao trải nghiệm khách hàng và doanh thu cho đối tác khách sạn, đồng thời mở rộng thị trường Việt Nam cũng như quốc tế. 

Go2Joy đang tìm kiếm những nhân viên chuyên nghiệp, trẻ trung, năng động, có chí cầu tiến để gia nhập vào đội ngũ cùng thực hiện mục tiêu chung. Tham gia ngay hôm nay nếu bạn là:

4. VNIB Tech

Được thành lập từ năm 2016, VNIB Tech là công ty chuyên cung cấp các phần mềm trên nền tảng di động (iOS, Android) và web. Hoạt động với sứ mệnh mang thế giới đến gần nhau hơn bằng công nghệ, VNIB Tech không ngừng cải tiến chất lượng, đem đến cho khách hàng những sản phẩm và giải pháp tối ưu nhất. Đây cũng chính là cơ hội cho các tài năng công nghệ trải nghiệm môi trường làm việc chuyên nghiệp tại công ty đến từ Hàn Quốc và gặt hái thành công.

Bạn đã sẵn sàng trở thành “mảnh ghép” quan trọng của VNIB Tech trong những dự án đầy thách thức? Đừng bỏ lỡ 1 trong 5 vị trí sau:

5. Mintpot 

Mintpot Việt Nam là thành viên của Minpot, có trụ sở chính tại Hàn Quốc, và là một trong những công ty sáng tạo thông minh, chuyên cung cấp các dịch vụ video VR có phụ đề Mint VR với ước mơ tạo ra một cuộc sống tốt hơn với VR.

Đến với Mintpot, ngoài mức lương cực hấp dẫn, bạn còn có nhiều cơ hội thăng tiến và phát triển không giới hạn. Và nếu bạn đang tìm kiếm “bến đỗ” cho sự nghiệp và đã sẵn sàng tạo cú hích mới cho sự nghiệp của bản thân? Vậy Mintpot chính là câu trả lời tốt nhất cho bạn.

Đừng bỏ lỡ cơ hội! Gia nhập Mintpot ngay tại 1 trong 3 vị trí với loạt điều thú vị đang chờ bạn trực tiếp trải nghiệm:

6. Coconut Silo 

Coconut Silo là startup in-house trực thuộc Hyundai Motor Group, ra đời với nhiệm vụ phát triển nền tảng logistics xuyên biên giới ở các nước ASEAN: bắt đầu từ Việt Nam đến Campuchia, Lào và Thái Lan. 

Tự hào với với văn hóa làm việc tuyệt vời cùng các công nghệ hiện đại, Coconut Silo hứa hẹn là nơi để các lập trình viên Việt tỏa sáng tài năng. Đừng quên, tại Coconut Silo còn có cơ hội công tác tại Hàn Quốc, giúp vươn tầm sự nghiệp của các lập trình viên.

⇒ Mời bạn khám phá ngay vị trí Mobile Developer (iOS/Android) để nắm bắt cơ hội!

7. PLUS N SOFT

Được thành lập vào năm 2014, PLUS N SOFT đơn vị đối tác chuyên thực hiện nhiều dự án mobile với các công ty hàng đầu trong và ngoài nước. Ngoài ra, công ty đã xây dựng nhiều loại cơ sở hạ tầng khác nhau, giúp tối ưu hóa bộ xử lý để cung cấp các dịch vụ Outsourcing, Business Consulting and Global Platform chất lượng.

Và bạn đã có kinh nghiệm vững vàng với 1 trong các ngôn ngữ: PHP, NodeJS, “chiếc ghế” Back-end Developer (NodeJS, PHP) tại PLUS N SOFT đang chờ bạn đảm nhiệm!

Với sự xuất hiện của 7 công ty IT Hàn Quốc trên, hi vọng bạn có thể tìm được “bến đỗ” phù hợp để khởi sắc sự nghiệp lập trình của bản thân. Đừng quên KICC HCMC X TopDev sẽ sớm cập nhật thêm những cơ hội hấp dẫn khác, hãy đón chờ những bài viết tiếp theo bạn nhé!

Thông tin chi tiết về dự án vui lòng truy cập tại đây

Về KICC HCMC và NIPA:

Được thành lập vào ngày 23 tháng 5 năm 2019, KICC HCMC (KICC Hồ Chí Minh) là văn phòng thứ 6 trên toàn cầu và thứ 2 tại Việt Nam. KICC là văn phòng quốc tế trực thuộc Bộ Khoa học – Công nghệ Thông tin Hàn Quốc (MSIT) và Cơ quan Xúc tiến Công nghệ Thông tin – Truyền thông (NIPA) với mục đích giúp đỡ việc kinh doanh quốc tế của những công ty về Công nghệ Thông tin (CNTT) của Hàn Quốc. KICC có 06 văn phòng ở Thung lũng Silicon (Mỹ), Tokyo (Nhật), Bắc Kinh (Trung Quốc), Singapore, Hà Nội (Việt Nam) và Hồ Chí Minh (Việt Nam).

NIPA là tổ chức phi lợi nhuận từ Chính phủ Hàn Quốc và là thành viên của Bộ Khoa học – Công nghệ Thông tin Hàn Quốc, chịu trách nhiệm trong việc hỗ trợ các công ty và các chuyên gia CNTT. NIPA hiện dẫn đầu trong kiến thức về cơ sở hạ tầng kinh tế xã hội và phát triển kinh tế quốc gia bằng việc xúc tiến khả năng cạnh tranh của toàn ngành công nghiệp thông qua sự tiến bộ kỹ thuật CNTT và công nghiệp.

Thông tin liên hệ:

  • Hotline: 84 28 35208135 (Vietnamese) | 84 28 35208136 (Korean)
  • E-mail: HCMC@nipa.kr
  • Địa chỉ: 135 Hai Bà Trưng, Phường Bến Nghé, Quận 1, Thành phố Hồ Chí Minh

Về TopDev – nền tảng tuyển dụng IT

Với hơn 300.000 profile lập trình viên đồng thời sở hữu Cộng đồng Lập trình viên lớn nhất Việt Nam, TopDev hiện là một trong những nền tảng tuyển dụng chuyên về IT hàng đầu tại Việt Nam.  Ngoài ra, TopDev là một trong những đơn vị tiên phong ở lĩnh vực IT tại Việt Nam, giúp xây dựng và phát triển thương hiệu tuyển dụng – Employer Brand cho hàng trăm công ty công nghệ trong và ngoài nước. Đây còn là đơn vị chuyên khảo sát, phân tích và phát hành các báo cáo quý, năm về thị trường và nhân lực IT tại Việt Nam. (Báo cáo thị trường IT tại đây)

Fix Lỗi FTP Client Windows Server “Current Security Settings Do Not Allow This File To Be Downloaded”

fix lỗi FTP

Bài viết được sự cho phép của BQT Kinh nghiệm lập trình

Trong bài trước mình đã giới thiệu tới các bạn cách cài đặt FTP Server trên Windows Server. Tuy nhiên không ít người trong chúng ta ngay sau khi setup xong lại không thể download được file từ FTP Server xuống. Chúng ta có thể gặp lỗi như sau:

  10 lời khuyên để giảm thiểu mối đe doạ an ninh nội bộ
  Fix Lỗi "RDP Authentication Error Has Occurred – The Function Requested Is Not Supported"
Current security settings do not allow this file to be downloaded.

Fix Lỗi FTP Client Windows Server "Current Security Settings Do Not Allow This File To Be Downloaded"

Fix lỗi trên bằng cách nào?

Nguyên nhân của lỗi trên là do cài đặt bảo mật trên máy chủ. Do đó chúng ta sẽ cùng thay đổi cấu hình Internet Options.

  1. Ấn phím Windows + S, sau đó gõ “internet options”
    Fix Lỗi FTP Client Windows Server "Current Security Settings Do Not Allow This File To Be Downloaded"
  2. Chuyển qua Security tab. Chọn Internet  và click vào Custom level
    Fix Lỗi FTP Client Windows Server "Current Security Settings Do Not Allow This File To Be Downloaded"
  3. Màn hình cài đặt chi tiết sẽ hiển thị ra. Lướt xuống phần Downloads và tích chọn Enable File download và Font download.
  4. Sau khi thực hiện xong, ấn OK để lưu cài đặt.

Xong, như vậy là bạn có thể kết nối lại và download rồi đó.

kinhnghiemlaptrinh.com

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

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Javascript empty array – đừng gán [] thêm một lần nào nữa

Javascript empty array – đừng gán [] thêm một lần nào nữa

Bài viết được sự cho phép của tác giả Kiên Nguyễn

Trong quá trình làm việc với Javascript array, tất nhiên sẽ không tránh khỏi trường hợp ta muốn gán array trở thành empty (Javascript empty array).

Có vô vàn cách để làm điều này, nhưng bài viết hôm nay tôi sẽ chỉ cho các ông thấy gán array cho [] tệ tới mức nào!

1. Thường xuyên sử dụng

Nguyên nhân bao gồm nhiều thứ:

  • Tạo array, dùng lại.
  • Gán array xong muốn empty đi cho đỡ rối.
  • Không có nhu cầu truy xuất data nữa.

Tuy nhiên, hãy cẩn thận khi gán [] nhằm empty array. Tại sao?. Câu trả lời có ngay đây:

2. Thử với ví dụ sau đây

Giả sử, qua vô vàn khó khăn vất vả, ta có array sau đây:

let characters = ["A", "B", "C"];

Sau khi cảm thấy không còn dùng nữa, đối với một lập trình viên bình thường, tất nhiên chỉ đơn giản là:

// Gán array với [] - xong
characters = [];

Có vấn đề khi cố gắng Javascript empty array như vậy không?. Tất nhiên là có chứ!. Nếu ta có một array khác được copy từ array này?

// Gán array với [] - xong
let characters = ["A", "B", "C"];
let copyCharacters = characters;

Chà, copy mà kết quả tất nhiên 2 array y hệt nhau.

console.log(characters)
console.log(copyCharacters)

// ["A", "B", "C"]
// ["A", "B", "C"]

Trường hợp thay đổi một item trong array thứ nhất, tất nhiên nó sẽ có ngay ở array hai. Tuyệt cú mèo!

characters[2] = "D";
console.log(characters)
console.log(copyCharacters)

// ["A", "B", "D"]
// ["A", "B", "D"]
  Object Prototype Javascript – Công cụ hỗ trợ OOP cho JS

3. Cuối cùng thì có gì sai với []

Đây, ngay lúc này empty array thứ nhất. Array thứ 2 có empty cùng luôn không?. Rất tiếc, câu trở lời là không!

characters = [];
// Là phiên bản copy ra, nhưng khi gán [] cho array 1, array 2 lại không refect theo.
console.log(characters)
console.log(copyCharacters)

// []
// ["A", "B", "D"]console.log(characters)

Tại sao?. Nguyên nhân nằm ở việc gán characters = [] thực chất CHỈ TẠO THÊM một instance javascript empty array gán cho characters. Chính vì thế copyCharacters không hề được affected sự empy này.

So when we say, array = [], [] is just a short hand way of allocating some space in memory with no data in it and so array will contain only the reference of the allocated memory space.

Chính vì vậy, khi ta gán array = [], đó là việc ta phân bổ một vùng mermory không có data, do đó mảng thực chất được tham chiếu tới tới không gian bộ nhớ 

Việc sử dụng [] trở nên cực kì nguy hiểm khi có array khác được sao chép ra từ array gốc. Dữ liệu được thao tác nhiều, handle các condition rendering trên screen.

Tìm việc làm Javascript mới nhất cho bạn

4. Làm thế nào để Javascript empty array đúng cách?

Đầu tiên, cách dễ dàng nhất, set length cho array là 1.

// Sử dụng length method là cách không thể dễ dàng hơn.
// Tuy nhìn không nuột như [] nhưng chất lượng thì hơn hẳn?.
characters.length = 0;
console.log(characters)
console.log(copyCharacters)

// []
// []

Cách thứ 2 thì hoa lá cành hơn. Sử dụng method splice của Javascript.

Method splice() chưa bao giờ là lựa chọn tồi. Nguồn/Source: javascripttutorial.net
// splice xem ra cũng là một lựa chọn không tồi!
characters.splice(0, characters.length);
console.log(characters)
console.log(copyCharacters)

// []
// []
  JavaScript Runtime Environment là gì?

5. Tham khảo

Chém gió vài hồi vậy thôi chứ đây là con bug tôi đã gặp và fix từ rất lâu.

Mong rằng bài viết này sẽ giúp các ông tránh lạm dùng [] khi muốn empty gì gì đó trong Javascript nhé. Tại sao lại “gì gì”?.

Vì object cũng thếchả khác gì array cả. Các ông cứ gán null cho nó mà xem! Rảnh thì tham khảo thêm một số bài viết dưới đây nha!

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

Xem thêm Việc làm IT Hà Nội, đà nẵng, hcm hấp dẫn trên TopDev

Những lập trình viên giỏi nhất thế giới đương đại – Phần 2

Những lập trình viên giỏi nhất thế giới đương đại – Phần 2

Bài viết được sự cho phép của smartjob.vn

Trong phần 2 này, các bạn hãy tiếp tục cùng Smartjob khám phá 5 gương mặt lập trình viên xuất sắc nhất để biết được họ đã làm gì, đã cống hiến những gì cho ngành công nghệ thông tin của nhân loại.

  10 câu nói cực hay về lập trình
  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java

Lập trình viên Doug Cutting – Nhà phát triển của Lucene

Những lập trình viên giỏi nhất thế giới đương đại – Phần 2

Phát triển công cụ tìm kiếm Lucene cũng như Nutch (một trình thu thập web) và Hadoop (một bộ công cụ cho quá trình thu thập các dữ liệu lớn). Bên cạnh đó, ông cũng là người đề xướng các mã nguồn mở (Lucene, Nutch, Hadoop tất cả đều sử dụng mã nguồn mở. Ông cũng từng là cựu giám đốc của Nền tảng phần mêm Apache.

Nhận xét:

“Ông là người đã tạo ra một khuôn khổ tìm kiếm đặc biệt (Lucene/Solr) và đem cổng dữ liệu lớn đến với thế giới (hadoop).” Rajesh Rao

“Sự sáng tạo của ông với các dự án Lucene và Hadoop (cùng với rất nhiều dự án khác) đã tạo ra lượng tài sản khổng lồ đồng thời đem đến cơ hội việc làm cho vô số người trên thế giới.” Amit Nithianandan

Lập trình viên Sanjay Ghemawat – Kiến trúc sư chính của Google

Những lập trình viên giỏi nhất thế giới đương đại – Phần 2

Thiết kế và điều hành những hệ thống phân phối lớn nhất của Google gồm có MapReduce, BigTable, Spanner và hệ thống file của Google. Tạo ra hệ thống lịch ical của Unix; được bầu vào Học viện kỹ thuật quốc gia trong năm 2009. Đoạt giải thưởng ACM – Infosys Foundation trong Khoa học máy tính năm 2012

Nhận xét: “Đó là người đồng đội của Jeff Dean” Ahmet Alp Balkan

Lập trình viên Jeff Dean – Bộ óc đằng sau công cụ lập chỉ mục tìm kiếm của Google

Jeff Dean là nhà khoa học máy tính và kỹ sư phần mềm của Google. Ông đã có công rất lớn trong việc thiết kế và triển khai nhiều hệ thống quy mô lớn của Google bao gồm tự động lấy dữ liệu, lập chỉ mục và tìm kiếm, AdSense, MapReduce, BigTable và Spanner. Được bầu vào Học viện kỹ thuật quốc gia 2009, đoạt giải ACM SIGOPS Mark Weiser và giải thưởng ACM-Infosys Foundation về Khoa học máy tính.

Nhận xét:

“… đã đem lại những đột phá trong khai thác dữ liệu (GFS, Map and Reduce, Big Table). ” Natu Lauchande

“Hình thành, xây dựng và triển khai MapReduce và BigTable và vô số những thứ khác” Erik Goldman

Lập trình viên Linus Torvalds – Nổi danh với Lunix

Tạo ra các hạt nhân của Linux và Git, hệ thống kiểm soát phiên bản nguồn mở. Trong quá trình làm việc, ông đã giành được rất nhiều giải thưởng và danh hiệu cao quý bao gồm giải thưởng EFF Pioneer năm 1998, Huy chương Lovelace cho việc phát triển Khoa học máy tính Anh năm 2000, Giải thưởng Công nghệ thiên nhiên kỷ nam 2012,….

Nhận xét:

“Để có được thành tựu này, ông đã nghiên cứu các hạt nhân Linux trong vài năm trong khi GNU Hurd (hạt nhân được phát triển bởi GNU) mất tới 25 năm để phát triển mà vẫn chưa chính thức được đưa vào sử dụng.” Erich Ficker

“Torvalds có lẽ là lập trình viên của mọi lập trình viên” Dan Allen

“Anh ấy đã hoàn thành sứ mệnh một cách xuất sắc” Alok Tripathy

Lập trình viên Carmack – Đồng sáng lập của Doom

Là người đồng sáng tạo ra phần mềm id và tạo ra các game ảnh hưởng bởi FPS như Wolfenstein 3D, Doom, Quake. Đi tiên phong trong các kỹ thuật máy tính mang tính đột phá như thích nghi làm mới ngói, phân vùng không gian nhị phân và bộ nhớ đệm bề mặt. Được giới thiệu vào Viện hàn lâm nghệ thuật và Khoa học Interactive Hall of Fame năm 2001, giành giải thưởng Emmy ở hạng mục Thiết kế và Công nghệ năm 2007 và 2008 đồng thời đoạt giải thưởng thành tựu trọn đời của Lựa chọn những sự phát triển game.

Nhận xét:

“ Anh ấy viết công cụ đầu tiên trước khi tròn 20 tuổi. Đó là một thiên tài. Tôi ước có thể làm việc một quý với lập trình viên tài ba đó.” Alex Dolinsky

“ Wolfenstein 3D, Doom, Quake là một cuộc cách mạng vào thời điểm đo và đã ảnh hưởng đến cả một thế hệ các nhà thiết kế game.” Dniblock

“ Ông có thể viết bất cứ thứ gì một cách cơ bản trong một ngày cuối tuần” Greg Naughton

“Ông là Mozart của mã hóa máy tính.” Chris Morris

Bài viết được dịch và tổng hợp từ ITWorld

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

Có thể bạn quan tâm:

Tìm việc IT lương cao, đãi ngộ tốt trên TopDev

Cấu hình JSP views trong InternalResourceViewResolver với Spring Boot JAR file

Cấu hình JSP views trong InternalResourceViewResolver với Spring Boot JAR file

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

Các tập tin JSP, thông thường được sử dụng với InternalResourceViewResolver, có một số limitation khi sử dụng trong các ứng dụng Spring Boot. Theo như documentation của Spring Boot https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.developing-web-applications.embedded-container.jsp-limitations thì JSP file sẽ chỉ work với Tomcat và Jetty server và sẽ chỉ work là WAR file thôi, không work với JAR file. Thế nhưng, thực tế thì chúng ta cũng có cách để make it work với JAR file. Trong bài viết này, mình sẽ hướng dẫn các bạn cách cấu hình JSP views trong InternalResourceViewResolver với Spring Boot JAR file các bạn nhé!

  Cài đặt Spring Boot CLI
  Spring Boot là gì? Demo dự án Spring Boot trong 5 phút

Mình sẽ tạo mới một Spring Boot project:

Cấu hình JSP views trong InternalResourceViewResolver với Spring Boot JAR file

Cấu hình JSP views trong InternalResourceViewResolver với Spring Boot JAR file

và sử dụng InternalResourceViewResolver cho ví dụ này.

Mình sẽ thêm tomcat-embed-jasper dependency:

<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>

và một controller:

package com.huongdanjava.springboot.internalresourceviewresolver;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {

@RequestMapping("/hello")
public String home() {
return "home";
}
}

Tập tin view home.jsp với nội dung như sau:

Hello World!

sẽ không được tạo trong thư mục /src/main/webapp/WEB-INF/views nữa, Spring Boot khi build sẽ không include thư mục này trong JAR file. Các bạn cần tạo nó trong thư mục src/main/resources/META-INF/resources/WEB-INF/views như sau:

Thư mục src/main/resources/META-INF/resources/ sẽ work giống như thư mục src/main/webapp đó các bạn!

Bây giờ thì mình sẽ khai báo trong application.properties như sau:

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

Kết quả khi chạy ứng dụng:

Cấu hình JSP views trong InternalResourceViewResolver với Spring Boot JAR file

Cryptology “giải phóng” tư duy bó buộc trong lập trình

mật mã học trong lập trình
Cryptology “giải phóng” tư duy bó buộc trong lập trình

Về diễn giả

  • Anh Nguyễn Đạt Thông, hiện đang công tác tại công ty LogiGear Vietnam ở vị trí quản lý công nghệ.
  • Công việc chính là quản lý các công nghệ, các kỹ thuật hoặc các ngôn ngữ lập trình, cũng như tham gia vào các dự án của khách hàng. Tìm hiểu, đánh giá và tư vấn cho khách hàng việc sử dụng công nghệ sao cho phù hợp nhất để đạt được hiệu suất cũng như chất lượng sản phẩm cao nhất.

Vì sao anh quyết định chuyển từ chuyên ngành Toán Tin sang Mật mã học?

Ngày xưa cũng không có nhiều trường để lựa chọn, lúc đó mình học rất khá môn toán và lại thích tin học nên mình quyết định thi vào khoa Toán Tin của trường Đại học Khoa học Tự nhiên TP. HCM. Mình học ở đây 4 năm, điểm đặc biệt ở khoa này đó là mình sẽ được học cân bằng cả hai lĩnh vực vừa Toán học vừa Tin học, nên giúp cân bằng được sở thích và đam mê của mình. Trong quá trình học ở đây mình nhận ra là toán học tốt thì sẽ là nền tảng giúp mình học tin rất nhanh.

Sau đó mình lại có thiên hướng về học tin, mình học về kiến trúc máy tính, về việc lập trình,… dần dần mình nhận thấy bản thân thích hợp với ngành này hơn. Còn việc quyết định theo đuổi Mật mã học là khi mình đang học cao học. Khi bắt đầu học cao hơn, học chuyên sâu về máy tính thì mình lại hiểu hơn về mật mã học, nó khai sáng tư duy mà trước giờ mình vẫn luôn bó buộc. Trước giờ mình cứ nghĩ lập trình là những con số, những số liệu đó mình làm, nhưng khi làm quen với mật mã mình thấy nó không đúng nữa.

Tưởng tượng như lúc trước mình học toán Ơclit trong một không gian nhỏ thì sẽ đúng, nhưng với không gian lớn hơn, ra ngoài vũ trụ thì lại không đúng nữa. Mật mã học cũng như vậy, lập trình những thuật toán nho nhỏ, những số input nho nhỏ thì thấy đúng nhưng khi làm với những số lớn, cực lớn thì nó không chạy được. Khám phá được những điều đó dần dần mình thấy rất thích ngành này và theo đuổi nó, mình cũng hoàn thành luận văn thạc sỹ với chuyên ngành này luôn.

Những kiến thức chuyên ngành Mật mã học có giúp gì cho công việc hiện tại của anh không?

Có rất nhiều nữa là khác đó. Mặc dù khi nói đến mật mã học trong lập trình sẽ thấy trong lúc lập trình, coding hay testing nếu không để ý sẽ không thấy nó nằm ở đâu cả, nhưng thật ra trong tất cả các công việc lập trình của mình, chúng ta đều phải sử dụng tất cả các kiến thức về mật mã học.

Chẳng hạn nếu các bạn cứ sử dụng web, nếu mình không học và không có những kiến thức về mật mã, sẽ không thể hình dung và rất khó hiểu nó là gì. Hay chẳng hạn khi làm về backend, setup một servicate cho web server của mình, nếu không biết mật mã sẽ rất mơ hồ về khái niệm servicate là gìprivatekey là gì, mật mã nằm sâu bên dưới những cái này.

Sau này khi làm việc trong thế giới công nghệ thông tin mình sẽ biết mã hack, và nhiều vấn đề khác, nếu không thể hiểu mục đích của nó sinh ra làm gì. Trong khi đó, việc học và hiểu được mã hóa thông tin sẽ nắm những thứ này rất vững. Hiện tại nếu làm trên web nhiều sẽ thấy có một khái niệm gọi là token.

Có rất nhiều thứ liên quan đến token, trong facebook cũng có hoặc đăng nhập vô google nó cũng setup cho mình một token, sử dụng Cloud Amazon cũng có token. Vậy token từ đâu mà ra? Nếu mình không có kiến thức nền tảng về mật mã thì sẽ rất khó hiểu những chuyện này. Thật sự là sau khi học được nền tảng về mật mã học, mình thấy nó giúp ích rất nhiều cho công việc.

Vì sao anh lại chọn Java và .NET để học thêm sau khi tốt nghiệp?

Mình bắt đầu học chúng vào khoảng cuối những năm 2000. Lúc đó mình mới ra trường khoảng 3 – 4 năm, vẫn đi làm với tư cách là dev bình thường. Sau khi đi làm, bản thân mới nhận ra kiến thức mình học trong trường rất cơ bản và thiếu hụt nhiều nên mình mới quyết định đi học thêm.

Thời điểm đó điện thoại di động chưa phát triển nhiều nên mình không có những khóa học về điện thoại di động nhiều mà chủ yếu là làm web rất nhiều, kiểu như enterprise, các ứng dụng về web và nhiều thứ liên quan. Cũng lúc đó có 2 công nghệ nổi bật là Java và .NET nên mình quyết định học. Học để hiểu được những ứng dụng enterprise nó cần những điều kiện gì, kiến thức và kĩ thuật gì để làm nên nó.

Mình đã học về các công nghệ của Microsoft và Oracle bao gồm cả database, web server và cả lập trình web cho các hệ thống đó và mình thấy nó như nền tảng để phát triển những vấn đề khác. Như khi gặp khách hàng để tương tác, tư vấn về những hệ thống enterprise bạn sẽ tự động hiểu được nó gồm những thành phần gì, cấu trúc như thế nào, kiến trúc ra sao, gồm những cơ sở dữ liệu tập trung hay phân tán. Nhưng mình thấy khi đi làm sẽ học nhanh nhất và tốt nhất.

  8 công cụ miễn phí để bảo mật khi lập trình phần mềm
  Tổng hợp về WannaCry cho người không biết gì

Anh có thể giới thiệu đôi chút về công ty hiện tại anh đang làm việc được không?

LogiGear có xuất phát từ Mỹ, chuyên làm các dịch vụ về kiểm thử, dịch vụ chính của công ty liên quan đến các hoạt động bảo đảm chất lượng phần mềm cho khách hàng. Công ty cung cấp các dịch vụ khác nhau như tư vấn và giúp khách hàng nâng cao năng suất và chất lượng sản phẩm lên bằng cách giúp họ kiểm thử sản phẩm, thiết kế các quy trình làm việc hiệu quả hơn hoặc giúp khách hàng lựa chọn những công nghệ phù hợp để làm việc được hiệu quả nhất.

LogiGear đang là công ty tiên phong trong lĩnh vực kiểm thử ở Việt Nam, sau này cũng đã có thêm nhiều công ty làm về lĩnh vực này. Nhưng cá nhân mình vẫn thấy LogiGear là môi trường rất tốt để đào tạo các ngành nghề trong lĩnh vực kiểm thử. LogiGear có điểm mạnh riêng đó là kiểm thử tự động, công ty tự xây dựng phần mềm kiểm thử tự động dựa trên kỹ thuật, phương pháp đặc trưng của công ty, đặc biệt hiệu quả cho các dự án kiểm thử lớn.

Vì trong kiểm thử tự động có một đặc điểm là nếu không để ý sẽ dễ thất bại, tức là làm tự động thì rất dễ nhưng làm nhiều thì sẽ rất khó, khó hơn hẳn. Ví dụ mình cần tự động 1, 2 test hay 100 test thì rất dễ, hầu như tool nào, công ty nào cũng làm được. Nhưng nếu được giao 1 dự án có 10000 test case, việc tổ chức, cài đặt, chạy thử một thời gian sẽ rất rối, rất phức tạp. Và phương pháp của LogiGear là để dành cho các dự án như vậy.

Công cụ được LogiGear sử dụng là test architect, được phát triển dựa trên nguyên lí của phương pháp này. Hiện tại đây đang là một tool phổ biển trong thị trường test nhưng đặc biệt là chỉ phổ biến cho những doanh nghiệp lớn vì mình hướng đến những dự án “khủng”.

Xem thêm Muốn làm an toàn thông tin tại Việt Nam thì học gì?

Khi chuyển hướng sang automation testing, anh có gặp khó khăn hay thử thách gì không?

Thật ra lúc mới bắt đầu mình cũng khá là bỡ ngỡ. Lúc mới sang LogiGear lần đầu tiên mình nhìn thấy tool chạy tự động mà có cảm giác nó như một ma thuật vậy. Lúc đó mình rất thích việc automate cho máy tính chạy. Mình làm quen với rất nhiều công nghệ, nhiệm vụ ở công ty là cố gắng để nâng cao năng suất làm việc của khách hàng. Khi khách hàng cần test 100 test key một ngày muốn tăng lên thành 1000 test key 1 ngày thì phải tự động hóa nó. Khi tự động mình cần hiểu phần mềm mà khách hàng đang viết rồi mới tìm cách tự động nó được.

Mà những vấn đề khách hàng viết thì muôn hình vạn trạng, rất nhiều công nghệ, rất nhiều kỹ thuật, rất nhiều nền tảng. Có khách hàng thì viết trên Windows, có người viết trên Linus, .NET, Java, sau này còn có khách hàng phát triển ứng dụng trên iOS, trên Android,… Nên khi bắt đầu công việc này mình cảm thấy sẽ có rất nhiều điều mới cần học. Mình tự xác định với bản thân là không cần học sâu vào một công nghệ nào hết mà cần học nhiều, lĩnh vực nào cũng cần học qua, còn khi nào cần mình sẽ học sâu một công nghệ để làm đúng dự án cho khách hàng. Đó cũng là điều đặc biệt nhất của ngành automation.

Anh có thể chia sẻ vài kinh nghiệm thú vị liên quan đến state – of – art tricks được chứ?

Tất nhiên khi làm trong ngành automation sẽ có rất nhiều tricks, mình đã từng làm việc nhiều với các tricks như vậy, trong đó có 2 cái mình vẫn còn nhớ.

Vấn đề thứ nhất liên quan đến iphone. Lúc đầu bên mình bắt đầu với android, nó khá mở nên mình có thể làm nhiều công việc trên đó, cho đến khi iphone ra đời tính bảo mật của nó rất cao. Lúc đó mình làm trên iOS 6, mọi thứ đều đóng kín và tài liệu cũng rất ít, API Apple cung cấp cũng rất hạn chế, mình không được can thiệp vào process, không được can thiệp vào hệ điều hành vì thế nên không thể tự động ứng dụng của họ được.

Mình nhớ lúc đó cả team lật tung internet lên để tìm thông tin, tìm các trang developer, thậm chí là sử dụng tool để dịch ngược lại thư viện của Apple để xem có những API, những hàm nào. Khi đó team phát hiện ra những API ẩn, tức là Apple viết hàm đó nhưng không đưa ra documentation, nó đặc biệt giúp ích cho mình nếu muốn can thiệp vô ứng dụng của họ. Chẳng hạn bây giờ có ai đó phát hiện ra lỗ hổng của Firefox và cài 1 đoạn mã vô đó, mình cũng phát hiện ra những lỗ hổng của iOS 6, cài vào các agent để hỗ trợ cho việc kiểm thử tự động và kết hợp với một số kĩ thuật khác mình đã tự động hóa được nó.

Mình nhớ sự kiện đó như là việc lần đầu tiên công ty mình làm được, tạo được tool để tự động trên iOS 6, nó rất độc đáo và mình cảm thấy hào hứng với việc đó. Tuy nhiên vì là lỗ hổng nên mình tìm và khai thác nó nhưng khi lên đến iOS 7, người ta sẽ dấu hẳn những API đó đi và solution của mình sẽ không thể sử dụng được nữa, mình lại phải mày mò, nghiên cứu tìm một giải pháp khác và cứ phải tiếp tục các công việc như vậy.

Kỷ niệm thứ 2 mình cũng nhớ rất thú vị là mình hỗ trợ khách hàng tự động hóa việc kiểm thử POS. Hệ thống POS thực chất cũng là một hệ thống phần mềm chạy trên máy tính. Giờ họ muốn tăng năng suất, muốn test nhanh hơn thì bắt buộc phải tự động hóa nó. Lúc đó team mình phải tập trung tìm hiểu về Linux, driver trên Linux, ex server và vận dụng rất nhiều kỹ thuật khác để cuối cùng làm được một bộ tự động giúp chạy hệ thống POS đó.

Khi bắt đầu kiểm tra, thay vì có một người phải cầm sản phẩm quét mã code thì bây giờ trên máy tính đã được giả lập luôn việc đó giống như có người đang quét qua thì hệ thống POS sẽ nhận được thông tin vừa có một sản phẩm quét qua. Rồi thay vì một người phải đưa món hàng lên cân cân và coi nó giá bao nhiêu tính tiền thì giờ đây hệ thống cũng tự động làm luôn chuyện đó.

Và thêm nữa khi mình in hóa đơn sẽ cần kiểm tra xem đã đúng sản phẩm chưa, đúng số lượng chưa, vậy mình nghĩ làm sao để những việc này tự động thực hiện. Thế là team mình triển khai việc tự giả lập máy in luôn, nghĩa là hệ thống in ra cái gì mình đều biết hết và có thể kiểm tra những thông tin đó luôn.

Anh có thể chia sẻ thêm về công cụ TestArchitect mà anh đã đề cập khi nãy được chứ?

TestArchitect là một sản phẩm kiểm thử tự động dựa trên phương pháp action page testing – phương pháp đặc trưng của công ty LogiGear. TestArchitect chuyên sử dụng cho các dự án kiểm thử tự động lớn vì khách hàng của công ty cũng hướng đến những công ty có các sản phẩm kiểm thử lớn, số lượng test key cần thực hiện và chạy mỗi ngày rất nhiều, tool cũng dựa trên nguyên lí của phương pháp này.

Tool này đã được phát triển khoảng 11 – 12 năm với rất nhiều công nghệ từ xa xưa cho đến nay. Cứ trên thế giới xuất hiện 1 phương pháp, 1 công nghệ để phát triển phần mềm mới thì tool sẽ tích hợp vào. Từ lúc bắt đầu tool có thể kiểm thử iOS 6 rồi đến 7, 8, 9,… android cũng tương tự. Qua mỗi thế hệ android sẽ có rất nhiều các thay đổi và cần phải thích nghi với điều đó. Hoặc mới đây có thêm React, React Angular JS những công nghệ mới như thế cũng cần làm sao để tool adapt theo để giúp khách hàng test được.

Anh có gặp khó khăn hay thử thách gì trong quá trình xây dựng công cụ đó không?

Thử thách lớn nhất có lẽ là việc mình phải luôn thích ứng với những công nghệ mới. Mỗi khi có công nghệ mới ra đời, mình phải chủ động mày mò, nghiên cứu để làm sao có thể làm chủ công nghệ đó, đồng nghĩa với việc mình dùng những công nghệ đó để điều khiển các phần mềm khác.

Khó khăn ở chỗ khách hàng thì luôn thích những công nghệ mới mà điểm bất lợi là cái gì mới thường các tài liệu liên quan đến nó sẽ rất ít. Do đó, việc quan trọng là phải mày mò, tìm kiếm rất nhiều để nắm được nguyên lí của công nghệ đó cũng như tìm các tricks, các state-of-art để xử lý nó. Đó chính là khó khăn lớn nhất của mình, nhưng tới hiện tại mình và công ty đều đang làm rất tốt chuyện đó, hầu như công nghệ mới nào tool của công ty cũng hỗ trợ rất tốt.

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Nên làm việc ở công ty Product hay công ty Outsourcing?

Nên làm việc ở công ty Product hay công ty Outsourcing?

Bài viết được sự cho phép của blogchiasekienthuc.com

Đối với những anh em làm về phần mềm chắc có lẽ không còn xa lạ gì với hai khái niệm đó là công ty “Product” và công ty “Outsourcing” nữa rồi đúng không.

Có thể nói thì đây là hai hướng đi có nhiều điểm đối lập nhau, mà nhiều anh em trong ngành vẫn thường “tranh cãi” rất nảy lửa.

Công ty Product là công ty làm sản phẩm và sống dựa vào việc bán sản phẩm hoặc dịch vụ liên quan đến sản phẩm đó. Còn ngược lại, công ty Outsource là công ty làm phần mềm thuê cho người khác/ đơn vị khác…

Và ở trong bài viết này, mình sẽ đưa ra một vài lý do để anh em làm lập trình cân nhắc việc chọn lựa một công ty Product để làm việc thay vì công ty Outsource.

  "Dân làm Product khác hoàn toàn 180 độ với dân làm outsourcing"
  Chuyện bi kịch của công ty code outsourcing

#1. Được sáng tạo nhiều hơn

Nên làm việc ở công ty Product hay công ty Outsourcing?

Có thể nói, sáng tạo chính là linh hồn và cũng là tôn chỉ của các công ty làm produdct. Đơn giản vì nếu sản phẩm bạn làm ra không có gì mới mẻ, không có gì sáng tạo thì sẽ chẳng có ma nào dùng cả.

Quay trở lại với các công ty outsource, chúng ta đều biết rằng công việc chủ yếu mà họ nhận là các dự án của khách hàng, tìm hiểu nghiệp vụ rồi gia công theo yêu cầu của họ.

Từ Developer cho đến Designer hầu như không được làm theo sự sáng tạo của mình. Đôi khi biết rõ chỗ này nên làm như thế này mới tốt, nhưng vì khách hàng họ không thích, họ yêu cầu khác nên buộc phải làm theo ý của họ.

Nhất là các công ty outsource cho Nhật thì điều này càng đúng hơn, họ yêu cầu mức độ chính xác cao và rất chuyên nghiệp. Đôi khi bạn “không được phép” sáng tạo khi chưa được sự cho phép của họ. Khổ thế đấy 🙂

Ngược lại, các công ty product lại rất khuyến khích nhân viên của mình tự do sáng tạo, đóng góp ý kiến, xây dựng sản phẩm theo hướng tích cực.

Nguyên nhân đơn giản là càng có nhiều sự đóng góp thì sản phẩm sẽ càng được hoàn thiện hơn. Hai nữa là, khi được làm việc theo sự sáng tạo thì đội ngũ phát triển họ thường làm rất tốt và làm bằng tất cả năng lực mà họ có => mục đích là để chứng minh rằng ý tưởng của họ là đúng.

#2. Có trách nhiệm hơn với những gì mình làm

Chắc hẳn anh em nào làm outsouce cũng hiểu rõ một điều là, cái mà anh em đang làm – là làm cho thằng khác.

Nên làm việc ở công ty Product hay công ty Outsourcing?

Nếu là một người có trách nhiệm không cao, chỉ quan tâm tới lương cuối tháng thì mình cá là nhiều anh em làm outsource thường rất cẩu thả trong công việc, làm cho xong, khách hàng mà có phàn nàn thì sửa lại sau.. Đấy, toàn thế thôi !

Mà với cái tâm lý đó, dù anh em làm ở công ty nào thì nó cũng đang dần giết chết sự sáng tạo anh em mà thôi !

Ngược lại, khi làm việc ở các công ty product thường anh em sẽ phải chịu trách nhiệm cho sản phẩm mà mình làm ra.

Nó giống như đứa con tình thần mà anh em bắt buộc phải có trách nhiệm xây dựng và phát triển nó một cách tốt nhất có thể.

Không những vậy, nếu anh em là người trực tiếp lập trình và thiết kế cho sản phẩm đó thì mình tin chắc là anh em còn phải nghĩ ra từng chức năng mình đang làm, để xem liệu nó có tiện cho người dùng hay không, có thực sự cần thiết hay không, có cần bổ sung thêm gì không..?

Tất cả những điều đó buộc các anh em làm product phải có trách nhiệm thực sự. Không chỉ là với sản phẩm họ đang làm, mà là với cả người dùng sẽ sử dụng sản phẩm đó nữa.

#3. Làm nhiều sẽ học hỏi được nhiều hơn

Nên làm việc ở công ty Product hay công ty Outsourcing?

Lại so sánh một chút với các công ty outsource, thì anh em biết đấy, khi làm outsource hầu như anh em sẽ không được làm nhiều. Chủ yếu tập trung vào 1-2 modul của sản phẩm mà thôi.

Điều đó có thể khiến anh em có chuyên môn rất cao trong modul đó, nhưng khi phải làm việc với các modul khác thì anh em lại lơ ngơ như lính mới vậy.

Ngược lại, nếu làm ở các công ty product (đặc biệt là những công ty mới thành lập (start-up)) thì đảm bảo anh em sẽ được làm từ A đến Á luôn.

Đọc đến đây nhiều người sẽ phản biện lại là, thà chuyên sâu một cái, còn hơn là cái gì cũng biết mà thực ra chẳng biết mẹ gì?

Đúng là như vậy ! Nhưng hãy nhìn xa hơn một chút, kiến thức công nghệ đang thay đổi hàng ngày. Nếu anh em cứ khư khư một công nghệ, chuyên sâu một cái mà không để ý đến những công nghệ khác thì sớm muộn cũng bị tụt lại phía sau mà thôi.

Làm sản phẩm thì anh em được làm, được học, được sai và trong quá trình làm sản phẩm anh em có thể nắm rõ quy trình và làm nhiều modul của sản phẩm => từ đó hình thành tư duy sản phẩm tốt hơn.

#4. Rèn luyện tư duy về làm sản phẩm

Nên làm việc ở công ty Product hay công ty Outsourcing?

Như mình đã đề cập bên trên, việc làm ở công ty sản phẩm sẽ giúp anh em rèn tư duy làm sản phẩm tốt hơn.

Vậy thế nào là tư duy làm sản phẩm? Thực ra thì cũng chẳng có gì khó hiểu cả, rất đơn giản đó là: “tự mình làm và có trách nhiệm với cái mình làm”. Thế thôi !

Đôi khi tư duy làm sản phẩm nó giống như tư duy làm chủ, nghĩa là bạn phải làm chủ cái bạn đang làm, cái bạn đang phát triển.

Người có tư duy sản phẩm là người luôn muốn phát triển các sản phẩm của riêng mình, tự làm nó và đem nó đi bán để đem về lợi nhuận.

Nói chung, làm việc tại một công ty làm sản phẩm bạn sẽ học được tư duy làm sản phẩm từ những người khác. Biết đâu chính tư duy đó sau này sẽ thôi thúc bạn tự phát triển một sản phẩm của riêng bạn thì sao.

#5. Cơ hội lương cao

Đến đây chắc nhiều anh em lại bảo: làm sản phẩm thì lương lấy đâu ra mà cao. Thậm chí làm ở mấy công ty start-up còn không đủ tiền ăn nữa là…

Điều này thì mình cũng không phủ nhận hoàn toàn, vì làm ở các công ty outsource thường sẽ có mức thu nhập khá là ổn định, thậm chí còn nhỉnh hơn các công ty sản phẩm trong những năm đầu.

Nhưng đó chính là cái giá của sự đánh đổi khi bạn xác định đi theo một công ty làm sản phẩm. Lúc đầu có thể lương chẳng đủ ăn, nhưng hãy kiên trì, nếu sản phẩm mà bạn làm ra được người dùng đón nhận thì lúc đó tiền chẳng còn là vấn đề nữa.

Chính vì vậy mình chỉ có thể nói đó là cơ hội mà thôi, làm sản phẩm đôi khi nó mạo hiểm nhưng mọi thứ đều có cái giá của nó. Việc của bạn là cố gắng hết mình thôi !

#6. Lời kết

Thực ra, việc lựa chọn một công ty làm sản phẩm (Product) hay một công ty outsouce còn phụ thuộc vào tính cách của mỗi người nữa.

Có người thích sự ổn định, ngày làm tám tiếng lương 10 triệu. Có người lại thích mạo hiểm, ham học hỏi, dám đánh đổi để lao đầu vào một công ty start-up non trẻ. Vất vả nhưng cơ hội thăng tiến cao, cơ hội giữa kiếm tiền nhiều và ăn mỳ gói qua ngày là như nhau 🙂

Mọi việc đều có cái giá của nó, nếu bạn biết tính toán thì bạn sẽ lời, còn không thì sẽ lỗ thôi. Xin chào và hẹn gặp lại anh em trong các bài viết tiếp theo nha !

Nguyễn Đức Cảnh – Bài viết gốc tại blogchiasekienthuc.com

Có thể bạn quan tâm:

Xem thêm tìm việc làm it lương cao hấp dẫn trên TopDev

Date & Time trong Python

Date & Time trong Python

Bài viết được sự cho phép của tác giả Nguyễn Chí Thức

Với Python, bạn có thể dễ dàng thu được Date và Time hiện tại. Chương này sẽ giới thiệu một số phương thức được phổ biến trong khi làm việc với Date và Time bởi sử dụng Python.

Lấy Time hiện tại trong Python

Để lấy Time hiện tại, bạn sử dụng hàm tiền định nghĩa localtime(). Hàm localtime() này nhận một tham số là time.time(). Ở đây, time là module, time() là một hàm mà trả về system time hiện tại được biểu diễn dưới dạng số tick (số tích tắc) từ 12:00 am, 1/1/1970. Về cơ bản, tick là một số thực.

import time;
localtime = time.localtime(time.time())
print "Thoi gian hien tai la :", localtime

Kết quả là:

Thoi gian hien tai la : time.struct_time(tm_year=2015, tm_mon=11, tm_mday=29, tm_hour=19, tm_min=16, tm_sec=54, tm_wday=6, tm_yday=333, tm_isdst=0)

Dưới đây là phần giải thích:
Time được trả về là một cấu trúc gồm 9 thuộc tính. Như trong bảng sau:

Thuộc tính Miêu tả
tm_year Trả về năm hiện tại (ví dụ: 2015)
tm_mon Trả về tháng hiện tại (1-12)
tm_mday Trả về ngày hiện tại (1-31)
tm_hour Trả về giờ hiện tại (0-23)
tm_min Trả về phút hiện tại (0-59)
tm_sec Trả về giây hiện tại (0-61 với 60 và 61 là các dây nhuận)
tm_wday Trả về ngày trong tuần (0-6 với 0 là Monday)
tm_yday Trả về ngày trong năm (1-366 kể cả năm nhuận)
tm_isdst Trả về -1, 0 hoặc 1 tức là có xác định DST không

Lấy Time đã được định dạng trong Python
Bạn có thể định dạng bất kỳ time nào theo yêu cầu của bạn, nhưng phương thức đơn giản nhất là asctime(). Đây là một hàm đã được định nghĩa trong time module. Hàm này trả về một time đã được định dạng bao gồm ngày trong tuần, tháng, ngày trong tháng, thời gian và năm. Ví dụ:

import time;

localtime = time.asctime( time.localtime(time.time()) )
print "Thoi gian da duoc dinh dang la :", localtime

Kết quả là:

Thoi gian da duoc dinh dang la : Sun Nov 29 19:16:30 2015
  Date & Time trong Python
Phần 9 : Kết nối MySQL”]

time module trong Python

Có nhiều hàm được định nghĩa sẵn trong time Module mà bạn có thể được sử dụng để làm việc với time.

STT Hàm và Miêu tả
1 Hàm time.altzone trả về offset của DST timezone (số giây)
2 Hàm time.asctime([tupletime]) Chấp nhận một time-tuple và trả về một chuỗi gồm 24 ký tự có thể đọc được ví dụ như Mon Dec 11 18:07:14 2015
3 Hàm time.clock( ) Trả về CPU time hiện tại dưới dạng số giây dạng số thực
4 Hàm time.ctime([secs]) Giống asctime(localtime(secs)) và nếu không có tham số thì giống như asctime( )
5 Hàm time.gmtime([secs]) Chuyển đổi một time được biểu diễn là số giây từ epoch sang một struct_time trong UTC
6 Hàm time.localtime([secs]) Tương tự như gmtime(), nhưng nó chuyển đổi số giây thành local time.
7 Hàm time.mktime(tupletime) Là ngược với hàm localtime(). Trả về một số thực để tương thích với time()
8 Hàm time.sleep(secs) Dừng trình thực thi trong số giây đã cho là secs
9 Hàm time.strftime(fmt[,tupletime]) Chuyển đổi một tuple hoặc struct_time thành một chuỗi được xác định bởi tham số format
10 Hàm time.strptime(str,fmt=’%a %b %d %H:%M:%S %Y’) Parse một chuỗi biểu diễn time theo một định dạng đã cho
11 Hàm time.time( ) Trả về time dưới dạng một số thực được diễn đạt bởi số giây từ epoch, trong UTC
12 Hàm time.tzset() Phục hồi các qui ước về thời gian được sử dụng bởi các chương trình con của thư viện. Biến môi trường TZ xác định cách được thực hiện

Có hai thuộc tính quan trọng có sẵn với time Module là:

time.timezone: Thuộc tính time.timezone là số giây trong local timezone (không DST) từ UTC (>0 trong Americas; <=0 trong Europe, Asia, Africa).

time.tzname: Thuộc tính time.tzname là một cặp các chuỗi biểu diễn locale và biểu diễn phụ thuộc, mà tương ứng là tên của local timezone với và không với DST.

  11 tip học Python dành cho các “newbie”

calendar Module trong Python

Python cung cấp calendar Module để giúp bạn hiển thị Calendar. Ví dụ:

import calendar
print "Thang hien tai la:"
cal = calendar.month(2014, 6)
print cal

Kết quả là:

Thang hien tai la:
   November 2015
Mo Tu We Th Fr Sa Su
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

Có rất nhiều hàm và phương thức đã được xây dựng sẵn trong calendar Module giúp bạn làm việc với Calendar. Dưới đây là một số hàm và phương thức:

Hàm Miêu tả
Hàm prcal(year) In cả calendar của năm
Hàm firstweekday() Trả về ngày trong tuần đầu tiên. Theo mặc định là 0 mà xác định là Monday
Hàm isleap(year) Trả về true nếu năm đã cho là năm nhuận, nếu không là false
Hàm monthcalendar(year,month) Trả về một list gồm các ngày trong tháng đã cho của năm dưới dạng các tuần
Hàm leapdays(year1,year2) Trả về số ngày nhuận từ năm year1 tới năm year2
Hàm prmonth(year,month) In ra tháng đã cho của năm đã cung cấp

Dưới đây là ví dụ cho một số hàm:

Hàm firstweekday()

import calendar
print calendar.firstweekday()

Kết quả là:

0

Hàm isleap(year)

import calendar
print calendar.isleap(2000)

Kết quả là:

True

Hàm monthcalendar(year,month)

import calendar
print calendar.monthcalendar(2015,11)

Kết quả là:

[[0, 0, 0, 0, 0, 0, 1], [2, 3, 4, 5, 6, 7, 8], [9, 10, 11, 12, 13, 14, 15], [16, 17, 18, 19, 20, 21, 22], [23, 24, 25, 26, 27, 28, 29], [30, 0, 0, 0, 0, 0, 0]]

Hàm prmonth(year,month)

import calendar
print calendar.prmonth(2015,11)

Kết quả là:

   November 2015
Mo Tu We Th Fr Sa Su
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
None

Chúc các bạn thành công!

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

Xem thêm việc làm python hấp dẫn trên TopDev