Thừa số nguyên tố và Chính phương
Đầu tiên, chúng ta cần hiểu rằng, để một số là số chính phương, thì khi phân tích nó thành tích các thừa số nguyên tố, các thừa số nguyên tố đó đều phải có bậc là chẵn.
Ví dụ 25=52, có 5 có số mũ là chẵn, nên nó là số chính phương. 20=22∗5, có 2 có sỗ mũ chẵn, 5 có số mũ lẻ, nên nó không là số chính phương.
Theo đó, để tìm số chính phương từ tích của các số được lấy từ tập các số từ 1 đến n
, thì chúng ta cần chọn ra một danh sách các số, sao cho khi phân tích tích của chúng thành các thừa số nguyên tố, thì các thừa số nguyên tố đó đều có bậc là chẵn, đồng thời chúng ta phải tìm số lớn nhất, và dãy số tạo ra số lớn nhất như vậy.
Nếu để ý kỹ, bạn sẽ thấy chúng ta chỉ cần lấy n!, phân tích n! thành tích các thừa số nguyên tố, và khi đó, chỉ cần hạ một bậc của các thừa số có số mũ lẻ, xuống số mũ chẵn, thì chúng ta sẽ được một số chính phương. Theo đó chúng ta chỉ cần chia n! cho các số nguyên tố mà có sỗ mũ lẻ, là sẽ được một số chính phương, và đây chính là số chính phương lớn nhất mà chúng ta cần tìm.
Ví dụ, nếu n = 8 thì 8!=40320=27∗32∗5∗7
Theo đó 2, 5, và 7 là có số mũ lẻ, theo đó ta chỉ cần loại bỏ 2, 5, và 7 ra khỏi dãy số ban đầu, và còn lại 3, 4, 6, 8 thì tích của 4 số này sẽ tạo ra số chính phương mà chúng ta cần (tích của chúng sẽ là 26∗32, không cần phải tính ra kết quả thì nhìn cái cũng thấy nó là một số chính phương rồi)
Hoặc bạn có thể làm một cách khác, xử lý số nhỏ hơn, không phải tính giai thừa (số sẽ rất to), đó là phân tích các số từ 1 đến n thành tích các thừa số nguyên tố, rồi lần lượt đếm xem số lần xuất hiện của các thừa số nguyên tố là chẵn hay lẻ, số nào xuất hiện lẻ lần, thì chính là số cần loại bỏ trong dãy số sẽ tạo ra số chính phương cần tìm.
Bạn có thể tham khảo đoạn code Python dưới đây (generated by ChatGPT, nên bạn check kỹ nhé 😅)
import math
from collections import Counter
def prime_factors(n):
"""Trả về danh sách các thừa số nguyên tố của n."""
i = 2
factors = []
while i * i <= n:
while n % i == 0:
factors.append(i)
n //= i
i += 1
if n > 1:
factors.append(n)
return factors
def calculate_factorial_prime_factors(n):
"""Phân tích n giai thừa thành thừa số nguyên tố."""
total_factors = Counter()
# Phân tích thừa số nguyên tố của tất cả các số từ 2 đến n
for i in range(2, n + 1):
factors = prime_factors(i)
total_factors.update(factors)
return total_factors
def max_square_from_factorial(n):
"""Tính số chính phương lớn nhất bằng cách loại bỏ đúng các thừa số nguyên tố có số mũ lẻ."""
# Bước 1: Tính thừa số nguyên tố của n giai thừa
factorial_factors = calculate_factorial_prime_factors(n)
# Bước 2: Xác định các số nguyên tố có số mũ lẻ
primes_with_odd_exponents = {prime for prime, exponent in factorial_factors.items() if exponent % 2 == 1}
# Bước 3: Loại bỏ chính xác các số nguyên tố có số mũ lẻ khỏi danh sách các số
used_numbers = []
for i in range(2, n + 1):
# Nếu i là một số nguyên tố và có số mũ lẻ, loại bỏ nó
if i in primes_with_odd_exponents:
continue
# Nếu i không phải là một số nguyên tố cần loại bỏ, giữ lại nó
used_numbers.append(i)
# Bước 4: Tính số chính phương lớn nhất từ danh sách còn lại
max_square = 1
for num in used_numbers:
max_square *= num
return max_square, used_numbers
if __name__ == "__main__":
# Nhận giá trị n từ stdin
n = int(input("Nhập giá trị n: "))
# Tính số chính phương lớn nhất và các số tạo thành nó
max_square, used_numbers = max_square_from_factorial(n)
# In ra số chính phương lớn nhất
print(f"Số chính phương lớn nhất bằng tích của các số từ 1 đến {n} là: {max_square}")
# In ra căn bậc hai của số chính phương lớn nhất
sqrt_max_square = int(math.sqrt(max_square))
print(f"Căn bậc hai của số chính phương đó là: {sqrt_max_square}")
# In ra các số đã được sử dụng để tạo ra số chính phương
print(f"Số chính phương đó được tạo ra bởi tích của các số: {used_numbers}")
Bội chung nhỏ nhất
Bạn thử tham khảo đoạn code sau nhé
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// Hàm tính UCLN (gcd) của 2 số
int gcd(int a, int b) {
while (b != 0) {
int t = b;
b = a % b;
a = t;
}
return a;
}
// Hàm tính BCNN (lcm) của 2 số
int lcm(int a, int b) {
return (a / gcd(a, b)) * b;
}
int main() {
const int MOD = 10007;
int T;
cin >> T;
vector<int> results(T); // Dùng để lưu kết quả của tất cả các test case
for (int t = 0; t < T; t++) {
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
// Khởi tạo biến để lưu tổng BCNN của các tập con
int totalLCM = 0;
// Duyệt qua tất cả các tập con
// Sử dụng bitmask để xét tất cả các tập con
for (int mask = 1; mask < (1 << n); mask++) {
int currentLCM = 1;
bool first = true;
for (int i = 0; i < n; i++) {
if (mask & (1 << i)) {
if (first) {
currentLCM = a[i];
first = false;
} else {
currentLCM = lcm(currentLCM, a[i]);
}
}
}
// Cộng BCNN của tập con này vào tổng
totalLCM = (totalLCM + currentLCM) % MOD;
}
// Lưu kết quả cho bộ test hiện tại
results[t] = totalLCM;
}
// In ra toàn bộ kết quả sau khi đã xử lý tất cả các test case
for (int t = 0; t < T; t++) {
cout << "Case " << t + 1 << ": " << results[t] << endl;
}
return 0;
}
Ylf vcs ck lfgcs iyk Xin chào, có ai giúp em giải mật mã này được không ạ?
Đọc qua đoạn output ở trên thì một idea có thể nghĩ đến đầu tiên là Ceasar cipher. Đây là một phương pháp mã hóa cổ điển, nó được đặt theo tên của Julius Caesar, người đã sử dụng nó trong các thông điệp bí mật của mình.
Trong Caesar cipher, mỗi chữ cái trong văn bản gốc sẽ được dịch chuyển một số lượng cố định vị trí trong bảng chữ cái để tạo ra văn bản mã hóa.
Ví dụ, nếu chúng ta dịch chuyển mỗi chữ cái 3 vị trí về phía trước trong bảng chữ cái tiếng Anh, thì 'A' sẽ trở thành 'D', 'B' sẽ trở thành 'E', v.v. Khi chúng ta đến cuối bảng chữ cái, chúng ta sẽ quay lại từ đầu. Vì vậy, 'X' sẽ trở thành 'A', 'Y' sẽ trở thành 'B', và 'Z' sẽ trở thành 'C'.
Để giải mã một thông điệp đã được mã hóa bằng Caesar cipher, chúng ta chỉ cần dịch chuyển các chữ cái theo hướng ngược lại. Trong ví dụ trên, chúng ta sẽ dịch chuyển mỗi chữ cái 3 vị trí về phía sau.
Bạn có thể brute force đoạn text ở trên, thử nghiệm nó với tất cả các khả năng, dịch chuyển từ 1, 2, 3 ... rồi đến 25 vị trí, để xem có ra được kết quả nào trông có vẻ có nghĩa không
Ví dụ như dưới đây là một đoạn code python đơn giản để làm việc đó:
def caesar_decrypt(text, shift):
decrypted_text = ""
for char in text:
if char.isalpha():
ascii_offset = ord('a') if char.islower() else ord('A')
decrypted_char = chr((ord(char) - ascii_offset - shift) % 26 + ascii_offset)
decrypted_text += decrypted_char
else:
decrypted_text += char
return decrypted_text
text = "Ylf vcs ck lfgcs iyk"
for shift in range(1,26):
print(shift, caesar_decrypt(text, shift))
Và dưới đây là kết quả khi chạy:
1 Xke ubr bj kefbr hxj
2 Wjd taq ai jdeaq gwi
3 Vic szp zh icdzp fvh
4 Uhb ryo yg hbcyo eug
5 Tga qxn xf gabxn dtf
6 Sfz pwm we fzawm cse
7 Rey ovl vd eyzvl brd
8 Qdx nuk uc dxyuk aqc
9 Pcw mtj tb cwxtj zpb
10 Obv lsi sa bvwsi yoa
11 Nau krh rz auvrh xnz
12 Mzt jqg qy ztuqg wmy
13 Lys ipf px ystpf vlx
14 Kxr hoe ow xrsoe ukw
15 Jwq gnd nv wqrnd tjv
16 Ivp fmc mu vpqmc siu
17 Huo elb lt uoplb rht
18 Gtn dka ks tnoka qgs
19 Fsm cjz jr smnjz pfr
20 Erl biy iq rlmiy oeq
21 Dqk ahx hp qklhx ndp
22 Cpj zgw go pjkgw mco
23 Boi yfv fn oijfv lbn
24 Anh xeu em nhieu kam
25 Zmg wdt dl mghdt jzl
Trong đó có một kết quả này là có vẻ có ý nghĩa nhất là 24 Anh xeu em nhieu kam, mặc dù nếu đúng là thế, thì tức là có 2 vị trí bị sai chính tả Không rõ là lúc mã hóa người muốn gửi message xử lý lỗi, hay do bạn khi viết đoạn text lên đây bị lỗi nữa, bạn thử kiểm tra lại xem sao
Có vẻ với kết quả này thì hướng đi theo Ceasar cipher là đúng, hy vọng là như vậy
Giấy phép Cá nhân và giấy phép mở rộng
Nhìn chung là các bản license của họ khá là dài, nhưng bạn cần nắm được một số điểm chính như sau:
- Cả 2 loại Standard và Extended đều là "single application" license, tức bạn chỉ có thể dùng nó để tạo ra 1 sản phẩm hoàn chỉnh (end product) duy nhất
- Cả 2 loại Standard và Extended đều không được sử dụng trong các sản phẩm on-demand, tức service mà cho phép người dùng cuối tùy chỉnh, customize lại items để tạo ra một output theo ý muốn của họ. Ví dụ như bạn có thể dùng một item là website template để xây dựng giao diện website thông thường của mình, nhưng không được dùng nó trong một sản phẩm theo dạng website builder, để giúp người dùng cuối tạo ra một website có sử dụng item template này. Nếu muốn làm việc đó, bạn phải mua license cho mỗi sản phẩm được tạo ra từ dịch vụ của bạn.
- Cả 2 loại Standard và Extended đều không cho phép bạn tái phân phối chúng dưới dạng một item khác, dù cho nó có là giữ nguyên hình trạng, hay đã được bạn chỉnh sửa, hay đã được bạn sử dụng như là một phần để sáng tạo ra một sản phẩm khác. Ví dụ như bạn không được phép mua một template HTML, sau đó dùng nó để phát triển thành một theme wordpress rồi đem phân phối.
2 loại license khác nhau chủ yếu ở điểm:
- License Standard cho phép bạn bán end product của mình cho 1 khách hàng, còn Extended cho phép bạn tạo ra nhiều bản copy và bán cho bao nhiêu khách hàng tùy ý.
- License Standard chỉ cho phép bạn bán end product của mình cho 1 khách hàng, nhưng cho phép bạn phân phối sản phẩm của mình cho nhiều người, nếu nó là miễn phí. Bản Extended cho phép bạn phân phối miễn phí, hay đem bán bao nhiêu bản cũng được tùy thích.
hỏi heroku
Có thể là có một số file config đang bị đưa vào .gitignore
nên vốn không được push lên git, nên nếu heroku pull từ github về thì bị thiếu,
hoặc có các thư mục (cần thiết cho application chạy), nhưng nó bị trống nên không được push lên git, nên heroku pull về thì không có chăng
Bạn thử bật debug mode của django lên để nó hiển thị ra log lỗi chi tiết, hoặc tìm file log lỗi trên server để check xem cụ thể thì nó gặp lỗi ở phần nào xem sao
Function trong js?
Để hiểu rõ được vấn đề ở trên, em nên nắm được các khái niệm như sau:
- Trong javascript có một khái niệm gọi là first class function, tức một function có thể được gán vào một biến, có thể được truyền vào một function khác, hay được trả về bởi một function khác. Em có thể xem thêm bài viết này https://viblo.asia/p/first-class-functions-trong-javascript-la-gi-phan-1-E375zXpWZGW
- Trong javascript còn có 2 khái niệm khác là function declaration và function expression. Em có thể đọc thêm các bài viết sau để phân biệt 2 khái niệm này:
- Trong javascript còn có thêm 1 khái niệm khác gọi là callback function. Hiểu đơn giản một hàm A được coi như một đối số truyền vào trong một hàm B, và một lúc nào đó thì code trong hàm B được chạy, và nó sẽ gọi đến hàm A (tức code của hàm A không phải là được thực thi ngay lập tức, mà chỉ được thực thi từ hàm B ở một thời điểm phù hợp, nên ta gọi hàm A là
callback
). Em có thể tham khảo thêm một số bài viết sau:- https://viblo.asia/p/the-nao-la-mot-callback-function-trong-javascript-vyDZOAqd5wj
- https://viblo.asia/p/callback-trong-javascript-gDVK2RkXKLj
- https://viblo.asia/p/callback-la-gi-callback-trong-javascript-RnB5pBVDZPG
- https://viblo.asia/p/hieu-ve-callback-trong-javascript-pxvKokxyKLd
- https://viblo.asia/p/callback-function-trong-javascript-bWrZn1QQKxw
Ở trong 2 ví dụ của em thì ví dụ thứ 2:
$(".customNextBtn").click(){
owl.trigger("next.owl.carousel");
};
là một đoạn code sai cú pháp, sẽ không thể chạy được. $(".customNextBtn").click()
là một lời gọi hàm (Function Invocation), tuy nhiên sau đó lại xuất hiện cú pháp {}
không xác định.
còn ví dụ thứ nhất
$(".customNextBtn").click(function () {
owl.trigger("next.owl.carousel");
});
thì ta có thể giải thích bằng những khái niệm ở phía trên như sau:
$(".customNextBtn").click()
dùng để define event click vào một element- Ta truyền một tham số vào hàm đó. Tham số này hơi đặc biệt ở chỗ nó không phải là một số tự nhiên, một chuỗi, hay một mảng thông thường, mà nó là một hàm số
- Tham số truyền vào này là một function expression
- Tham số truyền vào này là một callback function, nó sẽ được gọi để chạy, khi mà button được
click
hỏi không cài được compose setup
Lỗi ở trên của bạn là chương trình cài đặt không tìm thấy môi trường PHP (file thực thi PHP), nên không thể cài đặt được Composer.
Bạn thử kiểm tra lại xem mình đã cài đặt PHP như thế nào, file php.exe
nằm ở đâu, sau đó khi setup composer thì bạn select đến file php.exe
đó xem sao.
Cake migrations seed: [Error] Object of class DateTimeImmutable could not be converted to string in /var/www/html/cake_myapp/vendor/robmorgan/phinx/src/Phinx/Db/Adapter/PdoAdapter.php on line 335
Theo như nội dung trong file log thì vấn đề có vẻ là do bạn đã truyền một object của class DateTimeImmutable
vào, trong khi expect của Cake lại là String.
ở đoạn này
'created' => Cake\I18n\FrozenTime::__set_state(array(
'date' => '2020-04-01 07:14:22.000000',
'timezone_type' => 3,
'timezone' => 'UTC',
)),
thay vì dùng Object, bạn thử dùng String không thôi xem sao
'created' => '2020-04-01 07:14:22',
Tương tự với phần modified
.
Trending post algorithm?
Bạn có thể tham khảo bài viết này khá hay https://viblo.asia/p/thuat-toan-xep-hang-bai-viet-dang-hot-thinh-hanh-nhu-reddit-va-hacker-news-hoat-dong-the-nao-gAm5y8xXldb
Cách Viblo tính toán bài viết Trending cũng dựa trên tư tưởng tương tự như trong bài viết trên đề cập, tức là dựa vào một số yếu tố:
- Lượng vote: Bài viết càng nhiều vote sẽ càng được cộng nhiều điểm
- Lượng comment: Bài viết càng nhiều comment sẽ càng được cộng nhiều điểm
- Lượng view: Bài viết càng nhiều views sẽ càng được cộng nhiều điểm
- Thời gian publish bài: Bài viết càng publish từ lâu, sẽ càng bị trừ nhiều điểm
Dựa trên những yếu tố trên thì hệ thống sẽ tính ra một chỉ số gọi là điểm trending của từng bài viết, và khi chỉ số này vượt qua một mốc gọi là trending threshold thì bài viết sẽ được gán tag trending, và điểm số lại được reset về 0.
Về ý tưởng thì là như vậy, còn thực tế kết quả việc xét trending cho bài viết hiện tại của Viblo có vẻ không được tốt lắm, khi rất nhiều bài viết cũ (do có index tốt trên Google Search, nên lượng view rất tốt) được đẩy lên. Có vẻ là do điểm cộng từ mục views hơi cao, và điểm trừ do thời gian publish từ lâu lại hơi "nhẹ"
Viblo dùng editor để user soạn bài vậy ạ?
Viblo thì đang dùng Simple MDE, nhưng mà thực ra nó cũng đã bị ngừng từ lâu, cũng 6 năm nay rồi không có update gì mới thì phải (^^;) Thành ra hiện thì cũng có khá nhiều vấn đề.
Với lại SimpleMDE thì là một Markdown Editor, hình như khác với dạng giống của Quilljs mà bạn kỳ vọng thì phải
Có thể dùng Reactjs phát triển core system?
Thực ra việc một ngôn ngữ/một công nghệ bảo là có thể maintain sau khoảng chục năm nữa hay không thì cũng còn phụ thuộc vào rất nhiều yếu tố, từ năng lực của đội ngũ developer ở thời điểm hiện tại, cách thức thiết kế ban đầu, effort bỏ ra để phát triển, vận hành, maintain sản phẩm ... chứ để nói chung chung là một công nghệ A, hay B, hay C thì sau 10 năm còn có thể maintain được hay không thì rất khó bạn ạ
Mình từng làm project đến nay đã là gần 8 năm, sử dụng framework là Laravel, từ cái thời mà version còn là 4.2. Đến thời điểm hiện tại dự án vẫn vận hành tốt, ngày càng được mở rộng thêm tính năng, ngày càng có nhiều người dùng hơn. Tính ra có thể tiếp tục vận hành thêm 3, 5 năm nữa cũng không phải là vấn đề lớn. Và quá trình mình cùng Team phát triển nó thì không phải là làm xong sản phẩm rồi bỏ đó, gần 10 năm sau quay lại maintain, mà là bên mình không ngừng cải tiến sản phẩm, không ngừng update công nghệ mới. Không chỉ bản thân framework Laravel được nâng dần từ version 4.2, lên các bản 5, bản 6, bản 7 ..., mà cả phần frontend cũng thay đổi không ngừng từ việc dùng jquery đơn giản rồi dùng các framework như vuejs, nuxtjs ...
Và mình nghĩ rằng nếu Team bạn cũng có thể có được cách tiếp cận như vậy, tức không ngừng đầu tư vào sản phẩm và upgrade liên tục, thì bất kỳ ngôn ngữ gì, framework gì mọi người cũng có thể đi cùng nó một cách lâu dài.
Như mình thấy thì mảng phát triển web là một trong những mảng công nghệ phát triển nhanh nhất, và thay đổi với tốc độ chóng mặt nhất hiện nay (nên nhớ cách đây 10 năm, tức ở thời điểm năm 2012 thì React còn chưa ra đời (chưa được public)). Các Libraries, Framework mới được đẻ ra hàng ngày Các Library, Framework lớn mặc dù đang có chỗ đứng hiện tại, nhưng nếu không ngừng cải tiến thì sẽ nhanh chóng bị bỏ lại phía sau ngay. React là một công nghệ rất hot hiện nay, cộng đồng phát triển của nó rất lớn, được hỗ trợ rất nhiều. Bản thân React cũng không ngừng được cải tiến, update, và hệ sinh thái của nó cũng không ngừng được mở rộng. Thế nên nếu bạn không thể đi cùng những sự update của công nghệ trong suốt chục năm tới, thì sẽ rất khó để sau này bạn có thể maintain được cái project đã không được động gì vào mấy trong suốt 10 năm. Lúc đó dù bạn có assign người mới vào dự án thì họ cũng cảm thấy chán nản vì những công nghệ mà giờ đã chẳng ai dùng, có gặp vấn đề lên stackoverflow hỏi cũng chẳng còn ai nhớ để mà trả lời, có lỗi bảo mật nhưng không còn được fix...
Còn nếu bạn luôn không ngừng update công nghệ, thì rõ ràng sau 10 năm, React trong project của bạn lúc đó, cũng sẽ rất khác so với React ở thời điểm hiện tại, và lúc đó mình nghĩ sẽ có rất nhiều người sẽ có thể giúp bạn tiếp tục maintain, phát triển được sản phẩm thôi.
Lộ trình trở thành Fullstack developer
Mới có lớp 8 mà đã học được nhiều vậy rồi à em
Anh thấy bắt đầu từ HTML, CSS, Javascript như vậy cũng ổn rồi đấy, tiếp theo em có thể hướng đến một số mảng khác nữa như sau:
- Javascript Framework: Nổi bật hiện tại là VueJS và ReactJS và thử làm một số ứng dụng dạng Client Side Rendering sử dụng những framework/library ấy.
- CSS Framework: Ví dụ như Material UI, Tailwind CSS, Chakra UI ...
- Frontend Tools: npm, webpack, eslint
- Backend Language/Framework: Hiện tại em đang học NodeJS thì cũng ổn rồi, ngoài ra em có thể tìm hiểu thêm về một số ngôn ngữ khác như PHP, Ruby, Python... cùng với đó là những framework như Laravel hay Rails, Django
- Backend Techniques: Khi làm việc với Backend thì ngoài các web framework, em sẽ cần thêm các kiến thức về Database (gồm cả hệ quản trị cơ sở dữ liệu dạng quan hệ, như MySQL, PostgreSQL, và NoSQL như MongoDB...), Caching, Queue, Restful API, OAuth, JWT, Web Socket, Full text search (ví dụ như Elasticsearch)...
- Các kiến thức về Server/DevOps: Linux, SSH, Web Server (Apache, Nginx ...), HTTP/HTTPS, Load Balancing, Containerization (Docker), Container Orchestration (Kubernetes), CI/CD (Gitlab CI, Github Action, Circle CI ...), Monitoring & Observability ...
- Các kiến thức về Cloud: Amazon Web Services, Google Cloud Platform, Microsoft Azure ...
- Các kiến thức về mảng kiến trúc hệ thống: Design Principles, Design Patterns, Monolithic Architecture, Microservices Architecture, Serverless Architecture
- Tools: Các trình Code Editor phổ biến như VSCode, hay họ IDE nhà Jetsbrains. Vim/Nano. Terminal. Git và Github/Gitlab.
- Và còn nhiều, nhiều những topic khác nữa...
Em có thể tham khảo một số bài viết dưới đây trên Viblo nhé
- https://viblo.asia/p/lam-the-nao-de-tro-thanh-full-stack-developer-Ljy5VPgMZra
- https://viblo.asia/p/con-duong-minh-tro-thanh-software-engineer-o-singapore-bJzKmaoDK9N
- https://viblo.asia/p/con-duong-minh-dang-di-de-tro-thanh-fullstack-web-developer-maGK7VWx5j2
- https://viblo.asia/p/hanh-trinh-tu-newbie-tro-thanh-software-engineer-trong-9-thang-YWOZr2PRZQ0
Ngoài ra, em cũng có thể tham khảo các Course về các chủ đề về Web Development, thử làm các bài test để kiểm tra năng lực của bản thân, trên Viblo Learning nữa.
Chúc em sẽ có thể sớm đạt được mục tiêu trở thành một Fullstack web developer của mình
Cho em hỏi về query ?
Có một cách đơn giản là bạn query ra số lượng theo từng status, của từng tháng. Rồi khi hiển thị ra view thì bạn mới tính % sau
Ví dụ bạn có thể dùng câu query dưới đây
SELECT date_trunc('month', "created_at") as "created_at_month", "status", count(*) AS "count"
FROM "tablename"
GROUP BY "created_at_month", "status"
ORDER BY "created_at_month" ASC
khi đó thì kết quả sẽ được nhóm theo các cặp month
và status
kiểu như sau
created_at_month status count
2022-01-01 1 5
2022-01-01 2 3
2022-01-01 3 2
2022-02-01 1 1
2022-02-01 2 0
2022-02-01 3 4
lúc đó phần tính toán hiển thị ra % ở view chắc cũng không khó khăn gì
Cách tạo signature certification in PDF using Laravel
Phần mà bạn nhắc đến là khái niệm Digital Signature, tức chữ ký số. Và để ký được chữ ký số này thì bạn sẽ cần một file private certificate.
Bạn có thể tham khảo phần official example của TCPDF, có một đoạn nhắc đến việc tạo Digital Signature này (package elibyy/tcpdf-laravel
mà bạn đang dùng là wrapper dành cho Laravel của package gốc tecnickcom/TCPDF
)
Tức về cơ bản thì sẽ có các bước như sau
NOTES:
- To create self-signed signature: openssl req -x509 -nodes -days 365000 -newkey rsa:1024 -keyout tcpdf.crt -out tcpdf.crt
- To export crt to p12: openssl pkcs12 -export -in tcpdf.crt -out tcpdf.p12
- To convert pfx certificate to pem: openssl pkcs12 -in tcpdf.pfx -out tcpdf.crt -nodes
*/
// Load file certificate dùng để ký chữ ký
$certificate = 'file://data/cert/tcpdf.crt';
// Phần thông tin sẽ được ký
$info = array(
'Name' => 'TCPDF',
'Location' => 'Office',
'Reason' => 'Testing TCPDF',
'ContactInfo' => 'http://www.tcpdf.org',
);
// Tạo signature trong file PDF
$pdf->setSignature($certificate, $certificate, 'tcpdfdemo', '', 2, $info);
// define active area for signature appearance
$pdf->setSignatureAppearance(180, 60, 15, 15);
Hoặc bạn có thể tham khảo một vài hướng dẫn về add digital signature theo các bài ở dưới đây:
Server rất chậm khi user online > 2000
Bạn thử check xem số lượng containers php-fpm mà mình đang chạy là bao nhiêu? xong rồi thử tăng số lượng containers php-fpm lên xem sao
Định hướng theo frontend React nhưng lại nộp cv vào vị trí thực tập PHP. Vậy nên theo định hướng React hay là PHP ạ.
Và em có nộp cv vào công ty với vị trí thực tập php và đã pass phỏng vấn ngay lúc đó
Sao ban đầu em đã có định hướng làm mảng Frontend, dùng React mà lại apply vào vị trí thực tập PHP vậy nhỉ
Phải chăng là niềm yêu thích của em chưa đủ lớn? hay do ở đâu đó em vẫn muốn thử nghiệm với vị trí PHP?
Theo anh thấy thì dù khởi điểm em có bắt đầu ở mảng Backend hay Frontend, thì về sau này, làm được ở cả 2 mảng sẽ đem lại cho em rất nhiều lợi thế trong công việc. Chưa kể đãi ngộ cho vị trí Full Stack Engineer cũng tốt hơn nhiều. Thế nên dù bây giờ tập trung ở mảng Frontend thì sau này em cũng nên học thêm cả mảng Backend nữa, hay giờ có làm việc ở mảng Backend thì em có thể tìm hiểu thêm cả về mảng Frontend được thì càng tốt.
Trừ khi em cực kỳ yêu thích mảng Frontend, chỉ mong muốn làm ở mảng này thôi, lần này cũng là phỏng vấn ở vị trí Frontend nhưng công ty không thu xếp được công việc cho em, rồi đẩy em sang mảng Backend thì nên suy nghĩ về việc từ chối Chứ như ở trên thì anh thấy em cũng chủ động apply vào mảng PHP, và đây cũng là một mảng hoàn toán mới với mình chứ cũng không hẳn là trước em từng làm qua rồi và thấy không thích nhỉ Biết đâu được tiếp cận và làm một vài project PHP xong em lại thấy thích thì sao
Thế nên cá nhân anh nghĩ thì mình cứ mạnh dạn thử xem sao Trong một dự án PHP em vẫn có thể dùng ReactJS được mà, chứ cũng không hẳn đây là 2 mảng hoàn toàn tách biệt, không liên quan gì đến nhau. Hơn nữa đây cũng chỉ là kỳ thực tập sinh viên năm thứ 3, em vẫn còn nhiều cơ hội để chuẩn bị những kiến thức mới, hay thay đổi định hướng, nếu cần thiết, trước khi tốt nghiệp mà
Hỏi về cách dùng chung authen như của google
Giải pháp mà Google đang sử dụng gọi là Single Sign On. Viblo cũng đang sử dụng giải pháp tương tự khi mà nếu đang login ở Viblo, bạn click vào các trang https://code.viblo.asia/ , https://ctf.viblo.asia/ , https://learn.viblo.asia/ hay https://cv.viblo.asia/ thì bạn cũng sẽ tự động ở trạng thái login.
Bạn có thể tìm hiểu thêm về khái niệm này thông qua một số bài viết dưới đây:
- https://viblo.asia/p/single-sign-on-sso-la-gi-hoat-dong-ra-sao-bWrZn4oQ5xw
- https://viblo.asia/p/single-sign-on-sso-voi-oauth2-7eERELAevgNj
- https://viblo.asia/p/trai-nghiem-single-sign-on-sso-voi-doorkeeper-va-mo-hinh-oauth-20-maGK74zbZj2
- https://viblo.asia/p/tim-hieu-ve-single-sign-onsso-dang-nhap-mot-lan-thong-qua-spring-boot-va-chuan-saml-Eb85oM02Z2G
Cơ chế xác nhận coin đã được chuyển đến cho một ví
Bạn có thể hiểu đơn giản về follow gửi và nhận tiền thông qua các ví điện tử ở các sàn giao dịch (tập trung) sẽ hoạt động như thế này:
- Với một Public Blockchain, ví dụ như Bitcoin, Ethereum ... thì bất kỳ ai cũng có thể tạo được vô số các địa chỉ ví trên đó. Và bất cừ ai cũng có thể check được mọi giao dịch đến và đi như thế nào trên đó.
- Bạn A1 có một ví V1 (của Blockchain B) trên sàn giao dịch S1, tức về cơ bản là S1 đã tạo ra cho bạn A một địa chỉ V1 trên Blockchain B. Địa chỉ ví này thì sàn giữ private key, chứ không phải bạn A1. Nên về cơ bản thì người kiểm soát ví này là sàn S1, chứ không phải bạn A1
- Tương tự như vậy với bạn A2 có ví V2 trên sàn giao dịch S2, nhưng cũng trên cùng một Blockchain B, giống như địa chỉ V1 của bạn A1. Và về cơ bản thì sàn S2 giữ private key của địa chỉ V2 này, nên người thực sự kiểm soát ví này là sàn S2, chứ không phải bạn A2
Hãy nói một chút về cách bạn nạp tiền vào tài khoản trên sàn giao dịch (tập trung) trước, thì bạn sẽ hiểu hơn về cách các sàn quản lý ví ra sao:
- Bạn A1 muốn nạp tiền trên Blockchain B, vào tài khoản V1 của bạn ý thì đầu tiên, bạn ý sẽ cần chuyển một số coin nhất định vào địa chỉ V1
- Sàn giao dịch sẽ luôn theo dõi tình hình biến động các ví người dùng mà mình quản lý. Khi thấy có số coin chuyển đến V1, sàn sẽ cộng cho tài khoản của người dùng một lượng tương ứng trong database mà mình quản lý. Chẳng hạn như con số hiển thị trên sàn giao dịch của bạn là bạn đang có 100 coin của Blockchain B1, thì con số này vốn là con số trong database của họ (chứ không phải là con số thực tế đang có trên địa chỉ V1 của Blockchain). Bạn chuyển thêm 200 coin vào địa chỉ V1, và sàn xác nhận được giao dịch này, thì họ sẽ cộng thêm vào trong database của họ để cho bạn có 300 coin .
- Một thời gian sau, sàn giao dịch sẽ chuyển hết số coin trong ví V1 của bạn, vào một ví chung mà họ quản lý, lúc này ví V1 của bạn sẽ còn 0 coin (tuy nhiên khi login vào tài khoản trên sàn, bạn vẫn sẽ thấy 300 coin, và đây là con số trong database của sàn giao dịch, là con số xác nhận bạn có 300 coin trong tài khoản)
Câu hỏi là tại sao sàn giao dịch họ lại cần xử lý cồng kềnh như vậy? sao lại cần lưu vào trong database, sao lại cần chuyển hết tiền của tất cả người dùng vào một ví khác làm gì?
Câu trả lời rất đơn giản là bởi bản chất bạn nạp tiền vào sàn thì thường sau đó bạn sẽ đem đi trade. Mà khi trade thì số dư trong tài khoản của bạn sẽ biến động không ngừng (thậm chí trong một thời gian rất ngắn). Mỗi lần đặt lệnh trade như thế mà xử lý trực tiếp trên Blockchain thì sẽ tốn rất nhiều phí, và thời gian giao dịch (xử lý trên Blockchain) sẽ rất lâu. Thế nên các con số về số dư tài khoản quản lý trong database của sàn giao dịch vẫn là tốt nhất => đây chính là một trong những lợi ích của sàn giao dịch tập trung (giao dịch nhanh và phí giao dịch khá rẻ khi so sánh với phần lớn Blockchain). Ngoài ra, khi bạn lãi, thì sẽ có một người khác lỗ, bạn lãi 1000 coin và rút ra, thì sàn sẽ lấy 1000 coin ở đâu để chuyển cho bạn? Thay vì tìm hết các người lỗ và đặt cả chục giao dịch cho đủ 1000 coin, thì với việc quản lý hết ở một ví rồi, sàn sẽ chỉ cần rút 1000 coin từ ví đó ra trả bạn là xong.
Giờ thì hãy quay trở lại câu chuyện chuyển 100 coin từ ví V1 của sàn S1 sang ví V2 của sàn S2 thì các bước sẽ sảy ra thế nào?
- Khi bạn A1 đặt một lệnh chuyển tiền từ tài khoản trên sàn S1 của mình, sang địa chỉ V2 trên sàn S2 của bạn A2, thì trong phần lớn trường hợp, số tiền này được chuyển đi không phải từ ví V1, mà thay vào đó nó được chuyển đi từ một ví chung của sàn S1 đã nhắc đến ở trên. (tức về cơ bản thì ví V1 của bạn chỉ dùng đển nhận coin thôi, còn khi bạn đặt lệnh chuyển/rút coin, thì coin sẽ đi ra từ một ví khác của sàn)
- Khi giao dịch từ ví chung của sàn S1, đến ví V2 của sàn S2 được tạo, thì tương ứng, trong database của sàn S1, tài khoản của A1 sẽ bị trừ đi 100 coin (và thêm một chút phí giao dịch trên Blockchain).
- Khi sàn giao dịch S2 xác nhận giao dịch đến V2, thì trong database của sàn S2, tài khoản của A2 sẽ được cộng 100 coin.
- Sau đó thì số coin vốn được chuyển đến ví V2, sẽ tiếp tục được chuyển sang ví tập trung của sàn S2
Điều mình thắc mắc là làm sao để hệ thống sàn S1 tác động được đến ví V2 trong sàn S2.
Đó là bởi vì giao dịch chuyển từ ví của sàn S1 đến ví của sàn S2 là một giao dịch bình thường trên một Blockchain. Điều mà sàn S1 làm chỉ đơn giản là tạo giao dịch mà thôi. Blockchain chính là cái cầu nối 2 sàn giao dịch này.
Nhờ mọi người giúp đỡ về thuật toán trong bài toán Booking ạ
Bạn thử xem cách sau có ổn không nhé:
- Giả sử đang cần kiểm tra ca thông tin có
date
,startTime
vàendTime
- Đầu tiên check
startTime
vàendTime
có nằm trong thời gian mở cửa của cửa hàng không. Nếu không thì báo làfalse
luôn. - Select ra các ca đã book phòng trong cùng ngày, sort theo startTime, lưu vào biến
bookings
- Chạy một vòng
for
qua cácbooking
, nếustartTime
hoặcendTime
mà nằm trong khoảngbooking.startTime
vàbooking.endTime
, hoặcbooking.startTime
vàbooking.endTime
nằm trong khoảng giữastartTime
vàendTime
, thì tức là thời gian đó đã bị đè vào lịch nào đó được book rồi. Lúc này ta chỉ cần returnfalse
. - Nếu chạy qua hết vòng lặp mà không bị return false thì chứng tỏ thời gian đó không bị trùng với booking nào cả => có thể book được vào khung giờ đó.
Dưới đây là đoạn code đơn giản bằng Javascript, bạn có thể tham khảo xem sao
// openTime và endTime là thời gian mở và đóng cửa hàng
// bookings là mảng các booking
// startTime và endTime là thời gian đang check xem có còn trống không
function check(openTime, closeTime, bookings, startTime, endTime) {
if (startTime < openTime || endTime > closeTime) {
return false;
}
for(booking of bookings) {
if ((startTime >= booking.startTime && startTime < booking.endTime)
|| (endTime > booking.startTime && endTime < booking.endTime)
|| (startTime < booking.startTime && endTime >= booking.endTime)
) {
return false;
}
}
return true;
}
// Hàm get danh sách những khung giờ còn trống
// Một khung giờ còn trống là khoảng thời gian từ endTime của một booking, đến startTime của booking tiếp theo
function getAvailableTime(openTime, closeTime, bookings) {
lastEndTime = openTime;
availableTime = [];
for(booking of bookings) {
if (booking.startTime > lastEndTime) {
availableTime.push([lastEndTime, booking.startTime]);
}
lastEndTime = booking.endTime;
}
availableTime.push([lastEndTime, closeTime]);
return availableTime;
}
bookings = [
{
startTime: 10.5,
endTime: 11.5
},
{
startTime: 13,
endTime: 14
},
{
startTime: 14,
endTime: 15,
},
{
startTime: 16,
endTime: 17.5
}
];
openTime = 9;
endTime = 23;
avalableTime = getAvailableTime(openTime, endTime, bookings);
isTimeValid = check(openTime, endTime, bookings, 9, 10); // true
if (!isTimeValid) {
console.log(availableTime);
}
isTimeValid = check(openTime, endTime, bookings, 10, 12); // false
if (!isTimeValid) {
console.log(availableTime);
}
Add SSH key trên gitlab
Lỗi ở trên của bạn là do bạn đã add cái ssh key đó vào một account khác rồi, và bạn cần phải tạo mới một ssh key khác để dùng cho account này.
Về cơ bản là bạn cần tạo một cặp ssh key mới với câu lệnh ssh-keygen
, add key đó vào tài khoản gitlab, và mỗi phiên làm việc cần chạy câu lệnh ssh-add
để thêm key vào SSH Agent.
Bạn có thể tham khảo bài viết này hướng dẫn khá là chi tiết https://viblo.asia/p/lam-sao-de-su-dung-nhieu-tai-khoan-github-tren-cung-mot-may-tinh-Qpmleyx7lrd , mặc dù là bài viết nói về Github, nhưng trên Gitlab cũng vậy thôi, không khác biệt gì