<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>پست‌های انتشارات پوشه</title>
        <link>https://virgool.io/pushe-co/feed</link>
        <description>اینجا اعضای خانواده پوشه برای شما می نویسن.</description>
        <language>fa</language>
        <pubDate>2026-06-10 14:21:33</pubDate>
        <image>
            <url>https://files.virgool.io/upload/publication/eknan82wncu8/trrn7c.png</url>
            <title>پوشه</title>
            <link>https://virgool.io/pushe-co</link>
        </image>

                    <item>
                <title>رگولار اکسپرشن (Regular expression) به زبان ساده</title>
                <link>https://virgool.io/pushe-co/%D8%B1%DA%AF%D9%88%D9%84%D8%A7%D8%B1-%D8%A7%DA%A9%D8%B3%D9%BE%D8%B1%D8%B4%D9%86-regular-expression-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-irhenxxexy5h</link>
                <description>رگولار اکسپرشن چیست؟مجموعه ای از کاراکترها و علائمی است که می توان با آن قسمتی از یک عبارت، یا نوشته را به اصطلاح Match کرد (قسمتی از عبارت که با پترن مذکور مرتبت می باشد را با آن پیدا کرد).چه استفاده هایی دارد؟از رگولار اکسپرشن می توان در validate کردن فیلد های فرم، برای اطمینان از اینکه پسوردی که کاربر وارد می کند شامل یکسری حروف و یا پترنی که ما می خواهیم باشد، برای استخراج تکه ای از یک عبارت، برای پیدا کردن قسمتی از لاگ یک وب‌سرور که به دنبالش هستیم و ...استفاده کرد.به چه روشی می توان از آن استفاده کرد؟تمامی زبان های برنامه نویسی کلاس ، آبجکت و یا توابعی برای کار کردن با رگولار اکسپرشن دارند که می توان با مراجعه به راهنمای آن‌ها از نحوه استفاده از آنها مطلع شد.نکاتی راجب ادامه این پستدر ادامه از ترجمه اسامی کاراکترهای رگولار اکسپرشن به دلیل اینکه دانستن نام انگلیسی آنها الزامی است خودداری می کنم.در طول توضیحات از کلمه match زیاد استفاده می شود که معنایش آن است که یک عبارت با یک عبارت دیگر برابر و یکسان باشد.همچنین منظور از کارکتر یعنی هر حرف انگلیسی یا هر عدد و یا هر علامتی که معمولا روی تمامی کیبورد های استاندارد وجود دارد.در مثال های زیر پترن regular expression که به اختصار regex هم نوشته می شود را در داخل &quot;...&quot; نوشته ام ولی مثلا در جاوا اسکریپت این پترن در داخل  /.../ نوشته می شود.در ضمن به خاطر محدودیت ادیتور ویرگول در مثال هایی که در ادامه خواهید دید عبارات match شده درون مثال ها در داخل دو * نمایش داده میشوند.آموزش Regular expression1. Basic Matchersبه طور کلی کاراکترهای انگلیسی و عددها به خودی خود یک پترن به حساب می آیند.&amp;quotregex&amp;quot =&gt; I am learning *regex* in this tutorial.2. Full stop .کاراکتر . یا همان نقطه هر تک کاراکتری را به جز new line یا همان n\ را match می کند.&amp;quot.ar&amp;quot =&gt; The *car* is *par*ked outside.3. Character set (character class)کروشه یا کمانک یا همان براکت باز و بسته [ ] که می توان مجموعه‌ای از کارکترها را درون آن قرار داد می تواند یکی از کارکترهای درون آن را در یک متن match کند.&amp;quot[pd]ark&amp;quot =&gt; This would match both *park* and *dark*.و یا می توان با استفاده از dash یا hyphen یا همان - یک range از کاراکتر ها را در داخل [ ] مشخص کرد.&amp;quot[a-c]r&amp;quot =&gt; This would match *ar* *br* *cr*نکته: Full stop یا نقطه درون [.] به معنای نقطه می باشد و نه موردی که در شماره ۲ توضیح داده شد.4. Repetitions (The start *)کاراکتر * بعد از هر کاراکتر دیگری که بیاید به معنای هیچ و یا بیشتر تکرار کارکتری که بعد از آن آمده می باشد. به معنای ساده تر مثلا *a یعنی که یا a وجود ندارد و یا می تواند یکبار و یا بیشتر در کلمه یا عبارت وجود داشته باشد.&amp;quotca*r&amp;quot =&gt; *cr* *car* *caaar* *caaaar*5. Repetitions (The Plus +)کاراکتر + بعد از هر کاراکتر دیگری که بیاید به معنای یک یا بیشتر تکرار کاراکتری است که بعد از آن آمده می باشد.&amp;quotca+r&amp;quot =&gt; cr *car* *caar*6. Braces ( quantifiers {} )این کاراکتر به معنای تعداد تکرار کاراکتر و یا گروه پیش از خودش می باشد مثلا {3,2}[9-0] یعنی حداقل دو عدد و حداکثر سه عدد را match کن، می توان عدد دوم را حذف کرد {,3}[9-0] که به معنای حداقل سه عدد و حداکثر بی‌نهایت و در صورتی که علامت , هم حذف شود {3}[9-0] به معنای دقیقا تکرار سه عدد می‌باشد.&amp;quot[0-9]{2,3}&amp;quot =&gt; Part of this number *992*5 and all of *23* would be mached.7. Capturing Group (...)پترنی یا در اصطلاح (sub patternی) که داخلی پرانتز نوشته می‌شود capturing group نامیده می‌شود و برای گروه بندی کردن کاراکترها می باشد و اگر بعد از یک capture group موارد ۴، ۵، ۶ را قرار دهیم کل پترن داخل آن طبق توضیحات ۳ قسمت بالا تکرار می شود. مثلا +(ab) یعنی کلی ab حداقل یک و یا بیش از یک بار تکرار می شود.نکته: در برخی از زبان‌های برنامه نویسی مثلا جاوااسکریپت و پایتون توابعی وجود دارد که مقدار داخلی capture group را از متن جدا می کنند و بر می گردانند و علت این نامگذاری (capture) یه همین دلیل می‌باشد.8. Non-capturing group (?: )همانند مورد بالا می باشد ولی با این تفاوت که هیچ مقداری را از داخلی متن match شده باز نمی گرداند.&amp;quotc(?:ar)&amp;quot =&gt; *car* *car*bon9. Alternation  |کاراکتر | یا همان vertical bar به معنای همان or در برنامه نویسی می‌باشد و از آن می توان در حالت ۱ (basic matchers) و یا در capturing groups یا non-capturing groups استفاده کرد. &amp;quot(T|t)he|car&amp;quot =&gt; *The car* is parked in *the* garage.10. Escaping special character  \برای استفاده کردن از برخی از کاراکترها که به عنوان کاراکتر های پیش فرض رگولار اکسپرشن هستند باید آنها را در اصطلاح escape کرد و بدین معنا که قبل از آنها از escape character یا همان \ استفاده کرد.کاراکتر های پیش فرض رگولار اکسپرشن که باید آنها را escape کرد: { } [ ] / \ + * . $ ^ | ?&amp;quotmat\.&amp;quot =&gt; The fat cat sat on the *mat.*11. Caret  ^قرار دادن کاراکتر ^ در ابتدای یک پترن به معنای این است که عبارت با کاراکتر مذکور باید در ابتدای متن یا عبارتی که می خواهیم match کنیم باشد.&amp;quot(T|t)he&amp;quot =&gt; *The* car is parked in *the* garage.&amp;quot^(T|t)he&amp;quot =&gt; *The* car is parked in the garage.نکته: قرار دادن این کاراکتر در ابتدای [ ^] به معنای عکس مقادیری است که درون [ ] قرار دارد.12. Dollar  $قرار دادن کاراکتر $ در انتهای یک پترن به معنای این است که عبارت با کاراکتر آخری که $ بعد از آن آمده باید در انتهای عبارتی که می خواهیم match کنیم باشد.&amp;quot(at\.)&amp;quot =&gt; The fat c*at.* s*at.* on the m*at.*&amp;quot(at\.)$&amp;quot =&gt; The fat cat. sat. on the m*at.*13. The Question Markکاراکتر یا همان علامت ? به معنای هیچ و یا فقط یک می باشد.&amp;quot[T]he&amp;quot =&gt; *The* car is parked in *the* garage.&amp;quot[T]?he&amp;quot =&gt; *The* car is parked in t*he* garage.14. Shorthand Character Setsرگولار اکسپرشن یک سری کاراکترهای مختصر برای match کردن یک سری از پترن های پرکاربر دارد.کاراکتر . یا همان full stop که هر کاراکتری به جز n\ را match می‌کندکاراکتر w\ که کاراکتر های به اصطلاح alphanumeric را match می‌کند [a-zA-Z0-9_]کاراکتر W\ که کاراکتر های به اصطلاح non-alphanumeric را که عکس مورد قبل می باشد را match می کند.کاراکتر d\ که اعداد ۰ تا ۹ را match می کند [9-0]کاراکتر D\ که کاراکتر های غیر از عدد را match می کندکاراکتر s\ که همان whitespace را match می کندکاراکتر S\ که non-whitespace یا عکس مورد بالا را match می کند15. Lookaroundsدارای ۴ حالت زیر می باشدPositive Lookahead (?= )Negative Lookahead (?! )Positive Lookbehind (?&lt;= )Negative Lookbehind (?&lt;! )حالت Positive Lookahead چک می کند که پترن داخل آن حتما باید بعد از پترنی که می خواهیم match کنیم قرار داشته باشد به معنای دیگر این ۴ حالت چک می کنند که پترنی که می خواهیم match کنیم باید بعد یا قبل شان یک پترن (داخل lookaround) وجود داشته باشد یا وجود نداشته باشد.مثلا در (the(?=\sfat کلمه the فقط زمانی match می شود که بعد از آن حتما fat وجود داشته باشد.&amp;quot(T|t)he(?=\sfat)&amp;quot =&gt; *The* fat cat sat on the mat.حالت Negative Lookahead دقیقا برعکس حالت قبل می باشد و در مثال (the(?=\sfat فقط the را match می کند که بعد از آن کلمه fat نباشد.&amp;quot(T|t)he(?!\sfat)&amp;quot =&gt; The fat cat sat on *the* mat.حالت Positive Lookbehind چک می کند که قبل از پترنی که می خواهیم match کنیم حتما باید یک پترنی که با ( =&gt;?) مشخص می شود پیش از آن وجود داشته باشد.&amp;quot(?&lt;=(T|t)he\s)(fat|mat)&amp;quot =&gt; The *fat* cat sat on the *mat*.و حالت آخر یعنی Negative Lookbehind هم دقیقا برعکس حالت قبل می باشد و بدین معنی که قبل از پترنی که می خواهیم match کنیم پترن مشخص شده در داخل ( !&gt;?)  نباید وجود داشته باشد تا پترن ما match شود.&amp;quot(?&lt;!(T|t)he\s)(cat|sat)&amp;quot =&gt; The cat *sat* on the mat.16. Flagsچندین کاراکتر یا در اصطلاح modifiers یا flag وجود دارند که برای کنترل کلی بر روی پترن های رگولار اکسپرشن می باشند.کاراکتر i : که به معنای Case insensitive می باشدکاراکتر g : که در اطلاح Global Search می باشد و به فارسی یعنی اینکه با پیدا کردن اولین match متوقف نشود و به دنبال موارد دیگر برای match کردن بگردد (به صورت پیش فرض regular expression اولین match ی که پیدا کند متوقف می شود)کاراکتر m : که به معنای Multiline می باشد&amp;quot/The/gi&amp;quot =&gt; *The* fat cat sat on *the* mat.سخن آخرتلاش کردم که در این پست تقریبا اکثر کاراکترهای رگولار اکسپرشن را توضیح دهم و این موارد توضیح داده شده تقریبا کاراکتر های استانداردی هستند که در همه زبان ها یکسان هستند، ولی خب ممکنه در زبان های مختلف مواردی بیشتر از این ها را ببینید که کاربردهای بیشتری را به رگولار اکسپرشن اضافه کنند.منابعhttps://github.com/ziishaned/learn-regex/https://developer.mozilla.org</description>
                <category>پوشه</category>
                <author>Amir</author>
                <pubDate>Thu, 19 Sep 2019 20:15:01 +0430</pubDate>
            </item>
                    <item>
                <title>سرویس وررکر چیست؟ و چرا باید از اون استفاده کنیم؟</title>
                <link>https://virgool.io/pushe-co/%D8%B3%D8%B1%D9%88%DB%8C%D8%B3-%D9%88%D8%B1%D8%B1%DA%A9%D8%B1-%DA%86%DB%8C%D8%B3%D8%AA-%D9%88-%DA%86%D8%B1%D8%A7-%D8%A8%D8%A7%DB%8C%D8%AF-%D8%A7%D8%B2-%D8%A7%D9%88%D9%86-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%DA%A9%D9%86%DB%8C%D9%85-s4cs6ilbmzgc</link>
                <description>سرویس ورکر (service worker) اسکریپتی است که مرورگر آن‌ را در بک گراند و مجزا از کدهای وب سایت یا وب اپلیکیشن اجرا می کند و قابلیت های جدیدی نظیر ارسال وب پوش ، کش کردن اسکریپت‌ها و استایل‌ها و غیره را ارائه می کند.سرویس ورکر در واقع یک JavaScript Worker می‌باشد که مرورگر آن‌را در یک Process مجزا از وب‌سایت اجرا می کند و به صورت مستقیم به DOM یا همون کدهای html , javascript وب سایت دسترسی ندارد و برای تعامل با وب سایت از قابلیتی به نام postMessage که توسط مرورگر ارائه می‌شود استفاده می‌کند.جاوااسکریپ زبانی است که فقط در یک Thread اجرا می‌شود ، به زبان ساده یعنی اینکه کل اسکریپت‌هایی که در یک وب سایت اجرا می شوند به صورت پشت سرهم می باشند و باید یه خط کد یا یک تابع تمام شود تا خط بعدی و تابع بعدی اجرا شود ، به همین دلیل وقتی یک دیالوگ alert باز می شود تا زمانی که آن‌را نبندیم امکان انجام هیچ کار دیگری نمی باشد.پس استفاده از JavaScript Worker که در واقع اسکریپتی است که در Thread ی دیگر و مجزا از اسکریپت وب‌سایت اجرا می شود و قابلیتی است که توسط مرورگر ها ارائه می شود به ما امکان انجام کارهایی نظیر اسکریپت‌های طولانی و انجام کارهایی که زمان بیشتری طول می کشد را می دهد.مواردی که از سرویس ورکر می توانیم استفاده کنیمبرای نمایش اعلان های وب (push notifications)برای پیاده سازی کردن کش برای استایل ها ، اسکریپتها و ریکوئست های وب سایتپیاده سازی کردن تجربه کاربری آفلاین انجام عملیات های سنگین و زمان بر و نمایش نتیجه آن در وب سایتدانلود کردن فایل هایی که توسط کلاینت ساخته شده استفاده از سرویس ورکر در PWA هاچرخه کارکرد سرویس ورکر (Service worker life cycle)سرویس ورکر چرخه کارکردی دارد که کاملا جدای از وب سایت می باشد.برای نصب یک سرویس ورکر در وب‌سایت‌تان باید ابتدا آن‌ را از درون وب سایت‌تان رجیستر کنید. رجیستر کردن سرویس ورکر باعث می شود که مرورگر در بک‌گراند سرویس ورکر را نصب (install) کند. در صورتی که نصب سرویس ورکر با موفقیت انجام شود سرویس ورکر به اصطلاح (activate) فعال می شود. در این زمان است که سرویس ورکر آماده کار می باشد. در این حالت سرویس ورکر دو وضعیت دارد یا به حالت ساکن (idle) در می ‌آید تا رم و منابع سیستم را الکی استفاده نکند و یا در وضعیت عمل کردن (fetch/message) به  وظیفه ای که برای آن فعال شده.Service worker life cycleمواردی که قبلا از استفاده از سرویس ورکر باید بدانیمبرای استفاده از سرویس ورکر ابتدا باید مرورگر از آن پشتیبانی کند که در این زمان بیشتر ورژن های گوگل کروم ، فایرفاکس ، اپرا و برخی مرورگرهای دیگر از آن پشتیبانی می کنند.نکته ی دیگر در استفاده از سرویس ورکر این است که سرویس ورکر فقط در وب سایت‌هایی که از https استفاده می کنند کار می کند و به این خاطر می باشد که چون سرویس ورکر می تواند تمامی ریکوئست ها و پاسخ های یک وب سایت را کاملا به عنوان یک واسط کنترل و حتی تغییر دهد ، پس برای اطمینان از امنیت وب سایت ، محیط سرویس ورکر باید https باشد.البته قابل ذکر است که برای توسعه و تست در محیط لوکال (localhost) نیازی به https نمی باشد و سرویس ورکر در این محیط کار می کند.فایل سرویس ورکر را باید در فولد اصلی (روت) وب سایت قرار دهید تا بتواند تمامی آدرس های وب سایت را تحت کنترل قرار دهد ، البته این کار اجباری نمی باشد و مثلا می توانید سرویس ورکر را در آدرس /blog قرار دهید و در این صورت سرویس ورکر فقط آدرس هایی که با /blog شروع می شوند را کنترل می کند.نحوه رجیستر کردن سرویس ورکربرای نصب سرویس ورکر باید آنرا درون کد وب سایت تان رجیستر کنید. کد زیر به مرورگر می گوید که در صورتی که از سرویس ورکر پشتیبانی میکند بعد از لود شدن کامل صفحه سرویس ورکر با فایل sw.js که در فولدر روت قرار گرفته است را رجیستر کند.if (&#039;serviceWorker&#039; in navigator){
    window.addEventListener(&#039;load&#039;, () =&gt; {
        navigator.serviceWorker.register(&#039;/sw.js&#039;)
            .then(() =&gt; console.log(&amp;quotServiceWorker registerd successfully&amp;quot))
            .catch((e) =&gt; console.log(&amp;quotServiceWorker failed to register&amp;quot, e));
    })
}در صورتی که کد بالا را در وب‌سایت تان قرار دهید هر بار که صفحه ریلود می شود کد بالا مجدد اجرا می شود و در صورتی که از قبل سرویس ورکر فعال باشد ، کد بالا باعث رجیستر شدن سرویس ورکر جدید نمی شود.در مرورگر کروم می توانید تمامی سرویس ورکرها و وضعیت آن ها را با باز کردن صفحه inspect مرورگر توسط کلید های Ctrl+Shift+I و رفتن به تب Application و سپس انتخاب منو Service Workers مشاهده کنید.در پست بعدی نحوه نوشتن اسکریپت سرویس ورکر و انجام تسک های مختلف در وضعیت های install  activate , message , ...  به طور کامل و با ذکر مثال توضیح خواهم داد.منابعhttps://developers.google.com/web/fundamentals/primers/service-workers/https://www.html5rocks.com/en/tutorials/workers/basics/https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers</description>
                <category>پوشه</category>
                <author>Amir</author>
                <pubDate>Thu, 29 Aug 2019 21:27:38 +0430</pubDate>
            </item>
                    <item>
                <title>مشاهده‌ی لاگ‌های اپلیکیشن اندروید در لاگ‌کت</title>
                <link>https://virgool.io/pushe-co/android-adb-logcat-setup-rosvzwydsay5</link>
                <description>ADB (image taken from optocrypto.com)یکی از مشکلاتی که توسعه‌دهنده‌های موبایل هنگام ساختن برنامه‌ی اندروید دارن دیباگ اون و حداقل دیدن خطاهاییه که توی دیوایس اندروید برای برنامشون پیش میاد هست. دلیلش می‌تونه مختلف باشه؛ تازه‌کار بودن توسعه‌دهنده، استفاده از پلتفرمی که دیدن لاگ خیلی مطرح نیست براش یا .... تو این پست قصد دارم نحوه‌ی استفاده از ابزار لاگ‌کت رو به طور ساده توضیح بدم و توی پلتفرم‌های مختلف روش استفادش رو بگم.معرفی Android logcatاگر توسعه‌دهنده‌ی اندروید باشید [که با اندروید استودیو و یا ایکلیپس کار کردید]، مطمئنا Logcat به گوشتون خورده. توی SDK اندروید ابزاری به اسم ADB (یا Android debug bridge) هست که وظیفش برقراری ارتباط بین دستگاه و رایانه‌ست. محیط‌های توسعه‌ای که شما باهاشون برنامه‌ی اندروید مینویسید و اون رو با اتصال گوشی به رایانه روی گوشی‌تون اجرا می‌کنید از adb برای نصب برنامه روی گوشی استفاده می‌کنن.یکی از کارهایی که ADB انجام می‌ده گزارش لاگ‌های دستگاه متصل‌شده‌ست. لاگ، پیامیه که یه نرم‌افزار هنگام اجرا توی سیستم‌عامل توی مواقع مختلف چاپ می‌کنه.پس واسه‌ی دیدن لاگ‌های برنامه، باید لاگ‌های دستگاه‌ رو بگیریم و لا‌گ‌های برنامه‌ی خودمون رو جدا کنیم.ببینیم واسه‌ی ابزارهای مختلف نحوه‌ی انجام این کار چجوریه. اول IDE های مطرح، بعد راه‌های عمومی رو خواهم‌گفت.اندروید استودیواندروید استودیو راحت‌ترین روش برای دیدن لاگ‌های برنامه‌ست. کافیه وقتی اپ رو روی دستگاه اجرا می‌کنید لاگ‌کت رو از پایین انتخاب کنید (همچنین کلید ترکیبی Alt + 6)Where is Logcat in Android studio?بعد از انتخاب لاگ‌کت تنظیمات اون رو می‌تونید توی پنجره‌ش ببینید:Logcat actionsسبز: دیوایسی که وصل هست رو انتخاب کنید تا بتونید لاگ‌های اون رو ببینید.زرد: فیلتر با کلمه‌ای که می‌خواید. مثلا لاگ‌های دارای تگ Flower.قرمز: اگر اپی در حالت دیباگ روی دیوایس نصب شده‌باشه، می‌تونید اون رو انتخاب کنید و فقط لاگ‌های اون رو ببینید (منوی سمت راست باید Show only selected application باشه).اینتلیجی (IntelliJ)اگر پلاگین Android support رو برای intellij فعال کنید و Android sdk رو براش مشخص کنید، مثل اندروید استودیو لاگ‌کت در پایین صفحه هنگام بازبودن پروژه‌ی اندروید نمایان می‌شه.ویژوال استودیو کد (VisualStudio code)برای vscode هم پلاگین‌های مختلف هست مثل Android که دیباگ پروژه‌ی اندروید رو می‌تونید انجام بدید و با زدن F1 می‌تونید گزینه‌ی View logcat رو ببینید. اما باید adb در Environment variableهاتون ست شده باشه. برای انجام این کار ادامه رو بخونید.بقیه‌ی ادیتورها و محیط‌هابرای بقیه‌ی ادیتورها می‌تونید از همون Command line یا terminal استفاده کنید.اضافه‌کردن adb به متغیرهای محلیدر صورتی که بخواید از طریق CommandLine، Terminal و یا ادیتور‌هایی که از طریق command line به adb وصل می‌شن (مثل vscode)، باید adb به متغیرهای محلی اضافه بشه. توی سیستم‌عامل‌های مختلف این کار متفاوت انجام می‌شه.نکته‌ی‌مهم: باید Android sdk داشته‌باشید.ویندوز:روی This PC راست کلیک کنید و Properties رو بزنید تا پنجر‌ه‌ی system در کنترل پنل رو براتون باز کنه.از منوی سمت چپ گزینه‌ی Advanced system settings رو انتخاب کنید.از تب Advanced دکمه‌ی Environment variables رو انتخاب کنید.از بخش System variables متغیر Path رو انتخاب کنید و Edit رو بزنید.Add SDK path to Windows pathدو آدرس platform-tools و tools (دلخواه) رو با زدن دکمه‌ی New اضافه‌کنید.در تصویر محل نصب sdk برای من D&gt;Android&gt;SDK هست و مابقی آدرس در خود فولدر sdk هست.اوکی رو بزنید و یه CMD &#40;یا Powershell باز کنید&#41;تایپ کنید adb و باید ببینید که دستور معتبره و خطا نمی‌ده.لینوکس:در لینوکس باید آدرس adb رو به متغیر سراسری PATH$ اضافه کنیم.در صورتی که از Bash استفاده می‌کنید فایل bashrc. و در صورتی که از zsh استفاده می‌کنید فایل zshrc. رو باز کنید.در صورتی که قبلا به PATH چیزی اضافه‌کردید، در ادامه آدرس sdk platform tools رو اضافه کنید.این خط رو [ترجیحا به ابتدای] فایل اضافه کنید تا ‌متغیر PATH رو override کنید. export PATH=:/home/userName/android/sdk/platform-tools:/home/userName/android/sdk/tools:$PATHو بجای userName/android/sdk آدرس sdk توی سیستم‌خودتون رو وارد کنید.فایل رو سیو کنید و ترمینال رو ریستارت کنید یا دستور source ~/.bashrc # or source .zshrcرو بزنید تا تنظیمات فعال بشن. بعد تایپ کنید adb و باید دستور معتبر باشه.Test adb on linux shellمشاهده‌ی لاگ با دستور adbحالا که توی کامند لاین adb اضافه‌شده می‌تونیم لا‌‌گ‌ها رو توی کامندلاین ببینیم.adb logcat *:Vاین دستور یعنی همه‌ی لاگ‌های موجود رو نشون بده‌. یا دستور:adb logcat Pushe:Vیعنی تمام لاگ‌های با تگ پوشه رو نشون بده.اضافی:اسکریپت Pidcat:یکی از اسکریپت‌های خوبی که رنگ و لعابی به لاگ‌کت میبخشه و خوندنش رو ساده‌تر می‌کنه pidcat هست که یه اسکریپت پایتونه، لذا می‌تونید با نصب پایتون اون رو استفاده کنید. [لینک گیتهاب]برنامه‌ی mLogcat برای ویندوز:در صورتی که از ویندوز استفاده می‌کنید یه نرم‌افزار هست که لاگ‌های adb رو توی یه بستر گرافیکی نشون می‌ده. [لینک سایت]منابع:Android Logcat command-line toolAndroid logcatLogcat important commands</description>
                <category>پوشه</category>
                <author>Mahdi Malvandi</author>
                <pubDate>Mon, 26 Aug 2019 12:01:15 +0430</pubDate>
            </item>
                    <item>
                <title>ساخت پلاگین یونیتی برای لایبرری اندرویدی</title>
                <link>https://virgool.io/pushe-co/%D8%B3%D8%A7%D8%AE%D8%AA-%D9%BE%D9%84%D8%A7%DA%AF%DB%8C%D9%86-%DB%8C%D9%88%D9%86%DB%8C%D8%AA%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%84%D8%A7%DB%8C%D8%A8%D8%B1%D8%B1%DB%8C-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF%DB%8C-fqjq9n2qchev</link>
                <description>Android and Unity (Image taken from android.jlelse.eu)ما یه کتابخونه واسه‌ی اندروید (زبان جاوا یا کاتلین و مختص اندروید استودیو) طراحی کردیم، اما می‌خواستیم که بازی‌سازهایی که با موتور بازی‌سازی یونیتی بازی‌هاشونو طراحی می‌کنن هم بتونن از کتابخونمون استفاده کنن. پس بر این شدیم که برای یونیتی یه پلاگین طراحی کنیم که بازی‌ساز‌ها بتونن از این پلاگین تو بازی‌هاشون استفاده کنن و امکانات کتابخونه‌ی ما براشون فراهم باشه. توی این پست من در مورد نحوه‌ی ساخت پلاگین یونیتی برای کتابخونه‌ای که برای اندروید استودیو هست، توضیحاتی می‌دم.۱. آماده‌سازی کتابخانه‌ی اندرویداین که چجوری لایبرری برای اندروید استودیو بسازیم جزو مطالب این پست نیست و فرض بر این می‌گیریم که کتابخونه آماده‌ست و یا در ‌Jcenter آپلود شده. می‌تونید از آموزش آپلود لایبرری در Bintray در موردش بخونید.۲. اضافه‌کردن کتابخانه به یک پروژه‌ی یونیتیحالا یه پروژه‌ی یونیتی خالی می‌سازیم و کارای لازم لایبرری رو توی این پروژه انجام می‌دیم. ابتدا یه پروژه بسازید و پلتفرم اندروید رو انتخاب کنید.انتخاب پلتفرم اندرویدبعدش برای اینکه بتونید کتابخونه‌ی نیتیو اندرویدتون رو اضافه کنید از ابزار UnityJarResolver استفاده‌کنید. نسخه‌ی نهایی پکیج رو دانلود کنید و اونو توی پروژه اضافه کنید.برای اضافه‌کردن پکیج می‌تونید در حالی که پروژه بازه پکیج رو باز کنید تا به پروژه اضافه بشه، یا با راست کلیک روی Assets و انتخاب گزینه‌ی Import &gt; Custom package پکیج رو انتخاب کنید. پس از اینکه پکیج اضافه شد برای آماده‌سازی بستر پلاگین توی پوشه‌ی Assets یک پوشه به اسم پلاگین بسازید و داخل اون یک پوشه به اسم Editor.داخل پوشه‌ی Editor یک فایل به اسم Plugin+Dependencies.xml بسازید. مثلا اگه اسم پلاگینتون MyPluginـه یه فایل به اسم MyPluginDependencies.xml بسازید. شمای Assets به صورت زیر خواهدشد:Assets/
    MyPlugin/
            Editor/
                        MyPluginDependencies.xmlتوی فایل xml لایبرری‌هایی که قراره دانلود بشن و به پروژه اضافه بشن رو تعریف می‌کنیم. برای نمونه می‌تونید فایل مثال Unity jar resolver رو ببینید.برای مثال کتابخونه‌ی پوشه رو به برنامه اضافه می‌کنیم. محتوای فایل xml بصورت زیر خواهد بود:&lt;dependencies&gt;
  &lt;androidPackages&gt;
      &lt;androidPackage spec=&amp;quotco.ronash.android:pushe-base:1.6.3&amp;quot&gt;
            &lt;repositories&gt;
                    &lt;repository&gt;https://maven.google.com&lt;/repository&gt;
           &lt;/repositories&gt;
    &lt;/androidPackage&gt;
  &lt;/androidPackages&gt;
&lt;/dependencies&gt;برای حالت‌های بیشتر کامنت‌های فایل مثال رو بخونید.فایل رو ذخیره کنید و برگردید به یونیتی. از منوی Assets گزینه‌ی Play service resolver، بعد Android resolver و بعد گزینه‌ی Force resolve یا resolve رو انتخاب کنید (با توجه به تحریم‌بودن سرور‌های گریدل باید از ابزار گذر از تحریم استفاده کنید).بعد از سینک (در صورت دانلود موفق ابزار‌های لازم) در پروژه پوشه‌ی Plugin &gt; Android به Assets اضافه خواهد شد. این یعنی کد نیتیو لایبرری شما + تمام لایبرری‌های مورد نیاز اون به برنامه اضافه‌شده و کدها قابل استفاده هستن.تا اینجا Hirarchy پروژه باید بصورت زیر باشه:۳. ساخت اسکریپت برای ساده‌کردن استفاده‌ی توسعه‌دهنده‌هابرای استفاده از کدهای لایبرری در اسکریپت‌های یونیتی باید از کلاس‌های AndroidJavaClass و AndroidJavaObject استفاده کنیم. اما این کار برای توسعه‌دهنده‌های بازی که غالبا آشنایی با این کار ندارن خیلی خوشایند نیست. پس بهتره واسطی بسازیم که استفاده از کد‌های ما راحت و جذاب باشه و خیلی دورازذهن بازی‌ساز نباشه.پس یک اسکریپت می‌نویسیم که توابعی داره و اون توابع کار اجرای کد‌های لایبرری رو بعهده می‌گیرن.[ترجیحا توی پوشه‌ی پلاگین، یه‌جایی] یه اسکریپت سی‌شارپ بسازید و کد‌های زیر رو قراربدید (با توجه به اینکه ما لایبرری پوشه رو اضافه‌کردیم کد‌های اون رو استفاده خواهیم‌کرد):public class Pushe : MonoBehaviour
    {
        private void Start()
        {
            try { InitializePushe(); }
            catch { Debug.Log(&amp;quotFailed to initialize the project somehow!&amp;quot); }
        }
        
        private static void InitializePushe()
        {
          var activityClass = new AndroidJavaClass(&amp;quotcom.unity3d.player.UnityPlayer&amp;quot); // ۱
          var activityContext = activityClass.GetStatic&lt;AndroidJavaObject&gt;(&amp;quotcurrentActivity&amp;quot);//۲
          var pluginClass = new AndroidJavaClass(&amp;quotco.ronash.pushe.Pushe&amp;quot);//۳
            pluginClass.CallStatic(&amp;quotinitialize&amp;quot, activityContext, /* show dialog */true);//۴
        }
}در کد جاوا برای init شدن لایبرری باید کد co.ronash.pushe.Pushe.initialize(context, true)اجرا بشه. یک تابع میسازیم به اسم InitializePushe و کدهای لازم رو اجرا می‌کنیم: برای گرفتن ‌رفرنس کلاس اصلی یونیتی (UnityPlayer).برای گرفتن context اکتیویتی از کلاس اصلی یونیتی.کدهایی که Context لازم دارن، آرگومان لازم رو از انجام موارد ۱ و ۲ می‌گیریم.۳. رفرنس کلاسی که می‌خوایم ازش شی‌ بسازیم و تابعی ازش اجرا کنیم رو می‌گیریم.۴. فراخوانی تابعی که لازم داریم اجرا بشه.برای فراخوانی متد‌های استاتیک:var pluginClass = new AndroidJavaClass(&amp;quotClass_full_packageName&amp;quot);
pluginClass.CallStatic&lt;type&gt;(&amp;quotfunction_name&amp;quot, args...); // no &lt;type&gt; if voidو فراخوانی با ساخت شی از کلاس:AndroidJavaObject obj = new AndroidJavaObject(&amp;quotClass_full_packageName&amp;quot);
Type t = obj.Call&lt;type&gt;(&amp;quotfunction_name&amp;quot); // No &lt;type&gt; if voidبه طور کلی روش فراخونی کد و تعامل با کد نیتیو کتابخونه‌ها اینطوری خواهد بود.پس کسی که از پلاگین استفاده کنه به جای فراخونی دستی کد‌های نیتیو، کافیه از توابعی که آماده‌شده استفاده کنه:var activityClass = new AndroidJavaClass(&amp;quotcom.unity3d.player.UnityPlayer&amp;quot);
var activityContext = activityClass.GetStatic&lt;AndroidJavaObject&gt;(&amp;quotcurrentActivity&amp;quot);
var pluginClass = new AndroidJavaClass(&amp;quotco.ronash.pushe.Pushe&amp;quot);
pluginClass.CallStatic(&amp;quotinitialize&amp;quot, activityContext, /* show dialog */true);To:InitializePushe();حالا کافیه اسکریپتی که نوشتیم تسط توسعه‌دهنده به یک GameObject متصل بشه وکدهاش فراخوانی بشن. در این صورت کد‌هایی که ما در لایبرری نیتیو نوشتیم فراخوانی خواهندشد.لینک پروژه‌ی نمونهابزار اضافه‌کردن dependency library به پروژه</description>
                <category>پوشه</category>
                <author>Mahdi Malvandi</author>
                <pubDate>Fri, 09 Aug 2019 00:30:46 +0430</pubDate>
            </item>
                    <item>
                <title>آپلود کردن لایبرری اندروید در bintray با گریدل</title>
                <link>https://virgool.io/pushe-co/%D8%A2%D9%BE%D9%84%D9%88%D8%AF-%DA%A9%D8%B1%D8%AF%D9%86-%D9%84%D8%A7%DB%8C%D8%A8%D8%B1%D8%B1%DB%8C-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-%D8%AF%D8%B1-bintray-%D8%A8%D8%A7-%DA%AF%D8%B1%DB%8C%D8%AF%D9%84-gz7aiold2agq</link>
                <description>یه بخش از پروژم رو تبدیل کردم به یه ماژول که از کد ماژول اصلی جدا بشه و بعدا هم بتونم ازش تو پروژه‌های دیگه استفاده کنم. با خودم گفتم چرا تبدیلش نکنم به لایبرری و نذارمش توی Bintray که بعدا مثل کتابخونه‌های عادی به برنامه‌ام اضافه کنمش؟چنتا مقاله و داکیومنت رو خوندم اما هر کدوم یه جور نقص داشتن و یه مدل ارور داشتن. دنبال یه منبع بودم که خلاصه و مفید کارم رو راه بندازه و کتابخونه‌ام رو آپلودش کنم. از ترکیب چیزایی که خوندم تونستم بالاخره این کار رو انجام بدم. تو این مقاله نحوه‌ی انجام کارم رو توضیح می‌دم.قدم اول: حساب Bintrayباید اول توی سایت Bintray حساب بسازید و وارد شید.بعد از اینکه وارد شدید یه سازمان (Organization) بسازید.ساخت organizationبعدش روی سازمانی که ساختید کلیک کنید و یه مخزن (Repository) بسازید.ساخت repositoryبعد از وارد کردن نام مخزن،‌‌‌ Type اون رو Maven قرار بدید، چون قراره کتابخونه برای اندروید باشه.برای مثال من اسم سازمان رو mah-d انتخاب کردم و اسم مخزن رو maven. اینا رو باید حواسمون باشه، چون باهاشون کار داریم.حالا باید یه پکیج بسازیم توی مخزن. روی مخزن کلیک کنید و Add New Package رو انتخاب کنید.ساخت پکیجاطلاعات وارد شده مختص کتابخونه‌ی شماست و اطلاعاتی که من توی عکس گذاشتم صرفا مثال هست.تا اینجا کارهای مربوط سایت تموم شده و بهتره بریم سراغ اندروید استودیو.قدم دوم: راه‌اندازی اندروید استودیواین دو خط رو به بلاک dependencies مربوط به فایل پروژه (و نه ماژول‌ها) اضافه کنید:classpath &#039;com.github.dcendents:android-maven-gradle-plugin:2.1&#039;
classpath &#039;com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4&#039;برای راحتی کار کل کد‌هایی که قراره اضافه‌کنیم رو توی یه فایل میذاریم و ماژولی که قراره آپلود بشه از این فایل استفاده خواهد کرد. پس کنار فایل گریدل پروژه (و دوباره، ماژول نه) یک فایل می‌سازیم به اسم bintray.gradle و کدهای زیر رو به ترتیب داخلش قرار می‌دیم.دو تا پلاگین رو اول توی فایل فعال می‌کنیم:apply plugin: &#039;com.github.dcendents.android-maven&#039;
apply plugin: &#039;com.jfrog.bintray&#039;بعد متغیرهای لازم رو می‌سازیم (برای اینکه متغیر‌ها همه‌جا قابل استفاده باشن اونا رو توی بلاک ext می‌ذاریم).ext {
    bintrayRepo = &#039;maven&#039; // نام مخزن
    bintrayName = &#039;pulp&#039; // نام پکیج
    // publishedGroupId:artifact:libraryVersion
    publishedGroupId = &#039;ir.malv.utils&#039; // پکیج‌نیم لایبرری
    artifact = &#039;pulp&#039; // اسم ماژول
    libraryVersion = &#039;0.0.1&#039; // نسخه
    libraryName = &#039;Pulp&#039; // عنوان لایبرری
    libraryDescription = &#039;Simple logger&#039; // توضیح برای لایبریی
    siteUrl = &#039;https://github.com/mahdi-malv&#039; // لینک سایت
    gitUrl = &#039;https://github.com/mahdi-malv/pulp.git&#039; // لینک گیت
    developerId = &#039;mahdi-malv&#039; // آی‌دی توسعه‌دهنده
    developerName = &#039;Mahdi Malvandi&#039; // اسم توسعه‌دهنده
    developerEmail = &#039;email@gmail.com&#039; // ایمیل
    licenseName = &#039;The Apache Software License, Version 2.0&#039; // عنوان لایسنس
    licenseUrl = &#039;http://www.apache.org/licenses/LICENSE-2.0.txt&#039; // لینک لایسنس
    allLicenses = [&quot;Apache-2.0&quot;] // همه‌ی لایسنس‌ها
}نام مخرن: مخزنی که در ابتدا ساختید.نام پکیج: پکیجی که برای اون مخزن ساختید.پکیج‌نیم لایبرری: پکیج‌نیمی که ماژول داره (همون application id)اسم ماژول: تو منوی projects اندروید استودیو و فایل settings.gradle ماژول عنوانی داره که منظور همونه.نسخه‌: نسخه‌ای که ماژول داره.عنوان: به دلخواه یه نام برای کتابخونه. مثلا همون اسم ماژول.لینک‌ها: برای لایبرری یک ریپوی گیت بسازید و اون رو برای issues، گیت استفاده کنید، برای سایت هم می‌تونید سایت خودتون رو بذارید اگر دارید، اگر هم نه مثل اینجا صرفا لینک حساب گیت‌هاب رو بذارید.لایسنس‌ها: در مورد لایسنس‌ها اینجا بیشتر بخونید: https://opensource.org/licenses با این متغیرها کد گریدل لایبرری شما بدین صورت خواهد بود:publishedGroupId:artifact:libraryVersion&#x60;ir.malv.utils:pulp:0.0.1بعد از اینکه این متغیر‌ها درست تنظیم‌شدن، کد‌های زیر رو اضافه کنید.group = publishedGroupId
version = libraryVersion

install {
    repositories.mavenInstaller {
        pom.project {
            packaging &#039;aar&#039;
            groupId publishedGroupId
            artifactId artifact
            name libraryName
            description libraryDescription
            url siteUrl
            licenses {
                license {
                    name licenseName
                    url licenseUrl
                }
            }
            developers {
                developer {
                    id developerId
                    name developerName
                    email developerEmail
                }
            }
            scm {
                connection gitUrl
                developerConnection gitUrl
                url siteUrl
            }
        }
    }
}
task sourcesJar(type: Jar) {
    classifier = &#039;sources&#039;
    from android.sourceSets.main.java.srcDirs
}
task javadoc(type: Javadoc) {
   source = android.sourceSets.main.java.srcDirs
   classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = &#039;javadoc&#039;
    from javadoc.destinationDir
}
artifacts {
    archives javadocJar
    archives sourcesJar
}و حالا این کدها رو اضافه کنید که کانفیگ لایبرری در Bintray هست.Properties properties = new Properties()
properties.load(project.rootProject.file&#40;&#039;local.properties&#039;&#41;.newDataInputStream())
bintray {
    user = properties.getProperty(&quot;bintray.user&quot;)
    key = properties.getProperty(&quot;bintray.apikey&quot;)
    configurations = [&#039;archives&#039;]
    pkg {
        repo = bintrayRepo
        name = bintrayName
        desc = libraryDescription
        userOrg = &#039;mah-d&#039;
        websiteUrl = siteUrl
        vcsUrl = gitUrl
        licenses = allLicenses
        dryRun = false
        publish = true
        override = false
        publicDownloadNumbers = true
        version {
            desc = libraryDescription
        }
    }
}توی این بلاک چنتا فیلد مهم هست. یکی userOrg که همون سازمان (Organization) هست که در ابتدای قدم اول ساختید.فیلدهای user و key:برای ارتباط با Bintray یک نام‌کاربری لازمه و یک ApiKey. نام کاربری که مشخصه، اما ApiKey رو باید از سایت بردارید. روی پروفایل کلیک کنید و Edit profile رو بزنید و مطابق تصویر ApiKey رو کپی کنید.گرفتن API keyتوی فایل local.properties دوتا فیلد اضافه کنید:bintray.user=userName
bintray.apikey=apiKey!:‌دقت کنید که مقدارها رو توی double quote یا single quote نذارید.دلیل قراردادن این مقدارها توی این فایل اینه که چون حساس و مهم هستن بهتره بیان توی فایلی که توی .gitignore هست و توی گیت پوش نمی‌شه.کار فایل bintray.gradle تموم‌شده و حالا کافیه که به فایل گریدل ماژول اضافه کنیم و گریدل رو سینک کنیم:این کد رو به انتهای فایل build.gradle (مربوط به ماژول) اضافه کنید:apply from: &#039;../bintray.gradle&#039;این یعنی فایل توی یک فولدر بالاتر از محل کنونیه (اگر فایل رو جای دیگه‌ای گذاشتید، آدرس درست رو قرار بدید).بعد از سینک کردن باید تسک‌های clean و install رو ران کنید. دوبار کلید Ctrl رو بزنید و کامند زیر رو وارد کنید و Enter رو بزنید. دقت کنید که عملیات موفقیت‌آمیز باشه و اگر خطا داشتید ابتدا خطا رو رفع کنید بعد دوباره کامند رو ران کنید.gradle clean installهمچنین می‌تونید توی ترمینال یا CMD هم این کار رو انجام بدید.# Cmdgradle.bat clean install# Terminal./gradlew clean installبعد از اون تسک bintrayUpload رو باید ران کنید. از منوی تسک‌های ماژول بخش publishing می‌تونید اون رو انتخاب کنید.بعد از اتمام اجرا، مطمئن شید که تسک موفقیت‌آمیز بوده. بعد می‌تونید برید به سایت و بعد از رفرش ببینید که فایل‌های جدید اضافه‌شدن.الآن می‌تونید از همین طریق با url لایبرری رو به یک پروژه‌ی اندروید اضافه کنید:توی صفحه‌ی پکیج، لینکی که به لایبرری اشاره داره رو باید به repositories اضافه‌کنید.لینک مخزن که پکیج توی اون قرار داره
repositories {
    google()
    jcenter()
    maven { url &#039;https://dl.bintray.com/mah-d/maven&#039; }
}و بعد توی dependencies کد لایبرری رو اضافه‌کنید:کد dependency لایبرریهم‌چنین در صورتی که لایبرری مناسب ‌Jcenter (مخزن اصلی که توی اندروید به طور پیش‌فرض اضافه‌می‌شه) هست می‌تونید اون رو به Jcenter اضافه کنید. با این کار نیاز به اضافه‌کردن لینک مخزن نیست.گیت‌هاب لایبرری و همه‌ی این کدها رو هم می‌تونید اینجا پیدا کنید.لینک مقاله‌های مفید و مرتبط:Simple way to publish your library to JcenterBintray gradle pluginPublishing to bintray with gradle</description>
                <category>پوشه</category>
                <author>Mahdi Malvandi</author>
                <pubDate>Thu, 01 Aug 2019 23:43:23 +0430</pubDate>
            </item>
                    <item>
                <title>حیف از برکت نیست!؟</title>
                <link>https://virgool.io/pushe-co/%D8%AD%DB%8C%D9%81-%D8%A7%D8%B2-%D8%A8%D8%B1%DA%A9%D8%AA-%D9%86%DB%8C%D8%B3%D8%AA-tqojc2svezk1</link>
                <description> بهار سال گذشته بود که بعد از 9 سال فعالیت تو یکی از پژوهشکده‌های دانشگاه شریف، بالاخره تصمیم گرفتم محیط شغلی دیگه‌ای رو تجربه کنم؛ دلایل زیاد بود ولی فکر می‌کردم دیگه اینجا امکان رشد نیست و واقعاً چند سالی هست دارم درجا میزنم! با چندتا از رفقا صحبت کردم و داشتم گزینه‌های روی میز رو بررسی می‌کردم؛ از فروشگاه رفاه و چند شرکت فنی اطراف دانشگاه گرفته تا یه هلدینگ که اسم و رسم خوبی داشت. بالاخره با مشورت با دوست خوبم اکبر قنبرپور قرار شد برای استخدام تو پارک فناوری پردیس اقدام کنم. اکبر خیلی بهم لطف داشت و راهنمایی کرد تا پروسه طویل جذب رو سریع‌تر انجام بدم و اون بروکراسی‌ها و عدم سوء پیشینه و تحقیقات محلی و مباحث اعتقادی و ... رو به خوبی پشت سر بگذارم و قرار شد از اول مرداد اونجا مشغول بشم. اما قبل از شروع رسمی کار، علی رجول بهم زنگ زد و بهم پیشنهاد داد برای یه موضوع اجرایی باهاش همکاری کنم. اول قبول نکردم چون تقریباً پرونده رو با استخدام تو پارک پردیس بسته بودم ولی وقتی یه خرده بیشتر در مورد موضوع همکاری بهم توضیح داد و برنامه داشت اون رو به عنوان یه محصول تو الکامپ 96 ارائه بده – یعنی بازه زمانی تیرماه – قرار شد درگیر پروژه بشم.اما محصول چی بود؟ راه‌اندازی یه پلت‌فرم خرید پیش‌نیازهای طبخ غذای خانگی مثل پیازداغ، بادمجون سرخ‌کرده، انواع سبزی و ... که البته تفاوتش در این بود که افرادی که این محصولات رو آماده می‌کنند، مددجویان و خانواده‌های کم‌بضاعت تحت حمایت مؤسسات خیریه باشند. تقریباً ایده و اولین خیریه که گروه فردای سبز دانشگاه شریف بود آماده بود و باید کار شروع می‌شد. اسم هم بین گزینه‌های پیشنهادی مثل زنبیل، بادمجون و ...، اسم زیبای برکت انتخاب شد. خلاصه، کارها به خوبی پیش رفت و به قوت تو الکامپ حضور داشتیم. بازدیدکنندگان نسبت به برکت توجه خاصی نشون می‌دادند و اینکه این فرایند به عنوان مسئولیت اجتماعی شرکت و در نظرگرفتن تمام عواید اون برای مددجویان صورت می‌گرفت، در نگاه اونها تحسین برانگیز بود. حتی تو بخش ارائه‌ها و با حسن نظری که داوران به این موضوع داشتند، برکت رتبه 7 این بخش شد. به هرحال نمایشگاه الکامپ هم تموم شد و من با خداحافظی از دوستان، باید کار جدیدم رو تو مجموعه پارک پردیس شروع می‌کردم.روز اول یا دوم کاری جدید، موقعی که از آسانسور یکی از ساختمان‌های پارک خارج می‌شدم به صورت اتفاقی مهندس حسین صابری، معاون توسعه فناوری پارک پردیس رو دیدم. از اونجایی که ایشون به همراه مهدی صداقت به غرفه برکت اومده بود، به سمت ایشون رفتم و بعد از سلام و علیک و احوالپرسی خودم رو معرفی کردم. ایشون با یه نگاه عمیقی که سرشار از تعجب بود گفت: &quot;پس اینجا چیکار میکنی؟ حیف از اون برکت نبود؟!&quot; و شاید به خاطر مراعات حال سایر همکارانی که اونجا بودند، دیگه حرفی نزدند.این جمله ایشون خیلی ذهنم رو درگیر کرد و واقعاً شوق کار کردن تو پارک پردیس رو از من گرفت. با اینکه خیلی برای استخدام پیگیری کرده بودم و اون هفت خوان رو گذرونده بودم و شاید هزینه‌هایی هم برای جذب به سیستم تحمیل کرده بودم و حداقل به نظر خودم از لحاظ اخلاقی این کار درست نبود ولی واقعاً تمایلی به ادامه کار نداشتم. با اینکه محیط کاری قبلی برام خیلی جذاب بود و تو این مدت کوتاه هم از همکاری لذت بردم ولی پذیرفته بودم که الان کارمند پارک هستم و خودم رو متعهد می‌دونستم بخاطر زحماتی که اکبر قنبرپور هم برای جذب من کشیده، فعالیت تو پارک رو ادامه بدم. اما صحبت‌های آقای صابری و ارزش کارآفرینی‌هایی مثل برکت، من رو مجبور کرد یه بار دیگه برای آینده شغلی تصمیم بگیرم و مسیر کاری رو انتخاب کنم. چند روزی درگیر مسئله بودم و تو فرصتی که اکبر قنبرپور به عنوان رئیس مرکز به مأموریت کاری رفته بود باید تصمیم نهایی رو می‌گرفتم. با اینکه مطمئناً برای او هم جذب نیروی جدید، زمان و انرژی زیادی می‌گرفت و برنامه‌ریزی اون رو مختل می‌کرد ولی خوب بر این موضوع واقف بود که نیرویی که انگیزه کافی برای فعالیت نداره یا فکر و ذهن و علاقه‌ش جای دیگه‌ای هست، هرچند توانمند ولی بازدهی خوبی نخواهد داشت. پس بهتر هست که تکلیف این موضوع زودتر مشخص بشه و با کمال احترام و همکاری از من خواست تا بدون در نظر گرفتن معذوریت‌های اخلاقی و رودربایستی‌ها، مسیر خودم رو تعیین کنم و شد آنچه شد! واقعاً سخت بود ولی بالاخره برکت رو به سایر موارد ترجیح دادم. مطمئناً قدردان آقای صابری بابت جمله تأثیرگذارش و اکبر قنبرپور عزیز بابت بزرگواری و رفتار پسندیده‌اش خواهم بود.الان بیشتر از 1.5 سال از این موضوع میگذره و با اینکه انگیزه حضور من در شرکت جدید، برکت بود اما به دلایل مختلف از جمله شرایط اقتصادی خیلی نتونستیم برای گسترش اون اقدام کنیم و بخش عمده‌ای از زمان کاری رو به محصول اصلی شرکت یعنی پوشه اختصاص دادم و در حد اینکه چراغ برکت رو روشن نگه داریم سفارش‌های محدود هفتگی برکت رو هماهنگ می‌کنیم. ولی انصافاً حیف از برکت نیست!؟نمایی از اپلیکیشن فروشگاه خیریه برکتپی نوشت: اگه علاقه دارید که در مورد برکت بیشتر بدونید، به سایت و صفحه اپلیکیشن در کافه بازار مراجعه کنیدhttp://barkat.shophttps://cafebazaar.ir/app/shop.barkat.app/?l=fa</description>
                <category>پوشه</category>
                <author>yousef.dehghan</author>
                <pubDate>Wed, 06 Feb 2019 19:42:50 +0330</pubDate>
            </item>
                    <item>
                <title>گزارش آماری پوشه از کاربران موبایل های اندرویدی در ایران</title>
                <link>https://virgool.io/pushe-co/iran-mobile-industry-report-pushe-fall-2018-k8rf0jqz75ll</link>
                <description>برنامه نویسان برای ارتباط و تعامل با کاربرانشان، مثلاً ارسال پیام به آن‌ها یا دریافت آمار از ایشان، عموماً از سرویس‌های دیگری استفاده می‌کنند که این امکان را برایشان فراهم کند. و خود درگیر تهیه سرور و پیچیدگی‌های فنی ایجاد یک سوکت ارتباطی با موبایل (در لایه سیستم عامل و شبکه) نمی‌شوند.معرفی پوشهپوشه یکی از سرویس‌های شناخته شده ایرانی است که سال‌هاست کار ارسال پوش نوتیفیکیشن و دریافت آمار از کاربران را انجام می‌دهد. پوشه سال ۹۴ توسط چهار نفر از فارغ التحصیلان دانشگاه صنعتی شریف تاسیس شد و سال ۹۷ به عنوان شرکت برتر پارک علم و فناوری شریف انتخاب شد. تیم فنی پوشه از حدود ۱۵نفر تشکیل شده است و به سه بخشِ تیم کلاینت، تیم سرور و تیم دیتا تقسیم می‌شود.پس از نسخه های پیاپی به روز رسانی در کدهای سمت سرور پوشه و به خصوص به روز رسانی اخیر که در این پست وبلاگ پوشه توضیح دادیم، حالا پوشه نه تنها امکان خدمات دهی در مقیاس بسیار بالایی را دارد، بلکه به کمک چند فناوری نرم افزاری جدید صف های درخواست طولانی در سنگین‌ترین ساعت‌های کاری هم کاملاً پایدار و قابل اعتماد هستند. پوشه انتشار و گسترش دانشِ به دست آمده در این گزارش‌ها را باعث رشد فضا و اکوسیستم استارتاپی کشور می‌داند.تیم دیتا در پوشهرسالت تیم دیتا در پوشه ذخیره، پردازش و تحلیل داده‌های کاربران با رعایت حریم خصوصی آنان و ارائه سرویس های مبتنی بر داده (عموما به کمک هوش مصنوعی و یادگیری ماشین) است. مثلا می‌توان کاربران یک منطقه جغرافیایی خاص را برای ارسال پیام انتخاب کرد. یا به صورت منظم به کاربرانی که بیشتر از یک برنامه خرید می‌کنند پیشنهاد تخفیف داد.جامعه برنامه نویسان و کاربرانحالا بیش از ۷ هزار برنامه نویس موبایل ایرانی از پوشه استفاده می‌کنند و کاربران تلفن همراه هوشمند، برنامه‌های دارای کتابخانه پوشه را بیش از ۸۳میلیون بار روی گوشی هایشان نصب کرده‌اند که با حذف نصب‌های تکراری به ۲۷میلیون کاربر یکتای اندروید در ایران می‌رسیم.این گزارش از تحلیل داده‌های ۲۷میلیون کاربر در آذر ماه سال ۹۷ به دست آمده و در دو بخش تقدیم شما می‌شود: در بخش نخست به تحلیل صنعت موبایل اندرویدی در کشور می‌پردازیم و در بخش دوم این گزارش به تحلیل صنعت ارسال اعلان یا پوش نوتیفیکیشن (Push Notification)  و به نوعی تعامل برنامه‌نویسان و صاحبان برنامه با کاربران خواهیم پرداخت، که می‌تواند برای بازاریابی دیجیتال (Digital Marketing) نیز مفید باشد.در اینجا به نکته‌ای در مورد رعایت حریم خصوصی کاربران نیز اشاره می‌کنیم. نخست اینکه پوشه هرگز اطلاعاتی را که به هر نوع امکان تشخیص هویت یک کاربر را فراهم کند، مانند نام کاربری، شماره تماس و IMEI، گردآوری نمی‌کند و در اختیار ندارد.دیگر اینکه مجوز تمامی دسترسی ها، برای مثال نوع اپراتور تلفن همراه یا برند دستگاه یا موقعیت جغرافیایی تقریبی کاربر، را برنامه نویس مستقیما از کاربر می‌گیرد. به توضیح دقیق‌تر از نسخه ۶ به بعد سیستم عامل اندروید، در همان نخستین بارِ استفاده‌ی صاحب برنامه از یک دسترسی خاص مانند مکان، مجوز آن از کاربر گرفته می‌شود. در نسخه‌های پیش از آن هم در هنگام نصبِ یک برنامه اجازه‌نامه ای به کاربر نمایش داده می‌شد که کاربر می‌توانست تمام دسترسی‌های برنامه را ببیند و سپس آن را نصب کند.جمعیت شناسی کاربرانتا ابتدای آذر سال ۹۷ ۷۲۰۰ برنامه نویس کتابخانه پوشه را به ۸۲ هزار برنامه اندرویدی خود افزوده‌اند. این ۸۲هزار برنامه نزدیک به ۷۵۰میلیون بار روی موبایل کاربران نصب شده‌اند که تنها ۸۳میلیون از این نصب‌ها فعال هستند، با این تعریف که در یک ماه گذشته به شبکه اینترنت متصل شده‌اند.با حذف نصب‌های تکراری برنامه ها می‌توان از ۸۳میلیون به آمار ۲۷میلیون کاربر یکتا رسید.از طرفی برنامه نویسان صاحب برنامه در یک سال گذشته به طور میانگین، ماهانه ۸ میلیارد اعلان از طریق پوشه برای کاربران خود ارسال کرده‌اند.توزیع جغرافیایی کاربران و ضریب نفوذ موبایل اندرویدیفراوانی کاربران تلفن همراه هوشمند در هر استان با درصد مشخص شده است. می‌توان دریافت که تهران با اختلاف زیادی بیشترین تعداد تلفن همراه در کشور را دارد و پس از آن مشهد، اصفهان و شیراز. استان خوزستان نیز تعداد زیادی تلفن همراه دارد و پس از این کلان شهر ها ۶درصد دستگاه‌های اندرویدی کشور در این استان قرار دارند.توزیع جغرافیایی کاربران موبایل اندرویدیدر دو نمودار زیر برای نمایش ضریب نفود دستگاه‌های تلفن همراه هوشمند به یک استان، پارامتر جمعیت را نیز در نظر گرفته‌ایم، به این صورت که تعداد موبایل‌های آن استان را بر جمعیت آن استان تقسیم کرده‌ایم. در نمودار سمت راست نفوذ موبایل در یک استان را با شدت رنگ نشان داده‌ایم. نمودار سمت چپ نیز نمایانگر تعداد موبایل‌ها در یک استان است مطابق نمودار بالایی و شدت رنگ میله ها، از ضریب نفوذ تلفن همراه به دست آمده است.ضر￼یب نفود تلفن همراه هوشمند و مقایسه استان های کشور بر اساس تعداد دستگاه موبایل با این حساب نیز تهران در صدر قرار می‌گیرد و می‌شود گفت نسبت بیشتری از تهرانی ها دارای تلفن همراه هوشمند هستند. پس از تهران می‌توان به استان های یزد، بوشهر، قم و اصفهان اشاره کرد که با رنگ‌های تیره‌تر مشخص هستند. البته برای صحت بیشتر این اطلاعات خوب بود علاوه بر نرمال سازی بر روی جمعیت، نرمال‌سازی‌هایی روی سن کاربران نیز انجام می‌شد، که  در این نمودار وارد نکرده‌ایم.جنسیت کاربرانپوشه اکنون با استفاده از ابزارهای یادگیری ماشین می‌تواند تخمینی از جنسیت کاربران، بر مبنای برنامه‌های نصب‌شده در موبایل آن‌ها، ارائه دهد. یادگیری ماشین مستلزم در دست داشتن حجم زیاد داده است که ماشین پوشه در چند ماه با آموختن از چندده‌هزار نمونه برچسب دار، توانسته با احتمال درستی ۸۵درصد جنسیت یک کاربر را حدس بزند. نمودار نشان می‌دهد تعداد خانم های کاربر موبایل از تعداد آقایان بیشتر است. توزیع جنسیت کاربران موبایل اندرویدی در کشورشبکه های ارتباطی (اینترنت) همراه کشوربخش زیادی از دستگاه‌هایی که در کشور هستند قابلیت اتصال به شبکه از طریق بیش از یک سیم کارت را دارند و بخشی از تبلت‌ها اصلاً سیم کارت نمی‌پذیرند و لزوما تناظری میان موبایل یا تبلت‌ها و سیم‌کارت‌ها وجود ندارد. و در حاشیه همین گزاره باید گفت که، با بررسی میان ۱۵۰ دستگاه پر استفاده در کشور، متوجه می‌شویم تبلت ها تنها ۶درصد از بازار دستگاه های اندرویدی کشور را در اختیار دارند و ۹۴درصد دیگر را تلفن‌های همراه کوچک‌تر در دست دارند.از میان ۶۹ میلیون دستگاه اندرویدی موجود در شبکه ارتباط همراه کشور، ۶۲ درصد آن‌ها دست کم از یک سیم کارت شرکت همراه اول استفاده می‌کنند و در مجموع ۵۱درصد سیم‌کارت های موجود متعلق به این اپراتور است.اپراتورهای تلفن همراه کشور نمودار پایین نیز نمایانگر سهم هر یک از اپراتورها از بازار کشور است. و به این صورت رسم شده است که تنها تعداد سیم کارت ها را در نظر گرفتیم، نه حجم مصرفی و زمان استفاده از شبکه از طریق آن‌ها. در این دو نمودار از اپراتورهایی که سهم بسیار کمی از بازار داشتند چشم پوشیدیم.سهم اپراتورها از بازار کشور بر اساس تعداد سیم کارت پشتیبانی دستگاه از شبکه ارتباطیاین نمودار امکان پشتیبانی دستگاه ها از فناوری اتصال به اینترنت را نشان می‌دهد. برای مثال می‌توان فهمید حالا اکثریت دستگاه‌های تلفن همراه در کشور از قابلیت 4G پشتیبانی می‌کنند.پشتیبانی دستگاه های موبایل کشور از فناوری اینترنت همراهنوع دسترسی کاربران ایرانی به اینترنتنمودار زیر نحوه دسترسی کاربران به اینترنت را نشان می‌دهد بر حسب طول بازه زمانی استفاده رسم شده است. مثلا یک کاربر به طور میانگین ۲۷درصد اوقات (و باز هم نه حجم مصرفی) از طریق فناوری 4G به اینترنت متصل است و احتمالا اگر حجم را وارد کنیم، کاربران مصارف حجمی خود را بیشتر از طریق اینترنت خانگی مدیریت می‌کنند.فناوری مورد استفاده برای اتصال به اینترنتشاید از مقایسه دو نمودار بالا بتوان حدس زد که هنوز زیرساخت کافی شبکه‌های مخابراتی در کشور توسط اپراتورها فراهم نشده و اینترنت پرسرعت آن‌طور که تکنولوژی تلفن‌های همراه گسترش یافتند به تمامی نقاط کشور نرسیده و یا اینکه هنوز بخشی از مردم سیم کارت های جدید دارای پشتیبانی از اینترنت همراه نسل چهارم را دریافت نکرده‌اند.هم‌چنین در نمودار زیر می‌توان کاهش استفاده از اینترنت خانگی WiFi و در عوض رشد استفاده از اینترنت 4G را از مرداد ۹۶ مشاهده کرد.فناوری مورد استفاده برای اتصال به اینترنت در طی زمان این نمودار بر اساس تعداد کاربران هر یک از ارائه‌دهندگان سرویس اینترنت کشیده شده است. به عبارت دیگر داده های این نمودار صرفا با نگاه به IP کاربران و تعیین ISP آن‌ها به دست آمده است نه زمان اتصال یا حجم مصرفی.سهم ارائه دهندگان اینترنت ISP ها از بازار برخی ارائه‌دهندگان اینترنت همراه، خدمات خانگی نیز دارند اما به طور کلی می‌توان از این نمودار غلبه نسبی اینترنت همراه را برداشت کرد.در گزارشی دیگر که در همین انتشارات منتشر خواهیم کرد، به شرح و تفصیل مشخصات تلفن‌های همراه هوشمند اندرویدی و ارسال اعلان و تعامل با کاربران را بررسی می‌کنیم.  انتشارات ما را دنبال کنید!</description>
                <category>پوشه</category>
                <author>پوشه</author>
                <pubDate>Sun, 30 Dec 2018 14:06:59 +0330</pubDate>
            </item>
            </channel>
</rss>