وبلاگ مصطفی ستاری

یک وبلاگ برنامه نویسی دیگر

یک وبلاگ برنامه نویسی دیگر

ماندن یا رفتن؟

امروز یک گفتگو با مدیر بخشی که در آن مشغول به کار هستم، داشتم که پیرامون اخراج تعدادی از همکاران بود، که به شدت من و سایر کارکنان دیگه رو ناراحت کرده بود. طی صحبت‌ها جناب مدیر بر این عقیده بودند که افراد اخراج شده توانایی انجام وظایف مربوطه را نداشته یا طی چند ماه آخیر کارایی آنها کم شده، با اینکه خودشان اذعان داشتند که تا به حال چند پروژه برنامه نویسی رو تحویل داده اند و جزو کارکنان خوب شرکت بوده‌اند. این مدیر محترم این ضعف را با استخدام برنامه نویس حرفه‌ای تر حل کردند.
ساعت کاری شرکت ما ۸ تا ۵ بعدازظهر است که عموما به خاطر فشار زیاد کار افراد را گاها تا ۱۰ شب نگه می‌دارند.
مساله که باعث شد این پست رو بنویسم این طرز فکر جناب مدیر بود که پس از استخدام برنامه نویسان فقط به فکر کار کشیدن و منافع شرکت هستند و توقع دارند که با این فشار کاری کارکنان همیشه مانند اسبان مسابقه، سخت در حال کار کردن و بازدهی باشند. بدون اینکه زمانی برای آموزش و اتقاء کارکنان اختصاص دهند. این جور شرکت‌ها کسب دانش جدید را فقط وظیفه کارکنان می‌دانند و حاضر نیستند هزینه‌ای برای آن بپردازند و ترجیح می‌دهند پس از فرسونده شده نیروی کارشان آن‌ها را با افراد جدید جایگزین کنند. مسلما هر فردی با ۱۲ ساعت کار مداوم در طول روز، زمانی برای یادگیری مطالب جدید برایش باقی نمی‌ماند و پس از مدتی دانشی که داشته قدیمی و کم ارزش می‌شود (مخصوصا در حرفه ما).

شرکتی که شما مشغول کار در آن هستید چطور هست؟ اگر شما جای ما بودید در چنین محیطی حاضر به کار بودید؟

پی نوشت:
یه سری لینک‌ها که در ادامه در این شرایط خوب هستند و به مرور زمان کاملترشون می‌کنم:
۱۶ نشانه که وقتش رسیده شغل‌تان را ترک کنید!
یه سری فاکتورها هنگام در نظر گفتن اینکه آیا یک شرکت نرم افزاری برای شما مناسب هست یا نه.
در هنگام جستجو برای شغلی جدید چگونه باید با رئیس کنونی خود برخورد کنیم؟
۱۱ جمله ای که در حین ترک یک شغل نباید بیان کرد.
اینفوگرافیک: نشانه‌هایی که به شما میگن اون شغل رو قبول نکنید.

سوئیچ کردن بین Viewها در WPF هنگام استفاده از الگوی MVVM

یکی از مسائلی که در ابتدای کار با MVVM ممکن است گیج کننده به نظر برسد سوئیچ کردن بین نماهای مختلف (Views) است.

برای اینکار چند روش وجود دارد.

استفاده از DataTemplate

فرض کنید در پنجره اصلی برنامه‌تان ۲ ویو به نام‌های خانه و کار داریم. برای مشخص کردن ویو جاری در ViewModel پنجره اصلی یک پراپرتی ایجاد می‌کنیم:

public class MainViewModel
{
    public ViewModelBase CurrentView {get; set;}
}

سپس محتوای کنترل کانتنت پنجره اصلی را به این متغیر بایند می‌کنیم:
<ContentControl Content="{Binding CurrentView}" />
در نهایب برای هر VM یک تمپلت ایجاد می‌کنیم تا بر اساس مقدار پراپرتی CurrentView که با کانتنت کنترل بایند شده، دیتاتمپلت مشخص کند که کدام ویو باید لود شود.
<DataTemplate DataType="{x:Type HomeViewModel}">
    <TextBlock Text="This is the Home Page" />
</DataTemplate>

<DataTemplate DataType="{x:Type WorkViewModel}"> <localControls:WorkViewUserControl /> </DataTemplate>

استفاده از DataTrigger

گاهی ممکن است به جای یک نوع بخواهیم بر اساس مقدار یک پراپرتی ویو را عوض کنیم. در این صورت می‌توانیم از دیتاتریگرها استفاده کنیم. مثلا در همان مثال بالا در صورتی که به جای اینکه CurrentView نوع ViewModel رو مشخص کند، نام آن رو ذخیره کند (مقداری رشته‌ای) آنگاه اینطور می‌توانیم عمل کنیم:
برای هر مقدار یک تمپلت تعریف می‌کنیم:
<DataTemplate x:Key="ViewOneTemplate" DataType="{x:Type ContentControl}">
<local:View1 />
</DataTemplate>

<DataTemplate x:Key="ViewTwoTemplate" DataType="{x:Type ContentControl}">
<local:View2 />
</DataTemplate>
آنگاه با یک دیتا تریگر بین این دو تمپلت بر اساس مقدار پراپرتی، (در اینجا  CurrentView که از نوع رشته است) سوئیچ می‌کنیم.
<ContentControl>
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Setter Property="ContentTemplate" Value="{StaticResource ViewOneTemplate}" />
<Style.Triggers>
<DataTrigger Binding="{Binding CurrentView}" Value="View2">
<Setter Property="ContentTemplate" Value="{StaticResource ViewTwoTemplate}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>

منبع: وبلاگ Rachel Lim که برای یادگیری WPF و MVVM بسیار عالیست!

pipes, redirection and xargs در لینوکس

ریدارکشن برای ارسال خروجی به یک فایل یا استریم استفاده می‌شه. (ریدایرکت کردن stdout یا stderr)
$ thing1 > thing2
برنامه thing1 اجرا شده و خروجی اون به فایل thing2 ریدایرکت می‌شه.
اگر بخواهیم خروجی thing1 را به thing2 ارسال کنیم دستور به شکل زیر خواهد شد:
$ thing1 > tempFile && thing2 < tempFile
به جای کار بالا از پایپ استفاده می‌شه.
پایپ برای ارسال خروجی یک برنامه به یک برنامه دیگر استفاده می‌شه. (می‌شه از اون عنوان شکل خاص ریدایرکشن یاد کرد)
$ thing1 | thing2
بعضی وقتا بعضی برنامه‌ها استریم به عنوان ورودی قبول نمی‌کنند، و ما می‌خوایم خروجی یک فایل رو به صورت آرگومان بهشون بفرستیم از xargs استفاده می‌کنیم.
xargs میاد خروجی رو به صورت استریم (یا فایل) می‌خونه و به صورت آرگومان به برنامه‌ای که بهش می‌دیم پاس می‌ده.
مثلا
$ echo 1 2 3 4 | xargs echo
1 2 3 4
یا مثلا دستور زیر میگه که به ازای هر ۲ آرگومان یک دستور رو اجرا کن:
$ echo 1 2 3 4 | xargs -n 2
1 2
3 4
شماره فایل (یا بهتر بخوایم بگیم file descriptor) برای stdin=0 برای stdout=1 و برای stderr=2 هست و می‌تونیم خروجی هر کدوم رو به یک جایی ریدایرکت کنیم. مثلا:
$ echo test 1> outfile
همچنین با استفاده از &> می تونیم یک استریم رو به یک شماره فایل ریدایرکت کنیم. (به جای فایل)
$ echo something 1>&2 > outfile
و در نهایت اگر بخوایم خروجی رو هم به فایل بفرستیم و هم در صفحه نمایش نشون بدیم از tee استفاده می‌کنیم:
echo something | tee outfile
که معادل دستور زیره:
$ echo something | tee /dev/tty >> outfile
نتیجه اخلاقی:
# Send stderr to normal location and stdout to file.
foo >outfile1 2>&1 >outfile2

Note that that last one will not direct stderr to outfile2 - it first redirects it to what stdout was when the argument was encountered ( outfile1), and then redirects stdout to outfile2.

یعنی اینکه اول stderr رو به استریم فعلی که نقش stdout رو زمان اجرای دستور اول بازی می‌کنه، که outfile1 هست ریدایرکت می‌کنه و بعدش  stdout رو به outfile2 ریدایرکت می‌کنه. (یعنی stderr به outfile2 ریدایرکت نمی‌شه بلکه به stdout قبلی (نرمال) ریدایرکت می‌شه معمولا صفحه نمایش)
مثال زیر بهتر این نکته رو نشون می‌ده:
$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory

$ ls -ld /tmp /tnt >/dev/null 2>&1

$ ls -ld /tmp /tnt 2>&1 >/dev/null
ls: cannot access /tnt: No such file or directory

اطلاعات بیشتر [+، +، +، +، +]

مشکل کاربر sa در SQLServer Express

یه سری نکته‌های کوچیکی هست، بس که آدم کم باهاشون سروکله می‌زنه هی فراموش می‌کنه باز کلی گوگلی می‌کنه تا دوباره یادش بیاد. یکیش همین مشکل کاربر sa توی SQLServer هست.

موقعی که نسخه Express پایگاه‌داده SQLServer رو نصب می‌کنیم به صورت پیشفرض اون تیک Mixed Authentication نخورده و با اینکه پسورد رو برای sa تنظیم کردیم و فعالش هم کردیم و همه چیزش رو به راهه، باز هم لاگین نمی‌کنه. آخرش متوجه می‌شه آدم که یادش رفته این قابلیت رو فعال کنه!

بعد از انجام عملیات، سرویس رو ریست کنید.



چند نکته هنگام کار با گیت

نکته ۱: کم کردن حجم دانلود

وقتی می‌خوایم یک مخزن گیت یک پروژه خیلی بزرگ رو clone اش کنیم، معمولا این پروژه‌ها تاریخچه طولانی‌ای دارند و این باعث می‌شه که حجم دانلود ما خیلی افزایش پیدا کنه. مثلا پروژه‌ای که ۱۰ مگ هست یهو می‌شه ۲۵۰ مگ. این در حالیه که ما فقط نسخه جاری برنامه رو می‌خوایم و به تاریخچه‌ش اصلا کاری نداریم. در این حالت می‌تونیم از پارامتر depth به شکل زیر استفاده کنیم:

git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev

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

git clone --depth 1 --branch master https://github.com/sqlmapproject/sqlmap.git sqlmap-dev

نکته ۲: ست کردن پراکسی به صورت موقت

با توجه به بسته بودن درهای خیلی از سایت‌ها مثل گوگل کد به روی ایرانیان، گاهی لازم می‌شه که از یک پراکسی برای دور زدن این محدودیت‌ها استفاده کنیم. برای استفاده از پراکسی هنگامی که می‌خوایم یک مخزن رو clone کنیم دو راه وجود داره:

یکی اینکه یه متغیر محیطی (Environment Variable) به نام http_proxy (یا https_proxy بسته به پروتکل سرویس‌دهنده گیت) ست کنیم توی شل جاری. مثلا توی محیط cmd در ویندوز:

set http_proxy = 127.0.0.1:1337

یا در لینوکس:

http_proxy = 127.0.0.1:1337
export $http_proxy

این تنظیمات تا زمانی که session فعلی فعاله یا اینکه دستی پاکش نکردیم، برقراره.


روش دیگه اینه که قبل از clone کردن پارامتر http.proxy (یا https.proxy) رو با دستور config ست کنیم و بعد از اون دوباره پاکش کنیم.

## set proxy
$ git config --global http.proxy http://proxyuser:proxypwd@proxy.server.com:8080

## clone the repo
git clone https://github.com/sqlmapproject/sqlmap.git sqlmap-dev

## unset proxy
git config --global --unset http.proxy

اطلاعات بیشتر [+,+]

رادیوی آماتوری

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

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

اگه خدا بخواد قصد دارم مقدمات راه اندازی شبکه‌های رادیویی آماتور رو یاد بگیرم. اولین کاری که کردم یه جستجو در گوگل بود. پس از کمی جستجو به این نتیجه رسیدم فعلا در ایران از این تکنولوژی حمایتی نمی‌شه. (پست وبلاگی مرثیه‌ای بر رادیو آماتوری، سایت رگولاتوری و اسناد پوسیده، اطلاعیه رگولاتوری مبنی بر اینکه هیچ گونه پروانه رادیوی آماتوری صادر نخواهد شد [به روز رسانی ۹تیر ۹۳] اطلاعیه رو برداشتن و عوضش موارد امتحانی رو گذاشتن ولی هنوز خبری از آزمون نیست)

از لحاظ حقوقی هر کسی می‌تونه یک ایستگاه رادیویی آماتوری راه بندازه به شرطی که پروانه اون رو بگیره که شرایطش اینه (فصل ۲ ماده  ۴۴ آئین‌نامه اجرائی قانون استفاده از بیسیم‌های اختصاصی و غیرحرفه‌ای (آماتوری)) :

الف  -  داشتن حداقل  16 سال تمام.

ب- صلاحیت اخلاقی و سیاسی به تأیید مقامات ذی‌صلاح کشور.

ج- قبولی در آزمون‌های کتبی و عملی مربوطه.

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

یه سری لینک‌های مفید در این زمینه:

آئین‌نامه اجرائی قانون استفاده از بیسیم‌های اختصاصی و غیرحرفه‌ای (آماتوری) و نسخه قابل خوندنش :D

صفحه اسناد و قوانین رادیویی ایران در وبسایت بی‌سیم

مجله CQ که مختص به رادیوی آماتور هست.

در حال حاضر برای تمرین از سرویس Hamsphere استفاده می‌کنم.

Hamsphere یک شبیه‌ساز رادیویی هست که با اون می‌تونید به صورت آنلاین با دیگران ارتباط برقرار کنید بدون اینکه با دردسرهای راه اندازی یک ایستگاه رادیویی سروکله بزنید.

شنایه من هم اونجا 154HS190 هست که بیشتر شب‌ها اونجا سر و کله‌ام پیدا می‌شه.

[به روز رسانی ۹تیر ۹۳]
موارد امتحانی اعلام شده توسط رگولاتوری جهت کسب گواهینامه رادیو آماتوری

حل استگانوگرافی تیم باقالی (LookMore#1)

چند وقت پیش یکی از دوستان سی‌تی‌اف باز (TMT) از تیم باقالی، یک استگانو طراحی کرد و ما رو دعوت به حلش کرد.

امضای فایل حامل، هیچ فایل مشخصی رو نشون نمی‌ده. وقتی فایل رو با یک هگز ادیتور باز می‌کنیم می‌بینیم که هیچ بایت NULL ای نداره. در عوض تعداد زیادی بایت 0x09 داره.

بعد از XOR کردن فایل یک فایل عکس به دست می‌یاد که توش نوشته Baghali. (تصویر بزرگ شده)

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

پیکسل‌های رنگی فایل، رنگ سبزشون متغیره و بقیه رنگها ثابت هستند(0xFF). اگر هیستوگرام این فایل رو بگیریم می‌بینیم که شبیه یه رشته بیتی می‌شه.

پس از تبدیل این رشته بیتی به اسکی به فلگ که FlagIs:Stego.Can.Be.Hard.Baghal می‌رسیم.

البته انجام این روند به صورت دستی کار حوصله بری هست، بنابراین ما برای انجام کل عملیات کد زدیم.

قسمت اصلی برنامه که تبدیل عکس به هیستوگرام هست به شکل زیر است:

        public static long[] GetHistogram(Bitmap picture)
        {
            var histogram = new long[256];
 
            for (int i = 0; i < picture.Size.Width; i++)
                for (int j = 0; j < picture.Size.Height; j++)
                {
                    Color c = picture.GetPixel(i, j);
                    histogram[c.G]++;
                }
 
            return histogram;
        }

در نهایت برنامه کامل که همه این کارها را از ابتدای XOR انجام می‌دهد:

سومین مطلب آزمایشی

این سومین مطلب تستی من هست که توسط خودم البته نوشته شده.

برای تست نمایش کد در وبلاگ :

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            System.Windows.Forms.Label member_IDLabel;
            System.Windows.Forms.Label loan_SerialLabel;
            System.Windows.Forms.Label amountLabel;
            System.Windows.Forms.Label payDateLabel;
            this.idLabel = new System.Windows.Forms.Label();
            this.memberLinkLabel = new System.Windows.Forms.LinkLabel();
            this.member_IDTextBox = new System.Windows.Forms.TextBox();
            this.loansDataGridView = new System.Windows.Forms.DataGridView();

عنوان دومین مطلب آزمایشی من

این متن دومین مطلب آزمایشی من است که به زودی آن را حذف خواهم کرد.

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

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

عنوان اولین مطلب آزمایشی من

این متن اولین مطلب آزمایشی من است که به زودی آن را حذف خواهم کرد.

مرد خردمند هنر پیشه را، عمر دو بایست در این روزگار، تا به یکی تجربه اندوختن، با دگری تجربه بردن به کار!

اگر همه ما تجربیات مفید خود را در اختیار دیگران قرار دهیم همه خواهند توانست با انتخاب ها و تصمیم های درست تر، استفاده بهتری از وقت و عمر خود داشته باشند.

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