defcrop(image_file):
image = Image.open(image_file)
p = image.convert("P")# image in 8 bit
w,h = p.size
letters =[]
left = right =0
top = bottom =0
x_found =Falsefor x inrange(w):
x_in_letter =False
y_found =False
y_in_letter =Falsefor y inrange(h):if p.getpixel((x,y))==0:# pixel value of black
x_in_letter =True
y_in_letter =Trueelse:
y_in_letter =Falseifnot y_found and y_in_letter:if y<top or top==0:
top = y
y_found =Trueif y_found andnot y_in_letter:if y>bottom and y-top>=38:
bottom = y
ifnot x_found and x_in_letter:if x<left or left==0:
left=x
x_found =Trueif x_found andnot x_in_letter:if(right==0or x>right)and x-left>25:
right = x
letters.append((left, top, right, bottom))# get 1 letter# clear
left = right =0
top = bottom =0
x_found =Falsereturn letters
Nếu SomeThing của bạn là class cần dependency là Mailer $mailer, trong khi bạn lại cần đặt giá trị cho các thuộc tính của $mailer thì bạn nên tự tạo ra và tự set giá trị thôi. Service Container không phải là viên đạn bạc để giúp bạn có thể giải quyết tất cả các vấn đề được.
Như ở comment trong bài này https://viblo.asia/p/laravel-beauty-tim-hieu-ve-service-container-3KbvZ1wLGmWB mình đã từng viết, bạn có thể đặt giá trị mặc định để Service Container có thể resolve ra instance được, nhưng với giá trị cho các property là không cố định thì mình phải tự làm thôi.
P/S: Khi viết code bạn nên đặt trong ` `, hoặc code block
```
```
thì sẽ không bị lỗi render như comment của bạn hiện tại.
Cho mình hỏi 1 chút về đoạn code cuối.
Bình thường thì mình sẽ viết như sau:
$mailer = new Mailer();
$mailer->setFrom('email@example.com');
//...set thêm 1 số cái nữa
$something = new SomeThing($mailer);
Nhưng mình đọc ở bài Service Container thì nếu là laravel thì khi resolve cái SomeThing kia nó sẽ tự tạo 1 cái instance của Mailer. Tuy nhiên mình muốn set trước 1 số thuộc tính của mailer như ở trên(không cố định, dữ liệu cần set có thể thay đổi tùy action) thì phải set ở đâu & set lúc nào?
@gaumin Đúng như bạn nói, MyISAM Storage Engine không hỗ trợ transaction, nên nếu hạn chế dùng được thì tốt, chỉ nên dùng InnoDB thôi
Mình không thấy có lý do gì để dùng DatabaseMigrations cả, bởi nó sẽ chạy migrate và rollback trước và sau mỗi test case và điều này là không cần thiết khi ta chỉ cần chạy một lần.
Do đó, về vấn đề migrate, bạn có thể chạy manual bằng cách gõ lệnh artisan thôi.
Còn muốn tự động chạy đúng 1 lần khi test (trước khi test bắt đầu) thì mình nghĩ có thể viết ở trong hàm setUp của class TestCase.
Có một vấn đề là hàm setUp được gọi trước và sau mỗi hàm test, nên cần có một chút trick để có thể chỉ gọi migration đúng một lần.
Bạn thử cách dưới đây xem sao:
# Dùng biến static để lưu trạng thái đã chạy migrate chưa
public static $isMigrated = false;
public function setUp()
{
parent::setUp();
if (self::$isMigrated === false) {
# Nếu chưa chạy migration thì chạy ở đây, sau đó đặt lại giá trị là đã migrate rồi
self::$isMigrated = true;
}
}
Còn về việc check xem test hiện tại đã phải là test cuối cùng chưa để mà rollback thì mình cũng chưa nghĩ ra cách (^^;)
Hàm trong hàm tearDown thì biến app được clear hoàn toàn, tức là mỗi lần test lại có một biến app mới được tạo ra, nên cũng không thể dựa vào đó mà dùng callback được :-s
Mà thật ra thì mình cũng thấy không cần thiết phải rollback lại sau mỗi lần chạy test làm gì, nếu khi nào cần thì chắc tự gõ manual thôi nhỉ (^^;)
P/S: Như mình đã nói ở trên thì bạn nên có một DB riêng biệt dành cho việc test.
@kanran111 Mình không nói là sử dụng lệnh join làm chậm mysql, mà nói sử dụng nhiều lệnh join phức tạp qua quá nhiều bảng với các cột chưa được đánh index có thể là nguyên nhân làm chậm
Cơ mà cũng xin góp ý với bạn ở đoạn "Vậy cực âm nối vào chỗ nào? Đây là một câu hỏi có phần hài hước mà những người mới bắt đầu có thể đặt ra.". Những người đọc bài này chưa chắc đã phải chuyên về điện tử nên thắc mắc như vậy có gì sai? có gì hài hước? Đọc đoạn này, đối với mình thì thực sự là cảm thấy rất khó chịu
Bài viết rất hay và chi tiết, tuy nhiên mình vẫn chưa nắm hết được, chắc là do chưa làm thực tế nhiều, bookmarks lại chắc chắn sau này cần đến, big thanks !
THẢO LUẬN
Gộp cái crop và adjust cũng được chứ nhỉ?
Nếu
SomeThing
của bạn là class cần dependency làMailer $mailer
, trong khi bạn lại cần đặt giá trị cho các thuộc tính của$mailer
thì bạn nên tự tạo ra và tự set giá trị thôi. Service Container không phải là viên đạn bạc để giúp bạn có thể giải quyết tất cả các vấn đề được. Như ở comment trong bài này https://viblo.asia/p/laravel-beauty-tim-hieu-ve-service-container-3KbvZ1wLGmWB mình đã từng viết, bạn có thể đặt giá trị mặc định để Service Container có thể resolve ra instance được, nhưng với giá trị cho các property là không cố định thì mình phải tự làm thôi.P/S: Khi viết code bạn nên đặt trong ` `, hoặc code block
```
```
thì sẽ không bị lỗi render như comment của bạn hiện tại.
Ví dụ:
$something = $newSomeThing($mailer);
Cho mình hỏi 1 chút về đoạn code cuối. Bình thường thì mình sẽ viết như sau:
Nhưng mình đọc ở bài Service Container thì nếu là laravel thì khi resolve cái SomeThing kia nó sẽ tự tạo 1 cái instance của Mailer. Tuy nhiên mình muốn set trước 1 số thuộc tính của mailer như ở trên(không cố định, dữ liệu cần set có thể thay đổi tùy action) thì phải set ở đâu & set lúc nào?
-5 cạn lời -_-
ǹ̶̼̬̳̹̬̰̭̳̓̿͑̿̏̿̏͌͜͝i̸̢̡̝̫̖̱͔͚͍͗̃̑̑̂̄ͅc̵̘̻͎̟͔̣͗̀̊̏̂͒̽̈͢͢e̦̪̟͚̘̠͚̟͒̓́̊͂̃̕̚͝ͅ p̡͕̻̝͔̐̑̐̿̉̚͞͝͠ò̖͍̙͇̞̤̾͒̃̑̀͋͟s̡̥̤̦̳̻̋͊̄̓̔t̷̡͖̼̺̬̜̳́̅̇́̓͒̄͜!̳͚̠̻͕̻͗̽̾͐̐̾̍̌͠
Nhất định mình sẽ phải thử laravel 5.5 vì nó vừa mới release được 2 ngày
Nhưng củ chuối 1 cái là dự án của mình chỉ yêu cầu chạy php
5.6.x
thôilên laravel 5.5 thì bắt buộc chơi với php 7.x
Laravel 5.5 Server Requirements
một lần nữa cảm ơn @thangtd90 đã gợi ý chi tiết
mình cũng nghĩ y như bạn , tại đang tìm hiểu test nền thích hỏi ra ngô ra khoai ý mà
Cảm ơn bạn đã góp ý. Phần tiếp theo mình đã viết được 1 nửa, cũng sắp xuất xưởng rồi. Bạn hãy đón đọc nhé.
@gaumin Đúng như bạn nói, MyISAM Storage Engine không hỗ trợ transaction, nên nếu hạn chế dùng được thì tốt, chỉ nên dùng InnoDB thôi Mình không thấy có lý do gì để dùng
DatabaseMigrations
cả, bởi nó sẽ chạy migrate và rollback trước và sau mỗi test case và điều này là không cần thiết khi ta chỉ cần chạy một lần. Do đó, về vấn đề migrate, bạn có thể chạy manual bằng cách gõ lệnh artisan thôi.Còn muốn tự động chạy đúng 1 lần khi test (trước khi test bắt đầu) thì mình nghĩ có thể viết ở trong hàm
setUp
của classTestCase
. Có một vấn đề là hàmsetUp
được gọi trước và sau mỗi hàm test, nên cần có một chút trick để có thể chỉ gọi migration đúng một lần. Bạn thử cách dưới đây xem sao:Còn về việc check xem test hiện tại đã phải là test cuối cùng chưa để mà rollback thì mình cũng chưa nghĩ ra cách (^^;) Hàm trong hàm
tearDown
thì biếnapp
được clear hoàn toàn, tức là mỗi lần test lại có một biếnapp
mới được tạo ra, nên cũng không thể dựa vào đó mà dùng callback được :-sMà thật ra thì mình cũng thấy không cần thiết phải rollback lại sau mỗi lần chạy test làm gì, nếu khi nào cần thì chắc tự gõ manual thôi nhỉ (^^;) P/S: Như mình đã nói ở trên thì bạn nên có một DB riêng biệt dành cho việc test.
Thanks for sharing my article.
Hoặc có cách nào để biết được quá trình test bắt đầu và quá trình test đã xong ko @thangtd90
Cảm ơn @thangtd90 đã trả lời câu hỏi của mình
Nhưng theo mình được biết thì
transaction
không chạy được với table có engine là MyISAM@kanran111 Mình không nói là sử dụng lệnh
join
làm chậm mysql, mà nói sử dụng nhiều lệnh join phức tạp qua quá nhiều bảng với các cột chưa được đánh index có thể là nguyên nhân làm chậmSử dụng nhiều lệnh join cũng làm chậm mysql sao bác , em thấy câu lệnh join nó cải thiện tốc độ truy vấn nhiều chứ .
Hóng code cho phần cứng.
Cơ mà cũng xin góp ý với bạn ở đoạn "Vậy cực âm nối vào chỗ nào? Đây là một câu hỏi có phần hài hước mà những người mới bắt đầu có thể đặt ra.". Những người đọc bài này chưa chắc đã phải chuyên về điện tử nên thắc mắc như vậy có gì sai? có gì hài hước? Đọc đoạn này, đối với mình thì thực sự là cảm thấy rất khó chịu
Thank @licon but i got same result too
Bài viết rất hay và chi tiết, tuy nhiên mình vẫn chưa nắm hết được, chắc là do chưa làm thực tế nhiều, bookmarks lại chắc chắn sau này cần đến, big thanks !
This bug is device specific. Maybe your solution is successful in some devices & also failed in other devices. Can you please see this url: https://stackoverflow.com/questions/21247670/android-mediaplayer-loop-has-gaps-even-with-ogg-format which has one answer.
I have tried but the bug still occur. Thank you