Hấp dẫn

Cách bắt đầu lập trình bằng PHP từ đầu (của riêng bạn). Tại sao nhiều người thất bại? Kinh nghiệm cá nhân ... thử và sai

Ngày tốt!

Chắc hẳn ai trong chúng ta cũng đã từng xem những bộ phim về hacker và những lập trình viên sành sỏi, đều muốn hiểu ít nhất một chút về vấn đề này. Và tôi sẽ lưu ý rằng không, không, và họ ném những câu hỏi tương tự cho tôi (Mặc dù tôi có thể lập trình, nhưng tôi không phải là một lập trình viên chuyên nghiệp. Và đối với những người ở xa lĩnh vực CNTT, điều này không thể giải thích được ...).

Nhìn chung, hiện nay trên Internet có khá nhiều khóa đào tạo, sách và bài báo khác nhau về chủ đề này. Tuy nhiên, khi bản thân tôi cố gắng (học ngôn ngữ từ họ) từ những dòng mã đầu tiên "xin chào thế giới!" trong PHP để chuyển sang một thứ gì đó nghiêm túc hơn và có thể áp dụng trong cuộc sống - không có gì hiệu quả! Như thể có một khoảng trống hoặc sự trống rỗng nào đó trong những cuốn sách này: không rõ ràng làm thế nào để đi từ những điều cơ bản và kiến ​​thức về một số chức năng đến một cái gì đó hơn ...

Theo thời gian, tôi đã tìm ra PHP đến mức viết CMS đơn giản của riêng mình (CMS là một công cụ trang web) và một bài báo đã giúp tôi trong việc này (tiếc là tài nguyên đó không còn tồn tại trên mạng nữa, tuy nhiên, tôi rất biết ơn tác giả đó vì đã có "cú hích" đúng hướng này).

Dựa trên bài viết đó và tầm nhìn của tôi, tôi sẽ phác thảo lưu ý này cho những ai thực sự muốn bắt đầu lập trình bằng PHP, nhưng họ đang thất bại. Nói chung, tôi có quan điểm cực đoan của riêng mình về quan điểm này, vì vậy ở đây bạn sẽ không tìm thấy lời khuyên trên sách và khóa học - chỉ là xem chính xác những gì cần làm dựa trên kinh nghiệm của bạn ...

*

Bắt đầu lập trình từ đâu (bằng PHP)

BƯỚC 1 - sở thích, mong muốn giải quyết một số vấn đề

Có lẽ điều quan trọng nhất là "bắt lửa" với một số nhiệm vụ (không có điều này thì rất khó để nghiên cứu một cái gì đó mới). Ví dụ: tại một thời điểm tôi thực sự cần (RẤT!) Để một tập lệnh PHP có thể đọc một tệp văn bản nhất định và cắt một số phần ra khỏi nó theo mẫu của tôi. Một mặt - mọi thứ dường như trở nên đơn giản, mặt khác - đối với một người chưa bao giờ tự mình viết 2 dòng mã, nhiệm vụ này vô cùng khó khăn!

Tôi đã phải mua kịch bản đầu tiên này ... Nhưng sau đó tôi cần một cái khác tương tự (và sau đó là cái khác). Và đây, đây, tôi đã mang theo PHP ... Nhân tiện, sau một vài buổi tối, tôi đã có thể tự viết những đoạn mã như vậy, đã phải chịu đựng trong một hoặc hai giờ ...

Mà nói chung là mình muốn lưu ý là nếu không có hứng thú với lập trình thì hãy nhanh chóng bắt tay vào học, theo quy luật, học nhanh là xong. Và tôi e rằng không có khóa học và giáo viên nào sửa được.

Cho đến khi bạn bắt đầu tự mình nhập mã và xem những gì được "hiển thị", những gì có trong các biến của bạn và dữ liệu thay đổi như thế nào khi sử dụng một số hàm, bạn không thể bắt đầu lập trình (đây hoàn toàn là ý kiến ​​của tôi!). Không có số lượng sách "thông minh" sẽ giúp bạn.

Thật tốt khi mơ!

Nhân tiện, nhiều người mới bắt đầu (bao gồm cả tôi một lần) mắc phải một sai lầm lớn: họ dành nhiều thời gian chuẩn bị, tải xuống các khóa học và video khác nhau. Sau đó, họ xem xét tất cả, nghiên cứu nó, viết nó vào sổ tay, v.v. Nhưng họ không làm điều quan trọng nhất - họ không tự bắt đầu nhập mã và xem nó được thực thi như thế nào ...

Được rồi, bây giờ gần thực hành hơn (hoàn thành triết học).

BƯỚC 2 - cài đặt các công cụ Denwer, Open Server, Notepad ++, Total Commander. Khởi đầu!

Bạn không cần phải mua dịch vụ lưu trữ để viết các tập lệnh và thử nghiệm đầu tiên của mình. Tốt hơn nhiều khi sử dụng một máy chủ web cục bộ miễn phí: Denwer hoặc Open Server (Cá nhân tôi khuyên bạn nên sử dụng Open Server và đây là nơi tôi sẽ chỉ cho bạn cách thức và những việc cần làm) ... Nhân tiện, nếu bạn chọnMở máy chủ - thì phiên bản tối thiểu nhất là đủ để bắt đầu (lưu ý: chỉ có một số trong số chúng trên trang web, với các thư viện khác nhau).

Để quay số trực tiếp bằng mã (văn bản), rất thuận tiện để sử dụng đặc biệt. notepad với đánh dấu cú pháp. Tôi rất ấn tượng về Notepad ++ về mặt này. Notepad đơn giản, nhẹ, miễn phí và tiện lợi (nhiều tính năng hơn đáng kể so với notepad tích hợp sẵn trên Windows).

Chào thế giới! (Notepad ++)

Tôi cũng khuyên bạn nên sử dụng một số loại chỉ huy. trong trình thám hiểm, rất bất tiện khi điều hướng qua các thư mục khác nhau và mở nhiều tệp cùng một lúc (bạn bị lạc và quên mất đâu là nơi). Tôi khuyên bạn nên chọn Total Commander (một chỉ huy rất tiện lợi và linh hoạt).

Kịch bản đầu tiên: chuẩn bị!

1) Sau khi tải xuống và cài đặt OpenServer, bạn sẽ có một thư mục cùng tên ở vị trí đã chọn trên đĩa - trong trường hợp của tôi là "e: \ openserver5.2 \" ... Thư mục này phải chứa thư mục "tên miền" - trong đó bạn cần tạo một thư mục có tên trang web của mình (ví dụ: "my-site.ru" - ví dụ bên dưới).

Hãy nhớ tên của thư mục này, chính thư mục này sẽ cần được nhập vào thanh địa chỉ của trình duyệt khi viết script.

OpenServer - ví dụ về cách tạo một "trang web" (cục bộ)

2) Tiếp theo, tạo một tệp "index.php" trong thư mục "my-site.ru" và nhập các dòng sau vào đó:

echo 'Xin chào Thế giới!' ;

Chào thế giới! "Chương trình" đầu tiên!

Lưu các tập tin.

Lưu ý: nếu ai đó làm việc với php lần đầu tiên, hãy chú ý đến lệnh 'echo' - nó có nghĩa là hiển thị mọi thứ sau nó trong dấu ngoặc kép.

3) Sau đó khởi động OpenServer (hoặc khởi động lại nếu bạn đã chạy). Đồng thời đóng và mở lại trình duyệt của bạn. Điều này là cần thiết để OpenServer có thể thay đổi một số tệp trong Windows của bạn: để trang web đã tạo của chúng tôi "my-site.ru" sẽ mở trong trình duyệt của bạn.

OpenServer - khởi động một máy chủ web cục bộ

Nói chung, nếu OpenServer đã được khởi chạy thành công, một hộp kiểm màu xanh lục sẽ sáng lên trong khay của bạn (nếu nó có màu đỏ hoặc vàng, hãy thử khởi động lại nó. Trong một số trường hợp, bạn cần chạy nó với tư cách quản trị viên. Trong mọi trường hợp, cờ đỏ sẽ không cho phép bạn tiếp tục làm việc ...) .

OpenServer - thiết lập và chạy

4) Trên thực tế, vẫn phải nhập " my-site.ru "(không có dấu ngoặc kép) và nó sẽ hiển thị lời chào từ tệp được tạo index.php (xem ảnh chụp màn hình bên dưới).

Làm!

5) Xin lưu ý rằng nếu trong ví dụ đầu tiên, chúng tôi ngay lập tức hiển thị một dòng văn bản, thì trong ví dụ tiếp theo, tôi đã thay đổi một chút mã. Theo quy luật, khi phát triển tập lệnh, bạn đang xử lý biến , có thể chứa nhiều dữ liệu khác nhau: chuỗi, số, v.v.

Hãy tạo một biến ("$ p") và đặt văn bản của chúng ta vào đó. Xem ví dụ bên dưới:

$ p = 'Xin chào Thế giới!';

echo $ p;

Biến đầu tiên

Như hình dưới đây, kết quả sẽ giống nhau! Những, cái đó. trình duyệt cũng sẽ xuất ra chuỗi của chúng tôi. Tuy nhiên, mã hơi khác: bây giờ văn bản được chứa trong biến "$ p", mà chúng tôi xuất ra ...

Hiển thị dữ liệu từ một biến

6) Một ví dụ minh họa khác bên dưới. Lần này, tôi tạo hai biến "$ p" và "$ p2", sau đó nối các dòng này và đặt chúng vào biến "$ p3". Lưu ý rằng các dòng được kết nối bằng cách sử dụng một dấu chấm đơn giản.

$ p = 'Xin chào Thế giới!';

$ p2 = 'Là tôi!';

$ p3 = $ p. $ p2;

echo $ p3;

Một ví dụ khác (hai biến)

Kết quả có thể đoán trước được ...

Làm...

Tôi thu hút sự chú ý của bạn đến thực tế là tất cả các ví dụ đều được khuyến nghị sử dụng thủ công để hiểu và thành thạo nhanh hơn.

BƯỚC 3 - chia nhỏ nhiệm vụ thành các thành phần của nó. Gỡ lỗi từng bước

Có lẽ đây là bước quan trọng nhất để bắt đầu lập trình, vì lợi ích của nó, tôi bắt đầu bài viết này ...

Bất kể nhiệm vụ của bạn khó khăn đến mức nào mà bạn muốn giải quyết, nó có thể được chia thành ba giai đoạn có điều kiện:

  1. lấy dữ liệu ban đầu (nhập dữ liệu);
  2. chuyển đổi dữ liệu;
  3. đầu ra dữ liệu: ra màn hình hoặc chỉ tới một biến. (xem ảnh chụp màn hình bên dưới: Tôi có điều kiện chia một trong các ví dụ của bài viết thành ba bước sau để có thể hiểu rõ nội dung của nó)

Tập lệnh có thể được chia thành những giai đoạn nào

Như một quy luật, các giai đoạn là khó khăn nhất. nhận và chuyển đổi dữ liệu ... Và nhiều người mới bắt đầu không biết làm thế nào bạn có thể viết mã 100 dòng mà không bị nhầm lẫn hoặc nhầm lẫn trong chúng.

Trên thực tế, sau mỗi dòng mã, bạn có thể xem những gì bạn có trong các biến. Và dần dần, thêm từng dòng mã một và xem các biến thay đổi như thế nào, đưa chúng về dạng mong muốn (và giải quyết vấn đề!). Đối với điều này, PHP có các hàm tuyệt vời "var_dump ($ p);" và "print_r ($ p);".

Và đối với người mới bắt đầu, tôi khuyên bạn nên sử dụng chúng mọi lúc! Đúng vậy, lập trình đôi khi là một công việc nhàm chán ...

Tôi sẽ xem xét một ví dụ dưới đây.

Hãy tưởng tượng, bạn không biết mình có gì trong biến "$ p3" (trong đoạn mã, ví dụ bên dưới, bạn thấy dòng được tải vào đó và về lý thuyết thì nó phải ở đó. Nhưng trong thực tế phức tạp hơn vấn đề - điều này không phải lúc nào cũng xảy ra, biến có thể chứa một mớ hỗn độn, thay vì dòng bắt buộc ...).

Vì vậy, để xem những gì có trong biến, bạn chỉ cần chèn lệnh "var_dump ($ p3);" vào sau nó (và lưu tệp).

Ví dụ về Var_dump

Kết quả là trong trình duyệt (khi làm mới trang), bạn sẽ thấy "string (31) ...." được hiển thị. Những, cái đó. var_dump bạn đã được cho biết kiểu dữ liệu (chuỗi là một chuỗi) và độ dài của chuỗi này (31 là một ký tự). Điều này rất hữu ích khi gỡ lỗi các chương trình dài (tập lệnh)!

chuỗi (31)

Ví dụ: trước "var_dump ($ p3);", tôi đã gán giá trị 1 cho biến $ p3. Kết quả là khác nhau (xem bên dưới).

Nếu bạn thêm một số vào biến

Int (1)

Ví dụ: đọc một tệp văn bản và cắt bớt câu đầu tiên

Mọi thứ mà tôi đã viết ở trên, sẽ rất tốt nếu bạn giải thích bằng một ví dụ. Ví dụ, tôi đã thực hiện một nhiệm vụ đơn giản: mở một tệp văn bản, tìm điểm đầu tiên trong đó (nghĩa là cuối câu) và cắt mọi thứ từ đầu tệp cho đến thời điểm này.

Một mặt, nó có vẻ khó đối với một người chưa bao giờ học PHP. Mặt khác, bằng cách chia nhỏ tác vụ thành các thành phần của nó và sử dụng gỡ lỗi (var_dump), bạn có thể viết những thứ phức tạp hơn nữa ...

Và vì vậy, thật hợp lý khi chia nhiệm vụ này thành nhiều giai đoạn:

  1. đọc một tệp văn bản thành một biến;
  2. tìm một điểm trong tệp văn bản (tức là tìm số thứ tự của nó, ví dụ: ký tự thứ 35);
  3. cắt một đoạn chuỗi: từ ký tự đầu tiên đến một điểm (tính đến số thứ tự của nó).
  4. hiển thị kết quả trên màn hình.

1) Đọc một tệp thành một chuỗi

Dưới dạng tệp văn bản - tôi đã lấy văn bản của bài viết này và đặt nó vào tệp "text.txt" mà tôi đã sao chép vào thư mục "e: \ openserver5.2 \ domains \ my-site.ru \" (Ý tôi là, hãy đặt nó bên cạnh "index.php").

Tiếp theo, bạn cần tìm một hàm để giải quyết thành phần đầu tiên: đọc tệp thành một biến. Đây là nơi "Google" giúp ích rất nhiều: một truy vấn như "Đọc tệp PHP" đối phó với nhiệm vụ của nó và giúp tìm ra một chức năng file_get_contents () - chúng tôi sử dụng nó!

Nhân tiện, về vấn đề này, tôi khuyên bạn nên sử dụng thư mục //php.net (một công cụ trợ giúp tuyệt vời!).

$ p = file_get_contents ('text.txt'); // đọc tệp thành một biến

var_dump ($ p);

Chúng tôi đọc tệp thành một biến

Kết quả là, nếu mọi thứ được nhập chính xác, chúng ta sẽ thấy nội dung của biến "$ p": nó sẽ chứa một văn bản dài (dòng). Nếu đây không phải là trường hợp, có một sai lầm ở đâu đó ...

chuỗi (1278)

Trên thực tế, đây là dữ liệu ban đầu của chúng tôi. Bây giờ chúng ta cần tìm dấu chấm đầu tiên (".") Trong bài viết.

2) Tìm ký hiệu điểm

Nói chung, PHP có rất nhiều hàm để làm việc với chuỗi. Để tìm điểm đầu tiên trong ví dụ này, tôi quyết định lấy " strpos (); ". Dưới đây, tôi không cung cấp toàn bộ nội dung của mã tập lệnh, tuy nhiên, hãy chú ý đến chính hàm và biến tôi đã thêm vào var_dump (biến trong đó số thứ tự của điểm sẽ xuất hiện, tức là "$ t", và biến "$ p" - chúng ta đã gỡ lỗi ở bước đầu tiên, nó chứa văn bản).

$ t = strpos ($ p, '.');

trong đó: $ p - biến mà chúng ta đang tìm ký hiệu mong muốn;

'.' - một trong những chúng tôi đang tìm kiếm.

Tìm kiếm điểm

223 là một biểu tượng, đây là một điểm. Chúng tôi đã tìm thấy cô ấy!

3) Đường cắt thành điểm

Để cắt xén chuỗi, PHP có một hàm giống như substr (). Nó rất đơn giản để sử dụng nó, tôi sẽ chỉ cho bạn một ví dụ:

$ s = substr ($ p, 0, $ t);

Ở đâu:

$ p - chuỗi mà chúng ta sẽ cắt;

0 - ký tự thứ tự của phần đầu (phần đầu của phần mong muốn);

$ t là ký tự kết thúc thứ tự (cuối đoạn mong muốn). Trong ví dụ của chúng tôi, đây là điểm chúng tôi tìm thấy.

Kết quả là, mã hoàn chỉnh sẽ giống như sau:

$ p = file_get_contents ('text.txt'); // đọc tệp thành một biến

$ t = strpos ($ p, '.'); // tìm điểm đầu tiên trong dòng $ p

$ s = substr ($ p, 0, $ t); // cắt chuỗi từ ký tự thứ 0 thành điểm

var_dump ($ s);

Cắt dòng

Lưu ý rằng chúng tôi cũng đã thay đổi biến trong "var_dump ($ s);" ... Như vậy, chúng ta thấy rằng chuỗi của chúng ta đã trở nên nhỏ, chỉ có 223 ký tự. Chúng tôi thực tế đã giải quyết được vấn đề, không còn nhiều ...

Cắt!

4) Vấn đề đã được giải quyết!

Nói chung, thay thế "var_dump" thành "echo" - chúng tôi lấy một ví dụ đã giải quyết. Bây giờ, khi bạn mở "my-site.ru" trong trình duyệt, câu đầu tiên từ tệp văn bản sẽ được hiển thị.

Kịch bản đã sẵn sàng!

Lưu ý rằng "echo" không in chi tiết kiểu dữ liệu. Bạn chỉ thấy một dòng ...

Đề xuất đã bị cắt

BƯỚC 4 - thử thách mới ...

Như bạn có thể tưởng tượng, nhiệm vụ trong ví dụ trên chỉ là một giọt nước trong đại dương! Tất nhiên, nó có thể được giải quyết trong một dòng và theo những cách thanh lịch hơn (mọi thứ được hiển thị ở trên chỉ là một ví dụ để cho thấy bản chất và cách bạn có thể di chuyển để tạo một kịch bản với hàng trăm dòng và giải quyết các vấn đề phức tạp hơn nhiều) .

Tất nhiên, bạn không chỉ có thể tìm kiếm một điểm mà còn tìm kiếm chuỗi các ký hiệu, hình ảnh, thẻ, v.v. Bạn không chỉ có thể đọc tệp (tức là lấy dữ liệu ban đầu từ nó) mà còn có thể đọc các trang của các trang web khác, đọc URL hiện tại của người dùng, lấy dữ liệu từ biểu mẫu mà người dùng điền vào, v.v.

Do đó, bằng cách chia một nhiệm vụ lớn thành một số nhiệm vụ trung bình và các nhiệm vụ trung bình thành nhiều nhiệm vụ nhỏ, và các nhiệm vụ nhỏ thành các dòng mã và các chức năng cụ thể (mỗi nhiệm vụ bạn sẽ thực hiện và gỡ lỗi theo cách thủ công), bạn có thể giải quyết rất những vấn đề lớn. Có, dù ban đầu có cong và xiên, nhưng cái chính là bạn sẽ tự làm được, và bạn sẽ có hứng thú khi đạt đến trình độ nhất định trong học tập.

Hơn nữa, với mỗi dòng mới - kinh nghiệm, tốc độ phát triển và kỹ năng của bạn sẽ được bơm thêm. Và nếu vậy, có lẽ tôi viết những dòng này là có lý do ...

Vì vậy, hãy đặt các nhiệm vụ mới và tiếp tục: tìm kiếm các hàm từng bước, thay đổi các biến, giải quyết các vấn đề nhỏ từng bước. Điều chính là không được treo vào sách và các khóa đào tạo - cho đến khi bạn bắt đầu tự làm, bạn sẽ không học được ...

Những gì họ không nói đến trong các quảng cáo sách và khóa học

Họ thường hứa sẽ dạy bạn lập trình trong một tuần hoặc một tháng (tối đa là 2), hứa trả lương cao và địa vị cao. Tuy nhiên, họ hoàn toàn quên thêm một vài điều quan trọng, mà tôi sẽ nói dưới đây ...

1) Mệt mỏi mắt nặng

Ngồi cả ngày và đọc mã, chỉnh sửa nó, v.v. - điều này khác xa với việc xem phim cả ngày, thư giãn trên ghế bành. Đừng tin tôi - hãy thử ít nhất nửa ngày để chỉnh sửa một cách chu đáo tài liệu Word hoặc Excel (gần như có thể so sánh được).

2) Nhu cầu không ngừng học hỏi

Ngày nay trong nhiều ngành nghề, bạn luôn phải học, nhưng lập trình viên - nhiều hơn gấp mười lần! Nhìn chung, nói chung, lĩnh vực CNTT tiến bộ hàng năm với những bước tiến nhảy vọt, chỉ cần theo kịp nó (hãy nhớ rằng, 10 năm trước, Internet chỉ bắt đầu xuất hiện ở các thành phố, và bây giờ ngay cả trong các ngôi làng họ cũng nói về bitcoin .. .) ...

3) Công việc ít vận động

Nếu ở nhiều lĩnh vực, bạn có thể dành một phần thời gian làm việc của mình ở một nơi nào đó để "dạo chơi", thì nơi làm việc của lập trình viên chỉ là PC, và không nơi nào khác ... Cách sống như vậy, tuy nhiên, theo thời gian bắt đầu ảnh hưởng đến sức khỏe: lưng, tay, vai, mắt ... - đến cuối ngày họ bắt đầu mệt mỏi.

4) Lương của các lập trình viên bình thường không phải lúc nào cũng cao

Cho đến khi bạn tích lũy được kinh nghiệm, rất có thể bạn sẽ không nhận được nhiều hơn so với các lĩnh vực hoạt động khác. Theo tôi, thời đại của mức lương quá cao trong lĩnh vực này đang trôi qua (đã qua?). Tuy nhiên, công việc của các chuyên gia giỏi trong lĩnh vực này được trả lương cao!

5) Thật nhàm chán khi giải quyết vấn đề của người khác ...

Nếu bạn quan tâm đến việc lập trình và "biến" ý tưởng của mình thành hiện thực, điều này hoàn toàn không có nghĩa là bạn sẽ thú vị khi giải quyết vấn đề của người khác - điều này hoàn toàn không giống nhau! Đôi khi, việc đào sâu vào mã trở nên nhàm chán và xám xịt ... đến nỗi thậm chí còn phát ra tiếng "hú" (Tôi nghĩ không phải ai cũng hiểu những dòng này).

PS: Bạn có nên bỏ công việc hiện tại và cố gắng trở thành một lập trình viên không?

Một câu hỏi rất phổ biến ... Đặc biệt là trong bối cảnh mức lương rất cao của một số hạng mục lập trình viên.

Từ bỏ mọi thứ cùng một lúc chắc chắn là không (ít nhất, theo quan điểm của tôi). Dù đó là gì, và bất cứ điều gì bạn quyết định, để tập thể dục hiệu quả, hãy nạp năng lượng cho não và học điều gì đó mới - một người có khả năng không quá 2-2,5 giờ mỗi ngày (điều này thực sự là như vậy, bạn có thể tự kiểm tra - ngay cả khi cuối tuần có thể làm thêm). Vì vậy, để bắt đầu học nghề mới của bạn - bạn hoàn toàn có thể dành ra một giờ vào buổi sáng hoặc buổi tối khi kết thúc ngày làm việc, ở đâu đó để "ăn cắp" một phần thời gian trong ngày.

Nếu bạn thành công, bạn sẽ tích lũy được một số kinh nghiệm, v.v.- bạn có thể thử đi nghỉ và kiếm một công việc thực tập (có thể là một nửa), xem bạn có thích mọi thứ hay không và làm việc ra sao ...

Cũng sẽ chẳng thừa chuyện “chăn gối” tài chính cho ngày mưa gió, nếu không thì chẳng biết tự bao giờ, một công việc mới đột ngột không như mong đợi. Ít nhất thì cách tiếp cận này sẽ không đẩy bạn vào một tình huống khó khăn trong cuộc sống nếu có điều gì đó không ổn xảy ra ...

*

Vâng, về điều này, tôi hoàn thành "hướng dẫn sử dụng" của tôi. Nếu bạn có bất kỳ bổ sung nào về chủ đề hoặc lời chỉ trích, chúng đều được hoan nghênh (bình luận đang mở).

Tất cả những gì tốt nhất!

$config[zx-auto] not found$config[zx-overlay] not found