تقسیم یک فایل به چند فایل کوچک‌تر با استفاده از awk

یادمه اون موقع که حرف از کامپایلر می‌زدیم، حرف از Aho هم می‌زدیم، بعدها بزرگ‌تر شدیم و وقتی از الگوریتم Aho-Corasick حرف می‌زدیم، ناخواسته از Aho حرف می‌زدیم و می‌گفتیم grep هم از Aho-Corasick استفاده می‌کنه، انقدر الگوریتم خوبیه. بزرگ‌تر شدیم و از grep استفاده می‌کردیم می‌گفتیم چیز خوبیه، خیلی بدرد می‌خوره، دمشون گرم چی نوشتن. یخورده دیگه بزرگ‌تر شدیم اومدیم از awk استفاده کنیم، دیدیم ای دل غافل اینم که Aho, Weinberger, Kernighan نوشتن. خلاصه که Aho آدم بزرگیه

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

1
awk -F, '{print $2}' input.csv

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

1
awk -F, '{print >> ($2".csv")}' input.csv

کار تمومه :) اگه ما توی فایل input.csv چهارتا دسته‌بندی داشته باشیم، با اجرای این دستور سطر‌های فایل اصلی برحسب دسته‌بندی خودشون به چهارتا فایل تقسیم می‌شن.

!!! اگه با مک کار می‌کنید و لینوکسی نیستید ی قدم دیگه هم جلوتر برید، چون توی مک فایل‌هایی که باز می‌شن تا سطری به اونها اضافه بشه خودبه‌خود بسته نمی‌شن و ما باید از دستور close برای بستن فایل استفاده کنیم وگرنه با خطای ‍makes too many open files مواجه می‌شیم.

1
awk -F, '{print >> ($2".csv"); close($2".csv")}' input.csv

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

چند خط درمورد یکی از دایرکتوری‌های XCode که فضای زیادی اشغال می‌کند

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

1
~/Library/Developer/Xcode/iOS DeviceSupport

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

ثبت تغییرات فایل‌ها بصورت خودکار توسط Git

ابزارها برای این بوجود میان که ما بتونیم به اهداف خودمون برسیم، هرچه سریعتر به هدف برسیم و خروجی بهتری داشته باشیم می‌تونیم بگیم که از ابزار مناسبی استفاده کرده بودیم.
چند وقتی بود بعضی کدها شروع کرده بودن به مفقود شدن، درست مثل اینکه یکی اونارو گروگان گرفته باشه ولی تماسی برای دریافت پول نکرده. برای همین تصمیم گرفتیم که تو اون محله شهر که کدها مفقود میشن سیستمی راه بندازیم که بطور دائم و بصورت بازه‌ای کدهارو ارسال کنه به یک سرور دیگه و بقولی بکاپ بگیره ازشون.
پس یک ریپوزیتوری گیت راه انداختیم و بکمک xargs و cron job بطور متناوب فایل‌های تغییر یافته رو به یک ریپوزیتوری تو سرور دیگه پوش می‌کنیم.
فایل زیر وظیفه کامیت و پوش کردن فایل‌های تغییر یافته رو برعهده داره

1
2
3
4
5
#!/bin/sh
cd /PATH/TO/REPO
find . | grep -i '\.r$' | xargs -i git add {}
git commit -am "modified files on `date +'%Y-%m-%d %H:%M:%S'`";
git push origin master

مهمترین یخش کد فوق، سطر سوم هست که فایل‌های با پسوند .r رو پیدا کرده و اونارو به گیت اضافه می‌کنه. گیت خودبه‌خود امکان جست‌جوی فایل‌ها در لایه‌های مختلف درون دایرکتوری‌ها رو نداره و نمی‌تونیم مستقیما به گیت بگیم هرچی فایل با پسوند .r درون فولدرها هست رو اضافه کن برای همین دست به دامان find، grep و xargs شدیم.
کد فوق رو درون یک فایل به اسم autobackup.sh ذخیره و دسترسی اجرایی بهش دادیم. در نهایت هم چون میخوایم فایل‌ها بصورت دوره‌ای بکاپ گرفته بشن یک cron job ایجاد میکنیم تا هر ساعت فایل autobackup.sh رو اجرا بکنه.
برای ایجاد یک job جدید هم کافیه دستور crontab -e رو اجرا کرده و کد زیر رو انتهای فایل اضافه کنیم.

1
0 * * * * /usr/bin /PATH/TO/autobackup.sh

تنظیمات hibernate در مک

به ندرت پیش میاد که آدم بخواد لپتاپ رو خاموش کنه، چون همیشه چیزی وجود داره که آدم میخواد تو همون حالت حفظش کنه، یک برنامه باز، یک کد ذخیره نشده یا هرچیزی که روزمره با اون سر و کار داریم. sleep توی سیستم عامل مک قابلیت خیلی مفیدی هست، که با بسته شدن در لپتاپ تمامی کامپوننت‌های لپتاپ مثل هارد و مانیتور و … غیرفعال می‌شن و تنها رم هست که همچنان توی مدار قرار میگیره تا محتویاتش حفظ بشه و با باز کردن دوباره در لپتاپ بشه بسرعت وضعیت پیشین سیستم رو بازگردانی کرد.
این قابلیت تا زمانی کاربرد داشت که لپتاپم هنوز عمری از باتریش باقی بود و می‌شد اسلیپ کرد تا هنگام نقل مکان از جایی به جای دیگه روشن بمونه، ولی نزدیک یک ماهه که باتری لپتاپ عمرش رو به بقیه کامپوننت‌ها داده و دیگه نمیشه اسلیپش کرد. برای همین روی آوردم به روش کهن hibernate.
hibernate توی مک دو حالت مختلف داره

  • حالت اول که بصورت پیش‌فرض رول لپتاپ‌ها فعاله در حقیقت همون اسلیپ هست، که تمامی کامپوننت‌های سیستم رو بجر رم غیرفعال میکنه، و محتوات رم رو روی هارد بصورت کامپرس شده دخیره میکنه تا درصورت قطع شدن منبع انرژی مطمئن باشیم که میتونیم حالت قبلی رو بازگردانی کنیم.
  • حالت دوم کل اطلاعات رم و روی هارد ذخیره میکنه و سیستم رو خاموش میکنه (همون هایبرنیت معروف که توی ویندوز کلی پرکاربرده)
  • حالت سومی هم هست که غیر فعال کردن نام داره :)

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

1
sudo pmset -a hibernatemode 25

توجه کنید که با فعال کردن این حالت اگر در لپتاپ رو ببندید سیستم خاموش میشه و زمان بازگردانی وضعیت قبلی سیستم تو این حالت طولانی‌تر از حالتی هست که رم فعاله.
اگر توی حالت دوم هستید میخواید استفاده از رو فعال کنید بجای 25 مقدار 3 رو در دستور بالا قرار بدید، برای غیرفعال کردن هایبرنیت هم از مقدار 0 استفاده کنید.

1
sudo pmset -a hibernatemode 3

اگه بیشتر از این کنجکاوید، به Manual دستور pmset که لینکش توی منابع مطلب هست سری بزنید.

اندازه‌گیری زمان اجرای تکه‌ ‌‌کدها در پایتون

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

1
2
3
import numpy as np;a = np.empty((1000, 1000)); a.fill(5.0)
import numpy as np;a = np.empty((1000, 1000)); a[:] = 5.0
import numpy as np;a = np.full((1000, 1000), 5.0)

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

1
2
3
4
5
6
$ python -m timeit "import numpy as np;a = np.empty((1000, 1000)); a.fill(5.0)"
10 loops, best of 3: 7.19 msec per loop
$ python -m timeit "import numpy as np;a = np.empty((1000, 1000)); a[:] = 5.0"
10 loops, best of 3: 7.24 msec per loop
$ python -m timeit "import numpy as np;a = np.full((1000, 1000), 5.0)"
10 loops, best of 3: 6.87 msec per loop

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

1
2
import timeit
timeit.timeit("import numpy as np;a = np.empty((1000, 1000)); a.fill(5.0)", number=1000)

مخفی کردن فایل‌های خاص در اتم، سابلایم و ویژال استدیو کد

چند زمانی هست که با پایتون سر و کار دارم و همزمان که پایتون کد میزنم از VSCode و Atom برای کد نوشتن استفاده میکنم، چیزی که در هردو ویرایشگر بصورت مشترک وجود داره و آزار دهنده‌است، نشون دادن فایل‌های .pyc توی لیست فایل‌های پروژه در نوار کناری ویرایشگر هست. برای این میگم اتم و وی‌اس‌کد این رو دارند، چون توی سابلایم‌تکست بصورت پیش‌فرض این فایل‌های مخفی شدند و در لیست فایل‌های نمایش داده نمی‌شوند. خب روده درازی کافیه برای سراغ کار:

Atom

بخش تنظیات اتم همونطور که دیدید گرافیکی هست، به بخش تنظیمات برید (میانبر ctrl+, یا cmd+, ) و در بخش core دنبال فیلد متنی با عنوان Ignored Names بگردید به انتهای اون فیلد عبارت , *.pyc رو اضافه کنید. اگه قصد مخفی کردن فایل‌‌های دیگه‌ای رو هم دارید میتونید عبارت منظم مربوط به تشخیص اون فایل رو هم به این فیلد اضافه کنید، فقط توجه داشته باشید که عبارات منظم نوشته شده توی این فیلد با ویرگول از هم جدا می‌شوند

Atom Ignored Names

Visual Studio Code

در ویژال استدیو کد تنظیمات بصورت متنی و به فرمت json هست و برای مخفی کردن فایل‌های .pyc تنها کافیه به بخش تنظیمات برید (میانبر ctrl+, یا cmd+, ) و کد زیر رو به تنظیمات خودتون اضافه کنید.

1
2
3
"files.exclude": {
"**/*.pyc": true
}

اگه قصد مخفی کردن فایل‌های دیگه‌ای هم هستید متونید مثل کد بالا عمل کنید و پترن مربوط به فایل‌های مدنظر خودتون رو بنویسید.

Sublime Text

قبلا هم گفتم که سابلایم‌تکست خودش بصورت پیش‌فرض فایل‌های .pyc رو مخفی می‌کنه، دلیل که اینجا سابلایم رو هم آوردن اینه که اگه قصد داشتید فایل‌های خاص دیگه‌ای رو مخفی کنید با تنظیمات این ویرایشگر هم کمی آشنا باشید. به بخش تنظیمات برید (میانبر ctrl+, یا cmd+, ) و کد زیر رو به تنظیمات خودتون اضافه کنید.

1
"file_exclude_patterns": ["*.pyc", "*.pyo", "*.exe", "*.dll", "*.obj","*.o", "*.a", "*.lib", "*.so", "*.dylib", "*.ncb", "*.sdf", "*.suo", "*.pdb", "*.idb", ".DS_Store", "*.class", "*.psd", "*.db", "*.sublime-workspace"]

کد بالا تنظیات پیش‌فرضی هست که سابلایم داره و من فقط همون مقدار پیش‌فرض رو اینجا نوشتم، همونطور که خودتون میبینید *.pyc هم جزو پترن‌های مخفی کردن فایل‌ها هست.

NginX: Redirect http requests to https

تو جهان حاضر بعیده کسی دستی تو وب داشته باشه و از خواص امنیتی داشتن SSL آگاه نباشه، امروزه دیگه HTTPS یک نیاز برای سایت‌ها محسوب میشه. برای همین هم سایت‌هایی مثل letsencrypt.org بوجود اومدن تا به افراد بی‌بضاعتی مثل ما که توانایی خرید گواهینامه SSL نداریم کمک کنند. در کل SSL چیز خوبیه که داشته باشیم، البته بگذریم از این که درستش این بود که HTTP وجود نداشت و همه چی HTTPS بود، ولی ما کاری به این کارا نداریم.
اگه گواهینامه معتبری برای دامنه خودتون ندارید پیشنهاد میکنم حتما سری به letsencrypt.org بزنید و یک گواهینام معتبر برای خودتون بگیرید. این گواهینامه‌ها البته محدودیت زمانی دارند ولی تو خود سایت راه رو نشون داده که چجوری خیالتون از منقضی نشدنش راحت بشه.

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

چگونه از electron برای ایجاد یک برنامه استفاده کنیم

اتفاقات زیادی تو زندگی میوفته که باعث میشه آدم تصمیماتش رو تغییر بده، این پست و کلا پست جدید تو بلاگ قرار نبود تا تموم شدن برنامه‌ای که میخوام بسازم نوشته بشه، پیش خودم تصمیم گرفته بودم که پست جدید رو بعد از تموم شدن darling مینویسم. (دارلینگ اسم برنامه‌ای هست که قصد دارم بعنوان واسط کاربری مدیریتی برای hexo بنویسم و در حال حاضر فقط بخش‌هاییش رو پیاده سازی کردم و نیازمند بسی تغییره)
البته موضوع پست چندان بیربط به این برنامه نیست و اینکه این پست رو هم دارم با نسخه خیلی اولیه darling مینویسم که فعلا نقشnotepad رو داره :) توی این پست قراره نحوه راه اندازی الکترون و اجرای یک کد خیلی کوچک توی اون رو با هم ببینیم.
بدون هیچ حرف دیگه‌ای بریم سراغ کارامون

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

چگونه سطح دسترسی فایل‌ها را به کمک گیت به حالت اولیه برگردانیم

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

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

ایجاد mappingهای پیش‌فرض برای ایندکس‌ها در الاستیک‌سرچ

الاستیک سرچ یک موتور جست‌جوی رایگان و قدرتمند هست که قابلیت‌های بسیاری داره و میشه از اون در موارد زیادی استفاده کرد با کمی سرچ می‌تونید با کاربرد‌های مختلف اون آشنا بشید.
الاستیک برای اینکه بتونه داکیومنت‌هارو درون خودش نگه داره و بدونه که چجوری باید درون اون‌ها جست‌وجو کنه نیازمند یک mapping هست که توسط مدیر سیستم ایجاد میشه. این mapping مشخص میکنه که کدوم فیلد چه کاربردی داره، نوعش چی هست و چجوری باید index بشه، اصلا index بشه یا نه، چجوری آنالیز بشه، اینکه در سرچ کلی نقش داشته باشه یا نه و … . هر مجموعه‌ای که به الاستیک اضافه میشه (الاستیک این مجموعه‌ها رو index نامگذاری میکنه) باید دارای یک مپ باشه تا الاستیک بدونه که چجوری باید با داکیومنت(داده)های درون اون برخورد کنه. پس یعنی شما موظف هستید که پیش از اضافه کردن داده به index یک mapping برای اون index بسازید.

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