علی شکیبا

دفتر یادداشت دیجیتال برای هر چیز مفید!

یکی از امکانات جالبی که در Windows داشتم، این بود که با انتخاب چند فایل ویدیویی، جمع زمان آن فایل‌ها را نمایش می‌داد، اما در لینوکس این‌گونه نبود! به همین خاطر دست به کار شدم و یک اسکریپت به صورت زیر نوشتم

find . -iname "*.mp4" -exec mplayer -vo null -ao null -frames 0 -identify -msglevel all=0 {} \; | grep ^ID_LENGTH | python -c "import sys; print sum(float(l.split('=')[1])/60.0 for l in sys.stdin), ' minutes.'"

البته اگر پایتون نداشته باشیم، این دستورات bash مجموع زمان فیلم‌ها را به واحد ثانیه نشان می‌دهد

find . -iname "*.mp4" -exec mplayer -vo null -ao null -frames 0 -identify -msglevel all=0 {} \; | grep ^ID_LENGTH | tr -d "ID_LENGTH=" | paste -s -d+ | bc
۰ نظر موافقین ۰ مخالفین ۰ ۱۲ فروردين ۹۴ ، ۲۳:۵۵
علی شکیبا

برای گذراندن درس Text Retrieval and Search Engines و انجام تمرین‌های عملی آن نیاز به نصب Meta-toolkit است که یک کتابخانه ++C برای پیاده‌سازی سیستم‌های بازیابی متن است. برای نصب آن در Ubuntu 14.04 LTS x64 از روش زیر استفاده کردم. لازم به ذکر است که این بسته در ویندوز به صورت رسمی پشتیبانی نمی‌شود (لیستی از سکوهای مورد پشتیبانی و نحوه نصب).

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

git clone https://github.com/meta-toolkit/meta.git

برای کامپایل این بسته نیاز به cmake داریم. لازم است تا به apt-get مخزن مربوطه را معرفی کنیم

sudo add-apt-repository ppa:george-edison55/cmake-3.x

حال پیش‌نیازها را نصب می‌کنیم:

sudo apt-get update
sudo apt-get install software-properties-common cmake libicu-dev

سپس به محل دانلود بسته meta رفته و پیش‌نیازهای آن را دریافت می‌کنیم (این مرحله خیلی مهم است!)

git submodule update --init --recursive

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

mkdir build
cd build
cp ../config.toml .
cmake ../ -DCMAKE_BUILD_TYPE=Release
make

در صورتی که فرایند نصب موفق باشد، خروجی دستور ذیل

ctest --output-on-failure

باید به صورت زیر باشد

Test project /home/ali/Downloads/meta/build
Start 1: analyzers
1/14 Test #1: analyzers ........................ Passed 0.30 sec
Start 2: stemmers
2/14 Test #2: stemmers ......................... Passed 0.33 sec
Start 3: parallel
3/14 Test #3: parallel ......................... Passed 2.90 sec
Start 4: inverted-index
4/14 Test #4: inverted-index ................... Passed 3.04 sec
Start 5: forward-index
5/14 Test #5: forward-index .................... Passed 2.34 sec
Start 6: string-list
6/14 Test #6: string-list ...................... Passed 0.00 sec
Start 7: vocabulary-map
7/14 Test #7: vocabulary-map ................... Passed 0.00 sec
Start 8: libsvm-parser
8/14 Test #8: libsvm-parser .................... Passed 0.00 sec
Start 9: classifiers
9/14 Test #9: classifiers ...................... Passed 8.89 sec
Start 10: rankers
10/14 Test #10: rankers .......................... Passed 18.67 sec
Start 11: ir-eval
11/14 Test #11: ir-eval .......................... Passed 1.01 sec
Start 12: compression
12/14 Test #12: compression ...................... Passed 0.02 sec
Start 13: graph
13/14 Test #13: graph ............................ Passed 0.01 sec
Start 14: parser
14/14 Test #14: parser ........................... Passed 0.01 sec

100% tests passed, 0 tests failed out of 14
Total Test time (real) = 37.59 sec

پی‌نوشت: در هنگام نصب، من حواسم به اجرای دستور

git submodule update --init --recursive

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

۰ نظر موافقین ۰ مخالفین ۰ ۰۸ فروردين ۹۴ ، ۰۲:۱۵
علی شکیبا

از آنجا که دانشگاه یزد در ایران، آینه TeX است، به همین دلیل دریافت و نصب بسته های آن از داخل دانشگاه با سرعتی بسیار بیشتر از سرعت اینترنت، در حدود 11 MB/s، امکان پذیر است! اما مشکل اینجا است که بعد از اینکه TeXLive را با این روش نصب کردید، apt-get از آن بی خبر است و برای نصب الباقی بسته ها به مشکل بر می خورید! برای این که بتوانیم به apt-get بگوییم که یک بسته را به صورت دستی نصب کرده ایم، روش زیر را از اینجا پیدا کردم! مراحلی که برای من کار کردند، به شرح زیر است:

1- TeXLive را با استفاده از رویه معمول از ایزوی دانلود شده نصب کردم.

2- سپس مسیرهای نصب را به فایل .bashrc اضافه می‌کنم.

3- حالا نوبت به آن رسیده است تا تعدادی بسته تقلبی بسازیم!!! برای این منظور از ابزار equivs استفاده کردم

sudo apt-get install equivs --no-install-recommends
mkdir /tmp/tl-equivs && cd /tmp/tl-equivs
equivs-control texlive-local

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

Section: misc
Priority: optional
Standards-Version: 3.9.4
Package: texlive-local
Version: 2014-1
Maintainer: A. Shakiba <ali@shakiba.id.ir>
Provides: chktex, biblatex, biblatex-dw, cm-super, cm-super-minimal, context,
dvidvi, dvipng, feynmf, fragmaster, jadetex, lacheck, latex-beamer,
latex-cjk-all, latex-cjk-chinese, latex-cjk-chinese-arphic-bkai00mp,
latex-cjk-chinese-arphic-bsmi00lp, latex-cjk-chinese-arphic-gbsn00lp,
latex-cjk-chinese-arphic-gkai00mp, latex-cjk-common, latex-cjk-japanese,
latex-cjk-japanese-wadalab, latex-cjk-korean, latex-cjk-thai, latexdiff,
latexmk, latex-sanskrit, latex-xcolor, lcdf-typetools, lmodern, luatex,
musixtex, passivetex, pgf, preview-latex-style, prosper, ps2eps, psutils,
purifyeps, t1utils, tex4ht, tex4ht-common, tex-gyre, texlive, texlive-base,
texlive-bibtex-extra, texlive-binaries, texlive-common, texlive-extra-utils,
texlive-fonts-extra, texlive-fonts-extra-doc, texlive-fonts-recommended,
texlive-fonts-recommended-doc, texlive-font-utils, texlive-formats-extra,
texlive-games, texlive-generic-extra, texlive-generic-recommended,
texlive-humanities, texlive-humanities-doc, texlive-lang-african,
texlive-lang-all, texlive-lang-arabic, texlive-lang-cjk, texlive-lang-cyrillic,
texlive-lang-czechslovak, texlive-lang-english, texlive-lang-european,
texlive-lang-japanese, texlive-lang-chinese, texlive-lang-korean,
texlive-lang-french, texlive-lang-german, texlive-lang-greek,
texlive-lang-indic, texlive-lang-italian, texlive-lang-other,
texlive-lang-polish, texlive-lang-portuguese, texlive-lang-spanish,
texlive-latex-base, texlive-latex-base-doc, texlive-latex-extra,
texlive-latex-extra-doc, texlive-latex-recommended,
texlive-latex-recommended-doc, texlive-luatex, texlive-math-extra,
texlive-metapost, texlive-metapost-doc, texlive-music,
texlive-omega, texlive-pictures, texlive-pictures-doc, texlive-plain-extra,
texlive-pstricks, texlive-pstricks-doc, texlive-publishers,
texlive-publishers-doc, texlive-science, texlive-science-doc, texlive-xetex,
thailatex, tipa, tipa-doc, xindy, xindy-rules, xmltex
Architecture: all
Description: My local installation of TeX Live 2014.
A full "vanilla" TeX Live 2014
http://tug.org/texlive/debian#vanilla

حال وقت آن است تا فایل .deb را بسازیم که با دستور زیر انجام می‌شود

equivs-build texlive-local

و بعد آن را مثل آب خوردن نصب کنیم.

sudo dpkg -i texlive-local_2014-1_all.deb

تمام است. 

پی‌نوشت: نوشته شده مبتنی بر این آدرس

۰ نظر موافقین ۰ مخالفین ۰ ۱۷ اسفند ۹۳ ، ۱۵:۴۹
علی شکیبا

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

$ sudo nano /etc/modprobe.d/psmouse.conf

و این خط را به آن اضافه کنید

options psmouse proto=imps
۰ نظر موافقین ۰ مخالفین ۰ ۱۷ اسفند ۹۳ ، ۱۵:۲۹
علی شکیبا

شب گذشته بر اثر اشتباه، حافظه فلش خودم رو به سیستم کناری (سیستم دوستم که از نظر تعداد و تنوع ویروس‌ها در جهان باید تک باشد!) زدم! از آنجا که از لینوکس استفاده می‌کنم خیلی مشکل خاصی نیست! با یک نگاه به محتویات فلش متوجه ویروس عزیز New Folder شدم که در تمام دایرکتوری ها و زیر دایرکتوری ها خودش رو تکثیر کرده با نام های مختلف! بنابراین یکی از اون فایل ها را به شاخه اصلی فلش منتقل کردم و بعد هم برای موارد مشابه، فایل را به main.txt تغییر نام دادم. حالا وقت اون رسیده تا حساب این ویروس رو برسیم!

#!/bin/bash
counter=0
find . -type f -iname "*.exe" -print0 | while IFS= read -r -d $'\0' i; do
if [ $(md5sum "$i" | cut -f 1 -d ' ') == $(md5sum "./main.txt" | cut -f 1 -d ' ') ]
then
rm "$i"
counter=$((counter+1))
echo "$counter\t"
fi
done

البته فراموش نکنید فایل های autorun.ini رو هم پاک کنید!

۰ نظر موافقین ۱ مخالفین ۰ ۰۸ دی ۹۳ ، ۰۹:۰۱
علی شکیبا

برای نصب خیلی ساده می توانید از دستورات استاندارد Python برای نصب استفاده کنید! اما اگر ابزاری مانند apt-get در دبیان می خواهید، conda در خدمت شما است. البته برای نصب برخی از بسته ها مجبور(!) می شوید از pip یا easy_install استفاده کنید، اما هر چه باشد، نصب از روی کد منبع کابوس است و کابوس! علی الخصوص هنگامی که سرتان هم درد می کند! بگذریم ...

برای نصب کتابخانه textblob برای anaconda، می توانید از یکی از دو راه زیر استفاده کنید. اولی برای افرادی است که از MacOS استفاده می کنند (ما که کاری به MacOS نداریم!) و دومی برای بنده و امثال بنده است که عمده وقتشان را با ترمینال لینوکس پر می کنند و شاید هم ویندوز (رو سیاهم خجالتی )!

خوب، اول اولی را می گویم که ساده است!

$ conda config --add channels https://conda.binstar.org/sloria
$ conda install textblob
$ python -m textblob.download_corpora

حال نوبت به دومی می رسد که بازهم ساده است! فقط یک نکته! اگر مثل بنده از چندین توزیع مختلف پایتون مثل anaconda و python.org یا نسخه های مختلف استفاده می کنید، لازم است تا به جای استفاده از دستور pip، مسیر کامل توزیع مورد نظر را بدهید و یا با استفاده از دستور update-alternatives توزیع مورد نظر را در اولویت قرار دهید (بیان بهتر است ویرایشگر متن خود را به auto-completion مجهز کند!). بقیه ساده است:

$ pip install -U textblob
$ python -m textblob.download_corpora

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

$ python -m textblob.download_corpora lite

تمام است! از پایتون خود لذت ببرید!

۰ نظر موافقین ۰ مخالفین ۰ ۲۱ آذر ۹۳ ، ۰۰:۲۹
علی شکیبا

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

Theorems \ref{thm.begin} to \ref{thm.last} and Lemma \ref{lem.some}

اما این دفعه یه مقدار فرصت برای جستجوی بیشتر داشتم! باید راه ساده‌تری وجود داشته باشد و وجود داشت! بسته cleveref این کار رو به سادگی بیشتر انجام می‌دهد. فقط به جای دستور \ref از \cref باید استفاده کرد.

\cref{thm.begin,thm.last,lem.some}

نکته قابل ذکر اینکه این بسته به صورت خودکار نوع محیط رو هم تشخیص می‌دهد، یعنی برای قضیه، عبارت Theorem و برای لم عبارت Lemma رو به کار می‌برد. همچنین به زیبایی، در صورت امکان برچسب‌های پشت سر هم رو ادغام می‌کند، یعنی به جای Theorems 1,2,3,5 خروجی به صورت Theorems 1 to 3 and 5 خواهد بود! البته مراقب باشید بین برچسب‌ها و کاما، فاصله قرار ندهید و الا خطا خواهید گرفت! مستندات این بسته از اینجا قابل مشاهده است. البته معارفه بنده با این بسته در اینجا صورت گرفت!

۰ نظر موافقین ۰ مخالفین ۰ ۲۹ آبان ۹۳ ، ۰۹:۰۸
علی شکیبا

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

  1. همه اثبات‌ها، اعم از ساده یا دشوار یا آن‌هایی که لازم است پس از چاپ در متن اصلی ذکر شوند را به پیوست منتقل می‌کنم.
  2. این نکته که همه اثبات ها در پیوست آمده اند را هم در Cover Letter و هم در قسمت Introduction مقاله به صراحت ذکر می‌کنم!

تا قبل از این، این کار را کاملا به صورت زجرآوری به شیوه‌ای دستی انجام می دادم! اما امشب یک راهکار خوب در اینجا پیدا کردم که برای ارجاع‌های بعدی خودم، آن را در اینجا عینا ذکر می‌کنم. کافی  است قطعه کد لاتک زیر در ابتدای فایل پس از \usepackage ها بیاید.

\usepackage{etex,etoolbox}
\makeatletter
\providecommand{\@fourthoffour}[4]{#4}
\def\fixstatement#1{%
    \AtEndEnvironment{#1}{%
        \xdef\pat@label{\expandafter\expandafter\expandafter
            \@fourthoffour\csname#1\endcsname\space\@currentlabel}}}
\globtoksblk\prooftoks{1000}
\newcounter{proofcount}
\long\def\proofatend#1\endproofatend{%
    \edef\next{\noexpand\begin{proof}[Proof of \pat@label]}%
        \toks\numexpr\prooftoks+\value{proofcount}\relax=\expandafter{\next#1\end{proof}}
    \stepcounter{proofcount}}
\def\printproofs{%
    \count@=\z@
    \loop
    \the\toks\numexpr\prooftoks+\count@\relax
    \ifnum\count@<\value{proofcount}%
    \advance\count@\@ne
    \repeat}
\makeatother

همچنین پس از تعریف محیط‌های مورد نظر، لازم است تا بگوییم که برای چه محیط‌هایی می‌خواهیم چنین فرایندی رخ دهد!

\fixstatement{theorem}
\fixstatement{lemma}
\fixstatement{proposition}
\fixstatement{conjecture}
\fixstatement{corollary}

حال، به جای

\begin{proof}
 Now, I am going to show some world shaking result! P = NP! ;) (This is a joke!)
\end{proof}

به این صورت اثبات ها را می‌نویسیم

\proofatend
 Now, I am going to show some world shaking result! P = NP! ;) (This is a joke!)
\endproofatend

پس از آن قسمت پیوست به صورت زیر خواهد بود (به طور معمول، پیوست را بعد از مراجع قرار می‌دهم)

\appendix
  \section{Proofs}
  \printproofs

کار تمام است!

۰ نظر موافقین ۰ مخالفین ۰ ۲۵ آبان ۹۳ ، ۲۳:۵۳
علی شکیبا

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

\usepackage{showlabels}
۱ نظر موافقین ۰ مخالفین ۰ ۱۵ مهر ۹۳ ، ۱۱:۲۰
علی شکیبا

به طور معمول، وقتی که گزارش یا مقاله‌ای را برای استاد راهنما ارسال می‌کنم، حداقل چندبار بخش‌هایی از آن مورد حذف یا بازنویسی قرار می‌گیرد. یکی از ساده‌ترین راه‌ها برای مشخص نمودن اینگونه موارد، که تا به حال از آن استفاده می‌کردم و هنوز هم برای نسخه‌هایی که نیاز به تهیه نسخه چاپی نداشته باشند نیز استفاده خواهم کرد، استفاده از رنگ‌ها یا یادداشت‌های PDF البته در LaTeX است. اما امروز دیدم که یکی از دوستان که از Microsoft Word برای تهیه متون خود استفاده می‌کند، روی متن‌های حذف شده، خط می‌کشد (Strike through). با دیدن این موضوع، من هم علاقه‌مند شدم که از این روش استفاده کنم. به همین دلیل دست به دامن گوگل شدم. راهکار بسیار ساده است. کافی است تا از بسته

\usepackage{ulem}

استفاده کنیم و بعد متن مورد نظر را به صورت زیر مشخص کنیم

\sout{The text to strike through.}

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

\normalem

نتیجه رضایت بخش است.

۰ نظر موافقین ۰ مخالفین ۰ ۱۹ شهریور ۹۳ ، ۲۳:۱۰
علی شکیبا