Học Lập trình ở cơ sở nào?
Bạn nên nói rõ về tình hình của bạn hiện tại (như đang là học sinh, sinh viên, hay đã đi làm rồi, đang ở Hà Nội, hay TPHCM hay ở nơi nào khác ...) thì mọi người sẽ có thể đưa ra lời khuyên được chính xác hơn
Nếu nói về trường đại học, ở Hà Nội thì bạn nên chọn Đại Học Bách Khoa, Đại Học Công Nghệ - Đại Học Quốc Gia Hà Nội, Học Viện Công Nghệ Bưu Chính Viễn Thông, Học Viện Kỹ Thuật Quân Sự ...
Nếu nói về trung tâm học lập trình, ở Hà Nội, thì bạn có thể tham khảo Awesome Academy, hay Aptech xem sao
Về lộ trình thì còn tuỳ thuộc vào việc bạn có thể dành bao thời gian để học nữa, học ở Đại Học sẽ có lộ trình khác học ở Trung Tâm để đi làm. Nhìn chung là nên phải học hết những kiến thức cơ bản (Thuật Toán, Lập Trình Hướng Đối Tượng, Database ...) đã thì bạn sẽ có cái nhìn rõ ràng hơn về việc nên chọn con đường nào tiếp theo
Tạo đường dẫn cho blog Laravel
Anh vẫn chưa hiểu câu hỏi của em lắm, em đang gặp vấn đề với việc hiển thị nội dung bài viết theo đường dẫn http://localhost/post/{category-slug}/{post-slug}/
à
Nếu vậy thì là do đoạn định nghĩa Route::get('/post/category_slug/post_slug', function() {})
của em đang có vấn đề rồi. Nếu cần đưa category_slug
hay post_slug
vào URL dưới dạng parameter, thì em cần đặt chúng vào trong dấu { }
, tức em cần định nghĩa route như sau:
Route::get('/post/{category_slug}/{post_slug}', function($categorySlug, $postSlug) {
// Xử lý ở đây
// Bước 1: Tìm $post theo $post_slug
// Bước 2: Từ $post, tìm ra $category, và so sánh với $category_slug
// Nếu $post->category->slug khác với $category_slug trên URL thì có 2 cách xử lý, 1 là trả ra lỗi, 2 là redirect sang đường dẫn với category_slug chính xác
// Nếu $post->category->slug bằng với $category_slug, thì tiếp tục xử lý logic hiển thị
});
Tại sao khi build trang web phía browser luôn convert lại tên của các js css về dạng 1 ký tự ?
nhưng khi publish code thì sẽ đặt lại là 1 ký tự gì đó, ví dụ
function c( ) { }
Việc khi publish code tên biến bị thay đổi không phải là do người viết code cố tình sửa lại thế, mà là do code đã qua công đoạn minify, bởi một tool npm nào đó, như uglify-js
, minifier
, babel-minify
... bạn ạ. Lúc đó code sẽ được tối giản hết mức để có được kích thức nhỏ nhất có thể.
Các cách để tối giản code thì như bạn đã nói, có thể là rút ngắn tên biến, tên hàm còn a
, b
, C
... loại bỏ các dấu xuống dòng, khoảng trắng, index ...
Ngoài ra trong đoạn code của bạn còn có một phương pháp nữa, đó là ở đoạn passive: !0
. Mình đoán là khi code mọi người sẽ viết passive: true
, nhưng qua công đoạn minify, nó đã trở thành passive: !0
, đơn giản vì viết chữ true
tốn đến 4 ký tự, còn viết !0
thì chỉ mất 2 ký tự thôi. Các công cụ minify nó tính toán chi ly đến thế cơ bạn ạ, nên cũng không có gì khó hiểu khi nó đặt lại tên biến, tên hàm cho ngắn gọn cả
Tạo nút đăng ký cho 1 Website
Đoạn code sign up của em đang gặp một vấn đề là nó đang không validate giữ liệu mà user truyền lên.
Nhìn chung em nên có một tư tưởng là hầu hết các dữ liệu users gửi lên đều cần phải validate trước khi lưu vào trong database, và như thắc mắc của em, validate việc email
hay username
có bị trùng hay không là một trong những việc cần thiết. (Ngoài ra em cũng nên validate xem email
có đúng format hay không, password
có đủ dài, đủ mạnh hay không, và nên có một trường là password_confirmation
và so sánh với password
xem có trùng hay không để kiểm tra chắc chắn rằng người dùng nhập đúng password theo ý họ ...)
Về việc validate username
hay email
thì sau bước lấy dữ liệu từ form, em hãy truy vấn trong bảng User
xem có record nào có username
hay email
như vậy hay không. Nếu có trả ra kết quả (tức là đã bị trùng) thì em không được phép lưu lại vào trong database nữa, thay vào đó em đưa người dùng trở lại trang sign up bằng return redirect(url_for("customer_sign_up"))
. Thế nên đoạn xử lý này thì cần được viết vào khoảng dòng 165 theo như trên hình của em.
Còn việc làm thế nào để trang sign up hiển thị được ra lỗi thì em cần có thêm một biến là errors
để lưu nội dung lỗi, chẳng hạn ở đây thì:
errors = [
"email" => "This email has been used",
];
Sau đó em lưu biến errors
này vào trong session
, ở trang sign up thì em check xem trong session có data về errors
hay không, nếu có tức là đang có lỗi, và em hiện ra thông báo lỗi ở trong đó
P/S: Ngoài ra có vẻ như em còn đang gặp một vấn đề là em lưu nguyên password của người dùng vào trong database mà không qua mã hoá, không biết có phải không nhỉ
[PHP] Random đánh trọng số
Trước đây mình cũng có từng gặp bài toán này, và đã viết một package composer
để có thể dùng lại trong các project khác nhau, bạn có thể tham khảo tại wataridori/bias-random
Install
composer require wataridori/bias-random
Usage
$biasRandom = new wataridori/BiasRandom/BiasRandom();
$data = [
'wataridori' => 10,
];
$biasRandom->setData($data);
$biasRandom->addElement('Tran', 20);
$biasRandom->addElement('Duc', 30);
$biasRandom->addElement('Thang', 40);
// Random one element with weight.
$biasRandom->random();
// Random two elements
$biasRandom->random(2);
Về source code, bạn có thể xem ở đây
P/S: Mình thấy cách bạn đang làm cũng ổn mà nhỉ, sao bạn lại nghĩ là nó đang ưu tiên thứ tự từ trên xuống (mà trong object ví dụ của bạn thì tỉ lệ được sắp xếp theo thứ tự từ trên xuống, nên ra kết quả ưu tiên từ trên xuống cũng là đúng mà nhỉ :v)
Lỗi chạy npm run build
Chắc là do node
với npm
của bạn rồi, bạn update lên xem sao
Bạn có thể dùng n để quản lý version node
trong máy của mình
$ sudo npm install -g n
$ sudo n stable
Sau đó bạn kiểm tra xem version node
với npm
trong máy mình là gì? (nếu vẫn gặp vấn đề thì bạn gửi luôn thông tin về version node
, npm
của mình lên đây nhé )
$ npm -v
$ node -v
Sau khi update xong, bạn hãy tiến hành rebuild lại node-sass
xem sao
$ npm rebuild node-sass
Xữ lý load icon emoji ứng với ký tự tương ứng
Chat++
thực tế là gọi hàm có sẵn trong phần code javascript của Chatwork
, nên bản thân trong source code của nó cũng không có phần handle replace link emoticons bạn ạ
Còn để thực hiện chức năng replace text emoticon với link image, bạn có thể dùng cách sau:
// Khai báo biến emoticons
var emoticons = [
{"key": "(vidieu)", "src": "https://i.imgur.com/WAz2V2F.jpg"},
{"key": "(boiroi)", "src": "https://i.imgur.com/Qnp4w95.jpg"},
];
function generateRegexFromString(string) {
return string.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&");
}
// Tạo ra một patterns regex duy nhất với tất cả các emo text
var patterns = [];
for (var i in emoticons) {
patterns.push('(' + generateRegexFromString(emoticons[i].key) + ')');
}
var emoticonsRegex = new RegExp(patterns.join('|'), 'g');
// Xử lý replace text emoticon bằng link image
contents.replace(emoticonsRegex, function (match) {
// Replacement logic here
});
trên đây là một đoạn code sơ sài, chủ yếu là để giải thích về ý tưởng tạo 1 regex duy nhất để replace theo regex đó, bạn thử tham khảo xem sao
Còn trong thực tế, bạn cần chú ý thêm một điều nữa là không được replace emo text bên trong thẻ <code>
, nên bạn cần thêm bước nữa là lọc ra content bên ngoài thẻ <code>
để mà replace nữa nhé
Xin Extension chrome translate japanese to English or Vietnamese
Ngày trước mình hay dùng rikaikun, nó được tạo ra để dành riêng cho việc dịch tiếng Nhật, nên có bộ từ điển khá chuẩn, dịch cả được cách đọc Kanji nên rất hữu ích. Bạn chỉ cần di chuyển con trỏ đến đâu là nó sẽ dịch đến đó. Tuy nhiên nó có chút hạn chế là chỉ dịch sang tiếng Anh thôi chứ không có tiếng Việt
Bạn thử tham khảo xem có giúp ích gì được không
React js, Framework,
Bản thân React JS là một thư viện hỗ trợ làm phần view (user interfaces), thế nên nếu ý bạn là muốn dùng nó để làm logic backend phức tạp thì rất tiếc là nó không phù hợp, bạn nên tìm những framework hỗ trợ viết backend thì hơn.
Còn nếu ý bạn là muốn đưa code frontend viết bằng ReactJS lên render ở phía server, tức làm Server Side Rendering, thì bạn có thể dùng Next.js
SQL Prompt 9_ SQL Server 2014
Có lẽ bạn gỡ ra không đúng cách, nên SQL Server nó vẫn nhận Add-in và tìm cách load "SQL Prompt 9" vào
Trên trang document của SQL Prompt 9 cũng có nhắc đến lỗi này, là do thiếu file extensibility.dll
khi khở chạy SQL Server. Trước hết, bạn thử theo cách đó để fix lỗi, cho SQL Prompt 9 chạy được lại đi, nếu cần thiết thì cài lại nó chẳng hạn.
Sau đó thì làm theo hướng dẫn sau để remove nó xem sao
Không download được file rpm trong centos 7
Bạn thử chuyển sang dùng IPv4 để tải về xem sao
wget -4 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.2.rpm
còn không được thì có thể là do vấn đề về đường truyền mạng của bạn, bạn thử dùng wget
để tải về những file khác xem có được không
Lỗi khi chạy Docker up trên môi trường MacOS
Em thử cài thêm package ca-certificates
xem sao, trong Alpine không có sẵn thì phải.
RUN apk update \
&& apk add ca-certificates \
&& update-ca-certificates
hoặc chuyển sang dùng image Ubuntu ý
Định nghĩa về Separation of concerns
Separation of Concerns em có thể hiểu là phân tách phụ thuộc hay chia tách quan hệ, đại loại như vậy
Tư tưởng của Separation of Concerns là phân tách hệ thống ra thành các thành phần, chức năng nhỏ hơn, sao cho chúng càng ít điểm chung (về mặt chức năng), hay càng ít phụ thuộc vào nhau càng tốt. Khi các thành phần được ghép nối vào trong hệ thống, chúng sẽ tương tác với nhau thông qua thông tin về Interface, hay các open API, mà không cần phải biết các thành phần kia được xây dựng như thế nào, bên trong đó được lập trình (implement) ra sao.
Các lợi ích mà Separation of Concerns đem lại thì có rất nhiều, có thể kể ra một vài cái như:
- Do chia nhỏ thành các thành phần, tính năng, nên code có thể dễ đọc, dễ maintain hơn
- Quá trình phát triển nhanh hơn, do các thành phần, tính năng có thể phát triển độc lập với nhau, bởi các team khác nhau
- Các thành phần có thể được update, modify một cách độc với nhau
- Các thành phần có thể sử dụng lại
- Có thể sử dụng các thành phần do bên khác phát triển, mà không cần phải chỉnh sửa, cũng như không cần hiểu rõ chi tiết bên trong nó như thế nào
- ...
Separation of Concerns là một design principle (nguyên lý thiết kế) phổ biến trong phát triển phẩn mềm, với rất nhiều các thể hiện, có thể rất quen thuộc với các lập trình viên, nhưng họ lại không hay để ý đến, ví dụ một vài cái đơn giản như:
- HTML/CSS/Javascript với các ngôn ngữ đóng những vai trò khác nhau
- Mô hình MVC, với các tầng Model, View, Controller đảm nhiệm các nhiệm vụ riêng biệt khác nhau
- Kiến trúc Microservices với các service thực hiện những nhiệm vụ khác nhau
- Ở tầng thấp hơn, như trong lập trình hướng đối tượng, Separation of Concerns được thể hiện qua một design principle khác là Single Responsibility (Nguyên lý đơn trách nhiệm)
- ...
V/v xây dựng chức năng nhóm bài viết cho một bài viết.
Khi định nghĩa cột idGroupPost
đó trong migration, thì em để nó là ->nullable()
, để nó có thể nhận giá trị mặc định là null
là được mà Foreign key vốn không bắt buộc là phải khác null
.
Những bài viết mà không có trong nhóm nào thì để giá trị idGroupPost
của nó bằng null
là hợp lý rồi
Tại sao lại là Vuejs
Về căn bản thì phần xử lí sự kiện em thấy không khác Jquery là mấy
Anh thấy khác nhau nhiều mà Có thể phần em thấy nó không khác nhau là vì nó cùng là code ... javascript thôi, chứ thật sự thì 2 cái khác nhau nhiều.
jQuery là một library, tức khi code, em sẽ gọi hàm của jQuery để sự dụng,
VueJS là một framework, tức khi code, em sẽ viết theo quy chuẩn của VueJS quy định, để nó sử dụng code của em.
Query is DOM-driven while Vue is data-driven
Đúng như em nói, hiểu được cái này thì em sẽ thấy được cách tiếp cận của jQuery với VueJS khác nhau cơ bản như thế nào, và tại sao em không nên dùng jQuery.
jQuery là DOM-drive
, tức là các công việc của em khi xử lý tương tác của người dùng là xử lý với DOM
, làm việc với jQuery thì phải nói là DOM
everywhere, chỗ nào cũng thấy tên class với tên id =)) Có thể đây là một cách dễ tiếp cận, code cũng dễ hiểu, dễ đưa vào trong project, tuy nhiên code của em sẽ rối bung lên một cách rất nhanh chóng, khi project của em to ra, có nhiều tính năng mới được thêm vào. Hay nói cách khác, dùng toàn code jQuery sẽ khiến project của em rất khó maintain sau này. Chưa kể jQuery rất nặng nữa :v
VueJS (hay Angular, ReactJS) sinh ra dành để thiết kế frontend. Và như em nói, code với Vue là cách code data-driven
, tức em thao tác trên data (bằng javascript) là chủ yếu, chứ không phải quan tâm xem select cái DOM này như thế nào, add cái event kia ra sao ... Các công việc đó đã có framework lo cho rồi VueJS ra đời sau nên cũng tiếp thu được rất nhiều điểm hay, mới mẻ từ Angular và ReactJS, em cứ tìm hiểu thì sẽ thấy được cái hay, cái thú vị của nó
Vậy tóm tắt lại một chút cho các câu hỏi của em nhé
Vậy tại sao mọi người khuyến khích dùng Vue vậy ạ
jQuery không còn thích hợp với việc phát triển web hiện đại. Em nên từ bỏ việc dùng jQuery trong project của mình thì hơn.
Các anh cho em hỏi Vue thì có gì khác hoặc tốt hơn Jquery không ?
Vue nhẹ hơn, nhanh hơn, mạnh mẽ hơn, làm được nhiều việc hơn, mang nhiều cú pháp, tư duy mới mẻ hơn, giúp code trong sáng, dễ maintain hơn ...
Nếu có đem so sánh, thì nên so sánh VueJS với ReactJS, hay Angular thì hơn
Để tìm hiểu thêm về VueJS, em có thể tham khảo series Cùng học VueJS từ con số 0 hay Cùng nhau học VueJS trên Viblo xem sao
Service Provider Laravel
Em cứ tưởng tượng rằng mình có một mảng là $bindings = ['abstract' => 'instance']
, mỗi lần em gọi hàm bind
thì Laravel sẽ thực hiện việc update cái mảng $bindings
đó.
Giống như khi update một mảng bình thường thôi, nếu em đưa vào một key
đã tồn tại trong mảng, thì giá trị của nó sẽ được update. Hay hiểu đơn giản là cái sau sẽ ghi đè lên cái trước.
Vậy câu trả lời là Server Container sẽ (và chỉ có thể) resolve ra implementation được khai báo trong câu lệnh bind
chạy sau cùng thôi
Linux java command line
Để run được file jar
thì bạn cần dùng lệnh java
chứ nhỉ
Bạn thử câu lệnh sau xem sao:
java -jar /path/to/folder/file_name.jar
Bạn không thể dùng câu lệnh /path/to/folder/file_name.jar
để thực thi file jar
, bởi vì 2 điều:
- Các file của Linux mặc định không có quyền thực thi (bạn check
ls -l /path/to/folder/file_name.jar
thì sẽ thấy không có quyềnx
) - Hệ điều hành không biết làm thế nào để chạy file
jar
.
Nếu bạn vẫn muốn chạy file mà không cần dùng câu lệnh java
, mà chỉ muốn dùng /path/to/folder/file_name.jar
thì bạn có thể làm theo cách sau:
- Thêm quyền thực thi cho file
chmod u+x /path/to/folder/file_name.jar
- Cài đặt thêm package
binfmt-support
. Theo mình tìm hiểu thì có vẻ nó sẽ giúp bạn chạy file.jar
mà không cần dùng đếnjava -jar
Mọi người giúp em sửa lỗi này ạ
Operation timed out
thì có vẻ là lỗi khi mà application của bạn không thể kết nối đến server database.
Bạn kiểm tra lại xem chắc chắn server database đã chạy chưa, và các thông số config để Laravel kết nối đến server database (hostname, port, user, password) đã chính xác chưa
Các hàm bị đè lẫn nhau trong Laravel
Cái này
Route::patch('/matches/{id}', ...);
Route::patch('/matches/{id}', ...);
Route::patch('/matches/{id}', ...);
đương nhiên là không được rồi em =))
Em cứ thử tượng tưởng đơn giản như thế này: nếu phía client (browser) submit một request với method là PATCH
vào địa chỉ /matches/1
, thì phần backend biết điều hướng request đó cho controller nào xử lý
Một là em phải thay đổi HTTP method, hai là phải thay đổi URL thôi
Cách chống XSS cho website
Bài viết của em có thể chứa một số tag HTML
, tuy nhiên không nên chứa tag <script></script>
, em có thể lọc bỏ, hoặc escape tag này đi.
Ngoài ra, để chống việc chèn javascript vào attributes của các tag HTML thông thường, em cũng nên duyệt qua các tag HTML khác, để remove các attributes đi, chỉ cho phép class
thôi chẳng hạn
P/S: Việc cho phép người dùng sử dụng các tag HTML sẽ kéo theo nhiều vấn đề không lường trước được. Đặc biệt nếu cho phép người dùng đưa custom style của họ vào các thẻ HTML (chẳng hạn như <div style="color:blue; font-side: 100px">
) có thể sẽ khiến layout bài viết bị phá vỡ, em nên cân nhắc