۲۰ تیر، ۱۳۹۹
نویسنده @tilkacoder یک مقاله تازه به اسم زبان برنامه نویسی GO - بخش دوم نوشت.
در این بخش از مقاله قصد دارم که نحوه نصب و نوشتن اولین برنامه را توضیح بدم البته در این مسیر سعی میکنم نکته هایی که خودم بهش برخوردم هم توضیح بدم.
هر برنامه ای در GO
از یک package
ساخته شده است که علت اصلی آن مدیریت کارآمد وابستگی ها میباشد. این زبان از مدل سنتی کامپایل و لینک برای تولید فایل های باینری قابل اجرا پیروی میکند.
برای نصب این زبان در سیستم عامل لینوکس ابتدا از این بخش آخرین نسخه (هر نسخه دلخواه و بسته به معماری سخت افزار) را دانلود کنید و در مسیر /usr/local
آن را استخراج کنید، به صورت کلی دستور به شکل زیر خواهد بود:
tar -C /usr/local -xzf go$VERSION.$OS-$ARCH.tar.gz
برای فراخوانی مستقیم باید مسیر برنامه را به متغیر PATH
اضافه کنیم. که این کار را میتوانید با اضافه کردن خط زیر به /etc/profile
و یا $HOME/.profile
انجام دهید:
export PATH=$PATH:/usr/local/go/bin
در نظر داشته باشید برای اعمال تغییرات پروفایل نیاز به ورود مجدد به حساب خود دارید و یا میتوانید با زدن دستور زیر بلافاصله تغییرات را اعمال نمایید:
source $HOME/.profile
نصب GO در ویندوز
برای نصب شما ۲ راه به صورت کلی دارید (علاوه بر نصب از طریق source
) :
- MSI installer
فایل مربوطه را از این بخش دانلود کنید و آن را اجرا کنید (Run as administrator) سپس مراحل نصب را دنبال کنید. تمامی فرآیند ها به صورت خودکار انجام میشود (پیکربندی و تنظیم متغیر های محلی ) ممکن است برای اعمال برخی از تغییرات بر روی تمامی خط فرمان ها جاری نیاز داشته باشند تا مجدد راه اندازی شوند.
- Zip archive
فایل مربوطه را از این بخش دانلود کنید و سپس در مسر دلخواه خود استخراج کنید (پیشنهاد ما c:\Go).
مسیر bin
(باری مثال c:\Go\bin) را به متغیر PATH
سیستم خود اضافه نمایید .
برای اطلاعات بیشتر میتوانید از راهنمای رسمی GO استفاده کنید.
اولین برنامه در GOبرنامه های در این زبان میتوانند از ۳ خط تا میلیون ها خط باشند که در یک یا چندین فایل با پسوند go.
ذخیره شده اند ( به صورت کلی ).
یک فایل با نام hello.go
با محتوا زیر ایجاد کنید:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
حال برای اجرا برنامه کافیست با استفاده از خط فرمان در مسیر برنامه قرار بگیرید و دستور زیر را اجرا کنید :
go run test.go
در صورتی که خطایی وجود نداشته باشد خروجی زیر را مشاهده میکنید :
Hello World!
بررسی کد نوشته شده
هر برنامه نوشته شده در این زبان معمولا شامل بخش ها زیر میباشد:
- تعریف
Package
- وارد کردن
Packages
- توابع
- متغیرها
Statements and Expressions
- کامنت ها
در اولین خط از کد package main
تعریف شده است که نام package
است که در آن این برنامه قرار دارد. این بخش اجباری بوده زیرا همانطور که در ابتدا گفتیم تمامی برنامه ها در این زبان در package
قرار میگیرند. در صورتی که کد شما قابل اجرا باشد حتما نیاز به تعریف package main
دارید.
به عبارت بهتر در صورت وجود package main
کامپایلر آن را به عنوان برنامه اجرا در نظر میگیرد و در غیر این صورت به عنوان shared library
آن را در نظر میگیرد. هر بسته شامل یک مسیر و نام میباشد.
در خط بعدی ما بسته های دیگر را وارد بسته خود میکنیم که در اینجا بسته fmt
را وارد کرده ایم.fmt
یکی از کتابخانه های استاندارد GO
میباشد.
در خط بعد تابع اصلی برنامه main
تعریف شده است. نقطه اجرایی ما در بسته main
این تابع میباشد.
در خط بعدی ما تابع موجود در بسته fmt
را که برای نمایش متن می باشد نوشته ایم.
نکته : علت اینکه Println
با حرف بزرگ شروع شده است این می باشد که در این زبان تمامی نام هایی که با حروف بزرگ نوشته شده اند بعد از import
قابل دسترس می باشد. به عبارت بهتر تمامی توابع و متغیر/ ثابت هایی که با حروف بزرگ شروع میشوند بعد از import
قابل میباشند.
در این قسمت از مقاله اولین برنامه خود به زبان GO
را نوشتیم. در مقاله بعد موارد پایه ای این زبان را تشریح میکنیم.
۱۲ تیر، ۱۳۹۹
نویسنده @tilkacoder یک مقاله تازه به اسم زبان برنامه نویسی GO - بخش اول نوشت.
خیلی وقته که دوست دارم در رابطه با زبان برنامه نویسی GO
یاد بگیرم. از زمانی که شروع کردم علاقه دارم در این رابطه بنویسم برای همین در این مقاله و مقالات بعدی سعی میکنم شما رو بیشتر با این زبان آشنا کنم. سعی کردم تا جایی که میشه از لغت های انگلیسی در مقاله استفاده کنم تا هیچ دخل و تصرفی در انتقال مطلب صورت نگیره.
زبان برنامه نویسی GO
GO
یا Golang
یک زبان برنامه نویسی statically typed
و کامپایلری است که توسط Google
طراحی شده است. GO
از نظر syntax
بسیار شبیه به C
بوده اما با قابلیت های memory safety
، garbage collection
، structural typing
، CSP-style concurrency
و غیره می باشد .Go
یک زبان برنامه نویسی منبع باز است که ساخت نرم افزار ساده ، قابل اعتماد و کارآمد را آسان می کند.
این زبان از 2007 در گوگل توسعه یافته، در نوامبر 2009 معرفی شده و نسخه یک از این زبان در مارس 2012 ارائه شد. در حال حاضر به صورت گسترده ای از این زبان در سازمان ها و پروژه های متن باز استفاده میشود.
شاید برای شما این سوال مطرح شده باشد که چرا وقتی زبان های برنامه نویسی دیگری وجود دارند که می توانند اهداف ما را برآورده کنند باید وارد یک زبان جدید شویم. مسئله اصلی مزایا و معایب هر زبان می باشد. در این قسمت برخی از مزایا و معایب GO
را بررسی میکنیم.
مزایا GO
۱. یادگیری راحت
در مقایسه با زبان های دیگر syntax
این زبان ساده و مختصر است و شامل ویژگی های غیر ضروری نمی باشد. این باعث میشود تا نوشتن کدهایی خوانا و قابل نگهداری راحت تر باشد. شما میتوانید آن را به راحتی یاد بگیرید و حفظ کنید. در نتیجه زمان
شما در کد نویسی حفظ خواهد شد و نیاز به جستجو موارد این چنینی ندارید.برنامه نویسانی که به زبان GO
تسلط ندارند می توانند برنامه های نوشته شده به این زبان را بخوانند و به صورتی کلی آن را درک کنند.
۲. راحت بودن نوشتن برنامه های همروند concurrency
یکی از بزرگترین شاخص های این زبان همروندی میباشد. از نخستین نسخه این زبان همروندی پشتیبانی میشود. این امر باعث میشود تا بتوانیم برنامه هایی سریع با حداکثر استفاده از منابع تولید کنیم.با استفاده از goroutine
شما میتوانید از قابلیت چند هسته ای پردازنده نهایت استفاده را ببرید.
۳. سریع
GO
واقعا یک زبان سریع است. علت این امر تبدیل مستقیم به کد ماشین می باشد البته زمان کامپایل نیز به یک چشم بهم زدن میباشد.
۴. ابزارهای تحلیل استاتیک
GO
ابزارها مختلفی برای آنالیز و تحلیل کد در اختیار شما قرار میدهد برای مثال godoc
برای مستندات، glint
برای سبک کد نویسی و gofmt
برای قالب بندی کد میباشد. این ابزار ها به راحتی در محیط های توسعه متفاوت قابل استفاده میباشند و با استفاده از این ابزار ها شما میتوانید با خیال راحت بر روی عملکرد کد خود تمرکز کنید.
۵. کتابخانه های استاندارد
GO
شامل یک مجموعه کتابخانه استاندارد نسبتا قوی می باشد شامل : موارد مربوط به شبکه ، توسعه API
، رمزنگاری، فشرده سازی و غیره می باشد که شما را از دست کتابخانه های ثانویه پیچیده نجات میدهد. کتابخانه های استاندارد معمولا کیفیت بالایی دارند و از کدهای بهینه شده با استفاده از کارآمد ترین الگوریتم ها تولید شده اند.
معایب GO
۱. زبانی نسبتا جدید و در حال توسعه
این زبان در حاضر به عنوان یک زبان جدید و نوظهور شناخته میشود در نتیجه در رقابت با دیگر رقبا خود ممکن است معایبی داشته باشد که در آینده احتمالا رفع شود. البته باید این مورد را در نظر گرفت که با رقبای بزرگتر و قوی مانند JAVA
این مسئله وجود داشته و در رقابت با زبان های هم دوره خود امکان برتری بیشتری ممکن است داشته باشد.
۲. مدیریت خطا
نحوه مدیریت خطا در نسخه های جدید این زبان تا حد مطلوبی بهبود یافته ولی همواره توسط توسعه دهندگان مورد انتقاد قرار می گیرد. شما نیاز دارید تا هر کدام از خطاهای تولید شده در برنامه را بررسی کنید. در واقع در نقطه ای که انتظار دارید خطا رخ دهد باید آن را بررسی کنید و به عبارت بهتر Exceptions
در این زبان وجود ندارد.
بخش اول این مقاله به پایان رسید. در بخش های بعدی موارد مطرح شده را به صورت عمیق تر بررسی میکنیم و سعی میکنم در چند مقاله کوتاه با این زبان آشنا بشید.
۱۱ اردیبهشت، ۱۳۹۹
نویسنده @tilkacoder یک مقاله تازه به اسم لینت یا لینتر چیست نوشت.
لینت Lint
یا لینتر Linter
ابزاری است که به ما کمک میکنه تا سورس کد نوشته شده را آنالیز کنیم و خطا های برنامه نویسی ، هشدار های مربوط به سبک کد نویسی Stylistic errors
و در کل خطا های احتمالی را به صورت خودکار تشخیص دهیم.اصطلاح لینت هم از یک ابزار نوشته شده مبتنی بر Unix
برای زبان C
گرفته شده است.
ممکنه براتون سوال پیش بیاد که با وجود Integrated development environment
های امروزی چه نیازی به ابزار لینت است و چرا باید ازش استفاده کنیم. در ابتدا باید گفت بسیاری از IDE
ها شامل ابزار لینت هستن که در هسته اصلی خودشون برای راهنمایی بیشتر از آن استفاده میکنند ولی مسئله اصلی اینه که در پروژه های بزرگ امکان استفاده از IDE
بسیار کم بوده و با توجه به اینکه پروژه ها تیمی زیادی وجود داشته و در خیلی از موارد کنترل ابزار توسعه افراد سخت بوده و از ابزار های متفاوتی استفاده میکنند، اینجاست که ابزار لینت به کمک ما میاد تا خطا های احتمالی را کاهش، خوانایی و کیفیت کلی کد را افزایش دهیم.
یکی از معمول ترین بررسی هایی که توسط لینتر انجام میشود، خطاهای نحوی هستند. بعضی از زبان های برنامه نویسی از این قابلیت به صورت پیش فرض پشتیبانی میکنند. به صورت مثال کد زیر را در نظر بگیرید که با زبان PHP
نوشته شده است و در فایل mail.php
ذخیره شده :
<?php
Class Mail{
public static function send() {
try {
// ... Sending
}catch(\Exception $e) {
// ... Throws exception
}
}
}
برای بررسی خطاهای نحوی کد میتوانید از طریق خط فرمان دستور زیر را اجرا کنید:
php -l mail.php
در قطعه کد بالا کلمه try
به صورت صحیح نمی باشد. بدون اجرا کد، کد بررسی و در نتیجه پیغام زیر را مشاهده میکنیم:
PHP Parse error: syntax error, unexpected '{' in mail.php on line 4
Errors parsing mail.php
بعد از تصحیح کد و اجرای مجدد دستور خروجی زیر را مشاهده میکنید :
No syntax errors detected in mail.php
یکی دیگه از قابلیت هایی که توسط بعضی از لینترها میتونه صورت بگیره بررسی رعایت استاندارد کد هست. این مورد در کارهایی تیمی نقش بسزایی دارد تا کد با یک سبک استاندارد نوشته شود.
به صورت مثال کد زیر را درJavaScript
در نظر بگیرید ES6
:
let sum = (a, b)=>a + b
حال با استفاده از ابزار ESLint
کد بالا را آنالیز می کنیم که خروجی آن برابر است با :
Missing space before =>.
Missing space after =>.
'sum' is assigned a value but never used.
در پیکربندی لینتر استفاده از فاصله در قبل و بعد از =>
ذکر شده است اما در کد بالا این مورد رعایت نشده و باعث نمایش پیغام های متناسب شده است.
در پیکربندی اکثر ابزار های لینتر شما می توانید تابع های طولانی ( از نظر خط)، هشدار های امنیتی، تعاریف تکراری و بسیاری از هشدار و خطا های احتمالی را شناسایی کنید.
همانطور که گفتم برای زبان های مختلف ابزار های مختلفی وجود دارد اما ممکن است این ابزارها به تنهایی پاسخگو نیاز شما نباشند و نیاز به ترکیب یا نوشتن ابزار خاص خود را داشته باشید.
خوب برای اینکه بیشتر ویژگی های لینتر آشنا بشیم با استفاده از PHAN
که یک static analyzer
برای زبان PHP
هست کدها را آنالیز میکنیم. قبل از شروع باید به این نکته توجه کرد که لینتر ها نوعی static analyzer
هستند.
برای نصب PHAN
با composer
از دستور زیر استفاده می کنیم:
composer require phan/phan
بعد از نصب نیاز داریم تا فایل پیکربندی مورد نیاز را بسازیم (به طور معمول اکثر ابزاری های لینتر از یک فایل پیکربندی پیروی می کنند) .
در نظر داشته باشید برای استفاده از PHAN
نسخه PHP
شما باید PHP 7.1
یا بالاتر باشد و php-ast extension
نصب شده باشد. البته شما میتوانید بدون نصب php-ast
نیز برنامه را با استفاده از گزینه --allow-polyfill-parser
اجرا نمایید.
یکی از موارد مهمی که باید در ساخت فایل کانفیگ به آن دقت کنید نسخه PHP
سورس کد نوشته شده میباشد. این مورد به ما کمک می کند تا در صورتی که از قابلیت های حذف شده و یا از قابلیت هایی که در این نسخه پشتیبانی نمیشود استفاده کرده باشیم از آن مطلع شویم.
در فایل کانفیگ باید مسیر کد های نرم افزار قرار داده شود که ما مسیر src
را وارد میکنیم. پوشه vendor
نیاز به بررسی ندارد برای همین در لیست exclude
قرار میگیرد. ما فایل کانفیگ خود را در مسیر config/phan.php
ذخیره میکنیم.
برای اطلاعات بیشتر میتوانید از این صفحه استفاده کنید.
در نظر داشته باشید ابزار اجرایی در مسیر /vendor/phan/phan
قرار دارد و شما میتوانید آن را به PATH
سیستم عامل خود اضافه کنید تا بدون نوشتن مسیر از آن استفاده نمایید.
خوب کد زیر را در نظر بگیرید که در src/index.php
ذخیر شده است:
<?php
function demo($param, $arg) : ?int {
// Phan can infer types, detect missing elements,
// and detect incorrect calls.
global $argc;
var_export(new my_class());
$cond = $param > 5;
if (!($arg instanceof SplObjectStorage)) { return $argc; }
$arg->attach($cond);
$arg->atach(new stdClass());
$arg->attach(
new MyClass($argc),
[],
'extra'
);
// Phan can detect redundant/impossible conditions
// and unused variables.
$always_true = is_bool($cond);
echo "Missing variable is $argv\n";
return $arg;
}
class MyClass {
public function __construct(string $x = null) {
// and detect undeclared properties, etc.
$this->x = $x;
}
}
demo(2, new SplObjectStorage());
حال برای آنالیز کد خود از دستور phan --allow-polyfill-parser -k config/phan.php
استفاده میکنیم که خروجی زیر در خط فرمان ظاهر میشود:
src/index.php:6 PhanUndeclaredClassMethod Call to method __construct from undeclared class \my_class (Did you mean class \MyClass)
src/index.php:10 PhanTypeMismatchArgumentInternalProbablyReal Argument 1 ($obj) is $cond of type bool but \SplObjectStorage::attach() takes object
src/index.php:11 PhanUndeclaredMethod Call to undeclared method \SplObjectStorage::atach (Did you mean expr->attach())
src/index.php:12 PhanParamTooManyInternal Call with 3 arg(s) to \SplObjectStorage::attach(object $obj, $inf = unknown) which only takes 2 arg(s)
src/index.php:13 PhanTypeMismatchArgument Argument 1 ($x) is $argc of type int but \MyClass::__construct() takes ?string defined at src/index.php:25
src/index.php:20 PhanUndeclaredVariable Variable $argv is undeclared (Did you mean $arg or $argc or (global $argv))
src/index.php:21 PhanTypeMismatchReturnReal Returning type \SplObjectStorage but demo() is declared to return ?int
src/index.php:27 PhanUndeclaredProperty Reference to undeclared property \MyClass->x
در خط اول آنالیز کد مشخص میشود که کلاس صدا زده شده در خط 6 برنامه وجود ندارد و کلاس MyClass
را به عنوان مورد صحیح پیشنهاد کرده است. همچنین به ترتیب در خطوط بعدی ناسازگاری های نوع ورودی، استفاده از توابع تعریف نشده، ارسال آرگومان اشتباه، تشخیص شرط ثابت ( غیر ممکن)، متغیر استفاده نشده، استفاده از متغیر تعریف نشده، ناسازگاری خروجی تابع ها، استفاده از مشخصه های تعریف نشده را به ما نشان میدهد.
امیدوارم در این مقاله تونسته باشم به خوبی شما را با ابزار لینتر آشنا کنم.
۲۲ شهریور، ۱۳۹۸
@tilkacoder به گفتگوی بهترین شیوه پرداخت داخل ایران جواب داد.
به نظر من استفاده از ارز دیجیتال رایج نیست. اگر قراره از درگاهی برای عموم برنامه نویس های فارسی از مبتدی تا پیشرفته استفاده بشه باید سادگی و راحتی پرداخت را در نظر گرفت.ارز های دیجیتال برای افراد مبتدی یکمقدار سخت هست.
به نظرم باز کردن یه حساب در ایران و استفاده از درگاه پرداخت ریالی خیلی معقول تر هست.
@amir برای حل مشکل دریافت در انگلیس میتونی از ارز های دیجیتال استفاده کنی به عبارت ساده تر یه آدم مطمئن داخل ایران پیدا کنی و درگاه و حساب به اسم اون باشه و بعد طرف برات ارز دیجیتال بخره و بفرسته. اینکار هم برای کاربرا راحت تره هم اینکه شما راحتی.
و در آخر قبل از انجام اینکار باید چند مسئله رو بهش دقت کنی :
- اگر مبلغ فعلی اشتراک رو بخوای تبدیل کنی داخل ایران این مبلغ ماهیانه با توجه به ارزش ریال، بالا هست.
- با توجه به تجربیات دوستان در زمینه فروش اشتراک باید بهت بگم توی ایران معمولا یک ماه اشتراک میخرن و کل اموزش رو دانلود میکنن و تمدید انجام نمیدن ( به جاش از راه حل فروش پکیج به جای اشتراک استفاده کردن )
- از نظر گستردگی آموزش ها بخش ویژه متناسب تنها برای توسعه دهندگان
front end
مناسب هست و به نظرم میتونه گسترده تر بشه.
@tilkacoder به گفتگوی عدم رفرش صفحه بعداز دریافت اطلاعات جواب داد.
سوالتون خیلی مبتدیانه هست و کسی براتون کد نمینویسه.
جهت جلوگیری از اسپم قفل میشه.
۱۹ شهریور، ۱۳۹۸
@tilkacoder به گفتگوی عدم رفرش صفحه بعداز دریافت اطلاعات جواب داد.
علتش اینه شما input
از نوع submit
دارید
به شکل زیر تغییر بدید :
<input type="button" id="btnsubmit" value="send" name="send">
درضمن شرط php
که گذاشتید هم اشتباه هست چونکه اولین بار صفحه لود میشه msg
خالی هست و در نتیجه المنت msg
ایجاد نمیشه و بعد از ارسال درخواست توسط jquery
شما چنین المنتی ندارید که پیغام رو داخلش قرار بدید
۱۱ شهریور، ۱۳۹۸
@tilkacoder به گفتگوی implode کردن جواب داد.
@behzad برای اینکه به حالت اولیه برگردونی یعنی آرایه میتونی از explode
استفاده کنی
برای اینکه -
تبدیل بشن به فاصله از تابع str_replace
میتونی استفاده کنی.
۴ شهریور، ۱۳۹۸
@tilkacoder به گفتگوی implode کردن جواب داد.
باید از implode
استفاده کنید نه explode
$all = [$one, $tow, $three];
$data = implode('-', $all);
۲۷ اردیبهشت، ۱۳۹۸
@tilkacoder به گفتگوی نمایش قالب کاری قبل از بارگذاری اطلاعات جواب داد.
@mahdi_mahdi ببینید دوست عزیز هیچ روش یا متدی نیست.
یک کد HTML
هست با یک css
خاص که قبل از بارگذاری پست نمایش داده میشه.
زمانی که شما از jscroll
استفاده میکنید اگر به قسمت مستندات این پروژه رجوع کنید زمان ساخت jscroll
خصیصه ای وجود داره به نام loadingHtml
که یک کد HTML
( یک قالب) رو میتونید بهش بدید که قبل از بارگذاری محتوا اون رو نمایش بده.
برای مثال وبسایت ویرگول امده کد های زیر رو برای این مسئله قرار داده :
<div class="jscroll-added"><div class="jscroll-loading" id="jscroll-loading">
<div class="listItemPlaceholder">
<div class="listItemPlaceholder-header">
<div class="avatarPlaceholder"></div>
<div class="floatRightPlaceholder">
<div class="linePlaceholder"></div>
<div class="linePlaceholder"></div>
</div>
</div>
<div class="listItemPlaceholder-body">
<div class="linePlaceholder"></div>
<div class="linePlaceholder"></div>
<div class="linePlaceholder"></div>
</div>
</div>
<a style="display: block;text-align: center;" href="https://heapanalytics.com/?utm_source=badge" rel="nofollow"><img style="width:108px;height:41px" src="//heapanalytics.com/img/badgeLight.png" alt="Heap | Mobile and Web Analytics"></a>
</div>
</div>
که اگر این محتوا رو به خصیصه loadingHtml
بدید، زمانی که شما به انتهای صفحه مراجه میکنید این کد رو نمایش میده ( البته باید همرا با css
هایی که ویرگول برای این بلاک ساخته استفاده بشه)
پیشنهاد میکنم قسمت مستندات jscroll
رو بخونید.
اگر که پاسخ بنده جواب سوالتون نبود بفرمایید تا دوستان راهنماییتون کنند.
@tilkacoder به گفتگوی تغییر url بدون لود شدن صفحه وب جواب داد.
این کار امکان پذیر نیست ( زیرا پا گذاشتن حریم شخصی امکان پذیر نیست)
برای جلوگیری از اسپم تاپیک قفل میشه.
۲۶ اردیبهشت، ۱۳۹۸
@tilkacoder به گفتگوی نمایش قالب کاری قبل از بارگذاری اطلاعات جواب داد.
@mahdi_mahdi بنده خیال کردم متد مد نظر شماست ، بله پلاگین های زیادی وجود داره
اکثر سایت ها از قبیل ویرگول از jscroll-loading
استفاده میکنند
لینک بعضی از این پلاگین ها :
@tilkacoder به گفتگوی نمایش قالب کاری قبل از بارگذاری اطلاعات جواب داد.
این مسئله بستگی به طراحی تون داره ، ساده ترین روش، روش زیر هست :
برای اینکار میتونید ابتدا یه قالب کامل ساده با جایگذاری المنت ها بعد از درخواست کاربر نمایش بدید، بعد از لود صفحه با استفاده از js
بیاید محتوای هر بخش رو از سرور بگیرید و قرار بدید.
برای مثال شما با استفاده از php
در درخواست اول کاربر تنها میاید یه تعداد تصویر با یک مبدا (source) به کاربر تحویل میدید loading
که این مسئله سرعت اولیه رو بالا میبره همچنین پردازش در یک درخواست کاهش پیدا میکنه
بعد از اتمام درخواست اول و بارگذاری کامل صفحه یک درخواست دیگه به سرور ارسال میکنید که لیست مبدا اصلی تصاویر رو دریافت کنید، بعدش هم در جای مناسب قرار میدید یا در همون درخواست اول لیست مبدا هارو دریافت میکنید و بعد از بارگذاری کامل صفحه شروع به جایگذاری میکنید.
یکی از مسائل مهم افزایش سرعت کوچیک کردن درخواست هاست.
به نظرم بد نیست به این لینک ها یه نگاهی بندازی :
۸ اردیبهشت، ۱۳۹۸
@tilkacoder به گفتگوی تغییر url بدون لود شدن صفحه وب جواب داد.
اینجور که من متوجه شدم شما میخواید آدرس site.com
رو به site2.com
تغییر بدید ولی بدون لود شدن صفحه مورد نظر ولی با محتوا شما !!!
خوب دوست عزیز بهتره تو این قسمت فکر کنیم که اگر چنین چیزی امکان پذیر باشه دیگه حملات فیشینگ مثل آب خوردن میشه و سنگ روی سنگ بند نمیشه.
این کاری که شما میخواید بکنید امکان پذیر نیست و به عبارتی زیر پا گذاشتم حفظ حریم شخصی هست.
@tilkacoder به گفتگوی آپدیت آنلاین پروژه های لاراول جواب داد.
@shahryarjb اگر از آخرین ورژن ioncube
استفاده کنید میبینید که نه تنها حجم افزایش پیدا نمیکنه بلکه کاهش پیدا میکنه.
پروژه های نسبتا بزرگ رو باهاش کد کردیم مشکلی نداشت و قابلیت های بسیار خوبی هم علاوه بر کد کردن بهتون میده.
در رابطه با تجاری بودن و قیمت ارز کاملا درست میگی برای ما گرون هست اگر الان بخوای اخرین نسخه رو بگیری چیزی حدود ۸ تا ۱۶ میلیون باید هزینه کنی.
ولی اگر سورس کد مهمی دارید و پروژه بزرگه ارزش داره.
آخرین نسخه در حال حاضر قابل برگردوندن نیست ولی با استفاده از c++
شما میتونی یک کد میانی (در قالب extension
) بنویسی که هر سورس کد شده ای رو بدست بیاری ولی به این راحتی نیست و در واقع میشه گفت کسی که این همه دانش داشته باشه به دنبال کد های ما نیست.
۷ اردیبهشت، ۱۳۹۸
@tilkacoder به گفتگوی آپدیت آنلاین پروژه های لاراول جواب داد.
برای بروز رسانی آنلاین معمولا از روشی که امیر گفت استفاده میشه .
برای حفاظت از کد هم راه های زیادی وجود داره که بسته به محیط و اپلیکیشن انتخاب میشه.
ساده ترین راه برای شما این هست که مشتری از یک سیستم بروز رسانی جدا استفاده کنه و روی اون سیستم کد های خودتون رو به صورت encode
قرار بدید
برای encode
و decode
کردن کدهاتون سیستم های مختلفی وجود داره که معروف ترین اون ioncube
هست.
۲۴ اسفند، ۱۳۹۷
نویسنده @tilkacoder یک مقاله تازه به اسم اصول Solid در php نوشت.
در این مقاله قصد دارم شما را با اصول Solid
آشنا کنم که هر برنامه نویسی برای ساخت برنامه ای بهتر باید آن را بداند و انجام دهد.
Solid
در واقع یک سریع دستورالعمل هست که اگر شما از آن استفاده کنید ( به صورت اصولی و صحیح) کدهای نوشته شده ساده، توسعه پذیر، منطقی و واضح هستند به عبارتی بهتر باعث میشود از طراحی بد اجتناب کنید.
در بعضی توضیحات از کلمه ماژول و در بعضی از موارد کلاس استفاده شده، ما اکثرا از کلمه کلاس در طول مقاله استفاده میکنیم.
Solid
شامل موارد زیر میباشد :
- Single Responsibility Principle (SRP) : یکی از مهم ترین قواعد
Solid
که بیان میکند تنها یک مسئولیت (وظیفه) واحد توسط هر کلاس ارائه میشود. - Open-Close Principle : این اصل بیان میکند که کلاس باید گسترش پذیر باشد اما برای اصلاح بسته باشد.
- Liskov Substitution : کلاس های مشتق شده میتوانند در مکان هایی که کلاس پایه استفاده شده است جایگزین شوند.
- Interface Segregation : ما باید
interface
های خود را بهinterface
های کوچک تری تبدیل کنیم تا در هر بخش تنها همان نیاز کاربر را بر طرف کنیم. - Dependency Inversion : این اصل به عبارتی ساده بیان میکند که کلاس های سطح بالا نباید به کلاس سطح پایین وابستگی داشته باشن بلکه هردوی آنها باید به
abstractions
وابسته باشند.
برای بهتر درک کردن این موضوع هر بخش را با جزیئات بیشتر به همراه مثال تشریح میکنیم. مثال ها از موارد مختلفی زده شده است تا بتوانید مفاهیم را راحتر درک کرده و همچنین در کد های خود اعمال کنید.
Single Responsibility
در یک کلاس شما تنها یک هدف دارید و تمامی متدها برای یک وظیفه واحد اجرا میشوند. اگر کلاسی دارید که چندین هدف یا وظیفه دارد باید به چند کلاس تبدیل شود.
برای نمونه ما کد زیر را داریم :
class Setting{
public function setSettings()
{
// set settings
}
public function getSettings()
{
// get settings
}
public function showSettings()
{
// show output
}
}
توجه کنید که هر تابع قراره تنها یک کار انجام بده و قراره هر کلاس یا شی یک هدف واحد داشته باشه، کدها رو به شکل زیر تغییر میدیم:
class Setting{
public function setSettings()
{
// set settings
}
public function getSettings()
{
// get settings
}
}
class Output
{
public function show($data)
{
// show output
}
}
خوب تغییرات بالا باعث شد تا هر کلاس یک هدف خاص رو دنبال کنه و همچنین در آینده اگر نیاز به تغییر یا توسعه باشه با تغییرات اعمال شده اینکار برای ما راحت تر هست.
Open-Close
برنامه باید به صورتی نوشته شود که توسعه پذیر باشید اما قابل تغییر نباشد به این صورت که بدون هیچگونه تغییر در ساختار کلاس اصلی بتوانیم کلاس را توسعه دهیم.
برای مثال ما کد زیر برای ورود اطلاعات به ۲ نوع پایگاه داده رو داریم :
class DB
{
public function insert($connection, $into, $cell, $data)
{
if (is_a($connection, 'mysqli')) {
// connect and insert into mysql and return id
} elseif (is_a($connection, 'mongodb')) {
// connect and insert into mongodb and return id
}
throw new DatabaseInvalidConnection;
}
}
خوب این کد توسعه پذیر نیست و برای هر پایگاه داده ما باید بدنه کلاس رو تغییر بدیم، با توجه به اصل بیان شده کد به شکل زیر تغییر میکنه :
interface Database{
public function insert($into, $cell, $data);
public function connect();
}
class Mysql implements Database
{
public function connect()
{
// connect to mysql database
}
public function insert($into, $cell, $data)
{
// insert into mysql and return id
}
}
class NoSql implements Database
{
public function connect()
{
// connect to mongodb database
}
public function insert($into, $cell, $data)
{
// insert into mongodb and return id
}
}
class DB
{
public function insert($connection, $into, $cell, $data)
{
$connection->connect();
$connection->insert($into, $cell, $data);
}
}
حالا برای هر پایگاه داده تنهای نیازه کلاس بر اساس اینترفیس دیتابیس پیاده سازی بشه بدون هیچ تغییری کد با پایگاه داده جدید کار خواهد کرد.
Liskov Substitution
با توجه به این اصل ما باید در کلاس فرزند قادر باشیم هرگونه رفتاری که کلاس والد دارد را پیاده سازی کنیم. به عبارت دیگر ما باید قادر باشیم تا در هر نقطه کلاس فرزند را جایگزین کلاس والد کنیم.
برای مثال ما کد زیر را داریم :
interface OutputInterface{
public function show($data);
}
class Output implements OutputInterface{
public function show($data)
{
// show data
}
}
class Formatter extends Output
{
public function jsonFormat($data)
{
// return json data
}
public function show($data)
{
$data = $this->jsonFormat($data);
// show Data
}
}
در این کد اصول Solid
رعایت نشده است یا به عبارت بهتر Liskov substitution
به درستی اعمال نشده است. کلاس Formatter
فرزند کلاس Output
میباشد و باید تمامی فعالیت های کلاس والد را بتواند انجام دهد. اگر قسمتی از کد که از کلاس Output
استفاده شده است را تغییر دهیم به صورتی که از کلاس Formatter
استفاده کند خروجی مد نظر ما داده نمیشود زیرا در این کلاس متد show
را ما مجددا بازنویسی کردیم و خروجی به صورت json
نمایش داده میشود.
Interface Segregation
ما باید Interface
را به گونه طراحی کنیم که به صورت تقسیم شده باشد نه به صورت جامع و کلی ،به دلیل اینکه دیگران در صورت استفاده از اینترفیس تنها متدهای مد نظر خودشان را پیاده سازی کنند تا از نوشته شدن کدهای بیهوده جلوگیری شود.
کد زیر را در نظر بگیرید:
interface ImagesInterface
{
public function setWatermark($src);
public function saveFile($file, $path);
}
class Image implements ImagesInterface
{
public function setWatermark($src)
{
// set watermark
}
public function saveFile($file, $path)
{
// save file
}
}
اگر بخواهیم اصل گفته شده را در این کد پیاده کنیم خروجی کد زیر میباشد:
interface ImagesInterface
{
public function setWatermark($src);
}
interface FileInterface
{
public function saveFile($file, $path);
}
class Image implements ImagesInterface,FileInterface
{
public function setWatermark($src)
{
// set watermark
}
public function saveFile($file, $path)
{
// save file
}
}
Dependency Inversion
یکی اصل مهم از Solid
میباشد که بیان میکند که یک ماژول سطح بالا نباید به یک ماژول سطح پایین وابسته باشد بلکه هر دوی آنها باید به abstractions
وابسته باشند.
abstractions
نباید به جزئیات وابسته باشد بلکه جزیئات باید به abstractions
وابسته باشد.
درک این مفهوم ممکنه برای شما از درک مفاهیم بیان شده سخت تر باشه، با یک مثال این اصل رو واضح تر میکنیم. فرض کنید شما قطعه کد زیر را برای ایندکس کردن داده ها در وب دارید :
class Crawler
{
public function crawlPage()
{
// crawl Page with DOMDocument
}
}
class Engines
{
public function indexing(Crawler $crawler)
{
$crawler->crawlPage();
}
}
اگر در قطع کد بالا ما در بدنه کلاس Crawler
تغییر ایجاد کنیم ، کلاس Engines
هم تحت تاثیر قرار میگرد. برای حل این مسئله کد را به شکل زیر تغییر میدهیم:
interface CrawlerInterface
{
public function crawlPage();
}
class Crawler implements CrawlerInterface
{
public function crawlPage()
{
// crawl Page with DOMDocument
}
}
class Engines
{
public function indexing(CrawlerInterface $crawler)
{
$crawler->crawlPage();
}
}
نتیجه گیری :
امیدوارم در این مقاله تونسته باشم به خوبی شما را با این اصول آشنا کنم. رعایت اصول Solid
شاید در ابتدا کمی دشوار باشد اما با رعایت تمامی موارد گفته شده در کنار هم مزایای زیادی برای شما به وجود می آورد مانند: توسعه پذیری کدها، انعطاف پذیری بیشتر، یکپارچگی، پایداری و … .
۱۸ اسفند، ۱۳۹۷
@tilkacoder به گفتگوی پیدا کردن حفره امنیتی جواب داد.
این در واقع لیست مواردی هست که باید برای شروع یادبگیری :
- جمع آوری اطلاعات
- بررسی تنطیمات، شناسه و تست اعتبار سنجی
Authentication
- یادگیری باگ های مختلف مانند :تزریق
Injection
,XXE
,XSS
و ... - بررسی ساختار داده ها، نحوه انتقال و پردازش داده
- استفاده از اکسپلویت ها و ابزارهای مختلف
این موارد رو یادگرفتن زمان بر هست ولی باید حتما با این مفاهیم آشنا باشید.
سعی میکنم یک مقاله در این رابطه بنویسم که بتونید راه درستی انتخاب کنید ، به علت گستردگی و پیچیده بودن بعضی از موارد توضیح و پیشنهاد در یک پاسخ کار درستی به نظرم نمیرسه.
@tilkacoder به گفتگوی پیدا کردن حفره امنیتی جواب داد.
زمینه بسیار گسترده ای هست و محدود نیست مثل برنامه نویسی
با توجه به اینکه میخواید در زمینه امنیت وبسایت ها فعالیت کنید مسیر زیر میتونه براتون مناسب باشه :
-
درک مفاهیم پایه ای شبکه : فرض کنید میخواهید امنیت یک وبسایت را بررسی کنید، باید بدونید روی چه سروری قرار داره، سرور از چه پروتکل هایی استفاده میکنه و ... .زمانی که بدونید از
ssh
در یک پورت خاص استفاده میشود میتوانید تست های مربوطه را انجام دهید (البته این یک مثال ساده و کوچیک هست) -
به یکی از زبان های اسکریپت نویسی مسلط باشید که
python
پیشنهاد میشه : اول از همه به شما کمک میکنه تا منطق برنامه نویسی هم داشته باشید و همچنین فرآیندها را خودکار کنید. علت پیشنهادpython
این هست که اسکریپت های زیادی در این زمینه با استفاده از این زبان نوشته شده و یادگیری و برنامه نوشتن نسبتا ساده است. -
در رابطه با
Open Web Application Security Project (OWASP)
تحقیق کنید و ۱۰ مورد برتر سال را یادبگیرید. -
فراگیری مهندسی معکوس و ابزار های مرتبط و متد های مطرح در این زمینه
این موارد بخشی کلی از مواردی بود که باید بدانید و این مسئله فراتر از این موارد هست.
۱۳ اسفند، ۱۳۹۷
@tilkacoder به گفتگوی آپلود عکس در CKEditor جواب داد.
بله
از این پکیج هم میتونید استفاده کنید.
همچنین با استفاده از locale
هم میتونید اینکار رو بکنید.
۱۱ اسفند، ۱۳۹۷
@tilkacoder به گفتگوی آپلود عکس در CKEditor جواب داد.
بر اساس این مستندات گفته شده :
تنظیمات config.uploadUrl
شامل اسکریپتی است که قراره آپلود را مدیریت کنه
باید تنظیمات را بررسی کنید.
پیشنهاد من این هست در لاراول از پکیج laravel-filemanager استفاده کنید .
۲۵ بهمن، ۱۳۹۷
@tilkacoder به گفتگوی اجرای دستورات ترمینال لینوکس در لاراول جواب داد.
آیا ssh2_connect
رو نصب کردی ؟
به این لینک هم سر بزن
۲۲ بهمن، ۱۳۹۷
@tilkacoder به گفتگوی اجرای دستورات ترمینال لینوکس در لاراول جواب داد.
برای اجرا دستورات میتونی از توابع خود php
استفاده کنی.
برای نمونه میتونی از توابع زیر استفاده کنی:
اجرا دستور shell_exec
و گرفتن خروجی
در وژن های قدیمی لاراول 4.2 تا 5.4 پکیج هایی وجود داشتن ولی به نظرم بهتره از توابع پیش فرض استفاده کنی و شخصی سازی کنی
بعضی از پکیج برای نمونه:
۳۰ دی، ۱۳۹۷
نویسنده @tilkacoder یک مقاله تازه به اسم آنچه که یک برنامه نویس وب در ۲۰۱۸ باید بداند - بخش دوم نوشت.
در این بخش قصد داریم مواردی که نیاز هست شما به عنوان یک برنامه نویس Backend
به طور معمول بدانید را بررسی کنیم البته لازم به ذکر هست که بدانید اینها تنها موارد کلیدی هستند.
زبان های مختلفی برای برنامه نویسی تحت سرور وجود داره ولی در این قسمت ما اشاره به زبان خاصی نمیکنیم و تنها به کلیاتی که در هر بخش نیاز هست اکتفا میکنیم.
در بخش اول این مقاله به بررسی موارد کلی پرداختیم.
۱.ساختار زبان برنامه نویسی
در ابتدا شما ساختار زبان برنامه نویسی که به اون مسلط هستید را باید درک کنید. در واقع ویژگی ها، معایب، نحوه پردازش درخواست ها و موارد پایه ای زبان مورد نظر را باید بدانید. زمانی که از شما به عنوان یک برنامه نویس تحت سرور یک راه حل میخواهند و یا یک تسک به شما محول می گردد این ویژگی به شما کمک میکند تا با توجه به دید کلی و درک از زبان شروع به برنامه نویسی و ارائه راه حل کنید.ولی تنها این مورد کافی نمیباشد.
۲. مسلط به یک چهارچوب نرم افزاری Framework
با توجه به زبانی که مسلط هستید برترین فریم ورک را انتخاب کنید و شروع به یادگیری کنید. مسلط بودن به یک فریم ورک خوب در قدم اول باعث میشود که بتوانید به راحتی شغل مورد نظر خود را پیدا کنید و در قدم دوم شما برنامه های خود را به طور معمول ( نه همیشه) به صورت تمیز و منطقی تر بنویسید. همچنین تسهیلات مانند سرعت انجام کار، برنامه نویسی کمتر ( نه همه موارد)، نظم بیشتر و …. در اختیار ما قرار میدهد. حتما در نظر داشتید باشید که ابتدا باید ساختار زبان برنامه نویسی را بلد باشید و سپس به سراغ یادگیری یک چهارچوب برید.
۳. امنیت
به عنوان یه برنامه نویس باید مباحث پایه ای امنیت را بدانید . با انواع حملات آشنایی داشته باشید و راه حل های مناسب هر کدام را فراگیرید. زمانی که شما از یک فریم ورک پرقدرت استفاده میکنید به طور پیشفرض تعدادی قابلیت امنیتی در اختیار شما میگذارد ولی یادتان نرود که منطق برنامه را شما برنامه نویسی میکنید در نتیجه احتمال رخنه وجود دارد. در صورتی که شما با مفاهیم امنیت آشنایی داشته باشید این مشکل کمتر برای شما به وجود می آید. زمانی که شما برای یک کمپانی کار میکنید، اگر در برنامه شما رخنه ای صورت گیرد (هک) در واقع یک کمپانی زیر سوال میرود پس این مورد از اهمیت ویژه ای برخوردار است.
۴. تجربه برتر Best practice
Best practice
کمک میکند تا شما برنامه نویسی بهتری باشید. مزایایی که Best practice
برای شما دارند :
- به طور معمول کد ها منطقی تر و تمیز تر میباشند
- کد های نوشته شده توسط شما به راحتی توسط دیگر برنامه نویسان قابل درک است
- باعث میشود برنامه های نوشته توسط شما سرعت و عملکرد بهتری داشته باشند (نه به طور معمول)
- و ...
۵.Optimization
بهینه سازی
باید بتونید کد های نوشته شده توسط دیگران و خودتون را بهینه سازی کنید تا هزینه ها را کاهش و کارایی را افزایش بدید. زمانی که شما در حال برنامه نویسی هستید نمیتوان گفت تست های نوشته شده توسط شما تمامی سیستم را پوشش میدهد و کافی میباشد. بعد از مدتی بازخورد های برنامه شما گزارش میشود که در این بخش شما باید بتوانید باگ ها را رفع کنید و برنامه خود را به شکل مد نظرتون نزدیک کنید. بهینه سازی با توجه به برنامه شما میتواند شامل مراحل مختلفی باشد اعم از :
- افزایش بارگذاری سرعت صفحات
- مدیریت درخواست ها به صورت سیستم ها و برنامه های تکثیر شده
- بهینه کردن فرآیند های بزرگ سیستم
- و … .
مواردی مانند متدولوژی توسعه نرم افزار، نحوه بارگذاری داده ها روی حافظه ( در سیستم های بزرگ و داده های زیاد بسیار مهم میباشد)، مدیریت پیش نیاز های برنامه ، نرم افزار مدیریت بسته و ... میباشد ولی در این بخش سعی کردیم تنها موارد کلیدی را بیان کنیم.
۹ آذر، ۱۳۹۷
نویسنده @tilkacoder یک مقاله تازه به اسم آنچه که یک برنامه نویس وب در ۲۰۱۸ باید بداند - بخش اول نوشت.
زمانی که در رشته کامپیوتر در حال تحصیل هستید ( یا علاقمند به برنامه نویسی و کامپیوتر) شاید براتون سوال پیش بیاد که برای ورود به بازار کار چه چیز هایی نیاز هست که بلد باشیم. بر اساس هر زمینه ای که میخواهید فعالیت کنید باید تحقیقاتی صورت بگیره ، در چند مقاله تمامی سعی بر این شده است تا چیز هایی که یک برنامه نویس وب در سال ۲۰۱۸ باید بداند را تشریح کنیم.
در بخش اول بیشتر مواردی که نیاز اکثر برنامه نویسان وب بدانند را تشریح میکنیم سپس در مقالات بعدی وارد جزئیات میشویم.
گیت - ورژن کنترل
یک از مهم ترین مسائل آشنایی با یکی از ورژن کنترل ها است. در حال حاضر یکی از محبوب ترین و پر کاربرد ترین ورژن کنترل ها git
هست. آموزش های زیادی برای یادگیری این ورژن کنترل هست که میتونید از این لینک یکی از بهترین هارو مشاهده کنید.
SQL - NOSQL
باید مفاهیم پایه ای SQL
و NOSQL
رو بدانید. در اینجا منظور ما یادگیری یک سامانه پایگاه داده مثل mysql
یا MongoDB
نیست بله مفاهیم و ساختار پایگاه داده SQL
و NOSQL
است.
در رابطه با NOSQL
مقداری مفاهیم پایه ای گسترده تر بوده ولی با توجه به اهمیت و رشد بالا سامانه های پایگاه داده NOSQL
و همچنین کاربرد بالا توصیه میشه.
منظور ما مفاهیمی مانند:
۱. SQL
:
- معماری پایگاه داده
- مفاهیم بنیادی
- جامعیت
- تراکنش
- و … .
۲. NOSQL
:
- انواع ساختار ها
- نحوه پردازش دستور
- Schemaless
- و … .
پس از یادگیری مفاهیم پیشنهاد میشود یکی از سامانه های پایگاه داده sql
و nosql
را یاد بگیرید مانند :
کش
فرقی نمیکنه برنامه نویسی frontend
باشید یا backend
باید به به مفاهیم Caching
مسلط باشید.
یک برنامه نویس باید به یکی از ابزار ها Web cache
مسلط باشد ، Varnish
و nginx
یک گزینه خوب برای یادگیری میباشد.
در وبسایت های امروزی این مسئله بسیار مهم بوده و زمانی که شما به عنوان برنامه نویس شروع به کد نویسی میکنید باید بدونید هرچه درخواست های کمتر و بارگذاری از سرور اصلی شما کمتر باشه ( به صورت اصولی) هزینه کمتری دارید البته باید در نظر داشته باشید که برنامه شما چه کاری انجام خواهد داد.
برای برنامه های بی درنگ یا RealTime
ساختار فرق داشته و منظور ما نیست.
تست و دیباگ
برنامه هاتون رو به شکلی بنویسید که اگر به دیگران نشون دادید آنها هم بتوانند کد شما رو به بخونن مزیت اینکار این هست که اگر بعد از مدت ها کدتون به مشکلی خورد یا نیاز به اپدیت داشتید به راحتی بتونید کد خودتون رو بخونید.
تا جایی که امکان داره سعی کنید برای برنامه هاتون در صورتی که امکانش وجود داره تست های مناسب و خودکار بنویسید(TDD
و BDD
).
قبل از اینکه یک بخش مهم از برنامتون رو بنویسید ابتدا به شکل شبه کد در قالب کامنت بنویسید سپس بین شبه کد ها شروع کنید کد های اصلی را نوشتن.
در یک مفهوم خلاصه باید نحوه تست نویسی و همچنین نوشتن داکیومنت های مناسب دیباگ و توسعه را بلد باشید.
پیشنهاد میکنم این پادکست رو گوش بدید در این زمینه میتونه کمکتون کنه .
در مقاله بعدی به تشریح مواردی که یک برنامه نویس Backend
باید بداند میپردازیم.
۱۱ آبان، ۱۳۹۷
@tilkacoder به گفتگوی سوال در مورد چند متدد جواب داد.
بله چرا نشه
با استفاده از دستور زیر یک مدل میسازید به اسم Post
:
php artisan make:model Post
سپس در مسیر پروژه داخل دایرکتوری app
فایل Post.php
را باز کنید و یک متد در کلاس به شکل زیر اضافه کنید:
public static function foo()
{
//...
}
@tilkacoder به گفتگوی سوال در مورد چند متدد جواب داد.
در خط اول :
User::has('posts')->get();
تمامی کاربرانی که حداقل یک پست دارند بازیابی میشوند.
در خط بعدی eager loading
صورت میگیره که در واقع یعنی با توجه به ارتباط کاربران با پست ها تمامی کاربران به همراه پست هاشون رو بازیابی میکنه ( به صورت عادی این اتفاق نمیوفته و در Eloquent
با استفاده از eager loading
اینکار رو انجام میدیم )
زمانی که ما نیاز داریم در در متد has
( تمامی کاربرانی که حداقل یک پست دارند) شرط هایی اعمال کنیم از whereHas
استفاده میکنیم که در اینجا تمامی پست هایی که تاریخ ساخت آنها بزرگتر از مقدار q
هست ( البته این مقدار به نظرم اشتباه است و باید درست مقدار دهی بشه) نمایش داده میشه.
تابع toarray
هم مجموعه ای از داده ها که به آنها collection
میگیم رو به صورت آرایه php
در میاره (به طور مثال مقدار های بازیابی شده با استفاده از Eloquent
رو در صورتی که به صورت collection
باشه با استفاده از toArray
به آرایه تبدیل میکنیم)
در رابطه با متدto
فکر میکنم یک متد تعریف شده توسط کاربر باشه.
۹ آبان، ۱۳۹۷
@tilkacoder به گفتگوی تفاوت zend server با apache server جواب داد.
دقیقا با حرفت موافق هستم zend
پیشرفت فوقالعاده ای داره و در آینده برای برنامه نویسا میتونه یک گزینه جدید تر و بهتر باشه برای مدیریت نه برای سرور(ولی مدیران به طور معمول سعی میکنن از ابزار های قدیمی که قبلا تجربه خودشون رو پس دادن رو استفاده کنن تا یک ابزار جدید با قابلیت بیشتر).
apache
به صورت کلی برای سیستم های بزرگ طراحی نشده (نمیگم نمیشه استفاده کرد ولی گزینه های خیلی بهتری هست که خدمات بهتری ارائه میکنند همچنین اگر به پروژه های بزرگ نگاه کنیم متوجه این حرف میشیم)
اگر یه نگاه کلی به این مسئله کنیم میتونی تصمیم بهتری بگیری :
- جامعه ای که از
apache
استفاده میکنن بسیار زیادتر از zend
هست البته منظور من از نظر ابزار مدیریتی هست( در نتیجه منابع بیشتر + متخصص بیشتر ) - همانطور که خودت گفتی
zend
ابزار ها و قابلیت ها خیلی زیاد و کاربردی داره همچنین گواهی هایzend
در هر زمینه ای که خدمات ارائه میکنه معتبر هست و توسط شرکت های بزرگ پذیرفته میشه ( البته منظور خارج از ایران هست)
@tilkacoder به گفتگوی ارتباط با دیتابیس sqlite روی یک سرور دیگر جواب داد.
تمامی جواب های شما توی پاسخ اولیه ام وجود داره ولی اینکه کدوم یکی مناسب شما هست در ادامه بهش اشاره میکنم.
البته راه های زیاد دیگه ای هم وجود داره.
ببینید اینکه از چه روشی استفاده کنید تمام مربوط به محیط عملیاتی شما هست.
روش api
شاید برای شما مناسب نباشه (وجود ۲ وب سرور سبب اشغال شدن منابع میشه که با توجه به محیط عملیاتی شما بهتره اینکار انجام نشه)
این اطلاعات توسط چه برنامه و یا افرادی مورد استفاده قرار میگیره.
استفاده از هر یک راه حل ها مزایا و معایبی داره.
انتخاب راه حل نامناسب ممکنه ناسازگاری داده و یا هدر رفت منابع رو به دنبال داشته باشه.
برای پیشنهاد راه مناسب نیاز به شناخت بیشتر محیط عملیاتی و جنس داده هست.
یکی از مزایا شناخت بیشتر محیط عملیاتی این هست که شما میدونید که دارید چیکار میکنید.
تا جایی که خاطرم هست شما با تنظیمات خود gateway
هم میتونید اینکار رو کنید.( به صورت مستقیم وارد پایگاه داده بشه و بعد از ورود اطلاعات برای خوندنش میتونید پایگاه داده رو در اختیار سیستم های دیگه قرار بدید )
۸ آبان، ۱۳۹۷
@tilkacoder به گفتگوی ارتباط با دیتابیس sqlite روی یک سرور دیگر جواب داد.
sqlite
از این عملیات پشتیبانی نمیکنه همچنین سطح دسترسی لازم برای اینکار به صورت ریموت به این شکل وجود نداره.
راه های زیادی برای اینکه اینکار رو انجام بدی وجود داره :
- در صورت وجود شبکه فایل بین سیستم ها اشتراک گذاشته بشه.
- ساخت یک
api
برای انجام عملیات های دیتابیس روی سروری که فایل قرار داره. - زمانی که نیاز به کار با دیتابیس هست فایل دریافت بشه و پس از اتمام کار مجددا روی سرور بارگذاری کنید.
- و ...
به صورت مستقیم امکانش وجود نداره باید از یکی راه حل های جایگزین استفاده کنید
۷ آبان، ۱۳۹۷
@tilkacoder به گفتگوی مشکلات هنگام قرار دادن سایت روی هاست جواب داد.
خدمت شما دوست عزیز :
با انجام دادن کارهایی که در بالا توضیح دادم میتونید این خطا را برطرف کنید.
فکر میکنم شما از postman
به نحو صحیح استفاده نمیکنید برای همین هست در دیباگ به مشکل میخورید
همانطور که در بالا توضیح دادم شما متد را در Route
نوشته شده به صورت POST
قرار دادید و امکان مشاهده در مرورگر به صورت GET
نمیباشد ( برای این درخواست)
@tilkacoder به گفتگوی هایلات کردن کلمات سرچ شده جواب داد.
برای پیاده سازی سیستم سرچ نیازمند ابزار های زیادی هستید که دوست خوبم امیر تعدادی از آنها را نام برد.
در رابطه با سوالی که پرسیدی باید بگم راهکار های زیاد و پبچیده ای برای اینکار وجود داره (پلاگین ها، کدهای نمونه و ...)
یکی از ساده ترین روش ها این هست که کلمه مورد نظر را در اطلاعات بدست آمده ( با استفاده از ajax) جستجو کنید و بین ۲ تگ با یک کلاس خاص قرارش بدید
@tilkacoder به گفتگوی مشکلات هنگام قرار دادن سایت روی هاست جواب داد.
اگر خطایی براتون پیش نمیاد پس علت پرسش چیه ؟
علت این FatalErrorException
هم همانطور که نوشته شده این هست که نباید هیچگونه فاصله ای بین شروع تگ php
و namespace
باشه.
در واقع کدتون از شکل زیر :
<?php
namespace App\Http\Middleware
باید به شکل زیر تغییر پیدا کنه :
<?php
namespace App\Http\Middleware
@tilkacoder به گفتگوی مشکلات هنگام قرار دادن سایت روی هاست جواب داد.
لطفا بخش شرایط و مقررات و همچنین بخش پرسش و پاسخ رو بخونید.
اگر هم مشکلتون در رابطه با موضوعی با پاسخی حل میشه حتما به عنوان جواب سوال انتخابش کنید تا در آینده دوستان بتونن استفاده کنن.
در رابطه با MethodNotAllowedHttpException
باید بگم به احتمال زیاد شما صفحه را در مرورگر چک میکنید و یا با متد GET
داده ها را ارسال میکنید.( من با پست ارسال کردم و مشکلی نبود)
درضمن این قسمت از کد باید اصلاح بشه :
if(! auth()->attempt($valiDate)){
return response([
'data'=>'صحیح نیست',
'status'=>'error'
],403);
}
باید علامت بخش if (!auth()→attempt($valiDate)) {
به if (!auth()->attempt($valiDate)) {
تبدیل بشه.
در واقع مشکل شما استفاده از نماد → به جای <- هست ( برای متوجه شدن مشکل از مارک دان استفاده نکردم)
اطلاعات نمونه (ایمیل و پسورد جهت تست) قرار بدید هم بهتره.
@tilkacoder به گفتگوی نحوه اتصال به دیتابیس سایت جواب داد.
بله حتما
همچنین باید encode
صفحه و اطلاعات ارسال روی utf8
باشه.
این مشکل حقیقتا خیلی ساده است فقط کافیه کمی سرچ کنی (به زبان فارسی کلی مقاله هست میتونه کمکت کنه) . درضمن مواردی که به ذهنت میرسه حتما تست کن شاید مشکلت حل بشه( هیچ اتفاقی نمیوفته)
۶ آبان، ۱۳۹۷
@tilkacoder به گفتگوی اختیاری کردن لینک جواب داد.
باید مسیر به شکل زیر نوشته بشه (شما درست نوشتی):
Route::post('/api_token/{city?}/', '[email protected]');
بعد باید متد به شکل زیر تعریف بشه :
public function foo($city = null)
برای اینکه در متد POST
csrf token
مشکل ایجاد نکنه داخل فایل VerifyCsrfToken
در فیلد except
باید مقدارش به شکل زیر تغییر پیدا کنه :
[
'/api_token/*ٔ'
]
@tilkacoder به گفتگوی نحوه اتصال به دیتابیس سایت جواب داد.
شما میتونید برای پایگاه داده چندین کاربر تعریف کنید که هر کاربر سطح دسترسی های مخصوص به خودش رو داره.
به طور مثال میتونیم یک کاربر ایجاد کنیم که تنها به یک دیتابیس دسترسی داشته باشه و یک کاربر تعریف کنیم که بتونه همه دیتابیس هارو مدیریت کنه. اینکه هر کاربر چه سطح دسترسی هایی داشته باشه توسط شما مشخص میشه. با کمی سرچ میتونید مثال های خوبی پیدا کنید.
علت ثبت نشدن اطلاعات چیزهای مختلفی میتونه باشه باید مرحله به مرحله پیش برید تا مشکل پیدا بشه. اگر اطلاعات اصلا ثبت نمیشه دلایل مخصوص به خودش رو داره اگر اطلاعات به صورت ناقص ثبت میشه مشکلات خودش
باید مرحله به مرحله به همراه تکه کد بررسی بشه.
@tilkacoder به گفتگوی نحوه اتصال به دیتابیس سایت جواب داد.
ممنون میشم اگر از مارک دان استفاده کنی.
اگر که دیتابیس روی سروری که اسکریپت اجرا میشه هست خیر نیازی به تغییر آدرس سرور نیست ولی اگر روی سرور دیگه ای هست باید ای پی سرور مورد نظر رو قرار بدی.
به طور معمول این خطا به ۲ دلیل رخ میده :
- کاربر پایگاه داده روی سرور وجود نداره
- کاربر دسترسی های لازم بهش داده نشده
با استفاده از پنل هاستی که دارید میتونید کاربر ایجاد کنید و دسترسی های لازم رو بدید.
برای استفاده از cli
در mysql
هم از دستور زیر میتونید استفاده کنید:
ساخت کاربر:
CREATE USER 'zahediha_pop'@'localhost' IDENTIFIED BY '123456789';
اعطا دسترسی های لازم :
GRANT ALL PRIVILEGES ON *.* TO 'zahediha_pop'@'localhost'
WITH GRANT OPTION;
@tilkacoder به گفتگوی مشکلات هنگام قرار دادن سایت روی هاست جواب داد.
باید موارد مختلفی چک بشه.
یک گام دیگه این هست که به مسیر bootstrap/cache
بری و اگر فایل config.php
وجود داشت به هر نامی که میخوای تغییر بدی
۴ آبان، ۱۳۹۷
@tilkacoder به گفتگوی مشکلات هنگام قرار دادن سایت روی هاست جواب داد.
بعضی از سرویس دهندگان به دلایل امنیتی open_basedir
را بر روی تنظیمات php
فعال میکنند.
( به طور معمول اینکار را برای دسترسی هر کاربر تنها به فایل های خودش انجام میدهند)
با ارسال تیکت میتونی بگی این مشکل را برات برطرف کنند ولی معمولا میتونید داخل پنل هاست در بخش PHP Settings
مقدار open_basedir
را برابر none
قرار دهید .( اگر تنظیمات وجود نداشت یا براتون سخت بود تیکت بزنید براتون انجام میدن)
قبل از بارگذاری بهتره از دستور زیر هم استفاده کنید :
php artisan cache:clear
حتما هم چک کنید که پوشه storage
دسترسی کامل برای خواندن و نوشتن توسط اپ را داشته باشد.
۲ مهر، ۱۳۹۷
@tilkacoder به گفتگوی استفاده از پکیج نصب شده از طریق دستور npm در view ها جواب داد.
فرمت فایل هارو چک کن
بعضی از فایل ها به صورت minify
شده نیستن
کد بالارو اصلاح کردم میتونی استفاده کنی ( فرمت چند فایل اشتباه بود)
۱ مهر، ۱۳۹۷
@tilkacoder به گفتگوی نمایش موقعیت مکانی کاربران آنلاین در گوگل مپ در php جواب داد.
HTML5 Geolocation
در صورتی که gps
وجود نداشته باشه بر اساس IP
کار میکنه
علت این اختلاف هم همین هست.
اولین خروجی که پکت رو خارج میکنه اطلاعات رو اضافه میکنه در نتیجه موقعیت اون ثبت میشه.
برای پیدا کردن موقعیت جغرافیایی با استفاده از IP
در php
از این افزونه میتونی استفاده کنی ولی این هم همون مشکل رو داره و موقعیت دقیق نمیده
۳۱ شهریور، ۱۳۹۷
@tilkacoder به گفتگوی استفاده از پکیج نصب شده از طریق دستور npm در view ها جواب داد.
اگر دستور مورد نظر به درستی فایل هارو دریافت کرده باشه میتونی با تغییر فایل webpack.mix.js
اینکار را انجام بدی.(دیگه از bootstrap
نباید استفاده نکنی)
باید محتوا این فایل شبیه به زیر باشه :
mix.js('resources/assets/js/app.js', 'public/js')
.sass('resources/assets/sass/app.scss', 'public/css')
.copy('node_modules/mdbootstrap/js', 'public/mdbootstrap/js')
.copy('node_modules/mdbootstrap/css', 'public/mdbootstrap/css');
برای استفاده ازش به صورت لوکال هم باید کد زیر را در layout
اصلی خودت قرار بدی :
<link href="{{'{{'}} mix('mdbootstrap/css/bootstrap.css') }}" rel="stylesheet">
<link href="{{'{{'}} mix('mdbootstrap/css/mdb.css') }}" rel="stylesheet">
و کد زیر را قبل از بسته شدن تگ body
قرار بده :
<script type="text/javascript" src="{{'{{'}} mix('mdbootstrap/js/jquery-3.3.1.min.js') }}"></script>
<script type="text/javascript" src="{{'{{'}} mix('mdbootstrap/js/popper.min.js') }}"></script>
<script type="text/javascript" src="{{'{{'}} mix('mdbootstrap/js/bootstrap.js') }}"></script>
<script type="text/javascript" src="{{'{{'}} mix('mdbootstrap/js/mdb.js') }}"></script>
بعد هم دستور
npm run watch
۳۰ شهریور، ۱۳۹۷
@tilkacoder به گفتگوی اپلیکیشن جواب داد.
بله چرا که نه ولی شما باید دانش اولیه رو داشته باشی و بتونی سناریو مورد نظرت رو بنویسی و پیاده سازی کنی.
۲۹ شهریور، ۱۳۹۷
@tilkacoder به گفتگوی اپلیکیشن جواب داد.
شما در درجه اول باید در نظر بگیری برنامه شما قرار هست روی چه پلتفرمی اجرا بشه.
به طور مثال ممکنه شما بخواید زمانی که کاربر روی نسخه موبایل دکمه ثبت را زد این عملیات انجام بشه در نتیجه شما با توجه به سیستم عامل موبایل کاربر باید برنامه رو بنویسید ( به طور مثال برای اندروید با جاوا میتونی همچین کاری رو انجام بدی )
در قسمت بعد باید این مسئله رو در نظر بگیری میخوای از چه پرینتری استفاده کنی تا بتونی خروجی و کتابخانه مناسب رو پیدا کنی.
برای اینکه متوجه حرفم بشی یه مثال میزنم :
من توی یه برنامه تحت وب زمانی که قرار بود از Receipt Printer
استفاده کنم با استفاده از js خیلی راحت میتونستم اینکار رو انجام بدم ولی بخاطر مشکلات و مسائلی که وجود داشت مجبور شدم از طریق php
این کار رو انجام بدم.
برای php
با استفاده از کتابخانه escpos-php
اینکار رو خیلی راحت انجام دادم.
برای ارسال به پرینتر شما میتونی با هر زبان برنامه نویسی که بتونه اطلاعات روی پورت سریال و شبکه ارسال کنه این کار را انجام بدی.
۲۷ شهریور، ۱۳۹۷
@tilkacoder به گفتگوی انتخاب یک فریمورک css ، بر اساس vuejs جواب داد.
در حال حاضر از Bootstrap
استفاده میکنم و راضی هم هستم.
لینک راهنما
علت انتخاب هم که دیگه مشخصه و نیازی به توضیح نیست :
- فریم ورک با سابقه ای هست و نسخه جدید فوق العاده است ( همین موضوع باعث میشه تا
vue
هم ساپورتش کنه). - یکی از برترین هاست
- زبان فارسی ساپورت میکنه