Viết test sao cho đúng
Đây là test kiểu Unit Test hay Integration Test ? Làm sao để phân biệt giữa 2 cái này ?
Bạn có thể tham khảo thêm về vấn đề này ở đây
Hiểu đơn giản thì Unit Test là quá trình mà ở đó, tất cả các Test Case cho từng function/method riêng biệt được viết, còn Integration Test là công đoạn trong kiểm thử phần mềm mà ở đó, từng đơn vị phần mềm riêng biệt được kết hợp lại, và kiểm tra như một khối thống nhất.
Một function test của bạn sẽ là Integration test nếu nó thực hiện một trong những việc sau đây:
- Trigger để chạy codes từ những functions khác trong project (từ function này gọi đến, và rồi chạy code ở function khác trong cùng project)
- Truy vấn vào cơ sở dữ liệu
- Sử dụng file system
- Truy cập mạng
- ...
Ở đây mình muốn test chặt chẽ hơn 1 chút, cụ thể là test đối với câu truy vấn SQL thuần thì phải thiết kế test như thế nào?
Bạn có thể dùng hàm DB::enableQueryLog()
để lưu lại log của câu truy vấn. Sau khi gọi hàm của model xong, bạn dùng DB::getQueryLog()
thì sẽ lấy được nội dung câu sql
mà bạn vừa thưc hiện.
Đấy là cách viết đơn giản, theo kiểu integration test, chứ muốn viết theo kiểu unit test thì nó sẽ khó khăn hơn nhiều, khi bạn sẽ phải mock cả database connection, ngăn việc truy vấn database thực sự xảy ra Bạn có thể tham khảo cách viết này.
Ai có examples test chuẩn có thể cho mình xin luôn ạ
Không dám nói là chuẩn, nhưng bạn có thể xem qua project này https://github.com/framgia/laravel-test-examples . Mặc dù được viết cách đây 2 năm rồi, hiện cũng không còn được maintain mấy nữa, nhưng hy vọng có thể giúp ích đôi chút cho bạn (^^;)
Không sử dụng được hàm array_push() trong PHP
Do đoạn code array_push($array_data, $node->text());
của em đang được sử dụng bên trong một anonymous function
, hay còn gọi là closure
, tức một hàm được truyền vào trong method ->each()
, nên nó sẽ không có quyền access vào biến $array_data
ở bên ngoài. Thay vào đó biến $array_data
ở trong anonymous function của em sẽ có giá trị là null
, bởi vậy nên em sẽ gặp lỗi array_push() expects parameter 1 to be array, null given
Muốn sử dụng biến $array_data
ở bên ngoài, em phải dùng từ khoá use
như sau
$crawler->filter('#company-profile-list .cp-item-detail h3')->each(function ($node) use ($array_data) {
array_push($array_data, $node->text());
});
Em có thể tìm hiểu thêm về Closure trong PHP tại bài viết này: https://viblo.asia/p/lambda-va-closures-trong-php-DXOGRZZnGdZ
Hỏi về cách xét vị trí tương đối của 2 đường tròn bằng js
Bài toán này anh nghĩ em có thể giải quyết như sau:
- Tính khoảng cách giữa tâm 2 đường tròn
d=(x1−x2)2+(y1−y2)2
- So sánh khoảng các giữa tâm 2 đường tròn, với tổng độ dài 2 bán kính r
d > r1 + r2 => return 1
d == r1 + r2 => return 0
d < r1 + r2 => return -1
Code
function Circle(x, y, r) {
this.x = x;
this.y = y;
this.r = r;
};
Circle.prototype.isOverlapped = function(c) {
var d = Math.sqrt(Math.pow(this.x - c.x, 2) + Math.pow(this.y - c.y, 2));
if (d == this.r + c.r) {
return 0;
}
if (d < this.r + c.r) {
return -1;
}
return 1;
}
Hiển thị ảnh và seed khi sử dụng Active Storage
Anh check trong file view của em thì có vòng for
<% @events.each do |event| %>
nhưng ở trong đó lại dùng
<%= image_tag(@event.pictures[0], :alt => "Event picture", :class => "events-list-picture") if @event.pictures.attached? %>
Đoạn trong vòng for
đúng ra em phải dùng event
thay vì @event
HỎI VỀ CÁCH XÂY DỰNG 1 TRANG WEB CHO NGƯỜI DÙNG ĐĂNG NHẬP BẰNG GOOGLE
Trước tiên em nên tìm hiểu về OAuth 2 thông qua các bài viết dưới đây, để hiểu rõ về cách thức hoạt động của nó:
- https://viblo.asia/p/introduction-to-oauth2-3OEqGjDpR9bL
- https://viblo.asia/p/oauth-2-authentication-oOVlYObzK8W
Sau đó, nếu dùng nodejs thì em có thể tham khảo thêm bài này https://viblo.asia/p/authentication-with-google-oauth-using-nodejs-passportjs-mongodb-gAm5yqAV5db
Hỏi về cách làm cho terminal của ubuntu bình thường đẹp như gitbash
Nếu bạn thích tìm hiểu sâu, tự mày mò nghiên cứu thì có thể tìm hiểu và sử dụng zsh
. Trên Viblo cũng có nhiều bài về zsh
với oh-my-zsh
rồi
Nếu bạn thích đẹp, đơn giản, dễ tuỳ chỉnh thì có thể dùng fish. Bạn có thể tham khảo bài viết này: https://viblo.asia/p/fish-a-phenomenal-unix-shell-ZWApGxObM06y
Trước thì mình chỉ dùng bash
và config cũng chỉ đơn giản thôi, sau đó vì mê vẻ đẹp và sự tiện lợi của fish
mà chuyển sang fish
trong một thời gian dài
Còn mấy năm nay thì lại quay về với bash
thông qua zsh
rồi
Căn bản fish
và bash
(zsh
) là 2 trình shell
khác nhau, đôi lúc có sự khác biệt (nếu bạn cần dùng nhiều sẽ nhận thấy, còn không thì chắc cũng không nhận ra), nên thôi thì cố gắng dùng bash
ở mọi lúc mọi nơi. Chứ fish
mình thấy có rất nhiều chức năng hay, như cái auto suggestion cực kỳ tiện lợi, bạn nên thử qua
Xin giải pháp lưu trữ assets
Với việc dữ liệu lên đến hàng TB thì việc lưu trữ ngay trong server chạy web service, nếu bạn dùng dịch vụ Cloud, là không khả thi lắm. Mà thay vào đó mình sẽ phải sử dụng các dịch vụ Storage.
Nếu có điều kiện thì tốt nhất vẫn là dùng Amazon S3 bạn ạ
Còn không thì có thể dùng các dịch vụ tương tự, như Spaces Object Storage của Digital Ocean, để tiết kiệm chi phí hơn
Truy vấn như nào để lấy dữ liệu theo từng ngày
Bạn có thể tạo một bảng user_register_logs
với các cột date
và users_count
để lưu dữ liệu này.
Hàng ngày vào 0h bạn chạy cronjob update data của ngày hôm trước vào trong bảng log đó. Khi cần dữ liệu để thống kê thì cứ thế mà select trong bảng log ra thôi
Layout bị trồng lên nhau khi dùng thư viện Mansonry Layout nếu không set height
Bạn chỉ cần set width cho nó bằng nhau thôi, chứ không cần set height làm gì, ảnh sẽ tự động được resize về theo tỉ lệ width:height
mà.
Chẳng hạn như
<?php foreach ($images as $image): ?>
<div class="col-xs-6 col-sm-6 col-md-4 col-lg-3">
<div class="thumbnail">
<img class="img-responsive" src="<?= $image ?>">
</div>
</div>
<?php endforeach; ?>
với
.thumbnail {
float: left;
}
.thumbnail img {
display: block;
max-width: 100%;
}
P/S: Mình cũng không chắc là đoạn code trên chạy đâu, đang tưởng tượng ra thôi
Hoặc bạn có thể tham khảo ví dụ này của chính Masonry này:
Cài đặt CakePHP trên MacOS bị lỗi
Anh vừa check thì thấy php-intl
đã được bundle vào sẵn gói package php của homebrew rồi, nên em chỉ cần install php bằng brew là sẽ có ngay intl
khích hoạt nhé, không phải cài thêm gì cả
Đơn giản chỉ cần
$ brew install php72
Chú ý là có thể em sẽ cần export path, hoặc start service php-fpm nên nữa nến cần. Dùng lệnh which php
để check từ terminal, nếu nó ra kết quả là /usr/local/opt/php@7.2/bin/php
thì được, còn ra /usr/bin/php
thì tức là em vẫn đang dùng php mặc định của MacOS.
Cài đặt CakePHP trên MacOS bị lỗi
Remove XAMPP đi, và cài lại hết bằng Homebrew em ạ
Lỗi hiển thị hình ảnh trên github pages
@hiimnhan Trang Github Page của bạn là https://hiimnhan.github.io/EPicture/ nhỉ
Không biết ý bạn có phải là những trang như https://hiimnhan.github.io/EPicture/categories/pic/ thì không load được ảnh đúng không nhỉ
Mình check qua thì thấy bạn đang dùng ảnh kiểu
style="background-image: url(/img/sunflower.jpg)"
do đó, trình duyệt sẽ load ảnh từ địa chỉ https://hiimnhan.github.io/img/sunflower.jpg, và rõ ràng đây là địa chỉ sai, nên sẽ gặp lỗi 404.
Do trang web của bạn được access từ đường link root là https://hiimnhan.github.io/EPicture/, thế nên, địa chỉ ảnh đúng phải là https://hiimnhan.github.io/EPicture/img/sunflower.jpg nhé bạn
Bạn cần sửa lại thành style="background-image: url(/EPicture/img/sunflower.jpg)"
chắc là được
Xoá hoàn toàn nginx
Em cài nginx
bằng gì vậy? nếu là bằng homebrew
thì nên dùng brew
để mà start với stop đi
Còn hiện tại, để kill cái process nginx trên máy em, thì trước hết, em gõ
lsof -i 4 -a | grep 8080
để check process đang lắng nghe ở port 8080 xem sao
P/S: Trên Linux thì anh vẫn dùng câu lệnh netstat -tapn
, còn trên Mac thì không nhớ lắm, toàn phải đi search =))
Đơn vị tính của Net I/O trong Docker
Theo như document của Docker thì cột NET I/O là để chỉ
The amount of data the container has sent and received over its network interface
tức là tổng lượng data mà container đã nhận về và gửi đi trong network, và chỉ số này được tính từ lúc container được dựng lên cho đến thời điểm hiện tại bạn ạ.
Lỗi khi hiển thị dữ liệu trong laravel
Lỗi mà bạn đang gặp phải đơn giản là có một $discussion
nào đó không gắn với $post
, nên khi bạn gọi $dis->post
sẽ nhận được kết quả là null
, và sau đó gọi $dis->post->title
sẽ ra lỗi.
Sở dĩ bạn dùng dd($dis->post->slug)
vẫn ra dữ liệu là bởi vì bạn đang dùng dd
trong vòng foreach
, hàm dd
sẽ chỉ in ra kết quả của vòng lặp đầu tiên, và dừng chương trình ở đó. Còn bỏ dd
đi thì vòng lặp của bạn cứ thế mà chạy, chạy đến khi nào $dis->post
là null
thì nó sẽ bị lỗi
Trước khi print ra thì bạn thêm câu điều kiện if ($dis->post)
xem sao
Cách bảo mật trong rails
Giả sử 1 token ở máy tính của em chưa hết hạn, bị người khác lấy trộm rồi đem về máy của họ gửi request lên => có phải lúc này họ có thể lấy được data của em.?
Đúng rồi em, khi mà token của tài khoản của em bị người khác lấy, thì họ có thể dùng nó để gửi mọi request lên server, để thực hiện những action mà token đó có quyền. Họ hoàn toàn có thể xem, tạo mới, chỉnh sửa, xoá dữ liệu của em.
Thực tế thì vấn đề này không chỉ xảy ra khi em dùng token, cả với cơ chế login thông thường thì em cũng có thể gặp phải tình trạng tương tự, khi mà dữ liệu từ form submit username/password, hay dữ liệu trong cookie của em cũng có thể bị người khác lấy trộm. (thông qua việc bắt và đọc gói tin mà máy tính của em truyền đi)
Và nếu họ có thể thể truy cập sau khi lấy trọm token của em như trên thì có cách nào để phòng chống việc này không?
Cách đơn giản để giải quyết bài toán này đó chính là phải làm thế nào để người khác không thể lấy được token của em. Và HTTPS chính là câu trả lời cho vấn đề này
HTTPS sẽ giúp em mã hoá được dữ liệu truyền lên, cũng như dữ liệu nhận về từ server, khiến cho người khác dù có bắt được những requests này đi chăng nữa, thì cũng không thể đọc được dữ liệu này.
Em có thể tìm hiểu thêm về HTTPS qua một vài bài viết ở dưới đây:
- https://viblo.asia/p/http-vs-https-lam-the-nao-de-website-bao-mat-hon-voi-ssl-jvElaLbxZkw
- https://viblo.asia/p/https-la-gi-va-huong-dan-cai-dat-NznmMdpoMr69
- https://viblo.asia/p/https-va-ssl-OeVKBg4AZkW
- https://viblo.asia/p/bao-mat-cua-http-va-https-4P856RgO5Y3
- https://viblo.asia/p/ssltls-la-gi-Do754wnBlM6
Ngoài ra, một số trang web có thể làm chặt chẽ hơn là họ gắn token với địa chỉ IP hiện tại của em, và sẽ vô hiệu hoá token đó nếu nó được gửi từ một IP khác. Đó cũng là một cách mà em có thể tham khảo thêm.
Hỏi 1 số issue về play music với react.
Về phần Browser không cho phép autoplay, hay autoplay mà không có tiếng, thì nó thuộc về Policy của trình duyệt rồi, bạn có thể xem thêm tại đây,
trước cũng từng có bạn khác hỏi về vấn đề này
Mọi người cho mình hỏi tên loại font chữ này với.
Hình như là font Operator Mono
https://www.typography.com/blog/introducing-operator
Tuy nhiên đây lại là font có phí bạn ạ
Sự khác nhau khi gọi hàm thực thi trong ComponentWillMount và hàm setState()
Có một vài điểm em cần nắm rõ, thì sẽ hiểu được bản chất của vấn đề hơn
Một function trong Javascript thực tế cũng chỉ là một object, nên em có thể thực hiện các phép gán, hay pass các object đó vào trong một hàm khác. Ví dụ
function test() {
console.log('Hello');
}
a = test;
a(); // gọi hàm, in ra Hello
Việc em dùng ()
thì là một lời gọi hàm, còn không có, thì nó chỉ như một biến (object) bình thường mà thôi.
Như vậy this.printCount();
thì là lời gọi để chạy hàm printCount
, còn this.setState({ count: this.state.count + 1 }, this.printCount);
thì tức là em truyền this.printCount
như là một biến vào trong hàm this.setState()
. Khi đó người ta gọi this.printCount
là một callback
, và nó chưa được gọi (chưa được chạy) ngay. Việc gọi hàm đó được thực hiện ở đâu đó trong phần logic bên trong hàm setState
.
Laravel : xin mọi người thông não giúp em. không lưu tags là khoảng trống trong DB tags.
Đoạn này
if ($item != " ")
bạn thử chuyển thành
if (!empty($item))
xem sao