Chủ Nhật, 29 tháng 12, 2013

Trích dẫn "Một năm 2013 kỳ lạ"

Oh lovely days

"Oh lovely days please just dont go away,
those memories follow me day by day.
Flashing back and forth whenever I'm all alone.
Winter comes and goes, 
leaving only pain and sorrow,
but you're still stuck in my heart.
How can I go back,
the time when we were together,
smile that big and enjoy that much this joyful world.
So let me be with you once more,
and open the door to your heart."

~ Written by Khue Nguyen Quang ~

---- 03/12/2013 ----

Khí trời buổi tối lạnh và ủ dột, mặc dù ban ngày trời nắng đẹp. Không rõ là thời tiết như thế thật hay do tâm trạng mình không tốt nên mới có cảm giác như thế. Vào bệnh viện thăm bà, mình lại nhìn thấy những bờ tường trắng toát bao quanh, những máy móc phát ra đủ các thứ tiếng khô khốc mệt mỏi. Thực sự mình chỉ có thể thăm bà, nhìn thấy bà như vậy, chứ bất lực chẳng làm được gì khác. Mình chợt bất thần nắm lấy bàn tay bà, bàn tay gầy guộc với nước da nhăn nheo nhưng trắng và mềm của một người phụ nữ cả đời gắn bó bút sách. Bàn tay bà lúc ấy vẫn còn ấm áp như hồi xưa bà dắt mình trên đường đến lớp. Nhưng nhịp thở của bà thì không như vậy, yếu ớt, chậm rãi theo nhịp của máy thở, giống như một ngọn nến trước gió cố gắng sáng, cố gắng chống chọi lần cuối trước khi vụt tắt mãi mãi. Những tiếng phều phào của máy thở làm cho mình cảm thấy ngột ngạt, gò ép và rồi cuối cùng chính mình cũng bắt đầu hít vào và thở ra theo nhịp máy thở của bà. Mình hy vọng, chỉ một chút thôi, rằng bà dù hôn mê nhưng vẫn cảm nhận được theo một cách nào đó bàn tay mình đang nắm lấy tay bà, như đã từng như thế ngày mình còn bé...

---- 08/12/2013 ----

Mình ngả lưng, nhắm nghiền mắt lại, trong lòng đã sẵn sàng chờ tin xấu về. Chỉ một tiếng nhắm mắt lại nhưng có bao nhiêu mộng mị tràn đến, xâm chiếm vào trong từng ngóc ngách của bộ não mình. 

Bà, một người phụ nữ Hà Nội tân kỳ, học vấn cao, thông thạo tiếng Pháp, thích ăn quà vặt, bánh kem, ô mai và đồ tây cũng giống như mình, ăn ở luôn gọn gàng sạch sẽ, tính hiền hoà nhưng nghiêm khắc và sống có nguyên tắc. Bà chính là niềm tự hào của cả gia đình. Từng là một người phụ nữ tuyệt đẹp nhưng bà đã không thoát khỏi sự khắc nghiệt của thời gian. Những kỷ niệm, những hộp sữa chua, nước cam thảo, ô mai chanh, ruốc, những lần bà ra ngoài mình khóc rống lên đòi, những buổi tối mùa đông nằm ngủ cạnh bà rúc vào ôm bà cho ấm. Mọi thứ xoắn lấy đầu óc mình trong cơn mê.

Và rồi, tin xấu đã đến thật. Bà đã ra đi mãi mãi vào lúc 0h57...



Mình cùng chị đi bộ vào bệnh viện, may mắn rằng bệnh viện Đống Đa ngay gần nhà nên chỉ mất vài phút là tới nơi. Mọi người trong gia đình đã tề tụ đông đủ, mẹ và bác đã bắt đầu mặc quần áo cho bà thay cho bộ quần áo bệnh nhân. Những gì mình nhìn thấy trước mắt giờ chỉ còn lại thân xác bà, vô hồn và lạnh lẽo. Thật ngạc nhiên là khi ấy mình trở nên cực kỳ bình thản. Không phải vì mình đã biết trước mọi việc, mà vì cái gì mình cũng không biết nữa. Mẹ nhắc không được khóc nhưng mình chẳng có gì để mà khóc được cả. Sau đó dần ngẫm lại, mình mới hiểu rằng sự đau đớn, mất mát thực sự không hề nằm ở những giọt nước mắt. Khi trước, mỗi lần đứng trước những mất mát như thế này, những thứ có thể hạ gục mình, mình lại tỏ ra bình thản, tỏ ra mạnh mẽ nhất có thể. Nhưng nay thì mình bình thản thật, vì mình cảm thấy mình đã trưởng thành thực sự, đã thực sự mạnh mẽ để vượt qua mọi thứ. 

Sự nhớ ra một điều quan trọng, mình vớ ngay chiếc kéo trên bàn dụng cụ bên cạnh và luồn tay vào cắt một đoạn tóc của bà. Tóc bà trắng muốt, mỏng nhưng chắc, mềm và mượt, đó là thứ duy nhất mình muốn giữ lại làm kỷ vật về bà. Kẽ hôn lên trán bà lần cuối, lòng mình quặn lại khi đôi môi chạm vào làn da nguội lạnh, hoàn toàn không có chút sức sống nào nữa, cũng chỉ như đồ vật kia vô tri, vô giác. Vậy là từ nay gia đình sẽ vắng bóng bà, sẽ không còn như trước nữa. 

Đó cũng chính là cái kết của một năm 2013 kỳ lạ mà mình đang tổng kết trong bài viết này.

Áp lực

Mọi chuyện bắt đầu với một núi áp lực dồn ép lên mình từ đầu năm. Học chương trình Cử Nhân Tài Năng, mình may mắn được nghiên cứu dưới sự hướng dẫn của một giảng viên Bách Khoa có trách nhiệm cao như cô Lan. Thực ra trước đó mọi thứ cũng không hề dễ dàng đối với mình, cô Thuỷ, người được giao phụ trách mình đã không thèm đếm xỉa gì tới mình, khiến mình suýt nữa thì không hoàn thành được chương trình nếu như mình không kiên quyết đổi giảng viên hướng dẫn. Sau đó là một loạt những thuật toán khủng khiếp mà mình tin rằng có đọc bằng Tiếng Việt mình cũng không hiểu, dồn dập tiến tới bao vây mình trong hỗn loạn. Thú thực, đến giờ phút này, sau khi đã làm xong đề tài nghiên cứu, mình vẫn không hiểu chúng! Chỉ đơn giản là mình có chút khái niệm mọi thứ có thể hoạt động như thế nào, chứ hoàn toàn không hiểu các thuật toán ấy một cách sâu sắc. Mình vẫn kém toán từ trước. 



Cái sự kém toán của mình còn dẫn đến một mối đe doạ khác ảnh hưởng tới việc mình ra được khỏi trường. Trước chuyến đi Úc của mình, mình vẫn còn nợ thi lại môn giải tích 2, vốn dĩ là một môn vượt quá sức mình. Nếu khi ấy không thi lại sớm, mình có nguy cơ kẹt lại và chắc chắn chương trình Cử Nhân Tài Năng mà mình đang theo đuổi sẽ bị ảnh hưởng nặng nề.



Dẫu vậy, mình vẫn cố gắng gánh thêm một áp lực nữa cho bản thân. Thông thường, sinh viên chương trình Cử Nhân Tài Năng chẳng có lý do gì phải đi thực tập nghề nghiệp. Nhưng mình đã đưa ra một quyết định mà không cần suy nghĩ, mình sẵn sàng chấp nhận nộp đơn thử việc tại SmartOSC, một công ty chuyên về thương mại điện tử.

Điều này cũng có nghĩa là mình không đi làm giảng viên như mình dự tính trước kia nữa. Đằng nào thì nghiệp dạy học cũng không phải thứ mà mình thích lắm. Mình muốn kiếm được tiền và có được kinh nghiệm tương xứng với những thứ mình bỏ ra để đi học.


Khó mà diễn tả được tình hình lúc ấy, các ngày thứ 2, thứ 3 và thứ 4 mình đi làm toàn thời gian còn thứ 5, thứ 6 và các ngày nghỉ mình dồn hết tâm sức cho việc học. Lần đầu tiên đi làm thực sự không dễ dàng gì với mình khi bản thân thậm chí không hoàn thành hết khoá huấn luyện như các trainee khác vì đội của mình, đội REC, đang thiếu nhân lực và mình cần phải nhào vào làm việc ngay (thực tế mình đã không biết đội REC non trẻ như vậy và thực ra khi tuyển mình đã chắc chắn vào đội này). 


Ban ngày làm việc hết sức để chứng tỏ năng lực của mình, tối đến thức đến tận khuya để nhồi nhét tất cả những thứ có thể vào đầu. Do đi làm không toàn thời gian nên lương mình nhận được cũng chỉ đủ cho mình đi lại, thấp hơn so với những nhân viên thử việc còn lại nhưng mình cũng không xin bố mẹ tiền tiêu vặt, hậu quả là mình luôn trong trạng thái thiếu tiền, còn tâm lý bắt đầu hay cáu gắt hơn, dễ bực mình với mọi người xung quanh kể cả những chuyện nhỏ nhặt. Có những lúc chán nản, mình đã muốn bỏ cuộc nhưng rồi mình hiểu rằng con đường duy nhất để thành công chỉ có bước tiếp, và còn một nguồn động lực khác quan trọng khiến mình không thể bỏ cuộc.

Còn sức khoẻ có lẽ mình đã ở trạng thái tồi tệ nhất, chưa từng bao giờ như vậy trong suốt cuộc sống của mình trước đây. Mình hiểu ra rằng cái sự "trâu bò" của mình hoá ra cũng chỉ có giới hạn, và mình bắt đầu tập luyện để dần lấy lại bản thân mình. May mắn rằng mọi thứ cũng đã dần tốt hơn trước.

Học tập

Sau khi đã hy sinh nhiều thứ: sức khoẻ, thời gian, tiền bạc, một mối quan hệ, một kỳ nghỉ hè dễ chịu, v..v... cuối cùng mình đã ra được trường, tạm kết thúc chuỗi ngày đèn sách học trên giảng đường trường đại học để bắt đầu học cái gọi là "trường đời".



Mình may mắn có điểm tổng kết cao nhất nên đã được gắn cho danh hiệu Thủ Khoa của FIT. Đó là niềm vinh dự của mình, nhưng cũng là bài học đầu tiên mà "trường đời" dạy cho mình. Thực sự mình không chiến đấu để trở thành thủ khoa, mình chỉ là một anh chàng may mắn cao điểm hơn người khác. So với các thủ khoa xung quanh của Hà Nội, những người có tổng điểm cao chót vót và bề dày thành tích, hoạt động xã hội khủng khiếp, mình chỉ như một thằng từ dưới đất chui lên, xa lạ và bình thường. Mình thậm chí đã sợ không ra nổi được trường chứ đừng nghĩ tới thủ khoa! Và rồi khi nhìn thấy một đám lố nhố áo đỏ áo vàng chen chúc nhau nhộn nhạo giữa sân của Văn Miếu để nhận giấy khen với vài trăm nghìn đồng, mình càng củng cố niềm tin rằng mình không thuộc về cái tập thể ấy. Cái mác này, với mình đương nhiên đáng quý trọng, đương nhiên là thứ xứng đáng với công sức mình bỏ ra đi học, nhưng không phải thứ mình muốn dùng hù doạ người khác. 



Mình lặng lẽ cất vào tủ tất cả, cố thử thuyết phục thằng bạn thân của mình đừng quá hy vọng vào cái danh xưng ấy, đừng lún sâu và tham lam cố nhận lấy bằng được cái danh hiệu thủ khoa phù phiếm đó. Nó có tài, và tài năng của nó hơn mình nhiều, nó xứng đáng là thủ khoa (lẽ ra nó đã là thủ khoa nếu không đi Italia), nhưng là thủ khoa ở cuộc sống thực chứ không phải là thủ khoa trên sân khấu với một tấm giấy khen vô giá trị, thứ ấy không ăn được, không làm ra tiền được, cũng không làm cho nó trở nên tuyệt vời hay hoàn hảo hơn người khác.

Trước mắt mình lúc ấy là tương lai, đầy hứa hẹn, đầy hoài bão và cũng lắm chông gai đang chờ đợi. Thực tế, mình cảm thấy mất phương hướng và vô vị nhiều hơn là một niềm vui, kể cả khi mọi thứ kế hoạch cho cuộc đời mình đã được mình sắp đặt sẵn một cách cẩn thận.


Công việc

Công việc tại SmartOSC của mình từ đầu đến giờ hoá ra lại chỉ tập trung vào mỗi dự án quả tạ Tarazz, dự án thuộc loại to nhất, phức tạp nhất từ trước đến nay của công ty. Không biết nên coi đó là may mắn hay là xui xẻo. Có lẽ là cả hai, vừa may mắn, vừa xui xẻo. May mắn là nhờ nó, mình đã đẩy năng lực làm việc của mình lên một mức tương đối cao, học được nhiều thứ mà chỉ có va chạm thực sự mới có được. Xui xẻo là bởi dự án đã luôn trượt dốc dù cố gắng đến mức nào đi chăng nữa. Nhân lực đông nhưng vẫn thiếu và yếu về chuyên môn, chính mình cũng không ngờ một nhân viên không có bề dày kinh nghiệm như mình lại được tham gia vào một dự án lớn như vậy. Những yêu cầu đòi hỏi oái oăm, khó chịu đến từ khách hàng, lỗi hệ thống liên miên, làm ngoài giờ suốt nhiều tháng liên tục và khách hàng kiện cáo lẫn nhau dẫn đến đội làm dự án luốn trong trạng thái mệt mỏi, đuối sức. Thực tế, ai cũng muốn dứt khỏi dự án vì dính vào nó không tạo được thêm giá trị thặng dư nào. Thậm chí nó là một phần lý do mà đội REC non trẻ phải giải tán và mình được chuyển về CED. Cuối cùng thì toàn đội làm dự án Tarazz còn lại có vài thành viên, trong đó có mình. Nhưng có lẽ không nên nói xa thêm nữa, đơn giản chỉ vì đây là cuộc đời, nơi mà điều gì cũng xảy ra được, phải tiến lên thay vì kêu ca. Mình nhận ra tiếp rằng mình đã bớt kêu ca hơn so với trước kể từ khi đi làm!

Ở SmartOSC, mình đã được làm việc trong một môi trường không tồi. Thực tế đây là môi trường mình thích vì nó thân thiện, cởi mở, không quan liêu và đãi ngộ tốt. Phần nhiều, mình không có phàn nàn gì cả, đối với mình mọi đồng nghiệp xung quanh đều đáng mến và phù hợp với mình. Ở đây, mình có thể phát huy được những thứ mà mình mạnh và học hỏi từ những anh chị nhiều kinh nghiệm hơn. Họ đều giỏi, đều có năng lực tốt và có những người là lãnh đạo có kinh nghiệm và tầm nhìn, mình thực sự được mở rộng tầm mắt và học được thêm rất nhiều.



Tuy thế, mình luôn cố gắng để tránh làm việc ngoài giờ càng nhiều càng tốt. Không phải vì mình không mẫn cán hay vô trách nhiệm mà bởi mình muốn có thời gian mở rộng khả năng của mình. Lún sâu quá vào công việc hàng ngày có thể tạo tâm lý chây ì, làm thui chột ý chí tiến thủ của mình. Mặt khác, tự nhận mình là một Smarter, mình muốn tạo ra chiến lược và thói quen làm việc với năng suất cao trong thời gian ngắn. Mục tiêu đó là hàng đầu chứ không phải sự chăm chỉ hì hục cắm đầu vào công việc đến mụ người. Mình biết sẽ khó cho chính mình khi mình thì đi đúng giờ, về đúng giờ còn người khác thì chăm chỉ ngoài giờ, người châu Á vẫn vậy. Nhưng muốn thay đổi thế giới xung quanh như ý mình thì phải dũng cảm, phải tự giác và tin rằng mình làm được bằng mọi giá, bất kể khó khăn. 

Cả hai lần phỏng vấn xét duyệt lương, tuy chưa biết kết quả lần cuối năm này, nhưng mình tự tin rằng mình luôn tự nhận xét được về bản thân mình chính xác nhất, sát nhất với thực tế. Đó là động lực để mình cố gắng hơn nữa và đóng góp tài năng của mình. Muốn làm giàu và trở nên vĩ đại hơn chính bản thân mình thì mình cần đánh giá được mình đang ở vị trí nào, có gì và thiếu gì chứ không thể chém gió được. Mình muốn làm quản lý, muốn dần dần làm chủ bản thân mình và làm được cái gì đó lớn lao hơn. Ước mơ ấy cháy bỏng và chỉ thực hiện được khi mình sẵn sàng cống hiến.

Mất mát

Năm qua 2013 cũng là một năm chẳng phải quá vui vẻ với mình khi những thứ thân thương nhất với mình ra đi. 

Đầu tiên là con Béo, con mèo gắn bó với mình suốt 12 năm bỏ nhà đi. Rốt cục nó vẫn là con mèo, nó vẫn tuân theo bản năng và tiếng gọi nơi hoang dã hơn là tình cảm gắn bó giữa chị mình và mình với nó. Cảm giác khi một thứ gắn bó với mình đã lâu đột nhiên biến mất và không bao giờ trở lại nữa thực sự không dễ dàng chút nào.



Sau đó, gia đình mình nuôi Luna, con cún mà mình đích thân đặt tên. Luna là một con cún có bộ lông mềm, mượt, đen tuyền rất đẹp. Nó có một cái mõm hay cười, thích đi la liếm và yêu chủ cực kỳ. Nhà mình có truyền thống nuôi thú cưng toàn béo tốt, đẫy đà cả nên Luna cũng như vậy, to khoẻ và béo tốt. Mình vẫn nhớ cái mùi hôi hôi, sự nhớp nháp của nước bọt con cún khi nó liếm láp vào tay mình, cả những khi chơi đùa với nó nó nhảy tưng tưng lên vui mừng. Chưa khi nào nó hết niềm vui và chắc chắn rồi, niềm vui của nó cũng đem đến niềm vui cho cả nhà. Nhưng số mệnh không bao giờ chiều lòng người, vào một ngày tháng 8, Luna đã ra đi mãi mãi dù mới chưa đầy một tuổi. Nó đã rên lên trong đau đớt tột cùng của bệnh tật và sau đó cứ lả dần, lả dần không thở tiếp được nữa rồi lịm đi, mắt vẫn mở ra trăng trối rất thương. Mình lúc ấy chỉ biết vuốt ve đôi tai mềm và cái mõm dài của nó, bất lực nhìn nó ra đi. Sau đó mình bế nó trên tay, cho nó vào một cái bao tải, ôm lấy thân xác của nó lần cuối và để nó được an nghỉ ở một bãi đất ven sông Hồng nhờ anh bác sĩ thú y chôn cất hộ. Từ lúc ấy, mỗi khi về đến nhà, mình lại tưởng như vẫn còn con cún ra ngoe nguẩy đuôi chào đón mình, sẵn sàng sà vào lòng mình để được cưng nựng.



Và cuối cùng đương nhiên là sự ra đi của bà, dẫu cho sự ra đi ấy là vào một thời điểm tương đối đẹp của năm cũng không khỏi khiến cho mình buồn. Đó là một sự hụt hẫng dẫu đã là kết cục biết trước. Nhà mình vì đó có cảm giác lạnh hơn khi thiếu một thành viên quan trọng.

Những thứ thân thương nhất thường rời bỏ chúng ta vào những lúc mà chúng ta không lường tới nhất. Quan trọng là chúng ta phản ứng như thế nào trước những mất mát ấy. An ủi của mình lúc này có lẽ là hiện giờ có con mèo Lee Bong Chul, cũng do mình đặt tên, được vác về nuôi. Dẫu tính còn nghịch ngợm hư đốn nhưng ít nhất nó cũng là con mèo khiến cho mình cảm thấy chút vui vẻ, thư thái sau một ngày làm việc căng thẳng.



Tình cảm

Năm nay không phải năm tình duyên gì với mình. Mình vẫn như thế, vẫn xe tay ga và vẫn FA như năm ngoái bởi vì mình đã từ bỏ một mối quan hệ có lẽ sẽ giúp mình có "gấu" thật sự. Mình không nghĩ gì nhiều nữa, giờ cũng đã ổn thoả bình thường trở lại, mình chỉ mong rằng điều tương tự không bao giờ xảy ra nữa. 

Thực sự, chuyện đó xảy ra cũng tốt vì cuối cùng mình hiểu ra rằng tình cảm của mình không thực sự dành cho em ấy hoàn toàn. Dẫu chưa nói lời yêu thương được một lần chính thức nào nhưng mình cũng đã có một chút gọi là yêu, gọi là quan tâm và chăm sóc. Những cảm xúc ấy chính là thứ níu giữ mình mãi cho đến khi đối mặt với việc mối quan hệ chấm dứt và trở thành bạn bè như trước.

Rồi mình cố sức tìm kiếm và thử những điều mới lạ một chút cho mối quan hệ của mình, đơn giản là để xem đối tượng nào phù hợp. Nhưng rốt cục vẫn không có ai thay thế được người con gái ấy, cái người con gái mà mình thực sự suốt bao năm nay đã yêu và luôn yêu, người mà mình luôn chờ đợi đan cho mình một chiếc khăn quàng cổ ấm áp. Người đã là một trong số những động lực tuyệt vời nhất đối với mình để vượt qua mọi thứ. Vì cô ấy, mình đã từ chối nhiều cơ hội có người yêu thực sự và mình chưa từng hối hận bởi đó là việc đáng làm. 

Vậy là mình ngừng lại, vẫn thích rủ rê tán phét với con gái, đi chơi nhưng không còn quá quan tâm tới việc tán tỉnh. Tâm trí mình dẫu xa người con gái ấy, vẫn luôn nhớ tới và dành một góc quan tâm đặc biệt. Chỉ mong một ngày kia, mình sẽ là người đàn ông của cô gái ấy, còn cô gái ấy sẽ là người phụ nữ của đời mình. Đường còn dài, cũng có thể mình còn tan nát trái tim thêm vài lần nữa, nhưng chắc rằng mình vẫn sẽ tiếp tục hướng tới tình yêu thực sự. 

"Ngồi buồn qua những đêm dài thanh vắng,
Trải hồn tôi trong nỗi nhớ xa xăm.
Ở nơi đâu bóng hình em nhẹ lướt,
Bay trong mưa rì rào thoáng qua tim.
Hãy ôm tôi khi tôi còn ở cạnh,
Đừng tiếc nuối khi tôi đã ra đi.
Hãy hôn tôi khi đôi môi còn ấm,
Đừng rơi lệ khi thân xác lạnh tanh.
Bông hoa này tôi gửi vào trong gió,
Vượt nghìn trùng em có biết hương thơm?
Ánh sao xa hằng đêm nhìn em đó,
Ở nơi nào em có thấy lung linh?
Nhớ rồi mãi rồi chỉ là nỗi nhớ,
Gửi ngàn thương vào câu chữ nên thơ."

Tới đây hẳn cũng đã quá dài cho một bài viết tổng kết mọi thứ trong năm. Hy vọng rằng năm 2014, một năm mà mình có nhiều kỳ vọng, sẽ đem đến một làn gió mới cho tâm hồn mình và nhiều thành công hơn. Và hãy cứ yên tâm những người yêu quý mình, mình sẽ không bỏ cuộc dễ dàng trước cái gọi là "số phận". Mình còn nhiều hoài bão lắm, mình muốn là một con người đặc biệt, một người đem đến cảm hứng cho những người xung quanh và là người luôn dẫn đầu. Mình tin rằng sẽ có ngày ấy, ngày mà mình trở thành người mình muốn. 

Thứ Sáu, 13 tháng 4, 2012

Symfony Part 1: Configuration

How to install Apache, PHP5 and Symfony on Ubuntu 10

To install Symfony framework, first of all you’ll need to install and configure Apache + PHP5. Here’s how you can do it on Ubuntu. I’m using Ubuntu 10.10 Maverick Meerkat.

Installing Apache and PHP5 on Ubuntu

Just open your terminal and enter the following commands:
sudo apt-get install apache2
sudo apt-get install php5
sudo apt-get install libapache2-mod-php5

Testing the environment

Now let’s see if our environment fits all Symfony’s requirements. Download http://sf-to.org/1.4/check.php and run it in your terminal:
php check_configuration.php
You’ll probably find some errors. Let’s fix them!

Fixing the problems

ERROR:
[[WARNING]] PDO has some drivers installed: : FAILED *** Install PDO drivers (mandatory for Propel and Doctrine) ***
SOLUTION:
You need to enable the MySQL driver of PDO. Just enter the following command on Ubuntu’s terminal:
sudo apt-get install php5-mysql
ERROR:
[[WARNING]] XSL module is installed: FAILED*** Install the XSL module (recommended for Propel) ***
SOLUTION:
You need to install the XSL module for Apache and PHP5. Enter the following command on the terminal:
sudo apt-get install libapache2-modxslt php5-xsl
Then, let’s restart Apache. Enter the following command on the terminal:
sudo /etc/init.d/apache2 restart
ERROR:
[[WARNING]] php.ini has short_open_tag set to off: FAILED            *** Set it to off in php.ini ***
SOLUTION:
You need to tell PHP to accept open tags like <? instead of <?php. You have to edit the php.ini file. I’d rather use nano than vi to edit text files on Ubuntu, so enter the following command on the terminal:
sudo nano /etc/php5/cli/php.ini
Then change the following line:
short_open_tag = On
to
short_open_tag = Off
Press ctrl+X to exit and press Y to save your file.
Run another time the configuration checking file (php check_configuration.php). The only error you should find is: A PHP accelerator is installed: FAILED. All the other options must be OK. Let’s now install Symfony.

Installing Symfony on Ubuntu

Let’s install Symfony using PEAR - PHP Extension and Application Repository. First of all, let’s install PEAR:
sudo apt-get install php-pear
And then let’s install Symfony:
sudo pear channel-discover pear.symfony-project.com
sudo pear install symfony/symfony
If everything goes fine, you’ll receive this message:
install ok: channel://pear.symfony-project.com/symfony-1.2.9
Victory :) !

Thứ Sáu, 8 tháng 7, 2011

Yii Issues

NOTE: All of the examples provided in the book were completed with Yii version 1.1.2. Many readers are using the latest stable version of Yii (currently 1.1.5) to following along with the examples in the book. There are some subtle API/method signature differences (esp in some of the Gii auto-generated code) between these two versions. If you are using any version other than 1.1.2 to following along, you may have to make some adjustments to the examples used in the book.



  • Typo/Printing: Preface, Page 1 -
    The first section title reads: "What this book cover" it should read: "What this book covers" or "What is covered in this book"
  • Typo/Printing: Preface, Page 3 -
    Under the Conventions section, it is describing how code words in the text are shown and it uses the sentence: "You can type in help to see a list of commands available to you within his shell" It should be "...this shell" (i.e. 'his' should be 'this')
  • Style Formatting: Page 20 -
    The sentence:
    "Your application has been created successfully under /Webroot/demo/"
    should still be in code format style, as it is still part of the output from running the shell command.
  • Code Fragment: Page 105 -
    The code does not explicitly include the class in which the method should reside. The function is fine, but it could be misleading. The public function
    testGetTypes()
    needs to reside in a class. The full code is
    class IssueTest extends CDbTestCase { 
            public function testGetTypes() 
            { 
                    $options = Issue::model()->typeOptions; $this->assertTrue(is_array($options)); 
            } } 
  • Typo/Printing: Page 131 - The following line is missing a closing > bracket to delimit the end of the php statement:

    <b><?php echo CHtml::encode($data->getAttributeLabel('status_id')); ?:</b>
    It should be:

    <b><?php echo CHtml::encode($data->getAttributeLabel('status_id')); ?>:</b>
  • Typo/Printing: Page 142 -
    The very beginning sentence on this page has several issues. The sentence as it is printed is impossible to understand. The entire sentence should read: "As these links originate from the issue details page, we can take advantage of the associated project, and alter the links to pass in the specific project id. We can then use that project id as the criteria to limit the Issues returned by the query in both the IssueController::actionIndex(), and IssueController::actionAdmin() methods."
  • Type/Printing: Page 142 -
    There is a word 1/2 way down the page that is printed as "conssue", it should be "context": "...implemented a filter to enforce a valid project context"
  • Dated Code Snippet: Page 163 -
    The auto-generated code displayed for the
    UserIdentity::authenticate()
    method is from a version of the yiic webapp command that is prior to 1.1.2. It should be:
    public function authenticate()
            {
                    $users=array(
                            // username => password
                            'demo'=>'demo',
                            'admin'=>'admin',
                    );
                    if(!isset($users[$this->username]))
                            $this->errorCode=self::ERROR_USERNAME_INVALID;
                    else if($users[$this->username]!==$this->password)
                            $this->errorCode=self::ERROR_PASSWORD_INVALID;
                    else
                            $this->errorCode=self::ERROR_NONE;
                    return !$this->errorCode;
            }
  • Code Typo: Page 190 -
    sql query line
    primary key (projectId,userId,role)
    should be
    primary key (project_id,user_id,role)
  • Code Typo: Page 193 -
    $command->execute
    is missing the parentheses. It should be
    $command->execute()
  • Informational Note: Page 198 -
    You might need to define the foreign key relationship on tbl_project_user_role.project_id to automatically handle deletes of rows in the project table. Otherwise, you might get a constraint violation error when the unit test ProjectTest::testDelete() is run.
    in MySQL, something like
    ON DELETE CASCADE ON UPDATE CASCADE

    NOTE: The book is attempting to stay database independent, and the low level DDL statements for tables are intended to be general (i.e. not MySQL specific). However, the code available for download does have all of the MySQL specific statements used.
  • Code Typo: Page 249 -
    In url manager configuration, site/commentFeed is printed, but it should be just comment/feed:
    'urlManager'=>array(
                            'urlFormat'=>'path',
                            'rules'=>array(
                                    'commentfeed'=>array('[b]comment/feed[/b]', 'urlSuffix'=>'.xml', 'caseSensitive'=>false),
                                    '<pid:\d+>/commentfeed'=>array('[b]comment/feed[/b]', 'urlSuffix'=>'.xml', 'caseSensitive'=>false),
                                    ), 
                            'showScriptName'=>false,   
                    ),      
  • Typo: Page 210 -
    In the 3rd paragraph down, it refers to the view file as show.php but should be view.php.
  • Code/Yii version mismatch: Page 210 - The example 1/2 way down the page of creating the link is not consistent with the other menu items. It should be:
    $this->menu[] = array('label'=>'Add User To Project', 'url'=>array('adduser', 'id'=>$model->id)); 
    rather than using the CHtml::link method directly. (this format will still work, but is not consistent with the other menu items)
  • Code Typo: Page 91 - In the listed testCreate() function, the project column fields names need to be updated: 'createTime' should be 'create_time', 'createUser' should be 'create_user_id', 'updateTime' should be 'update_time' and 'updateUser' should be 'update_user_id'. The code still works and the test passes because the database will accept null values for these. But the names should be corrected.

3

#2 User is offline   DG Esteban A. Pérez 

  • Newbie
  • Yii
  • Add as Friend
  • Group: Members
  • Posts: 15
  • Joined: 16-September 10
  • Location:Bs. As., Argentina
Posted 30 September 2010 - 07:25 AM
Hi Jeff...

I'm reading your book... 2nd time... Yep... (first the digital, and now the paper one)

Yesterday I needed to understand how to use beforeSave, so I searched for it in your book.. I found "beforeValidate", it will help... Page 217... Bingo!...

But some one stolen the example!... And in the first reading I just didn´t see this :$

Pls... Could you paste it here?

Thanks.. Great work!!!

Esteban A. Pérez
(from Argentina)
0

#3 User is offline   jefftulsa 

  • Advanced Member
  • Yii
  • Add as Friend
  • Group: Yii Dev Team
  • Posts: 139
  • Joined: 06-October 08
  • Location:Austin, TX
Posted 01 October 2010 - 08:17 AM
View PostDG Esteban A. Pérez, on 30 September 2010 - 07:25 AM, said:
Hi Jeff...

I'm reading your book... 2nd time... Yep... (first the digital, and now the paper one)

Yesterday I needed to understand how to use beforeSave, so I searched for it in your book.. I found "beforeValidate", it will help... Page 217... Bingo!...

But some one stolen the example!... And in the first reading I just didn´t see this :$

Pls... Could you paste it here?

Thanks.. Great work!!!

Esteban A. Pérez
(from Argentina)


Hello Esteban,

I believe the example of using the
beforeValidate()
method starts on page 152 of the printed book.
0

#4 User is offline   Backslider 

  • Junior Member
  • Pip
  • Yii
  • Add as Friend
  • Group: Members
  • Posts: 96
  • Joined: 23-July 09
Posted 24 October 2010 - 10:27 AM
Thanks for a fantastic book, extremely helpful!

Will you be updating this book in further edtions?

In my opinion the TDD would have been best left to a single chapter (or another book), rather than clouding most chapters. Many people do not wish to use this approach and it makes things difficult for newbies.

I was somewhat disappointed that the RBAC was not completely implemented throughout the application. That is, with the final result any user could create, edit or delete any project, thus negating the access control elsewhere. There was no provision for giving users global permissions when creating/editing users or any indication as to how to use access control at this level. This was only implemented for issues. I didn't see any comment about this being left up to the reader and with such an important aspect of development I think the reader should have been walked right through.

Encountered a few problems due to Yii version (I use SVN latest version), however these were easily overcome.
0

#5 User is offline   Backslider 

  • Junior Member
  • Pip
  • Yii
  • Add as Friend
  • Group: Members
  • Posts: 96
  • Joined: 23-July 09
Posted 25 October 2010 - 09:07 AM
Chapter 8, page 197 uses the following:

Yii::app()->user->getId()


which should just be:

Yii::app()->user->id

0

#6 User is offline   Backslider 

  • Junior Member
  • Pip
  • Yii
  • Add as Friend
  • Group: Members
  • Posts: 96
  • Joined: 23-July 09
Posted 25 October 2010 - 10:17 AM
My understanding of the RBAC for this was that users would be assigned a global role, plus individual roles for projects. The table 'authassignment' (which should be AuthAssignment) however has 'itemname' and 'userid' as a primary keys, thus causing a MySQL error when trying to assign a user to a project.