فهم و شعور

در کاربرد این دو کلمه با هم دیگر عمق زیادی نهفته است. فهم و شعور. فهمیدن مرحله ایست که اگر آدمها دچار آن شوند بلافاصله در سدد بیان آن بر می آیند. و میخواهند فهمیدنشان را به رخ بکشند. علی الخصوص اینکه من فهمیده ام و تو هنوز نفهمیده ای که چه شده است. اما مرحله ی بعدی فهمیدن شعور است. آدمها باید این را بدانند که همه میفهمند. اما عده ای به مرحله ی بعدی آن فکر میکنند و عده ای دیگر نه. این است که میگویند فکر کنید و حرف بزنید. مثلا من فهمیده ام که فلان آدم فلان مشکل را دارد. عده ای که شعور ندارند هم این را میفهمند و آن را بیان میکنند و برای اینکه فهمیدنشان را به همه بفهمانند جوری رفتار میکنند که فهمیده اند و این را بقیه باید بفهمند. این است که شعورشان در پشت فهمشان گم میشود و بدون اینکه بدانند دارند بی شعوری خودشان را به نمایش میگذارند.

ما همه میفهمیم. فقط به مرحله بعدی آن بها دادن هنر است. و گرنه فهم را که همه دارند.

یک json parser ساده با c

چند روزی هست که دارم خودم رو با زبان c به چالش میکشم و سعی میکنم کارهایی که قبلا با c++ انجام دادم رو با c انجام بدم.

یکی از اون کارها نوشتن یک json parser هست که بتونه همه ی حالت های json رو پردازش کنه و بشه از اون dump گرفت. مدیریت کردن Ram در زبان c کمی حوصله میخواد و اگر جایی رو حواست نباشه ممکنه memory leak داشته باشیم. برای همین تمام برنامه ها رو با valgrind چک میکنم که جایی memory leak نداشتم باشم.

لینک پروژه :

https://github.com/pejman-hkh/c-json-parser

نمونه dump :

[boolean : true]
[color : #82b92c]
[null : null]
[number : 123]
[object : 
[a : b]
[c : d]
[e : f]]
[string : HelloWorld]
[array : 
[0 : 1]
[1 : 2]
[2 : 3]]
[boolean1 : true]
[color1 : #82b92c]
[null1 : null]
[number1 : 123]
[object1 : 
[a : b]
[c : d]
[e : f]]
[string1 : HelloWorld]
[array1 : 
[0 : 1]
[1 : 2]
[2 : 3]]

یک threadpool ساده با c

ایجاد کردن تعداد زیادی thread باعث اشغال شدن ظرفیت کل cpu میشود. برای همین باید ایجاد کردن thread به صورت سازمندهی شده انجام بشه و تنها از ظرفیتی که سیستم داره استفاده کرد. برای همین از استخر thread استفاده میکنیم که پیاده سازی اون هم مستلزم ایجاد Queue و Task هست. قبل از اینکه thread ها رو ایجاد کنم یک Queue و Task خیلی ساده نوشتم که میشه داخل Queue مون Task هامون رو اضافه کنیم و بعد هر جایی خواستیم اون رو فراخونی کنیم.

https://github.com/pejman-hkh/c-queue-task

حالا میشه تمام Task ها رو به Queue اضافه کنیم و داخل چند Thread مجزا از Queue مون یک Task رو برداریم و اون رو اجرا کنیم. برای اینکه بشه از Queue مون همزمان توی چند تا Thread مختلف Task ئی رو برداریم از Mutex استفاده کردم و همچنین اگر صفمون خالی بود با Condition صف رو نگه داشتم که به رم و سی پیو فشاری نیاد...

https://github.com/pejman-hkh/c-threadpool-worker-job

لینک پروژه ها :

https://github.com/pejman-hkh/c-queue-task

https://github.com/pejman-hkh/c-threadpool-worker-job

phpoop

https://github.com/pejman-hkh/phpOop

این ایده به ذهنم رسید که بهتره توابع php همشون توی یک کلاس باشن و بشه ازشون پشت سر هم استفاده کرد. در این روش شیوه کد نویسی هم راحتتر میشه. به جای نوشتن تابع های تو در تو میشه پشت سر هم عملیات رو روی متغییرمون که میتونه آرایه و یا هر چیزی باشه انجام داد.

پروژه رو با Zephir lang هم بازنویسی کردم. ( برای Performance بهتر و ... )

مشکل زیرنویس فارسی

خیلی ها موقع فیلم دیدن با زیرنویس های خرچنگ قورباغه مواجه میشن، مثل یکی از دوستان من که هر بار زنگ میزنه و میگه این مشکل رو دارم. من یک فایل کوچیک html درست کردم که این مشکل را باهاش حل کنم. آدرس در وبلاگ خودم :

http://www.peji.ir/subtitle.html

دانلود فایل :

https://github.com/pejman-hkh/persian-subtitle

متن زیرنویس رو داخل اون Paste کنید و یا اینکه فایل رو Browse کنید تا به شما خروجی درست زیرنویس را بدهد.

Chrome bug orientation

مرورگر کروم برای عکس ها از تگهای Exif Data تگ Orientatoin رو در نظر نمیگیره. البته این باگی هست که همه ی مرورگرها دارن. فایر فاکس خاصیت image-orientation رو به Css اضافه کرده :

img {
    image-orientation: from-image;
}

ولی هنوز Chrome این رو اضافه نکرده ... به جای چرخوندن عکس و گذاشتن کلی وقت میشه یک تگ رو تغییر داد و به جاش عکس رو چرخوند ولی این استاندارد خیلی جاها هنوز اعمال نشده.

جمع با jit قسمت دوم

لینک پروژه :

https://github.com/pejman-hkh/tiny-jit-compiler

قسمت قبل را خیلی وقت پیش نوشتم و وقت نشد که آنرا ادامه دهم. جمع با jit که تنها یک قسمت کوچک از کامپایل هست را اینبار با nodejs انجام دادم که خروجی assembly به ما میدهد. (کد را حذف کردم ) در جلسه قبل ما توابع کوچکی برای اسمبل کردن نوشتیم که به جای print از آن توابع استفاده میکنیم تا جمع و ضرب و تقسیم ما به صورت jit انجام شود.

باگ : اعداد منفی خیلی جاها اعمال نمیشود. ( برطرف شد )

نتیجه نهایی کار که با قسمت قبل کد ها تلفیق کردم و کمی هم ویرایش کردم تا ضرب و جمع و تقسیم و تفریق را با اولویت انجام بدهیم :

https://github.com/pejman-hkh/tiny-jit-compiler

تست هایی که انجام دادم

./a.out 4*-3-1*-20 => 8
./a.out -2*-3-1*-20 => 26
./a.out -2*5+1*-8 => -18

نمونه خروجی برنامه :

./a.out -2*5+1*-8
-2*5+1*-8
mov eax, 2
mov ecx, 0
sub eax, ecx
neg eax
push eax
mov eax, 5
pop ecx
imul eax, ecx
push eax
mov eax, 1
push eax
mov eax, 8
mov ecx, 0
sub eax, ecx
neg eax
pop ecx
imul eax, ecx
pop ecx
add eax, ecx
leave
ret
-18

اگر وقت داشته باشم و البته سر ذوق باشم و صد البته همچنان سر ذوق بمانم میخواهم BrainFuck را به صورت jit بنویسم.

منتظر قسمت سوم باشید ... ;)

اجرا کردن کد php با fpm

اگر جایی لازم دارید که کاربر منتظر پردازش شما نباشد و کدتان را به اصطلاح در background اجرا کنید میتوانید با shell خود php را صدا بزنید و آدرس فایلتان را به آن بدهید تا فایلتان را در background اجرا کند. اما صدا زدن هر بار آن بار زیادی برای Cpu شما خواهد داشت. بهتر است که فایل php تان با بدهید به php-fpm تا آن را برایتان اجرا کند. برای اینکار ابتدا yum --enablerepo=epel install fcgi را نصب کنید و سپس از کد زیر استفاده کنید.

<?php
function runPhp( $path, $qs, $daemon = true ) {
    $cmd = 'SCRIPT_NAME=/'.basename( $path ).' \
    SCRIPT_FILENAME='.$path.' \
    QUERY_STRING='.$qs.' \
    DOCUMENT_ROOT='.__dir__.' \
    REQUEST_METHOD=GET \
    cgi-fcgi -bind -connect 127.0.0.1:9000 '.($daemon?'> /dev/null 2>/dev/null &':'').'';

    $ret = shell_exec( $cmd );
    if( ! $daemon )
        return explode("\r\n\r\n", $ret, 2)[1];];
}

echo runPhp( __dir__.'/test1.php', http_build_query([ 'id' => 10 ]), false );

?>

برده داری نوین یا همان کارمندی

فیلم django unchained فیلم قشنگی بود. زمانی آدمها را ( نه هر آدمی، باید پوستش سیاه می بود ) مجبور به برده داری میکردند و اگر مهر بردگی روی پیشانیش میخورد تا آخر عمر باید برده میبود. الان آدمها را گرسنه نگه میدارند تا خودشان دنبال بردگی بروند. در سرزمین عزیزم ایران هیچگاه چیزی به اسم برده داری مرسوم نبوده اما باز هم فکر انگلیسی آمریکایی در ذهن عده ای رسوخ کرده و دارند به همان شیوه ۱۰۰ سال پیش آمریکایی ها برده داری میکنند. برده شان نباید از جایش تکان بخورد. باید کار کند و کار. دیگر مثل گذشته خبری از شلاق نیست و جایش را زبان و زخم زبان گرفته. زخم زبان به شیوه انگلیسی. آنقدر به کارمندشان استرس وارد میکنند که حال و هوای زندگی کردن از یادش میرود و مدام دارد به چیزهایی فکر میکند که اربابش به جان او انداخته است. برده یا همان کارمند باید بشیند سر جایش و فقط کار کند و کار.