# docs The full text of every document served here, concatenated. --- ## About Us Source: `/blog/about.md` --- title: "About Us" date: 2023-10-02T07:55:28 source: https://blog.gordarg.com/en/about/ type: page --- # About Us Our‍ tea‍m off‍ers a‍ int‍egrated ran‍ge o‍f ser‍vices, fro‍m bus‍iness ana‍lysis t‍o sof‍tware eng‍ineering. Ou‍r tea‍m of‍ exp‍erienced pro‍fessionals ca‍n pro‍vide yo‍u wit‍h th‍e exp‍ertise an‍d res‍ources yo‍u nee‍d t‍o suc‍ceed. > W‍e ar‍e exc‍ited t‍o inv‍ite yo‍u t‍o par‍tner wit‍h ou‍r tea‍m t‍o hel‍p yo‍u rea‍ch you‍r bus‍iness goa‍ls. W‍e und‍erstand tha‍t run‍ning a‍ bus‍iness ca‍n b‍e cha‍llenging, an‍d w‍e ar‍e her‍e t‍o hel‍p. W‍e can‍ hel‍p yo‍u ana‍lyze you‍r bus‍iness, dev‍elop str‍ategies, an‍d cre‍ate cus‍tom sof‍tware sol‍utions t‍o mee‍t you‍r nee‍ds. W‍e bel‍ieve tha‍t ou‍r par‍tnership ca‍n hel‍p yo‍u rea‍ch you‍r goa‍ls an‍d tak‍e you‍r bus‍iness t‍o th‍e nex‍t lev‍el. > > Mohammad R. Tayyebi, Director W‍e loo‍k for‍ward t‍o hea‍ring fro‍m yo‍u an‍d dis‍cussing ho‍w w‍e ca‍n wor‍k tog‍ether. ## Join us We are always welcoming to those who believe in their power to make a difference. Please check our careers page for more information. --- ## Why “www” is Essential for Domain Names: A Fun Twist on Tradition and Modernity Source: `/blog/apex-or-www.md` --- title: "Why “www” is Essential for Domain Names: A Fun Twist on Tradition and Modernity" date: 2025-01-29T08:48:40 source: https://blog.gordarg.com/en/645/apex-or-www/ type: post --- # Why “www” is Essential for Domain Names: A Fun Twist on Tradition and Modernity In the wild west of web protocols, the “www” prefix stands as a trusty, old sheriff. While it may seem like a nostalgic nod to the early days of the internet, there’s a solid reason we like to keep things classic with “www”. Let’s go on a little adventure, shall we? ## The Importance of “www” in Domain Names **Subdomains and Organization** : Picture this: subdomains are like rooms in a massive mansion. If FTP and mail have their fancy rooms, why should the apex domain be left out in the cold? By using “www,” we’re basically giving our apex domain a cozy place to live, making it protocol-agnostic and keeping things neutral. ## The Classic “www” Prefix **Consistency and User Experience** : “www” is more than just a prefix—it’s like the secret handshake of the internet. When you see “www,” you immediately know you’re dealing with the web’s crème de la crème. Dropping it might leave some less tech-savvy folks scratching their heads, wondering where their old friend “www” went. ## Browser Behavior and Modern Practices Modern browsers are pretty slick—they often hide “www” and the schema (http or https) to streamline your experience. But just because you don’t see it doesn’t mean it’s not doing its job. By redirecting apex domains to “www” on ports 80 and 443, we’re making sure all web traffic comes to the right party. ## Embracing Web3 and Decentralization As we tip our hats to the future with Web3 and decentralized web infrastructures, the role of domain names gets even bigger. Think of “www” as the bridge between the trusty ol’ town and the shiny new city. It’s a familiar anchor point, guiding users through the wild frontier of Web3. ## Conclusion While the internet gallops forward, certain traditions like “www” deserve their place in the hall of fame. Embracing “www” as a subdomain ensures protocol neutrality, keeps things consistent, and makes life easier for everyone. Even as we step into Web3, this classic prefix serves as the friendly guide you can count on. So, whether you’re setting up a new website or tending to an old one, give a tip of the hat to “www”. After all, some traditions are not just worth preserving—they’re worth celebrating. --- ## ASP.NET Core CRUD: How to develop database records management? Source: `/blog/asp-net-core-crud-how-to-develop-database-records-management.md` --- title: "ASP.NET Core CRUD: How to develop database records management?" date: 2023-12-19T10:10:12 source: https://blog.gordarg.com/en/490/asp-net-core-crud-how-to-develop-database-records-management/ type: post --- # ASP.NET Core CRUD: How to develop database records management? ## Domain ### Create Database Models ### Define Repository Interfaces ## Database ### Configure Database Context ### Implement Repositories ## Migrations ### Generate Migrations ### Update Database ## Controllers ### Add Controller ### Startup Dependency Injection --- ## Get rid of autoload.php Source: `/blog/autoload-php.md` --- title: "Get rid of autoload.php" date: 2025-02-14T14:17:05 source: https://blog.gordarg.com/en/660/autoload-php/ type: post --- # Get rid of autoload.php Inspired from [simple-psr-4-autoloader]() . > Have you ever used a `composer.json` file purely for the need of registering a PSR-4 autoloader? I have, and it always felt a little weird to require such a hunk of code for such a simple task. It adds a `vendor` folder and a bunch of empty files. I don’t like that overhead when it’s not necessary. > > It’s also not ment to replace Composer in any way, because that is way more optimized. It’s just that for a simple plugin or theme you don’t need the overhead Composer creates. --- ## Connect to internal network through SSH tunnel Source: `/blog/connect-to-internal-network-though-ssh-tunnel.md` --- title: "Connect to internal network through SSH tunnel" date: 2023-10-31T06:53:39 source: https://blog.gordarg.com/en/337/connect-to-internal-network-though-ssh-tunnel/ type: post --- # Connect to internal network through SSH tunnel Access to the private network is possible through credit servers. These servers have enough privileges and cryptographic requirements to pass the firewalls. Other network nodes are blocked. Authorized people, who have login credentials, may tunnel their traffic from these servers to transfer data. There are so many methods including VPN; we mostly prefer SSH. Which is lightweight, global, and almost zero-config. > Secure Shell (SSH) Protocol is a protocol for secure remote login and other secure network services over an insecure network. > > [RFC 4250](), [RFC 4251](), [RFC 4252](), [RFC 4253](), [RFC 4254]() ## Client Machine Based on your running OS, choose a guide below and set the proxy address for applications which traffic are about to tunnel. ![](../media/grafik-1-1024x751.png) You can test your connection by sending an HTTP request or navigating to [api.ipify.org]() on your web browser which should return the server’s IP address back. ### Linux It is possible to forward the server port on a local loop-back device and pass the traffic from defined port as a MITM proxy by the command below: ssh -D @ -p -fTNC If you already have access to authorized SSH keys, you may not need to use `sshpass` tool to login to your account. It is not recommended at all, to store password in plain-text format on your device and we strongly recommend using encrypted keys. But in case of temporary guest usage, you may store following commands in an `.sh` file: SSHPASS='' sshpass -e ssh -o StrictHostKeyChecking=no -D @ -p -fTNC Note that, `sshpass` is a third-party tool which can be installed using `apt install sshpass` . ### Windows SSH clients mostly support port forwarding. Based on your SSH client, follow their guidelines. Then you may set your proxy address from _Internet Options_ or from inside of the application’s settings. ## Server To create a proxy user, administrators must disable their permissions and logins. # Define user useradd -r # Change their password passwd # Disable their login usermod -s /sbin/nologin --- ## Docker installation Source: `/blog/docker-installation.md` --- title: "Docker installation" date: 2023-10-31T16:52:00 source: https://blog.gordarg.com/en/359/docker-installation/ type: post --- # Docker installation ## Prerequisites sudo apt update sudo apt install \ ca-certificates \ curl \ gnupg \ lsb-release ## Add official Docker’s GPG key # Detect the Linux distribution . /etc/os-release # Download Docker's GPG key based on the distribution if [[ "$ID" == "ubuntu" || "$ID" == "debian" ]]; then curl -fsSL https://download.docker.com/linux/$ID/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg else echo "Unsupported distribution: $ID" exit 1 fi # Set permissions for the GPG key if [[ "$ID" == "ubuntu" || "$ID" == "debian" ]]; then sudo chmod a+r /etc/apt/keyrings/docker.gpg fi # Set up the Docker repository if [[ "$ID" == "ubuntu" || "$ID" == "debian" ]]; then echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/$ID $VERSION_CODENAME stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update --allow-insecure-repositories fi ## Install Docker engine sudo apt --allow-unauthenticated install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin Receiving a GPG error when running ‘apt update‘? Your default `umask` may not be set correctly, causing the public key file for the repo to not be detected. Run the following command and then try to update your repo again: ‘`sudo chmod a+r /etc/apt/keyrings/docker.gpg`‘. ## Run ‘docker‘ without ‘sudo‘ sudo groupadd docker sudo usermod -a -G docker $USER groups grep docker /etc/group newgrp docker ## Validate installation sudo docker run hello-world --- ## Easy CI/CD Source: `/blog/easy-ci-cd.md` --- title: "Easy CI/CD" date: 2023-12-01T20:06:38 source: https://blog.gordarg.com/en/417/easy-ci-cd/ type: post --- # Easy CI/CD Git servers, provide features commonly named ‘Actions’ to handle CI/CD operations. Parallel solutions to achieve the requisites are available. Linux has a built-in functionality to support repeating scheduled tasks (also known as ‘CronJobs’ in some refs) called `crontab`. The deamon responsible for `crontab` will send a mail to user who triggered the action which may cause storage and mail transfer issues. Before all let’s disable this in case of no reason to keep all audit logs by setting the environment variables. Also there are alternative ways so far. MAILTO="" To redirect `echo` outputs to `stderr` instead of `stdout`, there is a clean method for this: echoerr() { echo "$@" 1>&2; } It is optional to prepend the line above to the `cicd.sh` file containing scripts below: SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" declare -a ProjectsArray=("project1" "project2" "project3") for project in ${ProjectsArray[@]}; do cd $SCRIPTPATH/d/$project git fetch if [[ $(git diff origin/master) ]]; then git pull sudo rm -rf bin/ obj/ publish/ docker compose -f docker-compose.mssql.yml up -d docker compose up -d --build | mail -s "CI/CD $(date) $(pwd)" ubuntu else echoerr "no changes in $(pwd)" fi; done This will check project folders mentioned in the `SCRIPTPATH` array and will check their git status. If there are pending incoming changes, it will pass the condition, pull changes and rebuild the containers. This will keep the project updated with a low overhead. Finally, using the `crontab -e` an editor will prepare a safe method to place codes below in crontab configuration. * * * * * sudo su -c /home//cicd.sh | wall Finally, if mails are not disabled, it’s possible to publish last 500 lines of logs over the net using `netcat` with a simple web server. while true; do { echo -e “HTTP/1.1 200 OK\r\n”; tail -n 500 /var/mail/; } | nc -N -l ; done --- ## Seamless Failover at the Apex: How to Use Cloudflare Load Balancing for High Availability Source: `/blog/failover.md` --- title: "Seamless Failover at the Apex: How to Use Cloudflare Load Balancing for High Availability" date: 2025-06-30T14:11:58 source: https://blog.gordarg.com/en/683/failover/ type: post --- # Seamless Failover at the Apex: How to Use Cloudflare Load Balancing for High Availability If you’re managing a production website, high availability isn’t a luxury — it’s a necessity. Imagine this: your primary server unexpectedly goes down. With no standby, your users are met with an error page and your brand takes a hit. Now, imagine a better scenario — within seconds, traffic reroutes to a standby server, preserving uptime while you fix the issue. That’s the magic of **Cloudflare Load Balancing**. In this post, I’ll show you how to configure failover for your **apex domain** (e.g., `example.com`) using two backend servers: one live and one on standby. * * * ## The Goal * **Primary server** = serves live data. * **Standby server** = backup, possibly with older data. * **Only** use standby if primary fails. * Works even at the apex domain (thanks to Cloudflare Load Balancer). * * * ## Step-by-Step Configuration ### 1\. Prep Your Infrastructure Make sure both servers: * Are accessible via public IP or resolvable hostname. * Respond on a simple endpoint (like `/health`) that can be used for uptime checks. ### 2\. Log In to Cloudflare * Go to the domain you want to configure. * Navigate to the **“Traffic”** section. * Open **Load Balancing** (note: it’s a paid add-on). ### 3\. Set Up Your Load Balancer Click **“Create Load Balancer”** and configure: * **Hostname:** Leave this blank for apex (`example.com`). * **TTL:** Use a low TTL (e.g., 30 seconds) for fast response to failures. ### 4\. Create Pools Pools define which servers serve traffic. #### 🔹 Pool 1: Primary * Name: `Primary-Pool` * Add your live server. * Configure a **health check** (e.g., `https://yourdomain.com/health`, status code 200). #### 🔹 Pool 2: Standby * Name: `Standby-Pool` * Add the backup server. * Use the same health check logic. ### 5\. Define Failover Order * Drag `Primary-Pool` to the top. * Enable **Failover** mode. * Optionally disable session affinity (unless sticky sessions are needed). ### 6\. Point DNS to Load Balancer * Go to the **DNS tab** for your domain. * Make sure your `@` record is an A or CNAME pointing to the load balancer. * Keep **orange cloud enabled** for proxying and failover. * * * ## Testing the Setup Bring your primary server offline or simulate a failed health check: * You should see traffic shift to the standby within seconds. * Restore the primary — traffic will return automatically once it’s healthy. * * * ## Pro Tip Want a smarter health check than just HTTP 200? Write a custom `/health` route that tests: * Database connectivity * Disk space * App responsiveness * Anything critical to your service’s integrity --- ## Front-end Contribution Source: `/blog/front-end-contribution.md` --- title: "Front-end Contribution" date: 2023-12-02T17:26:12 source: https://blog.gordarg.com/en/470/front-end-contribution/ type: post --- # Front-end Contribution # Umbrella rules 1. Mobile-first Design: Design for mobile, then use `@media` for larger display (>720px). 2. DRY * Use `_Layout.php` repeating Web GUI elements * Use `helpers/` reapting components * Use `lib/` repeating logics 3. If it works, don’t add attributes to elements, and dont nested them. # Branch * Branch names pattern: ``–`` * Label your WIPs # PHP Installation apt install php # Clone git clone https://git.gordarg.com/arad/website # Pull cd git submodule update --init --remote --recursive git pull --recurse-submodules --jobs=10 # Setup configuration cp app/core/Config.php.sample app/core/Config.php nano app/core/Config.php # Launch php -S 127.0.0.1:8000 --- ## Git configurations Source: `/blog/git.md` --- title: "Git configurations" date: 2023-10-09T16:39:53 source: https://blog.gordarg.com/en/148/git/ type: post --- # Git configurations ## Verbose Git Add lines below to your `~/.bashrc` or whatever you prefer: export GIT_TRACE=1 export GIT_CURL_VERBOSE=1 export GIT_SSH_COMMAND="ssh -vvv" ## Automatic version tagging Due to instant shipping of our main branch codes on production, it is essential to publish a version number with the code. In this case, we are writing version to a `.txt` file which is readable by the code as required. This code is based on a [stackoverflow.com answer](). #!/bin/bash ver_file=version.txt > $ver_file date +"%Y-%m-%d %T %:z" >> $ver_file echo -n "Parent: " >> $ver_file git rev-parse HEAD >> $ver_file git add $ver_file echo "Date-time and parent commit added to '$ver_file'" exit 0 This code must placed in `~/.git-templates/hooks/pre-commit` with execute permission. Please not that you can permit a file to execute with `chmod a+x ~/.git-templates/hooks/pre-commit` command Linux. Then git must be configured to refer to the templates directory `git config --global init.templatedir '~/.git-templates'`. This will not work without re-initialization of the repository: `git init`. --- ## Mastering Google Search Console: A Tactical Guide Source: `/blog/google-search-console.md` --- title: "Mastering Google Search Console: A Tactical Guide" date: 2025-01-29T20:05:20 source: https://blog.gordarg.com/en/649/google-search-console/ type: post --- # Mastering Google Search Console: A Tactical Guide Google Search Console (GSC) is the secret weapon in your SEO arsenal—versatile, powerful, and sometimes underutilized. If you’re aiming to conquer the search rankings, understanding GSC is mission-critical. Here’s a tactical breakdown of its main menus and submenus, infused with a touch of humor to keep things engaging. * * * #### **1\. Dashboard** * **Overview** : Your command center upon logging in. It provides a snapshot of your site’s performance metrics—clicks, impressions, and any lurking issues. Think of it as the morning briefing before you head into battle. * * * #### **2\. Performance** * **Search Results** : Automatically enabled, this is where the rubber meets the road. It displays performance data like click-through rates and average positions. It’s your site’s report card—aim for straight A’s! * **Discover** : No setup required. This tracks your site’s visibility in Google Discover. It answers the question, “Are we accidentally famous yet?” * **Google News** : Enabled if your site is featured in Google News. It provides performance data for news articles, so you can see if your headlines are making headlines. * * * #### **3\. URL Inspection** * **Inspect any URL** : Enter any URL to check its indexing status and crawl details. It’s like asking Google, “Do you know this page exists, or is it lost in cyberspace?” * * * #### **4\. Coverage** * **Errors** : Automatically generated list of pages with indexing errors. These are the potholes on your website’s highway—time to get the repair crew. * **Valid with Warnings** : Pages that are indexed but have issues needing attention. Consider them the teenagers of your site—mostly good but occasionally rebellious. * **Valid** : Successfully indexed pages. These are your model citizens. * **Excluded** : Pages intentionally not indexed. They’re in witness protection for a reason. * * * #### **5\. Sitemaps** * **Submitted Sitemaps** : Submit your sitemaps here to keep Google informed about your site structure. It tracks submission status and any errors—because even Google appreciates a good roadmap. * **Individual URL Submissions** : Roll out the red carpet for specific pages by submitting individual URLs for crawling. Perfect for those VIP pages needing immediate attention. * * * #### **6\. Experience** * **Core Web Vitals** : Enabled by default, this measures user experience metrics like Largest Contentful Paint (LCP), First Input Delay (FID), and Cumulative Layout Shift (CLS). In layman’s terms, it’s making sure your site isn’t a haunted house of slow load times and unexpected jumpscares. * **Mobile Usability** : Automatically enabled, it identifies issues affecting mobile users. Because in a world where smartphones are essentially an extra limb, mobile friendliness isn’t optional. * * * #### **7\. Links** * **External Links** : No setup needed. It measures backlinks to your site—the digital high-fives from other websites. * **Internal Links** : Auto-enabled, tracking how well your site pages connect with each other. Strong internal links are like a close-knit family—everyone supports each other. * **Top Linking Sites** : Lists the domains that most frequently link to you. Think of it as your site’s fan club. * **Top Linking Text** : Identifies the most common anchor text used in links to your site. It’s useful to know how others are labeling you—nicknames and all. * * * #### **8\. Enhancements** * **Breadcrumbs** : Implement breadcrumb structured data in your HTML to improve navigation. After all, even Hansel and Gretel needed breadcrumbs to find their way. * **FAQ** : Use FAQ schema markup to help Google understand your frequently asked questions. It’s like providing the answers before the questions are even asked—a time-saver for everyone. * **How-to** : Add how-to structured data to showcase your tutorial content. Teach the world to bake sourdough or change a tire—your expertise deserves the spotlight. * **Mobile Usability** : Same as in the “Experience” menu, ensuring your mobile visitors aren’t dealing with tiny text and impossible buttons. * **Sitelinks Searchbox** : Implement search box structured data to provide users with a search option directly in the search results. Because who doesn’t appreciate shortcuts? * **Videos** : Use video schema markup to help your multimedia content shine in search results. Lights, camera, index! * * * #### **9\. Security & Manual Actions** * **Security Issues** : Alerts you to any security problems detected on your site. It’s the guard dog that never sleeps, keeping cyber miscreants at bay. * **Manual Actions** : Displays any manual penalties imposed by Google. Hopefully, this area remains as empty as a desert island—no news is good news here. * * * #### **10\. Legacy Tools and Reports** * **International Targeting** : Use hreflang tags to target specific regions and languages. Whether you’re saying “Hello,” “Hola,” or “你好,” make sure your content greets users appropriately. * **Crawl Stats** : Auto-generated statistics on Googlebot’s crawling activity. Ever wonder how often Google stops by? Now you can track its visits like a friendly neighbor. * **Messages** : View communications from Google regarding your site. It’s like checking your mailbox—sometimes it’s good news, occasionally it’s bills. * **URL Parameters** : Specify how URL parameters should be handled to affect crawl behavior. Tame those wild URL parameters before they lead Google on a wild goose chase. * * * #### **11\. Settings** * **Ownership Verification** : Verify ownership via HTML files, DNS records, or meta tags. It’s Google’s way of ensuring you’re the rightful captain of this ship. * **Users and Permissions** : Add, remove, or modify user permissions. Control who has access—too many cooks can spoil the SEO broth. * **Change of Address** : Notify Google when moving your site to a new domain. Consider it your website’s forwarding address form. * **Site Settings** : Manage site settings such as crawl rate. It’s like setting your site’s cruise control for Google’s crawlers. * * * By strategically leveraging each section of Google Search Console, you can transform your website from an online presence into an SEO powerhouse. Regular check-ins with GSC will keep you ahead of potential issues and ensure your site is always performing at its peak. Remember, in the high-stakes game of search rankings, staying informed and proactive isn’t just an advantage—it’s a necessity. So suit up, dive into GSC, and let the data guide you to the top of the search results. * * * **Pro Tip:** Bookmark key reports in GSC for quick access. Your future self will thank you when you’re navigating through data like a seasoned pro. --- ## نمونه‌ی قرارداد Source: `/blog/hello-world.md` --- title: "نمونه‌ی قرارداد" date: 2023-10-02T07:55:28 source: https://blog.gordarg.com/fa/1/hello-world/ type: post --- # نمونه‌ی قرارداد ![](../media/bism.png) تاریخ: یکــــــم / مهرماه / ۱۴۰۲ خورشیدی قرارداد همکاری کوتاه مدت در قالب تعریف پروژه و فعالیت پیمانی فاز اول پروژه‌ی …. * * * 1. **تعاریف** پیمانکار شخص حقیقی یا حقوقی ذیصلاحی است که براساس اسناد و مدارک پیمان به عنوان مجری اصلی موضوع پیمان شناخته می شود. پیمانکار فرعی شخص حقیقی یا حقوقی ذیصلاحی است که پیمانکار اصلی با وی برای انجام بخشی از امور، قرارداد منعقد نموده و پیمانکار مربوطه ملزم به اجرای تعهدات براساس اسناد و مدارک موضوع پیمان می باشد. محرمانگی اطلاعاتی است که افشای آن‌ها امنیت سیستم را به خطر می‌اندازد و یا ممکن است به هر نحو من جمله استفاده از سوی رقبا به مجموعه ضرر وارد سازد. اطلاعات محرمانه می‌تواند شامل اطلاعات دارایی‌ها، برنامه‌ها، فرایند‌های انجام کارها، اهداف سازمان، و یا اطلاعات در مورد نقاط ضعف سازمان باشد. اطلاعات محرمانه به صورت نوشتاری، دیجیتال و شفاهی اعلام می‌شوند. فناوری فناوری به معنی کاربرد منظم معلومات علمی و دیگر آگاهی‌های نظام‌یافته برای انجام وظایف علمی است. فناوری را می‌توان کلیهٔ دانش‌ها، فرآیندها، ابزارها، روش‌ها و سیستم‌های به کار رفته در ساخت محصولات و ارائهٔ خدمات تعریف کرد. فناوری کاربرد عملی دانش و ابزاری برای کمک به تلاش انسان است. عدم افشای اطلاعات عدم استفاده غیر مجاز از اطلاعات و یا در اختیار قراردادن اطلاعات به افراد غیر مجاز است؛ همچنین باید محافظت لازم از اطلاعات صورت گیرد تا از دسترسی افراد غیر مجاز محفوظ باشد. استفاده‌ی غیر مجاز از اطلاعات استفاده از اطلاعات در مواردی غیر از پروژه‌های تعریف شده شرکت و حدود آن‌هاست. افراد غیر مجاز هر فردی که این سند را امضا نکرده یا نماینده‌ی تام‌الاختیار امضا کنندگان نیست و یا به صورت رسمی مجاز شناخته نشده است، غیر مجاز است. ساختار شکست کار ساختار شکست کار را می‌توان بدین ترتیب تعریف کرد: یک ساختار شبکه‌ای یا درختی به صورت گرافیکی است برای نشان دادن روش تولید محصول یا خدمت شامل، بخش‌های سخت‌افزار، نرم‌افزار، خدمات و سایر وظایفی که یک سازمان یا شرکت انجام می‌دهد مانند کارهایی که باید انجام شود تا یک محصول یا خدمت مشخص تولید یا ارائه شود. در این تعریف منظور از «کارهایی که باید انجام شود» انجام و اتمام یک پروژه با بودجه و زمان مشخص است. تدوین ساختار شکست کار به عنوان یک نظام کاری، برای اطمینان از مشارکت‌کنندگان در اجرای پروژه، اعم از کارفرما، پیمانکاران/فروشندگان است که همگی بدانند چه عملیاتی برای تکمیل پروژه مورد نیاز است. استفاده از ساختار شکست کار به عنوان یک شالوده اطلاعاتی، برقراری ارتباط صحیح دربارهٔ پروژه را برای گروه‌های کاری و سازمانهای حکومتی ناظر بر پروژه و سایر فرایندهای قانونی، از طریق کاربرد یک مبنای مشترک، تسهیل می‌کند. تحت شبکه / تحت وب نرم‌افزار از پروتوکل HTTP و کلیات استانداردهای W3C پیروی کند. انتظار می‌رود چنین نرم‌افزارهایی در بستر مناسب شبکه، به وسیله‌ی نرم‌افزارهای مرورگر اینترنت قابل دسترسی باشند. نرم‌افزارهای تحت شبکه می‌توانند با رعایت پیکربندی‌های خاصی، در شبکه‌ی داخلی سازمان‌ها یا شبکه‌ی اینترنت در دسترس باشند. باگ / خطای نرم‌افزار به اشکالاتی که کاربران طی کار با نرم‌افزار با آن برخورد می‌کنند و منشاء آن در کد نرم‌افزار است، باگ یا خطای نرم‌افزار گفته می‌شود. فیچر / قابلیت مجموعه‌ی عملیاتی هدفمند که در دسترس کاربران نرم‌افزار قرار می‌گیرد فیچر یا قابلیت گفته می‌شود. پروژه > **پروژه** متشکل از مجموعه فعالیت‌هایی است که توسط فرد یا افرادی به منظور رسیدن به یک نقطه هدف، تنها برای یک بار، در یک زمان مشخص و در یک مکان انجام می‌پذیرد. یک **پروژه** دارای مراحل مختلفی است که هر مرحله دارای خصوصیت خاص خود و نیازمند تصمیم‌گیری‌های متناسب با آن است. > > [ویکی‌پدیا]() طراحی پودمانی (ماژولار) > یک اصل در طراحی است که یک منظومه را به قطعات کوچکتر به نام _پودمان_ تقسیم می‌کند. پودمان‌ها می‌توانند به طور مستقل ایجاد شوند، اصلاح شوند، جایگزین شوند یا با پودمان‌های دیگر یا بین سامانه‌های مختلف جابه‌جا شوند. > > [ویکی‌پدیا]() 2. **قانون حاکم بر قرارداد** این توافق‌نامه در راستای قوانین موضعه جمهوری اسلامی ایران و با تبعیت از قواعد عام حقوقی تعیین شده و در هر حال قوانین و قواعد حقوقی بر آن حکومت دارد. 3. **موضوع** 4. **طرفین** * طرف اول شرکت … به شماره‌ی …… آدرس …… کد پستی …… به مدیریت آقا / خانم …. فرزند ….. صادره از … به شناسه (کد) ملی … . * طرف دوم شرکت … به شماره‌ی …… آدرس …… کد پستی …… به مدیریت آقا / خانم …. فرزند ….. صادره از … به شناسه (کد) ملی … . * در این قرارداد طرف اول به عنوان کارفرما و طرف دوم به عنوان پیمانکار شناخته می‌شود. 5. **پیمانکاران فرعی** پیمانکاران فرعی حق دسترسی به اطلاعات را دارند. 6. **عدم افشای اطلاعات و مالکیت معنوی** اطلاعاتی که سرمایه‌ی معنوی و دستاوردهای گروه به شمار می‌آیند، شامل تعهد «عدم افشای اطلاعات» می‌گردند که به موجب آن، طرفین موظف‌اند از اطلاعاتی که محرمانه و یا پرارزش تلقی می‌شوند در قبال افراد غیر مجاز حراست نمایند. در صورتی که پیمانکار(اطلاعات شامل؟) و کارفرما به هر نحوی اطلاعات محرمانه‌ی طرف مقابل را افشا نماید، طرفی که اطلاعات مربوط به آن افشا شده است، حق برخورد قانونی بر مبنای مواد ۶۴ و ۷۵ قانون تجارت الکترونیکی، ماده ۱ قانون مسئولیت مدنی و سایر مقررات مربوطه را خواهد داشت. تبصره: در صورت اثبات دزدی اطلاعات محرمانه که شامل دسترسی غیر مجاز به سیستم‌های اطلاعاتی (هک)، سرقت مستندات فیزیکی و سخت‌افزاری باشد، افشا به حساب نمی‌آید. مدت: تعهد طرفین به عدم افشای اطلاعات تا شش ماه پس از اتمام و یا فسخ این قرارداد الزامی است. 7. **منع رقابت** طرفین تعهد می‌نمايند در طول مدت اين قرارداد و تا سه ماه پس از انقضا، تعليق يا فسخ آن، از ارائه هرگونه خدمات/مشاوره و انجام هرگونه فعالیت برای رقيب و شخص/اشخاصی (اعم از حقیقی يا حقوقی) که به هر نحو در رقابت با فعالیت‌های طرف دیگر است اجتناب نمايند، در غير اينصورت مکلف به جبران خسارت نقض تعهد خواهند بود. به موجب قوانین فوق الذکر، تصرف غير معمول تجاری، صنعتی، و قانونی نسبت به نام، شهرت و اعتبار طرف دیگر كه باعث اشتباه شدن محصول ایشان با ديگر محصولات شده و آنها را از منشا و مبدا توليد محصول گمراه نمايد ممنوع است. (این تعهد برای پیمانکار معنی دارد.) **8\. استفاده‌ی آموزشی و تبلیغاتی** مشتری با امضای این قرارداد به پیمانکار اجازه می‌دهد تا از جزئیات پروژه‌های درحال ساخت برای اهداف تبلیغاتی و یا آموزشی استفاده کند. این شامل تولید محتوا و انتشار آن‌ها در اینترنت و سایر رسانه‌ها و همچنین برای آموزش کارکنان است. مشتری نیز می‌پذیرد که اطلاعاتی مانند نام و نشان ممکن است در این محتوا آشکار شود. مشتری تایید می‌کند که با این موضوع موافقت کرده و هیچ ادعایی در این زمینه علیه پیمانکار نخواهد داشت. 8. **یادداشت‌ها و مکاتبات** کلیه‌ی یادداشت‌ها و مکاتباتی که در ارتباط با انجام موضوع قرارداد از یکی از طرفین برای طرف دیگر ارسال می‌گردد باید یا مستقیماً به نشانی طرف دیگر ارسال گردیده و رسید دریافت شده و یا از طریق تایید پیامکی تلفن همراه و یا از طریق دورنگار (فکس) و یا به وسیله‌ی پست سفارشی به نشانی که در قرارداد مشخص گردیده است ارسال گردد. برای یادداشت‌هایی که به وسیله‌ی دورنگار ارائه می‌گردند، با اعلام خودکار دستگاه گیرنده، موارد تحویل شده تلقی می‌شوند. (قرار شد چت با اتکا به ایمیل ایجاد شود.) 9. **شرح و جزئیات پیاده‌سازی** به پیوست … []() 10. **محل اجرای قرارداد** 11. **اختیارات** 12. **حقوق معنوی** حقوق معنوی تولیدات کارمند در این قرارداد، شامل حقوق اختراعات، ابتکارات، متعلق به کارمند خواهد بود که می‌تواند به صورت جداگانه مورد توافق و واگذاری قرار گیرد.(شرح و مفهوم؟) 13. **حقوق مادی فعالیت‌های موضوع** کارفرما موظف به پرداخت هزینه‌ی انجام پروژه و هزینه‌ی تهیه‌ی ابزار موضوع قرارداد به پیمانکار طبق برنامه‌ی زمان‌بندی که در ادامه آمده است از طریق واریز مبلغ به حساب زیر و دریافت رسید تایید است: * پیش پرداخت … درصد کل * تکمیل پروژه …. درصد * تحویل پروژه …… درصد * شماره‌ی کارت ………. به نام ………. بانک …….. مبلغ کل پروژه: به عدد --- **999,999,999 تومان** به حروف **….. ریال** 14. **بودجه‌بندی و زمان‌بندی منابع** 15. **تغییر در قرارداد** هرگونه تغییر در این قرارداد رسمیت نخواهد داشت مگر به صورت مکتوب و صریح به امضای طرفین برسد. (چت مبتنی بر ایمیل) 16. **تغییر در نشانی و یا راه‌های ارتباطی** هرگاه یکی از طرفین قرارداد نشانی و یا تلفن تماس قانونی خود را در مدت قرارداد تغییر بدهد باید کتبا این تغییر را به طرف دیگر ابلاغ کند و تا وقتی که نشانی و یا شماره‌ی تلفن جدید به طرف دیگر اعلام نشده است، کلیه‌ی نامه‌ها، اوراق و مکاتبات، به نشانی و شماره‌ی قانونی ارسال و تمام آن‌ها ابلاغ شده تلقی خواهند شد. 17. **انواع خسارت و فورس ماژور** هرگاه به علت حوادث قهری و غیرمترقبه هر یک از طرفین نتوانند تعهدات خود را انجام دهند باید، عدم انجام تعهدات نقض قرارداد تلقی نخواهد شد. جنگ، اعم از اعلام شده یا نشده، انقلاب‌ها و اعتصاب‌های عمومی، شیوع بیماری‌های واگیردار، زلزله، سیل و طغیان‌های غیر عادی، خشکسالی‌های بی سابقه، همچنین آتش‌سوزی‌های دامنه‌دار که ناشی از کار پیمانکار نباشد، جزو حوادث قهری محسوب شده و در مورد خسارات ناشی از آن‌ها به ترتیب زیر عمل خواهد شد: پیمانکار در صورت بروز شرایط فورس ماژور بایستی به صورت بلادرنگ موضوع را به اطلاع کارفرما برساند. کارفرما به تشخیص خود و هم‌فکری با پیمانکار تدابیر لازم را اتخاذ خواهد نمود. در طول مدت تعذر پیمانکار موظف است حداکثر تلاش خود را جهت حفظ اقدام‌ها انجام شده و مدارک تولید شده به بهترین نحو مطلوب و با کمترین تاخیر به عمل آورد. 18. **حل اختلاف** در صورت بروز اختلافات، موضوع بدوا در جلسه‌ی مشترک بررسی می‌گردد و در صورت عدم توافق از طریق مراجع قضایی صالح پیگیری و رأی صادره از این مراجع مورد تایید طرفین و لازم‌الاجرا خواهد بود. 19. **انتقال تعهدات به غیر** پیمانکار مگر در صورت توافق طرفین حق انتقال تعهدات به غیر را نخواهد داشت. 20. **تعلیق قرارداد** چنانچه کارفرما به دلایلی به غیر از اشتباه پیمانکار و یا حوادث غیر مترقبه، کار را موقتاً و با اعلام کتبی معلق نماید، موظف است حقوق و دستمزد پیمانکار را طبق شرایط عادی پرداخت نماید. پیمانکار موظف است در طی این مدت همانند شرایط عادی آماده به انجام وظایف بماند. پیمانکار در صورت دریافت نامه‌ی کتبی برای تعلیق قرارداد، فوراً ارائه‌ی خدمات را به حالت تعلیق درآورده و هزینه‌ها را به حداقل مورد توافق طرفین کاهش خواهد داد. کارفرما با یک اعلام قبلی ۵ روزه می‌تواند از پیمانکار بخواهد که انجام وظایف محول شده در مدت اجرای قرارداد را از سر بگیرد. اگر تعلیق قرارداد بیش از ۳۰ روز به طول بیانجامد پیمانکار حق فسخ قرارداد را خواهد داشت. 21. **خروج از قرارداد** هر یک از حالات زیر موجب فسخ این قرارداد است: * در صورتی که پیمانکار به وظایف خود عمل نکند و یا از الزامات اعلام شده در این سند برخوردار نباشد؛ و با مهلت دو هفته پس از دریافت اخطار کتبی  قادر به رفع نقایص نباشد. * بر اساس اختیار یکی از طرفین در صورتی که طرف دیگر منحل گردیده باشد. * بر اساس توافق طرفین. * بر اساس توافق طرفین در صورتی که حالت فورس ماژور از سه ماه طولانی‌تر گردیده باشد. * بر اساس اختیار پیمانکار در صورتی که انجام تعهدات کارفرما از سه ماه بیشتر به طول انجامیده باشد. * اگر طرفین بر روی جزئیات وظایف به توافق نرسند قرارداد فسخ می‌گردد. * تبصره: خروج از قرارداد بدون توافق طرفین و یا احراز نشدن عدم التزام تعهدات یکی از طرفین، مستلزم پرداخت خسارت خواهد بود. 22. **نسخه‌های قرارداد** این قرارداد در دو نسخه تهیه شده، و به امضای طرفین رسیده و به ایشان تحویل گردیده است. --- ## How to install and configure PHP Debugger on Windows and Visual Studio Code Source: `/blog/how-to-install-php-debug-in-vscode.md` --- title: "How to install and configure PHP Debugger on Windows and Visual Studio Code" date: 2023-10-10T17:11:27 source: https://blog.gordarg.com/en/159/how-to-install-php-debug-in-vscode/ type: post --- # How to install and configure PHP Debugger on Windows and Visual Studio Code One of the most common ways while you are writing code in PHP is to use the `var_dump()` command to debug the output of a written code, but another way in case of facing errors is to install PHP Debugger Install PHP Debugger for vscode 1. Open the terminal, and type this command: `php -v `(remember the version of the PHP that is installed on your Windows) 2. Use this [link]() and download the appropriate file of Xdebug for your PHP version 3. Rename the `.dll` file to `php_xdebug.dll` and move it to `C:\php\ext\` or any other preferred path. 4. In all steps, you can check your configurations using the command `php --ini` 5. Go to the PHP installation directory and open the `php.ini` file with a text editor such as Notepad and then paste the lines in the “extensions” section: * For Xdebug v2.x.x: * `zend_extension=C:\php\ext\php_xdebug.dll` * `xdebug.mode=debug` * `xdebug.start_with_request=yes` 6. Congrats! You have installed the debug. You can add `launch.json` to add debug options in vscode 7. Now your awesome journey begins: By pressing the `F5` you can enjoy breakpoints --- ## How to log history from all users and customize PS1 for ever user Source: `/blog/how-to-log-history-from-all-users-and-customize-ps1-for-ever-user.md` --- title: "How to log history from all users and customize PS1 for ever user" date: 2023-12-09T05:49:17 source: https://blog.gordarg.com/en/476/how-to-log-history-from-all-users-and-customize-ps1-for-ever-user/ type: post --- # How to log history from all users and customize PS1 for ever user ## How to log history from all users and customize PS1 for ever user > The shell program `/bin/bash` (hereafter referred to as just “the shell”) uses a collection of startup files to help create an environment. Each file has a specific use and may affect login and interactive environments differently. The files in the `/etc` directory generally provide global settings. If an equivalent file exists in your home directory it may override the global settings. > > An interactive login shell is started after a successful login, using `/bin/login`, by reading the `/etc/passwd` file. This shell invocation normally reads `/etc/profile` and its private equivalent `~/.bash_profile` (or `~/.profile` if called as **/bin/sh**) upon startup. > > An interactive non-login shell is normally started at the command-line using a shell program (e.g., `[prompt]$`**/bin/bash**) or by the **/bin/su** command. An interactive non-login shell is also started with a terminal program such as **xterm** or **konsole** from within a graphical environment. This type of shell invocation normally copies the parent environment and then reads the user’s `~/.bashrc` file for additional startup configuration instructions. > > A non-interactive shell is usually present when a shell script is running. It is non-interactive because it is processing a script and not waiting for user input between commands. For these shell invocations, only the environment inherited from the parent shell is used. > > The file `~/.bash_logout` is not used for an invocation of the shell. It is read and executed when a user exits from an interactive login shell. > > Many distributions use `/etc/bashrc` for system wide initialization of non-login shells. This file is usually called from the user’s `~/.bashrc` file and is not built directly into **bash** itself. This convention is followed in this section. > > [linuxfromscratch.org]() Edit the `/etc/profile.d/custom_config.sh` with your desired editor, and add the following lines to the initiated file: PS1="ɢᴏʀᴅᴀʀɢ - ${whoami}: \[\033[01;34m\]\w\[\033[00m\]\$ " mkdir -p /home/ubuntu/history/${USER}/${internet_address} HISTFILE=/home/ubuntu/history/${USER}/${internet_address}/history.txt HISTTIMEFORMAT="%y-%m-%d %T " export HISTCONTROL=ignoredups:erasedups export HISTSIZE=100000 export HISTFILESIZE=100000 shopt -s histappend PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r" As mentioned in the quoted documents above from Linux manual, some distros may overwrite `/etc/profile` with dot files stored in users’ `home` directory. You may need to disable or edit them: `mv ~/.bashrc ~/.bashrc-bak` Log out all users to force this take effect w pkill -KILL -u ## How to use this grep -r -H 'auth' /etc/logrotate.d/* | awk -F : ' { print $1 } ' cat /var/log/auth.log | grep 'Accepted password for' date -d @1706789111 awk '{match($0,/SRC=[0-9]+.[0-9]+.[0-9]+.[0-9]+/); ip = substr($0,RSTART+4,RLENGTH-4); match($0,/DPT=[0-9]{0,5}/); port = substr($0,RSTART+4,RLENGTH-4); print ip,port}' /var/log/ufw.log | sort | uniq -c | sort --- ## How to run a Mastodon instance simply with Docker Source: `/blog/how-to-run-a-mastodon-instance-simply-with-docker.md` --- title: "How to run a Mastodon instance simply with Docker" date: 2023-11-17T14:20:52 source: https://blog.gordarg.com/en/408/how-to-run-a-mastodon-instance-simply-with-docker/ type: post --- # How to run a Mastodon instance simply with Docker You can get latest configurations and files from [official Mastodon repository on GitHub]() where you can find `docker-compose.yml` and `.env.production` as well. To generate hash codes using `rake secret` and other configuration files, you will need Ruby libraries installed; but it is possible to keep the host machine clean with running your commands inside a temporary container based on Mastodon image. Just attach to the shell using the command below and run the following scripts, to achieve their goals. docker run -ti --entrypoint /bin/bash ghcr.io/mastodon/mastodon:v4.2.0 You may enter the commands in the available bash: bin/rails db:create rake secret rake mastodon:webpush:generate_vapid_key The first command will generate the database, second one will return secret and the last one will generate _webpush_ hash strings. Copy and paste contents of the `.env.production` file from repo, and write it to a file with your preferred name. Personally I will not store my Docker environment files in a _dot_ file, because I do a lot of migrations, and `dot` files can increase human error due to their hidden file manager attribute. If you agree, the `docker-compose should link to env` instead of `.env.production`. ![](../media/image.png) At last, if only the `docker-compose.yml` is grabbed (and not the whole repo) remove those lines pointing to local `Dockerfile` for build in the `.yml`. ![](../media/image-2.png) There are optional configurations such as memory over-commit for _Redis_. When the _Redis_ is up, run `docker cp my_mastodon_container:/etc/sysctl.conf sysctl.conf`, this will create a Linux `systemctl` config file based on Redis image, then prepend `vm.overcommit_memor`y=1 to the file and map from the `.yml` like `./sysctl.conf:/etc/sysctl.conf:ro`. ![](../media/image-3.png) --- ## Log resources usage without third-party software and only using bash Source: `/blog/log-usage.md` --- title: "Log resources usage without third-party software and only using bash" date: 2025-02-10T08:27:43 source: https://blog.gordarg.com/en/657/log-usage/ type: post --- # Log resources usage without third-party software and only using bash First you may create a new command uisng `vim /usr/local/bin/log-usage` and `chmod +x` to make it executable. #!/bin/bash # Function to get network upload and download get_network_data() { # Adjust the following lines to match your system/network interface network_data=$(cat /proc/net/dev | grep eth0 | awk '{print $2, $10}') network_upload=$(echo $network_data | awk '{print $1}') network_download=$(echo $network_data | awk '{print $2}') } # Function to get percentage of disk usage get_disk_usage() { disk_usage=$(df -h / | awk 'NR==2 {print $5}') } # Function to get CPU percentage get_cpu_percentage() { cpu_percentage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}') } # Function to get RAM percentage get_ram_percentage() { ram_percentage=$(free | grep Mem | awk '{print $3/$2 * 100.0}') } # Function to get current date and time get_datetime() { datetime=$(date +"%Y-%m-%d %H:%M:%S") } # Fetch all metrics get_network_data get_disk_usage get_cpu_percentage get_ram_percentage get_datetime # Display the data echo "$datetime, upload $network_upload KB, download $network_download KB, disk $disk_usage, cpu $cpu_percentage %, ram $ram_percentage %" Then, you can register a cronjob (using `crontab -e` or `vim /etc/cron.d/usage`) to periodically run it. --- ## Self-hosting a full-featured pure and lightweight mail server with Docker (Postfix & Dovecot) Source: `/blog/mailserver.md` --- title: "Self-hosting a full-featured pure and lightweight mail server with Docker (Postfix & Dovecot)" date: 2024-07-30T11:41:36 source: https://blog.gordarg.com/en/578/mailserver/ type: post --- # Self-hosting a full-featured pure and lightweight mail server with Docker (Postfix & Dovecot) _(This article was crafted with assistance from Bing AI.)_ In this tutorial, we’ll walk through the process of setting up a mail server using Docker Compose and Dovecot. We’ll cover the configuration of both the Mail Transfer Agent (MTA) and the Mail Delivery Agent (MDA). [[LINK TO CLONE THE REPOSITORY OR DOWNLOAD ZIP FROM GITHUB]]() ## Prerequisites Before we begin, make sure you have the following prerequisites: 1. Docker installed on your system. 2. Basic knowledge of Docker Compose. Concepts of mailing and containerization Certainly! Let’s dive into each of these terms: 1. **MDA (Mail Delivery Agent)** : An MDA is responsible for delivering email messages to the recipient’s mailbox. It receives messages from the Mail Transfer Agent (MTA) and places them in the appropriate mailbox (e.g., using protocols like IMAP or POP3). 2. **MTA (Mail Transfer Agent)** : The MTA handles the routing and delivery of email messages between mail servers. It uses protocols like SMTP (Simple Mail Transfer Protocol) to transfer emails from the sender’s server to the recipient’s server. 3. **SPF (Sender Policy Framework)** : SPF is an email authentication method that allows domain owners to specify which servers are authorized to send emails on their behalf. [SPF records list valid IP addresses for sending emails from a domain]()[1](). 4. **DKIM (DomainKeys Identified Mail)** : DKIM adds a digital signature to outgoing emails, allowing recipients to verify that the email came from the claimed domain. [It uses public-key cryptography to sign and verify messages](). 5. **DMARC (Domain-based Message Authentication Reporting and Conformance)** : DMARC builds upon SPF and DKIM. It instructs email servers on how to handle emails that fail SPF or DKIM checks. [Domains use DMARC policies to specify actions like marking as spam or rejecting failed emails]()[1](). 6. **Postfix** : Postfix is a popular open-source MTA used for routing and delivering email messages. [It’s highly configurable and widely used in email server setups](). 7. **Dovecot** : Dovecot is an MDA and IMAP/POP3 server. It retrieves emails from the mailbox and serves them to clients (such as email clients or webmail interfaces). 8. **Docker** : Docker is a containerization platform that allows you to package applications and their dependencies into lightweight containers. It simplifies deployment and ensures consistent environments. 9. **Bridge Network** : In Docker, a bridge network connects containers on the same host, allowing them to communicate securely. It provides isolation and manages IP addresses for containers. 10. **SASL Authentication (Simple Authentication and Security Layer)** : SASL is a framework for adding authentication support to protocols. It’s commonly used for authenticating email clients with SMTP servers. 11. **Public and Private Key** : Public-key cryptography uses a pair of keys: the public key (shared openly) and the private key (kept secret). These keys are used for encryption, decryption, and digital signatures. 12. **Signature and Certificate** : A digital signature is created using a private key to verify the authenticity and integrity of data. Certificates (such as SSL/TLS certificates) contain public keys and additional information about the owner, issued by a Certificate Authority (CA). 13. **Docker-Compose.yml** : A YAML file used to define multi-container Docker applications. It specifies services, networks, volumes, and other configurations for a Docker Compose project. 14. **Dockerfile** : A text file that defines how to build a Docker image. It includes instructions for installing software, setting up configurations, and creating the image layers. ## Most important commands we used during this setup 1. **`telnet localhost 25`** : This command initiates a Telnet session to the local machine on port 25, which is typically used for SMTP (Simple Mail Transfer Protocol) communication. It allows you to interact with an email server. 2. **`nano docker-compose.yml`** : The `nano` command opens the `docker-compose.yml` file in a text editor called Nano. This file is commonly used to define services and their configurations for Docker containers. 3. **`nano dovecot.conf`** : Similar to the previous command, this opens the `dovecot.conf` file in Nano. Dovecot is an email server software, and its configuration file specifies settings related to IMAP and POP3 protocols. 4. **`nano Dockerfile`** : Opens the `Dockerfile` in Nano. Dockerfiles are used to create custom Docker images by specifying instructions for building a container. 5. **`docker-compose up --build`** : This command starts the services defined in the `docker-compose.yml` file and rebuilds the images if necessary. 6. **`docker container exec -i`** : Executes a command inside a running Docker container. The `-i` flag allows interactive input. 7. **`chmod 777 data/ -R`** : Changes permissions recursively for the `data/` directory, giving read, write, and execute permissions to everyone. 8. **`cat data/spool/mail/*`** : Displays the contents of all files in the `data/spool/mail/` directory. These files likely contain email messages. 9. **`nano main.cf`** : Opens the `main.cf` configuration file for Postfix, a popular mail transfer agent (MTA). 10. **`ufw status`** : Checks the status of the Uncomplicated Firewall (UFW) rules. ## Docker Compose Let’s start by creating a `docker-compose.yml` file that defines our services: In this configuration, we define two services: `mta` (Mail Transfer Agent) and `mda` (Mail Delivery Agent). The `mta` service handles SMTP traffic, while the `mda` service handles POP3 and IMAP traffic. ## Dockerfile.mta This Dockerfile sets up a Postfix mail server with specific configurations for sending emails through Gmail’s SMTP server. This includes additional features related to SMTP, DKIM (DomainKeys Identified Mail), and logging. Let’s break down the steps: 1. **Base Image** : It starts with the official Ubuntu base image. 2. **Update and Install Packages** : * It updates the package list and installs several packages related to Postfix, including `postfix`, `rsyslog`, `mailutils`, and various SASL-related libraries. * The `apt clean` command removes unnecessary files after installation. 3. **Configure`master.cf`**: * Adds a configuration line to `master.cf` to enable the `submission` service for SMTP. 4. **Client Authentication** : * Configures Postfix to use Dovecot for authentication (`smtpd_sasl_type = dovecot`). * Specifies the path for Dovecot (`smtpd_sasl_path`). * Disables TLS (`smtpd_use_tls = no`) and allows only authenticated users (`smtpd_tls_auth_only = yes`). 5. **External Relay Configuration** : * Copies a `sasl_passwd` file and creates a hash map from it. * Sets up TLS policy for Gmail (`tls_policy`). * Manages permissions for the TLS policy file. 6. **Certificates** : * Creates a directory for SSL certificates. * Copies the SSL certificate and private key. * Sets appropriate permissions. 7. **SASL Mechanisms** : * Configures SASL mechanisms for SMTP authentication. 8. **Relay Configuration** : * Sets Gmail as the relay host (`relayhost = [smtp.gmail.com]:587`). * Specifies authentication details (`smtp_sasl_password_maps`). * Sets TLS-related options. 9. **SMTP Configuration** : 10. **OpenDKIM Configuration** : * Creates directories for OpenDKIM keys. * Configures various options in `opendkim.conf`, including syslog, permissions, auto-restart, and socket settings. * Copies DKIM keys into the container. * Configures KeyTable, SigningTable, and TrustedHosts for OpenDKIM. 11. **Postfix Integration with OpenDKIM** : * Specifies milter protocol and action (`milter_protocol` and `milter_default_action`). * Sets up milters for SMTP (`smtpd_milters` and `non_smtpd_milters`). 12. **Logging Configuration** : * Configures rsyslog to capture Postfix logs (`/var/log/mail.log`). 13. **Email Handling Script** : * Copies the `save_email.sh` script into the container and makes it executable. 14. **Virtual Email Aliases** : * Defines virtual aliases for specific domains (`@gordarg.com`). * Maps these aliases to a local transport (`virtual_transport = local`). 15. **Exposed Ports** : * Exposes SMTP ports 25 and 587. ## Dockerfile.mda This Dockerfile sets up a Dovecot mail server with specific configurations for POP3 and IMAP services. 1. **Base Image and Package Installation** : * It starts with the official Ubuntu base image. * Installs `dovecot-core`, `dovecot-pop3d`, and `dovecot-imapd`. 2. **Working Directory and Configuration** : * Sets the working directory to `/etc/dovecot`. * Copies the Dovecot configuration file (`dovecot.conf`). 3. **SSL Configuration** : * Copies SSL certificates (`dovecot.pem`, `dovecot.pem.private`, and `dh.pem`). * Sets appropriate permissions. * Updates the SSL configuration in `10-ssl.conf`. 4. **User Database and Permissions** : * Copies the user database file (`dovecot-users`). * Sets permissions for the user database. 5. **Log Files** : * Initializes log files (`dovecot-info.log`, `dovecot.log`, and `dovecot-debug.log`). 6. **Exposed Ports** : * Exposes POP3 (110), IMAP (143), IMAPS (993), and an additional port (12345). 7. **User Setup** : * Creates a user (`vmail`) with specified UID and GID. * Sets the user’s shell to `/bin/bash`. 8. **Start Dovecot Service** : * Starts the Dovecot service and tails the log files. --- ## Minimum security requirements and configurations for Microsoft Windows machines of all crew Source: `/blog/minimum-security-requirements-and-configurations-for-microsoft-windows-machines-of-all-crew.md` --- title: "Minimum security requirements and configurations for Microsoft Windows machines of all crew" date: 2023-10-06T15:19:49 source: https://blog.gordarg.com/en/131/minimum-security-requirements-and-configurations-for-microsoft-windows-machines-of-all-crew/ type: post --- # Minimum security requirements and configurations for Microsoft Windows machines of all crew All Gordarg crew must keep their personal and work machines protected from unwanted access and execution of software programs which they are not aware of. There are also some other settings which we recommend to apply on their devices including disabling AI assistants and Internet-based search in their file manager. Instructions below, explains simple yet important configuration on Windows-running devices. Please note that ‘Home’ edition of Windows need some extra tasks to enable some policy management features. We have white-listing approach in this regard. ## Block all unwanted software to access private and public networks Your device has to be quite as much as possible. No software can access internet without your exact permission even for updates. You will receive receive a list of critical updates and patches manually. Specially more consciousness is required for up-stream connections. To create a white-list of applications simply open “Windows Firewall with Advanced Security” (`wf.msc`) and from _Action > Properties_ menu, and block all networks _Inbound_ and _Outbound_ traffic. ![](../media/wf.msc_.png) Next step is to add your software applications to the in/out list to allow them to access the network. ## Block all unwanted software from execution By default, Windows allows execution of software from any source. Deny this to happen by restricting programs to execute from unwanted directories from Local Security Policy (LSP) window. It can be accessed through windows run by calling its shortcut (`secpol.msc`). ![](../media/run.png) Once the LSP window opened, you have to navigate to Software Restriction _Policies > Security_ Levels from the side menu and set the default policy to “Disallowed”. ![](../media/secpol.msc_.png) Note: If you want your taskbar and Windows Start menu to work properly, also add their path to “Additional Rules”: * `%AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar` * `C:\ProgramData\Microsoft\Windows\Start Menu` --- ## Multi-language Support of Web Applications Source: `/blog/multi-language-support-of-web-applications.md` --- title: "Multi-language Support of Web Applications" date: 2023-12-01T20:14:33 source: https://blog.gordarg.com/en/441/multi-language-support-of-web-applications/ type: post --- # Multi-language Support of Web Applications Our PHP framework supports multi-language content. There are two groups of multi-language content: first, static labels, messages, paragraphs, etc; and second, are database content (e.g. products, posts, etc). ## Static Content With a built-in function `t` with a `dictionary.csv` file behind, end user (also including search engines and crawlers) are able to view web pages rendered in their preferred langauge. Function `t('...')` will iterate over the dictionary and return equivalent phrase in the desired language-region passed in the URI. ## Dynamic Content The web server must follow some rules in database design and/or its returning schema, so the front-end will parse the results as expected. --- ## Odoo Source: `/blog/odoo.md` --- title: "Odoo" date: 2024-10-08T20:43:13 source: https://blog.gordarg.com/en/599/odoo/ type: post --- # Odoo Here are some tips for Odoo administration. ## To open command palette You can simply press `Ctrl + K` . ## Behind the scenes of the installation docker-compose.yml version: '3.8' services: odoo: image: odoo:15.0 container_name: odoo depends_on: - db user: "0:0" # ports: # - "8069:8069" environment: - HOST=db - USER=odoo - PASSWORD=odoo volumes: - ./data/web:/var/lib/odoo - ./data/config:/etc/odoo networks: - gordarg db: image: postgres:14.1-alpine container_name: odoo-db environment: - POSTGRES_DB=postgres - POSTGRES_USER=odoo - POSTGRES_PASSWORD=odoo volumes: - ./data/db:/var/lib/postgresql/data networks: - gordarg networks: gordarg: external: true ## To delete an Odoo website ## When web assets are failed to load due to 404 error This is a common issue with version `15.0` . Recreating the cached bundles can help in this case. $> docker exec -it odoo-db psql -U odoo -d odoo =# DELETE FROM ir_attachment WHERE name ILIKE '%assets%'; Or $> docker exec -it odoo odoo shell -d odoo -c /etc/odoo/odoo.conf >> env['ir.qweb'].clear_caches() >> env['ir.qweb'].build_asset_bundle() ## To upgrade Odoo $> docker exec -it odoo odoo -d odoo -c /etc/odoo/odoo.conf -u all --xmlrpc-port=8070 --- ## Our lite solution to 50K sitemap XMLs Source: `/blog/our-lite-solution-to-50k-sitemap-xmls.md` --- title: "Our lite solution to 50K sitemap XMLs" date: 2023-12-01T20:25:49 source: https://blog.gordarg.com/en/415/our-lite-solution-to-50k-sitemap-xmls/ type: post --- # Our lite solution to 50K sitemap XMLs Sitemaps can be defined as an individual service. It is possible to generate sitemaps on demand and return instantly without storing `XML` files on disk. In this method, with any request, a list of expected results will return, but due to the processing cost, it is placed behind a reverse proxy which is handling the request cache as well as routing. location ~ ^/(stylesheet|sitemap|products|posts).xml { proxy_buffering on; proxy_cache STATIC; proxy_cache_valid 200 1h; proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; set $target http://sitemap:80; proxy_pass $target; } The C# code below will generate the sitemaps. class Sitemap { public override string ToString() { if (_tag == "style") return """ ..."); foreach (var item in Items) { b.Append($" {item.Loc}"); } b.Append(""); return b.ToString(); } public Sitemap(string Url, string Tag = "sitemap") { _url = Url; _tag = Tag; } private string _url; private string _tag; public List Items{get;set; } } class Item { public override string ToString() { return $@" {Loc} {LastModifiedDate} "; } public string ? Loc { get; set; } public string ? LastModifiedDate { get; set; } } internal class Program { public static string Url = "https://www.example.org" public static string ConnectionString = "server=mysql;uid=root;pwd=toor;database=db;CharSet=utf8mb4;"; private static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.MapGet("/sitemap.xml", () => Results.File(Encoding.UTF8.GetBytes(new Sitemap(Url, "main").ToString()), "text/xml")); app.MapGet("/stylesheet.xml", () => Results.File(Encoding.UTF8.GetBytes(new Sitemap(Url, "style").ToString()), "text/xml")); app.MapGet("/posts.xml", () => Results.File(Encoding.UTF8.GetBytes(Fetch(@" select ... limit 50000 ").ToString()), "application/xml")); app.Run(); } private static Sitemap Fetch(string Command) { MySqlConnection connect = new MySqlConnection(ConnectionString); MySqlCommand cmd = new MySqlCommand(); cmd.CommandType = CommandType.Text; cmd.Connection = connect; cmd.CommandText = Command; connect.Open(); var output = new Sitemap(Url); try { MySqlDataReader reader; reader = cmd.ExecuteReader(); output.Items = new List(); while (reader.Read()) { var loc = Url + "/" + reader["link"].ToString(); var lastModifiedDate = reader["updated_at"].ToString(); output.Items.Add( new Item { Loc = loc, LastModifiedDate = lastModifiedDate }); } reader.Close(); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { if (connect.State == ConnectionState.Open) { connect.Close(); } } return output; } } --- ## Automating System Restarts on CPU Overload Using systemd Source: `/blog/overload-systemd.md` --- title: "Automating System Restarts on CPU Overload Using systemd" date: 2025-06-11T13:03:05 source: https://blog.gordarg.com/en/675/overload-systemd/ type: post --- # Automating System Restarts on CPU Overload Using systemd When managing a server or workstation, **unexpected CPU spikes** can slow down the system, degrade performance, or even lead to crashes. A proactive solution is to **automate system restarts** when the CPU usage exceeds a threshold. Instead of relying on inefficient **while loops** , we’ll leverage the **systemd** service and timer mechanism for optimized event-based execution. ## **Why Use`systemd` Instead of Polling?** Most traditional monitoring scripts rely on a **while loop** that constantly checks CPU usage, consuming resources unnecessarily. With `systemd`, we: * Avoid inefficient polling. * Ensure scheduled execution without constant CPU usage. * Easily control activation intervals using timers. * * * ## **Step 1: Creating the CPU Monitoring Script** We will write a **Bash script** to check CPU usage and trigger a **restart** if it surpasses a set threshold. ### **1\. Write the Script** Open a terminal and create the script file: sudo nano /usr/local/bin/cpu_monitor.sh Add the following content: #!/bin/bash THRESHOLD=90 # Define CPU usage limit CPU_USAGE=$(grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print int(usage)}') if [ "$CPU_USAGE" -ge "$THRESHOLD" ]; then echo "High CPU detected ($CPU_USAGE%), rebooting system..." sudo reboot fi ### **2\. Make the Script Executable** sudo chmod +x /usr/local/bin/cpu_monitor.sh This script: ✔ **Extracts CPU usage directly from`/proc/stat`** without external dependencies. ✔ **Uses integer-based comparison** to eliminate the need for `bc`. ✔ **Triggers a reboot** if CPU usage exceeds the predefined threshold. * * * ## **Step 2: Setting Up a`systemd` Service** Next, we create a `systemd` service to execute this script. ### **1\. Create a New Service File** sudo nano /etc/systemd/system/cpu-monitor.service Add the following content: [Unit] Description=Monitor CPU usage and restart if overloaded After=network.target [Service] ExecStart=/usr/local/bin/cpu_monitor.sh Type=simple [Install] WantedBy=multi-user.target ### **2\. Reload Systemd and Enable the Service** sudo systemctl daemon-reload sudo systemctl enable cpu-monitor.service At this point, we have created a **service** that can manually run our script. * * * ## **Step 3: Scheduling the Script with a`systemd` Timer** Instead of manually running the service, we configure a timer for automated execution. ### **1\. Create a Timer File** sudo nano /etc/systemd/system/cpu-monitor.timer Add the following content: [Unit] Description=Run CPU monitor every 10 seconds [Timer] OnUnitActiveSec=10s Unit=cpu-monitor.service Persistent=true [Install] WantedBy=timers.target This ensures: ✔ The service runs **every 10 minutes**. ✔ It activates **only when necessary** instead of constant polling. ### **2\. Enable and Start the Timer** sudo systemctl enable cpu-monitor.timer sudo systemctl start cpu-monitor.timer ### **3\. Verify the Timer** To ensure the timer is functioning: systemctl list-timers --all | grep cpu-monitor To **manually trigger the service** : sudo systemctl start cpu-monitor.service To **check logs** for execution status: journalctl -u cpu-monitor.service --no-pager * * * ## **Step 4: Fine-Tuning for Stability** Before deploying this setup on a production server, consider: ✔ **Logging CPU spikes** before rebooting for debugging. ✔ **Triggering alerts** instead of an immediate reboot (via email or notifications). ✔ **Including RAM and Disk usage checks** for more robust monitoring. Using `systemd`, we have built an **efficient** and **event-driven** solution to restart a system under high CPU load. Unlike polling loops, this method **preserves resources** and runs only when needed. --- ## سیاست حفظ حریم خصوصی Source: `/blog/privacy-policy.md` --- title: "سیاست حفظ حریم خصوصی" date: 2025-05-03T10:47:05 source: https://www.gordarg.com/privacy-policy/ type: page --- # سیاست حفظ حریم خصوصی ما در Gordarg.com به حریم خصوصی کاربران خود احترام می‌گذاریم و متعهد هستیم که اطلاعات شخصی شما را با بالاترین سطح امنیت و شفافیت مدیریت کنیم. این سیاست توضیح می‌دهد که چگونه اطلاعات شما جمع‌آوری، استفاده، و محافظت می‌شود. ### ۱\. جمع‌آوری اطلاعات ما ممکن است اطلاعاتی را از شما جمع‌آوری کنیم که شامل موارد زیر است: * اطلاعات شخصی (مانند نام، ایمیل، شماره تلفن) که شما به‌طور مستقیم در اختیار ما قرار می‌دهید. * اطلاعات فنی مانند آدرس IP، نوع مرورگر، و داده‌های مربوط به استفاده شما از وب‌سایت. ### ۲\. نحوه استفاده از اطلاعات ما از اطلاعات جمع‌آوری‌شده برای موارد زیر استفاده می‌کنیم: * ارائه خدمات و شخصی‌سازی تجربه کاربران * بهبود وب‌سایت و تحلیل رفتار کاربران * ارسال پیام‌های اطلاع‌رسانی، تبلیغاتی و خبری (با رضایت شما) ### ۳\. اشتراک‌گذاری اطلاعات ما اطلاعات شخصی شما را به‌هیچ‌وجه به اشخاص ثالث نمی‌فروشیم. با این حال، ممکن است اطلاعات را با طرف‌های قابل‌اعتماد برای موارد زیر به اشتراک بگذاریم: * پردازش پرداخت‌ها و ارائه خدمات * رعایت قوانین و مقررات ### ۴\. حفاظت از اطلاعات ما تدابیر امنیتی مناسب برای محافظت از اطلاعات شخصی شما اتخاذ کرده‌ایم و از روش‌های رمزگذاری و امنیتی استفاده می‌کنیم تا از دسترسی غیرمجاز جلوگیری شود. ### ۵\. حقوق کاربران شما حق دارید: * درخواست اصلاح یا حذف اطلاعات شخصی خود را بدهید. * از دریافت پیام‌های تبلیغاتی انصراف دهید. * در مورد نحوه پردازش داده‌های خود درخواست توضیح دهید. ### ۶\. تغییرات در سیاست حفظ حریم خصوصی ما ممکن است این سیاست را به‌روزرسانی کنیم و تغییرات آن را در همین صفحه منتشر خواهیم کرد. توصیه می‌کنیم به‌طور منظم این صفحه را بررسی کنید. ### ۷\. تماس با ما اگر سوال یا نگرانی در مورد سیاست حفظ حریم خصوصی دارید، لطفاً با ما تماس بگیرید: 📧 ایمیل: privacy@gordarg.com --- ## RAID Rescue in Linux Source: `/blog/raid-rescue-in-linux.md` --- title: "RAID Rescue in Linux" date: 2024-02-06T12:08:51 source: https://blog.gordarg.com/en/504/raid-rescue-in-linux/ type: post --- # RAID Rescue in Linux # Diagnosing Disk Health with Smartctl and Managing Storage As a system administrator or a curious Linux enthusiast, understanding the health of your storage devices is crucial. In this blog post, we’ll explore a few essential commands to diagnose disk health and manage storage resources effectively. ## 1\. **Smartctl: Assessing Disk Health** ### What is Smartctl? **Smartctl** (Smartmontools) is a command-line utility that interacts with the **Self-Monitoring, Analysis, and Reporting Technology (SMART)** system in hard drives and solid-state drives. It provides valuable information about the drive’s health, performance, and potential issues. ### Using Smartctl To check the health of a specific disk (e.g., `/dev/sdc`), run the following command: sudo smartctl -a /dev/sdc Pay attention to the following key attributes: * **Raw_Read_Error_Rate (id 1)** : Indicates read errors. * **Reallocated_Sector_Ct (id 5)** : Reflects the number of reallocated sectors. * **Spin_Retry_Count (id 10)** : Monitors spindle motor retries. * **Reported_Uncorrect (id 187)** : Tracks uncorrectable errors. * **Offline_Uncorrectable (id 198)** : Identifies uncorrectable errors that occurred while the drive was offline. Remember that even if Smartctl reports a “PASSED” status, abnormal values in these attributes could indicate impending disk failure. If you encounter such issues, consider replacing the drive promptly. ## 2\. **Managing Storage with lsblk** ### Listing Block Devices The `lsblk` command provides a concise overview of block devices (disks and partitions). To display relevant information (name, size, filesystem type, type, and mount point), use: lsblk -o NAME,SIZE,FSTYPE,TYPE,MOUNTPOINT This output helps you identify available storage devices, their sizes, and their current mount points. ### Listing UUIDs UUIDs (Universally Unique Identifiers) are essential for identifying partitions consistently across reboots. To list UUIDs for all block devices, execute: lsblk -o NAME,UUID ## 3\. **Checking RAID Status with /proc/mdstat** ### Understanding /proc/mdstat The `/proc/mdstat` file provides information about software RAID (Redundant Array of Independent Disks) arrays. It shows the status of RAID devices, including any failures or resync progress. To view the RAID status, simply run: cat /proc/mdstat If you encounter issues like a degraded array or failed disks, investigate further and take corrective actions. # Managing Storage and RAID ## 1\. **Zeroing Out a Disk with`dd`** ### What Does `dd if=/dev/zero of=/dev/sdc bs=1M count=100` Do? The command `sudo dd if=/dev/zero of=/dev/sdc bs=1M count=100` serves a specific purpose: it writes **100 megabytes of zeros** to the `/dev/sdc` block device. Let’s break it down: * `if=/dev/zero`: Specifies the input source as a stream of zeros. * `of=/dev/sdc`: Indicates the output destination, which is our target disk (`/dev/sdc`). * `bs=1M`: Sets the block size to 1 megabyte. * `count=100`: Limits the operation to writing 100 blocks (100 megabytes). Why would we do this? Zeroing out a disk is often done before repurposing it or creating a new filesystem. It ensures that any existing data or metadata is wiped clean, preparing the disk for a fresh start. ## 2\. **Examining a Disk with`mdadm`** ### What Does `sudo mdadm --examine /dev/sdc` Reveal? The `mdadm` utility manages software RAID arrays. When we examine `/dev/sdc`, we’re checking its metadata for any existing RAID information. This step is crucial before creating or adding disks to an array. It helps prevent conflicts and ensures proper configuration. ## 3\. **Creating a RAID 1 Array** ### Creating a RAID 1 Array with `mdadm` RAID 1 (mirroring) duplicates data across multiple disks for redundancy. Let’s look at the provided commands: 1. `sudo mdadm --create /dev/md4 --level=1 --raid-devices=2 /dev/sdc missing`: This command creates a RAID 1 array named `/dev/md4` with two devices (`/dev/sdc` and a missing device). The missing device will be replaced later. 2. `sudo mdadm --create /dev/md4 --level=1 --raid-devices=2 /dev/sdc /dev/sdd`: Here, we add `/dev/sdd` to the RAID 1 array. Now, both `/dev/sdc` and `/dev/sdd` mirror each other, providing redundancy. Remember to adjust the commands according to your specific setup and requirements. Properly managed RAID arrays enhance data reliability and availability. # Managing RAID Arrays and Disk Mounting ## 1\. **Stopping a RAID Array** ### Stopping an Active RAID Array The `mdadm` utility allows you to manage software RAID arrays. To stop an active array (e.g., `/dev/md4`), follow these steps: 1. **Unmount the Array** : First, unmount the array if it’s currently mounted. Navigate out of the mounted directory using `cd ~`, and then unmount the device:`sudo umount /mnt/md0` 2. **Stop the Array** : You can stop all active arrays by running:`sudo mdadm --stop --scan `If you want to stop a specific array (e.g., `/dev/md4`), pass it to the `mdadm --stop` command:`sudo mdadm --stop /dev/md4` ## 2\. **Assembling RAID Arrays** ### Scanning for RAID Devices To assemble RAID arrays during system startup, use the `--assemble --scan` option. This command scans for existing arrays and automatically assembles them: sudo mdadm --assemble --scan ### Assembling with Specific Devices Sometimes you need to manually assemble an array, especially when dealing with failed or missing devices. For example: * To assemble `/dev/md0` with read-only access and `/dev/sdb2` as a component device:`sudo mdadm --assemble --readonly /dev/md0 /dev/sdb2` * To forcefully assemble `/dev/md4` with `/dev/sdc` and `/dev/sdd`:`sudo mdadm --assemble --verbose /dev/md4 /dev/sdc /dev/sdd --force` ## 3\. **Mounting the RAID Array** ### Mounting the Array Once the RAID array is assembled, you can mount it to a directory (e.g., `/mnt/8tb`): sudo mount /dev/md4 /mnt/8tb Remember to adjust the commands based on your specific setup and requirements. Properly managed RAID arrays ensure data redundancy and reliability. # Managing RAID Configuration and System Files ## 1\. **Updating mdadm Configuration** ### Storing RAID Information When working with RAID arrays, it’s essential to ensure that the array configuration **persists** across reboots. We achieve this by updating the `/etc/mdadm/mdadm.conf` file. Let’s break down the steps: 1. **Querying RAID Information** : To manage RAID arrays effectively, we need detailed information about their structure, component devices, and current state. Use the following command to display crucial details about a RAID device (e.g., `/dev/md0`):`sudo mdadm -D /dev/md0 `[The output includes the RAID level, array size, health status, UUID, and roles of component devices]()[1](). 2. **Updating`mdadm.conf`**: To ensure automatic reassembly of RAID arrays during boot, append the array details to the `mdadm.conf` file:`sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf `[This step ensures that the array configuration is preserved even after system restarts]()[2](). ## 2\. **Editing System Files** ### Modifying `/etc/fstab` The `/etc/fstab` file contains information about filesystems and their mount points. Use a text editor (e.g., `nano`) to modify this file: sudo nano /etc/fstab In this file, you define which partitions or devices should be mounted at boot. Ensure that your RAID array is correctly listed here to mount it automatically. ### Adjusting `mdadm.conf` If you need to make manual changes to the `mdadm.conf` file, use: sudo nano /etc/mdadm/mdadm.conf Here, you can fine-tune RAID settings, specify component devices, and manage arrays. ## Conclusion By mastering these commands, you’ll be better equipped to manage RAID arrays and maintain system stability. Remember to adapt the steps to your specific setup and requirements. Happy RAID administration! 🛡️🚀 --- ## Backup Linux to S3 Source: `/blog/s3.md` --- title: "Backup Linux to S3" date: 2025-04-24T15:43:08 source: https://blog.gordarg.com/en/671/s3/ type: post --- # Backup Linux to S3 A Bash script that archives a specified directory and securely uploads it to an S3 bucket is described. ## Overview The script is designed to: * Resolve the supplied directory to its canonical absolute path. * Create a compressed archive using `tar` and generate a safe, filename-friendly archive name. * Construct an S3 object key based on the target directory. * Securely sign and transfer the archive to the specified S3 endpoint using `curl`. * Clean up local artifacts after a successful upload. Our implementation leverages practices such as error propagation (`set -euo pipefail`), clear function abstractions, detailed debug logging (when enabled), and credential placeholders to emphasize security. ## Best Practices Applied 1. **Robust Error Handling:** The script is configured with `set -euo pipefail` to ensure that errors are quickly surfaced and that command pipelines are robust. 2. **Canonical Path Resolution:** Instead of relying solely on the current working directory, we convert the input to a canonical absolute path using `realpath` (or an equivalent fallback). This guarantees consistent outcomes regardless of how the input path is specified. 3. **Secure Credential Management:** While the script uses placeholders for the S3 credentials and endpoint details, the design encourages the usage of secure storage solutions (e.g., environment variables or Azure Key Vault) in a production setting. 4. **Modular Design:** The script is broken into well-defined functions (for debugging, path resolution, archiving, uploading, and cleanup), which enhances readability and maintainability. 5. **Clean Output for Integration:** Debug and progress information is sent to standard error (stderr) to avoid interfering with standard output. This makes the script suitable for integration with other automated processes. ## Complete Script The following script encapsulates these design principles. Replace the placeholder values ``, ``, ``, and `` with your actual credentials and configuration. #!/bin/bash set -euo pipefail # Set DEBUG=1 to enable detailed debug output; 0 disables debug messages. DEBUG=1 # Timestamp for naming (e.g. 20250424-1804) now="$(date +'%Y%m%d-%H%M')" # AWS S3 Credentials – replace these with your actual credentials. s3Key="" s3Secret="" # S3 Configuration – replace placeholders with your S3 host and bucket name. host="" # e.g., s3.amazonaws.com or your designated endpoint. bucket="" # e.g., my-backup-bucket. contentType="application/x-tar" #----------------------------------------------------- # Function: debug #----------------------------------------------------- # Outputs debugging information to stderr. debug() { if [[ ${DEBUG:-0} -eq 1 ]]; then echo "[DEBUG]" "$@" >&2 fi } #----------------------------------------------------- # Function: resolve_path #----------------------------------------------------- # Resolves the supplied path to its canonical absolute path. resolve_path() { local input="$1" if command -v realpath >/dev/null 2>&1; then realpath "$input" elif command -v readlink >/dev/null 2>&1 && readlink -f "$input" >/dev/null 2>&1; then readlink -f "$input" else # Fallback: use pwd with parameter expansion. echo "$(cd "$(dirname "$input")" && pwd)/$(basename "$input")" fi } #----------------------------------------------------- # Function: create_archive #----------------------------------------------------- # Archives the provided directory into a tar.gz file and saves it in /tmp. # The archive filename is derived from the canonical directory path, # replacing '/' with '-' to produce a safe filename. create_archive() { local dir="$1" # Convert the directory path to its absolute canonical form. local abs_dir abs_dir=$(resolve_path "$dir") debug "Absolute path for directory: $abs_dir" # Generate a safe directory name for the archive (replace '/' with '-'). local safe_dir safe_dir=$(echo "$abs_dir" | sed 's#/#-#g') debug "Safe directory name: $safe_dir" local filename="/tmp/grrg-${safe_dir}-${now}.tar.gz" debug "Creating archive: $filename from directory: $abs_dir" # Use tar with the -C flag so only the directory’s basename is stored in the archive. tar -czf "$filename" -C "$(dirname "$abs_dir")" "$(basename "$abs_dir")" debug "Archive created at: $filename" if [[ -f "$filename" ]]; then debug "Archive file details:" ls -l "$filename" >&2 else echo "Error: Archive $filename not created." >&2 exit 1 fi echo "$filename" } #----------------------------------------------------- # Function: upload_to_s3 #----------------------------------------------------- # Uploads the created archive file to S3 using curl. # Constructs the S3 object key from the target directory’s last folder name # and the archive’s basename. upload_to_s3() { local filename="$1" local target_dir="$2" # Validate that the archive file exists. if [[ ! -f "$filename" ]]; then echo "Error: Archive file '$filename' does not exist." >&2 exit 1 fi local archive_basename archive_basename=$(basename "$filename") local target_folder target_folder=$(basename "$target_dir") # S3 object key format: / local s3_file="${target_folder}/${archive_basename}" local resource="/${bucket}/${s3_file}" local dateValue dateValue=$(date -R) local stringToSign="PUT\n\n${contentType}\n${dateValue}\n${resource}" local signature signature=$(echo -en "$stringToSign" | openssl sha1 -hmac "$s3Secret" -binary | base64) debug "S3 Upload Info:" debug "Archive filename: $filename" debug "S3 Resource: $resource" debug "Date: $dateValue" debug "StringToSign:" debug "$stringToSign" debug "Signature: $signature" echo "Uploading $filename to S3..." >&2 curl --progress-bar -# -k -L -X PUT -T "$filename" \ -H "Host: ${bucket}.${host}" \ -H "Date: ${dateValue}" \ -H "Content-Type: ${contentType}" \ -H "Authorization: AWS ${s3Key}:${signature}" \ "https://${bucket}.${host}/${s3_file}" || { echo "Error during file upload." >&2 exit 1 } echo "Uploaded successfully!" >&2 } #----------------------------------------------------- # Function: cleanup #----------------------------------------------------- # Removes the local archive file after successful upload. cleanup() { local filename="$1" echo "Removing local archive: $filename" >&2 rm -f "$filename" debug "Local archive removed." } #----------------------------------------------------- # Main Execution #----------------------------------------------------- if [[ $# -ne 1 ]]; then echo "Usage: $0 " >&2 exit 1 fi input_dir="$1" abs_input_dir=$(resolve_path "$input_dir") if [[ ! -d "$abs_input_dir" ]]; then echo "Error: '$abs_input_dir' is not a valid directory." >&2 exit 1 fi debug "Starting backup for directory: $abs_input_dir" archive_file=$(create_archive "$abs_input_dir") upload_to_s3 "$archive_file" "$abs_input_dir" cleanup "$archive_file" echo "Backup and upload process completed!" >&2 ## How to Deploy and Use 1. **Installation:** Save the script as `/usr/local/bin/backup_to_s3`, and then make it executable with the following command: sudo chmod +x /usr/local/bin/backup_to_s3 2. **Configuration:** Replace the placeholders in the script with your actual S3 credentials and configuration values. Ideally, store secrets securely and avoid hardcoding them in the source file. 3. **Execution:** Run the script by specifying a single directory. The script accepts both relative and absolute paths (converting relative paths to canonical absolute paths using `realpath` or a fallback). For example: sudo backup_to_s3 /path/to/your/directory or cd /path/to/your sudo backup_to_s3 directory ## Conclusion The script is suitable for production environments where reliability is critical. If you have any questions or improvements, please leave a comment or get in touch. We hope this solution enhances your backup strategy and provides a foundation for further automation. --- ## Screencast Guide Source: `/blog/screencast.md` --- title: "Screencast Guide" date: 2023-10-09T21:01:33 source: https://blog.gordarg.com/en/153/screencast/ type: post --- # Screencast Guide ## Gnome Screencast Tool (Crtl + Alt + Shift + R) To convert videos from web to mp4 and decrease frame rates, we can use the command below: ffmpeg -r 5 -i Videos/Screencasts/tutorial.webm -c:v libx264 -preset veryfast -c:a aac -vf "crop=trunc(iw/2)*2:trunc(ih/2)*2" Desktop/tutorial.mp4 ## Custom script to record audio as well #!/bin/bash # Get screen resolution RESOLUTION=$(xrandr | grep '*' | awk '{print $1}') WIDTH=$(echo $RESOLUTION | cut -d 'x' -f 1) HEIGHT=$(echo $RESOLUTION | cut -d 'x' -f 2) # Define file names VIDEO_FILE="screencast_$(date +%Y%m%d_%H%M%S).mp4" AUDIO_FILE="audio_$(date +%Y%m%d_%H%M%S).wav" OUTPUT_FILE="output_$(date +%Y%m%d_%H%M%S).mp4" # Start recording video with lower frame rate and more efficient encoding ffmpeg -video_size ${WIDTH}x${HEIGHT} -framerate 5 -f x11grab -i :0.0 -c:v libx264 -preset veryfast -crf 23 -y $VIDEO_FILE & # Start recording audio ffmpeg -f alsa -i default -y $AUDIO_FILE & # Wait for user to stop the recording echo "Press any key to stop recording..." read -n 1 # Kill all ffmpeg processes pkill -f ffmpeg # Merge video and audio with efficient encoding ffmpeg -i $VIDEO_FILE -i $AUDIO_FILE -c:v libx264 -preset veryfast -crf 23 -c:a aac -strict experimental $OUTPUT_FILE echo "Recording saved as $OUTPUT_FILE" ## Appendix. Install ffmpeg sudo apt install ffmpeg ## References * [FFMPEG (libx264) “height not divisible by 2”]() --- ## Our SEO Checklist Source: `/blog/seo.md` --- title: "Our SEO Checklist" date: 2024-06-25T06:25:46 source: https://blog.gordarg.com/en/555/seo/ type: post --- # Our SEO Checklist * Are meta canonical tags there? * Are meta alternative tags there? * Are meta geo tags there? * Is “NAP” (Name, Address and Phone Number) available? * Is the keyword which has a “Topic” equivalent in Google Trends included in the URL? * For some businesses, month name can be a Topic. * Is “modified date” updated after edits? * Is website locale defined? * --- ## Shrink Database & Rebuild Indexes on a database Source: `/blog/shrink-rebuild-database.md` --- title: "Shrink Database & Rebuild Indexes on a database" date: 2024-10-01T09:34:13 source: https://blog.gordarg.com/en/601/shrink-rebuild-database/ type: post --- # Shrink Database & Rebuild Indexes on a database -- https://learn.microsoft.com/en-us/sql/relational-databases/databases/shrink-a-database DBCC SHRINKDATABASE (db, 10); GO -- https://stackoverflow.com/questions/32505775 use db SET QUOTED_IDENTIFIER ON SET ARITHABORT ON SET NUMERIC_ROUNDABORT OFF SET CONCAT_NULL_YIELDS_NULL ON SET ANSI_NULLS ON SET ANSI_PADDING ON SET ANSI_WARNINGS ON DECLARE @TableName varchar(255); DECLARE @IndexName varchar(255); DECLARE @SchemaName varchar(255); DECLARE @Fragmentation FLOAT; DECLARE @IndexScript varchar(255); SELECT dbtables.[name], dbindexes.[name], indexstats.avg_fragmentation_in_percent, indexstats.page_count [pages] FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id] INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id] INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id] AND indexstats.index_id = dbindexes.index_id WHERE indexstats.database_id = DB_ID() AND indexstats.avg_fragmentation_in_percent >= 5.0 AND indexstats.page_count > 10 ORDER BY indexstats.page_count ASC, indexstats.avg_fragmentation_in_percent ASC DECLARE TableCursor CURSOR FOR SELECT dbtables.[name], dbindexes.[name], dbschemas.[name], indexstats.avg_fragmentation_in_percent FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id] INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id] INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id] AND indexstats.index_id = dbindexes.index_id WHERE indexstats.database_id = DB_ID() AND indexstats.avg_fragmentation_in_percent >= 5.0 AND indexstats.page_count > 10 ORDER BY dbschemas.[name], dbtables.[name]; OPEN TableCursor FETCH NEXT FROM TableCursor INTO @TableName, @IndexName, @SchemaName, @Fragmentation WHILE @@FETCH_STATUS = 0 BEGIN IF (@Fragmentation >= 30.0) SET @IndexScript = 'ALTER INDEX ' + @IndexName + ' ON ' + @SchemaName + '.' + @TableName + ' REBUILD'; ELSE IF (@Fragmentation >= 5.0) SET @IndexScript = 'ALTER INDEX ' + @IndexName + ' ON ' + @SchemaName + '.' + @TableName + ' REORGANIZE'; ELSE SET @IndexScript = NULL; IF (@IndexScript IS NOT NULL) BEGIN RAISERROR (@IndexScript, 10, 0) WITH NOWAIT WAITFOR DELAY '00:00:01'; EXEC(@IndexScript); END FETCH NEXT FROM TableCursor INTO @TableName, @IndexName, @SchemaName, @Fragmentation; END CLOSE TableCursor; DEALLOCATE TableCursor; --- ## SnowFramework CRUD: How to develop database records management from admin dashboard? Source: `/blog/snowframework-crud-how-to-develop-database-records-management-from-admin-dashboard.md` --- title: "SnowFramework CRUD: How to develop database records management from admin dashboard?" date: 2023-12-19T06:57:20 source: https://blog.gordarg.com/en/488/snowframework-crud-how-to-develop-database-records-management-from-admin-dashboard/ type: post --- # SnowFramework CRUD: How to develop database records management from admin dashboard? ## Step 1: A sample controller be like Auth(); $uow = new UnitOfWork(); $rows = $uow->selectLandings(); $this->Render('Landings', [ 'Title' => _AppName . ' | مدیریت صفحات فرود', 'Rows' => $rows ]); } // فرمی برای ورود اطلاعات لندینگ جدید یا ویرایش اطلاعات لندینگ قبلی // نمایش داده می‌شود. به مدت این تابع دقت کنید که اطلاعات را به // کاربر می‌فرستد. و اطلاعات فرم را دریافت نمی‌کند. دریافت اطلاعات // از فرم، در هنگام کلیک بر روی دکمه‌ی ذخیره‌سازی، از تابعی با نام مشابه // اما متد پُست استفاده می‌شود. function LandingGET($id = null) { // $this->Auth(); if (is_null($id)) { $this->Render('Landing', [ 'Title' => _AppName . ' | صفحه فرود جدید', ]); } else { $uow = new UnitOfWork(); $row = $uow->selectLanding($id); $this->Render('Landing', [ 'Title' => _AppName . ' | ویرایش صفحه‌ی فرود', 'Row' => $row ]); } } // این تابع، مسول دریافت کردن اطلاعات ارسال شده در // فرم توسط کاربر است. و سپس نسبت به موقعیت، می‌فهمد که // باید آیتم جدید ایجاد کند یا قبلی را ویرایش کند. // سپس کاربر را به صفحه‌ی اول مدیریت این بخش بر می‌گرداند. function LandingPOST($id = null) { $uow = new UnitOfWork(); if (isset($_POST['insert'])) { $uow->insertLanding($_POST); $this->RedirectResponse(_Root . 'Dashboard/Landings?msg=آیتم جدید ایجاد شد'); } else if ($_POST['update']) { $uow->updateLanding($_POST); $this->RedirectResponse(_Root . 'Dashboard/Landings?msg=آیتم ویرایش شد'); } else if ($_POST['delete']) { $uow->deleteLanding($_POST); $this->RedirectResponse(_Root . 'Dashboard/Landings?msg=آیتم حذف شد'); } } } ## Step 2: In the UnitOfWork class we have db->query($sql); while ($row = $ret->fetchArray(SQLITE3_ASSOC)) array_push($output, $row); return $output; } function selectLanding($Id) // انتخاب یک آیتم تنها { $id = $this->preventInjection($Id); $sql = <<db->query($sql); return $ret->fetchArray(SQLITE3_ASSOC); } function insertLanding($inputs) { foreach ($inputs as $key => $value) $inputs[$key] = $this->preventInjection($value); $title = $inputs['title']; $excerpt = $inputs['excerpt']; $slug = $inputs['slug']; $innerHtml = $inputs['innerHtml']; $sql = <<db->exec($sql); if (!$ret) throw new Exception($this->db->lastErrorMsg()); } function updateLanding($inputs) { foreach ($inputs as $key => $value) $inputs[$key] = $this->preventInjection($value); $id = $inputs['id']; $title = $inputs['title']; $excerpt = $inputs['excerpt']; $slug = $inputs['slug']; $innerHtml = $inputs['innerHtml']; $sql = <<db->exec($sql); if (!$ret) throw new Exception($this->db->lastErrorMsg()); } function deleteLanding($inputs) { $id = $this->preventInjection($inputs['id']); $sql = <<db->exec($sql); if (!$ret) throw new Exception($this->db->lastErrorMsg()); } } ## Step 3: And finally for the views ### Item.php
انصراف
### Items.php ', ...$row); endforeach; ?> صفحات
صفحه جدید
# عنوان
ویرایش%s
--- ## Rapidly run a single-binary static HTTP server Source: `/blog/static-server.md` --- title: "Rapidly run a single-binary static HTTP server" date: 2025-06-18T06:27:36 source: https://blog.gordarg.com/en/680/static-server/ type: post --- # Rapidly run a single-binary static HTTP server # Get the latest version number MINISERVE_VERSION=$(curl -s https://api.github.com/repos/svenstaro/miniserve/releases/latest | grep -Po '"tag_name": "v\K[0-9.]+') # Download the binary curl -L -o miniserve "https://github.com/svenstaro/miniserve/releases/latest/download/miniserve-${MINISERVE_VERSION}-x86_64-unknown-linux-musl" # Make it executable chmod +x miniserve # Move it to a directory in your PATH (optional) sudo mv miniserve /usr/local/bin/ # Run it (serving current directory) miniserve . . #!/bin/bash # Set the directory to the first argument, default to current dir if not provided DIR="${1:-.}" # List files with size, last modified, and MD5 hash, sorted by modified time (newest first) find "$DIR" -type f -printf "%T@ %p\n" | sort -nr | while read -r line; do timestamp=${line%% *} filepath=${line#* } mod_time=$(date -d "@$timestamp" "+%Y-%m-%d %H:%M:%S") size=$(stat --printf="%s" "$filepath") hash=$(md5sum "$filepath" | awk '{print $1}') printf "%-10s %-20s %-40s %s\n" "$size" "$mod_time" "$hash" "$filepath" done # Serve the directory using miniserve on port 8000 miniserve "$DIR" --port 8000 --- ## Wie tippe ich die deutschen Zeichen ß, ü, ö, ä auf der englischen Tastatur ein (Linux – Gnome)? Source: `/blog/wie-tippe-ich-die-deutschen-zeichen-s-u-o-a-auf-der-englischen-tastatur-ein-linux-gnome.md` --- title: "Wie tippe ich die deutschen Zeichen ß, ü, ö, ä auf der englischen Tastatur ein (Linux – Gnome)?" date: 2023-12-01T17:03:13 source: https://blog.gordarg.com/de/396/wie-tippe-ich-die-deutschen-zeichen-s-u-o-a-auf-der-englischen-tastatur-ein-linux-gnome/ type: post --- # Wie tippe ich die deutschen Zeichen ß, ü, ö, ä auf der englischen Tastatur ein (Linux – Gnome)? ## Verwendung der Compose-Taste in GNOME für Sonderzeichen Die **Compose-Taste**  in GNOME ermöglicht es Ihnen, problemlos Sonderzeichen, Akzente und Symbole zu tippen, die auf Ihrer Tastatur möglicherweise nicht direkt verfügbar sind. Befolgen Sie diese Schritte, um sie einzurichten: 1. **Öffnen Sie Tweaks** : * Stellen Sie sicher, dass die **Tweaks** -Anwendung auf Ihrem GNOME-Desktop installiert ist. * Falls nicht, installieren Sie sie über Ihr Software-Center oder Ihren Paketmanager. 2. **Zugriff auf die Einstellungen der Compose-Taste** : * Öffnen Sie die **Aktivitäten-Übersicht**  (drücken Sie die **Super/Windows-Taste**  oder klicken Sie auf die **Aktivitäten-Schaltfläche**  oben links). * Geben Sie “Tweaks” ein und öffnen Sie die **Tweaks** -Anwendung. * Navigieren Sie zum Tab **Tastatur & Maus**. 3. **Aktivieren Sie die Compose-Taste** : * Suchen Sie die Einstellung für die **Compose-Taste**. * Falls sie deaktiviert ist, klicken Sie auf das Label **Deaktiviert**  neben ihr. * Schalten Sie den Schalter **ein** , um die Compose-Taste zu aktivieren. 4. **Wählen Sie Ihre Compose-Taste** : * Wählen Sie eine vorhandene Taste auf Ihrer Tastatur als Compose-Taste aus (z. B. **Rechte Alt** , **Menü**  oder **Caps Lock**). * Aktivieren Sie das Kontrollkästchen neben der ausgewählten Taste. 5. **Compose-Taste-Sequenzen** : * Mit der aktivierten Compose-Taste können Sie Sonderzeichen mit Tastenkombinationen erstellen: * Um **ß**  zu tippen, drücken Sie die **Compose-Taste** , dann **s**  zweimal. * Für **ü**  drücken Sie die **Compose-Taste** , dann **“**  und **u**. * Für **ö**  drücken Sie die **Compose-Taste** , dann **“**  und **o**. * Um **ä**  zu erhalten, drücken Sie die **Compose-Taste** , dann **“**  und **a**. 6. **Weitere Sequenzen erkunden** : * Es gibt viele andere Compose-Taste-Sequenzen. Schauen Sie sich die Compose-Taste-Seite auf Wikipedia für eine umfangreiche Liste an. [von Bing AI]() --- ## WordPress in production Source: `/blog/wordpress.md` --- title: "WordPress in production" date: 2023-12-10T08:31:25 source: https://blog.gordarg.com/en/481/wordpress/ type: post --- # WordPress in production WordPress should not expose warnings and other verbose data in production. On earth, so many configurations such as multiple revisions are not used in such a depth in most cases. So many of obsessive configurations may slow WordPress down. We change configuration of WordPress only from `wp-config.php` so we can have a backup of original configuration and this file can act simply as a restore point to discard all changes in case of any trouble. Don’t change core files. If there is a critical update, contribute to the WordPress project’s repository. If you have some common optional configurations, add it to a plugin. Respect the project modularity. define('FS_METHOD', 'direct'); define( 'WP_POST_REVISIONS', 2 ); define( 'EMPTY_TRASH_DAYS', 2 ); define( 'AUTOSAVE_INTERVAL', 180 ); // 3 mins define( 'WP_ALLOW_REPAIR', true ); define( 'WP_MEMORY_LIMIT', '512M' ); define( 'WP_MAX_MEMORY_LIMIT', '1024M' ); ini_set('display_errors','Off'); ini_set('error_reporting', E_ALL ); define('WP_DEBUG', false); define('WP_DEBUG_DISPLAY', false); define( 'WP_DISABLE_FATAL_ERROR_HANDLER',true ); /* SSL behind reverse proxy */ if ((isset($_ENV["HTTPS"]) && ("on" == $_ENV["HTTPS"])) || (isset($_SERVER["HTTP_X_FORWARDED_SSL"]) && (strpos($_SERVER["HTTP_X_FORWARDED_SSL"], "1") !== false)) || (isset($_SERVER["HTTP_X_FORWARDED_SSL"]) && (strpos($_SERVER["HTTP_X_FORWARDED_SSL"], "on") !== false)) || (isset($_SERVER["HTTP_CF_VISITOR"]) && (strpos($_SERVER["HTTP_CF_VISITOR"], "https") !== false)) || (isset($_SERVER["HTTP_CLOUDFRONT_FORWARDED_PROTO"]) && (strpos($_SERVER["HTTP_CLOUDFRONT_FORWARDED_PROTO"], "https") !== false)) || (isset($_SERVER["HTTP_X_FORWARDED_PROTO"]) && (strpos($_SERVER["HTTP_X_FORWARDED_PROTO"], "https") !== false)) || (isset($_SERVER["HTTP_X_PROTO"]) && (strpos($_SERVER["HTTP_X_PROTO"], "SSL") !== false)) ) { $_SERVER["HTTPS"] = "on"; } ## File permissions sudo chown -R www-data:www-data ../wp sudo find . -type d -exec chmod 755 {} \; sudo find . -type f -exec chmod 644 {} \; --- ## آمادگی برای مهندسی نرم‌افزار Source: `/blog/آمادگی-برای-مهندسی-نرمافزار.md` --- title: "آمادگی برای مهندسی نرم‌افزار" date: 2023-12-20T20:09:51 source: https://blog.gordarg.com/fa/493/%d8%a2%d9%85%d8%a7%d8%af%da%af%db%8c-%d8%a8%d8%b1%d8%a7%db%8c-%d9%85%d9%87%d9%86%d8%af%d8%b3%db%8c-%d9%86%d8%b1%d9%85%d8%a7%d9%81%d8%b2%d8%a7%d8%b1/ type: post --- # آمادگی برای مهندسی نرم‌افزار # **سفری در مهندسی نرم افزار** مهندسان نرم افزار مشتاق، توسعه دهندگان باتجربه و یادگیرندگان کنجکاو، دور هم جمع می‌شویم! در این پست وبلاگ، طیف متنوعی از موضوعات را که ستون فقرات مهندسی نرم افزار مدرن را تشکیل می دهند، بررسی خواهیم کرد. چه جادوگر کد باشید و چه فقط انگشتان پای خود را در اقیانوس وسیع فناوری فرو کنید، اینجا چیزی برای همه وجود دارد. ## 1\. **اگر قصد همکاری با ما را دارید…** همکاری، ضربان قلب نوآوری است. هنگامی که به دنیای توسعه نرم افزار قدم می گذارید، ما گرم ترین استقبال را از شما به عمل می‌آوریم. این را دعوت خود برای پیوستن به جامعه در نظر بگیرید – مکانی که در آن ایده ها شکوفا می شوند، مشکلات حل می شوند و دوستی ها شکل می گیرد. بیایید دست بدهیم و با هم این سفر را آغاز کنیم. ## 2\. **فراتر از اصول: کنترل نسخه و مستندات** ### کنترل نسخه سیستم های کنترل نسخه (VCS) مانند ماشین های زمان برای کد شما هستند. Git، Mercurial و Subversion به شما این امکان را می‌دهند که تغییرات را ردیابی کنید، یکپارچه با هم همکاری کنید، و زمانی که همه چیز به هم ریخته است، به عقب برگردید. به دنیای commit ها، شاخه ها و درخواست های کششی شیرجه بزنید. به یاد داشته باشید، هر خط کد داستانی برای گفتن دارد. ### مستندات فنی و نسخه سازی نوشتن مستندات واضح و مختصر یک هنر است. نحوه ایجاد فایل های README، اسناد API و دفترچه راهنمای کاربر را بیاموزید. نسخه سازی معنایی (major.minor.patch) و چرایی اهمیت آن را درک کنید. خود آینده شما (و هم تیمی هایتان) از شما تشکر خواهند کرد. ## 3\. **پیمایش در اینترنت: مهندسی اینترنت** ### ستون فقرات اتصال مهندسی اینترنت فقط مرور میم های گربه نیست (اگرچه این نیز مهم است). این در مورد درک پروتکل ها، مسیریابی، DNS و امنیت است. در لایه های مدل OSI غوطه ور شوید و کشف کنید که چگونه بسته های داده از بزرگراه های دیجیتال عبور می کنند. ## 4\. کدنویسی با سبک: برنامه نویسی شی گرا (OOP) ### اشیا، کلاس ها و ارث OOP چیزی بیش از یک کلمه رایج است. این پارادایم است که کد را در اجزای ماژولار قابل استفاده مجدد سازماندهی می کند. کلاس‌ها، اشیا، کپسوله‌سازی و چندشکلی را کاوش کنید. راه حل های ظریفی طراحی کنید که در آزمون زمان مقاومت کنند. ## 5\. **تضمین کیفیت: هنر تست** ### توسعه تست محور (TDD) تست نوشتن قبل از کد؟ این دیوانگی نیست؛ TDD است. نحوه ایجاد مجموعه های تست قوی با استفاده از چارچوب هایی مانند JUnit، pytest یا Jasmine را بیاموزید. لذت چراغ های سبز و ناامیدی چراغ های قرمز را کشف کنید. ## 6\. **پشت صحنه: مهندسی بک‌اند** ### سرورها، APIها و پایگاه‌های داده بک‌اند جایی است که جادو اتفاق می افتد. به زبان های سمت سرور (Python، Java، Node.js)، API های RESTful و مدیریت پایگاه داده (SQL، NoSQL) شیرجه بزنید. سیستم‌های مقیاس‌پذیر و ایمن بسازید که به برنامه‌های شما نیرو می‌دهد. ## 7\. **پایداری داده؛ پایگاه های داده** ### SQL در مقابل NoSQL پایگاه‌های داده رابطه‌ای (MySQL، PostgreSQL) در مقابل پایگاه‌های داده NoSQL (MongoDB، Redis) – هر کدام نقاط قوت خود را دارند. درک کنید که چه زمانی باید از یکی بر دیگری استفاده کنید. داده های خود را عادی کنید، نمایه ایجاد کنید و کوئری‌ها را بهینه کنید. ## 8\. **جهانهای موازی: پردازش موازی و الگوریتم** ### تفرقه بینداز و حکومت کن پردازش موازی افزایش عملکرد را باز می کند. الگوریتم های موازی، مدل های همزمانی و تکنیک های موازی سازی را کاوش کنید. از کاهش نقشه تا مرتب سازی موازی، هنر تقسیم کارها و غلبه بر آنها را به طور همزمان کشف کنید. ## 9\. شگفتی های وب: مهندسی نرم افزار مبتنی بر وب ### پیش به سوی فرانت‌اند و فراتر از آن HTML، CSS، جاوا اسکریپت – اینها بلوک های سازنده وب هستند. در چارچوب های فرانت اند (React، Angular، Vue.js) غوطه ور شوید و طراحی واکنش گرا، برنامه های تک صفحه ای و برنامه های وب مترقی را بررسی کنید. ## نتیجه به یاد داشته باشید، این سفر برای رسیدن به مقصد نیست. این در مورد لذت بردن از سواری است. بنابراین، سؤال بپرسید، به دنبال راهنما باشید و به یادگیری ادامه دهید. همکاری در انتظار است – بیایید با هم کدنویسی کنیم، بسازیم و فتح کنیم! 🚀👩‍💻👨‍💻 این پست بلاگ در در گفتگو با بینگ تولید شده است. --- ## استک ما Source: `/blog/استک-ما.md` --- title: "استک ما" date: 2023-10-03T05:24:47 source: https://blog.gordarg.com/fa/89/%d8%a7%d8%b3%d8%aa%da%a9-%d9%85%d8%a7/ type: post --- # استک ما ## استک توسعه‌ی نرم‌افزار ### PHP در بک‌اند از پی‌اچ‌پی استفاده می‌کنیم. پی‌اچ‌پی یک زبان متن‌باز است که بر پایه‌ی زبان سی ایجاد شده. نسخه‌ی ۸ آن ۳ برابر سریع‌تر از نسخه‌ی ۵.۶ آن است. بر اساس شاخص TIOBE[۱]()، پی‌اچ‌پی هفتمین زبان برنامه‌نویسی مشهور دنیا و از لحاظ وفاداری برنامه‌نویسان به آن، رتبه‌ی نخست[۲]() را به خود اختصاص داده است. به این معنی که کسانی که از پی‌اچ‌پی استفاده کرده‌اند، از انتخاب خود راضی بوده و به استفاده از آن ادامه داده‌اند. محیط پی‌اچ‌پی با اشغال فضایی کمتر از ۵۰ مگابایت، آماده‌ی توسعه‌ی برنامه‌ها می‌شود. به دلیل سینتکس بسیار نزدیک به زبان انگلیسی و زبان‌های خانواده‌ی سی، و همچنین انعطاف آن در ساختمان داده‌ها و توابع، آموزش این زبان می‌تواند بدون پیش‌نیاز انجام شود. یکی از نقاط قوت پی‌اچ‌پی ترکیب ساده‌ی آن با HTML و CSS است. هزینه‌ی نگه‌داری از برنامه‌های پی‌اچ‌پی در صورت رعایت اصول پیاده‌سازی آن، به نسبت کمتر از سایر زبان‌هاست. پی‌اچ‌پی برای اجرا نیاز به کامپایل ندارد و به همین دلیل آن را به عنوان زبان اسکریپت نویسی می‌شناسند. البته نسخه‌ی ۸ فایل‌ها را پیش‌پردازش می‌کند که باعث افزایش سرعت اجرای آن نسبت به نسخه‌های قدیمی‌تر شده است. پی‌اچ‌پی قابلیت همخوانی با وب‌سرورهای مختلفی را دارد و یکی از مهم‌ترین ویژگی‌های آن، انعطاف‌پذیری در پیاده‌سازی هاست اشتراکی است. ![](../media/Screenshot-from-2023-10-07-23-48-16.png)PHP statistics by Wappalyzer ### C# یکی از مهم‌ترین نقاط قوت زبان‌برنامه‌نویسی سی‌شارپ و چهارچوبی که بر آن سوار است، `type-safe` بودن آن است. ### WordPress وردپرس یکی از قدرتمندترین و البته ایمن‌ترین سامانه‌های مدیریت محتوی است. با بهره‌گیری از معماری بسیار انعطاف‌پذیر و هزاران افزونه، این سامانه محبوبیت بسیاری در بین اهل فن آن دارد. بسیاری از افراد از وردپرس برای پیاده‌سازی کامل روندهای کاری کسب و کارشان استفاده می‌کنند. ما در گردرگ از وردپرس برای بخش‌های عمومی وب‌سایت‌ها و روندهای کاری عمومی مانند فرم‌ها و فروشگاه‌ها استفاده می‌کنیم. ### JavaScript (jQuery) ما همچنان مقید به جاوااسکریپت مانده‌ایم و به سختی رضایت می‌دهیم که چهارچوب‌های نرم‌افزاری مبتنی بر آن را در ساختار مهندسی بگنجانیم. جاوااسکریپت زبان بسیار قدرتمندی است. ما صرفا برای افزایش سرعت توسعه‌ی نرم‌افزار و ارتقای تجربه‌ی توسعه‌دهندگان و کاهش هزینه‌های کارفرما از جیکوئری به عنوان مکملی استفاده می‌کنیم. تا به آگوست ۲۰۲۲، جی‌کوئری در ۷۷ درصد از ۱۰ میلیون وب‌سایتی استفاده شده بود که از نظر شهرت فهرست شده بودند. ### SQL Server ### SQLite ### MySQL ### Nginx ### Docker ### Portainer ### Ubuntu Desktop ### Ubuntu Server ### Hangfire ### Datadog HQ ### Git ### Uptime Kuma با امکاناتی که آپتایم‌کوما در اختیار ما قرار داده است، ما قادریم تا سرویس‌های داکر و ای‌پی‌آی‌های خود و کارفرمایان را دائما مانیتور کنیم. دسترس پذیری وب‌سایت‌ها با استفاده از قابلیت‌های نظارت اچ‌تی‌تی‌پی و دی‌ان‌اس این نرم‌افزار به سادگی و با اطمینان بسیار بالایی انجام می‌شود. ![](../media/grafik-1024x643.png) ## استک سازمانی ### Kanboard ### Bookstack ### Inkscape ### GIMP ### Gitea ### DeltaChat دلتاچت که بر پایه‌ی پروتوکل‌های پست الکترونیکی کار می‌کند به ما این قابلیت را می‌دهد که پیام‌هایمان را با استفاده از سرورهای خودمان منتقل کنیم. هم‌چنین ما را محدود به کاربران دلتاچت نمی‌کند و می‌توانیم به هر کسی که آدرس ایمیل دارد پیام بفرستیم و یا پیام‌ها را از آن‌ها دریافت کنیم. دلتاچت که نرم‌افزاری متن‌باز، رایگان و آزاد است با بهره‌گیری از واسط گرافیکی مشابه با پیام‌رسان‌های مدرن، کاربری بسیار ساده‌ای را فراهم کرده است. ### BasicWebRTC ما از basicwebrtc برای برگزاری جلسات آنلاین بهره می‌بریم. ![](../media/basicwebrtc.jpeg) ### Firefox ### Relations خوش‌حسابی یکی از حساسیت‌های گردرگ است. خصوصا در شرایط تورمی که بیش از پیش زمان‌بندی در امور مالی اهمیت دارد. با وجود بسیاری از برنامه‌های حساب‌داری استاندارد و قدرتمندی که در بازار وجود دارد، ترجیح دادیم خودمان برنامه‌ای بسازیم که ثبت تراکنش‌ها به دقت انجام شده و گزارش‌های مورد نیاز کارفرمایان را در لحظه به آن‌ها ارائه کند. ### FreeScout ما از نرم‌افزار فری‌اسکوت به عنوان دبیرخانه بهره می‌بریم. نرم‌افزاری بسیار قدرتمند و پایدار است که ما را قادر می‌سازد از طریق ایمیل سازمانی خود پست الکترونیکی ارسال کنیم و پیام‌ها را با سطوح دسترسی متناسب هر صندوق ورودی، به همکارانمان ارجاع دهیم. * * * 1. https://david-garcia.medium.com/is-php-a-dead-language-lets-run-a-deep-analysis-in-2023-f504bd1a7177 2. https://medium.com/@london.lingo.01/10-reasons-why-php-is-still-relevant-in-2023-d533ed6dc687 --- ## حذف کَش در مرورگر Source: `/blog/حذف-کَش-در-مرورگر.md` --- title: "حذف کَش در مرورگر" date: 2023-10-21T17:53:47 source: https://blog.gordarg.com/fa/223/%d8%ad%d8%b0%d9%81-%da%a9%d9%8e%d8%b4-%d8%af%d8%b1-%d9%85%d8%b1%d9%88%d8%b1%da%af%d8%b1/ type: post --- # حذف کَش در مرورگر مرورگرهای اینترنتی (مانند فایرفاکس، کروم یا اج) همیشه داده‌های وب‌سایت‌ها را بارگیری نمی‌کنند. به همین دلیل است که معمولا پس از اولین مراجعه، صفحات وب‌سایت سریع‌تر اجرا می‌شوند. فایل‌هایی که ذخیره می‌شوند معمولا شامل فایل‌های ایستا هستند. فایل‌های ایستا فایل‌هایی هستند که سمت سرویس‌دهنده اجرا نمی‌شوند. از جمله‌ی این فایل‌ها می‌توان به تصاویر، فایل‌هایی که برای زیباسازی و یا پویایی صفحات استفاده می‌شوند یاد کرد. از همین جهت، اگر همکاران ما در وب‌سایت‌ها تغییراتی اعمال کنند، ممکن است از کارفرمایان درخواست کنند تا فایل‌های کش شده را حذف کنند و یا اصطلاحا «کش خود را پاک کنند». کش در مرورگرهای موبایل و دسکتاپ وجود دارد. ## تنظیمات کش مرورگرهای دسکتاپ برای حذف کردن کش در مرورگر دسکتاپ خود می‌توانید از کلید‌های ترکیبی Ctrl + Shift + i استفاده کنید. ![](../media/Screenshot-from-2023-10-21-20-05-07-1024x656.png) در مرورگرهای فایرفاکس، کروم و اج می‌توان از طریق Developer Tools و تب Network می‌توان کش را غیر فعال نمود. و در زمانی که این پنجره باز است، صفحه را رفرش (تازه‌سازی) نمایید. --- ## حقوق و اختیارهای کارفرما (مشتری) Source: `/blog/حقوق-و-اختیارهای-کارفرما-مشتری.md` --- title: "حقوق و اختیارهای کارفرما (مشتری)" date: 2023-12-07T14:29:27 source: https://blog.gordarg.com/fa/474/%d8%ad%d9%82%d9%88%d9%82-%d9%88-%d8%a7%d8%ae%d8%aa%db%8c%d8%a7%d8%b1%d9%87%d8%a7%db%8c-%da%a9%d8%a7%d8%b1%d9%81%d8%b1%d9%85%d8%a7-%d9%85%d8%b4%d8%aa%d8%b1%db%8c/ type: post --- # حقوق و اختیارهای کارفرما (مشتری) **این سند در طی زمان به روز می‌گردد و در قرارداد‌هایی که پیش از نسخه‌ی بعدی این سند منتشر شده‌اند اجرا می‌شوند**. این سند تنها جهت اطلاع منتشر شده و هیچ‌گونه ارزش قانونی ندارد. ## ساختار پروژه‌های ما پروژه‌های ما معمولا ساختار پودمانی (ماژولار) دارند. در این صورت، با کارفرما در زمینه‌ی هر ماژول به صورت مجزا توافق می‌شود. ماژول‌ها در رابطه با یکدیگر به کاربر نهایی احساس یکپارچگی می‌دهند. ## مالکیت بر نام دامنه و دسترسی به کدها ## فسخ یک‌طرفه‌ی قرارداد تا مدت سه‌روز پس از عقد قرارداد، کارفرما بدون هیچ شرط دیگری می‌تواند مبلغ پیش‌پرداخت خود را باز پس بگیرد. --- ## خدمات ما Source: `/blog/خدمات-ما.md` --- title: "خدمات ما" date: 2023-10-02T19:34:19 source: https://blog.gordarg.com/fa/%d8%ae%d8%af%d9%85%d8%a7%d8%aa-%d9%85%d8%a7/ type: page --- # خدمات ما ![](../media/Bildschirmfoto-am-2023-10-23-um-12.47.03.png) [ما](<درباره-ما.md>) برنامه‌های کامپیوتر، اپلیکیشن‌های موبایل، و نرم‌افزارهای اینترنت اشیا می‌سازیم. شما در زندگی روزمره با نرم‌افزارها برخورد دارید. از صدای زنگ بیدار‌باش گوشی موبایل گرفته، مطالعه‌ی اخبار و خرید اینترنتی، تا برداشت پول از حسابتان را نرم‌افزارهایی انجام می‌دهند که توسط تیم‌هایی مانند ما ساخته شده‌اند. ما در کنار تیم فنی شما قرار می‌گیریم و خدمات مکمل مورد نیازتان را ارائه می‌کنیم. راه‌اندازی سرورها گرفته تا نظارت بر پایداری سرویس‌هایتان تا حضوری همیشگی در بازار رقابت داشته باشید. همچنین می‌توانیم نرم‌افزارهای شما را تعمیر و تمدید کنیم. در موارد اضطراری به شما امداد رسانی کنیم. و کیفیت توسعه و نگهداری نرم‌افزارهایتان را افزایش دهیم. ما به صورت تخصصی در چند حوزه به صورت عمیق و با رعایت اصول کیفی استواری به ارائه‌ی خدمات می‌پردازیم. به همین منظور با وجود فراهم بودن شرایط، در بسیاری از بازارها ورود نکرده‌ایم تا بتوانیم استاندارد‌های خود را در بالاترین سطح ممکن حفظ کنیم. ## خدمات ما در آدرس زیر قابل مشاهده است [business.gordarg.com]() ## خدمات پس از فروش در تمامی تعرفه‌ها 1. تحویل همزمان خروجی بر روی سرور شخصی 2. تحویل کد منبع (در ماژول‌های اختصاصی) 3. رعایت مستند سازی کد 4. امکان نظارت همزمان بر فرآیند پروژه (پیشرفت فیزیکی) توسط کارفرما 5. امکان نظارت همزمان بر منابع مالی پروژه و مدیریت آن توسط کارفرما 6. رعایت قواعد سندِ سبک برند کارفرما در پروژه ## سبکِ کارِ ما ابتدا ما با کارفرمای محترم [جلساتی](<قواعد-همکاری-بینِ-سازمانی.md>) را برای آشنایی تیم‌ها و درک مسئله انجام می‌دهیم. در این فرایند، سعی می‌کنیم با استفاده از امکانات موجود کارفرما به ارائه‌ی راهکار برای مسائل بپردازیم. گروه ما از آغاز تا انتهای هر پروژه در [تعامل](<قواعد-نگارش.md>) با کارفرمای محترم قرار دارند و همچنین آموزش‌های لازم را در اختیار ایشان قرار می‌دهند. --- ## درباره ما Source: `/blog/درباره-ما.md` --- title: "درباره ما" date: 2023-10-02T17:40:46 source: https://blog.gordarg.com/fa/%d8%af%d8%b1%d8%a8%d8%a7%d8%b1%d9%87-%d9%85%d8%a7/ type: page --- # درباره ما ## گُردَرگ گُرد پهلوان، تهمتن، دلیر، رشید، قهرمان ارگ ![](../media/Arge_Bam_Arad_edit.jpg)ارگ بم – عکس آراد مجتهدی – از ویکی‌پدیا دژ، صرح، قصر، قلعه، کاخ ## تاریخچه گردرگ از سال ۱۳۹۵ فعالیت می‌کند. از آن زمان در چهارچوب [ماموریت](<ماموریت-گردرگ.md>) به بیش از پنجاه کارفرمای حقوقی و حقیقی خدمات پیمانی ارائه دادیم و لبخند رضایت ایشان را به ارمغان آوردیم. مهم‌ترین سرمایه‌ی ما، ذهن‌های درخشانی هستند که با پشتکار و خردِ خود، گوی آبی زندگی‌بخش زمین و مادرمان ایران‌زمین را آبادتر می‌کنند. ما از شما که قدر نعمت زندگی را می‌دانید و خود را به دانش آراسته‌اید دعوت می‌کنیم که به ما بپیوندید. --- ## روندکاری گردرگ Source: `/blog/روندکاری-گردرگ.md` --- title: "روندکاری گردرگ" date: 2023-10-16T08:05:23 source: https://blog.gordarg.com/fa/206/%d8%b1%d9%88%d9%86%d8%af%da%a9%d8%a7%d8%b1%db%8c-%da%af%d8%b1%d8%af%d8%b1%da%af/ type: post --- # روندکاری گردرگ بیشتر ساز و کارهای گردرگ از پیش تعیین شده هستند. هر چیزی که بیش از یک بار انجام شود، به ساز و کار تبدیل می‌شود. بیشتر رخدادها ثبت شده و از اصول مدیریت دانش پیروی می‌کنند تا بعدا قابل مطالعه و ارجاع باشد. بخشی از فرایند‌های گردرگ که به صورت پیش‌نویس و با جزییات اندک هستند در ادامه جهت اطلاع کارفرمایان محترم ارائه شده است. ![](../media/gordarg_workflow.svg)فرایند همکاری با کارفرما ![](../media/gordarg_workflow-7842d1.svg)فرایندهای داخلی همکاران نمودارها با استفاده از نرم‌افزار LibreOffice Draw که بخشی از [استک ما](<استک-ما.md>) است. برای [دانلود پی‌دی‌اف](<../media/gordarg_workflow.pdf>) نمودارها از [این لینک](<../media/gordarg_workflow.pdf>) استفاده کنید. --- ## شیوه‌ی نگارش و پردازشِ سخنِ فارسی Source: `/blog/قواعد-نگارش.md` --- title: "شیوه‌ی نگارش و پردازشِ سخنِ فارسی" date: 2023-10-23T08:10:26 source: https://blog.gordarg.com/fa/248/%d9%82%d9%88%d8%a7%d8%b9%d8%af-%d9%86%da%af%d8%a7%d8%b1%d8%b4/ type: post --- # شیوه‌ی نگارش و پردازشِ سخنِ فارسی ## فارسی معیار * معیار ما برای واژه‌های فارسی، مجموعه‌ی کلمه‌هایی است که در آثار حافظ (شاعر ایرانی) به کار برده شده‌اند. * از استفاده از واژه‌های بیگانه دوری می‌کنیم. و مگر در مورادی که معادل مناسبی برای واژگان وجود ندارد و یا دارای شهرت کافی نیستند، از آن‌ها استفاده نمی‌کنیم. ## پردازش سخن * گزاف نگویید. * برای سخن خود طرح داشته باشید و به هدف تعیین شده پایبند بمانید. تعداد سطح باز کردن مطلب را از قبل مشخص کنید و بیش از مقدار تعیین شده وارد جزئیات نشوید. * مخاطبین خود را بشناسید و سخن را نسبت به پیشینه و دانش ایشان بیان کنید. * سخن باید شامل مقدمه، متن، و مرور باشد. مقدمه باید متناسب با متن باشد. مرور نباید مطلبی جدید ارائه کند. دستورکارهای مکتوب بخش مرور مطلب ندارند. ## درست‌نویسی 1. از «هکسره» درست استفاده کنید. ## علائم نگارشی 1. جملات با نقطه، دونقطه، و یا نقطه‌ویرگول به پایان می‌رسند. برای تشریح کلام از دونقطه و برای جملاتی که معنای مستقل آن‌ها با جمله‌ی بعدی تغییر می‌کند، از نقطه‌ویرگول استفاده می‌کنیم. 2. کلمه‌ها به علامت‌های نگارشی بعد از خود می‌چسبند. بجز باز کردن پرانتز، کروشه، گیومه و موارد مشابه که از کلمه‌ی پیشین فاصله گرفته و به کلمه‌ی بعد خود می‌چسبند. 3. کلمه‌ها از هم فاصله دارند. حتی اگر به حروف غیر چسبان ختم شوند. 4. عبارت‌هایی که از چند کلمه دارای معنی مستقل تشکیل شده‌اند و معنای جدیدی گرفته‌اند باید با نیم‌فاصله به یک‌دیگر متصل شوند. --- ## قواعد همکاری بینِ سازمانی Source: `/blog/قواعد-همکاری-بینِ-سازمانی.md` --- title: "قواعد همکاری بینِ سازمانی" date: 2023-10-23T08:59:01 source: https://blog.gordarg.com/fa/244/%d9%82%d9%88%d8%a7%d8%b9%d8%af-%d9%87%d9%85%da%a9%d8%a7%d8%b1%db%8c-%d8%a8%db%8c%d9%86%d9%90-%d8%b3%d8%a7%d8%b2%d9%85%d8%a7%d9%86%db%8c/ type: post --- # قواعد همکاری بینِ سازمانی ## صورت جلسه قرارها باید مکتوب باشند. صورت‌های جلسه‌های تشکیل شده، باید از [قاعده‌های سخن‌پردازی](<قواعد-نگارش.md>) پیروی کنند. سندهای غیر مکتوب قابل استناد نیستند. بدیهی است که برای پیش‌برد اهداف سازمان‌ها جلسه‌هایی به صورت تلفنی، حضوری و یا با رسانه‌های دیگر انجام شود. جلسه‌ها زمانی رسمیت دارند که دارای صورت جلسه‌ی تایید شده توسط اعضای حاضر باشند. صورت جلسه دارای بخش‌های زیر است: * هدف جلسه که باید از قاعده‌های هدف‌گزاری پیروی کند. * افراد حاضر در جلسه. * تصمیم‌ها و مسول انجام هر تصمیم. در صورت تغییر در وضعیت کار و یا لزوم تغییر شیوه‌ی کار، تصمیم‌های جدید باید در طی جلسه ای دیگر دوباره مطرح و مستند شود. ## نمایندگی سازمان سازمان‌ها باید نمودار ساختار سازمانی خود را در اختیار یکدیگر قرار دهند. همچنین باید سندهای مربوط به ثبت رسمی سازمان در روزنامه‌های رسمی که بیان‌گر حق امضا و دایره‌ی اختیارهای افراد است را ارائه کنند. افرادی که به نمایندگی از سازمان‌ها معرفی می‌شوند باید دارای معرفی‌نامه‌ای باشند که به وضوح دایره‌ی اختیارات ایشان را مشخص کرده باشد. ## قرارداد قرارداد خود نوعی صورت جلسه است که از چهارچوب مرسوم پیروی کرده و از قوانین بالادستی کشور تبعیت می‌کند. --- ## بیانیه‌ی ماموریت Source: `/blog/ماموریت-گردرگ.md` --- title: "بیانیه‌ی ماموریت" date: 2023-10-02T13:22:14 source: https://blog.gordarg.com/fa/28/%d9%85%d8%a7%d9%85%d9%88%d8%b1%db%8c%d8%aa-%da%af%d8%b1%d8%af%d8%b1%da%af/ type: post --- # بیانیه‌ی ماموریت ### ماموریت ما ما با طراحی، اجرا و نگه‌داری از راه‌کارهای نرم‌افزاری، راه دست‌یابی کارفرمایان و ذی‌نفعانشان به اهداف تجاری را هموار می‌کنیم. ### چشم‌انداز ما جهانی را تصور می کنیم که نرم‌افزارهای آزاد و انرژی‌های تجدیدپذیر در زندگی روزمره‌ی انسان‌ها جریان دارند. چشم‌انداز ۱۰ ساله‌ی ما تا سال ۲۰۳۳، تبدیل شدن به بزرگترین توسعه‌دهنده‌ی راه‌کارهای فناورانه‌ی سبز در خاورمیانه و شمال افریقا است. ### محصولات * [خدمات پیمانی به کارفرمایان](<خدمات-ما.md>) * توسعه‌ی نرم‌افزار ### مشتریان * سازمان‌های خصوصی بین ۱۰۰ تا ۵۰۰ نفر * سازمان‌های خصوصی با اثربخشی بالا * سازمان‌های خصوصی فعال در فناوری‌های های‌تک ### بازار * کسب و کارهایی که به اهمیت فناوری اطلاعات در بهینه‌سازی روندهای کسب و کارشان آگاهند ### فناوری‌ها * [سیستم‌های عامل، ابزارهای توسعه‌ی نرم‌افزار، و سایر نرم‌افزارهای کاربردی](<استک-ما.md>) * رایانه‌ها، ابزارهای جانبی رایانه‌ها، و سخت‌افزار شبکه * سرورهای ابری * اینترنت ### بقا و سودآوری * ارائه‌ی محصولات * توسعه‌ی افقی در سازمان‌های تابعه * شراکت در طرح‌های تخصصی با سایر سازمان‌ها * سرمایه‌گذاری سود انباشته در اوراق بهادار ### توجه به تصور مردم * ارائه‌ی محصولات همخوان با پیشینه‌ی فرهنگی، تاریخی، و مذهبی ایران * تولید محصولات با کیفیت و ماندگاری در سطح استانداردهای جهانی ### توجه به کارکنان * انتخاب پروژه‌ها بر اساس برایند علاقه‌مندی‌های همکاران * مکانیزم‌های افزایش توانمندی‌های فردی * برقراری عدالت با حفظ حداکثری حقوق مادی و معنوی ایشان --- ## معماری راهکارهای نرم‌افزاری سازمانی Source: `/blog/معماری-راهکارهای-نرمافزاری-سازمانی.md` --- title: "معماری راهکارهای نرم‌افزاری سازمانی" date: 2023-12-01T07:51:11 source: https://blog.gordarg.com/fa/458/%d9%85%d8%b9%d9%85%d8%a7%d8%b1%db%8c-%d8%b1%d8%a7%d9%87%da%a9%d8%a7%d8%b1%d9%87%d8%a7%db%8c-%d9%86%d8%b1%d9%85%d8%a7%d9%81%d8%b2%d8%a7%d8%b1%db%8c-%d8%b3%d8%a7%d8%b2%d9%85%d8%a7%d9%86%db%8c/ type: post --- # معماری راهکارهای نرم‌افزاری سازمانی [![](../media/null-1-1024x675.png)](<../media/null-1.png>)نمودار ساختار فایل‌های نرم‌افزارهای سازمانی گردرگ --- ## مدل‌سازی محصول پیش از تولید Source: `/blog/پروتوتایپ.md` --- title: "مدل‌سازی محصول پیش از تولید" date: 2023-10-04T07:55:10 source: https://blog.gordarg.com/fa/104/%d9%be%d8%b1%d9%88%d8%aa%d9%88%d8%aa%d8%a7%db%8c%d9%be/ type: post --- # مدل‌سازی محصول پیش از تولید ![](../media/1667831781-wind-tunnel.jpg)تونل باد. تصویر از: از dewesoft.com در تمامی شاخه‌های مهندسی، از نقشه‌ها، یادداشت‌ها، نمودارها، و ماکت‌ها برای ایجاد نمونه‌ای از واقعیت استفاده می‌شود. به همین ترتیب، اختلاف دیدگاه‌ها بین ذی‌نفعان پروژه به حداقل می‌رسد و بدقولی رخ نمی‌دهد. استفاده از این ابزار باعث می‌شود تا: * کارفرما و تیم عملیاتی، دیدگاه مشترکی نسبت به آن‌چه قصد پیاده‌سازی آن را دارند پیدا کنند؛ * اشکالات احتمالی طرح، پیش از اجرای آن مشخص شود. تحلیل یک نرم‌افزار و ایجاد مدل‌های مورد نیاز، دارای سلسله مراتبی است که در پروژه‌های کوچکتر می‌توان با رعایت برخی احتیاط‌ها از بعضی از آن مراحل چشم‌پوشی کرد. یکی از مراحلی که عمدتا نمی‌توان نسبت به اهمیت آن بی‌تفاوت بود، مرحله‌ی ایجاد نمونه‌ی بصری از خروجی نرم‌افزار است که انواع آن با نام‌های [وایرفریم]()، [پروتوتایپ]()، [سیاه‌قلم]()، و غیره شناخته می‌شوند. ![](../media/Screenshot-from-2023-10-04-10-57-06.png)نمونه‌ی طراحی واسط گرافیکی محصول برای کارفرما انجام شده در گردرگ ## اهمیت مدل‌سازی محصول در مدیریت پروژه و مدیریت حقوقی افزایش اطمینان در عمل برای تیم عملیاتی و کارفرما کمترین فایده‌ی مدل‌سازی محصول است. این مدل‌سازی‌ها با روشن کردن نقشه‌ی راه باعث می‌شوند که تیم عملیاتی با سرعت و دقت بالاتری محصول را تولید کنند و تاثیر عوامل انسانی در کیفیت محصول بشدت کاهش می‌یابد. هم‌چنین امکان انتقال فعالیت به متخصصان و یا تیم‌های دیگر بسیار ساده‌تر خواهد بود. چنانکه ادامه دادن ساخت یک بنا به پشتوانه‌ی پلان و دستورالعمل‌های استاندارد، پیچیدگی چندانی نخواهد داشت. به این ترتیب وابستگی کسب و کار به افراد بشدت کاهش یافته و فرایندها ساده‌تر مدیریت خواهند شد. ایجاد نمونه‌ی اولیه از محصول اجازه‌ی آزمون خروجی کار در مراحل مختلف را به طراحان و سرمایه‌گذاران می‌دهد. به این ترتیب که می‌توانند مخاطبین خود را دقیق‌تر بشناسند و حتی در طی آزمون‌های مختلف، سلایق و نیازهای واقعی آن‌ها را بسنجند. به این ترتیب، شانس موفقیت پروژه و در نهایت بازگشت سرمایه افزایش پیدا خواهد کرد. ## پروتوتایپ کاری اضافه بر سازمان نیست لازم است اشاره کنیم که پروتوتابپ کاری اضافه بر سازمان نیست. چرا که هر متخصص برای انجام دادن فعالیت‌هایش ابتدا مواردی را در ذهن و یا در یادداشت‌های عموما پراکنده پیاده‌سازی خواهد کرد. ممکن است بر اساس تجربه، فردی متخصص بتواند پروژه‌های مشابهی را بدون چنین اسنادی پیاده‌سازی کند اما باید بپذیریم که بیشتر پروژه‌های نرم‌افزاری ویژگی‌های یکتایی دارند و احتمال آن که دو کارفرما پروژه‌ی کاملا مشابهی را از یک پیمانکار درخواست کنند تقریبا صفر است. در نهایت می‌توان این‌طور جمع‌بندی کرد که دیر یا زود همه‌ی کسانی که در صنعت فناوری اطلاعات دستی بر آتش دارند، به اهمیت پروتوتایپ پی می‌برند. --- ## کدهای رفتار حرفه‌ای Source: `/blog/کدهای-رفتار-حرفهای.md` --- title: "کدهای رفتار حرفه‌ای" date: 2023-10-21T19:17:59 source: https://blog.gordarg.com/fa/230/%da%a9%d8%af%d9%87%d8%a7%db%8c-%d8%b1%d9%81%d8%aa%d8%a7%d8%b1-%d8%ad%d8%b1%d9%81%d9%87%d8%a7%db%8c/ type: post --- # کدهای رفتار حرفه‌ای 1. اتیکت 1. افراد را با عناوین رسمی مورد خطاب قرار دهید: 1. همکاران خود را تنها با عناوین «آقا» و «خانم» و با استفاده از نام خانوادگی مورد خطاب قرار دهید. 2. کادر درمان دارای دکترای عمومی و یا دکترای تخصصی را با عناوین «آقای دکتر» و یا «خانم دکتر» مورد خطاب قرار دهید. 3. صنعت‌گران دارای عناوین شغلی «سنیور» که مدرک کارشناسی در رشته‌های فنی و مهندسی را با لقب «آقای مهندس» و یا «خانم مهندس» مورد خطاب قرار دهید. 4. افراد دارای مدرک دکترای رشته‌های مهندسی را با لقب «آقای دکتر» و یا «خانم دکتر» مورد خطاب قرار دهید. 5. برای خطاب قرار دادن سایر افراد، تنها از عناوین «آقا» یا «خانم» استفاده کنید. 6. در زبان‌های غیر فارسی، از به کار بردن عناوینی که به وضعیت تاهل افراد اشاره دارند خودداری کنید. برای مثال در زبان انگلیسی در مورد بانوان تنها از «Ms.» استفاده نمایید. 2. از اولویت، کانال و سطح اهمیت متناسب با پیام و وضعیت مخاطب استفاده کنید. در پیام‌های حاوی هشدار از لحن ملایم استفاده نکنید. هشدارها را با صراحت بیان کنید. 3. از ارسال چندباره یک پیام مشابه بپرهیزید. در صورت نیاز به یادآوری، ارجاع دهید. در صورت نیاز به باز ارسال پیام، حتما از قواعد بازارسال پیروی کنید. 4. از ارسال کربن‌کپی به افراد غیر ضروری خودداری کنید. 5. پیام‌ها باید درخواست واضحی داشته باشند و یا جهت اطلاع ارسال شده باشند. 6. [در پیام‌های مکتوب از شیوه‌ی نگارش پیروی کنید.](<قواعد-نگارش.md>) 7. خجالت نکشید. تعارف نکنید. پیام را واضح منتقل کنید. از کنایه استفاده نکنید. عبارت‌هایی که باعث برداشت دوگانه می شوند را بیان نکنید. 8. از پر کردن عریضه خودداری کنید: عبارت‌هایی که به گیرایی و انتقال دقیق‌تر پیام کمکی نمی‌کنند را به کار نبرید. بیش از نیاز بیان نداشته باشید. 9. تحقیر، تمسخر و توهین نکنید. به کلیشه‌ها ارجاع ندهید. خلاف واقع بیان نکنید. 2. نتیکت 1. ایمیل را به سایر راه‌های ارتباط الکترونیک ترجیح دهید. 2. آدرس ایمیل باید شامل نام خانوادگی شما باشد. بهتر است از اعداد در ایمیل استفاده نشود. از بخش یا تمام تاریخ تولد، اعدادی که شامل بار معنایی در فرهنگ‌های مختلف هستند و شماره‌ی تلفن در آدرس ایمیل و یا نام کاربری خود استفاده نکنید. تنها سمبل مجاز، زیر خط (آندرلاین) است که نباید دوبار و یا بیشتر پشت‌سر‌هم استفاه شود. 3. به پیام‌ها و سندها، عنوان و نام مرتبط با محتوا اختصاص دهید. 4. حتما در بخش مربوط به «نام مخاطب» در هنگام ارسال ایمیل و یا پیام‌رسان‌ها، از عناوین مرتبط که در بند مربوطه آمده است استفاده نمایید. 5. پیام‌ها را با سپاسگزاری رسمی به پایان برسانید. 1. برای کارکنان نهادهای حاکمیت مانند دولت و اصحاب رسانه، از عبارت «با آرزوی توفیق» استفاده نمایید. 2. برای صنعت‌گران، رقبا، شرکا، و کارفرمایان، از عبارت «با آرزوی بهروزی» استفاده نمایید. 3. برای همکاران از عبارت «بدرود» در پایان پیام‌ها استفاده نمایید. 6. تایید دریافت پیام‌ها را سریع ارسال کنید. بسیاری از پیام‌رسان‌ها ابزارهایی برای واکنش به پیام‌های ورودی دارند. پاسخ پیام‌ها را سریع ارسال کنید. 7. در آغاز رشته‌ای از پیام‌ها، خود را معرفی کنید. 8. پیش از انجام تماس‌های برخط، منطقه‌ی زمانی، تقویم و ساعت کاری مخاطب را بررسی کنید. 3. کار گروهی 4. مدیریت، مفهومی چتری در بسیاری از کارهاست و انجام آن نیاز به تمرین و اندوختن دانش دارد. به مجرد اینکه نقشی بیش از دیگر نقش‌های به مدیریت کارهای افراد دیگر میپردازد، نباید موجب ایجاد برتری نسبت به سایر اعضای گروه باشد. از اعطای نقش مدیریت نباید به عنوان پاداش استفاده شود. جایگاه‌های بالاتر سازمان را میزان مسولیت و پاسخگویی این جایگاه تعیین می‌کند. 5. جابجایی افراد در بین پروژه‌ها، نقش‌ها، تیم‌ها و ماموریت‌ها طبیعت کار گروهی است. 6. افراد در تشخیص مصادیق «کارِ اخلاقی» مسول مختار اند. ایشان باید از انجام عمل غیر اخلاقی حتی اگر در راستای شاخص‌های عملکرد باشد، خودداری کنند. 7. تضاد منافع 8. --- ## index.html Source: `/index.html` گردرگ — توسعه‌ی نرم‌افزار، با تحویل کد منبع

گردرگ — از سال ۱۳۹۵

نرم‌افزاری که مالکش شما هستید.

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

نُه تقدیرنامه‌ی امضاشده را ببینید ↓

۱۳۹۵ آغاز فعالیت
۵۰+ کارفرمای حقوقی و حقیقی
۵ عضو گروه
کدِ منبع در ماژول‌های اختصاصی، تحویل کارفرما

خدمات و روشِ کار

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

ساختِ نرم‌افزار

برنامه‌های کامپیوتر، اپلیکیشن‌های موبایل، و نرم‌افزارهای اینترنت اشیا — از تحلیل مسئله تا استقرار و آموزش تیم شما.

در کنار تیم فنی شما

خدمات مکمل برای تیمی که دارید: راه‌اندازی سرورها، و نظارت بر پایداری سرویس‌هایتان تا حضوری همیشگی در بازار رقابت داشته باشید.

تعمیر، تمدید، امداد

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

تعهدهای ما، در تمامی تعرفه‌ها

  1. تحویل همزمان خروجی بر روی سرور شخصی شما
  2. تحویل کد منبع، در ماژول‌های اختصاصی
  3. رعایت مستندسازی کد
  4. نظارت همزمان کارفرما بر پیشرفت فیزیکی پروژه
  5. نظارت همزمان کارفرما بر منابع مالی پروژه و مدیریت آن
  6. رعایت قواعد سندِ سبک برندِ کارفرما

شرح کامل خدمات · روندِ کاری ما

دیوارِ اعتماد

آن‌چه کارفرماها نوشته‌اند — با امضا و مُهر. روی هر تقدیرنامه بزنید تا اصلِ نامه را ببینید.

  • از زحمات بی‌شائبه و تلاش‌های صادقانه‌ی شما کمال تقدیر را داریم.
    علی ایران‌پورمدیر عامل، سازه‌تابان سپاهان
    اصلِ تقدیرنامه‌ی سازه‌تابان سپاهان، به امضای علی ایران‌پور
  • درکی عمیق از چالش‌ها و فرصت‌های توسعه‌ی ابری دارند.
    بهنام رستمیرئیس هیات مدیره، آسمان گستر
    اصلِ تقدیرنامه‌ی آسمان گستر، به امضای بهنام رستمی
  • از نگاه تخصصی، مهارت و آینده‌نگری شما کمال تشکر را داریم.
    فرشاد فراهانیمدیر عامل، پویان زربار
    اصلِ تقدیرنامه‌ی پویان زربار، به امضای فرشاد فراهانی
  • از زحمات بی‌شائبه و تلاش‌های صادقانه‌ی شما کمال تقدیر را داریم.
    مهدی عرب‌زادهمدیر عامل، سازه‌تابان سپاهان
    اصلِ تقدیرنامه‌ی سازه‌تابان سپاهان، به امضای مهدی عرب‌زاده
  • پروژه با هزینه‌ی معادل پنج ماه نگه‌داری نرم‌افزار قبلی بازآفرینی شد.
    پلمپین صنعت
    اصلِ تقدیرنامه‌ی پلمپین صنعت
  • خرسندیم که صمیمانه استفاده از خدمات شما را به سایرین توصیه نماییم.
    بهنام عبادیمدیر عامل، پاشا چرم
    اصلِ تقدیرنامه‌ی پاشا چرم، به امضای بهنام عبادی
  • Contributions that you have made to the cause of international peace and development.
    Toily KurbanovExecutive Coordinator, United Nations Volunteers
    The original letter from United Nations Volunteers, signed by Toily Kurbanov
  • آموزش‌هایی که منجر به افتخارآفرینی در المپیاد ملی مهارت شده است.
    اصغر طاهریمدیر موسس، مجتمع خواجه‌نصیر
    اصلِ تقدیرنامه‌ی مجتمع خواجه‌نصیر، به امضای اصغر طاهری
  • پس از پایان مدت رسمی قرارداد، همچنان پشتیبانی انجام شده است.
    آتی‌نت
    اصلِ تقدیرنامه‌ی آتی‌نت

گُردَرگ

گُرد — پهلوان، تهمتن، دلیر، رشید، قهرمان.

ارگ — دژ، صرح، قصر، قلعه، کاخ.

از سال ۱۳۹۵ فعالیت می‌کنیم. از آن زمان به بیش از پنجاه کارفرمای حقوقی و حقیقی خدمات پیمانی ارائه داده‌ایم و لبخند رضایت ایشان را به ارمغان آورده‌ایم.

مهم‌ترین سرمایه‌ی ما، ذهن‌های درخشانی هستند که با پشتکار و خردِ خود، گوی آبی زندگی‌بخش زمین و مادرمان ایران‌زمین را آبادتر می‌کنند.

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

درباره‌ی ما بیانیه‌ی ماموریت

ارگ بم
ارگ بم — عکس از آراد مجتهدی، ویکی‌پدیا

پشتوانه‌ی فنی

ابزاری که هر روز با آن کار می‌کنیم. تعصبی بر هیچ‌کدام نداریم — سکوی هر پروژه را پس از مصاحبه با کارفرما و بر اساس منابع موجود و طرح توسعه انتخاب می‌کنیم.

  • PHP
  • C#
  • WordPress
  • JavaScript
  • SQL Server
  • MySQL
  • SQLite
  • Nginx
  • Docker
  • Portainer
  • Ubuntu
  • Hangfire
  • Datadog
  • Git
  • Uptime Kuma

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

وبلاگ گردرگ

سوال‌های پرتکرار

آیا باید سورس کد برنامه تحویل مشتری شود؟

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

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

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

دلیل کند شدن سایت چیست؟ آیا امکان افزایش سرعت نرم‌افزارها وجود دارد؟

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

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

اگر توسعه‌ی نرم‌افزار شما توسط تیم ما انجام شده باشد در این زمینه، پشتیبانی دائمی و همیشگی ما را خواهید داشت.

طراحی سایت با وردپرس و سایر ابزارهای آماده کار درستی است؟

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

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

تاثیر رابط کاربری در جذب مشتری

رابط کاربری از دو جهت اهمیت دارد: اول تاثیرگذاری بر مخاطب شما و دوم موتورهای جستجو.

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

همچنین بسیاری از «قالب‌ها» هرچند که ظاهرا زیبا هستند اما برای موتورهای جستجو بهینه‌سازی نشده‌اند و در نتیجه بسیاری از تلاش‌هایی که در بازاریابی دیجیتالی انجام می‌شود را کم‌اثر می‌کنند.

توسعه‌ی نرم‌افزار با برنامه‌نویسی چه فرقی دارد؟

جواب کوتاه: هیچ فرقی ندارند.

جواب بلند: این دو کلمه برگردان واژه‌های انگلیسی develop و programming هستند. کاربرد کلمه‌ی اول بیشتر در رابطه با برنامه‌های کاربردی که روزانه از آن‌ها استفاده می‌کنیم است و کاربرد کلمه‌ی دوم بیشتر در برنامه‌نویسی روبات‌ها، بوردهای الکترونیکی و الگوریتم‌های محاسباتی است.