Search This Blog

Wednesday, June 22, 2016

Kinh nghiệm Quản lý mail bằng Outlook

Mail là thứ cổ lỗ sỉ, chậm, không "mở", không có tính "social", không xx, không yy, không nên dùng mail,  nếu các bạn định reply như này thì có thể out :) đơn giản vì topic này dành cho những người phải làm việc bằng mail (như mình) 

Mỗi ngày mình nhận được hơn 300 mail (không kể mail auto thông báo của 3 hệ thống tool quản lý công việc nội bộ), đây chỉ tính mail do "người" viết :) Nếu không quản lý tốt, thì cơ bản là sẽ chết ngập trong mail. 
OK, vậy thì quản lý như thế nào? Mình có 4 quy tắc đơn giản: 
  1. Mail phải có phân loại bằng prefix.
    Prefix là cái chữ [TQA] trong hình dưới, điều này có nghĩa là nó là mail liên quan đến công việc dự án TQA, và sẽ trôi vào trong folder TQA ở bên cạnh.
  2. Những mail nào cần ai trả lời, thì phải trực tiếp đưa tên người đó vào trong TOLIST 
  3. Ưu tiên trả lời những mail mà tên của mình có trong TOLIST, phần còn lại thì từ từ, 
  4. Nếu có ai spam mail với tên mình trong TOLIST, nhắc nhở họ. 
Click vào xem hình lớn
quá nhiều mail
Rồi, sau khi áp dụng 4 quy tắc này, thì tiếp theo là cần: 
  1. Gom các mail có cùng Prefix vào trong 1 folder. ví dụ: prefix [TQA] thì vào trong TQA 
  2. Lọc các mail có cùng Prefix (ví dụ: TQA) nhưng có tên mình trong group mail vào trong 1 folder con, ví dụ: TQA.LongNX
  3. Đối với các mail trong TQA.LongNX, cần show conversation để biết nó thuộc thread thảo luận nào. 

Cách làm: 

Sử dụng 2 cái Outlook rule và 1 thủ thuật để thực hiện. 

1. Gom các mail có cùng Prefix vào trong 1 folder. ví dụ: prefix [TQA] thì vào trong TQA 

Cách làm: 
  1. Từ Ribbon, chọn Home / Rules / Manage Rule and Alert
  2. New Rule
  3. Move Message with specific word in subject to specific folder 
  4. chọn [TQA] và folder TQA 
  5. Next, next, next, next, Finish

2. Lọc các mail có cùng Prefix (ví dụ: TQA) nhưng có tên mình trong group mail vào trong 1 folder con, ví dụ: TQA.LongNX

Lại tạo 1 rule như trên, nhưng giò trong folder TQA, tạo thêm folder con TQA.LongNX. 
Tại bước số 4, (sau khi chọn [TQA] và folder TQA) thay vì Next thôi, thì tick thêm cái option. Where my name is in the To box


3. Bật chức năng Conversation để xem email dạng thread 

Bật chức năng Show as Conversation để dễ dàng nắm được email thuộc thread thảo luận nào. 

Saturday, June 11, 2016

Outlook : Xem mail ở dạng "thread" như trên web (Conversation mode)

Lời tựa, 
Đôi khi trong công việc các bạn thường phải theo dõi những thread mail dài, và chỉ "lơ là" mấy phút thôi là không biết mọi người đang nói gì, đang feedback cho ai. 
Ví dụ, trong hình đầu tiên bên dưới, sơ sơ có 10 mail trong 1 thread, từ nhiều người khác nhau, nếu bỏ qua một mail, thì đọc mail sau đó đôi khi không hiểu đồng nghiệp đang thảo luận đi đâu vậy.
Hoặc là trả lời "trùng" một vấn đề đã được người khác trả lời, tệ hơn nữa là trả lời nghịch ý. 
Bên dưới Long hướng dẫn cách bật một tính năng rất hữu ích của Outlook, đó là xem mail theo dạng "cuộc hội thoại" (view as conversation). 
  1. Nếu đang ở Reading Pane, thì click vào button "By Date" để chuyển mode, chọn View as Conversation
  2. Nếu không ở chế độ Reading Pane thì từ trên Ribbon, chuyển qua tab View, chọn Show As Conversation 
  3. Chọn This folder để "thử" riêng đối với folder hiện tại. 
  4. Nếu mail chưa được hiển thị toàn bộ, lại ngó lên ribbon, chỗ Conversation Setting, tick chọn tất cả các option của nó. 
Xong, Enjoy và apply cho tất cả các folder khác nếu muốn. 

Tuesday, July 7, 2015

[Excel] Nối nhanh nội dung các Cell trong 1 Range thay vì dùng hàm CONCATENATE()

Hôm nay ngồi quằn quại với đống report bằng Excel, cảm thấy phát khùng lên vì hàm CONCATENATE() của Excel nó không cho truyền vào 1 range, mà bắt phải truyền vào từng Cell, thế là lòi ra cái hàm macro này.
Tác dụng: nối (concatenate) dữ liệu từ nhiều Cell trong 1 RANGE với delimiter tùy chọn.
Cách dùng: Alt+F11 , Add new module, copy&paste đoạn source bên dưới và tận hưởng việc nối cell bây giờ dễ dàng hơn bao giờ hết.
Trước kia: để nối nội dung của các cell từ A1~A5, giữa các nội dung có dấu phẩy (,) thì phải gõ
 =CONCATENATE(A1,",",A2,",",A3,",",A4,",",A5) 
Hãy tưởng tượng khi bạn phải nối nội dung của 50 Cells :'(
Bây giờ thì chỉ cần
 =CONCAT(A1:A5,",") 

Sunday, June 28, 2015

Sử dụng uLister để Quick View trong FreeCommander


Prewords

Nếu ai dùng FreeCommander đều biết, FC (và các advanced-file-browser khác) có hỗ trợ tính năng quick view (F3, Shift-F3, Ctrl-Q) để xem nhanh nội dung 1 file mà ko phải mở trình đọc file tương ứng (vd như thay vì phải đúp click để mở trình xem ảnh của windows hay Picasa để coi 1 bức ảnh, các bạn có thể ctrl Q và xem nhanh nội dung của bức ảnh đó) tuy nhiên, với file .xls, .xlxs v.v. thì chỉ hiển thị 1 đống code lằng nhằng. Bài viết dưới đây hướng dẫn các bạn làm cho cái Quick Viewer của FreeCommander view dc các file excel đó (và những file tương tự).(Click vào hình để coi hình to)

Chuẩn bị 

Đầu tiên, bạn phải có

  1. FreeCommanderXE 
  2. uLister (1 cái plugin viết cho TotalCommander, nhưng FCMD dùng ké) 
  3. Viewer Technology:  cái này của ORACLE, là 1 bộ lib để view dc nhiều thể loại format file, cái plugins uLister xài lại bộ Redist của nó. 

Túm váy, các bạn phải chuẩn bị đồ đạc như sau:

Thao tác

1. Extract & Copy

Extract thằng uLister vào 1 folder nào đó, như trong sample là E:\PortableApps\FreeCommanderPlugins
Extract thằng vw-8 ra , copy folder redist của nó vào trong folder wlx_uLister

2. Un hide

Mở setting của FreeCommander, bỏ check ở chỗ "hide toolbar in quick viewer" đi.

3. Enable

Quick view thử 1 file, bình thường thì nó sẽ hiển thị một mớ "lằng nhằng" thế này

click vô chỗ cái nút Setting của QuickViewer, chuyển qua tab Plugins, bấm vô nút add, chỉ tới cái file uLister.wlx


Thành phẩm: 
ZIP nè

PDF nè: 


DOCX nè


XLSX nè


Saturday, March 28, 2015

Change DNS server dễ dàng bằng giao diện GUI trong Ubuntu 14.04

 Mặc dù rất yêu quý cái CLI nhưng một số task làm bằng GUI vẫn dễ hơn thật  :) lăn lộn với đống setting trong vim mệt quớ  :'(

copied from comment của pa1pal http://unix.stackexchange.com/questions/128220/how-do-i-set-my-dns-on-ubuntu-14-04
  1. Nhấn Super (phím Window) Search ' Network Connection'
  2. Mở ra
                        enter image description here
  3. Chọn giao thức đang sử dụng, bình thường thì sẽ có 1 cái, còn ai dùng lap mà có cắm LAN thì có thể là 2:
                  enter image description here
  4. Select ipv4 Settings
  5. Điền DNS name vào ôDNS servers,
  6. Tận hưởng!
insprired từ comment của pa1pal http://unix.stackexchange.com/questions/128220/how-do-i-set-my-dns-on-ubuntu-14-04

Tuesday, February 10, 2015

[repost] A case study on applying Scaled Agile Framework (SAFe)

re-post từ blog Nguyễn Vũ Hưng link


Tóm tắt:
Bài viết này tóm tắt một số ý quan trọng khi triển khai Scaled Agile Framework (SAFe) ở mức team, dự án, program (chương trình) và tổ chức (company level)

Bối cảnh:
Áp dụng trong một công ty cỡ trung bình,
tổng số nhân viên vài ngàn người,
tổng số nhân sự IT (phát triển, testers, quản trị dự án...) là vài trăm,
với nhiều tiểu dự án, dịch vụ (online) chạy song song.
Mô hình quyền quyết định và budgeting là top-down.
Hệ quả là, tư duy top-down ngay cả trong cách chạy dự án IT cũng là top-down và rất waterfall.
Thách thức:
Áp dụng mô hình Agile vào tổ chức này như thế nào để làm "đẹp lòng" lãnh đạo (cao cấp) trong khi các dự án IT vẫn chạy tốt?
Cách tiếp cận:
- Agile tới từng team, dự án, chương trình, mục tiêu (portfolio) và tổ chức,
- Áp dụng những Agile toolkit cơ bản, có lộ trình,
- Việc áp dụng Agile toolkit ở mức team (5-10 người) được phó mặc cho Project lead, scrum master.
Lựa chọn scaled Agile framework:
Tôi chọn SAFe thì mô hình này vẽ đẹp, trực quan, dễ dàng dùng hình để thuyết phục lãnh đạo.
Iteration là một Agile practice được mô tả đơn giản, chia theo các mức lãnh đạo, phòng ban trong tổ chức có thể dễ dàng áp dụng.
SAFe tập trung vào quy trình, thích hợp hơn ở mức tổ chức
Tôi có tìm hiểu qua các scaled Agile framework sau nhưng không chọn:
  1. RAP (Real Agility Program)
  2. DAD (Disciplined Agile Delivery)
  3. LeSS (Large Scale Scrum)
Lộ trình tiếp cận và áp dụng SAFe:e
  1. Áp dụng Agile toolkits cho các nhóm phát triển. Đối tượng áp dụng là scrum master, tester, developers...
  2. Áp dụng Agile toolkits cho các dự án, mục tiêu lớn. Đối tượng áp dụng là lãnh đạo ở mức trưởng phòng, product manager,
  3. Áp dụng Agile toolkits ở mức C-level (CEO, CFO, CTO...). Điều quan trọng là thay đổi mindset, chuyển đổi nó từ tư duy truyền thống sang tư duy Agile.
Trong đó, việc budgeting, được quyết định chính bởi CEO, CFO là tối quan trọng. CEO và CFO là những người khó thay đổi nhất.
Một số nhận định chung về SAFe:
  1. Áp dụng ở mức tổ chức, chứ không phải chỉ cho một team nhỏ dưới 10 người,
  2. Thích hợp với tổ chức có nhiều phòng ban, tổ chức, dự án, chương trình chạy song song,
  3. Q: SAFe có thực sự là Agile không? A: SAFe là Agile ở mức team và cũng là Agile ở mức program, tổ chức dù điều này hơi khó nhìn,
  4. Q: SAFe liên quan gì tới Scrum? Scrum là một Agile toolkit. SAFe là một mô hình Scaled Agile. Do đó, việc so sánh SAFe và Scrum là khập khiễng. Trong mô hình SAFe, ở mức team, hoàn toàn có thể áp dụng Scrum như một toolkit hoặc nhiều toolkit khác,
  5. Q: Vì sao ít người (nổi tiếng) ủng hộ SAFe? A: Vì họ thường chỉ làm dự án ở quy mô nhỏ, trong khi SAFe áp dụng ở quy mô lớn (hơn),
  6. Q: SAFe có phải là chiến lược không? A: Đúng, nó là một chiến lược, cách tiếp cận đúng để thay đổi tư duy cổ điển của lãnh đạo sang Agile,
  7. Q: SAFe có định nghĩ rõ độ dài của sprint không? A: Không. Độ dài sprint hoàn toàn tùy thuộc vào tình hình thực tế. Với mức team < 10 người, độ dài sprint có thể là 4 tuần, 1 tuần hay thậm chí một vài ngày. Với C-level, "sprint" là 1, 3 hay 6 tháng và có sự điều chỉnh (retrospect:ve) khi cần thiết.
Một số Agile toolkit:
# (mà tôi) khuyến nghị sử dụng ở mức độ công ty, cho các vị trí khác nhau.
  1. Agile for project managers
  2. Agile portfolio management
  3. Scaled Agile Framework
  4. User Stories
  5. Agile Kanban
  6. Iteration Planning
  7. Definition of Done
  8. Agile Quality
  9. Agile Planning
  10. Agile for Executives
  11. Scrum
  12. Planning poker
  13. XP (eXtreme Programming) (use with care :D)
  14. Kanban
  15. TDD (Test-Driven Development)
  16. CI (Continuous Integration)
  17. CTDD (Continuous Test Driven Development)
Topics khác:
(liên quan tới việc triển khai SAFe, hay scaled Agile frameowork nào đó)
  1. Hiring (đúng người đúng việc)
  2. Performance evaluation (đánh giá, đây là việc cần làm trong tổ chức (lớn)
  3. Communications (thông luồng liên lạc, không quá quan liêu, không quá thưa)
  4. Reporting (Hơi đi ngược lại với nguyên tắc Agile. Báo cáo là cần, dù ngắn, không để "báo cáo" trở thành gánh nặng)
  5. Organization structure (Định nghĩa lại sơ đồ tổ chức khi áp dụng SAFe, cùng với RaR)
  6. Project structure (cơ cấu tổ chức ở mức dự án)
  7. Training (Đào tạo tư duy Agile, từ lãnh đạo tới nhân viên)
  8. Authority (Chơ chế quyền quyết định thay đổi khi áp dụng Agile)
  9. RaR (Roles and Responsibilities) definition
  10. Skillset (Năng lực cần và đủ của các vị trí thay đổi khi áp dụng Agile)
  11. Governace (Không có thì móm à)

Thursday, July 19, 2012

Căn bản C# SQL: Bài 1. Ứng dụng quản lí nhân viên rất hồn nhiên

Trong loạt bài này tôi sẽ giới thiệu với các bạn một loạt ứng dụng C# SQL từ rất ngây thơ đến khá trưởng thành.
bài 1 này sẽ là 1 ứng dụng hết sức ngây thơ để quản lý nhân viên với 2 thuộc tính : ID (khóa chính) & tên.
Cơ sở dữ liệu


Các bạn chú ý chỗ tôi khoanh đỏ, điều này sẽ giải thích cho việc tôi insert vào csdl có 2 trường nhưng chỉ truyền 1 tham số. chi tiết thì mời GOOGLE nhé!
Các bước thực hiện:
1. Mở visual studio và tạo 1 Project Winform Application sau đó thiết kế 1 form đơn giản như sau :


Chi tiết các trường :
Loại Tên Note
DataGridView dgv
DataBindingSource dbs
Label label1 Text = "Họ tên"
Text Box txtName
Button btnAdd Text="Thêm"
Button btnUpd Text="Cập nhật"
Button btnDel Text="Xóa"
right-click vào form chọn View Source và viết code sau
private void LoadData() {
    string strCon = @"Data Source=.\SQLEXPRESS;Initial Catalog=cong_ty_x;Integrated Security=True;";
    string strSQL = "select * from nhan_vien";

    SqlDataAdapter dataAdapter = new SqlDataAdapter(strSQL, strCon);
    SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);
    DataTable table = new DataTable();
    //table.Locale = System.Globalization.CultureInfo.InvariantCulture;
    dataAdapter.Fill(table);
    dbs.DataSource = table;
    dgv.DataSource = dbs;
}
click phải chọn "view designer"
double click vào btnAdd và viết code sau:
private void btnAdd_Click(object sender, EventArgs e) {
    string connString = @"Data Source=.\SQLEXPRESS;Initial Catalog=cong_ty_x;Integrated Security=True;";
    string name = txtName.Text;
    SqlConnection con = new SqlConnection(connString);
    try {
        con.Open();
        string sql = "insert into nhan_vien(name) values('" + name + "')";

        SqlCommand cmd = new SqlCommand(sql, con);
        cmd.ExecuteNonQuery();
        this.LoadData();
    } catch (Exception ex) {
        MessageBox.Show(ex.Message);
    } finally {
        con.Close();
    }
}
tương tự ta có code xử lý cho btnUpd và btnDel
private void btnUpd_Click(object sender, EventArgs e) {
    string connString = @"Data Source=.\SQLEXPRESS;Initial Catalog=cong_ty_x;Integrated Security=True;";
    
    string id = dgv.CurrentRow.Cells[0].Value.ToString();
    string name = txtName.Text;
    
    SqlConnection con = new SqlConnection(connString);
    try {
        con.Open();
        string sql = "update nhan_vien set name = '" + name + "' where id = " + id;
        SqlCommand cmd = new SqlCommand(sql, con);
        cmd.ExecuteNonQuery();
        this.LoadData();
    } catch (Exception ex) {
        MessageBox.Show(ex.Message);
    } finally {
        con.Close();
    }
}

private void btnDel_Click(object sender, EventArgs e) {
    string connString = @"Data Source=.\SQLEXPRESS;Initial Catalog=cong_ty_x;Integrated Security=True;";
    string id = dgv.CurrentRow.Cells[0].Value.ToString();
    SqlConnection con = new SqlConnection(connString);
    try {
        con.Open();
        string sql = "delete nhan_vien where id = " + id;
        SqlCommand cmd = new SqlCommand(sql, con);
        int count = cmd.ExecuteNonQuery();
        this.LoadData();
    } catch (Exception ex) {
        MessageBox.Show(ex.Message);
    } finally {
        con.Close();
    }
}
để khi user di chuyển con trỏ trên "danh sách nhân viên thì họ tên sẽ được load vào text box Name, ta xử lý sự kiện Cell Enter của đối tượng dgv như sau:
trở lại mode Designer, chọn dgv, nhấn F4 hiện bảng properties, chọn danh sách event, double click vào sự kiện CellEnter và viết code như bên dưới
private void dgv_CellEnter(object sender, DataGridViewCellEventArgs e) {
    txtName.Text = dgv.CurrentRow.Cells[1].Value.ToString();
}

Hai câu hỏi để bài 1 này ko quá nhàm chán:
1. Đối tượng data grid view có thể nhận trực tiếp dữ liệu từ Data Table, tại sao phải dùng Data Binding Source
2. Cách tôi xử lý behavior "khi user thay đổi con trỏ trên danh sách nhân viên, tên nhân viên sẽ dc load vào text box bên dưới" bằng  dgv_CellEnter sẽ quăng exception khi chọn dòng cuối và click delete. làm sao để sửa lỗi này?

Source code của bài 1 này (được viết bằng Visual Studio 2008 Express) có thể dc download ở trang google code của bài này. GOOGLE code là 1 ứng dụng rất hay để chia sẻ source cho lập trình viên, và ko ai share source trong download list cả, tuy nhiên để tiện cho các bạn sinh viên lần đầu làm quen, mình cho vào download list nhé!

Thảo luận về bài này trên cộng đồng c Việt

PHÂN BIỆT QUẢN TRỊ VÀ QUẢN LÝ

PHÂN BIỆT QUẢN TRỊ VÀ QUẢN LÝ Hội đồng quản trị, tiếng Anh là BOD (Board Of Directors). Còn Ban giám đốc hay Ban quản lý tiếng Anh là BOM (B...