یه نویسنده

مقاله، کتاب، کد و ...

مقاله، کتاب، کد و ...

یه نویسنده

وبلاگی برای فعالیتهای پژوهشی و برنامه نویسی کامپیوتر، که شاید دفتر یادداشتی از دانسته‌های روزانه‌ی من باشد(شاید به‌کار شما هم بیاید). مطالبی که از دنیای کدباز جمع‌آوری میکنم و برای علاقه‌مندان این شاخه از فناوری انتشار میدهم. بیشتر نوشته‌های وبلاگ را برنامه‌نویسی‌php و سیستم‌عامل لینوکس تشکیل می‌دهند.

طبقه بندی موضوعی

بازار کار توسعه نرم‌افزار دو ویژگی را هم‌زمان دارد:
از یک طرف تقاضا زیاد است و فرصت‌ها کم نیستند؛ از طرف دیگر رقابت شدید است و برای هر موقعیت خوب، معمولاً چندین برابر ظرفیت، رزومه می‌رسد. پس «صرفاً بلد بودن» کافی نیست. چیزی که آدم‌ها را جلو می‌اندازد ترکیب این‌هاست:

  • مسیر شغلی روشن (Career Plan)

  • مهارت‌های فنی قابل اتکا

  • مهارت‌های ارتباطی و رهبری

  • توانایی ارائه خود (رزومه، کاورلتر، مصاحبه)

  • حضور حرفه‌ای (نمونه‌کار، متن‌باز، محتوا، شبکه‌سازی)

این مقاله یک نقشه راه کامل است: از مسیر کلاسیک جونیور→سینیور→لید، تا مسیرهای جایگزین مثل QA/HelpDesk/Data/AI/DevRel، تا اینکه چگونه «در مصاحبه‌ها» و «در چشم مدیران استخدام» واقعاً متفاوت دیده شوید. و در پایان هم یک رزومه حرفه‌ای کامل از جنس کاری که خودت انجام می‌دهی.

توسعه‌دهنده‌ی ارشدِ فنی (Lead Developer) بودن یعنی چه؟

نقش، مسئولیت‌ها، انتظارات و چیزهایی که هیچ‌کس روز اول بهت نمی‌گه

اگر توسعه‌دهنده‌ای و دنبال «رشد رو به بالا» در مسیر شغلی هستی، احتمالاً اسم نقش Lead Developer یا Technical Lead زیاد به گوشت خورده. خیلی‌ها این نقش را صرفاً یک ارتقای فنی از Senior می‌بینند؛ اما واقعیت این است که «Lead» بودن بیشتر از آنکه ارتقای فنی باشد، تغییر ماهیت نقش است:
ترکیبی از تخصص فنی + رهبری + ارتباطات + تصمیم‌سازی.

در این پست می‌خواهم یک تصویر کامل و کاربردی از این نقش بدهم: از تعریف و تفاوت‌ها تا مسئولیت‌ها، انتظارات، مهارت‌های کلیدی، استانداردسازی، معماری، شاخص‌های موفقیت و حتی تجربه‌ی واقعی یک لید.

 

ctftp – یک TFTP Server سبک، چندریسمانی و قابل مانیتورینگ برای پروویژن خودکار

 

مدت‌ها برای پروویژن خودکار (Auto Provisioning) گوشی‌های سیسکو و سایر IP Phoneها، همه‌چیز به TFTP وابسته است؛
اما واقعیت اینه که اکثر TFTP سرورهای موجود یا:

  • روی لینوکس راحت کامپایل و اجرا نمی‌شن (مثل OpenTFTP که با کلی وابستگی و هدر ویندوزی و … درگیر می‌شی)،

  • یا اصلاً لاگ و ابزار دیباگ درست‌وحسابی ندارن،

  • یا آن‌قدر گنده و پیچیده‌ان که برای یک سناریوی سادهٔ provisioning زیادی‌ان.

برای همین من رفتم سراغ نوشتن یک سرور TFTP اختصاصی به نام ctftp؛
چیزی که دقیقاً برای همین use-case طراحی شده:

  • سبک و چندریسمانی (multi-threaded)،

  • مخصوص تحویل فایل کانفیگ و firmware،

  • با لاگ‌گیری عالی و خروجی event برای مانیتورینگ.

🔗 صفحه پروژه (ctftp):
https://seifzadeh.github.io/ctftp/

🔗 سورس پروژه در گیت‌هاب:
https://github.com/seifzadeh/ctftp

🔗 دانلود مستقیم باینری لینوکس (static):
https://github.com/seifzadeh/ctftp/releases/download/0.0.1/ctftp-static-linux

چون باینری استاتیک هست، واقعاً استفاده ازش در لینوکس می‌شه:

«دانلود کن، اجرا کن، تمام.» 😎


مشکل از کجا شروع شد؟ (داستان OpenTFTP روی لینوکس)

اگر با OpenTFTP و نمونه‌های مشابه سر و کله زده باشی، احتمالاً این‌ها برات آشناست:

  • سورس‌ها برای ویندوز نوشته شده، پر از ws2tcpip.h و چیزهای خاص ویندوز.

  • روی لینوکس ۳۲/۶۴ بیت باید کلی پچ و دستکاری کنی تا اصلاً کامپایل بشه.

  • خبری از لاگ‌های درست‌وحسابی برای هر درخواست نیست.

  • ابزار مانیتورینگ، event، خروجی JSON، هیچی.

برای سناریویی مثل auto provisioning گوشی‌های سیسکو که باید دقیقاً بدونی:

  • کدوم IP چه فایلی را کی گرفته،

  • آیا کامل و سالم منتقل شده یا نه،

  • چقدر ترافیک رد و بدل شده،

این محدودیت‌ها واقعاً اذیت‌کننده‌ست.

ctftp دقیقاً برای حل همین درد ساخته شده.


ctftp دقیقاً چی هست و چه‌کار می‌کند؟

به‌صورت خلاصه:

  • یک TFTP Server چندریسمانی نوشته‌شده با C

  • مخصوص Read-Only (فقط RRQ / دریافت فایل از سرور)

  • مناسب Auto-Provisioning IP Phone‌ها (مخصوصاً سیسکو)

  • با این ویژگی‌ها:

ویژگی‌های کلیدی

  • 🚀 Multi-threaded

    • برای هر IP:port یک Listener Thread

    • برای هر درخواست TFTP (هر RRQ) یک Session Thread جدا

  • 📁 Read-only و امن‌تر

    • فقط RRQ (خواندن فایل) را اجرا می‌کند؛ هیچ WRQ (آپلود) ندارد.

    • مناسب سناریوهای تحویل کانفیگ و firmware، بدون ریسک نوشتن سمت سرور.

  • 🧾 لاگ‌گیری قوی

    • یک لاگ مرکزی (مثلاً /var/log/ctftp/ctftp.log) برای همه‌ی رویدادها.

    • برای هر فایلی که درخواست می‌شود، کنار همان فایل در root_dir یک فایل .log ساخته می‌شود:

      • شامل زمان شروع/پایان، IP و Port کلاینت، حجم ارسال‌شده، و وضعیت نهایی.

  • 📡 ارسال Event

    • ارسال Event به صورت JSON روی UDP به یک آدرس/پورت مشخص

    • ارسال Event به صورت JSON روی HTTP POST به یک URL مشخص

    • مناسب مانیتورینگ real-time، داشبورد، SIEM و…

  • ⚙️ تنظیمات ساده و فایل‌محور

    • همه چیز از یک فایل config ساده key=value خوانده می‌شود:

      • root_dir, log_dir

      • لیست listeners (IP:Port)

      • timeout، retry، log_level

      • مقصد UDP و HTTP برای رویدادها

  • 🛡️ سخت‌گیر روی مسیر فایل

    • مسیرهای مطلق و .. بلاک می‌شوند (جلوگیری از directory traversal).

    • خیلی راحت می‌توانی با کاربر غیر privileged اجراش کنی.


شروع سریع (Quick Start) روی لینوکس – با باینری استاتیک

سناریو نمونه:

  • سرور لینوکس (systemd دار، مثلاً Ubuntu/Debian)

  • روت TFTP در /srv/tftp

  • لاگ‌ها در /var/log/ctftp

  • فایل config و باینری در /opt/ctftp

۱. دانلود و آماده‌سازی باینری
 

cd /opt
sudo mkdir -p /opt/ctftp
cd /opt/ctftp

# دانلود باینری استاتیک ctftp
sudo curl -L -o ctftp-static-linux \
  https://github.com/seifzadeh/ctftp/releases/download/0.0.1/ctftp-static-linux

# اجراپذیر کردن
sudo chmod +x ctftp-static-linux



۲. ساخت پوشه‌ها و کاربر سرویس
 

# روت TFTP
sudo mkdir -p /srv/tftp

# دایرکتوری لاگ
sudo mkdir -p /var/log/ctftp

# کاربر سیستمی بدون شل (اختیاری ولی توصیه می‌شود)
sudo useradd -r -s /usr/sbin/nologin ctftp || true

# مالکیت پوشه‌ها
sudo chown -R ctftp:ctftp /srv/tftp /var/log/ctftp /opt/ctftp



 

۳. ساخت کانفیگ پایه

فایل /opt/ctftp/ctftp.conf را بساز:
 

# Root directory for TFTP files
root_dir=/srv/tftp

# Log directory (central log file)
log_dir=/var/log/ctftp

# لیسنرها (IP:Port) – اینجا روی همه اینترفیس‌ها و پورت ۶۹
listeners=0.0.0.0:69

# ارسال event روی UDP – خالی یعنی غیرفعال
event_udp=

# ارسال event روی HTTP – خالی یعنی غیرفعال
event_http_url=

# Timeout و Retries
timeout_sec=3
max_retries=5

# سطح لاگ: error, info, debug
log_level=info



برای تست یک فایل ساده بگذاریم:
echo "hello from ctftp" | sudo tee /srv/tftp/test.txt
sudo chown ctftp:ctftp /srv/tftp/test.txt


۴. اجرای دستی برای تست
cd /opt/ctftp
sudo -u ctftp ./ctftp-static-linux ./ctftp.conf


حالا از یک سیستم دیگر (یا حتی همان سرور) با یک tftp client تست کن:
tftp <SERVER-IP> 69
tftp> get test.txt


اگر همه‌چیز درست باشد باید فایل را از /srv/tftp/test.txt دریافت کنی.
 

اجرای ctftp به صورت سرویس systemd

برای این‌که بعد از ریبوت سیستم خودش بالا بیاید، یک سرویس systemd تعریف می‌کنیم.

۱. ساخت فایل سرویس

فایل /etc/systemd/system/ctftp.service:
 

[Unit]
Description=ctftp - Multi-threaded TFTP server
After=network.target

[Service]
Type=simple
User=ctftp
Group=ctftp
WorkingDirectory=/opt/ctftp
ExecStart=/opt/ctftp/ctftp-static-linux /opt/ctftp/ctftp.conf
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target



اگر مسیر باینری یا کانفیگ را تغییر داده‌ای، در همین فایل اصلاح‌شان کن.
۲. فعال‌سازی سرویس
sudo systemctl daemon-reload
sudo systemctl enable ctftp
sudo systemctl start ctftp
sudo systemctl status ctftp

 

از این به بعد با هر ریبوت سیستم، ctftp هم خودکار بالا می‌آید.


مانیتورینگ و لاگ‌گیری

لاگ مرکزی

ctftp یک لاگ مرکزی مثل این می‌نویسد:
sudo tail -f /var/log/ctftp/ctftp.log

نمونه لاگ:
[2025-12-02T10:15:42] [INFO] ctftp starting with config: /opt/ctftp/ctftp.conf
[2025-12-02T10:15:42] [INFO] Starting listener on 0.0.0.0:69
[2025-12-02T10:16:01] [INFO] RRQ from 192.168.10.50:40000 file="test.txt" mode="octet"
[2025-12-02T10:16:02] [INFO] EVENT type=0 client=192.168.10.50:40000 file="test.txt" bytes=16 status=ok msg=transfer_complete


 

  • می‌بینی از چه IP چه فایلی درخواست شده

  • چقدر دیتا ارسال شده

  • وضعیت نهایی OK بوده یا نه

لاگ کنار هر فایل

کنار هر فایل در root_dir، یک .log ساخته می‌شود. مثلاً:
/srv/tftp/test.txt
/srv/tftp/test.txt.log

محتوا شبیه این است:
2025-12-02T10:16:01;2025-12-02T10:16:02;192.168.10.50;40000;16;ok;transfer_complete

 

ساختار هر خط:

start_ts;end_ts;client_ip;client_port;bytes;status;message

این خیلی برای سناریوهایی مثل «کدوم گوشی‌ها کانفیگ رو گرفتن، کی گرفتن، چند بار گرفتن» عالیه.
 

مقایسه با OpenTFTP و ابزارهای قدیمی

چیزی که من شخصاً باهاش درگیر بودم:

  • OpenTFTP روی لینوکس:

    • به‌خاطر هدرهای خاص ویندوز (ws2tcpip.h و…) روی GCC لینوکسی به‌راحتی کامپایل نمی‌شود.

    • باید نصف سورس را دستکاری کنی که اصلاً بیلد شود.

  • لاگ‌ها:

    • در ساده‌ترین حالت، چند خط کلی می‌نویسند؛ خبری از per-file log و per-request log نیست.

  • Event / مانیتورینگ:

    • هیچ خروجی استانداردی برای وصل کردن به سیستم‌های مانیتورینگ (مثل UDP JSON / HTTP POST) وجود ندارد.

ctftp دقیقاً اینجا خودش را نشان می‌دهد:

  • باینری آماده (static) برای لینوکس → بدون درگیری با کامپایل.

  • لاگ مرکزی + لاگ جدا برای هر فایل → برای دیباگ و گزارش‌گیری.

  • Event JSON روی UDP و HTTP → مستقیم قابل مصرف توسط داشبوردها، ELK، SIEM، یا حتی یک اسکریپت ساده Python.


لینک‌ها

🔗 صفحه پروژه (ctftp):
https://seifzadeh.github.io/ctftp/

🔗 سورس پروژه (ctftp):
https://github.com/seifzadeh/ctftp

⬇️ دانلود باینری استاتیک لینوکس:
https://github.com/seifzadeh/ctftp/releases/download/0.0.1/ctftp-static-linux

اگر در پروژه‌هات از TFTP برای پروویژن گوشی‌ها، تجهیزات VoIP یا هر سناریوی مشابه استفاده می‌کنی،
به‌نظرم یک بار ctftp را تست کن؛ راه‌اندازی‌اش چند دقیقه بیشتر طول نمی‌کشد،
ولی دید خیلی خوبی از رفتار کلاینت‌ها و وضعیت provisioning بهت می‌دهد 🙌

اگر خواستی ته پست، یه بخش «جمع‌بندی و تشویق به مشارکت» هم بگذار:

  • اگر استفاده کردید و به‌دردتون خورد، لطفاً توی GitHub یک ⭐ بدید.

  • اگر ایده یا باگ دیدید، Issue یا Pull Request خوشحال‌م می‌کنه 😊

تونل معکوس بدون port forward - وب هاستینگ خانگی برای توسعه دهنده ها

من مدتها بود که با z-tel آدرس ip-static داشتم. با port forward دامنه رو میاوردم روی vm های توسعه داخل خونه. مشتریها همیشه ته دامنه تستی یه پورت هم داشتن. هر چند 443 رو میشد آورد. تا این که با تانل cloudflare آشنا شدن. دیدم اصلا ip static هم نمیخواد. خیلی تمیز و شسته رفته وصل میکنه به دامنه. اسمش تانل معکوس هست. یعنی تانل شما میاید وصل میشید به سرور و یا شبکه در بیرونcool این ولی برعکس هست. یه تانل اجرا میکنید که شبکه بیرون با اون دامنه شما رو ببینهsurprise

توپولوژی میشه تصویر زیر

چرا تونل معکوس؟

با تونل معکوس، سرور شما از داخل به شبکهٔ ابری وصل می‌شود. بنابراین:

پروژه ای بر روی سیستم شماست و دنیایی از تنظیمات دارد، وقت هم نمکینید برای دمو بر روی هاست و سرور مشتری نصب کنید. الان دقیقا کدها کجاست؟ معلومه دیگه روی سیستم شخصی که دارید همین الان برنامه نویسی میکنید. دقیقا همین localhost روی مرورگرتون. من توی این پست مرحله به مرحله بهتون یاد میدم چطور یه دامنه رو به این localhost وصل کنید و مشتری هم از بیرون ببینه و تستها رو بگیره.

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

نیازی به Port-Forward روی مودم و آی‌پی ثابت ندارید.

حتی اگر VPN روی سرور روشن باشد، دسترسی عمومی برقرار می‌ماند (ورودی‌ها از مسیر تونل می‌آیند).

گواهی HTTPS و CDN/حفاظت Cloudflare را به‌راحتی می‌گیرید.
اگر Cloudflare برای دامنه‌تان قابل‌استفاده است، Cloudflare Tunnel پیشنهاد می‌شود. اگر نمی‌خواهید Nameserver عوض کنید یا فقط یک URL سریع می‌خواهید، Tailscale Funnel گزینهٔ سریع‌تری است.

 

بخش ۱) Cloudflare Tunnel (پیشنهادی برای دامنهٔ شخصی)
پیش‌نیازها

دامنه‌تان را در Cloudflare اضافه کرده و Nameserverها را به Cloudflare تغییر دهید. (در صورت عدم اتصال تونل، خطای 1033 می‌بینید؛ این خطا یعنی تونل به Edge وصل نیست.) 
Cloudflare Docs

وب‌سرور (Nginx/PHP-FPM و …) داخل سرور فعال باشد (روی 127.0.0.1:80 یا 127.0.0.1:443).

# Install Cloudflared via official apt repo
sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main" | sudo tee /etc/apt/sources.list.d/cloudflared.list
sudo apt-get update && sudo apt-get install -y cloudflared
cloudflared --version  # verify install

نصب از ریپو رسمی Cloudflare انجام می‌شود.

# 1) Authenticate to your Cloudflare account 
cloudflared tunnel login
# -> pick your zone in the browser; it writes ~/.cloudflared/cert.pem

# 2) Create a named tunnel (choose a friendly name)
cloudflared tunnel create web-prod
# -> note Tunnel UUID and credentials JSON path

# 3) List tunnels; later use to check active connections
cloudflared tunnel list

 

باید توی CloudFalre لاگین باشید تا بتونید از url ای که در لحظه auth میسازه وارد اکانت بشید و دامنه رو بر روی auth درخواست شده active کنید

# Create proxied DNS mapping for your hostname to this tunnel
cloudflared tunnel route dns web-prod example.com
# Repeat for each hostname you want to serve through this tunnel

 

بجای example.com نامه دامنه رو بزنید

این فرمان یک رکورد CNAME به تونل می‌سازد. خود رکورد مستقل از وضعیت تونل است؛ اگر تونل خاموش باشد معمولاً خطای 1016 می‌بینید، ولی 1033 یعنی تونل به Edge وصل نشده.

 

پیکربندی config.yml — دو الگو

الگوی سریع و تمیز (HTTP داخلی):
ساده‌ترین راه این است که تونل به HTTP داخلی وصل شود؛ TLS سمت کاربر را Cloudflare هندل می‌کند.

# /etc/cloudflared/config.yml
tunnel: <YOUR-TUNNEL-UUID>
credentials-file: /root/.cloudflared/<YOUR-TUNNEL-UUID>.json

ingress:
  - hostname: example.com
    service: http://127.0.0.1:80  # internal HTTP avoids TLS mismatch on 127.0.0.1
  - service: http_status:404      # required catch-all

 

توی دستورات قبلی یک سری uuid و مسیر فایل json داده که به همران اسم دامنه و پورتی که بر روی سیستم در حال listen هست رو این جا میزارید

cloudflared tunnel ingress validate  # should say OK

 

باید دیگه بهتون ok بده

اگر هم میخواد https کنید. مثلا شاید در حال توسعه بات تلگرام هستید. باید ادامه همین پست نحوه بردن روی https رو گفتم

همین الان با زدن این دستور اجرا میشه و از روی اون دامنه به سیستم شما تانل زده میشه و وب سرور شما جواب میده و اپ رو از بیرون میشه دید

# Run in foreground for a quick test
cloudflared tunnel --config /etc/cloudflared/config.yml run web-prod

یا این که به شکل سرویس در بیارید که همش اجرا بشه. به هر حال برق میره و میاد و یکی نیازه که دوباره استارتش کنه. البته شاید این پست رو زمانی میخونید که روسیه نیروگاه های کوچیک هسته ای رو داده به ایران و مشکل برق حل شدهwink

# Install as a system service (reads /etc/cloudflared/config.yml)
sudo cloudflared service install
sudo systemctl enable --now cloudflared
systemctl status cloudflared

و اما https کردن همین مسیر

باید از certbot براش certificate بگیرید

ابتدا نصبش کنید

apt-get install -y ca-certificates curl
apt install -y certbot python3-certbot-nginx

بعدش nginx که تنظیم هست. یعنی الان داره با پورت 80 روی همون دامنه کار میکنه
 

certbot --nginx   -d site-sample.ir   --email your@mail.com   --agree-tos   --redirect   --hsts   --staple-ocsp   -n

 

فایل yaml رو هم بهش میگید من https هستم

# /etc/cloudflared/config.yml  (English comments)
tunnel: <YOUR-TUNNEL-UUID>
credentials-file: /root/.cloudflared/<YOUR-TUNNEL-UUID>.json

ingress:
  - hostname: example.com
    service: https://127.0.0.1:443
    originRequest:
      originServerName: example.com  # verify certificate against this name
      # noTLSVerify: true            # last resort (not recommended)
  - service: http_status:404

اون تیکه noTLSVerifynoTLSVerify برای زمانی هست که self sign کنید و خودتون کلید بزارید. که خب چندان جالب نیست. با همین certbot معتبر بگیرید

 

ارائه شناسایی الفاظ رکیک به کمک شبکه های عصبی مصنوعی

صفحه انتشار مقاله در IEEE

دریافت PDF کامل مقاله منتشر شده

دانلود اسلاید در فرمتهای PDF و PPTX

 

 

فیلم سینمایی شکسته - Fractured

پرداخت هزینه هر شش ماه یک بار فیلیمو همیشه هم برام عذاب آور بوده و هم مفید. عذابش اون قسمت هست که همون فیلمهایی که من همیشه از تورنت دانبود میکردم و با پایین آوردن کیفیت صدا و تصویر و سانسور قراره بهم تحویل بده و مفید از این لحاظ که براحتی همون فیلمها در دسترسی هست. و البته تجربه دیگران در دیدن اون فیلم. معمولا زیر هر فیلمی وقتی ۳۰ نفر کامنت گذاشتن و بالای ۲۰ نفر گفتن خوب هست، اون فیلم خوب بوده.

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

فیلم شکسته به کارگردانی برد-اندرسون که تخصصش فیلمهای مهیج و ترسناک هست. این بار فیلمی که در اون روابط عاطفی، خشم، حالات روانی لحظه ای، رویا، ترس و ... با هم ادغام شده. از مواردی که خیلی فیلم رو جذاب کرده:

۱. پدری که بسیار نگران خانوادش هست، از اونها نگهداری میکنه. حتی در حین رانندگی برای دخترش شعر میخونه، سعی میکنه مشکلات خانوادگی رو مدیریت کنه. ولی یکدفعه هر دو رو به دست خودش کشته.

 

۲. حالات روانی لحظه ای و تصمیم گیری بدون اختیار. مانند هل دادن زنش که منجر به مرگش میشه

۳. توهم از این که زن و فرزندش رو رسونده بیمارستان

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

۵. در مسیر برگشت دوباره داره برای خانوادش شعر میخونه، در حالی که مریض دیگری پشت صندلی نشسته

 

برعکس فیلمهای دیگری که این چند وقت دیدم، به دور از واقعیت و خیلی هم تخیلی، این فیلم بسیار هم واقعی هست. 

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

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

در اخر فیلم با روشن شدن حقایق و ادامه رانندگی مرد تموم میشه. 

دسترسی apache به پوشه اشتراکی vagrant

vagrant یه ابزار کمکی برای راه اندازی vm هست. معمولا از virtualbox به عنوان container پیش‌فرض استفاده میشه. در مورد این که vagrant چی هست و container چه کاری رو انجام میده، میتونید سری به ویکی vagrant بزنید.

بعد از راه اندازی vm یکی از امکانات خیلی خوبش sync folder هست. بین Host و Guest یه فولدر مشترک اسجاد میکنه و شما براحتی بر روی یه فولدر توی سیستم خودتون فایل میرید و بدون هیچ دستوری همون فایل رو بر روی vm خواهید داشت. مثلا فولدر بر روی سیستم Host در مسیر

/home/mehrdad/vm/server/www

مثلا در این فولدر کدهای برنامه نویسی وب هست و قراره بر روی vm توسط apache و php اجرا بشه. درون vm فولدر زیر جهت sync

/vagrant/www

قبل از این کار باید vboxsf رو بر روی Guest نصب کنید. همراه container ها یه فایل addition هست جهت نصب ابزارهای کمکی. همراه Virtualbox هم یه iso به اسم VBoxGuestAdditions برای دانلود هست. البته کاربران ایرانی تحریم هست و باید از راه های دیگه دانلود و نصب کنید. توجه کنید مناسب با ورژن virtualbox باید نسخه iso رو دانلود کنید. مثلا virtualbox من در منوی about  نسخه 4.3.36 رو نشون میده. برای دانلود iso لز لینک زیر استفاده کنید

http://download.virtualbox.org/virtualbox/

البته همین iso رو از طریق منوهای virtualbox میتونید دانلود کنید که به علت تحریم‌ها و سرعت پایین نت شاید نتونید موفق به این کار بشید و دانلود مستقیم iso بهتر هست.

بعد از دانلود باید اون رو به عنوان یه cd به vm خودتون mount کنید

mkdir /mnt/cd

mount /dev/cdrom /media/cd

اگر هم مثل من از mount کردم مستقیم iso دانلود شده رو بیشتر میپسندید میتونید iso دانلود شده رو به vm منتقل کنید و با دستور 

mount /home/VBoxGuestAdditions_4.3.36.iso /mnt/cd

این کار رو انجام بدید. برای نصب guest addition نیاز به gcc make و  kernel headers هست. دلیلش هم کامپایل ماژول vboxsf برای کرنل لینوکس هست. یعنی یه سورس ماژول که باید روی vm شما بر اساس نسخه kernel کامپایل و در زمان اجرا insmod بشه. برای نصب نیازمندیها دستور زیر رو اجرا کنید

sudo apt-get install make gcc linux-headers-$(uname -r)

برید به پوشه /mnt/cd و دستور زیر رو اجرا کنید

./VBoxLinuxAdditions.run

با این کار شروع به کامپایل و نصب میکنه


root@S:/mnt/cd# ./VBoxLinuxAdditions.run 

Verifying archive integrity... All good.

Uncompressing VirtualBox 4.3.36 Guest Additions for Linux............

VirtualBox Guest Additions installer

Copying additional installer modules ...

Installing additional modules ...

Removing existing VirtualBox non-DKMS kernel modules ...done.

Building the VirtualBox Guest Additions kernel modules

The headers for the current running kernel were not found. If the following

module compilation fails then this could be the reason.


Building the main Guest Additions module

 ...done.

Building the shared folder support module ...done.

Building the OpenGL support module ...done.

Doing non-kernel setup of the Guest Additions ...done.

Starting the VirtualBox Guest Additions ...done.

Installing the Window System drivers

Could not find the X.Org or XFree86 Window System, skipping.


بعد از این کار سمت client همه چیز آماده هست و باید باید فایل Vagrant رو طوری کانفیگ کنیم تا این دو تا فولدر رو sync کنه

config.vm.synced_folder "./", "/vagrant" ,id: "vagrant-root",owner: "vagrant", group: "www-data",mount_options: ["dmode=775,fmode=664"]

درون پوشه اصلی یه پوشه به اسم www بسازید. در vm قرار هست apache رو بر روی این فولدر تنظیم کنیم.
با دستور vagrant up ماشین رو اجرا کنید
برای تست این که آیا sync به درستی انجام شده دستور زیر رو بزنید و در سیستم خودتون پوشه www رو ببینید که فایل ساخته شده یا نه
touch /vagrant/www/test.txt

بعد از نصب apache وphp حالا نوبت به کانفیگ apache هست تا از پوشه پیش فرض خودش که /var/www هست تغییر کنه به پوشه /vagrant/www برای این کار فایل زیر رو باز و ویرایش کنید
sudo nano /etc/apache2/sites-enabled/000-default.conf

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /vagrant/www

        ErrorLog /vagrant/log/error.log
        CustomLog /vagrant/log/access.log combined

        <Directory /vagrant/www>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order deny,allow
                Allow from all
                Require all granted
        </Directory>

</VirtualHost>

فایل رو ذخیره و با دستور service apache2 restart سرویس apache رو رستارت کنید.
برای گرفتن info از php دستور زیر رو اجرا کنید
echo '<?php phpinfo(); ?>'  > /vagrant/www/index.php
حالا به مرورگر برید و آدرس ip ماشین رو بزنید
به احتمال زیاد خطای دسترسی رو خواهید داشت

برای حل این مشکل باید کاربر vagrant و www-data رو عضو گروه vboxsf کنید با دستور زیر
adduser vagrant vboxsf
adduser www-data vboxsf

دوباره با دستور service apache2 restart سرویس apache رو رستارت کنید. اگر بازم درست نشد نیاز به راه اندازی مجدد vm هست.

لزوم یادگیری فناوری‌های جدید و روشهای بهتر در پروژه‌ها

همیشه در پروژه‌ها یکی از دغدغه‌های من تحویل کار با کیفیت مطلوب و راضی شدن مشتری هست. بخشی از این داشتن کیفیت به استفاده از فناوری‌های مناسب هست. در این پست میخوام کمی از تجارب و لزوم یادگیری روزانه در برنامه‌نویسی رو یادآوری کنم.


تحقیق در کاری که قراره انجام بشه خیلی مهم هست. به چند دلیل در هر پروژه‌ای ما از تحقیق و جستجو تمام روشها سرفنظر میکنیم:

  1. روشهای قبلی رو، قبلا یاد گرفتیم، الانم دست به کد و فوری اون بخش رو درست میکنیم. پس اصلا وقتی برای روشهای جدید نمیزاریم
  2. نیاز به وقت داره. بیشتر پروژه‌ها بصورت انفرادی نوشته میشه، و مشکل زمان تحویل+باگ‌گیری+تحویل و راه‌اندازی، اجازه وقت گذاشتن برای تست روشهای دیگه رو نمیده. حتی تست روشها میتونه خودش ۱/۳ زمان رو در بر بگیره، که به‌صرفه نیست
  3. قبلا روشهای یاد گرفته شده تست شده و داره کار میکنه، پس لزومی نداره وقت بزاریم و روشهای جدید رو یاد بگیریم
  4. بعضی روشهای جدید نیاز به سطح بالایی از دانش هست. مثلا curl صرفا باید موارد پایه رو یاد بگیرید و با گرفتن نمونه کد از اینترنت راه میفته، ولی api نیاز به خوندن document، و تست ماژولهای نوشته در زبان مورد نظر هست. چون در نگاه اول curl‌مسیر ساده‌ای هست از اون استفاده میکنیم

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

  1. sql یا NoSQL
    معمولا برنامه‌نویسان php با mysql‌ خوی گرفتن و بصورت پیش‌فرض دیتابیس این زبان هست. ولی آیا همه جا باید از این دیتابیس استفاده بشه؟ مثلا پروژه‌ای رو در نظر بگیرید که ۵۰ دسته بندی داره، بعضی از این دسته‌ها به فیلدهای زیادی نیاز داره مثلا نام، نام‌خانوادگی، موبایل و آدرس و ... ولی بعضی دسته‌ها فیلد کمی نیاز داره و صرفا باید کد‌ملی یا شماره تلفن برای اون دسته وارد بشه. با این اوصاف آیا mysql برای این پروژه به صرفه هست؟ توجه کنید که join‌ در mysql‌چقدر روی performance تاثیر داره. جواب خیر. و این موردی که در یک پروژه بهش برخورد کردم و بعد از تحقیقات و تست به این نتیجه رسیدم که پروژه باید دیتابیس mongodb کار کنه. تنهای معایب این روش نصب نبودن بر روی هاست اشتراکی و مشتری باید سرور تهیه کنه. که البته بسته به بزرگ بودن کار این مورد قابل چشم پوشی بود.
  2. ajax یا websocket
    مورد websocket با html5 معرفی شد. بعد از مدتی NodeJS مکمل اون شد و خیلی از سایتها چت ‌هایی بسیار قوی با اون درست کردن. نمونه تلگرام. ولی این مورد نیاز به یادگیری و مطالعه داره و گذشته از اون node بصورت پیش‌فرض بر روی هاست‌ها نصب نیست و برنامه‌نویس تصمیم میگیره از روش قدیمی خودش که فرستادن ajax در نیم ثانیه و یا در نهایت از کامیت استفاده کنه. معایب این روش میتونه مرورگرهای قدیمی باشه که websocket رو ساپورت نمیکنن.
  3. curl یا api
    بیشتر سایتهای بزرگ برای تنوع خدمات خودشون وو این که ثابت کنن یه سرویس بسیار قوی دارن، api رو راه اندازی کردن. معمولا این api تکمیل هستن. یعنی هر کاری که توی gui سایت قابل انجام هست، توسط api هم قابل انجام هست. اکثرا از سه فناوری WSDL,SOAP,RestFul استفاده میشه. ولی باز هم برنامه‌نویسان چون از قدیم از curl بهره بردن و جواب هم داده همچنان به اون وفادار هست. api معمولا پایدار هست، یا تغییرات رو طوری اعمال میکنن که استفاده کنندگان سیستم‌هاشون قطع نشه ولی از بزرگترین معایب curl تغییر gui‌یا مسیرهای submit هست.

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

اما راه حل رو بازم لیست میکنم:

  1. شما راضی و مشتری هم راضی. اگر پروژه با هر فناوری نوشته شده الان داره کار میکنه و تست‌ها هم موفق آمیز بوده. پس استفاده از فناوری قدیمی تا وقتی مشکلی در سایت پیش نیومده میتونه بکار گرفته بشه و زیادی هم حساس نشید. ولی بهتره روشهای جدیدتر رو هم تستی بگیرید شاید روزی اون قسمت از پروژه بدلیل فناوری قدیمی از کار بیفته و شما در شرایط بدی برای بروز رسانی قرار بگیرید
  2. مشتری راضی ولی شما وجدانتون نارحته. بله این مورد برای خیلی ها پیش میاد. اگر روشهای جدید بکار گرفته میشد، سرعت و دقت بیشتری داشت و مشتری هم خوشحال‌تر میشد. ولی این عذاب وجدان در شما هست که بدلیل وقت یا هر مشکل دیگری نتونستید روشهای جدید رو استفاده کنید. در اولین فرصت راهی برای رفع عذاب وجدانتون پیدا کنید، مثلا مشتری رو متقاعد کنید برای بروز رسانی اون قسمت یه مبلغی در نظر بگیره. البته باید بیشتر از قبل بر سر قیمت باهاش راه بیاید.
  3. مشتری ناراضی و شما هم قبول دارید کار بد انجام شده. این شرایط خیلی بده باید زودتر برطرف بشه. مشتری برای پروژه هزینه کرده و شما در زمان مورد نظر نتونستید، بهترین روش رو پیاده سازی کنید. مشتری حقش ضایع شده. این جا فقط گرفتن زمان بیشتر میتونه مشکل رو حل و اگر هم رفع اون مشکل داره با مشتری حرف بزنید و متقاعدش کنید اون موقع بسته به زمان و شرایط، روشهای قبلی استفاده شد، و برای رفع باگ و استفاده از روش جدید باید مبلغی رو بده. شاید مشتری از اختصاص مبلغی بیشتر به پروژه سر باز بزنه و شمار رو مجبور کنه که باید بدون دریافت هزینه برطرفش کنید، خب این‌جا دیگه باید از خودتون بگذرید و این ضرر رو بپذیرید و تجربه‌ای باشه برای پروژه‌های بعدی که مطالعه و پیدا کردن روش مناسب رو انجام بدید


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

نمایشگاه تلکام-غرفه صنایع ارتباطی آوا

تلکام


من و همکار خوبم مهندس کریم خلیفه در غرفه صنایع ارتباطی آوا

مجموعه آموزشی yii2 از پایه تا پیشرفته همراه با کارگاه عملی ساخت cms

سلام به تمام برنامه نویسان علاقه مند به یادگیری فریم‌ورک yii2
حدود یک‌سال پیش در بخش codeigniter مجموعه آموزشی خدمت علاقه‌مندان تقدیم کردم. در همان پستها دوستان از بنده خواستند تا اگر امکان دارد فریم‌ورک‌های دیگر را هم آموزش دهم.
بصورت حرفه‌ای بر روی دو فریم‌ورک کار کرده بودم یکی ci‌و دیگری yii. البته باز هم با yii بیشتر و شاید از ۹۰درصد ویژگی‌های yii در کارهای خود استفاده کرده بودم. با این اوصافت در تهیه مجموعه آموزشی مشکلی نداشتم چون صرفا تجربیات باید تبدیل به فیلم میشد. ولی مساله وجود متقاضی بعد از تهیه مجموعه آموزشی بود. هر چند از همان ابتدا هدفم پخش رایگان بود ولی باز هم باید طرفدارانی باشند تا کار خدای نکرده روی زمین نماند. بعد از گذشت حدود ۵ ماه از انتشار ci، هر روز دوستانی زیادی تماس میگرفتند برای رفع مشکل، عده‌ای از کاربران در فروم پست میگذاشتند، عده در وبلاگم ،بعضی از دوستان تماس تلفنی و حتی تعداد چند نفر از عزیزان حضوری با بنده دیدار داشتند. این خود نشانه قوتی بود چون متد آموزشی بنده باب طبع دوستان بود. پس با این حساب مشکل وجود متقاضی هم حل شد.