PHP - queue process
Em thử cách này xem sao
- Thêm trường
remain_ticket
vào bảng ticket, lưu số lượng ticket còn lại. Trường này sẽ được cập nhật mỗi khi có một order thành công, và là kiểuUNSIGNED
- Mỗi khi select bản ghi trong ticket ra để so sánh
remain_ticket
vớiamount_ticket
trong oder, thay vì dùng câu lệnh select bình thường, em hãy dùngSELECT ... FOR UPDATE
. Câu lệnh này sẽ lock bản ghi lại, không cho phép transaction khác đọc, cho đến khi em update dữ liệu rồi commit transaction của mình. - Ở trong code, em start transaction, select
remain_ticket
, so sánh rồi cập nhậtremain_ticket
sau đó commit transaction. Như vậy có thể là sẽ ổn Để chắc chắn hơn thì lúc cập nhậtremain_ticket
, emtry ... catch
rồi rollback transaction nếu có lỗi luôn Bởiremain_ticket
có kiểu dữ liệuunsigned
, mysql sẽ báo lỗi khi nó bị trừ xuống còn âm mà.
Em có thể tham khảo https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html https://dev.mysql.com/doc/refman/5.7/en/select.html https://stackoverflow.com/questions/32827650/mysql-innodb-difference-between-for-update-and-lock-in-share-mode
Lỗi search like trong Laravel (search chữ d và đ)
Bạn thử sử dụng Vietnamese Collation xem sao
http://vietunicode.sourceforge.net/howto/vietcollationmysql.html
X++ là gì?
X++ là một ngôn ngữ lập trình hướng đối tượng tương tự như C#, và là một phần của MorphX development platform. MorphX thì là IDE trong bộ công cụ Microsoft Dynamics AX
Bạn có thể tìm hiểu thêm ở https://msdn.microsoft.com/en-us/library/aa867122.aspx https://en.wikipedia.org/wiki/Microsoft_Dynamics_AX#MorphX_and_X++
Tại sao tạo collection trong mongodb bằng nodejs lại có chữ "s" phía sau?
Đó là vấn đề thuộc về Naming Convention bạn ạ. Tên các Table (trong SQL) hay Collection (trong MongoDB) thường sẽ được đặt tên ở dạng số nhiều, do đó, rất nhiều framework sẽ tự động tạo ra cho bạn một bảng với tên ở dạng số nhiều theo mặc định.
Về lý do thì bạn có thể hiểu đơn giản như sau: Một bảng (hay một collection) sẽ chứa nhiều bản ghi. Chẳng hạn như collection students
sẽ chứa nhiều record, mỗi record là một student
. (Mỗi một instant được tạo ra từ Model
hay Entity
sẽ ứng với một record trong bảng, do đó tên class Model
hay Entity
sẽ ở dạng số ít, ngược lại so với tên bảng hay collection).
Điều này cũng giống như việc bạn đặt tên biến vậy, tên biến là một mảng thì bạn đặt tên là số nhiều, hay tên biến là một phần tử thì bạn đặt tên số ít thôi.
// Get All students
students = Student.all();
// Get only one student with id = 1
student = Student.find(1);
Cài song song PHP 5.6.x với PHP 7.x như thế nào?
Bạn có thể sử dụng phpenv để cài đặt nhiều version khác nhau, cũng như switch qua lại giữa các version một cách dễ dàng
HELP về app chat hẹn hò
Sử dụng Rails hay nodejs tiện lợi hơn. Vì em thấy active record rails e chưa biết xây dựng theo kiểu API
Nó cũng tuỳ thuộc vào việc bạn quen thuộc với ngôn ngữ backend nào hơn thôi, hãy mạnh dạn chọn ngôn ngữ nào mà mình thích, mình có nhiều kinh nghiệm hơn
P/S: Theo mình nghĩ thì Rails là một framework backend mạnh mẽ với nhiều gem supports, dùng nodejs thì cũng có nhiều web framework, nhưng để hoàn thiện được như rails thì chắc cũng khó.
Nodejs thì em biết cái socket.io là realtime có mấy video hướng dẫn làm chat. nhưng k biết em có đang hiểu sai về socket.io với một TCP ứng dụng chat k???
socket.io cho phép bạn tạo một server socket, để thêm phục vụ cho những tính năng về xử lý real time.
Giải pháp nếu em dùng Rails và dùng Nodejs với ạ
Thường thì một ứng dụng Rails có yêu cầu xử lý realtime người ta vẫn dùng cả Nodejs, mà cụ thể là socket.io. Tức là ứng dụng sẽ có phần web server (Rails), và socket server (socket.io).
Nếu bạn còn gặp những khó khăn như việc viết API với Rails, hay tìm hiểu và sử dụng socket.io ... bạn có thể tìm đọc các bài viết về API, Rails, hay Socket.io trên Viblo, mình thấy cũng khá nhiều đấy
Có và không có parent::__construct(); trong class con kế thừa, php OOP
Từ khoá parent
sẽ giúp bạn gọi đến hàm của class cha, tức class mà class hiện tại của bạn kế thừa (trực tiếp hay gián tiếp).
Hàm parent::__construct()
sẽ giúp bạn gọi đến hàm __construct()
của class cha.
Như ở ví dụ của bạn thì
<?php
class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor\n";
}
}
class AnotherSubClass extends BaseClass {
function __construct() {
print "In SubClass constructor\n";
}
}
$a = new BaseClass(); // In ra "In BaseClass constructor"
$b = new SubClass(); // In ra cả "In BaseClass constructor" và "In SubClass constructor"
$c = new AnotherSubClass(); // Chỉ in ra "In SubClass constructor"
Như bạn có thể thấy, nếu có hàm parent::__construct()
thì khi đối tượng được khởi tạo, nó sẽ gọi cả constructor của class cha, ngược lại thì không.
Package hay Framework này kết hợp với Laravel để làm Game?
Laravel thì cũng chỉ giúp bạn thiết kế phần backend của sản phẩm. Bản thân Laravel đã là một framework khá là đồ sộ rồi nên hầu hết các tính năng cơ bản cho việc thiết kế backend mình đều sẽ có đủ, tuỳ thuộc vào tính chất cũng như các tính năng của game mà mình có thể sẽ cần các package nhỏ khác cho backend thôi.
Bên cạnh đó, để làm về web game thì thành phần Frontend cũng quan trọng không kém. Tìm kiếm một framework, hay thư viện Javascript phù hợp là một điều cần thiết, bạn có thể tham khảo qua bài này https://viblo.asia/q/tu-van-ve-thu-vien-lam-game-bang-javascript-dbZNJMdvZYM
Ngoài ra, nếu game cần đến yếu tố real time, thì có thể dùng Nodejs với package socket.io, hoặc dịch vụ có sẵn là Pusher
Preview file trên web
Theo mặc định, trình duyệt không thể hiển thị được nội dung file docx
, pdf
cho bạn, mà bạn sẽ phải tự viết cách hiển thị nội dung các file đó thôi.
Có một cách đơn giản như bạn @KmasterYC đã đề cập ở trên, đó là dùng Google Docs Viewer, hoặc Microsoft Office Viewer để nhờ Google hay Microsoft hiển thị file giúp bạn. (có thể dùng plugin jquery dạng như thế này https://github.com/jawish/jquery.gdocviewer cho đơn giản)
Nếu bạn muốn tự viết thì có thể dùng các thư viện như pdfobject, PDF.js, docx2html, ... nhìn chung sẽ khá là phức tạp
angular2, Làm sao để style background imange
Background Image thì là thuộc tính CSS, bạn có thể dùng CSS để thực hiện mà không cần đến code JS. Còn nếu bạn cần phải thực hiện set backgroup image bằng javascript thì bạn có thể dùng
document.getElementById('elementId').style.backgroundImage = "url('imageUrl.jpg')";
đoạn code trên là thuần javascript, nếu project của bạn có dùng jQuery thì bạn có thể viết lại ngắn hơn thành
$('#elementId').css('background-image', 'url("' + imageUrl + '")');
Cả hai đều được thực hiện khá đơn giản, có điều không cần gì đặc biệt liên quan đến angular 2 cả
Thiết kế API
luôn ao ước mk có một API của chính mình
cái này mình không hiểu lắm, không biết bạn muốn làm tạo ra API dành cho công việc gì?
Để tạo API thì cũng rất đơn giản thôi, giống như việc bạn làm việc với phần server thông thường. Nếu bạn chưa biết bắt đầu từ đâu, thì mình có một vài lời khuyên như thế này:
- Học một ngôn ngữ lập trình backend, ví dụ như
PHP
,Ruby
,Nodejs
... - Học một framework của ngôn ngữ đó, ví dụ như với
PHP
thì làLaravel
, vớiRuby
thì làRails
... - Tìm hiểu về khái niệm Restful API, chẳng hạn như tham khảo bài Thiết kế RESTful API. Ngoài ra, bạn có thể tham khảo những bài có tag API trên Viblo tại https://viblo.asia/tags/api
- Tìm hiểu về
OAuth2
hayJson Web Token
, đương nhiên cũng có rất nhiều bài trên Viblo đề cập đến các kỹ thuật này rồi, bạn có thể tham khảo Introduction to Oauth2 hay JSON Web Tokens (JWT) vs Sessions, Tìm hiểu về json web token (JWT) ... - Hãy tự thực hành, tự code, đừng chỉ đọc lý thuyết xong bỏ đấy. Tự bắt tay vào làm thì bạn sẽ dễ dàng hiểu ra và học hỏi được nhiều vấn đề hơn
(Angularjs) Upload ảnh
Theo như mình đọc document và test từ trang https://docs.ckeditor.com/ckfinder/ckfinder3/#!/guide/dev_installation hay https://docs.ckeditor.com/ckfinder/demo/ckfinder3/samples/modals.html , thì có vẻ bạn có thể làm như thế này để chạy CKFinder từ button.
var button1 = document.getElementById( 'ckfinder-popup-1' );
var button2 = document.getElementById( 'ckfinder-popup-2' );
button1.onclick = function() {
selectFileWithCKFinder( 'ckfinder-input-1' );
};
button2.onclick = function() {
selectFileWithCKFinder( 'ckfinder-input-2' );
};
function selectFileWithCKFinder( elementId ) {
CKFinder.modal( {
chooseFiles: true,
width: 800,
height: 600,
onInit: function( finder ) {
finder.on( 'files:choose', function( evt ) {
var file = evt.data.files.first();
var output = document.getElementById( elementId );
output.value = file.getUrl();
} );
finder.on( 'file:choose:resizedImage', function( evt ) {
var output = document.getElementById( elementId );
output.value = evt.data.resizedUrl;
} );
}
} );
}
Khi đó, click vào nút Browse Server
thì Popup Window của CKFinder sẽ mở ra, cho phép bạn chọn file, bạn thử xem có được không
Hay ở trang này cũng có hướng dẫn tương tự tại https://docs.ckeditor.com/ckfinder/ckfinder3/#!/guide/dev_integration
Đấy là code ở phía js
, ngoài ra, để chạy được CKFinder trong project của mình, bạn cần code ở phần backend nữa.
Cụ thể, nếu bạn dùng PHP thì cần phải enable CKFinder PHP Connector, bạn có thể download source code về và làm theo hướng dẫn ở đây:
https://docs.ckeditor.com/ckfinder/ckfinder3-php/quickstart.html
Option privileged trong docker
Mình cũng chưa dùng goofys
bao giờ, nên cũng không hiểu rõ lắm, nhưng theo mình suy đoán thì:
- Check trên trang github https://github.com/kahing/goofys có đoạn giới thiệu
Goofys is a high-performance, POSIX-ish Amazon S3 file system written in Go
Goofys allows you to mount an S3 bucket as a file system.
Như vậy có vẻ như đây là công cụ để mount
file system
. Điều này đồng nghĩa với việc, để chạy được nó, bạn cần có quyền root
.
- Khi chạy Docker Container, theo mặc định thì hầu hết các thành phần có khả năng gây nguy hiểm thuộc về phần kernel sẽ bị vô hiệu quá, trong đó có các thành phần liên quan đến việc
mount
file system. Điều này có được nó rõ trong document của Docker tại đây
$ docker run -t -i --rm ubuntu bash
root@bc338942ef20:/# mount -t tmpfs none /mnt
mount: permission denied
This will not work, because by default, most potentially dangerous kernel capabilities are dropped; including
cap_sys_admin
(which is required to mount filesystems).
Và tham số --privileged
sinh ra để giải quyết vấn đề đó.
The
--privileged
flag gives all capabilities to the container, and it also lifts all the limitations enforced by the devicecgroup
controller. In other words, the container can then do almost everything that the host can do.
Theo mình đoán thì đó có thể là lý do bạn cần có option --privileged
khi chạy Container
[AngularJs] Bắt lỗi nhập kí tự đặc biệt và chữ có dấu cho input [type=text]
Mình không rõ bạn muốn làm cụ thể tính năng gì, có gì liên quan đến việc sử dụng AngularJS không, nhưng mà để check xem có lỗi nhập kí tự đặc biệt và chữ có dấu cho input hay không, thì bạn hoàn toàn có thể thực hiện một cách đơn giản bằng Javascript với việc sử dụng Regular Expression (trong tiếng Việt gọi là Biểu Thức Chính Quy)
Ví dụ
text = $('#input_id').val();
regex = /^[a-zA-Z]+$/; // Chỉ chấp nhận ký tự alphabet thường hoặc ký tự hoa
if (regex.test(text)) { // true nếu text chỉ chứa ký tự alphabet thường hoặc hoa, false trong trường hợp còn lại.
} else {
}
không biết câu trả lời có đúng ý bạn không nhỉ?
Lỗi cài đặt Codeception Line 845
Vấn đề 1: Lỗi khi chạy codeception
Hiện phiên bản mặc định khi cài đặt qua lệnh wget http://codeception.com/codecept.phar
là phiên bản dành cho PHP 7.
Bạn hãy kiểm tra phiên bản PHP của mình bằng cách gõ php -v
trên terminal xem sao nhé, nếu chưa phải là bản PHP 7 thì trước hết bạn cần update version PHP lên trước, hoặc là cài đặt codeception
cho PHP 5 thông qua lệnh wget http://codeception.com/php5/codecept.phar
.
Còn nếu đúng là phiên bản PHP 7 rồi mà vẫn gặp lỗi thì ... bạn báo lại để mình tìm hiểu thêm vậy
Vấn đề 2: Lỗi khi cài đặt Java
Câu lệnh được chia sẻ trong bài viết mà bạn tham khảo là câu lệnh trên hệ điều hành Ubuntu. Theo như screenshot bạn chụp thì bạn đang chạy trên Mac OS, nên sẽ gặp lỗi.
Bạn có thể tải về file cài đặt Java
cho MacOS tại đây
Vấn đề 3: Không thấy mục Composer trong menu chuột phải khi dùng PHPStorm
Bạn có thể thấy phần Composer từ mục Tools > Composer
(hoặc là click vào phần Help
và search Composer
là ra )
Đọc file json dung lượng lớn với php hoặc shell
Với một file dung dượng lớn như vậy, bạn sẽ không thể dùng cách mở file và get toàn bộ nột dung file như thông thường, bạn sẽ phải dùng streaming parser, tức sẽ đọc từng phần từng phần một của file để đưa vào memory xử lý.
Với PHP thì bạn có thể dùng package salsify/jsonstreamingparser, xem ví dụ ở đây
Như Python thì có thể dùng ijson
Hy vọng bạn có thể xử lý được vấn đề của mình
Cần trợ giúp gấp về máy chủ web chặn mạng xã hội
Câu hỏi của bạn cung cấp quá ít thông tin, mình phải ngồi một lúc để đoán xem bạn thực sự đang gặp vấn đề gì và muốn giải quyết thế nào
Theo như mình suy đoán thì:
- Bạn đang dùng trang https://www.seoprofiler.com/ để check SEO trên trang web của bạn
- Và khi bạn check cho trang http://lapdattongdaidienthoai.com thì nhận được thông báo lỗi là:
We could not access the website! Your web server does not allow the website audit tool to access your pages. The web host might block requests from Amazon AWS servers. The website audit tool in SEOprofiler runs on Amazon AWS servers. If your server rejects requests from AWS servers, the audit tool cannot access your pages. In that case, please ask your web host to allow requests from Amazon AWS IP addresses. Your web server blocks the user agent. For the audit, a user agent with the name "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0" was used. Make sure that your server accepts requests from that user agent, or change the user agent on the settings page. Only a few pages are on the project domain "lapdattongdaidienthoai.com" and the other pages of the website are on a different domain. In that case, create a project for the domain name that contains the pages.
Không biết như vậy có đúng không nhỉ?
Nếu là như vậy thì có vài điểm mình có thể giải đáp cho bạn:
- Lỗi ở trên là do trang SEOprofiler họ không thể truy cập được đến website của bạn. Trang SEOprofiler họ dùng server của Amazon AWS, và họ bảo bạn kiểm tra lại xem server của bạn có chặn request từ AWS không? => Cái này bạn phải contact với bên cung cấp server, host để hỏi xem có chặn dải IP nào không. Đồng thời xem lại config server, config web server xem có chặn IP nào không.
- Mình thử vào một server AWS của mình, và từ đó access vào website của bạn với User Agent giống với User Agent của bên SEOprofiler, và kết quả là mình vẫn access vào được bình thường với câu lệnh
curl -A "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0" http://lapdattongdaidienthoai.com
Như vậy khả năng nhà cung cấp server, hay host bên bạn chặn IP AWS là khá thấp. Nếu nhà cung cấp cũng không bảo chặn gì, và bạn kiểm tra không thấy vấn đề gì với server configuration, bạn phải viết mail support gửi cho bên SEOprofiler để bảo họ kiểm tra lại, cũng như cung cấp thêm thông tin chi tiết thôi.
Cài đặt postfix: cài đặt quyền cho mail file.
Bạn có thể nó rõ hơn về các users: user1, user2, và admin là users của services nào được không? Hay là chúng là users bình thường của Linux?
Nếu bài toán đặt ra là với các users của Linux, user admin
là user có quyền root
, và user admin
đó muốn access vào đọc folder Maildir của các users khác, thì mọi thứ rất đơn giản
Với user admin
, bạn có thể dùng lệnh sudo su
để trở thành root
, mà khi đã là root
rồi thì dù có là permission 600
đi chăng nữa thì bạn vẫn sẽ đọc và chỉnh sửa được
Nếu không có quyền root thì bạn buộc phải biết password của user1 và user2, bạn có thể dùng lệnh su - user1
và su - user2
để trở thành user1 và user2, lúc đó thì bạn sẽ có thể đọc được mail trong Maildir của các users đó.
P/S: Nếu bạn có quyền root
thì bạn có thể trở thành user1 hoặc user2 mà không cần biết đến password của họ, bằng cách gõ sudo su - user1
hoặc sudo su - user2
How to register application for app key, secret etc, taobao, 1688.con
Mình cũng chưa từng làm việc với taobao bao giờ, nhưng tìm hiểu qua hướng dẫn tại đây thì có vẻ là đầu tiên bạn cần tạo tài khoản ở trang http://open.taobao.com/ , sau đó cần verify tài khoản bằng thẻ căn cước ở Trung Quốc thông qua AliPay.
Sau khi verify được tài khoản thì bạn chỉ cần login, tạo app thì sẽ có thể thấy được API key cũng như download được SDK.
Sorry vào trang http://open.taobao.com/ nhìn toàn tiếng Trung không hiểu gì cả nên mình cũng không check được gì
tìm sách
Để thi đại học chuyên ngành CNTT thì em cũng chưa cần phải biết gì về tin cả, trước mắt cứ nên tập trung vào các môn Toán, Lý, Hoá đã em ạ :slight_smile:
Còn nếu muốn học thêm về tin thì trước hết em nên có một cuốn Tin học đại cương, giáo trình này dạng thì có nhiều, em cứ tìm quyển nào cũng được. Sau đó nếu có thể thì tìm mua quyển Ngôn ngữ lập trình C của thầy Quách Tuấn Ngọc, Cấu Trúc Dữ Liệu và Giải Thuật hoặc Cấu Trúc Dữ Liệu và Thuật Toán của thầy Nguyễn Đức Nghĩa.
Thế có vẻ là đủ kiến thức cơ bản để bước chân vào thế giới CNTT rồi