Home Blog Page 98

Fix Lỗi: “405 – HTTP Verb Used To Access This Page Is Not Allowed”

fix lỗi 405

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

Dấu hiệu lỗi

Không thể sử dụng các phương thức HTTP DELETE, PUT hoặc PATCH với các tệp .php hoặc API Web. Thông báo lỗi sau xuất hiện trong trình duyệt:

405 - HTTP verb used to access this page is not allowed. The page you are looking for cannot be displayed because an invalid method (HTTP verb) was used to attempt access

Nguyên nhân

Khai báo các phương thức của PHP chưa được xác định, chúng ta cần khai báo lại. Trong bài viết này mình sẽ hướng dẫn fix trên IIS Server.

  Fix Lỗi "RDP Authentication Error Has Occurred – The Function Requested Is Not Supported"
  Fix Lỗi FTP Client Windows Server "Current Security Settings Do Not Allow This File To Be Downloaded"

Phương án xử lý

  1. Remote vào server sử dụng Remote Desktop Connection
  2. Chọn Internet Information Services (IIS) Manager at Windows Start > All Programs > Windows Administrative Tools.
  3. Trong IIS Manager, chọn vào SERVERNAME > Sites >Click đúp vào site của bạn.
  4. Trong màn hình chính, Chọn Handler Mappings > chọn tiếp PHP-php (hoặc ExtensionlessUrl-Integrated-4.0 nếu là Web API) > chọn Request Restrictions > chuyển qua Verbs tab.
  5. Thêm các phương thức PHP (DELETE, PUT or PATCH) vào field sau đó click OK.

  1. Nếu vẫn chưa được thì chú ý mục “Executable (Optional)”. Đặt đường dẫn trong ô đó vào trong dấu “ “.
  2. Click OK. -> Restart website của bạn.

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

Mình đã học kotlin như thế nào?: Phần 1: từ 1 dev IOS nhảy sang dev android

Mình đã học kotlin như thế nào?

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

Mình làm việc với IOS, cụ thể là dev objective-c và swift cũng được một thời gian, nên các kiến thức về IOS cũng kha khá. Một ngày đẹp trời giữa bão COVID-19, ở nhà làm việc remote, nên có nhiều thời gian để ngồi đọc và ngâm cứu các công nghệ khác hơn, mình quyết định “giao lưu” với Android 1 chút, cụ thể là Kotlin. Lý do chọn Kotlin là vì nó hao hao giống Swift, nên việc tiếp cận có vẻ dễ dàng hơn khi dùng java. Tất nhiên java vẫn được, mình cũng đã code nó trước đây.

  Có nên học Kotlin?
  Phát triển lập trình Android cùng Kotlin

Đầu tiên là thằng bạn nhờ dev hộ 1 con App trên mobile, và mình tự thiết kế giao diện bằng figma như sau:

Trông khá “sexy” với 1 người không chuyên designer đúng không

App thì có cả IOS và android, và sau đó mình quyết định làm cho android trước. Vì cơ bản mình muốn thử sức với cái “chưa biết gì”, như tờ giấy trắng trước. Cuộc sống mà, tính mình lại thích cái mới mẻ.

Vậy bên android công nghệ cái gì là “ngon” nhất bây giờ? Sau một hồi nghiên cứu, google, mình phát hiện ra “Ồ, ông google này chăm sóc dev kỹ thế 🤩” Cụ thể như sau:

Mô hình kiến trúc như sau:

Nhìn vào hình, ta chuyển thành cấu trúc thư mục tương ứng(thật ra là khá mơ hồ nếu chúng ta không đặt tay lên bàn phím và code:

Mình lấy cái ví dụ màn hình login ở trên cho dễ hiểu nhé:

Đầu tiên các bạn cài các thư viện cần thiết để code:

def lifecycle_version = "2.2.0"
    def room_version = "1.1.1"

    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.core:core-ktx:1.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

    implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
    implementation "android.arch.persistence.room:runtime:$room_version"
    annotationProcessor "android.arch.persistence.room:compiler:$room_version"

    implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
    annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"

    implementation "androidx.recyclerview:recyclerview:1.1.0"
    implementation "androidx.cardview:cardview:1.0.0"


    def retrofit_version = "2.6.2"
    implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
    implementation "com.squareup.retrofit2:converter-gson:$retrofit_version"

    implementation 'com.google.android.material:material:1.1.0'
    implementation 'com.google.android.gms:play-services-vision:19.0.0'

    def preference_version = "1.1.0"
    implementation "androidx.preference:preference-ktx:$preference_version"
  • Trên cùng là activity/fragment(cụ thể mình tạo lớp LoginActivity).

Trông hơi khác giao diện 1 xíu nhỉ, tại mình cũng lười sửa nên cứ để vậy.

Trong đó lớp LoginActivity sẽ phải nối tới lớp Viewmodel (màu xanh biển thứ 2 trên xuống), và trong lớp ViewModel này phải có các LiveData. Vậy LiveData là gì vậy ta?

Mình cũng như bạn, mới đầu chả hiểu nó là cái gì nên cứ code, sau đó ngộ ra nó là “data sống dịch theo nghĩa bình dân là thế! Data nó sống nghĩa là khi có 1 sự thay đổi nào đó về data, thì nó sẽ báo cho tất cả các thằng liên quan đang dùng tới nó, cụ thể là lớp LoginActivity sẽ biết khi nào data thay đổi để mà cập nhật lại dữ liệu.

Trong ví dụ mình thiết kế lớp LoginActivityViewModel:

class LoginActivityViewModel(application: Application): AndroidViewModel(application) {
    private val repository  = LoginActivityRepository(application)
    val loginResponse: LiveData<LoginResponse>
    val showProgress : LiveData<Boolean>

    init {
        this.showProgress = repository.showProgress
        this.loginResponse = repository.loginResponse
    }

    fun login(email: String, password: String) {
        this.repository.login(email, password)
    }
}

Ở đây có 2 cái LiveData đó là loginResponse và showProgress. loginResponse là dữ liệu trả về từ server, khi nó thay đổi thì báo cho view biết thông qua viewmodel. showProgress dùng để show cái loading khi người dùng bấm vào nút login, đẩy data lên thì mình show cái loading chặn người dùng không cho thao tác trên UI nữa.

Quên chưa đưa code của Activity:

class LoginActivity : AppCompatActivity() {
    private lateinit var viewModel: LoginActivityViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)

        edit_user.showKeyboard()

        viewModel = ViewModelProvider(this).get(LoginActivityViewModel::class.java)
        val dialog = ProgressDialogUtil.setProgressDialog(this, "Đang yêu cầu...")

        //handle show loading
        viewModel.showProgress.observe(this, Observer {
            if (it)
                dialog.show()
            else
                dialog.hide()
        })

..... nhiều code sau này nữa, đây chỉ là code trích dẫn không chạy được!
}

Các bạn nhìn lên trên code, giải thích như sau:

Google cung cấp ViewModelProvider để hỗ trợ mình tạo viewmodel trong View(activity). Sau đó, khi showProgress thay đổi giá trị, nó sẽ bắn sự kiện đó qua hàm viewModel.showProgress.observe..

thằng View lúc này biết mà điều chỉnh giao diện cho phù hợp.

Tiếp theo là lớp LoginActivityRepository, màu vàng cam ở trên hình. Lớp này làm nhiệm vụ là lấy thông tin từ viewmodel sau đó bắn xuống cho model để xử lý. Có 2 nhánh xử lý:

  • 1 là lấy dữ liệu local(cái này mình chưa đủ thời gian code. sẽ update sau 😪)
  • 2 là dùng retrofit để gọi data lên server và chờ đợi dữ liệu trả về

Cụ thể code như sau:

class LoginActivityRepository(val application: Application) {
    val showProgress = MutableLiveData<Boolean>()
    val loginResponse = MutableLiveData<LoginResponse>()

    fun changeState() {
        showProgress.value = !(showProgress.value != null && showProgress.value!!)
    }

    fun login(email: String, password: String) {
        showProgress.value = true

        val retrofit =
            Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(GsonConverterFactory.create())
                .build()
        val service = retrofit.create(ZentNetwork::class.java)
        val loginRequest = LoginRequest(email, password, "2")

        service.login(loginRequest).enqueue(object :Callback<LoginResponse> {
            override fun onFailure(call: Call<LoginResponse>, t: Throwable) {
                showProgress.value = false
                loginResponse.value = null
                Log.d("login", "login failed ${t.localizedMessage}")
            }

            override fun onResponse(call: Call<LoginResponse>, response: Response<LoginResponse>) {
                showProgress.value = false
                loginResponse.value = response.body()
                Log.d("login", "login success ${response.body()}")
            }

        })
    }
}

Ở đây các bạn chú ý hàm fun login(email: String, password: String), cùng tên với hàm trong Viewmodel. Khi viewmodel gọi tới nó, nó sẽ dùng retrofit gọi dữ liệu từ server. Khi có data trả về, nó tiến hành thay đổi trạng thái của 2 biến showProgress, loginResponse của nó. Và bắn lên viewmodel biết sự thay đổi đó. Code trên đang thiếu mất phần lưu data vào local nhé(mình tính xài realm cho nó chất 😎, sẽ update phần sau).

Code phần API dùng retrofit như sau:

Đầu tiên là tạo 1 cái interface đúng như thằng retrofit bắt làm:

interface ZentNetwork {
    @Headers("Content-Type: application/json")
    @POST("login")
    fun login(@Body body: LoginRequest)
    :Call<LoginResponse>
}

Còn response trả về có dạng:

{
    "status": {
        "code": 0,
        "message": "success"
    },
    "data": {
        "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6IjE1MzZlMWY1NzIxYTQzZjk2N2I2NDYyYjA5YTBhMjMwZjcxNzkHLQBL6zA45BqHUnzhqSvjaM12vIaxHfw8j1AP1Hu3tpL4_7O8KHm4gj8Fu303Gzm9s",
        "user_info": {
            "name": "Trần Nga",
            "email": "ngatt@gmail.com",
            "address": null,
            "mobile": "0972612601"
        }
    }
}

Từ data như này làm sao để viết được Model. Ồ! đơn giản lắm các bạn ơi, các bạn dùng cái này nó support tận răng, như hình:

Cách cài plugin thì các bạn xem ở link sau: https://www.youtube.com/watch?v=ku9l-CXHX00

Sau khi có model LoginResponse rồi thì các bạn đưa vào phần retrofit như đoạn code service.login(loginRequest).enqueue(object :Callback<LoginResponse>

Cơ bản MVVM trong android chỉ thế thôi các bạn nhé. Khá là đơn giản đúng không? Về cơ bản nếu bạn nắm chắc được việc sử dụng Android studio, các thư viện như retrofit, thì mấy việc trên đều khá dễ làm và nhanh nữa.

Mình sẽ viết tiếp trong các bài tiếp theo. Còn bây giờ thì vừa code vừa ngẫm nghĩ tiếp.

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

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

Xem thêm tuyển dụng android, tuyển ios hấp dẫn trên TopDev

Các kỹ năng mà bất kỳ Senior Developer nào cũng cần phải có

senior developer

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

Sau khi hoàn thành tốt nhiệm vụ của một Junior Developer, lập trình viên sẽ có đủ tư cách để trở thành một Senior Developer. Đây là vị trí đáng phấn đấu của người làm trong lĩnh vực công nghệ thông tin. Vậy Các kỹ năng cần có để trở thành một Senior developer bao gồm những gì? Hãy cùng tìm hiểu lời giải đáp cho những câu hỏi trên thông qua những chia sẻ dưới đây.

Senior Developer Cần Đạt Yêu Cầu gì?

Senior Developer cũng là một cấp bậc được phân chia dựa theo năng lực và kinh nghiệm làm việc trong lĩnh vực lập trình viên. Những người ở cấp này thường thuộc dạng “lão làng”, tiền bối trong nghề. Không chỉ có trình độ chuyên môn cao, các Senior Developer còn có cách giải quyết vấn đề vô cùng chuyên nghiệp.

Senior Developer không chỉ có yêu cầu tuổi nghề cao là đủ

Lập trình viên Senior phải là người mang đến các lợi ích gia tăng theo thời gian. Họ phải có trách nhiệm giúp cho các lập trình viên bên cạnh trở nên tốt hơn, tiến bộ hơn. Đặc biệt, Senior Developer phải là người có tầm nhìn xa trông rộng, xác định hướng đi lâu dài và phải luôn tạo ra các giá trị kinh doanh cho tập thể. Và một điều vô cùng quan trọng chính là những người ở cấp bậc Senior phải có khả năng lãnh đạo team, giao tiếp tập thể và điều hành dự án.

  Senior Developer là gì? Những điều thú vị về Senior Developer

Có thể nói Senior là những người có bề dày kinh nghiệm từ 3 – 5 năm trở lên trong ngành. Lúc này họ đã đạt được trình độ code, lập trình chuyên nghiệp và có khả năng tự đảm nhận một dự án lớn trong công ty. Các Senior Developer thường không quá quan trọng thành quả mà thay vào đó là chú trọng tích lũy kinh nghiệm, bài học và cách để bước đi theo con đường mới sáng tạo hơn.

Tuy nhiên số năm làm việc trong ngành cũng chưa đủ để đánh giá người có đó thật sự là một Senior Developer hay không. Bởi dù cho đã có 3 – 5 năm làm việc nhưng chỉ dừng lại ở mức code đơn giản hay chỉ làm đi làm lại vài trang web, maintain lại các dự án cũ thì vẫn chưa đủ khả năng trở thành Senior. Dấu hiệu nhận biết Senior Developer chính là người có tốc độ xử lí công việc nhanh chóng dựa vào sự kết hợp của kinh nghiệm cùng khả năng tư duy hệ thống, nắm chắc bản chất công nghệ.

Ví dụ, để trở thành một Senior Developer trong ngôn ngữ hoặc công nghệ nào đó, trước tiên phải có kiến thức và am hiểu chuyên sâu về lĩnh vực trọng tâm của mình. Nếu là một Senior NodeJS lập trình viên không chỉ phải nắm vững những khái niệm trong ngôn ngữ JavaScript sida, mà còn phải biết cơ chết hoạt động của NodeJS, những Module thường dùng để xử lí vấn đề, framework/ thư viện làm web, đọc dữ liệu từ database, phương pháp quản lý file trong một project NodeJS, làm sao để tìm và fix lỗi code JS….

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

Làm thế nào để trở thành một Senior Developer?

Trở thành một Senior Developer là điều rất nhiều lập trình viên đang nỗ lực phấn đấu. Tuy nhiên không phải cứ tiến lên một cách không kế hoạch, không định hướng là có thể nhanh chóng được nâng cấp. Để bước đến bậc thang cao hơn, cần vạch ra chiến lược cụ thể. Và để trở thành một Senior Developer cũng cần có những bước tiến rõ ràng.

Lập trình viên Senior Developer sẽ tập trung nhiều hơn vào một chuyên môn thay gì có nhu cầu quan tâm hết mọi thứ như những cấp khác. Họ thường bỏ thời gian để tìm hiểu và đặt câu hỏi tại sao về công nghệ. Các lập trình viên cấp Senior sẽ đào sâu vào bản chất của Web, ứng dụng framework… Thay vì chú tâm vào từng tính năng mới của các dòng framework mới, Senior Developer sẽ ưu tiên tập trung vào ưu nhược điểm của các framework để từ đó có thể chọn ra công cụ phù hợp nhất cho dự án của mình.

  Con đường trở thành một Senior developer đích thực

Kỹ năng là việc nhóm của Senior Developer phải nổi trội hơn hẳn những lập trình viên khác. Thông thường, người ở cấp Senior thường đứng ra chịu trách nhiệm cho một team tiến hành dự án. Chính vì vậy, khả năng lãnh đạo, điều hành và biết cách phối hợp các hoạt động của các thành viên. Hơn nữa, Senior Developer phải có sự quan sát để có thể hướng dẫn kịp thời khi các thành viên khác gặp khó khăn. Hãy là cầu nối kết nối mọi người trong một nhóm thay gì giữ thái độ lạnh lùng, nghiêm khắc của một người có kinh nghiệm lâu năm để có thể hoạt động nhóm hiệu quả.

Vì một trong những công việc chính của Senior Developer là liên lạc với khách hàng, nhận feedback từ khách nên kỹ năng giao tiếp, làm việc với đối là cũng rất quan trọng. Để trở thành một lập trình viên ở cấp Senior cần có kỹ năng lắng nghe, thấu hiểu và cùng khách hàng đưa ra những hướng giải quyết tốt nhất. Những người này thường có kinh nghiệm giao tiếp tốt, biết cách xây dựng quan hệ và có phương pháp ứng xử hiệu quả.

Vậy là cơ bản bài viết vừa chia sẻ những giải đáp về thắc mắc Senior Developer là gì? Làm thế nào để có thể trở thành một Senior Developer? Hy vọng các thông tin trên đây có thể giúp ích cho các bạn đọc đang trên con đường của một lập trình viên

Bài viết gốc được đăng tải tại kinhnghiemlaptrinh.com
Tìm việc làm lập trình viên mới nhất trên TopDev

Chia sẻ với bạn 5 bí kíp để trở thành một lập trình viên “cứng”

Chia sẻ với bạn 5 bí kíp để trở thành một lập trình viên “cứng”

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

Chào anh em, lại là mình đây ! Trong các bài viết trước thì mình từng chia sẻ với anh em về những yếu tố để trở thành một lập trình viên toàn diện hơn rồi.

Nếu anh em nào chưa đọc có thể có thể tham khảo tại đây nha: 5 yếu tố để trở thành một lập trình viên toàn diện hơn

Việc trở thành một người toàn diện đã khó, mà trở thành một lập trình viên toàn diện lại càng khó hơn, vì nó đòi hỏi anh em phải cân bằng được nhiều khía cạnh khác nhau trong cuộc sống.

  10 câu nói cực hay về lập trình
  10 nguyên tắc lập trình nền tảng mà lập trình viên nào cũng cần biết

Nhưng nếu thu gọn lại, chỉ xét về khía cạnh kỹ thuật thì làm thế nào để trở thành một lập trình viên “cứng” đây?

Vâng, ở trong bài viết này mình sẽ chia sẻ với anh em 5 bí kíp để “có thể” trở thành một lập trình viên có khả năng kỹ thuật tốt nhé.

#1. Đọc sách và tài liệu chuyên ngành

Hiện nay có vô số các kênh để anh em lập trình viên có thể nâng cao chuyên môn về kỹ thuật của mình, ví dụ như là các khóa học online, các khóa học trực tiếp…

cach-de-tro-thanh-mot-lap-trinh-vien-cung (1)

Nhưng nếu anh em để ý mấy ông giỏi thường họ rất ít khi học như vậy, rất ít khi họ ngồi xem các khóa học online hay mất công đến các trung tâm để “được dạy”.

Ngược lại, anh em thấy họ rất hay đọc sách chuyên ngành (tiếng anh), hoặc đọc trực tiếp tài liệu (documents) về công nghệ hay ngôn ngữ lập trình mà học muốn học.

Đặc điểm của cách học này là người học phải kiên trì, có kiến thức nền tảng tốt, có vốn tiếng anh chuyên ngành vững.. khá là nhàm chán nhưng đó là cách vô cùng hiểu quả để có thể nắm chắc kiến thức mà họ muốn tìm hiểu.

Thử hỏi, liệu có mấy anh em dev ở đây đủ kiên trì đọc cuốn sách dài tới 1000 trang hoặc đủ trình độ để đọc và hiểu được bên trong nói gì?

Nguyên nhân thì như mình vừa nói rồi đấy, đơn giản là vì hầu hết sách và tài liệu họ viết khá hàn lâm, không phải là dạng hướng dẫn nên việc một dev bình thường đọc docs mà nản là chuyện hết sức bình thường.

Chính vì vậy mà mấy ông lập trình viên cứng là mấy ông hội tụ đủ các yếu tố bên trên. Làm việc khó mà, đâu phải ai cũng làm được, nên đâu phải ai cũng có thể xuất chúng được.

#2. Chăm chỉ code, chịu khó mày mò

Nói về chuyện chăm chỉ thì chắc nhiều anh em sẽ bảo rằng làm lập trình khó lắm, có phải cứ chăm chỉ là được đâu.

cach-de-tro-thanh-mot-lap-trinh-vien-cung (2)

Suy nghĩ này hoàn toàn đúng nhưng lại hơi mang tính chủ quan, vì anh em đã vô hình chung nghĩ rằng việc học lập trình là khó, mà khó thì phải thông minh mới học được, mà đã thông minh thì không phải cứ chăm là thông minh được.

Nhưng thực tế thì lại không phải như vậy đâu các bạn ạ, những người có tố chất và trí tuệ thì mình không nói, nhưng phần đa những người làm lập trình hay người học lập trình không phải là những con người quá giỏi, quá xuất sắc như các bạn nghĩ.

Ừ công nhận là lập trình không phải là dễ, nhưng học cái gì mà chả có cái khó của nó. Nên đôi khi bạn chỉ cần chăm chỉ, chịu khó rèn luyện, tích lũy kinh nghiệm thì đã có thể lập trình “tốt” rồi, chứ chưa nói đến khả năng trí tuệ bẩm sinh.

Hai nữa là nếu muốn học tốt ngành công nghệ thông tin nói chung và ngành lập trình nói riêng thì bạn “nên” là người ham học hỏi, thích mày mò, luôn tự đặt ra câu hỏi tại sao?

Kiến thức công nghệ nó như một biển lớn và mang những trạng thái khác nhau, liên tục thay đổi từng ngày, từng giờ, thậm chí là từng phút.

Nếu bạn không thuộc kiểu người chịu khó tìm tòi học hỏi thì mình tin chắc, bạn chỉ có thể trụ được từ 1-2 năm trong ngành này mà thôi.

#3. Rèn luyện tư duy đa chiều, tổng quát hóa vấn đề

Một trong những cái khó khi anh em học lập trình đó là việc: một vấn đề có thể được giải quyết theo nhiều cách khác nhau.

cach-de-tro-thanh-mot-lap-trinh-vien-cung (1)

Chính xác hơn là đôi khi anh em gặp một vấn đề A, anh em nghĩ nó có thể giải quyết được theo cách B và anh em lao đầu vào tìm hiểu cách B đó.

Nhưng thực tế, để giải quyết được vấn đề A thì anh em có thể sử dụng cách C đơn giản hơn rất nhiều.

Đây có lẽ là câu chuyện muôn thuở của những anh em mới đi làm hoặc mới học lập trình. Hầu như chúng ta quá tập trung vào việc làm sao để giải quyết vấn đề, thay vì đặt ra câu hỏi vấn đề này nên được giải quyết như thế nào.

Tư duy đa chiều vô cùng quan trọng không chỉ với công việc lập trình, mà với hầu như các công việc vận dụng trí óc thì anh em đều nên áp dụng tư duy đa chiều, biết cách tổng quát hóa vấn đề.

Khi suy nghĩ theo nhiều hướng sẽ giúp anh em nhìn nhận vấn đề một cách tổng quan hơn, thậm chí với nhiều “cao thủ” khi gặp vấn đề khó họ cũng giải quyết trong nốt nhạc là nhờ vào việc kiến thức sâu, rộng, cộng với tư duy tổng quát của họ.

#4. Học từ những “cao thủ” khác

Nếu việc học từ các “cao thủ” mà dễ dàng thì chắc trên đời này ai cũng trở thành cao thủ hết rồi. Trong ngành lập trình thì việc học từ người khác lại càng không phải dễ. Tại sao?

cach-de-tro-thanh-mot-lap-trinh-vien-cung (3)

Câu trả lời vô cùng đơn giản đó là: nó nằm ở tư duy của mỗi người, tư duy khác nhau thì rất khó để có thể hiểu được nhau.

Chưa kể việc học hỏi là cả một quá trình, “cao thủ” trong giới lập trình là những người rất lì lợm, họ tích lũy kiến thức và kinh nghiệm từng ngày.

Việc học từ họ đòi hỏi người học cũng phải có những tố chất tương tự, có thể sẽ mất thời gian và phải tích lũy theo năm tháng nhưng mình tin rằng việc học từ người khác là một trong những cách học nhanh nhất và hiệu quả nhất mà bạn có thể học.

Ví dụ có những kỹ thuật họ mất thời gian suy nghĩ, tìm hiểu, đọc không biết bao nhiêu tài liệu mới ngộ ra. Rồi họ lại truyền đạt kiến thức cho bạn, như vậy chẳng phải là bạn đã tiết kiệm được nhiều thời gian mà vẫn nắm được kiến thức đó sao?

Vì vậy, nếu có cơ hội được làm việc với các “cao thủ” thì bạn hãy tận dụng và học hỏi từ họ và bạn sẽ tiến bộ lên rất nhanh đó.

#5. Lì lợm

Nói về những “lập trình viên cứng” mình từng gặp thì họ có một điểm chung đó là rất lì lợm. Vậy thế nào là lì lợm?

cach-de-tro-thanh-mot-lap-trinh-vien-cung (4)

Đơn giản là nếu bạn thấy ông nào làm lập trình mà kiểu bug càng khó càng xung, có thể ngồi lì cả ngày để fix bằng được bug hoặc tối ưu chương trình chẳng hạn thì đó chính là sự “lì lợm” mình đang nhắc đến.

Mình cũng không biết cái này có rèn luyện được hay không vì bạn phải thực sự đam mê với công việc, bạn cảm thấy vui và phấn khích khi giải quyết các vấn đề khó thì mới có thể lì lợm như vậy được.

Đôi khi mình cảm thấy nó xuất phát từ tính cách của mỗi người, được hình thành và rèn luyện trong học tập, công việc và cuộc sống.

Nói tóm lại thì đây giống như dấu hiệu nhận biết một lập trình viên cứng hơn là một bí kíp để trở thành một lập trình viên cứng.

#6. Lời kết

Thực ra mình cũng không thích dùng từ “bí kíp”, mà chính xác hơn đó là những yếu tố hoặc những việc mà các bạn nên làm để có thể trở thành một lập trình viên giỏi.

Giới hạn của việc “giỏi” nó như thế nào thì anh em chắc có lẽ cũng đã tự có cho mình các quy chuẩn riêng rồi.

Tựu chung lại thì nó sẽ phụ thuộc rất nhiều vào bản thân các bạn, sự nỗ lực và chủ động của các bạn. Khi có nỗ lực và một hướng đi đúng thì anh em sớm muộn cũng giỏi hơn thôi.

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

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

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

Chuyện OT trong ngành IT

Chuyện OT trong ngành IT

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

Chia sẻ thẳng thắn, góc nhìn đa chiều của bạn Nguyễn Dương Hải về chuyện OT (overtime). OT có lẽ khá quen thuộc với một số bạn trong ngành IT (Information Technology).

  10 theme Sublime Text tốt nhất
  Hiểu thêm về Deep Learning thông qua 12 khóa học online miễn phí

Mình từng làm OT rất nhiều.

Trong năm thứ 2 mình làm việc ở công ty đầu tiên, có những dự án mình làm ngày thường thì cứ 2 ngày OT liên tục, ngủ lại ở công ty (khoảng 4-5 tiếng/ngày), mình về nhà một buổi sáng rồi chiều hôm đó lên công ty tiếp tục cái vòng xoay ấy. Thứ 7 và chủ nhật thì mỗi tháng cũng phải làm fulltime 2-3 tuần.

Hồi đó công ty mình chủ yếu trả lương theo kiểu nếu anh làm OT thì tính lương 150%, 100% là lương và 50% cộng vào ngày nghỉ phép. Lúc đó phải 3 – 4 tháng liền tháng nào mình cũng lãnh gấp đôi lương. Còn ngày nghỉ phép? Sau 2.5 năm làm việc mình xin nghỉ 1 kỳ nghỉ lớn, 2 tháng được ăn lương không phải đi làm, và mình vẫn còn thừa ra một ít ngày nghỉ khi chuyển hợp đồng sang công ty con.

Chuyên đó là bình thường! Đó là suy nghĩ của 1 đứa nhóc 2.5 năm tuổi nghề. Dự án cần, bạn không làm tức là bạn không yêu dự án, không hết lòng với công ty. Sau 1 năm rưỡi từ khi bước vào công ty, mình từ QC Junior level 1 trở thành QC senior level 2.

Rồi mình thay đổi.

Cũng chính đứa nhân viên làm hết lòng vì công ty đó, sau này khi trở thành QA team lead lại là đứa to mồm phản đối chuyện này nhất. Nó kiên quyết phản đối chuyện OT đến nỗi mà nó đã đắc tội với không biết bao nhiêu là manager của công ty, bao gồm cả founder.

Sau này, khi ra đi ấn tượng xấu nhất của mình về nơi đã nuôi nấng mình thành 1 QA trưởng thành chính là chính sách OT và cách đánh giá đóng góp của nhân viên của công ty đó.

Điều buồn cười là, sau này, khi mình vào công ty gần đây nhất (SSS) thì mình lại làm thêm giờ. Nó thậm chí chẳng phải là OT, mình không được trả thêm tiền nhưng mình vẫn làm. Mặc dù mình kiểm soát bản thân để làm cao lắm đến 9h rồi về nhưng không có ngày nào mình về nhà mà mình cảm thấy thỏa mãn. Mình không thức buổi tối giỏi, nhưng buổi sáng mình vẫn dậy sớm, tập thể dục và ngồi làm cho tới giờ đi làm.

Tại sao lại như vậy?

Mình vẫn hiểu được tâm mình muốn gì, nhưng thật khó diễn đạt thành lời. Chỉ đến khi mình đi event Founders Stories: Empowering Women Entrepreneurship và nghe chị Linh Thái, CEO & founder of Rita & Phill kể chuyện, vốn chẳng focus vào việc OT lắm, mình mới giải thích rõ được mình thật sự cần gì để chuyện OT trở thành một việc hiệu quả. Đây là câu chuyện chị kể:

Chị làm việc 10 năm ở Mỹ và họ làm rất tập trung và cật lực, nhưng sang VN thì không vậy nữa và chị phải học cách chấp nhận và improve nó. Chị hiểu rằng cách tốt nhất là khuyến khích nhân viên về nhà đúng giờ nhưng luôn luôn học hỏi. Công việc sẽ hiệu quả vào ngày mai nếu bạn học hỏi và tiến bộ hơn, hiểu nhiều điều hơn so với ngày hôm qua. Và nếu họ cảm thấy ở cty, làm việc tiếp là học hỏi họ sẽ tự động ở lại…

…Lúc còn bé chúng ta trả học phí để được học kiến thức, và chúng ta học ngày học đêm. Bây giờ, hãy nghĩ rằng có người trả học phí cho chúng ta để được học. Hãy học hỏi thật nhiều! Tích lũy kiến thức thật nhiều và nếu có cơ hội …. leave! Open your own business!

Vậy tôi đã thấy được OT cần gì để hiệu quả?

1/ Hãy biến nó thành thời gian học hỏi.

Mình nghĩ đó là lý do tại sao mà trong những năm đầu mình OT và ít ca thán. Tất cả mọi thứ xung quanh mình đều mới mẻ, đều đáng giá để mình bỏ thời gian và công sức đề tìm hiểu.

Sau này cũng vậy, mình được giao 1 role mới BA và cũng có 1 việc chưa thành thạo là QA automation. Khi mình ở lại, thực ra mình không hẳn đang làm việc, mình chỉ đang dùng cái project hiện có của mình để làm “bãi thử nghiệm” cho những skill còn chưa hoàn thiện của mình thôi.

Nó hoàn toàn khác với việc bạn bắt một người ở lại làm thêm giờ để làm những công việc lặp đi lặp lại, cái mà họ đã làm buổi sáng hết mình nhưng vẫn không xong. Rất nhiều đồng nghiệp của mình, kể cả ở công ty khác nói rằng sau khi làm 1-2 năm ở công ty của họ, họ chỉ thấy sức khỏe giảm sút và chẳng học được thêm điều gì. Họ còn nói với nhau ” làm chỉ vì tiền thôi còn nếu muốn học hỏi thêm thì đừng vào đây!”. Mình cũng vậy, và mình cũng không cam tâm khi thấy member của mình cũng vậy!

Hãy luôn tạo điều kiện để họ học cái mới. Nhưng đi kèm với nó là điều ở dưới đây

2/ Room to learn, room to fail

“Tạo môi trường học hỏi”. Ai cũng nói được câu này, nhưng ít ai hiểu rằng một môi trường tốt là một môi trường cho bạn cơ hội để thở, để thấm thấu cái bạn học, và để thư giãn cho ngày mai học tiếp. Lại càng ít manager hiểu rằng, họ phải control expectation của họ, để không làm cho nhân viên cảm thấy ngộp thở và cảm thấy họ vô dụng, trong khi họ thực sự đã học được rất nhiều.

Bạn đã bao giờ nói nhân viên của bạn dừng lại, đừng làm nữa và hãy đi về với gia đình chưa?

Có một lần mình (BA) đã phân tích sai yêu cầu của 1 feature. Lúc đó là 8h tối khi chúng tôi phát hiện ra bug và kết quả là Developer phải rework ít nhất là 1 ngày. Câu đầu tiên bạn lead nói với mình là:

“Anh Hải, anh đi về thôi! Ngày mai hãy làm tiếp!”

Tối đó, mình có cảm giác bạn lead không còn tin tưởng mình nữa. Mình mang tâm lý đó và cố gắng làm tiếp việc của mình. Đây là cuộc nói chuyện trên chat của mình và bạn lead:

Conversation with lead

Ở đây có 2 điều mình muốn nói:
  • Bạn phải chấp nhận team có thể fail. Control cái fail này trong giới hạn cho phép và luôn dành ra time cho rủi ro là điều quan trọng.
  • Phải có điểm dừng trong chuyện học. Nếu không, chỉ đơn giản là bạn overworked và died. That’s it!

Ở công ty đầu tiên, mình không có được cái cảm giác an toàn đó. Mình từng làm project cả team dính NDA. Đó là lần đầu tiên team nghe nói về cái NDA này. Kết quả quy lỗi về Development team (PM+Dev+QA) thay vì người không nói cho team biết cái này từ đầu. Mình (QA lead) cũng cảm thấy rất có lỗi vì đã không nghĩ ra sớm. Nhưng với lượng task mình làm ngày làm đêm mà vẫn không xong. Chuyện dành thời gian để thở, suy nghĩ ra những risk thế này là chuyện nực cười. Lời khuyên nếu bạn là lead mà thậm chí không có thời gian để thở, để nhìn dự án một cách bao quát, ngập mặt vào việc thì cái danh của bạn chỉ là danh hão thôi!

3/ “Get Shit Done?”. Let’s apply for ALL shit!

Rất nhiều manager khi nói rằng nhân viên của họ nên (phải) ở lại làm, là vì yêu dự án, là vì dự án có vấn đề và như là người làm ra nó, chúng ta phải có trách nhiệm giải quyết. “Get shit done!”. Một trong những cách giải quyết là OT (?). Mình có vài lần đã nói với họ rằng “Ok! OT 1, 2 lần không sao vậy anh giải quyết vấn đề OT đó thế nào?”, Họ nói rằng “OT là chuyện không tránh khỏi!“. Không! OT không bình thường, nó là dấu hiệu của việc team bạn đang làm không đúng theo kế hoạch, hoặc không hiệu quả, hoặc có gì đó làm họ chậm lại. Bạn yêu cầu Developer của bạn OT để chạy cho kịp dự án? Vậy bạn có bao giờ làm những việc này:

  • Nhận lỗi là có sự chủ quan từ estimate của mình và leaders?
  • Nói với client yêu cầu của họ về thời gian hay chức năng là vô lý?
  • Yêu cầu họ đưa requirement và design đúng thời hạn?
  • Nếu họ làm không đúng, bạn đứng ra thay mặt team nói rằng team không thể làm khi họ không làm tròn phần của họ được?

Nói ngắn gọn là thế này:

  • Bạn push member của bạn để họ chạy kịp dealine. Chuyện dễ! Đừng tự hào về việc đó!
  • Làm việc chung với team bạn, xắn tay làm để kịp deadline. Ok! bạn là leader tốt nhưng không giỏi!
  • Bạn dám đứng ra giải quyết những vấn đề, như một leader, để team bạn có một môi trường làm việc tốt. Sign me up! Tôi muốn làm nhân viên của bạn đó!

Control client

Có 1 lần, ở công ty cũ mình đã phải đập bàn và chỉ thẳng mặt vào người PGM/Onshore nước ngoài đó nói rằng: “Chị (you) không biết control client! Cost 1 ngày test chị giảm xuống còn 3 tiếng. Lúc team tôi test thì chị cứ đứng canh rồi hối! Bây giờ chị còn muốn tụi tui nghĩ cho client những thứ không có trong hợp đồng kiểu như “best for customer” hả? Chị ít nhất hãy cho chúng tôi thời gian để làm tốt việc của chúng tôi đã rồi hãy tính đến chuyện đó!”.

Founder đứng ngay kế bên đã phải lên tiếng đỡ lời cho người PGM đó. Sau cuộc họp, anh Technical Director của công ty, trong cuộc họp của QA tới và nói rằng: “Hải! Câu quá thẳng thắn, cho dù cậu có nói đúng đi nữa thì nói như vậy cũng chỉ hại cậu mà thôi!”

Sau này, tôi thề sẽ không bao giờ nhìn mặt cái người PGM/Onshore đó nữa, và may mắn thay tôi đã rời công ty, còn cô ta thì đi về công ty mẹ ở nước ngoài.

4/ Nhìn nhận sự đóng góp và tiến bộ của nhân viên

Câu hỏi là “Nếu họ làm OT, bạn nghĩ đó là việc của họ?”

Đã từng có thời tôi nhận được câu trả lời là “Họ đang đóng góp tích cực cho công ty!”. Không phải chỉ từ công ty tôi. Tất cả những công ty IT nói chung mà bạn bè tôi làm việc. Và đúng là họ có những sự khen thưởng đúng đắn và trả công xứng đáng (OT) cho nhân viên!

Về sau này, câu trả lời thường xuyên mình nhận được là: “That’s their job! It’s their fault to not complete their tasks on time. So they have to finish it!”

Có một số công ty, trong job description gửi kèm qua email thậm chí còn có một dòng headline ở dưới, ngụ ý nói rằng việc OT sẽ có thể được diễn ra, không thường xuyên nhưng sẽ có, và có thể sẽ không có OT money.

Tôi vẫn nghĩ chuyện đó bình thường!

Thực ra thì, cái quan trọng không phải là bạn nói gì mà quan trọng là bạn làm gì. Và theo kinh nghiệm của tôi, OT có thể được đên bù bằng nhiều thứ, không chỉ là trả tiền thêm giờ:

  • Bạn có flexible hour, và phải chắc chắn là nó flexible. OT là khi bạn nhất thiết phải có người đó để làm việc. Hãy release họ khi bạn không cần.
  • Promotion.
  • Chê độ khen thưởng, tăng lương.
  • Team building.
  • Trả tiền thêm giờ! Hãy fair với nhân viên. Làm việc lâu năm, mình hiểu là nếu client không trả tiền. Bạn cũng không thể trả cho nhân viên được. Nếu client đã trả tiền rồi bạn có minh bạch, thông báo và trả tiền cho nhân viên không? Hay đi xa hơn nữa, là một khoản khấu hao nho nhỏ?

Lời kết

Bài viết này chỉ đơn giản chủ yếu là nhưng câu chuyện mà mình. Như là một đứa trẻ QA 6 tuổi trải qua. Mình biết rằng ở đâu đó cũng có rất nhiều bạn đang gặp những vấn đề tương tự. Cái mình hy vọng, là những manager sẽ nghe những câu chuyện về member của họ. Để họ có thể làm cho công ty của họ tốt hơn, bắt đầu từ việc OT này. Nếu bạn không đồng tình, cho rằng mình là kẻ lắm điều nổi loạn. Hãy cứ xem như bạn được nghe kể những câu chuyện thật, đã từng xảy ra với ai đó. Đối với mình vậy là được rồi!

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

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

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

Big Data có thật sự “toàn năng” và các cơ hội nghề nghiệp trong tương lai?

Về diễn giả

  • Anh Cảnh Trần (Calvin Canh Tran) hiện đang Senior Data Engineer tại Grab Finance Group (Singapore)
  • Anh tốt nghiệp đại học ở Việt Nam và có khoảng thời gian 1 năm làm việc với tư cách là PHP developer.
  • Sau đó sang Singapore để học thạc sĩ về Data Science. Sau khi tốt nghiệp thạc sĩ, anh là việc ở vị trí Data Scientist được khoảng 2.5 năm. Về sau nhận ra bản thân không hợp với công việc đó nên chuyển sang làm Data Engineer. Đến hiện tại anh đã làm việc ở vị trí Data Scientist đã được 4 năm.

Sự chuyển giao giữa các vị trí công việc có gây ra khó khăn nào cho anh không?

Thật sự là có khó khăn, như lúc đầu phỏng vấn làm Data Engineer mình không đạt nhiều lần. Sau khi chuyển qua lĩnh vực này mình phải học thêm rất nhiều và hầu hết là tự học vì 2 lĩnh vực này thật sự rất khác nhau, mình phải mất khá nhiều thời gian để trở nên thuần thục.

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

Bộ skillset cơ bản và nâng cao của một Data Engineer gồm những gì?

Bộ skillset cơ bản cần có gồm Python, Scala và Spark. Đây hầu như là các kỹ năng đáp ứng toàn bộ yêu cầu công việc của Data Engineer. Sau đó kỹ năng nâng lên dần sẽ phụ thuộc vào từng công ty như ngân hàng thì sẽ cần học thêm adopt vì họ sẽ sử dụng những hệ thống máy chủ và các aplluter tự build.

Ngược lại, những công ty thiên về startup công nghệ Grab, Gojek thì bắt buộc phải biết trên Cloud. Cloud tốt nhất vẫn là Amazon Web Service vì là sản phẩm lâu đời nhất, đó là những kỹ năng cần thêm cho các Data Engineer ở bậc cao. Còn ở vị trí cấp cao hơn nữa như quản lý thì còn phụ thuộc vào vị trí và công việc ở công ty để có thể biết mình nên học thêm những tools khác và một số kiến thức nữa.

Trong mảng Payment thì cần add-in thêm những kỹ năng gì?

Về cơ bản thì công việc Data Engineer ở ngành nào cũng giống nhau hết, kể cả finance cũng vậy. Còn về nghiệp vụ riêng thì có thể bên lĩnh vực tài chính, data sẽ đòi hỏi tính bảo mật cao hơn rất nhiều nên phải có nhiều hệ thống bảo mật data hơn nên mình nghĩ có lẽ nó cũng không liên quan nhiều đến kỹ năng mình cần có.

Công việc hàng ngày của một Senior Data Engineer khác biệt gì so với Junior Data Engineer?

8 tiếng 1 ngày của Junior sẽ là ngồi code và xem task, còn đối với senior thì chỉ có 6 tiếng là thật sự nhìn vào màn hình, còn lại 2 tiếng là để meeting và present. Junior và Mid-level của Data engineer thường sẽ làm việc theo task cũng như phân công thêm của lead, trong khi đó Senior phải đưa ra các quyết định, ví dụ như khi nhiều stakeholder hay user cùng yêu cầu một vấn đề thì không thể yêu cầu tất cả junior cùng làm việc mà phải xây dựng một tool để hỗ trợ chỉ cần chạy một lần là có thể phục vụ cho toàn bộ các user hoặc stakeholder. Senior sẽ là người đưa ra những quyết định như thế, mình sẽ phải chịu trách nhiệm nhiều hơn, quyết định sai lầm có thể ảnh hưởng rất lớn đến nghiệp vụ và công việc của công ty.

Anh có thể chia sẻ các career path liên quan đến data được không ạ?

Hiện tại có 3 lĩnh vực chính liên quan đến data gồm: Scientist với ML Engineer, Data Engineer và Data Analyst.

  • Data Scientist đa số là những bạn có kiến thức về data science và machine learning để xây dựng mô hình dữ liệu giúp dự đoán và phân loại.
  • Data Engineer thì sẽ xây dựng một hệ thống tổng hợp lưu trữ và trình xuất dữ liệu. Đây chính là những người tạo nền tảng, chuẩn bị dữ liệu sẵn cho Data Scientist và Data Analyst sử dụng dữ liệu đó.
  • Data Analyst chịu trách nhiệm phân tích để tìm hiểu insight, record để báo cáo cho sếp. Đây là 3 hướng chính của data career path.

Người làm về data (cụ thể là data engineer) có phải vững về business mindset hay chỉ cần giỏi về công nghệ, cách làm công nghệ?

Data engineer nếu xét ở 3 cấp độ high level thì junior và mid-level sẽ không cần có business mindset vì đa số là task có sẵn và họ lấy task qua những buổi như retro meeting,… để trình sếp.

Nhưng senior level thì bắt buộc phải biết về business vì khi làm việc với data analyst và các stakeholder của công ty finance hay marketing chẳng hạn, hai bên chắc chắn sẽ có sự khác biệt về mặt chuyên môn. Thế nên mình cần có thêm các kiến thức business để hiểu được yêu cầu này như thế nào, giải quyết và đưa ra các giải pháp cho phù hợp.

Ví dụ họ yêu cầu một data transaction, mình cần phải biết transaction đó họ sử dụng để làm gì và khi inject transaction đó từ nguồn khác vào, mình phải làm thế nào. Sau khi nó vào data warehouse thì cấu trúc, bố cục của nó ra sao để stackholder có thể sử dụng và phụ trách theo phần việc của họ.

Quy trình phỏng vấn của anh khi apply vào Grab như thế nào?

Đầu tiên mình phải làm Hacker Rank ở nhà khoảng 1 tiếng rưỡi, sau khi pass vòng này khoảng 80%, mình vào vòng face to face. Ở vòng face to face đầu tiên mình gặp 2 bạn, bạn đầu tiên sẽ yêu cầu mình giải thuật toán trên bảng trắng, sau đó hỏi về system design.

Sau khi pass vòng này mình mới được gặp trực tiếp data team và được các bạn data engineer phỏng vấn. Vòng này mất khoảng 2 tiếng với các câu hỏi xoay quanh data engineer để nắm được kỹ năng của mình. Cuối cùng mới gặp Hiring Manager để thương lượng lương. Tổng cộng có 4 vòng phỏng vấn để vào Grab.

Anh có kinh nghiệm hay tips gì khi đi phỏng vấn để chia sẻ cùng mọi người không?

Ở bài test đầu tiên, các bạn phải tự chuẩn bị vì bài này sẽ làm ở nhà, chủ yếu là phải luyện tập nhiều hơn để quen với các bài test. Ở vòng face to face các kiến thức đa phần nghiêng về những gì mình đã học ở đại học như cấu trúc dữ liệu và giải thuật, system design. Những kiến thức này đều là kiến thức chuẩn và hầu như là Backend, Frontend hay Data Engineer đều có liên quan, nhưng Data Engineer chỉ cần tập trung nhiều hơn vào phần của mình.

Các bạn Data Engineer đa phần hay mắc lỗi là kể rất nhiều các tools nhưng đối với nhà tuyển dụng, họ chỉ quan tâm đến kiến thức mà ứng viên có. Vì mỗi công ty sẽ có một bộ tool khác nhau và mình bảo đảm là ở Grab, Gojek hay Uber các bộ tool này hoàn toàn khác nhau, tại vì đã phần tool được công ty tự xây dựng chứ không xài opensource. Nên việc bạn kể rất nhiều tool nó không chứng minh được là bạn giỏi mà chỉ chứng minh bạn là user xài được tool đó, nên chủ yếu là các bạn sẽ được hỏi sâu về những kiến thức nền. Chính những kiến thức này sẽ cho biết năng lực của bạn đến đâu và khi vào team bạn có adapt được với team hay không.

Thứ 2 là các viết rất nhiều tool mình sử dụng vào CV, khi nhà tuyển dụng hỏi họ đều dựa vào những gì bạn viết trong CV, có những tool bạn chỉ xài vài lần nên khi được hỏi sẽ không hiểu rõ về nó, như vậy sẽ bị mất điểm trong mắt nhà tuyển dụng. Để chuẩn bị cho phỏng vấn tốt nhất mình nghĩ vẫn là các bạn nên biết về các kiến thức nền, về data engineer và tự tin đi phỏng vấn thì sẽ thành công hơn việc chỉ chăm chú vào tools.

Theo em được biết ở Việt Nam, ngành data vẫn còn khá “non trẻ”. Anh có thể chia sẻ về “gap” (khoảng cách) giữa Việt Nam và thế giới (như ở Singapore) hay không?

Mình nghĩ là có khác nhau vì quá trình mình làm Data Engineer, Data Scientist mình cũng nắm trong tay một số data và mình phát hiện ra là gap lớn nhất nằm ở số lượng data.

Singapore đã bắt đầu lĩnh vực này từ lâu nên có số lượng data lớn, còn ở Việt Nam khi bắt đầu công nghệ 4.0 thì mọi người mới nghĩ đến việc thu thập data nên sẽ chậm hơn về mặt data, mà data càng nhiều mình sẽ càng mạnh hơn về mặt insight.

Do đó mình nghĩ chỉ cần 2 năm nữa thôi là số lượng data của Việt Nam sẽ đủ lớn để ngành data phát triển và các công ty sẽ tập trung vào ngành data nhiều hơn và đương nhiên số lượng tuyển dụng về data cũng tăng lên. Vì mình thấy hầu như các công ty bên Singapore đều có một team về data rồi.

Vậy theo anh cơ hội và thách thức để phát triển ngành data này tại Việt Nam như thế nào?

Mình nghĩ cơ hội sẽ rất nhiều vì tất cả các công ty đều tuyển, nhưng thách thức mình đã nhìn thấy, kể cả các công ty ở Việt Nam tuyển dụng là yêu cầu tuyển dụng khá là cao trong khi ngành data ở Việt Nam chưa được đào tạo bài bản.

Đa số các khóa học mình xem qua trên mạng đều tập trung vào các tools chứ không tập trung vào nền tảng như ở Singapore. Đại học Quốc gia Singapore hiện đã có riêng một ngành đào tạo về data science, kể cả bậc cử nhân cũng có nên khi vào đó bạn sẽ được đào tạo kiến thức nền bài bản hơn do đó mình nghĩ đây vẫn là thách thức lớn nhất, nhiều khi trình độ đầu ra không đáp ứng được yêu cầu tuyển dụng.

Mình thấy đa số các Data Scientist đa số ít nhất là phải có bằng master, tiến sĩ cũng rất nhiều, hầu như sẽ không tuyển các bạn cử nhân mới ra trường. Ở Việt Nam mình thấy cũng có một số bạn làm Data Scientist khi vừa ra trường nên mình nghĩ đó là sự khác nhau giữa 2 nước.

Quan điểm cá nhân mình nghĩ data ở Việt Nam hiện tại chưa cần quá advance, chưa cần các bạn thiên về nghiên cứu nên một cử nhân vẫn có thể xây dựng model, mô hình dữ liệu. Còn bên Singapore họ cần nghiên cứu nhiều hơn nên các bạn vào đây sẽ không cần xây dựng mô hình dữ liệu hoặc xài những công cụ có sẵn.

Hiện tại làm việc với data, anh đang sử dụng ngôn ngữ lập trình, công nghệ nào là chủ yếu? Anh có recommend các bạn “đi tắt đón đầu” một ngôn ngữ nào không?

Hiện tại mình thấy Python vẫn đang được sử dụng nhiều nhất, sau đó đến Scala, tùy theo nhu cầu. Khi viết một file play và nghĩ nó sử dụng một số code đã có sẵn bên user thì mình dùng Python vì có thể chia sẻ với Stakeholder hay user để họ đọc và hiểu. Còn khi tự viết cho cá nhân thì mình dùng Scala vì nó sẽ tối ưu hóa cho spatjob nhiều hơn Python. Mà 2 ngôn ngữ này hiện tại đã là ngôn ngữ cũ rồi nên với các bạn mới vào nghề nên đi từ cơ bản, chậm mà chắc chứ đừng vội vàng dùng tool hay xài UI.

Hiện tại có các khái niệm như data base, data warehouse, data lake, data mart, anh có thể giúp các bạn phân biệt được chứ?

Data base là hệ quản trị cơ sở dữ liệu được dùng cho hệ thống web, mobile lưu trữ thông tin của người dùng, thông tin hệ thống.

Data lake dùng để chứa raw data, dữ liệu thô, được dùng cho việc phân tích.

Sau đó, data warehouse cùng là dữ liệu để báo cáo và phân tích nhưng nó đã qua xử lý. Thông thường dữ liệu từ data base sẽ được đưa vào data lake thành raw data, rồi từ data lake chuyển vào data warehouse sau khi đã xử lý để cho một số nhu cầu nhất định của user.

Còn data mart là một kiểu mô hình thu nhỏ của data warehouse. Ở một số công ty không có data warehouse mà có nhiều data mart khác nhau, họ gom tất cả những data đó lại gọi là data warehouse nên nó chỉ là những khái niệm.

Ví dụ có yêu cầu từ analyst cần một transaction data về vay tiền thì profile của người vay tiền sẽ vào data base để lấy những profile đó bỏ vào data lake thành raw data. Sau khi có data lake rồi mình sẽ làm việc với stakeholder và user để biết họ cần những thông tin gì mình mới process các data bỏ vào data warehouse. Từ datawarehouse sẽ để cho stakeholder và user viết sql lấy ra và sử dụng theo mục đích của họ.

Ngoài những khái niệm nêu trên, liệu còn điều gì anh nhận thấy phần lớn những người không chuyên về lĩnh vực này đang hiểu sai?

Mình bổ sung thêm một chút là thật sự nhiều khi không cần data warehouse. Ví dụ user yêu cầu cần data để làm report thì nó quá đơn giản, không cần process nhiều mình có thể đọc trực tiếp trên data lake và tạo report luôn, đây là thực tế khi làm việc.

Vấn đề thứ 2 có một khái niệm mà mọi người dễ nhầm lẫn là Big Data. Rất nhiều người nghĩ rằng big data toàn năng, chỉ cần có big data rồi mình bỏ data vào thì cái gì cũng chạy được nhưng thực tế big data nó chỉ là một khái niệm nói về dữ liệu quá lớn mà database cũ không chứa hết được nên mới chuyển sang một hệ thống khác lớn hơn và gọi nó là big data thôi. Nó chỉ là nơi chứa dữ liệu và mình vẫn phải thực hiện các công việc khác. Nhiều người cứ nhầm lẫn big data làm được nhiều việc cả quản lý hành chính,… nhưng thật ra nó không làm được gì hết.

Anh có lời khuyên nào cho các bạn Junior Data Engineer không ạ?

Mĩnh vẫn khuyên các bạn trước mắt nên tập trung vào kiến thức nền tảng và tốt nhất thì các bạn nên có những project tự làm để nâng cao kỹ năng của mình lên. Vì nhiều khi đi làm bạn sẽ sử dụng những công cụ có sẵn của công ty thì lúc đấy các bạn chỉ biết thôi chứ không thể hiểu được công việc mình đang làm là cái gì.

Sau đó khi làm việc bạn phải luôn đặt ra cho bản thân một câu hỏi là công việc mình đang làm có giải quyết được gì cho business hay không, như vậy các bạn mới nhanh lên vị trí senior. Vì senior là những người sẽ đưa ra quyết định và hiểu vấn đề của business, nên các bạn đừng chỉ chăm chăm hoàn thành các task mà hãy cố gắng hiểu thêm về nó, như vậy sẽ giúp ích rất nhiều cho con đường công việc sau này của mình.

Xem thêm các việc làm it hấp dẫn tại Topdev.vn

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