سیگنال بلاگ
کاربران فعال
bahramirad bahramirad
ج.بهرامی‌راد 3 روز پیش

اینم صفحه اصلیشه. اون آیکن کوچولوی خوشگلش رو توی Status Bar ببینید! :)

پیاده‌سازی همین نوتیفیکیشنش هم کلی ازم وقت گرفت. ولی وقتی به نتیجه نگاه می‌کنم، بیشتر از قبل از کاری که انجام دادم راضیم..

در حین توسعه، هر بخشی رو که پیاده‌سازی می‌کردم یا تغییر می‌دادم تا به چیزی که توی ذهنم ساخته بودم برسم، بیشتر مطمئن می‌شدم که دارم به یه چیز قشنگ می‌رسم.

ارزش کاری که انجام دادم رو وقتی بیشتر حس کردم که رفتم چندتا اپ مشابه رو از گوگل پلی نصب کردم و از نزدیک بررسی‌شون کردم :)

Orbit - Home

ج.بهرامی‌راد 3 روز پیش

اینم یه تصویر از همین اپ Pomodoro که دارم میسازم، حالت تمام‌صفحه یکی از تایمرهاست چون میشه چندین تایمر مختلف ساخت و..

البته من تصویر رو دادم chatgpt که 1:1 در بیاره اینجا میذارم ارتفاع تصویر زیاد نباشه :)

Orbit Pomodoro

ج.بهرامی‌راد 3 روز پیش

روز سوم از تجربه توسعه اپ موبایل :)

تا همین چند دقیقه پیش داشتم روی اپلیکیشن Pomodoroم کار می‌کردم. تقریباً دو روزه که درگیرشم و امروز بالاخره ازش بیلد گرفتم و روی گوشی خودم نصبش کردم تا تستش کنم :)

چند مورد به چشمم خورد که فردا فیکسشون می‌کنم. از طرفی باید یکم هم درباره فرایند بیلد گرفتن تحقیق کنم، چون خروجی apk حدود ۱۱۰ مگابایت شده که خب خیلی زیاده! :)

بعدش رفتم گوگل پلی و چندتا اپ مشابه نصب کردم تا ببینم بقیه چطور طراحی کردن و.. راستش فکر کنم بی‌دلیل نیست که حس می‌کنم بالاخره حوزه‌ای که واقعاً بهش علاقه دارم رو پیدا کردم. خروجی چیزی که ساختم واقعاً قشنگ شده و از نتیجه‌اش راضیم. :)

این اپ رو در اصل ساختم تا دستم بیاد فرایند توسعه یک اپلیکیشن موبایل از شروع تا بیلد گرفتن و نصب روی گوشی چطوریه و ممکنه با چه چالش‌هایی روبه‌رو بشم.

اگر همه‌چیز طبق برنامه پیش بره، امیدوارم تا آخر همین هفته برای دانلود منتشرش کنم.

فعلاً امکان انتشار تو گوگل پلی رو ندارم، ولی حتماً یه راهی برای انتشارش پیدا می‌کنم :)

ج.بهرامی‌راد 4 روز پیش

دو سه روز پیش نصفه‌شب، در حالی که با گوشی مشغول چت با Claude بودم، ازش درباره React Native پرسیدم. اینکه یاد گرفتنش آسونه یا نه؟ میشه راحت باهاش شروع کرد؟ اصلاً می‌تونی یه اپ ساده رو قدم‌به‌قدم برام بسازی تا ببینم روند کار چطوریه؟

خلاصه Claude هم شروع کرد به توضیح دادن React Native و Expo و... راستش چیزی که دیدم خیلی ساده‌تر از چیزی بود که تصور می‌کردم.

فرداش با کمک Claude یه اپ ساده در حد Todo ساختیم و تجربه واقعاً جالبی بود.

تصمیم گرفتم فعلاً یه اپ ساده Pomodoro بسازم، ازش بیلد بگیرم و منتشرش کنم. بعدش هم برم سراغ یه ایده کاربردی‌تر برای مدیریت دخل‌وخرج و حساب‌وکتاب شخصی خودم.

اگه خوب از آب دربیاد، منتشرش می‌کنم تا شما هم اگه دوست داشتید ازش استفاده کنید. :)

در کل تجربه خیلی قشنگی بوده تا اینجا. احساس می‌کنم شاید بالاخره توی ۲۷ سالگی یه علاقه جدید و جدی توی خودم پیدا کردم.

البته هنوز نمی‌دونم با React Native و Expo تا کجا میشه پیش رفت...

حالا یه مشکلی که برام پیش اومده اینه که این‌قدر ایده اپلیکیشن ریخته توی سرم که دیگه نمی‌دونم از کدوم شروع کنم! :)))

به Claude و ChatGPT هم گفتم ایده بدید، اونا هم کلی پیشنهاد دادن. اصلاً یه وضعیه! 🤣

با شناختی که از خودم دارم، اگه هیچ اپی هم جایی منتشر نکنم، مطمئنم یه روزی میاد که همه اپ‌های روی گوشیم رو خودم نوشتم! 💯

ج.بهرامی‌راد 2 هفته پیش

دوست دارم برگردم به دورانی که مقاله‌ی «معرفی ۱۰ تا تم پرطرفدار VS Code» یکی از مقاله‌های خفن برنامه‌نویسی بود :))

ج.بهرامی‌راد 1 ماه پیش

بعضی وقتا لازم نیست برای تغییر یه چیز، کاربر وارد یه صفحه‌ی جدید بشه.

این ایده توی UX به Edit in Place معروفه؛ یعنی کاربر بتونه یه مقدار رو همون جایی که میبینه، ویرایش کنه.

مثلاً توی یه پنل مدیریت فروشگاه، لیست محصولات رو داریم و موجودی هر محصول هم کنار اون نمایش داده میشه.

به‌جای اینکه برای تغییر موجودی، کاربر وارد صفحه‌ی جزئیات محصول یا.. بشه، میشه با یک کلیک روی موجودی، همون‌جا اون رو به یه فیلد تبدیل کرد تا کاربر مقدار جدید رو وارد کنه.

کاربر برای یه تغییر ساده مجبور نیست صفحه رو ترک کنه، چیزی رو پیدا کنه و دوباره برگرده.

یجورایی لازم نیست برای یه کار ساده، کاربر رو از چند مرحله رد کنیم :)

ج.بهرامی‌راد 1 ماه پیش

توی TypeScript اگه بخوایم از یه Type استفاده کنیم ولی چندتا property اون رو نداشته باشیم، می‌تونیم از Omit استفاده کنیم.

مثلاً:

type User = {
  id: number
  name: string
  email: string
}

type CreateUser = Omit<User, 'id'>

اینجا CreateUser همه‌ی propertyهای User رو داره، به جز id.

یعنی به جای اینکه دوباره Type مربوط به ساخت User رو بنویسیم، از همون Type قبلی استفاده می‌کنیم و فقط چیزی که لازم نداریم رو حذف می‌کنیم.

اگه بیشتر از یه property رو هم نخواستیم، اسم propertyها رو با | از هم جدا می‌کنیم:

type CreateUser = Omit<User, 'id' | 'email'>

اینجا CreateUser فقط name رو داره.

برای Typeهایی که خیلی شبیه هم هستن، این می‌تونه جلوی کلی تکرار رو بگیره.

ج.بهرامی‌راد 2 ماه پیش

یه اصطلاح توی برنامه‌نویسی هست با عنوان Technical Debt یا بدهی فنی.

وقتی برای اینکه سریع‌تر به نتیجه برسیم، یه راه‌حل موقتی یا نه‌چندان اصولی انتخاب می‌کنیم و می‌ذاریم تمیز کردن یا بهتر کردنش رو برای بعد، در واقع داریم Technical Debt ایجاد می‌کنیم.

مثلاً یه بخشی از کد رو می‌دونیم میشه بهتر نوشت، ولی چون الان عجله داریم یا کارهایی با اولویت بالاتری وجود داره، همونطوری که هست نگهش می‌داریم و میگیم بعداً برمی‌گردیم سراغش.

این کار همیشه هم اشتباه نیست؛ گاهی یه تصمیم آگاهانه‌ست برای اینکه سریع‌تر جلو بریم. چیزی که مشکل‌ساز میشه اینه که این بدهی‌ها زیاد بشن و هیچ‌وقت براشون وقت نذاریم.

اون موقع همون کدی که قرار بود بعداً درستش کنیم می‌تونه تبدیل بشه به چیزی که توسعه و تغییر دادن پروژه رو سخت‌تر می‌کنه.

گاهی سریع‌تر جلو رفتن ارزش ایجاد کردن بدهی فنی رو داره؛ به شرطی که بعداً فراموشش نکنیم :)

ج.بهرامی‌راد 2 ماه پیش

وقتی تو ایران زندگی می‌کنی، Ctrl+C بخشی از فرایند ارسال پرامپته :)

ج.بهرامی‌راد 2 ماه پیش

برای پیاده‌سازی قابلیت چندزبانه توی Laravel می‌تونیم از پکیج laravel-translatable از Spatie استفاده کنیم.

ایده‌ی این پکیج اینه که برای فیلدهای چندزبانه، به‌جای اینکه برای هر زبان یه ستون جدا داشته باشیم، فقط یک ستون از نوع json داشته باشیم و ترجمه‌ها رو داخل همون ستون نگه داریم.

اول پکیج رو نصب می‌کنیم:

composer require spatie/laravel-translatable

مثلاً فرض کنیم مدل Product داریم و می‌خوایم name و description چندزبانه باشن. توی migration، این فیلدها رو به‌صورت json تعریف می‌کنیم:

$table->json('name');
$table->json('description');

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

use Spatie\Translatable\HasTranslations;

class Product extends Model
{
    use HasTranslations;

    public array $translatable = [
        'name',
        'description',
    ];
}

حالا مقدار name می‌تونه چیزی شبیه این باشه:

{
    "fa": "محصول جدید",
    "en": "New product"
}

و می‌تونیم ترجمه‌ها رو با خود مدل مدیریت کنیم:

$product->setTranslation('name', 'fa', 'محصول جدید');
$product->setTranslation('name', 'en', 'New product');

$product->save();

اینجوری اضافه شدن زبان جدید هم به تغییر ساختار جدول نیاز نداره؛ فقط ترجمه‌ی زبان جدید به همون JSON اضافه می‌شه.

ایده‌ی اصلی پکیج هم دقیقاً همینه: چندزبانه بودن رو داخل خود فیلد مدیریت کنیم، نه با اضافه کردن ستون برای هر زبان.

🔗 مشاهده در GitHub

گزارش محتوا

اشتراک‌گذاری