<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Abolfazl Ziaeemehr</title>
        <link>https://virgool.io/feed/@a.ziaeemehr</link>
        <description>نوشته های من درباره برنامه نویسی و علوم اعصاب محاسباتی</description>
        <language>fa</language>
        <pubDate>2026-06-07 08:19:26</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/10000/avatar/avatar.png?height=120&amp;width=120</url>
            <title>Abolfazl Ziaeemehr</title>
            <link>https://virgool.io/@a.ziaeemehr</link>
        </image>

                    <item>
                <title>تبدیل دفترچه‌های یادداشت به اسکریپت‌های پایتون و بالعکس، روش تمیز</title>
                <link>https://virgool.io/codenevis/%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D8%AF%D9%81%D8%AA%D8%B1%DA%86%D9%87-%D9%87%D8%A7%DB%8C-%DB%8C%D8%A7%D8%AF%D8%AF%D8%A7%D8%B4%D8%AA-%D8%A8%D9%87-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%D9%87%D8%A7%DB%8C-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%88-%D8%A8%D8%A7%D9%84%D8%B9%DA%A9%D8%B3-%D8%B1%D9%88%D8%B4-%D8%AA%D9%85%DB%8C%D8%B2-sw6krl8u8jk8</link>
                <description>برای مستند سازی و تهیه راهنمای استفاده از پکیج اضافه کردن دفترچه یادداشت به مخزن گیتهاب و دنبال کردن تغییرات اون معمولا کار تمیزی نیست. گاهی با باز کردن فایل دفترچه یادداشت نیاز هست دوباره تغییرات به مخزن اضافه بشه. برای رفع این مشکل راه های مختلفی پیشنهاد شده. مثلا حذف کردن متادیتاها از نوتبوک. پاک کردن نتایج از نوتبوک یا استفاده از jupytext.  هر کدام از اینها معایب و مزایایی دارن. علاوه بر این ها هم ممکن هست بخواهیم اسکریپت رو در کولب اجرا کنیم و بنابراین زحمت ساخت سلول های زیاد با کپی کردن های بخش هایی از کد را به خود ندهیم. اسکریپت زیر یک راه تمیز برای تبدیل دفترچه یادداشت به اسکریپت پیشنهاد میدهد. در حالی که خط های اضافی جدا کننده‌ی سلول ‌ها و خط های خالی اضافی را هم پاک میکند.import re
import nbformat
from nbconvert import PythonExporter

def j2p(notebookPath, modulePath):

 with open(notebookPath) as fh:
        nb = nbformat.reads(fh.read(), nbformat.NO_CONVERT)

    exporter = PythonExporter()
    source, meta = exporter.from_notebook_node(nb)
 
 # remove lines start with `# In[` from source
    source = re.sub(r&#039;^# In\[[0-9 ]*\]:\n&#039;, &#039;&#039;, source, flags=re.MULTILINE)
 
 # replace more that 1 empty lines with 1 empty line
    source = re.sub(r&#039;\n{2,}&#039;, &#039;\n\n&#039;, source)

 with open(modulePath, &amp;quotw+&amp;quot) as fh:
        fh.writelines(source)

j2p(&amp;quotsample.ipynb&amp;quot, &amp;quotsample.py&amp;quot)برای تبدیل اسکریپت به دفترچه یادداشت هم :p2j -o sample.py</description>
                <category>Abolfazl Ziaeemehr</category>
                <author>Abolfazl Ziaeemehr</author>
                <pubDate>Mon, 15 Apr 2024 12:18:04 +0330</pubDate>
            </item>
                    <item>
                <title>برداری سازی در JAX</title>
                <link>https://virgool.io/codenevis/%D8%A8%D8%B1%D8%AF%D8%A7%D8%B1%DB%8C-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%AF%D8%B1-jax-jlyk54bvah4n</link>
                <description>مطالعهٔ بهینه‌سازی محاسبات عددی برای کارایی بهینه، به ویژه در محاسبات علمی و یادگیری ماشین بسیار ضروری هست. در این مطلب، به بررسی روش‌های مختلف برای افزایش سرعت محاسبه با استفاده از کتابخانهٔ JAX، یک کتابخانهٔ برای محاسبات عددی و تفاضل‌پذیری خودکار، می‌پردازیم. روش های بردارسازی ساده، دستی با استفاده از einsum و خودکار با استفاده از vmap، را بررسی میکنیم و در نهایت، با استفاده از  JIT، که Just-In-Time نامیده می‌شود، عملکرد تابع را بهبود میدیم.نکته مورد توجه در این مطلب این هست که چطور میشه بدون دست زدن به تابع اولیه اون را برای اعمال روی ابعاد بالاتر مناسب سازی کنیم و در عین حال مراقب عملکرد بهینه محاسبات هم باشیم.یک سری جاها برای نداشتن معادل فارسی مناسب یا انتقال بهتر مفهوم از کلمات انگلیسی استفاده کنم. در واقع بعضی ترجمه های فارسی احتمالا به گوشمون نا‌آشناست. همراه باشینdef dot(v1, v2):
    return jax.numpy.dot(v1, v2)Naively vectorizing - برداری سازی ساده با لیستdot_naive =[dot(v1, v2) for v1, v2 in zip(v1s, v2s)]اینجا به اصطلاح یک list comprehension داریم که محاسبات را برای هر یک از سطرهای بردار v1s  و v2s انجام میدهد. فرض کردیم v1s یک آرایه دو بعدی هست. چیزی شبیه این:from jax import random
rng_key = random.PRNGKey(42)
vs = random.normal(rng_key, shape=(1000,3))
v1s = vs[:500, :]
v2s = vs[500:, :]Manual vectorizing - بردارسازی دستیdef dot_vectorized(v1s, v2s):
    return jnp.einsum(&amp;quotij,ij-&gt;i&amp;quot, v1s, v2s)در این روش از تابع جمع اینشین  einsum استفاده میکنیم که به عنوان چاقوی سویسی هم شناخته میشه و کاربردهای زیادی در کتابخانه numpy داره. لازمه برداری سازی دستی این هست که تابع اولیه را بازنویسی کنیم. اما آیا راهی وجود داره که بدون دست زدن به تابع اولیه اون رو برای اعمال روی بردار ها یا آرایه های با ابعاد بیشتر هم بهینه کنیم؟Automatic vectorizing -  برداری سازی خودکارdot_vmapped = jax.vmap(dot)برداری سازی با vmap  اجازه میده تابع را برای batch های ورودی به کار ببریم. یعنی همون ورودی با آرایه های با ابعاد بیشتر که در اینجا دو بعد داریم. تابع vmap  به طور پیشفرض بعد اول آرایه های ورودی را به عنوان batching dimension در نظر میگیره که البته قابل ویرایش هست.زمان گیری%timeit [dot(v1, v2) for v1, v2 in zip(v1s, v2s)]
%timeit dot_vectorized(v1s, v2s).block_until_ready()
%timeit dot_vmapped(v1s, v2s).block_until_ready()
5.15 ms ± 54.3 µs per loop
135 µs ± 171 ns per loop
543 µs ± 1.38 µs per loopهمون طور که میبینیم هنوز برداری سازی دستی عملکرد بهتری داره.اما با اضافه کردن jit این اختلاف از بین میره dot_vectorized_jitted = jax.jit(dot_vectorized)
dot_vmapped_jitted = jax.jit(dot_vmapped)
6.5 µs ± 12.9 ns per loop
6.39 µs ± 13.4 ns per loopبه طور خلاصه ترکیب استفاده از jit و vmap میتونه عملکرد تابع را به خوبی بهبود بده و اون رو بدون نیاز به ویرایش برای استفاده روی ورودی های با ابعاد بالاتر مناسب کنه.برای دسترسی به نوتبوک می تونید به اینجا نگاه کنید.این مطلب خلاصه ای بود از فصل vectorizing کتاب deep learning in jax.</description>
                <category>Abolfazl Ziaeemehr</category>
                <author>Abolfazl Ziaeemehr</author>
                <pubDate>Thu, 14 Mar 2024 02:10:25 +0330</pubDate>
            </item>
                    <item>
                <title>کاهش زمان بارگیری اولیه در جولیا (sysimage)</title>
                <link>https://virgool.io/coderlife/%DA%A9%D8%A7%D9%87%D8%B4-%D8%B2%D9%85%D8%A7%D9%86-%D8%A8%D8%A7%D8%B1%DA%AF%DB%8C%D8%B1%DB%8C-%D8%A7%D9%88%D9%84%DB%8C%D9%87-%D8%AF%D8%B1-%D8%AC%D9%88%D9%84%DB%8C%D8%A7-sysimage-ki4kpdi5wuz4</link>
                <description>یک sysimage فایلی است که حاوی بسته های بارگیری شده و کدهای کامپایل شده و ... است.با شروع Julia همراه با یک sysimage جلسات (session) های ذخیره شده بارگیری می شوند. مزیت استفاده از sysimage این هست که زمان بارگیری اولیه بسته ای که به sysimage اضافه شده حذف می شود. عیب استفاده از اون هم این هست که پکیج در حالت قفل شده می ماند و امکان آپدیت کردن آن وجود ندارد.  اگر پکیج مورد نظر نیاز به آپدیت داشته باشد باید پس از به روز رسانی مجدد sysimage ساخته شود.ایجاد sysimage با استفاده از بسته ی PackageCompilerبه طور خلاصه با استفاده از دستورات زیر میشه یک فایل sysimage.so بسازید.یک مسیر برای فایل ایجاد کنید:$ mkdir sysimages
$ cd sysimagesجولیا را اجرا کنید. -q فقط برای باز کردن محیط بدون بنر (به حالت quiet) هست.$ julia -q پکیج PackageCompiler را صدا بزنید.  اگر نصب نشده ابتدا نصب کنید.julia&gt; #import Pkg
julia&gt; # Pkg.add(&amp;quotPackageCompiler&amp;quot)
julia&gt; using PackageCompiler یک براکت تایپ کنید تا به محیط REPL بروید.julia&gt; ]  # ptess ] to go to REPL environment(v1.4) pkg&gt; activate .یک backspace بزنید تا از این محیط خارج شوید.حالا بسته های مورد نظر رو اضافه و بعد بارگیری کنید. (اگر از قبل نصب کرده باشید هم لازم هست که مجدد اضافه کنید تا به لیست محیط فعال اضافه بشه.)(v1.4) add DifferentialEquations
(v1.4) add OhMyREPL
julia&gt; using DifferentialEquations
julia&gt; using OhMyREPLدر انتها هم فایل sysimage.so را بسازید. این کار ممکنه چند دقیقه طول بکشد بنابراین صبور باشید.PackageCompiler.create_sysimage([:OhMyREPL, :DifferentialEquations]; sysimage_path=&amp;quotsysimage.so&amp;quot)☘️ برای استفاده از فایل sysimage.so هم اینطور عمل کنید:$ julia -J[path to sysmage.so]for example:$ julia -J/home/abolfazl/sysimages/sysimage.soحالا با بارگیری کردن بسته هایی که از قبل به فایل .so اضافه کرده اید تفاوت زمان بارگیری پکیج ها را احساس کنید.میتونید به جای ایجاد فایل sysimage در یک مسیر دلخواه اون رو جایگزین حالت پیشفرض کنید. بنابراین جولیا به طور پیشفرض در هنگام شروع از اون فایل استفاده میکنه. این ویژگی با اضافه کردن replace_default=trueبه دستور create_sysimage قابل استفاده است.اینجا بیشتر بخوانید.کانال تلگرامی: scientific_programming@</description>
                <category>Abolfazl Ziaeemehr</category>
                <author>Abolfazl Ziaeemehr</author>
                <pubDate>Thu, 14 May 2020 13:41:57 +0430</pubDate>
            </item>
                    <item>
                <title>تفاوت عملگر یکسانی (is)  و عملگر تساوی (==) در پایتون</title>
                <link>https://virgool.io/@a.ziaeemehr/%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D8%B9%D9%85%D9%84%DA%AF%D8%B1-%DB%8C%DA%A9%D8%B3%D8%A7%D9%86%DB%8C-is-%D9%88-%D8%B9%D9%85%D9%84%DA%AF%D8%B1-%D8%AA%D8%B3%D8%A7%D9%88%DB%8C-%D8%AF%D8%B1-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-ohlwcfiox9jq</link>
                <description>تفاوت کوچکی بین عملگر یکسانی (is) با عملگر تساوی (==) وجود دارد.عملگر تساوی مقدار یا تساوی دو شی را مقایسه می کند اما عملگر یکسانی is چک می کند آیا دو مغیر به نقطه یکسانی در حافظه اشاره میکنند یا خیر.مثال:&gt;&gt;&gt; a = &#039;hello world&#039;&gt;&gt;&gt; b = &#039;hello world&#039;چک کردن عملگر یکسانی:&gt;&gt;&gt; a is bFalseچک کردن محل ذخیره متغیر در حافظه:&gt;&gt;&gt; id(a)1603648396784&gt;&gt;&gt; id(b)1603648426160چک کردن عملگر تساوی:&gt;&gt;&gt; a==bTrueاینجا بیشتر بخوانید.</description>
                <category>Abolfazl Ziaeemehr</category>
                <author>Abolfazl Ziaeemehr</author>
                <pubDate>Wed, 05 Feb 2020 09:56:38 +0330</pubDate>
            </item>
                    <item>
                <title>آزمایش عدالت اجتماعی در میمون</title>
                <link>https://virgool.io/@a.ziaeemehr/%D8%A2%D8%B2%D9%85%D8%A7%DB%8C%D8%B4-%D8%B9%D8%AF%D8%A7%D9%84%D8%AA-%D8%A7%D8%AC%D8%AA%D9%85%D8%A7%D8%B9%DB%8C-%D8%AF%D8%B1-%D9%85%DB%8C%D9%85%D9%88%D9%86-zsnltcv5kvxe</link>
                <description>آزمایش رفتارهای اخلاقی در مورد حیوانات از زمینه های مورد علاقه دانشمندان در زمینه علوم اعصاب هست.دانشمندی هست به نام فرانس د وال که آزمایشی رو طراحی کرده که در اون به دو میمون (Macaque) به ازای رفتار مشابه  جایزه متفاوتی میده. این رفتار باعث اعتراض میمون شده و ...داشتم به این فکر میکردم که حتی حیوانات هم نسبت به بی عدالتی اجتماعی واکنش نشان میدهند و ساکت نمی شینند. ما چرا این خاصیت در رفتار شناختی خودمون رو گاهی فراموش میکنیم؟اگه فیلم دو دقیقه ای این آزمایش رو میخواهید ببینید اینجا رو نگاه کنید.برای سخنرانی کامل هم به سایت TED مراجعه کنید.ویدیوی فانی هست حداقل لبخند رو به لبتون میاره :)</description>
                <category>Abolfazl Ziaeemehr</category>
                <author>Abolfazl Ziaeemehr</author>
                <pubDate>Sat, 15 Jun 2019 21:43:26 +0430</pubDate>
            </item>
                    <item>
                <title>ضرب ماتریسی ده بار سریع تر</title>
                <link>https://virgool.io/@a.ziaeemehr/%D8%B6%D8%B1%D8%A8-%D9%85%D8%A7%D8%AA%D8%B1%DB%8C%D8%B3%DB%8C-%D8%AF%D9%87-%D8%A8%D8%A7%D8%B1-%D8%B3%D8%B1%DB%8C%D8%B9-%D8%AA%D8%B1-w44dfsrxd4dj</link>
                <description>اگه با محاسبات جبر خطی سر و کار دارید  ادامه این مطلب رو بخونید... از ما گفتن بود.eigenکتابخانه eigen یک کتابخانه بهینه شده و خوش ساخت برای ++C هست که کارهای محاسبات جبر خطی رو انجام میده. شامل یه سری header file هست و کار کردن با اون راحته. راهنمای کاملی داره و از همه مهم تر بهینه است و سرعت محاسبات رو به شدت افزایش میده.برای نصب اون کافیه در اوبونتو  این دستور رو بزنید: sudoaptinstalllibeigen3-dev در واقع اگه نیاز به نصب نداره و این دستور فقط header file ها رو در مسیر جستجوی کامپایلر کپی میکنه.فیلم نحوه کار کردن با این کتابخونه رو در اینجا اوردم و فایل کد رو هم اینجا قرار دادم.مثال در مورد ضرب دو تا ماتریس هست و سرعت محاسبه نسبت به ضرب ماتریسی دست نویس ده برابر سریع تر است. یه دلیل سرعت محاسبات می تونه این باشه که در واقع Cache miss ها رو کاهش داده و سرعت رو بالا برده .</description>
                <category>Abolfazl Ziaeemehr</category>
                <author>Abolfazl Ziaeemehr</author>
                <pubDate>Sat, 15 Jun 2019 21:24:09 +0430</pubDate>
            </item>
                    <item>
                <title>چهارصد بار سریع تر داده ها رو بخوانید (فایل باینری)</title>
                <link>https://virgool.io/codenevis/%DA%86%D9%87%D8%A7%D8%B1%D8%B5%D8%AF-%D8%A8%D8%A7%D8%B1-%D8%B3%D8%B1%DB%8C%D8%B9-%D8%AA%D8%B1-%D8%AF%D8%A7%D8%AF%D9%87-%D9%87%D8%A7-%D8%B1%D9%88-%D8%A8%D8%AE%D9%88%D8%A7%D9%86%DB%8C%D8%AF-%D9%81%D8%A7%DB%8C%D9%84-%D8%A8%D8%A7%DB%8C%D9%86%D8%B1%DB%8C-nid1zyy3oa9j</link>
                <description>کانال scientific_programmingگاهی خوندن  داده ها از فایل متنی  خودش کلی وقت میگیره.  یه راه معمول استفاده از فایل باینری هست. در واقع من تو سی پلاس پلاس داده ها رو تولید و در فایل باینری ذخیره میکنم و با یه اسکریپت پایتون اون ها رو می خونم. فیلم این کار رو اینجا قرار دادم و بخشی از کد رو اینجا میارم. https://gist.github.com/Ziaeemehr/54dc15e05245aa9a6eb6025466d7dcf6 تا اینجا فایل خروجی رو به ایجاد کردم و تعیین کردم که می خواهم داده رو به صورت باینری ذخیره کنم. برای خواندن فایل باینری فقط کافیه از این دستور پایتون را استفاده کنیم: https://gist.github.com/Ziaeemehr/c28abe5fdc86a1cc07889671bbf574b7 همین! کد کامل به همراه زمان گیری رو می تونید از اینجا پیدا کنید. </description>
                <category>Abolfazl Ziaeemehr</category>
                <author>Abolfazl Ziaeemehr</author>
                <pubDate>Fri, 14 Jun 2019 22:46:04 +0430</pubDate>
            </item>
                    <item>
                <title>به جای ssh از mosh استفاده می کنم</title>
                <link>https://virgool.io/@a.ziaeemehr/%D8%A8%D9%87-%D8%AC%D8%A7%DB%8C-ssh-%D8%A7%D8%B2-mosh-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D9%85%DB%8C-%DA%A9%D9%86%D9%85-qp4onwlpvqla</link>
                <description>این اولین یادداشت من تو ویرگول هست.  صرفا برای اینکه بعضی چیزها رو بهتر بفهمم و اینکه بتونم تجربه های جالبی که باهاش مواجه میشم رو با بقیه به اشتراک بذارم مطلب می نویسم. امیدوارم به کارتون بیاد.اگه برای کار روی سرور دور از ssh استفاده می کنید.میتونید به جای ssh username@ipاز mosh username@ipاستفاده کنیدتفاوتش اینه که اگه اتصال اینترنت قطع بشه  بر خلاف استفاده از  ssh  پنجره ترمینال هنگ نمیکنه و پیغامی میده که متوجه بشید اتصال قطع شده و اگه اینترنت وصل شد لازم نیست دوباره login کنید. خودش وصل میشه.sudo apt install moshروی سیستم خودتون و سروری که میخواهید بهش وصل بشید باید نصب باشه. اگه اتصال رو با ssh-keygen بدون رمز ورودی کرده باشید راحتی کار رو بیشتر هم میکنه.moshhttps://t.me/PyCpp_channelhttps://www.aparat.com/ziaeemehr</description>
                <category>Abolfazl Ziaeemehr</category>
                <author>Abolfazl Ziaeemehr</author>
                <pubDate>Sun, 05 May 2019 23:49:21 +0430</pubDate>
            </item>
            </channel>
</rss>