Lỗi font tiếng việt php
Bạn đang để style CSS là dùng font chữ gì vậy? Ngoài ra bạn thử bật console lên xem các file font của bạn có load về được không
Nếu chưa dùng web font gì thì bạn thử dùng Google Font như Roboto xem sao
Chẳng hạn như add đoạn sau vào trong thẻ <head>
<link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
<style>
body {
font-family: 'Roboto', serif !important;
}
</style>
mọi người chỉ giúp em làm sao chỉ detail nhưng object ở status publish trong project laravel với ạ, hiện tại e detail luôn cả nhưng object close.
Bạn dùng where
để filter thêm điều kiện status
xem sao
$faq = $this->faqService->where(['id' => $faqId, 'status' => 'publish'])->first();
câu truy vấn trong laravel
Em nên có một bảng là hourly_order_logs
, daily_order_logs
. Cứ mỗi giờ, mỗi ngày thì em chạy cronjob để cập nhật số liệu vào các bảng ý, xem trong giờ trước, hay ngày hôm trước có bao nhiêu đơn hàng. Ví dụ như vào lúc 13:00
phút, job của em sẽ được chạy, và lưu vào bảng hourly_order_logs
với thông tin là
id | day | hour | order_count | created_at | updated_at |
---|---|---|---|---|---|
11 | 2018-12-03 | 11 | 2 | 2018-12-03 12:00:01 | 2018-12-03 12:00:01 |
12 | 2018-12-03 | 12 | 4 | 2018-12-03 13:00:01 | 2018-12-03 13:00:01 |
tương tự với thống kê theo ngày.
Khi cần in ra biểu đồ, thì em chỉ cần query trong các bảng log này thôi, chứ không cần phải tính toán phức tạp để đi đếm số order theo từng giờ, từng ngày nữa
đăng ký mới dịch vụ twilio sms ở Việt Nam
Mình vừa thử vào https://www.twilio.com/ để đăng ký, thì vẫn đăng ký được bình thường mà nhỉ
Sau khi nhập email, password ở trang https://www.twilio.com/try-twilio , bạn sẽ được dẫn đến một trang để verify số điện thoại, bạn chọn quốc gia là Việt Nam, rồi nhập số điện thoại của mình vào, sẽ có tin nhắn được gửi tới xong bạn nhập verify code là được mà
Không rõ bạn đang gặp rắc rối ở phần nào vậy nhỉ?
chỉnh sửa file trong thư mục /usr/bin/ của docker
Theo mình hiểu thì bạn đang gặp 2 vấn đề,
- Làm thế nào để chỉnh sửa file
abc.sh
- Làm thế nào để lưu lại nội dung sau khi chỉnh sửa vào image
Về hướng giải quyết thì sẽ như sau:
Chỉnh sửa file abc.sh
Nhìn chung sẽ rất khó để "mò" ra được file này nằm ở đâu trong máy của bạn, bạn nên chỉnh sửa trực tiếp trong container thôi. Bạn có thể dùng các command line editor như nano
, hay vim
để chỉnh sửa trực tiếp, rồi lưu lại, đây là cách nhanh chóng và dễ dàng nhất rồi
Nếu bạn không quen với việc sử dụng các terminal editor trên, thì bạn có thể đi theo hướng khác là mount một thư mục từ bên ngoài máy host của bạn vào bên trong container, bằng tham số -v
khi chạy: docker run -ti -v host_folder:/temporary image_name /bin/bash
. Với việc sử dụng Docker Volume thông qua option -v
như vậy, thì thư mục trong container sẽ được link với thư mục ngoài máy host, bạn chỉ cần dùng lệnh copy file từ /usr/bin/
vào thư mục /temporary
, rồi sửa bằng notepad ở bên ngoài, sau đó từ /temporary
copy ngược lại /usr/bin
là được.
Lưu lại nội dung vào image
Sau khi edit được nội dung file, bạn có thể lưu lại trạng thái của container hiện tại, để tạo thành image mới, bằng lệnh docker commit
. Về cú pháp của lệnh này, bạn có thể tham khảo ở trang document của Docker
docker commit -m "Edit abc.sh file" your_container_id new_image_name
Tuy nhiên, cách thực hiện việc thay đổi nội dung 1 image bằng cách edit trực tiếp bên trong container rồi lưu lại bằng docker commit
không phải là một cách hay, và không được khuyến khích làm. Nếu image của bạn đang dùng có public Dockerfile, bạn nên sửa trực tiếp từ file Dockerfile đó, và build lại image của riêng mình thì hơn
Unresolvable dependency resolving [Parameter #0 [ <required> $model ]] in class App\Repositories\Eloquents\DbBaseRepository
Bạn đang gặp phải lỗi đó là do Laravel không thể resolve ra một instance mà class DbBaseRepository
yêu cầu.
Cụ thể là ở đoạn code Constructor của class DbBaseRepository
/**
* @param $model
*/
function __construct($model)
{
$this->model = $model;
}
Đoạn này để tạo ra một instance của class DbBaseRepository
thì ta cần một instance $model
nữa, tuy nhiên framework lại không hề biết làm thế nào để tạo ra cái $model
đó.
Bởi thế, trước tiên, bạn cần phải chỉ rõ $model
đó đến từ đâu, là instance của class nào, làm thế nào để có thể resolve được ra nó trước đã
Chẳng hạn như là function __construct(DbBaseModel $model)
, hoặc là bạn có thể bỏ hẳn nó ở phần parameters trong constructor đi, và khởi tạo nó ở bên trong ý
function __construct()
{
$this->model = new $this->getModel();
}
Bạn đang dùng OS/distro nào? Cảm thấy ra sao?
Mình nghĩ là nếu không phải là làm app cho Windows thì bạn không có lý do gì để dùng Windows để code cả
Linux Distro thì có lẽ Ubuntu là đem lại UX tốt nhất
Một số câu hỏi liên quan đến Nuxtjs ( Vuejs)
Về câu hỏi 1 của em:
localStorage
là một đặc tả của HTML5, chứ không phải là một phần của Javascript. Tức nó chỉ tồn tại trên một số các trình duyệt có hỗ trợ mà thôi. Khi chạy ở phần server (nodejs), đương nhiên là sẽ không có biến nào làlocalStorage
cả, nên đoạn code của em sẽ bị lỗi.- Việc dùng
if (process.browser)
là để check xem đoạn code javascript đó đang được chạy ở phía server, hay phía client (browser), nhằm đảm bảo phần code liên quan đếnlocalStorage
chỉ chạy ở phía trình duyệt thôi, và nó là cần thiết bởi nếu bê đoạn code đó lên chạy ở phần server thì sẽ có lỗi, như em đã gặp phải
Về câu hỏi thứ 2 của em:
- Bình thường Laravel tự động check CSRF token là bởi vì các controller phía backend được chỉ định là phải làm thế. Xử lý logic check CSRF token được đặt ở trong
app/Http/Middleware/VerifyCsrfToken.php
(được kế thừa từ classIlluminate\Foundation\Http\Middleware\VerifyCsrfToken
). Middleware này được mặc định add vào middleware groupweb
(em có thể check nội dung trong fileapp/Http/Kernel.php
). Nên tất cả các routes em khai báo mà có middleware group làweb
thì đều sẽ phải verify CSRF token, hay nói cách khác, để truy cập vào các route đó thì phía client phải submit CSRF token lên. - Bên cạnh middleware group là
web
, Laravel còn có middleware group khác làapi
. Mặc định củaapi
không có middleware CSRF. Cụ thể đoạn code của phần đó (trong fileKernel.php
) như sau. Em có thể tham khảo thêm tại phần document về Middleware Groups trên website của Laravel
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
'auth:api',
],
];
- Do đó, khi truy cập đến các route mà có middle group là
api
thì em không cần submit CSRF token lên, đó là lý do tại sao em có thể gọi trực tiếp từ POSTMAN mà không bị lỗi gì
Vấn đề về phân trang trong PHP
Bạn thử tham khảo cách sau xem
Mình vừa nghĩ vừa code thẳng trên này luôn, nên không đảm bảo nó sẽ chạy được luôn đâu, bạn check qua nhé
// $currentPage số trang hiện tại
// $totalPage tổng số trang
$pagination = [$currentPage]; // Đây là mảng lưu các trang sẽ xuất hiện ở phần phân trang
while (count($pagination) < 5) { // Sẽ chạy vòng lặp cho đến khi nào mảng này có đủ 5 phần tử thì thôi
$left = $pagination[0] - 1; // Phần tử tiếp theo ở bên trái sẽ là phần tử bên trái ở thời điểm hiện tại trừ đi 1
$right = $pagination[count($pagination) - 1] + 1; // Phần tử tiếp theo ở bên phải sẽ là phần tử bên phải ở thời điểm hiện tại cộng với 1
$added = false; // Biến để kiểm tra xem có trang mới được thêm vào không
if ($left > 0) {
array_unshift($pagination, $left); // Đẩy page mới vào đầu mảng
$added = true;
}
if ($right <= $totalPage) {
array_push($pagination, $right); // Đẩy page mới vào cuối mảng
$added = true;
}
if (!$added) { // Nếu cả bên trái lẫn bên phải đều không thể thêm phần tử nào vào nữa, thì break khỏi vòng lặp
break;
}
}
// Sau vòng lặp này bạn sẽ có một mảng có tối đa là 5 trang
if ($pagination[0] != $currentPage) { // Nếu trang ngoài cùng bên trái, mà không phải là current page, thì sẽ có nút Previous
array_unshift($pagination, '< Previous');
}
if ($pagination[count($pagination) - 1] != $currentPage) { // Nếu trang ngoài cùng bên phải, mà không phải là current page, thì sẽ có nút Next
array_push($pagination, 'Next >');
}
// Đến đây bạn sẽ có mảng $pagination chứa đủ Previous, Next, lẫn 5 trang xung quanh currentPage, bạn chỉ cần foreach rồi in ra thôi :D
join query builder trong laravel
trong product_tag của em có data:
product_id: 1; tag_id:[tag1, tag2, tag3]
Vấn đề của em đang nằm ở phần thiết kế cơ sở dữ liệu này
Cách thức lưu ở bảng trung gian như của em như ở trên là không hợp lý, lưu như vậy em rất khó để dùng lệnh join
khi select tags
cho một product
. Ngoài ra khi select products
cho một tag
thì sẽ còn khó khăn hơn.
Em nên lưu dữ liệu như sau:
Bảng products
id | name |
---|---|
1 | S9 |
2 | S9+ |
3 | Iphone X |
Bảng tags
id | name |
---|---|
1 | Android |
2 | iOS |
3 | Samsung |
Bảng product_tag
id | product_id | tag_id |
---|---|---|
1 | 1 | 1 |
2 | 1 | 3 |
3 | 3 | 2 |
Như vậy em có thể dùng tính năng Many to Many Relationship của Laravel để có thể dễ dàng load ra tags
từ $product
bằng câu lệnh $product->tags
hoặc ngược lại. Em có thể tham khảo các câu trả lời khác trong bài này để có thêm thông tin chi tiết hơn nhé
Cách dùng PyStringNode trong Behat đối với ngôn ngữ PHP
pystrings
là cách để khai báo một đoạn văn bản dài trên nhiều dòng (Multiline Strings). Sở dĩ nó có tên là pystrings
bởi vì nó vay mượn cú pháp của Python.
Trong Python, ta có thể dùng """
để khai báo một đoạn comment block, tức ta có thể viết bao nhiêu nội dung vào giữa phần mở """
và phần đóng """
cũng được.
Behat cũng sử dụng cú pháp đó để cho phép bạn khai báo một đoạn text dài, nhiều dòng. Tức bình thường thay vì bạn viết
Scenario:
Given a post with the content "This is a very long post \n This is a new line \n This a another new line \n As you see, we have to use /\n for a line break"
Bạn có thể dùng cú pháp của pystrings
để viết thành
Scenario:
Given a post with the content:
"""
This is a very long post
This is a new line
This a another new line
As you see, we do not have to use \n for a line break
"""
Đoạn multiline strings này sẽ tự động được xử lý bởi class PyStringNode
, và một instance của class này sẽ tự động được đẩy vào hàm của bạn ở argument cuối cùng.
/**
* @Given a post with the content:
*/
public function blogPost(PyStringNode $content)
{
$this->checkLength($content->getRaw());
}
Để lấy ra nội dung text từ một instance PyStringNode
bạn có thể dùng hàm ->getRaw()
như ở trên
Bạn có thể xem thêm tại Document của Behat tại đây
Tích hợp cổng thanh toán Onepay vào website sử dụng Laravel
Mình thấy trên web site của Onepay họ có public module PHP về phần tích hợp thanh toán nội địa cũng như quốc tế, bạn thử tải về rồi check qua xem sao:
- https://mtf.onepay.vn/developer/?page=modul_noidia_php
- https://mtf.onepay.vn/developer/?page=modul_quocte_php
Ngoài ra trên Github cũng có package laravel-onepay này tích hợp thanh toán Onepay vào Laravel, bạn cũng thử tham khảo qua cách tổ chức code của họ xem sao
Cấu hình máy chủ thế nào cho app realtime
Ý bạn là muốn duy trì khoảng 100 kết nối websocket để thực hiện tính năng thông báo realtime à
Nếu chỉ là 100 kết nối websocket thì cũng không phải là cái gì lớn lắm, không rõ bạn còn chạy những services gì khác nữa không, nhưng nếu không có gì đặc biệt thì tầm server 2 Cores 4GB RAM (option 20$
/tháng) của Vultr là ổn. Nếu thấy vẫn tốn kém thì bạn cứ thử với option thấp hơn (1 cores, 2GB RAM) xem sao
tool/thư viện tạo ra string hiển thị tốt trong commandline
Mình thì không dùng CSharp
nên không được rõ lắm, còn với nodejs
thì mình dùng package console.table này, có vẻ như cũng phù hợp với bài toán của bạn
File CSV của mình
Field,Type,Null,Key,Default,Extra
ID,bigint(20) unsigned,NO,PRI,NULL,auto_increment
user_login,varchar(60),NO,MUL,,
user_pass,varchar(255),NO,,
user_nicename,varchar(50),NO,MUL,,
user_email,varchar(100),NO,MUL,,
user_url,varchar(100),NO,,,
user_registered,datetime,NO,,0000-00-00 00:00:00,
user_activation_key,varchar(255),NO,,,
user_status,int(11),NO,,0,
display_name,varchar(250),NO,,,
Code
const cTable = require('console.table');
const csvFilePath = 'test.csv';
const csv = require('csvtojson');
csv()
.fromFile(csvFilePath)
.then((jsonObj) => {
console.table(jsonObj);
});
Kết quả
Mình search với từ khoá console.table CSharp
thì có package ConsoleTables này dành cho C#
, bạn thử dùng xem sao
Cách để cancel push notification
Theo mình nghĩ là bạn sẽ không thể cancel được push notification đâu, một khi đã gửi đi rồi (bạn thậm chí còn không biết được push notification có gửi đi thành công hay không cơ :v)
Tuy nhiên, với trường hợp của bạn đang gặp
nếu người dùng đó login vào tài khoản web và nhận được push notification và họ đã xem. Sau một thời gian họ lại login tài khoản đó với android thì vẫn nhận được thông báo notification (vì mình push cho cả 2 nền tảng)
thì người ta thường chỉ có thể xử lý như sau:
- Có một table lưu nội dung các notifications gửi đến cho người dùng, đồng thời, có trạng thái của notification đó, xem là đã được đọc hay chưa.
- Mỗi khi user mở ra và đọc notification, update trạng thái của nó trong database, từ
unread
=>read
- Khi người dùng mở web hay ứng dụng, có icon hiển thị số lượng unread notifications, và số lượng này được cập nhật từ phía server khi người dùng mở app hay web
Khi đó thì nếu người dùng mở web, và đọc notifications trước, thì lượng unread notifications sẽ về 0. Trên điện thoại, bạn vẫn sẽ thấy có push notification báo về, ở trên thanh status bar, hay ngoài màn hình khoá (bởi nó được gửi đi từ trước, và không thể bị xoá bỏ nữa), tuy nhiên khi mở app ra, thì ở icon notifications sẽ báo là không có notification mới, chắc cũng giải quyết được phần nào
C# HtmlAgilityPack không load full html
Sở dĩ bạn không load đủ data có lẽ là do phần nội dung đó sử dụng ajax
để lấy dữ liệu từ server. Để giải quyết bài toán này, bạn có thể sử dụng Selenium
để giả lập quá trình chạy toàn bộ javascript từ phía code của mình, như khi nó được chạy trên trình duyệt vậy.
Bạn có thể tham khảo bài viết này https://viblo.asia/p/nodejs-dung-selenium-cheerio-de-crawl-du-lieu-4dbZNDGq5YM của tác giả @dinh.van.hoang xem sao. Mặc dù trong bài viết sử dụng nodejs
, nhưng nhìn chung phần sử dụng selenium
để giải quyết vấn đề thì chắc cũng phù hợp với bài toán của bạn
Auto deploy project vue js
Nếu project của bạn quy mô không quá to, và bạn cũng chỉ dùng CI cho 1 project đó, thì bạn nên sử dụng CircleCI, https://circleci.com
CircleCI miễn phí cho 1 concurrent job (1 bản build chạy ở 1 thời điểm), không phân biệt đó là bản build của private repo hay public repo. Hơn nữa CircleCI support First-Class Docker, tức bạn có thể chạy bản build bên trong một Docker Container mà mình chỉ định, nên dễ dàng config môi trường, cache lại các dependencies theo ý muốn. Vì thế CircleCI cho tốc độ build rất nhanh
Nếu project của các bạn to quá, 1 concurrent build không thể đáp ứng được điều kiện, thì bạn nên tính đến trường hợp ... trả tiền để upgrade plan thôi
Hoặc không thì bạn có thể tự build một service CI cho dịch vụ của mình sử dụng open source như Jenkins hoặc Drone xem sao
Hỏi về nơi lưu session
Session được lưu ở server thôi chứ cũng không nhất thiết là phải được lưu trong 1 file em ạ
Và việc lưu thế nào thì nó sẽ tuỳ thuộc vào ngôn ngữ, hay framework mà em sử dụng. Hầu như giờ các framework đều cung cấp các session driver khác nhau, để giúp lập trình viên có thể tuỳ chọn cách lưu trữ session khác nhau. Em có thể lưu vào file, lưu vào trong Redis, hay lưu vào trong Mysql/Postgresql cũng được hết
Nếu như em chuyên làm về Rails thì em có thể tham khảo bài viết TÌM HIỂU VỀ SESSION VÀ CÁCH THỨC LƯU TRỮ SESSION DATA của tác giả @nguyen.duc.tung để tìm hiểu kỹ hơn nhé
Nên học rộng ra để biết nhiều thứ hay nên tập trung vào một thứ thật tốt ?
Lúc mới bắt đầu làm việc, ở vị trí Programmer, mình nghĩ bạn nên học thật sâu về chuyên môn, về những kỹ thuật cần thiết cho dự án, để có thể hoàn thành tốt sản phẩm. Sau khi đã trưởng thành hơn, làm việc ở những vị trí có yêu cầu cao hơn, nhiều thử thách hơn, thì lúc đó tất yếu sẽ phát sinh nhu cầu cần phải biết nhiều thứ, để đưa ra các phương pháp giải quyết vấn đề, để giải đáp thắc mắc của các members khác khi cần .v.v.v
Nhìn chung, về việc "học rộng" hay "học sâu" thì mình nghĩ nó cũng tuỳ từng cách nghĩ và khả năng của mỗi người nữa
Cách tạo 1 web xem phim
nhưng em o rành lắm về mấy vụ này
Em không rành về mấy vụ này thì cụ thể là không rành về những vụ như thế nào nhỉ Do không rõ khả năng của em hiện tại ra sao nên cũng rất khó để đưa ra được hướng dẫn cụ thể
Về việc tạo 1 website, nếu em có kỹ năng lập trình tốt, em có thể tự code lấy, còn không thì có thể sử dụng Wordpress.
Về việc nhúng video thì em có thể post video lên Facebook, và dùng chức năng embed Video mà bản thân Facebook cũng đã hỗ trợ sẵn để đưa vào website của mình. Cụ thể thì em có thể tham khảo thêm tại hướng dẫn này: https://developers.facebook.com/docs/plugins/embedded-video-player#code-generator. Ngoài ra em cũng không nhất thiết phải dùng Facebook, anh thấy dùng Youtube thì tiện lợi hơn chứ nhỉ