Trong Dart, vì int với double đều là kiểu object mà bạn để ý class int nó không có extends class double hay nói cách khác class int ko phải con của class double nên khi bạn dùng: double as sang int nó sẽ lỗi ngay. Bạn muốn convert double sang int có thể dùng hàm toInt(). Trong Kotlin cũng như vậy luôn bạn nhé. Còn trong Java thì ép thế lại được vì int và double trong Java ko phải là object mà nó là kiểu nguyên thủy.
Vấn đề là nếu e làm tới cuối bài (sau phần setup password cho Redis), từ đây data sẽ không còn được lưu lại trong file dump.rdb ở folder .docker/data/redis nữa.Dẫn tới việc session sẽ không được lưu và sau khi docker-compose down thì sẽ bị mất.
Lí do: mặc định khi chạy Redis mà không có option nào (ý là nếu ta không thêm --requirepass vào command ở docker-compose.yml) thì Redis sẽ đều đặn write data vào file dump.rdb với config như sau:
docker-compose exec redis sh
redis-cli
config get save
->>>in ra:
1)"save"2)"3600 1 300 100 60 10000"
Ý là Redis sẽ đều đặn lưu data (hay cụ thể ở đây là session của user) vào file nếu 1 trong các điều kiện sau xảy ra:
Sau 3600 giây và có 1 sự thay đổi ở data trong Redis
hoặc sau 300 giây và có 100 sự thay đổi
hoặc sau 600 giây và thấy có 10000 thay đổi
Nhưng khi ta khởi động redis-server với bất kì 1 option nào thì config mặc định sẽ không được áp dụng nữa, ở đây do ta thêm --requirepass nên nếu e docker-compose up, sau đó chui vào container redis để check lại thì sẽ thấy in ra config get save với giá trị rỗng, tức không bao giờ ghi ra file nữa. Do đó khi ta docker-compose down đi thì data sẽ mất
Vậy nên nếu e muốn lưu lại session ngay cả khi e docker-compose down, thì ở command của service redis trong docker-compose.yml e sửa lại cho a như sau:
Giờ đây cứ sau 1 khoảng thời gian và có 1 số sự thay đổi thì Redis sẽ cập nhật lại file dump.rdb, ở trên a thiết lập:
Sau 10 giây nếu có 1 sự thay đổi
Hoặc sau 30 giây có 30 sự thay đổi
E nên chọn chọn cho mình 1 con số phù hợp với app của e
Có 1 option khác là --appendonly yes thì data sẽ được lưu khi có bất kì thay đổi nào, trường hợp này data sẽ được lưu ở file .aof
File AOF thì dung lượng thường lớn hơn file .rdb và về lý thuyết thì tốc độ đọc cũng sẽ chậm hơn. Nhưng nếu app của e không quan tâm tới khả năng nhanh chậm trong khoảng mili giây thì vẫn oke. Nhưng nói chung a vẫn khuyên nên lưu ở file .rdb hơn
Đến đây thì ta có thể docker-compose down/up thoải mái, F5 lại trình duyệt vẫn sẽ còn session, nhưng session được lưu chỉ khi ta không tắt trình duyệt. Lí do express-session lưu session trong cookie, khi ta tắt trình duyệt thì cookie sẽ bị mất (hết hạn), nên mặc dù data trong Redis vẫn còn nhưng khi mở lại trình duyệt thì cookie trên trình duyệt và data trong Redis thì ko còn khớp nữa nên session coi như mất.
Do đó e cần sửa lại code ở file modules/session.js, đoạn module.exports như sau:
module.exports =session({
store:newRedisStore({
client
}),
secret:'supersecret',
reave:false,
saveUninitialized:true,
cookie:{// set "tuổi" cho cookie, để khi tắt trình duyệt bật lại thì cookie vẫn còn "trẻ" và chưa "chết"
expires:false,
maxAge:1000*60*60*24*7}})
Sau đó e clear cookie tại trình duyêt. Tiến hành build lại image và chạy lại là oke nhé
Bonus
Nếu e vừa muốn set password vừa muốn giữ toàn bộ cấu hình mặc định của redis để không phải đau đầu vì những điều bên trên, thì e làm như sau (recommend khi chạy ở production):
Vào trang chủ Redis download file cấu hình mặc định, ở đây. Đọc dòng "The self documented redis.conf for Redis 5.0"
Mở file đó lên tìm tới đoạn có requirepass rồi đặt password của e vào
Sau đó ở docker-compose.yml service redis e sửa lại như sau:
redis:image: redis:5-alpine
volumes:- .docker/data/redis:/data
- ./redis.conf:/usr/local/etc/redis/redis.conf # ---> map config vào container để khi Redis khởi động sẽ đọc file này lênrestart: unless-stopped
networks:- cache-network
healthcheck:test:["CMD","redis-cli","ping"]interval: 30s
timeout: 10s
retries:5
a sẽ không cập nhật lại code hay nội dung trong bài để nếu bạn nào có thắc mắc như e có thể đọc comment này và hiểu kĩ hơn về cơ chế lưu data của Redis nhé
Series quá hay, e phải login để vote cho a.
A thông hộ e chỗ này với:
E làm theo hướng dẫn của a, dockerize cho 1 project Python có sẵn, đến bước này: docker build -t learning-docker/python:v1 .
Thì nó chạy đến bước Step 5/6 : RUN pip install -r requirements.txt
Thì bị lỗi: ERROR: Could not find a version that satisfies the requirement tensorflow>=1.12.0 (from -r requirements.txt (line 2)) (from versions: none)
ERROR: No matching distribution found for tensorflow>=1.12.0 (from -r requirements.txt (line 2)).
Không tìm thấy version của tensorflow.
Bình thường nếu chạy code python ko dùng docker thì e sẽ chạy pip install....
Nhưng ở đây n chạy dc đến bước 5/6. Nên image n cứ bị restart lại liên tục, nên ko chạy dc docker-compose up để chạy pip install....
A cho e hỏi làm cách nào đề fix dc lỗi này ạ.
default param: khi param truyền vào là undefined thì lúc đó mới lấy default param, còn param = null thì không. Bạn truyền undefined vào 2 cách sẽ thấy sự khác biệt
THẢO LUẬN
@tuananhbfs chỉ trừ hai link đó thôi hả bạn còn lại là ok hết hả
đúng như lỗi đã in ra, với bản phân phối Alpine thì không có tensorflow thoả mãn yêu cầu của e.
Cách đơn giản là e
FROMtrực tiếp từ imagetensorflowđược support official, build và test cẩn thận, check ở trang chủ Tensorflow nhé e.Chọn đúng tag của phiên bản tensorflow e cần là được nhé. Ở đây
Trong Dart, vì int với double đều là kiểu object mà bạn để ý class int nó không có extends class double hay nói cách khác class int ko phải con của class double nên khi bạn dùng:
double as sang intnó sẽ lỗi ngay. Bạn muốn convert double sang int có thể dùng hàmtoInt(). Trong Kotlin cũng như vậy luôn bạn nhé. Còn trong Java thì ép thế lại được vì int và double trong Java ko phải là object mà nó là kiểu nguyên thủy.Tks
(len)
Cuối cùng cũng có người để ý
,
Vấn đề là nếu e làm tới cuối bài (sau phần setup password cho Redis), từ đây data sẽ không còn được lưu lại trong file
dump.rdbở folder.docker/data/redisnữa.Dẫn tới việc session sẽ không được lưu và sau khidocker-compose downthì sẽ bị mất.Lí do: mặc định khi chạy Redis mà không có option nào (ý là nếu ta không thêm
--requirepassvàocommandởdocker-compose.yml) thì Redis sẽ đều đặn write data vào filedump.rdbvới config như sau:Ý là Redis sẽ đều đặn lưu data (hay cụ thể ở đây là session của user) vào file nếu 1 trong các điều kiện sau xảy ra:
Nhưng khi ta khởi động
redis-servervới bất kì 1 option nào thì config mặc định sẽ không được áp dụng nữa, ở đây do ta thêm--requirepassnên nếu edocker-compose up, sau đó chui vào containerredisđể check lại thì sẽ thấy in raconfig get savevới giá trị rỗng, tức không bao giờ ghi ra file nữa. Do đó khi tadocker-compose downđi thì data sẽ mấtVậy nên nếu e muốn lưu lại session ngay cả khi e
docker-compose down, thì ởcommandcủa serviceredistrongdocker-compose.ymle sửa lại cho a như sau:Giờ đây cứ sau 1 khoảng thời gian và có 1 số sự thay đổi thì Redis sẽ cập nhật lại file
dump.rdb, ở trên a thiết lập:Có 1 option khác là
--appendonly yesthì data sẽ được lưu khi có bất kì thay đổi nào, trường hợp này data sẽ được lưu ở file.aofĐến đây thì ta có thể
docker-compose down/upthoải mái, F5 lại trình duyệt vẫn sẽ còn session, nhưng session được lưu chỉ khi ta không tắt trình duyệt. Lí doexpress-sessionlưu session trong cookie, khi ta tắt trình duyệt thì cookie sẽ bị mất (hết hạn), nên mặc dù data trong Redis vẫn còn nhưng khi mở lại trình duyệt thì cookie trên trình duyệt và data trong Redis thì ko còn khớp nữa nên session coi như mất.Do đó e cần sửa lại code ở file
modules/session.js, đoạnmodule.exportsnhư sau:Sau đó e clear cookie tại trình duyêt. Tiến hành build lại image và chạy lại là oke nhé
Bonus
Nếu e vừa muốn set password vừa muốn giữ toàn bộ cấu hình mặc định của redis để không phải đau đầu vì những điều bên trên, thì e làm như sau (recommend khi chạy ở production):
requirepassrồi đặt password của e vàodocker-compose.ymlserviceredise sửa lại như sau:e check lại xem đã có code thư viện được gọi ra chưa
Series quá hay, e phải login để vote cho a.
A thông hộ e chỗ này với:
E làm theo hướng dẫn của a, dockerize cho 1 project Python có sẵn, đến bước này:
docker build -t learning-docker/python:v1 .Thì nó chạy đến bước Step 5/6 : RUN pip install -r requirements.txt
Thì bị lỗi:
ERROR: Could not find a version that satisfies the requirement tensorflow>=1.12.0 (from -r requirements.txt (line 2)) (from versions: none) ERROR: No matching distribution found for tensorflow>=1.12.0 (from -r requirements.txt (line 2)).
Không tìm thấy version của tensorflow.
Bình thường nếu chạy code python ko dùng docker thì e sẽ chạy
pip install....Nhưng ở đây n chạy dc đến bước 5/6. Nên image n cứ bị restart lại liên tục, nên ko chạy dc
docker-compose upđể chạypip install....A cho e hỏi làm cách nào đề fix dc lỗi này ạ.
Bạn Minh ơiiiii. Tks đã viết loạt bài này. Xin hỏi về ép kỉu as
num a=3.5; print(a.runtimeType); // double num b= a as int; //error print(b);
cách dùng as ntn để b có trị là a kiểu int? . Tks
😅😅
Bài viết hay quá, cảm ơn tác giả (y)
Hay quá, cảm ơn tác giả
@truong.hong.thai cảm ơn bạn, mình sẽ thử
@phuongdong1995 mình muốn như vậy đó bạn. Trừ các link bắt đầu với /test/ /abc/ ra
default param: khi param truyền vào là undefined thì lúc đó mới lấy default param, còn param = null thì không. Bạn truyền undefined vào 2 cách sẽ thấy sự khác biệt
Trong container redis em có volumns thư mục .docker/data/redis:/data nhưng khi em down thì các session không được lưu lại. Như vậy là sao ạ?
Cảm ơn bạn!
cho mình xin full code với
(clap)(clap)