Quản lý phiên bản database với LiquiBase

Việc quản lý phiên bản đối với code đã xuất hiện từ rất lâu và đã có rất nhiều các phần mềm dành cho nó. Theo mình biết và đã từng sử dụng đó là

  • SVN (tiếp cận khá nhiều, coi như đầu tiên, khá cũ và có một số nhược điểm nhưng dễ dùng, phù hợp với các dự án về C#)
  • GIT (cái này khá tiên tiến, mạnh mẽ, càng ngày càng nhiều người dùng, Gitlab, GitHub…)
  • Source Safe (Visual Source Safe) được mua và tiếp tục phát triển bới Microsoft. Cái này mình mới nghe qua chứ chưa dùng bao giờ.

Đó là với code, thế với database thì như thế nào? Trước đây đúng là thuộc dạng 5 mức ngu dốt luôn. Đồng nghiệp hỏi làm mình đứng hình vì còn chưa bao giờ nghĩ đến nó cơ. Tìm hiểu thêm thì biết đúng là nó có tồn tại nhưng còn rất sơ khai. Mặc dù rất quan trọng nhưng lại rất sơ khai do tính đặc thù và khó khăn của nó.

Đại loại là trong quá trình phát triển phần mềm, nhiều phiên bản được nâng cấp và cải thiện, những thay đổi nhỏ thì chỉ cần sửa code nhưng với những thay đổi lớn thì có thể phải sửa cả việc thiết kế cơ sở dữ liệu. Để quản lý việc sửa đổi này thì ta cũng phải có công cụ tương đương như việc quản lý version của code.

Trước đây công ty cũ mình mua phần mềm nước ngoài thì khi nâng cấp nó sẽ gửi cho mình bản code nó đã build. Còn về phần mềm nó sẽ vứt do một loại các kettel Pentaho để chạy theo tuần tự để nâng cấp version cho Database, gọi với cái tên mỹ miều là Migrate dữ liệu.

Tìm hiểu qua thì mình thấy 3 cái tên được nhắc đến nhiều là:

  • SQL Server Data Tools: Cái này của Microsoft, mới nghe qua tên thôi, chắc chỉ support cho SQL Server
  • Flyway: Mới nghe đến tên
  • Liquibase: Thằng này hiện công ty mình đang dùng và được nghe nói đến nhiều nhất. Đang dùng nó để thay đổi với Oracle đi kèm là code ứng dụng bằng Java.

Đối với mình thì hiện tại chưa phải dùng đến nó nhưng chắc chắc sẽ tìm hiểu kỹ hơn về vấn đề này. Đặc biệt là đối với Liquibase để xem cách sử dụng với các trường hợp sử dụng nó như thế nào.

Hiện tại đối với mình quản lý thủ công bằng SVN hoặc GIT đó là viết ra các script thay đổi về DB để lưu trữ lại thôi. Phức tạp và cả team, nhiều team dùng thì chưa nghĩ đến.

Sự cố về proxy đối với hệ thống

Hệ thống bên mình trao đổi dữ liệu với đối tác thông qua webservice. Ngoài việc sử dụng VPN site to site với đối tác, Virtual IP và tường lửa để bảo mật thông tin. Vì bên mình sử dụng chính Database Oracle để gọi webservice của đối tác nên để tránh rủi ro thì giữa Database và đối tác sẽ sử dụng một con server khác cài Proxy để làm trung gian.

Con database trước khi gọi webservice thì phải tiến hành gọi hàm set proxy tới địa chỉ server proxy kia. Con Proxy có nhiệm vụ làm trung gian gửi thông tin đi và đón nhận từ webservice đối tác trả về rồi đưa ngược trở lại database.

“Câu hỏi: Không rõ nếu mình không dùng database để gọi trực tiếp webservice đối tác nữa mà dùng một server khác (như con proxy) có code xử lý việc lấy thông tin từ webservice để cập nhật vào DB của mình thì liệu có an toàn không?”

Sự cố: Sự cố xảy ra do mình suy nghĩ, đặt vai trò máy tính của mình như là con Database, tiến hành set proxy cho máy tính của mình là địa chỉ IP của con proxy sau đó gọi webservice để kiểm tra. Bởi vì máy tính của mình cũng như database không được trực tiếp truy cập webservice mà phải thông qua con Proxy. Do máy tính của mình có nhiều các kết nối – ứng dụng khác nhau (thư điện tử, skype, trình duyệt…) gây sập con Proxy kia.

Một anh team đội mình nói làm thế không an toàn, không ai làm thế mà không nêu rõ lý do. Còn anh bên mạng thì nói không được làm thế nhưng về nguyên tắc không thể chết Proxy được. Bởi các request ngoài webservice đối tác sẽ không có kết quả phản hồi vì Proxy không trả lời những thứ nó không biết là gì. Mình ậm từ sẽ không làm vậy nữa nhưng cũng không thỏa mãn về cách trả lời như vậy. Mình muốn nghe giải thích nhưng có vẻ mọi người không muốn chia sẻ kiến thức???

Mình cần phải đọc thêm về phần này, thử nghiệm và hiểu rõ nhất có thể.

Giới hạn địa chỉ IP dùng MaxMind

Dịch vụ của website của mình chủ yếu dành cho người dùng ở Việt Nam và một số cộng đồng lớn người Việt ở nước ngoài. Do vậy website mình phải public ra internet.

Nhưng gần đây website của mình bị một số lượng lớn truy cập ở tận đẩu tận đâu mà chắc chắn rất ít có người Việt tại đó truy cập. Các truy cập đáng ngờ này đều dò quét lỗ hổng của website hoặc thực hiện việc tấn công từ chối dịch vụ DDOS. Mình đã chặn những IP này nhưng thấy nó đổi liên tục mà chặn không xuể.

Tra IP với MaxMind
Tra IP với MaxMind

Được mọi người giới thiệu sử dụng MaxMind để tiến hành giới hạn các IP theo khu vực địa lý. MaxMind là một công ty hàng đầu trên thế giới cung cấp thông tin về địa chỉ IP. MaxMind có lượng data lớn nhất về IP trên thế giới và được cập nhật liên tục. Nó có 2 phiên bản, miễn phí thì ta cần host riêng data về server của mình và hàng tháng sẽ có bản cập nhật data, bản trả phí thì sẽ sử dụng chính IP của MaxMind được cập nhật dữ liệu liên tục và mới nhất.

Mình cũng chưa tìm hiểu kỹ về thằng MaxMind này nhưng cứ lưu lại để dần tìm hiểu sau. Từ phần này website của mình cũng có thể sử dụng nó để nâng cao trải nghiệm của người dùng. Ta thu thập thông tin IP của người truy cập website, từ đó phân tích lượng người dùng của từng vùng, từng khu vực. Để có thể cân đối, đánh giá hành vi cũng như hướng tập trung đối tượng sử dụng cho tốt. Cũng như nếu cần làm cân bằng tải (Load Balancer) thì cũng lựa chọn các địa điểm để đặt server sao cho hợp lý để người sử dụng dịch vụ web được nhanh nhất.

Archive Log tràn ổ cứng gây dừng Database Oracle

Archived Log Mode là một chế độ của Orace phục vụ việc backup database. Archiver Process chính là process chịu trách nhiệm ghi log file ra file archive để lưu trữ. Ta có thể sử dụng các archive log này để tiến hành restore dữ liệu. Archiver Process chỉ chạy khi database đang được cấu hình chế độ chạy Archived Log Mode.

Hôm vừa hệ thống bên mình gặp tình trạng Database bị stop không rõ nguyên nhân. Qua kiểm tra một hồi thì phát hiện ổ cứng bị đầy do Archived Log sinh ra quá nhiều. Việc Archived Log bị tràn sẽ làm Archiver Process bị lỗi không thể chạy dẫn đến các thao tác mà Database không làm được nên treo cả hệ thống.

Archived Log Mode on Oracle

Sự cố này khá là nghiêm trọng vì nó gây dừng Database. Các hoạt động thực hiện đến nó không thể thực hiện được. Hiện tượng Archived Log bị tràn thỉnh thoảng mới xảy xa nhưng lần này nó phát sinh tới 100GB Archived Log thì đúng là bất thường.

Nguyên nhân gây nên tình trạng này là do 1 job hàng ngày tiến hành xóa và insert một lượng lớn dữ liệu nên Archived Log phát sinh ngày càng nhiều. Vì Archived Log có nhiệm vụ ghi lại toàn bộ sự thay đổi của table nên hàng ngày nó vẫn lưu trữ các thông tin này lại. Mặc dù thực tế dữ liệu đó chỉ có tác dụng nhất thời ghi ra để tiến hành xuất dữ liệu ra file để lưu trữ.

Job này có nhiệm vụ xóa dữ liệu cũ của bảng, tổng hợp lại dữ liệu ở nhiều nguồn rồi insert dữ liệu vào bảng đó để thực hiện 1 số tác vụ tiếp theo.

Cách xử lý để Archived Log không phát sinh nhiều đó là thay vì việc job tiến hành xóa dữ liệu thì tiến hành truncate table. Vì truncate table coi như drop table và create lại, Archived Log không lưu trữ lịch sử thông tin truncate table nên Archived Log phát sinh rất ít.

Để thao tác truncate table thực hiện được trong procedure (gói gọn trong job) ta phải viết lệnh sau:

EXECUTE IMMEDIATE 'TRUNCATE TABLE tablename';

Từ phần này mình để ý từ lâu mà nay mới phát hiện ra. Mình có một table dữ liệu khá lớn tầm 20Gb, dữ liệu được thêm vào liên tục nên ngày càng phình to. Mình sử dụng Toad để xem dữ liệu và thỉnh thoảng xóa bớt dữ liệu đi nhưng sau đó kiểm tra kích thước cũng không bị giảm đi tẹo nào.
Mình đã thử việc xóa dữ liệu đi nhưng kích thước vẫn thế. Chỉ khi sử dụng lệnh truncate table thì kích thước table mới về 0.

Để ý các job tương tự sếp viết thì mình thấy sếp đều dùng câu lệnh truncate để xóa dữ liệu. Đúng là người có kinh nghiệm vẫn cứ khác.

Quản lý testcase bằng Testlink

Nghe mọi người trong team nói tạo Testcase trên Testlink cho phần mềm mới. Mình đành lên mạng search thì biết được thông tin về phần mềm này.

Testlink là phần mềm mã nguồn mở được viết bằng PHP được sử dụng cho việc quản lý việc testcase cho một phần mềm hoặc một hệ thống nào đó. Ta có thể cài đặt về host riêng cho tất cả mọi người trong team dùng.

Nó có khá nhiều tính năng:

  • Tạo Project mới
  • Tạo các Tescase
  • Tạo các user
  • Gán các Testcase cho user
  • User có thể test và phản hồi trạng thái
  • Các báo cáo liên quan

Nhìn chung khá là hay ho, chủ yếu để quản lý testcase mà thôi. Không có tính năng test tự động hay gì đó… Hiện tại đã có nhiều phần mềm test tự động nhưng mình nghe Testlink cũng lâu rồi và thấy khá nhiều người sử dụng nó.

Nước nóng đóng băng nhanh hơn nước lạnh

Vô tình lướt fb từ nhóm reddit có một bài viết rằng nước nóng đóng băng nhanh hơn nước lạnh.

Thời gian đóng băng của nước theo nhiệt độ
Thời gian đóng băng của nước theo nhiệt độ

Hiệu ứng này có tên là hiệu ứng Mpemba được đặt theo tên sinh viên Mpemba phát hiện ra. Mpemba đi học và thắc mắc với thầy giáo của mình tại trường. Theo suy nghĩ thông thường của chúng ta thì nước nóng trước khi đóng băng cần phải trở về nhiệt độ thường trước, do vậy nó phải đóng băng sau nước lạnh. Tất cả các bạn học của Mpemba đã cười nhạo cậu bé. Nhưng ông thầy giáo thì không, ông đã nghi ngờ điều này vì không thể tự nhiên Mpemba lại đưa ra thông tin này, ông đã cùng Mpemba tiến hành thực nghiệm và quả đúng như cậu đã phát hiện.

Hiệu ứng Mpemba đã làm đau đầu các nhà vật lý và hóa học thời gian dài, có nhiều giả thuyết đưa ra để giải thích. Nhưng hiệu ứng này biến đổi phụ thuộc vào chất lỏng cũng như nhiệt độ của chúng.

Bài học học được từ việc này đó là nên chú ý quan sát mọi việc sự vật xung quanh, luôn đặt ra các câu hỏi tại sao và tìm lời giải đáp đến cùng như cậu bé Mpemba. Nhiều việc không nên chế nhạo khi người khác đặt câu hỏi, cần phải suy nghĩ và luôn trân trọng lời nói của người khác. Cũng hoan nghênh ông thầy giáo đã tận tụy và đúng tinh thần khoa học khi không bỏ qua sự phát hiện của Mpemba. Cám ơn Mpemba, đúng thật là nước nóng đóng băng nhanh hơn nước lạnh.

Top 26 Free Python Tools for Developer

Python là một ngôn ngữ lập trình xuất hiện từ lâu với nhiều ứng dụng và được rất nhiều lập trình viên ưa thích. Nhưng gần đây nó trở nên nổi tiếng và phổ biến bởi sử phát triển mạnh mẽ của Machine Learning và Trí tuệ nhân tạo. Sau đây là top 26 Free Python Tools hàng đầu được sử dụng phổ biến trong lĩnh vực Data Science, Machine Learning, Trí tuệ nhân tạo, Thống kê số liệu, Tính toán hiệu năng cao…

1. Pandas: Used for data analysis

Từ lâu Python là ngôn ngữ tuyệt vời cho việc trộn và chuẩn bị dữ liệu nhưng không mạnh về việc phân tích và mô hình hóa dữ liệu. Pandas giúp lấp đầy khoảng trống này cho phép ta có thể thực hiện toàn bộ quy trình phân tích dữ liệu trong Python mà không phải sử dụng đến ngôn ngữ chuyên về phân tích dữ liệu như R.

2. SciPy: Algorithms to use with numpy

Thư viện SciPy chứa một tập hợp các thuật toán và các công cụ để xử lý dữ liệu như số như xử lý tín hiệu, tối ưu hóa, thống kê và nhiều tính năng khác.

3. HDF5: Used to store and manipulate data

Thư viện HDF5 kết hợp với Numpy có thể lưu trữ và xử lý một lượng lớn dữ liệu số. Giúp ta có thể xử lý hàng Terabyte dữ liệu cũng nhưng hàng ngàn bộ dữ liệu (dataset) trong một tập dữ liệu.

4. Jupyter: Research collaboration tool

Jupyter là môi trường phát triển tương tác trực quan trên web giúp ta có thể code, xử lý dữ liệu, xem dữ liệu như bảng, biểu đồ và đặc biệt có thể chia sẻ cho tất cả mọi người. Jupyter khá linh hoạt, có thể cấu hình và sắp xếp giao diện để hỗ trợ tốt hơn các công việc hoặc nghiên cứu trong ngành data science, scientific computing và machine learning.

5. HDFS: C/C++ wrapper for Hadoop

Đây là một thư viện giúp Python có thể tương tác với hệ thống tệp của Hadoop để xử lý BigData

6. SQLAlchemy: Python SQL Toolkit

SQLAlchemy là một thư viện cơ bản giúp Python có thể giao tiếp với cơ sở dữ liệu. Thư viện này chủ yếu được sử dụng như một công cụ lập bản đồ quan hệ để dịch các lớp của Python thành các bảng trên cơ sở dữ liệu quan hệ và tự động chuyển đổi các lệnh gọi hàm thành các câu lệnh SQL.

Ngôn ngữ lập trình Python
Ngôn ngữ lập trình Python

7. pyMySQL: MySQL connector

pyMySQL là thư viện giúp Python kết nối tới hệ quản trị cơ sở dữ liệu MySQL.

8. Theano: Deep learning with neural network

Theano làm tăng sức mạnh tính toán của Python, cho phép developer có thể định nghĩa, tối ưu hóa và đánh giá các biểu thức toán hoạc liên quan đến mảng đa chiều một cách hiệu quả. Nó có thể chạy hiệu quả cả trên GPU và CPU, hỗ trợ đắc lực cho các tính toán neural network phục vụ các thuật toán Deep Learning.

9. Lasagne: Build and train neural network in Theano

Lasagne là một thư viện khá gọn nhẹ để xây dựng và huấn luyện neural network dựa trên Theano.

10. Seaborn: Data visualization tool

Seaborn là một thư viện mới dựa trên Matplotlib giúp ta có thể visualization dữ liệu một cách trực quan. Khi làm về data science thì việc hiển thị dữ liệu là một việc quan trọng và thường xuyên giúp ta có thể hiểu được dữ liệu. Seaborn đơn giản, dễ học và dễ sử dụng hơn Matplotlib vì nó trực quan và ít tham số hơn.

11. Airflow: Data enginnering tool

Airflow là một nền tảng giúp ta có thể lập trình, lên lịch và theo dõi các tiến trình công việc. Airflow có giao diện phong phú giúp ta có thể dễ dàng hình dung các quy trình, bước chạy trên hệ thống, có thể theo dõi trạng thái các tiến trình và khắc phục sự cố khi cần.

12. Elasticsearch: Data search engine

Elasticsearch là một công cụ tìm kiếm và phân tích dữ liệu, nó có khả năng tìm kiếm theo thời gian thực và phân tán. Nó cho phép bạn khám phá dữ liệu với tốc độ và ở quy mô chưa từng có trước đây. Nó có thể tìm kiếm toàn văn bản, tìm kiếm có cấu trúc, phân tích và kết hợp cả 3. Elasticsearch là ứng dụng mạnh mẽ nhất trong top free python tools bởi tính ứng dụng rất lớn trong việc tìm kiếm và phân tích dữ liệu.

13. PyBrain: Algorithms for ML

PyBrain là một module Machine Learning của Python. Mục tiêu của nó là sự linh hoạt, dễ sử dụng những vẫn chứa đầy đủ sức mạnh của các thuật toán Machine Learning.

14. NumPy: Multidimensional arrays

NumPy là một thư viện tính toán cơ bản rất hữu ích dành cho việc phân tích dữ liệu, thống kê và data science.

15. Matplotlib: Data visualization tool

Matplotlib là một thư viện hàng đầu giúp ta có thể dễ dàng mô hình hóa dữ liệu. Nói đơn giản hơn nó giúp ta có thể nghiên cứu dữ liệu thông qua các biểu đồ, hình vẽ… một cách trực quan.

16. PyTables: Used for managing HDF5 datasets

PyTables là một package của Python để quản lý các bộ dữ liệu phân cấp và được thiết kế để làm việc với lượng dữ liệu lớn và cực lớn.

17. IPython: Powerful shell

IPython là một ứng dụng giúp sử dụng code python shell một cách mạnh mẽ

18. PyMongo: MongoDB driver

PyMongo là thư viện giúp Python kết nối tới hệ quản trị cơ sở dữ liệu MongoDB.

19. Redis: Redis access libraries

Package này giúp Python làm việc dễ dàng với Redis.

20. Scikit-lear: Used for machine leaning algorithms

Đây là một trong những thư viện về Machine Learning nổi tiếng nhất giúp Python nằm trong top các ngôn ngữ lập trình phổ biến về Machine Learning. Scikit-lear chứa hầu hết các thuật toán Machine Learning từ đơn giản đến phức tạp, từ cổ điển đến hiện tại, xứng đáng nằm trong top free python tools cho lập trình viên.

21. Keras: High-level neural network API

Scikit-lear chuyên về Machine Learning còn Keras thì lại chuyên về Deep Learning giúp Python được sử dụng hiệu quả để phát triển các ứng dụng trí tuệ nhân tạo.

22. Bokeh: Data visualization tool

Bokeh kém nổi tiếng hơn Matplotlib nhưng cũng là một ứng dụng tốt để có thể visualization dữ liệu.

23. Dask: Data enginnering tool

Dask là giúp Python có thể xử lý các tác vụ liên quan đến tính toán song song.

24. Luigi: Data enginnering tool

Luigi giúp developer xây dựng các tác vụ, job phức tạp khi cần xử lý các công việc hàng loạt.

25. SymPy: Symbolic math

SymPy giúp Python tính toán các biểu thức toán học, các công thức toán học phức tạp.

26. Pattern: Natural language processing

Pattern là một module nổi tiếng giúp xử lý ngôn ngữ tự nhiên hiệu quả.

Trên đây là 26 free python tools phổ biến và hữu ích cho lập trình viên. Nếu bạn thấy có những tools, thư viện nào hữu ích và phổ biến hơn nữa thì chia sẻ cho mọi người thêm nhé.

Có thể bạn quan tâm:

Apex-Oracle: Phân quyền select cho table system

Ứng dụng phê duyệt theo quy trình của mình trên APEX cần thêm tính năng gửi email thông báo tới người nhận thông tin tiếp theo cũng như thông tin phê duyệt hoặc từ chối tới email của người dùng. Mình chỉ việc viết thêm hàm gửi email vào trong mỗi bước phê duyệt hoặc từ chối là xong. Code gửi email được viết bằng PL/SQL trên server Oracle mới đã có sẵn package đã được sử dụng từ trước rồi nhưng khi tiến hành dịch lại trên server này thì lại gặp lỗi thông báo bảng dba_directories không tồn tại. Lỗi này là do table không được phân quyền select trên Oracle.

Thực chất bảng dba_directories này là bảng của hệ thống nhưng với schema đang đăng nhập thì lại không có quyền gì thao tác trên bảng này. Đối với hàm gửi email cần truy cập bảng dba_directories để lấy đường dẫn nên ta phải tiến hành phân quyền select vào bảng dba_directories cho user (hay còn gọi là schema) chạy hàm gửi email này. Bởi vì bảng dba_directories là bảng của hệ thống nên ta phải sử dụng quyền sysdba để tiến hành phân quyền.

Sau đây là các bước phân quyền select cho table

Đối với server database Oracle chạy hệ điều hành Windown thì ta tiến hành các bước sau để phân quyền:

  • Bước 1: Login bằng tài khoản admin vào server database Oracle.
  • Bước 2: Mở cửa sổ command line cmd.exe lên
  • Bước 3: Bật sqlplus với quyền sysdba
    sqlplus “/ as sysdba”
  • Bước 4: Phân quyền select table cho user cần quyền select
    grant select on dba_directories to PKTUY_user;
  • Bước 5: Kết quả sau khi grant được thông báo là:
    Grant succeeded.

Sau khi đã phân quyền xong thì biên dịch lại package không còn bị lỗi nêu trên nữa.

Một số bài viết liên quan đến quản trị hệ thống Oracle:

Hình ảnh gây sốc của nhóm bạn trẻ tụt quần checkin tại Đà Lạt

Mặc dù gỡ bức ảnh khỏi trang cá nhân nhưng cơn bão chỉ trích của cộng đồng mạng về việc nhóm bạn trẻ tụt quần Checkin tại Đà Lạt vẫn không hạ nhiệt.

Chụp ảnh để lưu giữ lại những khoảnh khắc của bản thân cùn bạn bè hay gia đình khi đi du lịch hoặc thăm thú một nơi nào đó là một rất bình thường. Tuy nhiên, có nhiều bạn trẻ có những hình ảnh chụp phản cảm không phù hợp với thuần phong mỹ tục cũng như vi phạm nội quy di tích… xuất hiện ngày càng nhiều.

Nhóm bạn trẻ tụt quần chụp ảnh tại Đà Lạt
Nhóm bạn trẻ tụt quần chụp ảnh tại Đà Lạt

Mới đây, cộng đồng mạng hết sức phẫn nộ trước một bức ảnh được đăng tải trên trang cá nhân của một bạn trẻ trên facebook ghi lại hình ảnh 5 bạn nam thuộc nhóm tụt quần checkin. Hình ảnh được xác định được ghi lại ở Đà Lạt khi nhóm bạn này đi du lịch tại đây. Hứng chịu nhiều gạch đá từ cộng động mạng nên ngay lập tức bạn trẻ đã gỡ hình ảnh này trên trang cá nhân của mình nhưng trước đó bức ảnh đã được phát tán nhiều trên các nhóm hội và diễn đàn để chia sẻ về hành động gây sốc này.

Ngày càng có nhiều các bạn trẻ chụp ảnh gây sốc trên mạng xã hội

Nhóm cô gái trẻ mặc váy chụp ảnh tại nơi linh thiêng
Nhóm cô gái trẻ mặc váy chụp ảnh tại nơi linh thiêng

Trước đó, một nhóm các bạn nữ cũng nhận nhiều gạch đá khi mặc váy tạo dáng chụp ảnh tại một ngôi chùa. Đây là hành động thiếu hiểu biết hay cố tình để gây sốc của nhóm bạn nữ thì không rõ nhưng ngay việc mặc váy tới chùa đã là điều không chấp nhận được. Chùa là nơi linh thiêng, đã có nội quy chung khi tới chùa là không mặc váy hoặc quần áo hở hang nhưng nhóm bạn trẻ này lại còn thản nhiên tạo dáng chụp hình phản cảm.

Nhiều người cho rằng không phải những bạn trẻ này thiếu hiểu biết mà là do tâm lý thích thể hiện, muốn được nổi tiếng nên có những hành động đáng xấu hổ như vậy. Mặc dù hứng nhiều gạch đá từ dư luận nhưng những hành động phản cảm này xuất hiện ngày càng nhiều trên mạng xã hội cho thấy sự suy đồi đạo đức là đáng báo động. Thiết nghĩ gia đình và nhà trường cần nghiêm khắc giáo dục cũng như có những hình phạt cho những hành vi khó đỡ này.