From 4c9ff17bf0aaffb48077a80f4af0775b2035a98e Mon Sep 17 00:00:00 2001 From: arcan1s Date: Sun, 24 Jan 2016 15:41:28 +0300 Subject: [PATCH] move html papers to md --- _config.yml | 2 +- _layouts/paper.html | 2 - ...t-zshrc.html => 2014-01-14-about-zshrc.md} | 247 ++++++------- ...=> 2014-01-21-building-qutim-using-qt5.md} | 91 ++--- _posts/2014-03-06-site-changes.html | 74 ---- _posts/2014-03-06-site-changes.md | 76 ++++ ...tml => 2014-03-23-creating-custom-repo.md} | 141 ++++---- _posts/2014-05-07-my-desktop.html | 85 ----- _posts/2014-05-07-my-desktop.md | 75 ++++ _posts/2014-05-18-disabling-baloo.html | 41 --- _posts/2014-05-18-disabling-baloo.md | 49 +++ ...014-07-17-writting-own-completions-p1.html | 143 -------- .../2014-07-17-writting-own-completions-p1.md | 151 ++++++++ ...014-07-17-writting-own-completions-p2.html | 136 -------- .../2014-07-17-writting-own-completions-p2.md | 143 ++++++++ _posts/2014-09-04-migration-to-v2.html | 38 -- _posts/2014-09-04-migration-to-v2.md | 36 ++ .../2014-12-12-encryption-home-directory.html | 173 --------- .../2014-12-12-encryption-home-directory.md | 175 ++++++++++ .../2014-12-19-aw-v21-bells-and-whistles.html | 327 ------------------ .../2014-12-19-aw-v21-bells-and-whistles.md | 97 ++++++ .../2015-10-17-cppcheck-and-clang-format.html | 161 --------- .../2015-10-17-cppcheck-and-clang-format.md | 165 +++++++++ _posts/2016-01-09-url-changes.html | 10 - _posts/2016-01-09-url-changes.md | 11 + blog/index.html | 2 +- feed-short.xml | 2 +- feed.xml | 1 - ...t-zshrc.html => 2014-01-14-about-zshrc.md} | 247 ++++++------- .../2014-01-21-building-qutim-using-qt5.html | 203 ----------- .../2014-01-21-building-qutim-using-qt5.md | 210 +++++++++++ ru/_posts/2014-03-06-site-changes.html | 76 ---- ru/_posts/2014-03-06-site-changes.md | 77 +++++ ...tml => 2014-03-23-creating-custom-repo.md} | 143 ++++---- ru/_posts/2014-05-07-my-desktop.html | 86 ----- ru/_posts/2014-05-07-my-desktop.md | 76 ++++ ru/_posts/2014-05-18-disabling-baloo.html | 39 --- ru/_posts/2014-05-18-disabling-baloo.md | 48 +++ ru/_posts/2014-06-23-about-aur.html | 186 ---------- ru/_posts/2014-06-23-about-aur.md | 185 ++++++++++ ...014-07-17-writting-own-completions-p1.html | 143 -------- .../2014-07-17-writting-own-completions-p1.md | 152 ++++++++ ...014-07-17-writting-own-completions-p2.html | 135 -------- .../2014-07-17-writting-own-completions-p2.md | 144 ++++++++ ru/_posts/2014-09-04-migration-to-v2.html | 38 -- ru/_posts/2014-09-04-migration-to-v2.md | 36 ++ .../2014-12-12-encryption-home-directory.html | 172 --------- .../2014-12-12-encryption-home-directory.md | 174 ++++++++++ .../2014-12-19-aw-v21-bells-and-whistles.html | 327 ------------------ .../2014-12-19-aw-v21-bells-and-whistles.md | 97 ++++++ .../2015-10-17-cppcheck-and-clang-format.html | 161 --------- .../2015-10-17-cppcheck-and-clang-format.md | 165 +++++++++ ru/_posts/2016-01-09-url-changes.html | 10 - ru/_posts/2016-01-09-url-changes.md | 10 + ru/blog/index.html | 2 +- ru/feed-short.xml | 2 +- ru/feed.xml | 1 - 57 files changed, 2815 insertions(+), 3184 deletions(-) rename _posts/{2014-01-14-about-zshrc.html => 2014-01-14-about-zshrc.md} (64%) rename _posts/{2014-01-21-building-qutim-using-qt5.html => 2014-01-21-building-qutim-using-qt5.md} (54%) delete mode 100644 _posts/2014-03-06-site-changes.html create mode 100644 _posts/2014-03-06-site-changes.md rename _posts/{2014-03-23-creating-custom-repo.html => 2014-03-23-creating-custom-repo.md} (59%) delete mode 100644 _posts/2014-05-07-my-desktop.html create mode 100644 _posts/2014-05-07-my-desktop.md delete mode 100644 _posts/2014-05-18-disabling-baloo.html create mode 100644 _posts/2014-05-18-disabling-baloo.md delete mode 100644 _posts/2014-07-17-writting-own-completions-p1.html create mode 100644 _posts/2014-07-17-writting-own-completions-p1.md delete mode 100644 _posts/2014-07-17-writting-own-completions-p2.html create mode 100644 _posts/2014-07-17-writting-own-completions-p2.md delete mode 100644 _posts/2014-09-04-migration-to-v2.html create mode 100644 _posts/2014-09-04-migration-to-v2.md delete mode 100644 _posts/2014-12-12-encryption-home-directory.html create mode 100644 _posts/2014-12-12-encryption-home-directory.md delete mode 100644 _posts/2014-12-19-aw-v21-bells-and-whistles.html create mode 100644 _posts/2014-12-19-aw-v21-bells-and-whistles.md delete mode 100644 _posts/2015-10-17-cppcheck-and-clang-format.html create mode 100644 _posts/2015-10-17-cppcheck-and-clang-format.md delete mode 100644 _posts/2016-01-09-url-changes.html create mode 100644 _posts/2016-01-09-url-changes.md rename ru/_posts/{2014-01-14-about-zshrc.html => 2014-01-14-about-zshrc.md} (60%) delete mode 100644 ru/_posts/2014-01-21-building-qutim-using-qt5.html create mode 100644 ru/_posts/2014-01-21-building-qutim-using-qt5.md delete mode 100644 ru/_posts/2014-03-06-site-changes.html create mode 100644 ru/_posts/2014-03-06-site-changes.md rename ru/_posts/{2014-03-23-creating-custom-repo.html => 2014-03-23-creating-custom-repo.md} (53%) delete mode 100644 ru/_posts/2014-05-07-my-desktop.html create mode 100644 ru/_posts/2014-05-07-my-desktop.md delete mode 100644 ru/_posts/2014-05-18-disabling-baloo.html create mode 100644 ru/_posts/2014-05-18-disabling-baloo.md delete mode 100644 ru/_posts/2014-06-23-about-aur.html create mode 100644 ru/_posts/2014-06-23-about-aur.md delete mode 100644 ru/_posts/2014-07-17-writting-own-completions-p1.html create mode 100644 ru/_posts/2014-07-17-writting-own-completions-p1.md delete mode 100644 ru/_posts/2014-07-17-writting-own-completions-p2.html create mode 100644 ru/_posts/2014-07-17-writting-own-completions-p2.md delete mode 100644 ru/_posts/2014-09-04-migration-to-v2.html create mode 100644 ru/_posts/2014-09-04-migration-to-v2.md delete mode 100644 ru/_posts/2014-12-12-encryption-home-directory.html create mode 100644 ru/_posts/2014-12-12-encryption-home-directory.md delete mode 100644 ru/_posts/2014-12-19-aw-v21-bells-and-whistles.html create mode 100644 ru/_posts/2014-12-19-aw-v21-bells-and-whistles.md delete mode 100644 ru/_posts/2015-10-17-cppcheck-and-clang-format.html create mode 100644 ru/_posts/2015-10-17-cppcheck-and-clang-format.md delete mode 100644 ru/_posts/2016-01-09-url-changes.html create mode 100644 ru/_posts/2016-01-09-url-changes.md diff --git a/_config.yml b/_config.yml index c5eebae..5f0db5e 100644 --- a/_config.yml +++ b/_config.yml @@ -21,7 +21,7 @@ markdown: redcarpet markdown_ext: markdown,mkd,mkdn,md textile_ext: textile -excerpt_separator: "\n\n" +excerpt_separator: "" safe: false host: 0.0.0.0 diff --git a/_layouts/paper.html b/_layouts/paper.html index 6d8816b..e33794a 100644 --- a/_layouts/paper.html +++ b/_layouts/paper.html @@ -49,7 +49,5 @@ layout: default

{{ page.title }}

-

{{ page.description }}

-
{{ content }} diff --git a/_posts/2014-01-14-about-zshrc.html b/_posts/2014-01-14-about-zshrc.md similarity index 64% rename from _posts/2014-01-14-about-zshrc.html rename to _posts/2014-01-14-about-zshrc.md index a0f1ae7..e357736 100644 --- a/_posts/2014-01-14-about-zshrc.html +++ b/_posts/2014-01-14-about-zshrc.md @@ -6,32 +6,37 @@ hastr: true tags: zshrc, configuration, linux title: About zshrc short: about-zshrc -description: It is first paper in my blog (I think I need something here for tests =)). There are many similar articles, and I'll not be an exception. I just want to show my .zshrc and explain what it does and why it is needed. Also any comments or additions are welcome. It is a translated paper from Russian (original). --- -

Prepare

-

First install recommended minima:

+It is first paper in my blog (I think I need something here for tests =)). There are many similar articles, and I'll not be an exception. I just want to show my `.zshrc` and explain what it does and why it is needed. Also any comments or additions are welcome. It is a translated paper from Russian ([original](//archlinux.org.ru/forum/topic/12752/ "Forum thread")). -{% highlight bash %} + + +## Prepare + +First install recommended minima: + +```bash pacman -Sy pkgfile zsh zsh-completions zsh-syntax-highlighting -{% endhighlight %} +``` -

pkgfile is a very useful utility. Also this command will install shell, additional completion and syntax highlighting.

+[pkgfile](//www.archlinux.org/packages/pkgfile/ "Archlinux package") is a very useful utility. Also this command will install shell, additional completion and syntax highlighting. -

Shell configuration

-

All options are avaible here.

+## Shell configuration -

Set history file and number of commands in cache of the current session and in the history file:

+All options are avaible [here](//zsh.sourceforge.net/Doc/Release/Options.html "zsh documentation"). -{% highlight bash %} +Set history file and number of commands in cache of the current session and in the history file: + +```bash # history HISTFILE=~/.zsh_history HISTSIZE=500000 SAVEHIST=500000 -{% endhighlight %} +``` -

I can not remember all Ctrl+ combinations so I bind keys to its default usages:

+I can not remember all `Ctrl+` combinations so I bind keys to its default usages: -{% highlight bash %} +```bash # bindkeys bindkey '^[[A' up-line-or-search # up arrow for back-history-search bindkey '^[[B' down-line-or-search # down arrow for fwd-history-search @@ -41,106 +46,106 @@ bindkey '\e[3~' delete-char # del bindkey '\e[4~' end-of-line # end bindkey '\e[5~' up-line-or-history # page-up bindkey '\e[6~' down-line-or-history # page-down -{% endhighlight %} +``` -

But in this case Up/Down arrows are used to navigate through the history based on already entered part of a command. And PgUp/PgDown will ignore already entered part of a command.

+But in this case `Up`/`Down` arrows are used to navigate through the history based on **already entered part** of a command. And `PgUp`/`PgDown` **will ignore** already entered part of a command. -

Command autocomplete:

+Command autocomplete: -{% highlight bash %} +```bash # autocomplete autoload -U compinit compinit zstyle ':completion:*' insert-tab false zstyle ':completion:*' max-errors 2 -{% endhighlight %} +``` -

Full command autocomplete will be enabled. insert-tab false will enable autocomplete for non-entered commands. max-errors sets maximum number of errors that could be corrected.

+Full command autocomplete will be enabled. `insert-tab false` will enable autocomplete for **non-entered** commands. `max-errors` sets maximum number of errors that could be corrected. -

Prompt:

+Prompt: -{% highlight bash %} +```bash # promptinit autoload -U promptinit promptinit -{% endhighlight %} +``` -

Enable colors:

+Enable colors: -{% highlight bash %} +```bash # colors autoload -U colors colors -{% endhighlight %} +``` -

Here are some other options.

-

Change directory without cd:

+Here are some other options. +Change directory without `cd`: -{% highlight bash %} +```bash # autocd setopt autocd -{% endhighlight %} +``` -

Correcting of typos (and question template):

+Correcting of typos (and question template): -{% highlight bash %} +```bash # correct setopt CORRECT_ALL SPROMPT="Correct '%R' to '%r' ? ([Y]es/[N]o/[E]dit/[A]bort) " -{% endhighlight %} +``` -

Disable f#$%ing beep:

+Disable f#$%ing beep: -{% highlight bash %} +```bash # disable beeps unsetopt beep -{% endhighlight %} +``` -

Enable calculator:

+Enable calculator: -{% highlight bash %} +```bash # calc autoload zcalc -{% endhighlight %} +``` -

Append history (do not recreate the history file):

+Append history (**do not recreate** the history file): -{% highlight bash %} +```bash # append history setopt APPEND_HISTORY -{% endhighlight %} +``` -

Do not save dups to history file:

+Do not save dups to history file: -{% highlight bash %} +```bash # ignore spaces in history setopt HIST_IGNORE_ALL_DUPS -{% endhighlight %} +``` -

...and additional spaces:

+...and additional spaces: -{% highlight bash %} +```bash # ignore dups in history setopt HIST_IGNORE_SPACE -{% endhighlight %} +``` -

...and blank lines too:

+...and blank lines too: -{% highlight bash %} +```bash # reduce blanks in history setopt HIST_REDUCE_BLANKS -{% endhighlight %} +``` -

Enable pkgfile:

+Enable `pkgfile`: -{% highlight bash %} +```bash # pkgfile source /usr/share/doc/pkgfile/command-not-found.zsh -{% endhighlight %} +``` -

Syntax highlighting

+## Syntax highlighting -{% highlight bash %} +```bash # highlighting source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh ZSH_HIGHLIGHT_HIGHLIGHTERS=(main brackets pattern) @@ -185,14 +190,15 @@ ZSH_HIGHLIGHT_STYLES[double-quoted-argument]='fg=yellow' #ZSH_HIGHLIGHT_PATTERNS+=('rm -rf *' 'fg=white,bold,bg=red') # root example #ZSH_HIGHLIGHT_STYLES[root]='bg=red' -{% endhighlight %} +``` -

In first line highlighting is turned on. Next main, brackets and pattern highlighting are turned on. Patterns are set below (rm -rf * in the example). Also root and cursor highlighting may be turned on. Colors syntax is understandable, fg is font color, bg is background color.

+In first line highlighting is turned on. Next main, brackets and pattern highlighting are turned on. Patterns are set below (`rm -rf *` in the example). Also `root` and `cursor` highlighting may be turned on. Colors syntax is understandable, `fg` is font color, `bg` is background color. -

$PROMPT and $RPROMPT

-

The general idea is the use single .zshrc for root and normal user:

+## $PROMPT and $RPROMPT -{% highlight bash %} +The general idea is the use single `.zshrc` for root and normal user: + +```bash # PROMPT && RPROMPT if [[ $EUID == 0 ]]; then # [root@host dir]# @@ -211,11 +217,11 @@ else %{$fg_bold[yellow]%}%1/%{$reset_color%}\ %{$fg_bold[white]%}]$ %{$reset_color%}" fi -{% endhighlight %} +``` -

fg is font color, bg is background color. _bold and _no_bold regulate the tint. Commands should be in %{ ... %} so they do not appear. Avaible colors are:

+`fg` is font color, `bg` is background color. `_bold` and `_no_bold` regulate the tint. Commands should be in `%{ ... %}` so they do not appear. Avaible colors are: -{% highlight bash %} +```bash black red green @@ -224,11 +230,11 @@ blue magenta cyan white -{% endhighlight %} +``` -

Avaible variables are:

+Avaible variables are: -{% highlight bash %} +```bash %n - the username %m - the computer's hostname (truncated to the first period) %M - the computer's hostname @@ -241,11 +247,11 @@ white %d - the current working directory %~ - the same as %d but if in $HOME, this will be replaced by ~ %1/ - the same as %d but only last directory -{% endhighlight %} +``` -

RPROMPT (acpi package is necessary):

+RPROMPT (`acpi` package is necessary): -{% highlight bash %} +```bash precmd () { # battery charge function batcharge { @@ -268,25 +274,26 @@ $(batcharge)\ "%{$fg_bold[white]%}[%{$reset_color%}"\ $returncode\ "%{$fg_bold[white]%}]%{$reset_color%}" -{% endhighlight %} +``` -

My RPROMPT shows current time, battery change and last returned code. precmd() is necessary for automatic updating. The construct $(if.true.false) is conditional statement in zsh.

+My RPROMPT shows current time, battery change and last returned code. `precmd()` is necessary for automatic updating. The construct `$(if.true.false)` is conditional statement in `zsh`. -

Aliases

-

Copy only those aliases that you need. If any alias uses application that is not installed it will leads to fail of loading of configuration file.

+## Aliases -

Small useful (or maybe not) function:

+**Copy only those aliases that you need.** If any alias uses application that is not installed it will leads to fail of loading of configuration file. -{% highlight bash %} +Small useful (or maybe not) function: + +```bash show_which() { OUTPUT=$(which $1 | cut -d " " -f7-) echo "Running '$OUTPUT'" 1>&2 } -{% endhighlight %} +``` -

Here is the first group of aliases:

+Here is the first group of aliases: -{% highlight bash %} +```bash ## alias # colored grep alias grep='grep --colour=auto' @@ -302,11 +309,11 @@ alias du='show_which du && du -k --total --human-readable' # change less and zless to vimpager alias less='vimpager' alias zless='vimpager' -{% endhighlight %} +``` -

Here are ls aliases (see man ls):

+Here are ls aliases (see [man ls](//unixhelp.ed.ac.uk/CGI/man-cgi?ls "Man page")): -{% highlight bash %} +```bash alias ls='show_which ls && ls --color=auto --group-directories-first' alias ll='show_which ll && ls -l --human-readable' alias lr='show_which lr && ls --recursive' @@ -315,11 +322,11 @@ alias lx='show_which lx && ll -X --ignore-backups' alias lz='show_which lz && ll -S --reverse' alias lt='show_which lt && ll -t --reverse' alias lm='show_which lm && la | more' -{% endhighlight %} +``` -

Here are aliases to quick file view from console (just type a file name!):

+Here are aliases to quick file view from console (just type a file name!): -{% highlight bash %} +```bash # alias -s alias -s {avi,mpeg,mpg,mov,m2v,mkv}=mpv alias -s {mp3,flac}=qmmp @@ -327,11 +334,11 @@ alias -s {odt,doc,xls,ppt,docx,xlsx,pptx,csv}=libreoffice alias -s {pdf}=okular autoload -U pick-web-browser alias -s {html,htm}=opera -{% endhighlight %} +``` -

Here are "sudo" aliases:

+Here are "sudo" aliases: -{% highlight bash %} +```bash # sudo alias if [[ $EUID == 0 ]]; then alias fat32mnt='show_which fat32mnt && mount -t vfat -o codepage=866,iocharset=utf8,umask=000' @@ -351,23 +358,24 @@ else alias staging-i686-build='show_which staging-i686-build && sudo staging-i686-build' alias staging-x86_64-build='show_which staging-x86_64-build && sudo staging-x86_64-build' fi -{% endhighlight %} +``` -

Here are global aliases. If they are enable the command cat foo g bar will be equivalent the command cat foo | grep bar:

+Here are global aliases. If they are enable the command `cat foo g bar` will be equivalent the command `cat foo | grep bar`: -{% highlight bash %} +```bash # global alias alias -g g="| grep" alias -g l="| less" alias -g t="| tail" alias -g h="| head" alias -g dn="&> /dev/null &" -{% endhighlight %} +``` -

Functions

-

Here is a special function for xrandr:

+## Functions -{% highlight bash %} +Here is a special function for `xrandr`: + +```bash # function to contorl xrandr # EXAMPLE: projctl 1024x768 projctl () { @@ -388,11 +396,11 @@ projctl () { xrandr --output VGA1 --mode 1366x768 --output LVDS1 --mode 1366x768 fi } -{% endhighlight %} +``` -

Unfortunately I can not remember tar flags thus I use special functions:

+Unfortunately I can not remember `tar` flags thus I use special functions: -{% highlight bash %} +```bash # function to extract archives # EXAMPLE: unpack file unpack () { @@ -442,11 +450,11 @@ pack () { echo "'$1' is not a valid file" fi } -{% endhighlight %} +``` -

Here is a special function for su:

+Here is a special function for `su`: -{% highlight bash %} +```bash su () { CHECKSU=0 for FLAG in $*; do @@ -461,11 +469,11 @@ su () { /usr/bin/su $* fi } -{% endhighlight %} +``` -

Function that replaces original rm command. If you type rm it will be equivalent moving to trash an you can easily restore a file:

+Function that replaces original `rm` command. If you type `rm` it will be equivalent moving to trash an you can easily restore a file: -{% highlight bash %} +```bash rm () { # error check [ $# -eq 0 ] && { echo "Files are not set!"; return 1 } @@ -505,11 +513,11 @@ rm () { fi done } -{% endhighlight %} +``` -

Functions with automatic rehash after installing/removing packages are:

+Functions with automatic rehash after installing/removing packages are: -{% highlight bash %} +```bash pacman () { /usr/bin/sudo /usr/bin/pacman $* && echo "$*" | grep -q "S\|R\|U" && rehash } @@ -520,14 +528,15 @@ yaourt () { yatest () { /usr/bin/yaourt --config /etc/pactest.conf $* && echo "$*" | grep -q "S\|R\|U" && rehash } -{% endhighlight %} +``` -

Variables

-

It is recommended to set own variables in ~/.zshenv. But I have everything stored in the single file.

+## Variables -

Here are path, mask of new files, editor and pager:

+It is recommended to set own variables in `~/.zshenv`. But I have everything stored in the single file. -{% highlight bash %} +Here are path, mask of new files, editor and pager: + +```bash # path export PATH="$PATH:$HOME/.local/bin" # umask @@ -535,25 +544,27 @@ umask 022 # editor export EDITOR="vim" export PAGER="vimpager" -{% endhighlight %} +``` -

Here is hashes. If they are enable the command ~global will be equivalent the command /mnt/global:

+Here is hashes. If they are enable the command `~global` will be equivalent the command `/mnt/global`: -{% highlight bash %} +```bash # hash hash -d global=/mnt/global hash -d windows=/mnt/windows hash -d iso=/mnt/iso hash -d u1=/mnt/usbdev1 hash -d u2=/mnt/usbdev -{% endhighlight %} +``` + +## Screenshot -

Screenshot

{% assign scrdesc = "Zsh demonstation" %} {% assign scrname = "zshrc_demo" %} {% include prj_scr.html %}
-

File

-

Here is my .zshrc.

+## File + +[Here is](//raw.github.com/arcan1s/dotfiles/master/zshrc "GitHub") my `.zshrc`. diff --git a/_posts/2014-01-21-building-qutim-using-qt5.html b/_posts/2014-01-21-building-qutim-using-qt5.md similarity index 54% rename from _posts/2014-01-21-building-qutim-using-qt5.html rename to _posts/2014-01-21-building-qutim-using-qt5.md index e168d5f..fe2c571 100644 --- a/_posts/2014-01-21-building-qutim-using-qt5.html +++ b/_posts/2014-01-21-building-qutim-using-qt5.md @@ -6,37 +6,43 @@ hastr: true tags: archlinux, linux, building, qutim title: Building Qutim using Qt5 short: building-qutim-using-qt5 -description: Qutim is a multiprotocol and cross platform messenger. It is written on CPP using Qt library. The project is actively developed. In this paper I will say about building this package in Archlinux using Qt5 library (instead of Qt4 which is used in current AUR packages). --- -

What's wrong?

-

This package uses qbs for building, which is a bit strange IMHO. A package, which is necessary for building, is in AUR . I recommend to use git version of the package. When I asked Andrea Scarpino (who maintains KDE and Qt packages into the official repos) about qbs, he told me "we will support it in time". And I agree with him, the project seems to be a little unstable.

+[Qutim](//qutim.org) is a multiprotocol and cross platform messenger. It is written on `CPP` using Qt library. The project is actively developed. In this paper I will say about building this package in Archlinux using Qt5 library (instead of Qt4 which is used in current AUR packages). -

Prepare

-

Install dependences. I had used namcap, so maybe I missed something:

+ -{% highlight bash %} +# What's wrong? + +This package uses [qbs](//qt-project.org/wiki/qbs "Wiki") for building, which is a bit strange IMHO. A package, which is necessary for building, is [in AUR](//aur.archlinux.org/packages/qbs-git/ "AUR") . I recommend to use git version of the package. When I asked Andrea Scarpino (who maintains KDE and Qt packages into the official repos) about qbs, he told me "we will support it in time". And I agree with him, the project seems to be a little unstable. + +# Prepare + +Install dependences. I had used `namcap`, so maybe I missed something: + +```bash pacman -Sy --asdeps clang git libc++abi qt5-quick1 qt5-x11extras yaourt -S --asdeps jreen-git qbs-git -{% endhighlight %} +``` -

qbs settings

-

You may read about qbs on the link or see examples which are provides by the package. qbs uses configuration file that firstly you must create and secondly it is stored in your home directory. In theory a configuration file creating ((~/.config/QtProject/qbs.conf)) looks like this:

+### qbs settings -{% highlight bash %} +You may read about qbs [on the link](//qt-project.org/wiki/qbs "Wiki") or see examples which are provides by the package. qbs uses configuration file that firstly you must create and secondly it is stored in your home directory. In theory a configuration file creating (`~/.config/QtProject/qbs.conf`) looks like this: + +```bash qbs-setup-qt --detect qbs-detect-toolchains -{% endhighlight %} +``` -

Firstly we find Qt libraries. Then we find toolchains (such as compilers). And next we must insert a toolchain into Qt profile (for example, we need clang toolchain):

+Firstly we find Qt libraries. Then we find toolchains (such as compilers). And next we must insert a toolchain into Qt profile (for example, we need `clang` toolchain): -{% highlight bash %} +```bash sed 's/clang\\/qt-5-2-0\\/g' -i ~/.config/QtProject/qbs.conf -{% endhighlight %} +``` -

And there are other ways. You may edit the file manually or use qbs-config-ui or qbs-config.

-

So, we have created the configuration file and put it into build directory:

+And there are other ways. You may edit the file manually or use `qbs-config-ui` or `qbs-config`. +So, we have created the configuration file and put it into build directory: -{% highlight ini %} +```ini [General] [Qt] @@ -70,14 +76,15 @@ qutim\cpp\toolchainInstallPath=/usr/bin qutim\qbs\architecture=x86_64 qutim\qbs\endianness=little qutim\qbs\toolchain=clang, llvm, gcc -{% endhighlight %} +``` -

qbs-qutim.conf

+[qbs-qutim.conf](/resources/docs/qutim-qt5-git/qbs-qutim.conf "File") -

Patch for sources

-

The first problem is clang (at least in Archlinux):

+### Patch for sources -{% highlight diff %} +The first problem is `clang` (at least in Archlinux): + +```diff diff -ruN qutim.orig/core/libqutim.qbs qutim/core/libqutim.qbs --- qutim.orig/core/libqutim.qbs 2014-01-06 15:39:56.000000000 +0400 +++ qutim/core/libqutim.qbs 2014-01-06 15:44:54.502175067 +0400 @@ -90,11 +97,11 @@ diff -ruN qutim.orig/core/libqutim.qbs qutim/core/libqutim.qbs return flags; } -{% endhighlight %} +``` -

And the second one is Vk plugin:

+And the second one is Vk plugin: -{% highlight diff %} +```diff diff -ruN qutim.orig/protocols/vkontakte/vreen/vreen.qbs qutim/protocols/vkontakte/vreen/vreen.qbs --- qutim.orig/protocols/vkontakte/vreen/vreen.qbs 2014-01-06 15:41:42.000000000 +0400 +++ qutim/protocols/vkontakte/vreen/vreen.qbs 2014-01-06 15:46:47.142178486 +0400 @@ -106,13 +113,13 @@ diff -ruN qutim.orig/protocols/vkontakte/vreen/vreen.qbs qutim/protocols/vkontak property string vreen_version_major: 1 property string vreen_version_minor: 9 -{% endhighlight %} +``` -

qutim-qbs-1.1.patch

+[qutim-qbs-1.1.patch](/resources/docs/qutim-qt5-git/qutim-qbs-1.1.patch "File") -

Get sources

+### Get sources -{% highlight bash %} +```bash # clone repo git clone https://github.com/euroelessar/qutim # save qbs.conf @@ -126,28 +133,28 @@ git submodule update --init --recursive # patch cd .. patch -p0 -i qutim-qbs-1.1.patch -{% endhighlight %} +``` -

Building

+## Building -{% highlight bash %} +```bash cd qutim HOME=$(pwd) qbs -j $(nproc) -d ../build release profile:qutim -{% endhighlight %} +``` -

I want to create a universal recipe for the building, thus we must set $HOME directory. Flag -j means number of jobs, -d means build directory, release means building type (debug, release), profile is used profile, which is described in the configuration file.

+I want to create a universal recipe for the building, thus we must set `$HOME` directory. Flag `-j` means number of jobs, `-d` means build directory, `release` means building type (debug, release), `profile` is used profile, which is described in the configuration file. -

Installation

+## Installation -{% highlight bash %} +```bash HOME=$(pwd) sudo qbs install -d ../build --install-root "/usr" profile:qutim -{% endhighlight %} +``` -

We must set root directory (--install-root), because without this option the package will be installed into / (/bin and /lib).

+We must set root directory (`--install-root`), because without this option the package will be installed into `/` (`/bin` and `/lib`). -

PKGBUILD

+## PKGBUILD -{% highlight bash %} +```bash pkgname=qutim-qt5-git _gitname=qutim pkgver=v0.3.1.967.gc56d61e @@ -198,6 +205,6 @@ package() { cd "${srcdir}/${_gitname}" HOME="${srcdir}" qbs install -d ../build --install-root "${pkgdir}/usr" profile:qutim } -{% endhighlight %} +``` -

PKGBUILD

+[PKGBUILD](/resources/docs/qutim-qt5-git/PKGBUILD "File") diff --git a/_posts/2014-03-06-site-changes.html b/_posts/2014-03-06-site-changes.html deleted file mode 100644 index 93d442d..0000000 --- a/_posts/2014-03-06-site-changes.html +++ /dev/null @@ -1,74 +0,0 @@ ---- -category: en -type: paper -layout: paper -hastr: true -tags: site, github pages -title: Site changes -short: site-changes -description: I decided to change my site. You may find short list of changes below. ---- -

The list of changes:

- diff --git a/_posts/2014-03-06-site-changes.md b/_posts/2014-03-06-site-changes.md new file mode 100644 index 0000000..ec26177 --- /dev/null +++ b/_posts/2014-03-06-site-changes.md @@ -0,0 +1,76 @@ +--- +category: en +type: paper +layout: paper +hastr: true +tags: site, github pages +title: Site changes +short: site-changes +--- +I decided to change my site. You may find short list of changes below. + + + +## The list of changes: +* I rented a `arcanis.me` domain. Now I have a normal address, as well as all normal people have it. Small description of how to do it. Firstly, you should rent domain and activate DNS editing (it is called [DNS-master](//www.nic.ru/dns/service/dns_hosting/ "Service page") for Ru-center). I pay about $30 in year. Then you should create CNAME file in your repository; this file has line with your domain name. And finally you should create two DNS records for your domain: + + ```bash + @ A 192.30.252.153 + @ A 192.30.252.154 + # redirection from www.* + www CNAME @ + ``` + + (Symbol `@` means you root domain.) And next wait for two hours. You may find out the result as follows: + + ```bash + $ dig domain.name +nostats +nocomments +nocmd + ; <<>> DiG 9.9.2-P2 <<>> domain.name +nostats +nocomments +nocmd + ;; global options: +cmd + ;domain.name. IN A + domain.name. 912 IN A 192.30.252.153 + domain.name. 912 IN A 192.30.252.154 + ... + ``` + +* Also I've created [my own repo](ftp://repo.arcanis.me/repo "Repository"), which will contain some AUR packages that I'm using. Support of both architectures is planned. +* Since the repo requires ftp protocol, I've changed samba shared folders to ftp. The problem of access has been resolved by using mount options: + + ```bash + # only read rights + /home/arcanis/music /srv/ftp/music ext4 defaults,bind,ro 0 0 + /home/arcanis/arch/repo /srv/ftp/repo ext4 defaults,bind,ro 0 0 + # read and write rights (the file has size 2 Gb) + /home/arcanis/share.fs /srv/ftp/share ext4 defaults,rw 0 0 + ``` + + Login on special user and option `anon_world_readable_only=YES` are used for prevent access to the music directory. Also here is my `/etc/vsftpd.conf` configuration file: + + ```bash + anonymous_enable=YES + anon_root=/srv/ftp + local_enable=YES + write_enable=YES + local_umask=022 + anon_upload_enable=YES + anon_mkdir_write_enable=YES + anon_other_write_enable=YES + anon_world_readable_only=YES + dirmessage_enable=YES + xferlog_enable=YES + connect_from_port_20=YES + nopriv_user=music + ascii_upload_enable=YES + ftpd_banner=Welcome to arcanis + chroot_local_user=YES + local_root=/srv/ftp/music + listen=YES + ``` + + Now let's add redirection from `repo.arcanis.me` to the needed IP address. To do this, add the following entry in DNS: + + ```bash + repo A 89.249.170.38 + ``` + +* Also there are plans to buy a server for compiling packages and hosting the repository, filesharing and backups. diff --git a/_posts/2014-03-23-creating-custom-repo.html b/_posts/2014-03-23-creating-custom-repo.md similarity index 59% rename from _posts/2014-03-23-creating-custom-repo.html rename to _posts/2014-03-23-creating-custom-repo.md index e8a98be..d839d6d 100644 --- a/_posts/2014-03-23-creating-custom-repo.html +++ b/_posts/2014-03-23-creating-custom-repo.md @@ -6,20 +6,24 @@ hastr: true tags: archlinux, configuration, linux title: Creating own repository short: creating-custom-repo -description: It is a short paper devoted to creation own ArchLinux repository. --- -

Prepare

-

First find a server and desire to have sex with it. It is recommended to use Archlinux on it, but it is not necessarily - because you may create special root for Archlinux. Also you need two packages, devtools and pacman:

+It is a short paper devoted to creation own ArchLinux repository. -{% highlight bash %} + + +## Prepare + +First find a server and desire to have sex with it. It is recommended to use Archlinux on it, but it is not necessarily - because you may create special root for Archlinux. Also you need two packages, `devtools` and `pacman`: + +```bash pacman -Sy devtools -{% endhighlight %} +``` -

devtools is script set for building automation in the clean chroot. I think most of Arch maintainers use it.

+[devtools](//www.archlinux.org/packages/devtools/ "Archlinux package") is script set for building automation in the clean chroot. I think most of Arch maintainers use it. -

Let's create working directories and set colors:

+Let's create working directories and set colors: -{% highlight bash %} +```bash # colors if [ ${USECOLOR} == "yes" ]; then bblue='\e[1;34m' @@ -53,39 +57,40 @@ if [ ! -d "${STAGINGDIR}" ]; then echo -e "${bwhite}[II] ${bblue}Creating directory ${bwhite}'${STAGINGDIR}'${cclose}" mkdir -p "${STAGINGDIR}" || error_mes "unknown" fi -{% endhighlight %} +``` -

${REPODIR}/{i686,x86_64} are directories for repository, ${PREPAREDIR} is directory where compiled packages will be stored, ${STAGINGDIR} is one where packages will be built.

+`${REPODIR}/{i686,x86_64}` are directories for repository, `${PREPAREDIR}` is directory where compiled packages will be stored, `${STAGINGDIR}` is one where packages will be built. -

A bit of theory

-

Create directory, share it (using ftp, for example). It has two subdirectories - i686 and x86_64 - for each architecture respectively. And fill them with a set of packages.

+## A bit of theory -

Updating repository may be split into the following steps:

-
    -
  1. Creating PKGBUILDs (or updating them from AUR).
  2. -
  3. Packages building for each architecture in clean chroot.
  4. -
  5. Packages signing.
  6. -
  7. Creating the list of packages.
  8. -
  9. Repository update: -
    1. Removal old packages from repository.
    2. -
    3. Copying new packages
    4. -
    5. Repository update.
    -
  10. -
  11. Cleaning.
  12. -
+Create directory, share it (using [ftp](/en/2014/03/06/site-changes/ "Site changes paper"), for example). It has two subdirectories - `i686` and `x86_64` - for each architecture respectively. And fill them with a set of packages. -

Creating PKGBUILDs

-

Download source tarballs from AUR:

+Updating repository may be split into the following steps: -{% highlight bash %} +1. Creating PKGBUILDs (or updating them from AUR). +2. Packages building for each architecture in clean chroot. +3. Packages signing. +4. Creating the list of packages. +5. Repository update: + 1. Removal old packages from repository. + 2. Copying new packages + 3. Repository update. +6. Cleaning. + +### Creating PKGBUILDs + +Download source tarballs from AUR: + +```bash cd "${STAGINGDIR}" yaourt -G package-name -{% endhighlight %} +``` -

Packages building

-

Build each package automatically:

+### Packages building -{% highlight bash %} +Build each package automatically: + +```bash func_build() { if [ ${USECOLOR} == "yes" ]; then _bblue='\e[1;34m' @@ -121,19 +126,19 @@ export -f func_build echo -e "${bwhite}[II]${cclose} Building packages" cd "${STAGINGDIR}" /usr/bin/find -name 'PKGBUILD' -type f -execdir /usr/bin/bash -c "func_build "${PREPAREDIR}" "${ROOTDIR}"" \; -{% endhighlight %} +``` -

It is recommended to add the following lines to /etc/sudoers:

+It is recommended to add the following lines to `/etc/sudoers`: -{% highlight bash %} +```bash username ALL=NOPASSWD: /usr/bin/staging-i686-build username ALL=NOPASSWD: /usr/bin/staging-x86_64-build username ALL=NOPASSWD: /usr/bin/multilib-staging-build -{% endhighlight %} +``` -

Packages signing

+### Packages signing -{% highlight bash %} +```bash # signing if [ ${USEGPG} == "yes" ]; then echo -e "${bwhite}[II]${cclose} Signing" @@ -142,34 +147,35 @@ if [ ${USEGPG} == "yes" ]; then /usr/bin/gpg -b ${PACKAGE} done fi -{% endhighlight %} +``` -

It is recommended to configure gpg-agent.

+It is recommended to configure [gpg-agent](//wiki.archlinux.org/index.php/GPG#gpg-agent "ArchWiki"). -

Creating the list of packages

+### Creating the list of packages -{% highlight bash %} +```bash # creating packages list cd "${PREPAREDIR}" i686_PACKAGES=$(/usr/bin/find * -name '*-i686.pkg.tar.xz' -o -name '*-any.pkg.tar.xz') x86_64_PACKAGES=$(/usr/bin/find * -name '*-x86_64.pkg.tar.xz' -o -name '*-any.pkg.tar.xz') echo -e "${bwhite}[II] ${bblue}=>${cclose} i686 packages: \n${bwhite}${i686_PACKAGES}${cclose}" echo -e "${bwhite}[II] ${bblue}=>${cclose} x86_64 packages: \n${bwhite}${x86_64_PACKAGES}${cclose}" -{% endhighlight %} +``` -

Repository update

-

Here is a function for removal packages from database and repository:

+### Repository update -{% highlight bash %} +Here is a function for removal packages from database and repository: + +```bash func_remove() { _PACKAGE="$1" /usr/bin/rm -f "${_PACKAGE}"{,.sig} } -{% endhighlight %} +``` -

i686 repository update:

+`i686` repository update: -{% highlight bash %} +```bash # updating i686 repo echo -e "${bwhite}[II]${cclose} Updating ${bwhite}i686${cclose} repo" cd "${REPODIR}/i686" @@ -184,11 +190,11 @@ for PACKAGE in ${i686_PACKAGES}; do /usr/bin/repo-add ${DBNAME}.db.tar.gz "${PACKAGE}" /usr/bin/repo-add --files ${DBNAME}.files.tar.gz "${PACKAGE}" done -{% endhighlight %} +``` -

x86_64 repository update:

+`x86_64` repository update: -{% highlight bash %} +```bash # updating x86_64 repo echo -e "${bwhite}[II]${cclose} Updating ${bwhite}x86_64${cclose} repo" cd "${REPODIR}/x86_64" @@ -203,22 +209,23 @@ for PACKAGE in ${x86_64_PACKAGES}; do /usr/bin/repo-add ${DBNAME}.db.tar.gz "${PACKAGE}" /usr/bin/repo-add --files ${DBNAME}.files.tar.gz "${PACKAGE}" done -{% endhighlight %} +``` -

Cleaning

+### Cleaning -{% highlight bash %} +```bash # clear cd "${PREPAREDIR}" /usr/bin/rm -rf * cd "${STAGINGDIR}" /usr/bin/rm -rf * -{% endhighlight %} +``` -

Creating symlinks

-

You may want to create a directory, which will contain symlinks on actual packages with names, which does not contain version:

+### Creating symlinks -{% highlight bash %} +You may want to create a directory, which will contain symlinks on actual packages with names, which does not contain version: + +```bash # creating symlinks if [ ${SYMLINK} == "yes" ]; then echo -e "${bwhite}[II]${cclose} Creating symlinks" @@ -237,15 +244,17 @@ if [ ${SYMLINK} == "yes" ]; then /usr/bin/ln -sf "../x86_64/${PACKAGE}" "${PKGNAME}-x86_64.pkg.tar.xz" done fi -{% endhighlight %} +``` -

File

-

Here is the scripts. Download source tarballs and run script (editing variables if it is necessary).

+### File -

Repository usage

-

Just add following lines to /etc/pacman.conf:

+Here is [the scripts](//github.com/arcan1s/repo-scripts "GitHub"). Download source tarballs and run script (editing variables if it is necessary). -{% highlight bash %} +## Repository usage + +Just add following lines to `/etc/pacman.conf`: + +```bash [$REPONAME] Server = ftp://$REPOADDRESS/repo/$arch -{% endhighlight %} +``` diff --git a/_posts/2014-05-07-my-desktop.html b/_posts/2014-05-07-my-desktop.html deleted file mode 100644 index eb948ce..0000000 --- a/_posts/2014-05-07-my-desktop.html +++ /dev/null @@ -1,85 +0,0 @@ ---- -category: en -type: paper -layout: paper -hastr: true -tags: настройка, linux, archlinux -title: Apps which I use -short: my-desktop -description: Here is a short paper devoted to the set of applications and extensions that I use everyday on my home computer. ---- -

Applications

- - - -

KDE settings

-
- {% assign scrdesc = "KDE screenshot" %} - {% assign scrname = "kde" %} - {% include prj_scr.html %} -
- -

QtCurve is used as Qt style, its settings may be found here, window decorations are presented by QtCurve too. Cursor theme is ecliz-small. Plasma theme is volatile. Icon pack is compass. I use fonts which are based on Liberation.

- -

Used widgets (from left to right, top to bottom) are: menubar, homerun with transparent icon, icontask, netctl, default KDE tray, colibri for notifications, Awesome Widgets.

- -

As a bonus material here is a settings for konsole bright colors.

-
- {% assign scrdesc = "Zsh demonstation" %} - {% assign scrname = "zshrc_demo" %} - {% include prj_scr.html %} -
- -

Firefox settings

-

I do not use a special settings, thus I get you a list of used add-ons:

- diff --git a/_posts/2014-05-07-my-desktop.md b/_posts/2014-05-07-my-desktop.md new file mode 100644 index 0000000..203a510 --- /dev/null +++ b/_posts/2014-05-07-my-desktop.md @@ -0,0 +1,75 @@ +--- +category: en +type: paper +layout: paper +hastr: true +tags: настройка, linux, archlinux +title: Apps which I use +short: my-desktop +--- +Here is a short paper devoted to the set of applications and extensions that I use everyday on my home computer. + + + +## Applications + +* **Shell** is zshrc and nothing else. You may find a small description of my settings [here](/en/2014/01/14/about-zshrc/ "About zshrc paper"). It is stored [here](//raw.githubusercontent.com/arcan1s/dotfiles/master/zshrc "File") (or [here](//raw.githubusercontent.com/arcan1s/dotfiles/master/zshrc_server "File")). +* **DE** - I use KDE as Desktop Environment. And that's why most of apps are qt-based. Some KDE settings are below. +* **Graphic editors** - [gwenview](//kde.org/applications/graphics/gwenview/ "Gwenview Homepage") is used for viewing images, [kolourpaint](//kde.org/applications/graphics/kolourpaint/ "Kolourpaint Homepage") is used for simple editing pixel images, [gimp](//www.gimp.org/ "Gimp Homepage") (without plugins, since they are not needed for me) - for editing and [inkskape](//www.inkscape.org/ "Inkskape Homepage") is used as editor of vector graphics. +* **Browser** - I use Firefox. Some Firefox settings are below. Chromium is used as additional browser, elinks is used as console browser. +* **IM client** is [qutIM](//qutim.org "Qutim Homepage"). It is a cross-platform, multiprotocol and full featured client. [Kopete](//kde.org/applications/internet/kopete/ "Kopete Homepage"), which I used before it, crashes, does not work correctly and does not work normally with codepage. Also I don't use a console client since I use a tablet IM. And I use Skype for skype obviously. +* **Mail client** is [kmail](//kde.org/applications/internet/kmail/ "Kmail Homepage"). It is a full featured client (and I use most of them), looks pretty and it is easy to use. If it will be DE-undepended it will be better. +* **IRC client** is [konversation](//konversation.kde.org/ "Konversation Homepage"). It is a simple IRC client. Though as far as I remember qutIM also supports IRC protocol, I prefre to use a special IRC client. +* **Torrent client** is [transmission](//www.transmissionbt.com/ "Transmission Homepage") with Qt5 interface (it has gtk interface too). It is also used for server but without GUI. +* **Video player** is [mpv](//mpv.io/ "Mpv Homepage"), since mplayer died and mplayer2 was born deadborn. Graphical frontend are not needed. +* **Audio player** is [qmmp](//qmmp.ylsoftware.com/ "Qmmp Homepage"). It is a good winamp-like player. Flick of the wrist you may make a handy interface for it (simpleui). +* **Audio/video editors**: [kdenlive](//kde-apps.org/content/show.php?content=29024 "Kdenlive Homepage") is used as video editor, [soundkonverter](//kde-apps.org/content/show.php?content=29024) is used as audio editor, [easytag](//wiki.gnome.org/Apps/EasyTAG "Easytag Homepage") is used for editing audio tags (unfortunately, it is a gtk-based, but I didn't find a better tool for it). And command line and scripts written on bash are used too. +* **Office**: [Kingsoft Office](//wps-community.org/ "KO Homepage") is used as alternative of Microsoft Office; it has no any feature, but it looks normally, it is qt-based and it is said that it has a good support for standart formats. (Linux version has an alfa stage.) [Kile](//kile.sourceforge.net/ "Kile Homepage") is used as LaTeX frontend. [Okular](//kde.org/applications/graphics/okular/ "Okular Homepage") is used as document viewer. And I use [GoldenDict](//goldendict.org/ "GoldenDict Homepage") as dictionary. +* **Editors**: [kwrite](//www.kde.org/applications/utilities/kwrite/ "Kwrite Homepage") is used as a simple text editor, [kate](//www.kde.org/applications/utilities/kate/ "Kate Homepage") (and [cpp-helper](//zaufi.github.io/kate-cpp-helper-plugin.html "Plugin Homepage") plugin) is used as advanced text editor. And of course I use vim in console. +* **Scientific soft**. Chemical visualizers are [vmd](//www.ks.uiuc.edu/Research/vmd/ "VMD Homepage"), [chimera](//www.cgl.ucsf.edu/chimera/ "Chimera Homepage") and [pymol](//pymol.org/ "Pymol Homepage"). Physics simulator is [step](//kde.org/applications/education/step/ "Step Homepage"). Calculator is [kalgebra](//kde.org/applications/education/kalgebra/ "Kalgebra Homepage") and console [ipython](//ipython.org/ "ipython Homepage"). [Qtiplot](//qtiplot.com/ "Qtiplot Homepage") is used for drawing graphs and data analysis (scidavis, which is its fork, unfortunately, is half-dead), [grace](//plasma-gate.weizmann.ac.il/Grace/ "Grace Homepage") is used for only drawing graphs. [Chemtool](//ruby.chemie.uni-freiburg.de/~martin/chemtool/chemtool.html "Chemtool Homepage") is used as alternative of ChemDraw. +* **System applications**. File manager is [dolphin](//kde.org/applications/system/dolphin/ "Dolphin Homepage"), [doublecmd](//doublecmd.sourceforge.net/ "Doublecmd Homepage") is used as twin-panel manager. Terminal emulators are [yakuake](//yakuake.kde.org/ "Yakuake Homepage") and [urxvt](//software.schmorp.de/pkg/rxvt-unicode.html "Urxvt Homepage") (as windowed emulator). Archiver graphical interface is [ark](//kde.org/applications/utilities/ark/ "Ark Homepage"). + +## KDE settings + +
+ {% assign scrdesc = "KDE screenshot" %} + {% assign scrname = "kde" %} + {% include prj_scr.html %} +
+ +QtCurve is used as Qt style, its settings may be found [here](//github.com/arcan1s/dotfiles/tree/master/qtcurve "GitHub"), window decorations are presented by QtCurve too. Cursor theme is [ecliz-small](//kde-look.org/content/show.php/Ecliz?content=110340 "Cursor Homepage"). Plasma theme is [volatile](//kde-look.org/content/show.php/Volatile?content=128110 "Theme Homepage"). Icon pack is [compass](//nitrux.in/ "Nitrux Homepage"). I use fonts which are based on Liberation. + +**Used widgets** (from left to right, top to bottom) are: [menubar](//launchpad.net/plasma-widget-menubar "Widget Homepage"), [homerun](//userbase.kde.org/Homerun "Widget Homepage") with transparent icon, [icontask](//kde-apps.org/content/show.php?content=144808 "Widget Homepage"), [netctl](/projects/netctl-gui/ "Widget Homepage"), default KDE tray, [colibri](//agateau.com/projects/colibri/ "Widget Homepage") for notifications, [Awesome Widgets](/projects/awesome-widgets "Widget Homepage"). + +As a bonus material [here](//github.com/arcan1s/dotfiles/blob/master/themes/yakuake/My%20color.colorscheme "GitHub") is a settings for konsole bright colors. + +
+ {% assign scrdesc = "Zsh demonstation" %} + {% assign scrname = "zshrc_demo" %} + {% include prj_scr.html %} +
+ +## Firefox settings + +I do not use a special settings, thus I get you a list of used add-ons: + +* **Adblock plus**. +* **Add to search bar** is used for custom searchs. +* **Auto Refresh** is used for auto update pages. +* **Clone tab** adds "Clone tab" function. +* **Close tab by double click**. +* **New scrollbars** is used for customizing scrollbars, because original ones look horrible in Qt environment. +* **NoScript** is used for I2P and Tor, for example. +* **PrivateTab** adds private tab (not the window). +* **Proxy Selector** adds an ability to use multiple proxies. +* **QuickJava** is used with the same goal as NoScript. +* **RSS icon in url bar**. +* **Dictionaries for spellchecking** (eng/rus). +* **Space Next**. If I tap a space at the bottom of a page, it will be perceived as pushing the "Next" button. +* **Speed Dial** is a simple express panel. +* **Status-4-Evar** is a normal status bar. +* **tab delabelifier** minimizes inactive tabs. +* **Tab Scope + Tab Scope Tweaker** is tab tooltip. +* **accessKey** does not work now. But it is needed for easy navigation from keyboard (opera-like). +* **FXOpera** is a normal minimalistic appearance. + diff --git a/_posts/2014-05-18-disabling-baloo.html b/_posts/2014-05-18-disabling-baloo.html deleted file mode 100644 index da566fa..0000000 --- a/_posts/2014-05-18-disabling-baloo.html +++ /dev/null @@ -1,41 +0,0 @@ ---- -category: en -type: paper -layout: paper -hastr: true -tags: linux, archlinux, building -title: Disabling baloo, gentoo-way -short: disabling-baloo -description: Paper, which describes how to remove the dependency on baloo in your system. ---- -

Disclaimer

-

I do not use this patch, since I prefer less destructive methods. However, apparently all works fine, because there is no any claims. Since this patch was created in a few minutes, it removes all baloo's calls from source files (maybe I'll create a normal patch sometime).

- -

On other hand, I highly recommend to people, who do not use baloo for some reason, disable it from the settings menu (it was added it 4.13.1) or read this article.

- -

Introduction

-

In Archlinux gwenview and kdepim (and baloo-widgets) depend on baloo currently (2014-05-18). In the version 4.13.0 kactivities depends on baloo too (and I don't know why); but this dependency was not required explicitly, so it was enough just to rebuild the package by removing baloo from the list of dependencies.

- -

gwenview

-

It's all quite simple. Developers have taken care of the wishes of ordinary users and added a special flag:

- -{% highlight cmake %} -//Semantic info backend for Gwenview (Baloo/Fake/None) -GWENVIEW_SEMANTICINFO_BACKEND:STRING=Baloo -{% endhighlight %} - -

Thus, we add requred cmake flag to the build script:

- -{% highlight bash %} -cmake ../gwenview-${pkgver} \ - -DCMAKE_BUILD_TYPE=Release \ - -DKDE4_BUILD_TESTS=OFF \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DGWENVIEW_SEMANTICINFO_BACKEND=None -{% endhighlight %} - -

kdepim

-

Since everything was done in a hurry, I prefer to look at the source code using grep and to find all references to baloo. Needed strings (they are links to ballo in CMakeLists.txt, baloo's function calls and header declarations) were commented (I added some fake calls to the source code). You may find the patch here (4.13.3). Download the patch, apply it to the source code and recompile kdepim.

- -

Packages

-

All Archlinux packages for both architectures may be found in my repository.

diff --git a/_posts/2014-05-18-disabling-baloo.md b/_posts/2014-05-18-disabling-baloo.md new file mode 100644 index 0000000..ebb9ef6 --- /dev/null +++ b/_posts/2014-05-18-disabling-baloo.md @@ -0,0 +1,49 @@ +--- +category: en +type: paper +layout: paper +hastr: true +tags: linux, archlinux, building +title: Disabling baloo, gentoo-way +short: disabling-baloo +--- +Paper, which describes how to remove the dependency on baloo in your system. + + + +## Disclaimer + +I do not use this patch, since I prefer less destructive methods. However, apparently all works fine, because there is no any claims. Since this patch was created in a few minutes, it removes all baloo's calls from source files (maybe I'll create a normal patch sometime). + +On other hand, I highly recommend to people, who do not use baloo for some reason, disable it from the settings menu (it was added it 4.13.1) or read this [article](//blog.andreascarpino.it/disabling-baloo-the-arch-way/ "Scarpino's blog"). + +## Introduction + +In Archlinux **gwenview** and **kdepim** (and **baloo-widgets**) depend on baloo currently (2014-05-18). In the version 4.13.0 **kactivities** depends on baloo too (and I don't know why); but this dependency was not required explicitly, so it was enough just to rebuild the package by removing baloo from the list of dependencies. + +## gwenview + +It's all quite simple. Developers have taken care of the wishes of ordinary users and added a special flag: + +```cmake +//Semantic info backend for Gwenview (Baloo/Fake/None) +GWENVIEW_SEMANTICINFO_BACKEND:STRING=Baloo +``` + +Thus, we add requred cmake flag to the build script: + +```bash +cmake ../gwenview-${pkgver} \ + -DCMAKE_BUILD_TYPE=Release \ + -DKDE4_BUILD_TESTS=OFF \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DGWENVIEW_SEMANTICINFO_BACKEND=None +``` + +## kdepim + +Since everything was done in a hurry, I prefer to look at the source code using grep and to find all references to baloo. Needed strings (they are links to ballo in CMakeLists.txt, baloo's function calls and header declarations) were commented (I added some fake calls to the source code). You may find the patch [here](//gist.github.com/arcan1s/b698bb586faef627b3bb "Gist") (4.13.3). Download the patch, apply it to the source code and recompile kdepim. + +## Packages + +All Archlinux packages for both architectures may be found in [my repository](//wiki.archlinux.org/index.php/Unofficial_user_repositories#arcanisrepo "ArchWiki"). diff --git a/_posts/2014-07-17-writting-own-completions-p1.html b/_posts/2014-07-17-writting-own-completions-p1.html deleted file mode 100644 index a31a29c..0000000 --- a/_posts/2014-07-17-writting-own-completions-p1.html +++ /dev/null @@ -1,143 +0,0 @@ ---- -category: en -type: paper -hastr: true -layout: paper -tags: linux, development -title: Writting own Shell completions. Zsh -short: writting-own-completions-p1 -description:
bash_completion
Some basics of creating a completion files for own application are described in these articles. ---- -

Preamble

-

While developing one of my projects I have wanted to add completion files. I have already tried to create these files, but I was too lazy to read some manuals about it.

- -

Introduction

-

There are some possible ways to create zsh completion file. In this article I will describe only one of them, which provides a lot of opportunities, but does not require a lot of costs (such as regular expressions).

- -

Lets consider the example of my application, which has a part of help message that looks like this:

- -{% highlight bash %} -netctl-gui [ -h | --help ] [ -e ESSID | --essid ESSID ] [ -с FILE | --config FILE ] - [ -o PROFILE | --open PROFILE ] [ -t NUM | --tab NUM ] [ --set-opts OPTIONS ] -{% endhighlight %} - -

Here is a flag list:

- - -

The file pattern

-

It must be specified in the header that it is a completion file and application for which it will complete (may be string if this file provides completions for several applications):

- -{% highlight bash %} -#compdef netctl-gui -{% endhighlight %} - -

Next there is flags, additional functions and variables declarations. It should be noted that all functions and variables, which will be used for completions, should return arrays. In my case this scheme looks like this (I left empty these functions in this chapter):

- -{% highlight bash %} -# variables -_netctl_gui_arglist=() -_netctl_gui_settings=() -_netctl_gui_tabs=() -_netctl_profiles() {} -{% endhighlight %} - -

Then there are main functions, which will be called for completion of specific application. In my case this there is only one applications, so there is only one function:

- -{% highlight bash %} -# work block -_netctl-gui() {} -{% endhighlight %} - -

And finally without isolation in a separate function there is a small shamanism, which declares a dependence "application-function":

- -{% highlight bash %} -case "$service" in - netctl-gui) - _netctl-gui "$@" && return 0 - ;; -esac -{% endhighlight %} - -

Flags

-

As it was said above, there are some different ways to create these files. In particular they differ in the flag declaration and their further processing. In my case I will use _arguments command, which require a specific format of variables: FLAG[description]:MESSAGE:ACTION. The last two fields are not required and, as you will see below, are not needed in some cases. If you want to add two flags for an action (short and long format), then the format is a little bit complicated: {(FLAG_2)FLAG_1,(FLAG_1)FLAG_2}[description]:MESSAGE:ACTION. It should be noted that if you want to create completions for two flags but some flags have not a second format. you will should to add following line: {FLAG,FLAG}[description]:MESSAGE:ACTION. MESSAGE is a message which will be shown, ACTION is an action which will be performed after this flag. In this tutorial ACTION will be following: ->STATE.

- -

So, according to our requirements, flags declaration will be following:

- -{% highlight bash %} -_netctl_gui_arglist=( - {'(--help)-h','(-h)--help'}'[show help and exit]' - {'(--essid)-e','(-e)--essid'}'[select ESSID]:type ESSID:->essid' - {'(--config)-c','(-c)--config'}'[read configuration from this file]:select file:->files' - {'(--open)-o','(-o)--open'}'[open profile]:select profile:->profiles' - {'(--tab)-t','(-t)--tab'}'[open a tab with specified number]:select tab:->tab' - {'--set-opts','--set-opts'}'[set options for this run, comma separated]:comma separated:->settings' -) -{% endhighlight %} - -

Arrays of variables

-

In my case there are two static arrays (which will not be changed):

- -{% highlight bash %} -_netctl_gui_settings=( - 'CTRL_DIR' - 'CTRL_GROUP' -) - -_netctl_gui_tabs=( - '1' - '2' -) -{% endhighlight %} - -

And there is a dynamic array, which should be generated each time. In my case it is a list of files in the specified directory (by the way it may be done by means of zsh):

- -{% highlight bash %} -_netctl_profiles() { - print $(find /etc/netctl -maxdepth 1 -type f -printf "%f\n") -} -{% endhighlight %} - -

Function

-

Remember, there was something about a state above? It is stored in the variable $state and in this function we will check what it is to choose the appropriate action. At the beginning of the function we should call _arguments with our flags.

- -{% highlight bash %} -_netctl-gui() { - _arguments $_netctl_gui_arglist - case "$state" in - essid) - # do not completion, wait for string - ;; - files) - # completion from files in this directory - _files - ;; - profiles) - # completion from function - # first variable is a description - # second variable is a completion array - _values 'profiles' $(_netctl_profiles) - ;; - tab) - # completion from array - _values 'tab' $_netctl_gui_tabs - ;; - settings) - # completion from array - # flag -s sets separator and enables multi-selection - _values -s ',' 'settings' $_netctl_gui_settings - ;; - esac -} -{% endhighlight %} - -

Conclusion

-

File should be places to /usr/share/zsh/site-functions/ with any name (it is recommended to set prefix to _). You may found the example in my repository.

- -

The additional information may be found in zsh-completions repository. For example there is this How-To. And also there are a lot of examples.

diff --git a/_posts/2014-07-17-writting-own-completions-p1.md b/_posts/2014-07-17-writting-own-completions-p1.md new file mode 100644 index 0000000..f421500 --- /dev/null +++ b/_posts/2014-07-17-writting-own-completions-p1.md @@ -0,0 +1,151 @@ +--- +category: en +type: paper +hastr: true +layout: paper +tags: linux, development +title: Writting own Shell completions. Zsh +short: writting-own-completions-p1 +--- +
![bash_completion](/resources/papers/zsh_completion.png)
Some basics of creating a completion files for own application are described in these articles. + + + +## Preamble + +While developing [one of my projects](/ru/projects/netctl-gui "Netctl-gui project page") I have wanted to add completion files. I have already tried to create these files, but I was too lazy to read some manuals about it. + +## Introduction + +There are some possible ways to create zsh completion file. In this article I will describe only one of them, which provides a lot of opportunities, but does not require a lot of costs (such as regular expressions). + +Lets consider the example of my application, which has a part of help message that looks like this: + +```bash +netctl-gui [ -h | --help ] [ -e ESSID | --essid ESSID ] [ -с FILE | --config FILE ] + [ -o PROFILE | --open PROFILE ] [ -t NUM | --tab NUM ] [ --set-opts OPTIONS ] +``` + +Here is a flag list: +* flags `-h` and `--help` do not require any arguments; +* flags `-e` and `--essid` require a string argument without completion; +* flags `-c` and `--config` require a string argument, which is a file; +* flags `-o` and `--open` require a string argument, there is a completion from files in the specified directory; +* flags `-t` and `--tab` require a string argument, there is a completion from the specified array; +* flag `--set-opts` requires a string argument, there is a completion from the specified array comma separated; + +## The file pattern + +It must be specified in the header that it is a completion file and application for which it will complete (may be string if this file provides completions for several applications): + +```bash +#compdef netctl-gui +``` + +Next there is flags, additional functions and variables declarations. It should be noted that all functions and variables, which will be used for completions, **should return arrays**. In my case this scheme looks like this (I left empty these functions in this chapter): + +```bash +# variables +_netctl_gui_arglist=() +_netctl_gui_settings=() +_netctl_gui_tabs=() +_netctl_profiles() {} +``` + +Then there are main functions, which will be called for completion of specific application. In my case this there is only one applications, so there is only one function: + +```bash +# work block +_netctl-gui() {} +``` + +And finally **without isolation in a separate function** there is a small shamanism, which declares a dependence "application-function": + +```bash +case "$service" in + netctl-gui) + _netctl-gui "$@" && return 0 + ;; +esac +``` + +## Flags + +As it was said above, there are some different ways to create these files. In particular they differ in the flag declaration and their further processing. In my case I will use `_arguments` command, which require a specific format of variables: `FLAG[description]:MESSAGE:ACTION`. The last two fields are not required and, as you will see below, are not needed in some cases. If you want to add two flags for an action (short and long format), then the format is a little bit complicated: `{(FLAG_2)FLAG_1,(FLAG_1)FLAG_2}[description]:MESSAGE:ACTION`. It should be noted that if you want to create completions for two flags but some flags have not a second format. you will should to add following line: `{FLAG,FLAG}[description]:MESSAGE:ACTION`. `MESSAGE` is a message which will be shown, `ACTION` is an action which will be performed after this flag. In this tutorial `ACTION` will be following: `->STATE`. + +So, according to our requirements, flags declaration will be following: + +```bash +_netctl_gui_arglist=( + {'(--help)-h','(-h)--help'}'[show help and exit]' + {'(--essid)-e','(-e)--essid'}'[select ESSID]:type ESSID:->essid' + {'(--config)-c','(-c)--config'}'[read configuration from this file]:select file:->files' + {'(--open)-o','(-o)--open'}'[open profile]:select profile:->profiles' + {'(--tab)-t','(-t)--tab'}'[open a tab with specified number]:select tab:->tab' + {'--set-opts','--set-opts'}'[set options for this run, comma separated]:comma separated:->settings' +) +``` + +## Arrays of variables + +In my case there are two static arrays (which will not be changed): + +```bash +_netctl_gui_settings=( + 'CTRL_DIR' + 'CTRL_GROUP' +) + +_netctl_gui_tabs=( + '1' + '2' +) +``` + +And there is a dynamic array, which should be generated each time. In my case it is a list of files in the specified directory (by the way it may be done by means of zsh): + +```bash +_netctl_profiles() { + print $(find /etc/netctl -maxdepth 1 -type f -printf "%f\n") +} +``` + +## Function + +Remember, there was something about a state above? It is stored in the variable `$state` and in this function we will check what it is to choose the appropriate action. At the beginning of the function we should call `_arguments` with our flags. + +```bash +_netctl-gui() { + _arguments $_netctl_gui_arglist + case "$state" in + essid) + # do not completion, wait for string + ;; + files) + # completion from files in this directory + _files + ;; + profiles) + # completion from function + # first variable is a description + # second variable is a completion array + _values 'profiles' $(_netctl_profiles) + ;; + tab) + # completion from array + _values 'tab' $_netctl_gui_tabs + ;; + settings) + # completion from array + # flag -s sets separator and enables multi-selection + _values -s ',' 'settings' $_netctl_gui_settings + ;; + esac +} +``` + +## Conclusion + +File should be places to `/usr/share/zsh/site-functions/` with any name (it is recommended to set prefix to `_`). You may found the example [in my repository](//raw.githubusercontent.com/arcan1s/netctl-gui/master/sources/gui/zsh-completions "File"). + +The additional information may be found in [zsh-completions](//github.com/zsh-users/zsh-completions "GitHub") repository. For example there is this [How-To](//github.com/zsh-users/zsh-completions/blob/master/zsh-completions-howto.org "Tutorial"). And also there are a lot of examples. diff --git a/_posts/2014-07-17-writting-own-completions-p2.html b/_posts/2014-07-17-writting-own-completions-p2.html deleted file mode 100644 index 76462fd..0000000 --- a/_posts/2014-07-17-writting-own-completions-p2.html +++ /dev/null @@ -1,136 +0,0 @@ ---- -category: en -type: paper -hastr: true -layout: paper -tags: linux, development -title: Writting own Shell completions. Bash -short: writting-own-completions-p2 -description:
bash_completion
Some basics of creating a completion files for own application are described in these articles. ---- -

Preamble

-

While developing one of my projects I have wanted to add completion files. I have already tried to create these files, but I was too lazy to read some manuals about it.

- -

Introduction

-

Bash, unlike zsh, demands some dirty workarounds for completions. Cursory have Googled, I have not found a more or less normal tutorials, so it is based on the available pacman completion files in my system.

- -

Lets consider the example of the same my application. I remind you that a part of help message is as follows:

- -{% highlight bash %} -netctl-gui [ -h | --help ] [ -e ESSID | --essid ESSID ] [ -с FILE | --config FILE ] - [ -o PROFILE | --open PROFILE ] [ -t NUM | --tab NUM ] [ --set-opts OPTIONS ] -{% endhighlight %} - -

Here is a flag list:

- - -

The file pattern

-

Here all variables must return an array. And there no specific formats. First we declare the flags and then we describe all other variables. As I am not going to describe the functions in more detail below I remind you that _netctl_profiles() should be generated each time:

- -{% highlight bash %} -# variables -_netctl_gui_arglist=() -_netctl_gui_settings=() -_netctl_gui_tabs=() -_netctl_profiles() {} -{% endhighlight %} - -

Then there are main functions, which will be called for completion of specific application. In my case this there is only one applications, so there is only one function:

- -{% highlight bash %} -# work block -_netctl-gui() {} -{% endhighlight %} - -

And finally again without isolation in a separate function we create a dependence "function-application":

- -{% highlight bash %} -complete -F _netctl_gui netctl-gui -{% endhighlight %} - - -

Flags

-

As it was said above there is no specific format, so all available flags declare by array:

- -{% highlight bash %} -_netctl_gui_arglist=( - '-h' - '--help' - '-e' - '--essid' - '-c' - '--config' - '-o' - '--open' - '-t' - '--tab' - '--set-opts' -) -{% endhighlight %} - -

Arrays of variables

-

I just give a function that looked like this in zsh:

- -{% highlight bash %} -_netctl_profiles() { - print $(find /etc/netctl -maxdepth 1 -type f -printf "%f\n") -} -{% endhighlight %} - -

Bash does not allow to do so, so this function should be a little changed:

- -{% highlight bash %} -_netctl_profiles() { - echo $(find /etc/netctl -maxdepth 1 -type f -printf "%f\n") -} -{% endhighlight %} - -

Function

-

The variable COMPREPLY responds for completion in Bash. To keep track of the current state function _get_comp_words_by_ref must be called with parameters cur (current flag) and prev (previous flag, it is the state). Also some point for case are needed (variables want*). Function compgen is used for completion generation. A list of words is given after flag -W. (Also there is flag -F which requires a function as argument, but it gives warning for me.) The last argument is a current string to which you want to generate completion.

- -

So, here is our function:

- -{% highlight bash %} -_netctl_gui() { - COMPREPLY=() - wantfiles='-@(c|-config)' - wantprofiles='-@(o|-open|s|-select)' - wantsettings='-@(-set-opts)' - - wanttabs='-@(t|-tab)' - _get_comp_words_by_ref cur prev - - if [[ $prev = $wantstring ]]; then - # do not completion, wait for string - COMPREPLY=() - elif [[ $prev = $wantfiles ]]; then - # completion from files in this directory - _filedir - elif [[ $prev = $wantprofiles ]]; then - # completion from function - COMPREPLY=($(compgen -W '${_netctl_profiles[@]}' -- "$cur")) - elif [[ $prev = $wanttabs ]]; then - # completion from array - COMPREPLY=($(compgen -W '${_netctl_gui_tabs[@]}' -- "$cur")) - elif [[ $prev = $wantsettings ]]; then - # completion from array - # flag -S add a comma after completion, but does not enable multi-selection =( - COMPREPLY=($(compgen -S ',' -W '${_netctl_gui_settings[@]}' -- "$cur")) - else - # show all available flags - COMPREPLY=($(compgen -W '${_netctl_gui_arglist[@]}' -- "$cur")) - fi - - true -} -{% endhighlight %} - -

Conclusion

-

File should be places to /usr/share/bash-completion/completions/ with any name. You may found the example in my repository.

diff --git a/_posts/2014-07-17-writting-own-completions-p2.md b/_posts/2014-07-17-writting-own-completions-p2.md new file mode 100644 index 0000000..d07dc2b --- /dev/null +++ b/_posts/2014-07-17-writting-own-completions-p2.md @@ -0,0 +1,143 @@ +--- +category: en +type: paper +hastr: true +layout: paper +tags: linux, development +title: Writting own Shell completions. Bash +short: writting-own-completions-p2 +--- +
![bash_completion](/resources/papers/bash_completion.png)
Some basics of creating a completion files for own application are described in these articles. + + + +## Preamble + +While developing [one of my projects](/ru/projects/netctl-gui "Netctl-gui project page") I have wanted to add completion files. I have already tried to create these files, but I was too lazy to read some manuals about it. + +## Introduction + +Bash, [unlike zsh](/ru/2014/07/17/writting-own-completions-p1 "Zsh completions paper"), demands some dirty workarounds for completions. Cursory have Googled, I have not found a more or less normal tutorials, so it is based on the available `pacman` completion files in my system. + +Lets consider the example of the same my application. I remind you that a part of help message is as follows: + +```bash +netctl-gui [ -h | --help ] [ -e ESSID | --essid ESSID ] [ -с FILE | --config FILE ] + [ -o PROFILE | --open PROFILE ] [ -t NUM | --tab NUM ] [ --set-opts OPTIONS ] +``` + +Here is a flag list: +* flags `-h` and `--help` do not require any arguments; +* flags `-e` and `--essid` require a string argument without completion; +* flags `-c` and `--config` require a string argument, which is a file; +* flags `-o` and `--open` require a string argument, there is a completion from files in the specified directory; +* flags `-t` and `--tab` require a string argument, there is a completion from the specified array; +* flag `--set-opts` requires a string argument, there is a completion from the specified array comma separated; + +## The file pattern + +Here **all** variables must return an array. And there no specific formats. First we declare the flags and then we describe all other variables. As I am not going to describe the functions in more detail below I remind you that `_netctl_profiles()` should be generated each time: + +```bash +# variables +_netctl_gui_arglist=() +_netctl_gui_settings=() +_netctl_gui_tabs=() +_netctl_profiles() {} +``` + +Then there are main functions, which will be called for completion of specific application. In my case this there is only one applications, so there is only one function: + +```bash +# work block +_netctl-gui() {} +``` + +And finally again **without isolation in a separate function** we create a dependence "function-application": + +```bash +complete -F _netctl_gui netctl-gui +``` + +## Flags + +As it was said above there is no specific format, so all available flags declare by array: + +```bash +_netctl_gui_arglist=( + '-h' + '--help' + '-e' + '--essid' + '-c' + '--config' + '-o' + '--open' + '-t' + '--tab' + '--set-opts' +) +``` + +## Arrays of variables + +I just give a function that looked like this in zsh: + +```bash +_netctl_profiles() { + print $(find /etc/netctl -maxdepth 1 -type f -printf "%f\n") +} +``` + +Bash does not allow to do so, so this function should be a little changed: + +```bash +_netctl_profiles() { + echo $(find /etc/netctl -maxdepth 1 -type f -printf "%f\n") +} +``` + +## Function + +The variable `COMPREPLY` responds for completion in Bash. To keep track of the current state function `_get_comp_words_by_ref` must be called with parameters `cur` (current flag) and `prev` (previous flag, it is the state). Also some point for case are needed (variables `want*`). Function `compgen` is used for completion generation. A list of words is given after flag `-W`. (Also there is flag `-F` which requires a function as argument, but it gives warning for me.) The last argument is a current string to which you want to generate completion. + +So, here is our function: + +```bash +_netctl_gui() { + COMPREPLY=() + wantfiles='-@(c|-config)' + wantprofiles='-@(o|-open|s|-select)' + wantsettings='-@(-set-opts)' + + wanttabs='-@(t|-tab)' + _get_comp_words_by_ref cur prev + + if [[ $prev = $wantstring ]]; then + # do not completion, wait for string + COMPREPLY=() + elif [[ $prev = $wantfiles ]]; then + # completion from files in this directory + _filedir + elif [[ $prev = $wantprofiles ]]; then + # completion from function + COMPREPLY=($(compgen -W '${_netctl_profiles[@]}' -- "$cur")) + elif [[ $prev = $wanttabs ]]; then + # completion from array + COMPREPLY=($(compgen -W '${_netctl_gui_tabs[@]}' -- "$cur")) + elif [[ $prev = $wantsettings ]]; then + # completion from array + # flag -S add a comma after completion, but does not enable multi-selection =( + COMPREPLY=($(compgen -S ',' -W '${_netctl_gui_settings[@]}' -- "$cur")) + else + # show all available flags + COMPREPLY=($(compgen -W '${_netctl_gui_arglist[@]}' -- "$cur")) + fi + + true +} +``` + +## Conclusion + +File should be places to `/usr/share/bash-completion/completions/` with any name. You may found the example [in my repository](//raw.githubusercontent.com/arcan1s/netctl-gui/master/sources/gui/bash-completions "File"). diff --git a/_posts/2014-09-04-migration-to-v2.html b/_posts/2014-09-04-migration-to-v2.html deleted file mode 100644 index 8c394ad..0000000 --- a/_posts/2014-09-04-migration-to-v2.html +++ /dev/null @@ -1,38 +0,0 @@ ---- -category: en -type: paper -hastr: true -layout: paper -tags: awesome-widgets, pytextmonitor -title: Migration Awesome Widgets (ex-PyTextMonitor) to version 2.0 -short: migration-to-v2 -description:
broken-computer
Some significant changes occur in the version 2.0 (really, I didn't do anything which can break your desktop!) and user API was rewritten. This paper should help to migrate from older PyTextMonitor versions (<1.11.0) to new one (>2.0). ---- -

New features

-

Firstly, a series of new features, including:

- - - -

Significant changes

-

Secondly, there are some changes because of which the old settings will not more work. They are:

- - - -

On any issues related to the migration, feel free to leave a comment here.

diff --git a/_posts/2014-09-04-migration-to-v2.md b/_posts/2014-09-04-migration-to-v2.md new file mode 100644 index 0000000..8f4f6c7 --- /dev/null +++ b/_posts/2014-09-04-migration-to-v2.md @@ -0,0 +1,36 @@ +--- +category: en +type: paper +hastr: true +layout: paper +tags: awesome-widgets, pytextmonitor +title: Migration Awesome Widgets (ex-PyTextMonitor) to version 2.0 +short: migration-to-v2 +--- +
![broken-computer](/resources/papers/broken-computer.jpg)
Some significant changes occur in the version 2.0 (really, I didn't do anything which can break your desktop!) and user API was rewritten. This paper should help to migrate from older PyTextMonitor versions (<1.11.0) to new one (>2.0). + + + +## New features + +Firstly, a series of new features, including: + +* New widget - **Desktop panel**. It shows desktop list and select the active one. It can switch to the selected desktop by mouse clicking. Also it may set selected panels hidden. +* New tags - `hddfreemb`, `hddfreegb`, `memusedmb`, `memusedgb`, `memfreemb`, `memfreegb`, `swapfreemb`, `swapfreegb`. And there are new tags related to new features - `desktop`, `ndesktop`, `tdesktops`. +* New graphical tooltip - battery. It is twin colour (the colour depends on AC status). + +## Significant changes + +Secondly, there are some changes because of which the old settings **will not** more work. They are: + +* The main widget was rewritten to `С++`, so the project was renamed to **Awesome Widgets**, and the main widget was done to **Awesome Widget** +* Configuration of battery and AC files **was moved to DataEngine**. +* **The labels was removed**. Now the widget is a single label. You may set up text in the special browser. +* According to removal of the label, tooltip **should be configured separately**. +* Align of text now can be configured only by using HTML tags. +* According to fields combining several tags were renamed: + * `custom` (time) -> `ctime` + * `custom` (uptime) -> `cuptime` + * `time` (player) -> `duration` + +On any issues related to the migration, feel free to leave a comment here. diff --git a/_posts/2014-12-12-encryption-home-directory.html b/_posts/2014-12-12-encryption-home-directory.html deleted file mode 100644 index 57526df..0000000 --- a/_posts/2014-12-12-encryption-home-directory.html +++ /dev/null @@ -1,173 +0,0 @@ ---- -category: en -type: paper -hastr: true -layout: paper -tags: linux, systemd, ecryptfs -title: How to encrypt home directory. For dummies -short: ecnryption-home-directory -description:
single-door
This paper is about encryption home directory using ecryptfs and automount settins using systemd and key on flash card. ---- -

Step 0: Preparation

-
    -
  1. Logout as user.
  2. -
  3. Login as root on tty. The following actions should be done as root.
  4. -
  5. Move your home directory and create empty directory (s/$USER/user name/): - -{% highlight bash %} -mv /home/{$USER,$USER-org} -mkdir /home/$USER -chmod 700 /home/$USER -chown $USER:users /home/$USER -{% endhighlight %} - -
  6. -
- -

Step 1: Encryption

-

The widespread solution in the Internet is to use automatic utilities to do it. However in our case they are not suitable, since we need to import key / password signature, which is not possible in this case.

- -

The encryption can be done by the following command (lol):

- -{% highlight bash %} -mount -t ecryptfs /home/$USER /home/$USER -{% endhighlight %} - -

While process it asks some question (I suggest to do first mounting in the interactive mode). The answers may be like following (see the comments), -please note that if you change something, it will be changed in some lines below too:

- -{% highlight bash %} -# key or certificate. The second one is more reliable while you don't lose it %) -Select key type to use for newly created files: - 1) passphrase - 2) openssl -Selection: 1 -# password -Passphrase: -# cipher, select default -Select cipher: - 1) aes: blocksize = 16; min keysize = 16; max keysize = 32 - 2) blowfish: blocksize = 8; min keysize = 16; max keysize = 56 - 3) des3_ede: blocksize = 8; min keysize = 24; max keysize = 24 - 4) twofish: blocksize = 16; min keysize = 16; max keysize = 32 - 5) cast6: blocksize = 16; min keysize = 16; max keysize = 32 - 6) cast5: blocksize = 8; min keysize = 5; max keysize = 16 -Selection [aes]: 1 -# key size, select default -Select key bytes: - 1) 16 - 2) 32 - 3) 24 -Selection [16]: 1 -# enable reading/writing to the non-encrypted files -Enable plaintext passthrough (y/n) [n]: n -# enable filename encryption -Enable filename encryption (y/n) [n]: y -Filename Encryption Key (FNEK) Signature [XXXXX]: -# toolongdontread -Attempting to mount with the following options: - ecryptfs_unlink_sigs - ecryptfs_fnek_sig=XXXXX - ecryptfs_key_bytes=16 - ecryptfs_cipher=aes - ecryptfs_sig=XXXXX -WARNING: Based on the contents of [/root/.ecryptfs/sig-cache.txt], -it looks like you have never mounted with this key -before. This could mean that you have typed your -passphrase wrong. - -# accept, quit -Would you like to proceed with the mount (yes/no)? : yes -Would you like to append sig [XXXXX] to -[/root/.ecryptfs/sig-cache.txt] -in order to avoid this warning in the future (yes/no)? : yes -Successfully appended new sig to user sig cache file -Mounted eCryptfs -{% endhighlight %} - -

Then copy files from home directory to encrypted one:

- -{% highlight bash %} -cp -a /home/$USER-org/. /home/$USER -{% endhighlight %} - -

Step 2: systemd automounting

-

Create file on flash card (I've used microSD) with the following text (you should insert your password):

- -{% highlight bash %} -passphrase_passwd=someverystronguniqpassword -{% endhighlight %} - -

Add card automount (mount point is /mnt/key) to fstab with option ro, for example:

- -{% highlight bash %} -UUID=dc3ecb41-bc40-400a-b6bf-65c5beeb01d7 /mnt/key ext2 ro,defaults 0 0 -{% endhighlight %} - -

Let's configure home directory mounting. The mount options can be found in the following output:

- -{% highlight bash %} -mount | grep ecryptfs -{% endhighlight %} - -

I should note that there are not all options there, you need add key, no_sig_cache, ecryptfs_passthrough too. Thus systemd mount-unit should be like the following (if you are systemd-hater you can write the own daemon, because it doesn't work over fstab without modification (see below)).

- -{% highlight bash %} -# cat /etc/systemd/system/home-$USER.mount -[Unit] -Before=local-fs.target -After=mnt-key.mount - -[Mount] -What=/home/$USER -Where=/home/$USER -Type=ecryptfs -Options=rw,nosuid,nodev,relatime,key=passphrase:passphrase_passwd_file=/mnt/key/keyfile,no_sig_cache,ecryptfs_fnek_sig=XXXXX,ecryptfs_sig=XXXXX,ecryptfs_cipher=aes,ecryptfs_key_bytes=16,ecryptfs_passthrough=n,ecryptfs_unlink_sigs - -[Install] -WantedBy=local-fs.target -{% endhighlight %} - -

XXXXX should be replaced to signature from options with which directory are currently mounting. Also you need to insert user name and edit path to file with password (and unit name) if it is needed. Autoload:

- -{% highlight bash %} -systemctl enable home-$USER.mount -{% endhighlight %} - -

Here is a service to unmount flash card when it will be unneeded:

- -{% highlight bash %} -# cat /etc/systemd/system/umount-key.service -[Unit] -Description=Unmount key card -Before=local-fs.target -After=home-arcanis.mount - -[Service] -Type=oneshot -ExecStart=/usr/bin/umount /mnt/key - -[Install] -WantedBy=local-fs.target -{% endhighlight %} - -

Enable:

- -{% highlight bash %} -systemctl enable umount-key.service -{% endhighlight %} - -

Reboot. Remove backups if all is ok. If not then you did a mistake, resurrect system from emergency mode.

- -

Why not fstab?

-

In my case I could not to make flash mounting before home decryption. Thus I saw emergency mode on load in which I should just continue loading. There are two solutions in the Internet:

- - - -

In my opinion both of them are workarounds too much.

- -

Why not pam?

-

Other solution is to mount using pam entry. In my case I have authentication without password on fingerprint so it doesn't work for me.

\ No newline at end of file diff --git a/_posts/2014-12-12-encryption-home-directory.md b/_posts/2014-12-12-encryption-home-directory.md new file mode 100644 index 0000000..1e79e57 --- /dev/null +++ b/_posts/2014-12-12-encryption-home-directory.md @@ -0,0 +1,175 @@ +--- +category: en +type: paper +hastr: true +layout: paper +tags: linux, systemd, ecryptfs +title: How to encrypt home directory. For dummies +short: ecnryption-home-directory +--- +
![single-door](/resources/papers/single-door.jpg)
This paper is about encryption home directory using ecryptfs and automount settins using systemd and key on flash card. + + + +## Step 0: Preparation + +1. Logout as user. +2. Login as root on tty. The following actions should be done as root. +3. Move your home directory and create empty directory (`s/$USER/user name/`): + + ```bash + mv /home/{$USER,$USER-org} + mkdir /home/$USER + chmod 700 /home/$USER + chown $USER:users /home/$USER + ``` + +## Step 1: Encryption + +The widespread solution in the Internet is to use automatic utilities to do it. However in our case they are not suitable, since we need to import key / password signature, which is not possible in this case. + +The encryption can be done by the following command (lol): + +```bash +mount -t ecryptfs /home/$USER /home/$USER +``` + +While process it asks some question (I suggest to do first mounting in the interactive mode). The answers may be like following (see the comments), +please note that if you change something, it will be changed in some lines below too: + +```bash +# key or certificate. The second one is more reliable while you don't lose it %) +Select key type to use for newly created files: + 1) passphrase + 2) openssl +Selection: 1 +# password +Passphrase: +# cipher, select default +Select cipher: + 1) aes: blocksize = 16; min keysize = 16; max keysize = 32 + 2) blowfish: blocksize = 8; min keysize = 16; max keysize = 56 + 3) des3_ede: blocksize = 8; min keysize = 24; max keysize = 24 + 4) twofish: blocksize = 16; min keysize = 16; max keysize = 32 + 5) cast6: blocksize = 16; min keysize = 16; max keysize = 32 + 6) cast5: blocksize = 8; min keysize = 5; max keysize = 16 +Selection [aes]: 1 +# key size, select default +Select key bytes: + 1) 16 + 2) 32 + 3) 24 +Selection [16]: 1 +# enable reading/writing to the non-encrypted files +Enable plaintext passthrough (y/n) [n]: n +# enable filename encryption +Enable filename encryption (y/n) [n]: y +Filename Encryption Key (FNEK) Signature [XXXXX]: +# toolongdontread +Attempting to mount with the following options: + ecryptfs_unlink_sigs + ecryptfs_fnek_sig=XXXXX + ecryptfs_key_bytes=16 + ecryptfs_cipher=aes + ecryptfs_sig=XXXXX +WARNING: Based on the contents of [/root/.ecryptfs/sig-cache.txt], +it looks like you have never mounted with this key +before. This could mean that you have typed your +passphrase wrong. + +# accept, quit +Would you like to proceed with the mount (yes/no)? : yes +Would you like to append sig [XXXXX] to +[/root/.ecryptfs/sig-cache.txt] +in order to avoid this warning in the future (yes/no)? : yes +Successfully appended new sig to user sig cache file +Mounted eCryptfs +``` + +Then copy files from home directory to encrypted one: + +```bash +cp -a /home/$USER-org/. /home/$USER +``` + +## Step 2: systemd automounting + +Create file on flash card (I've used microSD) with the following text (you should insert your password): + +```bash +passphrase_passwd=someverystronguniqpassword +``` + +Add card automount (mount point is `/mnt/key`) to `fstab` with option `ro`, for example: + +```bash +UUID=dc3ecb41-bc40-400a-b6bf-65c5beeb01d7 /mnt/key ext2 ro,defaults 0 0 +``` + +Let's configure home directory mounting. The mount options can be found in the following output: + +```bash +mount | grep ecryptfs +``` + +I should note that there are not all options there, you need add `key`, `no_sig_cache`, `ecryptfs_passthrough` too. Thus systemd mount-unit should be like the following (if you are systemd-hater you can write the own daemon, because it doesn't work over `fstab` without modification (see below)). + +```bash +# cat /etc/systemd/system/home-$USER.mount +[Unit] +Before=local-fs.target +After=mnt-key.mount + +[Mount] +What=/home/$USER +Where=/home/$USER +Type=ecryptfs +Options=rw,nosuid,nodev,relatime,key=passphrase:passphrase_passwd_file=/mnt/key/keyfile,no_sig_cache,ecryptfs_fnek_sig=XXXXX,ecryptfs_sig=XXXXX,ecryptfs_cipher=aes,ecryptfs_key_bytes=16,ecryptfs_passthrough=n,ecryptfs_unlink_sigs + +[Install] +WantedBy=local-fs.target +``` + +`XXXXX` should be replaced to signature from options with which directory are currently mounting. Also you need to insert user name and edit path to file with password (and unit name) if it is needed. Autoload: + +```bash +systemctl enable home-$USER.mount +``` + +Here is a service to unmount flash card when it will be unneeded: + +```bash +# cat /etc/systemd/system/umount-key.service +[Unit] +Description=Unmount key card +Before=local-fs.target +After=home-arcanis.mount + +[Service] +Type=oneshot +ExecStart=/usr/bin/umount /mnt/key + +[Install] +WantedBy=local-fs.target +``` + +Enable: + +```bash +systemctl enable umount-key.service +``` + +Reboot. Remove backups if all is ok. If not then you did a mistake, resurrect system from emergency mode. + +## Why not fstab? + +In my case I could not to make flash mounting before home decryption. Thus I saw emergency mode on load in which I should just continue loading. There are two solutions in the Internet: + +* Create entry with noauto option and then mount using the special command in `rc.local`. +* Create entry with nofail option and then remount all partitions in `rc.local`. + +In my opinion both of them are workarounds too much. + +## Why not pam? + +Other solution is to mount using pam entry. In my case I have authentication without password on fingerprint so it doesn't work for me. diff --git a/_posts/2014-12-19-aw-v21-bells-and-whistles.html b/_posts/2014-12-19-aw-v21-bells-and-whistles.html deleted file mode 100644 index 90f0b16..0000000 --- a/_posts/2014-12-19-aw-v21-bells-and-whistles.html +++ /dev/null @@ -1,327 +0,0 @@ ---- -category: en -type: paper -hastr: true -layout: paper -tags: awesome-widgets, pytextmonitor -title: Awesome Widgets - bells and whistles -short: aw-v21-bells-and-whistles -description: The paper deals with settings of a custom scripts and graphical bars in the new version of Awesome Widgets (2.1). ---- -

Introduction

-

For a start it is highly recommended copy file $HOME/.kde4/share/config/extsysmon.conf after widget update before you open widget settings, because old and new script settings are incompatible. Also I should note that these features can be configured from graphical interface, but I will describe how it can be done by simply editing the desktop file.

- -

General

-

Items are stored in the two directories: /usr/share/awesomewidgets/%TYPE%/ and $HOME/.local/share/awesomewidgets/%TYPE%/ (path may be differ in depend from your distro). Settings in the home directory have a higher priority that global ones.

- -

Bars

-

Directory is desktops, configuration files have the following fields:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldRequiredValueDefault
Nameyesbar name. It should be as barN and should be uniquenone
Commentnocommentempty
X-AW-Valueyesbar value. The following tags are available cpu*, gpu, mem, swap, hdd*, batcpu
X-AW-ActiveColoryesactive part fill in format R,G,B,A0,0,0,130
X-AW-InactiveColoryesinactive part fill in format R,G,B,A255,255,255,130
X-AW-Typeyesbar type. The following types are supported Horizontal, Vertical, Circle, GraphHorizontal
X-AW-Directionyesthe fill direction. The following variants are supported LeftToRight, RightToLeftLeftToRight
X-AW-Heightyesheight, pixels100
X-AW-Widthyeswidth, pixels100
X-AW-Numberyesunique number which will be associated with the bar. The property has been introduced to provide compatibility with others items. Should be the same as number in Name isnumber from Name
- -

Quotes

-

Directory is quotes, configuration files have the following fields:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldRequiredValueDefault
Nameyesquotes namenone
Commentnocommentempty
X-AW-Tickeryesticker from Yahoo! Finance systemEURUSD=X
X-AW-Activenowhether or not the quotes is activetrue
X-AW-Intervalnoupdate interval in standard widget intervals1
X-AW-Numberyesunique number which will be associated with the scriptrandom number which is less than 1000
- -

Scripts

-

Directory is scripts, configuration files have the following fields:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldRequiredValueDefault
Nameyesscript namenone
Commentnocommentempty
Execyespath to executable file/usr/bin/true
X-AW-Prefixnoprefix to executable file. Usually it's not required, but in other you may want to specify interpreter for example
X-AW-Activenowhether or not the script is activetrue
X-AW-Redirectnostream redirection. The following variants are available stderr2stdout, nothing, stdout2stderr, swap. stderr will be available, if you run application in the debug modenothing
X-AW-Intervalnoupdate interval in standard widget intervals1
X-AW-Numberyesunique number which will be associated with the scriptrandom number which is less than 1000
X-AW-Filtersnocomma separated filters from awesomewidgets-extscripts-filters.json
- -

Upgrade

-

Directory is upgrade, configuration files have the following fields:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldRequiredValueDefault
Nameyesupgrade namenone
Commentnocommentempty
Execyespath to executable file/usr/bin/true
X-AW-Filternothe regexp which will be applied to command output. If set X-AW-Null will be ignored
X-AW-Activenowhether or not the upgrade script is activetrue
X-AW-Nullnothe number of lines which should be skipped in output0
X-AW-Intervalnoupdate interval in standard widget intervals1
X-AW-Numberyesunique number which will be associated with the upgrade scriptrandom number which is less than 1000
- -

Weather

-

The weather uses data and API from OpenWeatherMap. Directory is weather, configuration files have the following fields:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldRequiredValueDefault
Nameyesweather namenone
Commentnocommentempty
X-AW-CityyescityLondon
X-AW-Countryyestwo-letter country codeuk
X-AW-Imagenouse images as weather icon or text.false
X-AW-TSyestime to which weather should be. 0 is a current weather, 1 - weather 3 hours later, etc0
X-AW-Activenowhether or not the monitor is activetrue
X-AW-Intervalnoupdate interval in standard widget intervals1
X-AW-Numberyesunique number which will be associated with the upgrade weatherrandom number which is less than 1000
diff --git a/_posts/2014-12-19-aw-v21-bells-and-whistles.md b/_posts/2014-12-19-aw-v21-bells-and-whistles.md new file mode 100644 index 0000000..4712e60 --- /dev/null +++ b/_posts/2014-12-19-aw-v21-bells-and-whistles.md @@ -0,0 +1,97 @@ +--- +category: en +type: paper +hastr: true +layout: paper +tags: awesome-widgets, pytextmonitor +title: Awesome Widgets - bells and whistles +short: aw-v21-bells-and-whistles +--- +The paper deals with settings of a custom scripts and graphical bars in the new version of Awesome Widgets (2.1). + + + +## Introduction + +For a start it is highly recommended copy file `$HOME/.kde4/share/config/extsysmon.conf` after widget update before you open widget settings, because old and new script settings are incompatible. Also I should note that these features can be configured from graphical interface, but I will describe how it can be done by simply editing the desktop file. + +## General + +Items are stored in the two directories: `/usr/share/awesomewidgets/%TYPE%/` and `$HOME/.local/share/awesomewidgets/%TYPE%/` (path may be differ in depend from your distro). Settings in the home directory have a higher priority that global ones. + +## Bars + +Directory is `desktops`, configuration files have the following fields: + +| Field | Required | Value | Default | +| -------------------|----------|----------------------------------|------------| +| Name | yes | bar name. It should be as `barN` and should be unique | none | +| Comment | no | comment | empty | +| X-AW-Value | yes | bar value. The following tags are available `cpu*`, `gpu`, `mem`, `swap`, `hdd*`, `bat` | cpu | +| X-AW-ActiveColor | yes | active part fill in format `R,G,B,A` | 0,0,0,130 | +| X-AW-InactiveColor | yes | inactive part fill in format `R,G,B,A` | 255,255,255,130 | +| X-AW-Type | yes | bar type. The following types are supported `Horizontal`, `Vertical`, `Circle`, `Graph` | Horizontal | +| X-AW-Direction | yes | the fill direction. The following variants are supported `LeftToRight`, `RightToLeft` | LeftToRight | +| X-AW-Height | yes | height, pixels | 100 | +| X-AW-Width | yes | width, pixels | 100 | +| X-AW-Number | yes | unique number which will be associated with the bar. The property has been introduced to provide compatibility with others items. Should be the same as number in Name is | number from Name | + +## Quotes + +Directory is `quotes`, configuration files have the following fields: + +| Field | Required | Value | Default | +|-------|----------|-------|---------| +| Name | yes | quotes name | none | +| Comment | no | comment | empty | +| X-AW-Ticker | yes | ticker from Yahoo! Finance system | EURUSD=X | +| X-AW-Active | no | whether or not the quotes is active | true | +| X-AW-Interval | no | update interval in standard widget intervals | 1 | +| X-AW-Number | yes | unique number which will be associated with the script | random number which is less than 1000 | + +## Scripts + +Directory is `scripts`, configuration files have the following fields: + +| Field | Required | Value | Default | +|-------|----------|-------|---------| +| Name | yes | script name | none | +| Comment | no | comment | empty | +| Exec | yes | path to executable file | /usr/bin/true | +| X-AW-Prefix | no | prefix to executable file. Usually it's not required, but in other you may want to specify interpreter for example | +| X-AW-Active | no | whether or not the script is active | true | +| X-AW-Redirect | no | stream redirection. The following variants are available `stderr2stdout`, `nothing`, `stdout2stderr`, `swap`. stderr will be available, if you run application in the debug mode | nothing | +| X-AW-Interval | no | update interval in standard widget intervals | 1 | +| X-AW-Number | yes | unique number which will be associated with the script | random number which is less than 1000 | +| X-AW-Filters | no | comma separated filters from `awesomewidgets-extscripts-filters.json` | + +## Upgrade + +Directory is `upgrade`, configuration files have the following fields: + +| Field | Required | Value | Default | +|-------|----------|-------|---------| +| Name | yes | upgrade name | none | +| Comment | no | comment | empty | +| Exec | yes | path to executable file | /usr/bin/true | +| X-AW-Filter | no | the regexp which will be applied to command output. If set `X-AW-Null` will be ignored | +| X-AW-Active | no | whether or not the upgrade script is active | true | +| X-AW-Null | no | the number of lines which should be skipped in output | 0 | +| X-AW-Interval | no | update interval in standard widget intervals | 1 | +| X-AW-Number | yes | unique number which will be associated with the upgrade script | random number which is less than 1000 | + +## Weather + +The weather uses data and API from [OpenWeatherMap](//openweathermap.org/ "OpenWeatherMap site"). Directory is `weather`, configuration files have the following fields: + +| Field | Required | Value | Default | +|-------|----------|-------|---------| +| Name | yes | weather name | none | +| Comment | no | comment | empty | +| X-AW-City | yes | city | London | +| X-AW-Country | yes | two-letter country code | uk | +| X-AW-Image | no | use images as weather icon or text. | false | +| X-AW-TS | yes | time to which weather should be. `0` is a current weather, `1` - weather 3 hours later, etc | 0 | +| X-AW-Active | no | whether or not the monitor is active | true | +| X-AW-Interval | no | update interval in standard widget intervals | 1 | +| X-AW-Number | yes | unique number which will be associated with the upgrade weather | random number which is less than 1000 | diff --git a/_posts/2015-10-17-cppcheck-and-clang-format.html b/_posts/2015-10-17-cppcheck-and-clang-format.html deleted file mode 100644 index 818f4e0..0000000 --- a/_posts/2015-10-17-cppcheck-and-clang-format.html +++ /dev/null @@ -1,161 +0,0 @@ ---- -category: en -type: paper -hastr: true -layout: paper -tags: development, c++, cmake -title: Add cppcheck and clang-format for a cmake project -short: cppcheck-and-clang-format -description: A small How-To which describes how to add automatic code style checking and static analyser to a project on C++ which uses cmake as a build system. ---- -

Project

-

The project has the following structure:

- -{% highlight bash %} -sources/ -|- CMakeLists.txt -|- 3rdparty/ -|- first_component/ -|- second_component/ -{% endhighlight %} - -

3rdparty is a directory which contains additional libraries and which should be excluded from checking (PROJECT_TRDPARTY_DIR cmake variable is used to indicate path to this directory). Also let's assume that we have additional files (e.g. *.qml) in addition to common source files (*.cpp, *.h).

- -

In addition the described below commands may be inserted to pre-commit hook; it allows us to troll colleagues which will be able to commit nothing till they read CONTRIBUTING.md.

- -

cppcheck

-

As far as there are no good (out-of-box) static analysers in open source we will use it. Knowledgeable people say that cppcheck in case of good configuration it is better than the any alternative, but its configuration is the same that the new project creation. cppcheck shows obvious errors and recommend to fix them.

- -

Example of run

-

Here it is:

- -{% highlight bash %} -cppcheck --enable=warning,performance,portability,information,missingInclude --std=c++11 --library=qt.cfg --template="[{severity}][{id}] {message} {callstack} (On {file}:{line})" --verbose --quiet path/to/source/files/or/directory -{% endhighlight %} - - - -

cmake integration

-

cppcheck.cmake file in the project root:

- -{% highlight cmake %} -# additional target to perform cppcheck run, requires cppcheck - -# get all project files -# HACK this workaround is required to avoid qml files checking ^_^ -file(GLOB_RECURSE ALL_SOURCE_FILES *.cpp *.h) -foreach (SOURCE_FILE ${ALL_SOURCE_FILES}) - string(FIND ${SOURCE_FILE} ${PROJECT_TRDPARTY_DIR} PROJECT_TRDPARTY_DIR_FOUND) - if (NOT ${PROJECT_TRDPARTY_DIR_FOUND} EQUAL -1) - list(REMOVE_ITEM ALL_SOURCE_FILES ${SOURCE_FILE}) - endif () -endforeach () - -add_custom_target( - cppcheck - COMMAND /usr/bin/cppcheck - --enable=warning,performance,portability,information,missingInclude - --std=c++11 - --library=qt.cfg - --template="[{severity}][{id}] {message} {callstack} \(On {file}:{line}\)" - --verbose - --quiet - ${ALL_SOURCE_FILES} -) -{% endhighlight %} - -

cppcheck may work with directories recursive, but I need to skip qml-files checking in my example, because this cppcheck will segfault on some of them. To do it source files search is used followed by the ejection of unnecessary files.

- -

Include to the project (CMakeLists.txt)...

- -{% highlight cmake %} -include(cppcheck.cmake) -{% endhighlight %} - -

...and run:

- -{% highlight bash %} -cmake -make cppcheck -{% endhighlight %} - -

Then edit files to avoid warnings in the future.

- -

Adds

- - -

clang-format

-

clang-format is used to automatic code style checking and correction. astyle, which has a very modest capabilities, and uncrustify, which on the contrary has too many options, should be mentioned from analogues.

- -

Example of run

-{% highlight bash %} -clang-format -i -style=LLVM /path/to/source/files -{% endhighlight %} - -

(Unfortunately it could not work with directories recursive.)

- - - -

cmake integration

-

clang-format.cmake file in the project root:

- -{% highlight cmake %} -# additional target to perform clang-format run, requires clang-format - -# get all project files -file(GLOB_RECURSE ALL_SOURCE_FILES *.cpp *.h) -foreach (SOURCE_FILE ${ALL_SOURCE_FILES}) - string(FIND ${SOURCE_FILE} ${PROJECT_TRDPARTY_DIR} PROJECT_TRDPARTY_DIR_FOUND) - if (NOT ${PROJECT_TRDPARTY_DIR_FOUND} EQUAL -1) - list(REMOVE_ITEM ALL_SOURCE_FILES ${SOURCE_FILE}) - endif () -endforeach () - -add_custom_target( - clangformat - COMMAND /usr/bin/clang-format - -style=LLVM - -i - ${ALL_SOURCE_FILES} -) -{% endhighlight %} - -

There is the same method to get source files list as for cppcheck, because clang-format doesn't support recursive directory search.

- -

Include to the project (CMakeLists.txt)...

- -{% highlight cmake %} -include(clang-format.cmake) -{% endhighlight %} - -

...and run:

- -{% highlight bash %} -cmake -make clangformat -{% endhighlight %} - -

No other actions required.

- -

Adds

- diff --git a/_posts/2015-10-17-cppcheck-and-clang-format.md b/_posts/2015-10-17-cppcheck-and-clang-format.md new file mode 100644 index 0000000..9bf36f9 --- /dev/null +++ b/_posts/2015-10-17-cppcheck-and-clang-format.md @@ -0,0 +1,165 @@ +--- +category: en +type: paper +hastr: true +layout: paper +tags: development, c++, cmake +title: Add cppcheck and clang-format for a cmake project +short: cppcheck-and-clang-format +--- +A small How-To which describes how to add automatic code style checking and static analyser to a project on `C++` which uses `cmake` as a build system. + + + +## Project + +The project has the following structure: + +```bash +sources/ +|- CMakeLists.txt +|- 3rdparty/ +|- first_component/ +|- second_component/ +``` + +**3rdparty** is a directory which contains additional libraries and which should be excluded from checking (`PROJECT_TRDPARTY_DIR` cmake variable is used to indicate path to this directory). Also let's assume that we have additional files (e.g. `*.qml`) in addition to common source files (`*.cpp`, `*.h`). + +In addition the described below commands may be inserted to pre-commit hook; it allows us to troll colleagues which will be able to commit nothing till they read `CONTRIBUTING.md`. + +## cppcheck + +As far as there are no good (out-of-box) static analysers in open source we will use it. Knowledgeable people say that [cppcheck](//cppcheck.sourceforge.net/ "cppcheck site") in case of good configuration it is better than the any alternative, but its configuration is the same that the new project creation. `cppcheck` shows obvious errors and recommend to fix them. + +### Example of run + +Here it is: + +```bash +cppcheck --enable=warning,performance,portability,information,missingInclude --std=c++11 --library=qt.cfg --template="[{severity}][{id}] {message} {callstack} (On {file}:{line})" --verbose --quiet path/to/source/files/or/directory +``` + +* `--enable` says which notifications should be enabled. I've disabled `style` (we will use `clang-format` to do it), `unusedFunction` which shows false-positive for some methods. +* `--std` says which standard should be used. +* `--library=qt.cfg` a configuration file, which describes how to check files. The developers recommend to read the following [manual](//cppcheck.sourceforge.net/manual.pdf "cppcheck manual"). I've used the ready template from `/usr/share/cppcheck/cfg/`. +* `--template` is notification template. +* `---verbose --quiet` are two "conflicting" options. The first one enables more verbose messages, the second one disables progress reports. + +### cmake integration + +`cppcheck.cmake` file in the project root: + +```cmake +# additional target to perform cppcheck run, requires cppcheck + +# get all project files +# HACK this workaround is required to avoid qml files checking ^_^ +file(GLOB_RECURSE ALL_SOURCE_FILES *.cpp *.h) +foreach (SOURCE_FILE ${ALL_SOURCE_FILES}) + string(FIND ${SOURCE_FILE} ${PROJECT_TRDPARTY_DIR} PROJECT_TRDPARTY_DIR_FOUND) + if (NOT ${PROJECT_TRDPARTY_DIR_FOUND} EQUAL -1) + list(REMOVE_ITEM ALL_SOURCE_FILES ${SOURCE_FILE}) + endif () +endforeach () + +add_custom_target( + cppcheck + COMMAND /usr/bin/cppcheck + --enable=warning,performance,portability,information,missingInclude + --std=c++11 + --library=qt.cfg + --template="[{severity}][{id}] {message} {callstack} \(On {file}:{line}\)" + --verbose + --quiet + ${ALL_SOURCE_FILES} +) +``` + +`cppcheck` may work with directories recursive, but I need to skip qml-files checking in my example, because this `cppcheck` will segfault on some of them. To do it source files search is used followed by the ejection of unnecessary files. + +Include to the project (`CMakeLists.txt`)... + +```cmake +include(cppcheck.cmake) +``` + +...and run: + +```bash +cmake +make cppcheck +``` + +Then edit files to avoid warnings in the future. + +### Adds + +* You may add own directories to includes search, using `-I dir` option +* You may drop files and/or directories from checking by using `-i path/to/file/or/directory` option. + +## clang-format + +[clang-format](//clang.llvm.org/docs/ClangFormat.html "clang-format site") is used to automatic code style checking and correction. [astyle](//astyle.sourceforge.net/ "astyle site"), which has a very modest capabilities, and [uncrustify](//uncrustify.sourceforge.net/ "uncrustify site"), which on the contrary has too many options, should be mentioned from analogues. + +### Example of run + +```bash +clang-format -i -style=LLVM /path/to/source/files +``` + +(Unfortunately it **could not** work with directories recursive.) + +* `-i` enables files auto replace (otherwise the result will be printed to stdout). +* `-style` is a style preset selection or from file (`file`), see below. + +### cmake integration + +`clang-format.cmake` file in the project root: + +```cmake +# additional target to perform clang-format run, requires clang-format + +# get all project files +file(GLOB_RECURSE ALL_SOURCE_FILES *.cpp *.h) +foreach (SOURCE_FILE ${ALL_SOURCE_FILES}) + string(FIND ${SOURCE_FILE} ${PROJECT_TRDPARTY_DIR} PROJECT_TRDPARTY_DIR_FOUND) + if (NOT ${PROJECT_TRDPARTY_DIR_FOUND} EQUAL -1) + list(REMOVE_ITEM ALL_SOURCE_FILES ${SOURCE_FILE}) + endif () +endforeach () + +add_custom_target( + clangformat + COMMAND /usr/bin/clang-format + -style=LLVM + -i + ${ALL_SOURCE_FILES} +) +``` + +There is the same method to get source files list as for `cppcheck`, because `clang-format` doesn't support recursive directory search. + +Include to the project (`CMakeLists.txt`)... + +```cmake +include(clang-format.cmake) +``` + +...and run: + +```bash +cmake +make clangformat +``` + +No other actions required. + +### Adds + +* Configuration. You may see all options on the [official site](//clang.llvm.org/docs/ClangFormat.html "clang-format site"). Also you may use [interactive tool](//clangformat.com/ "Site") to search for required options. To use the preset for your style use the following command: + + ```bash + clang-format -style=LLVM -dump-config > .clang-format + ``` + + Then edit generated file `.clang-format`. To enable it you need set `-style=file` option, file should be placed to the any parent directory of each source file (e.g., to the project root). Also you may send required options to the command line directly, e.g. `-style="{BasedOnStyle: llvm, IndentWidth: 8}"` diff --git a/_posts/2016-01-09-url-changes.html b/_posts/2016-01-09-url-changes.html deleted file mode 100644 index 894fd25..0000000 --- a/_posts/2016-01-09-url-changes.html +++ /dev/null @@ -1,10 +0,0 @@ ---- -category: en -type: paper -hastr: true -layout: paper -tags: site -title: URL changes -short: url-changes -description: I would like to inform you that I've changed site and repository URL from arcanis.name to arcanis.me. It was done just because ME domain is more pretty. The old URLs will be still valid till Mar 2016 (date of the domain name registration), but at the moment I've setup URL redirection to the new URL. Sorry for any inconvenience. ---- diff --git a/_posts/2016-01-09-url-changes.md b/_posts/2016-01-09-url-changes.md new file mode 100644 index 0000000..cfac2b9 --- /dev/null +++ b/_posts/2016-01-09-url-changes.md @@ -0,0 +1,11 @@ +--- +category: en +type: paper +hastr: true +layout: paper +tags: site +title: URL changes +short: url-changes +--- + +I would like to inform you that I've changed site and repository URL from [arcanis.name](//arcanis.name) to [arcanis.me](//arcanis.me). It was done just because ME domain is more pretty. The old URLs will be still valid till Mar 2016 (date of the domain name registration), but at the moment I've setup URL redirection to the new URL. Sorry for any inconvenience. diff --git a/blog/index.html b/blog/index.html index d9f6bd9..ac451f3 100644 --- a/blog/index.html +++ b/blog/index.html @@ -23,6 +23,6 @@ hastr: true {{ post.title }}

{{ post.date | date_to_string }}

-

{{ post.description }}

+

{{ post.excerpt }}

Tags: {{ post.tags }}

{% endfor %} diff --git a/feed-short.xml b/feed-short.xml index 9e1a628..4ce6faf 100644 --- a/feed-short.xml +++ b/feed-short.xml @@ -18,7 +18,7 @@ {% else %} {{ post.title | xml_escape }} - {{ post.description | xml_escape }} + {{ post.excerpt | xml_escape }} {{ post.date | date: "%a, %d %b %Y %H:%M:%S %z" }} {{ site.url }}{{ post.url }} {{ site.url }}{{ post.url }} diff --git a/feed.xml b/feed.xml index 716e902..504af9b 100644 --- a/feed.xml +++ b/feed.xml @@ -19,7 +19,6 @@ {{ post.title | xml_escape }} - {{ post.description | xml_escape }} {{ post.content | xml_escape}} {{ post.date | date: "%a, %d %b %Y %H:%M:%S %z" }} diff --git a/ru/_posts/2014-01-14-about-zshrc.html b/ru/_posts/2014-01-14-about-zshrc.md similarity index 60% rename from ru/_posts/2014-01-14-about-zshrc.html rename to ru/_posts/2014-01-14-about-zshrc.md index c7aad66..27ea16e 100644 --- a/ru/_posts/2014-01-14-about-zshrc.html +++ b/ru/_posts/2014-01-14-about-zshrc.md @@ -6,32 +6,37 @@ layout: paper tags: zshrc, настройка, linux title: О zshrc short: about-zshrc -description: Это моя первая статья в блоге (я думаю, мне нужно что-нибудь для тестов =)). Существует множество похожих статей и, я думаю, не буду отличаться от большинства. Я просто хочу показать мой .zshrc и объяснить, что в нем есть и зачем оно нужно. Также, любые комментарии или дополнения приветствуются. Оригинал статьи. --- -

Подготовка

-

Сначала установите необходимый минимум:

+Это моя первая статья в блоге (я думаю, мне нужно что-нибудь для тестов =)). Существует множество похожих статей и, я думаю, не буду отличаться от большинства. Я просто хочу показать мой `.zshrc` и объяснить, что в нем есть и зачем оно нужно. Также, любые комментарии или дополнения приветствуются. [Оригинал](//archlinux.org.ru/forum/topic/12752/ "Тема на форуме") статьи. -{% highlight bash %} + + +## Подготовка + +Сначала установите необходимый минимум: + +```bash pacman -Sy pkgfile zsh zsh-completions zsh-syntax-highlighting -{% endhighlight %} +``` -

pkgfile очень полезная утилита. Данная команда также установит шелл, дополнения к нему и подсветку синтаксиса.

+[pkgfile](//www.archlinux.org/packages/pkgfile/ "Пакет Archlinux") очень полезная утилита. Данная команда также установит шелл, дополнения к нему и подсветку синтаксиса. -

Настройка шелла

-

Все доступные опции приведены здесь.

+## Настройка шелла -

Указываем файл с историей, число команд хранящихся в кэше текущего сеанса и число команд, хранящихся в файле:

+Все доступные опции приведены [здесь](//zsh.sourceforge.net/Doc/Release/Options.html "Документация zsh"). -{% highlight bash %} +Указываем файл с историей, число команд хранящихся в кэше текущего сеанса и число команд, хранящихся в файле: + +```bash # history HISTFILE=~/.zsh_history HISTSIZE=500000 SAVEHIST=500000 -{% endhighlight %} +``` -

Я не могу запомнить все комбинации Ctrl+, поэтому я назначаю клавиши на их стандартное использование:

+Я не могу запомнить все комбинации `Ctrl+`, поэтому я назначаю клавиши на их стандартное использование: -{% highlight bash %} +```bash # bindkeys bindkey '^[[A' up-line-or-search # up arrow for back-history-search bindkey '^[[B' down-line-or-search # down arrow for fwd-history-search @@ -41,106 +46,106 @@ bindkey '\e[3~' delete-char # del bindkey '\e[4~' end-of-line # end bindkey '\e[5~' up-line-or-history # page-up bindkey '\e[6~' down-line-or-history # page-down -{% endhighlight %} +``` -

Но здесь важно, что стрелки вверх/вниз служат для навигации по истории с учетом уже введенной части команды. А PgUp/PgDown проигнорируют уже введенную часть команды.

+Но здесь важно, что стрелки `вверх`/`вниз` служат для навигации по истории с учетом **уже введенной части** команды. А `PgUp`/`PgDown` **проигнорируют** уже введенную часть команды. -

Автодополнение команд:

+Автодополнение команд: -{% highlight bash %} +```bash # autocomplete autoload -U compinit compinit zstyle ':completion:*' insert-tab false zstyle ':completion:*' max-errors 2 -{% endhighlight %} +``` -

Подключается полное автодополнение команд. insert-tab false включит автодополнение для невведенной команды (не знаю, зачем). max-errors устанавливает максимальное число опечаток, которые могут быть исправлены.

+Подключается полное автодополнение команд. `insert-tab false` включит автодополнение для **невведенной** команды (не знаю, зачем). `max-errors` устанавливает максимальное число опечаток, которые могут быть исправлены. -

Приглашение:

+Приглашение: -{% highlight bash %} +```bash # promptinit autoload -U promptinit promptinit -{% endhighlight %} +``` -

Включим цвета:

+Включим цвета: -{% highlight bash %} +```bash # colors autoload -U colors colors -{% endhighlight %} +``` -

Различные опции.

-

Смена директории без ввода cd:

+Различные опции. +Смена директории без ввода `cd`: -{% highlight bash %} +```bash # autocd setopt autocd -{% endhighlight %} +``` -

Корректировка опечаток (и шаблон вопроса):

+Корректировка опечаток (и шаблон вопроса): -{% highlight bash %} +```bash # correct setopt CORRECT_ALL SPROMPT="Correct '%R' to '%r' ? ([Y]es/[N]o/[E]dit/[A]bort) " -{% endhighlight %} +``` -

Отключаем е#$%ую пищалку:

+Отключаем е#$%ую пищалку: -{% highlight bash %} +```bash # disable beeps unsetopt beep -{% endhighlight %} +``` -

Включаем калькулятор:

+Включаем калькулятор: -{% highlight bash %} +```bash # calc autoload zcalc -{% endhighlight %} +``` -

Дополнение истории (а не перезапись файла):

+Дополнение истории (**а не перезапись** файла): -{% highlight bash %} +```bash # append history setopt APPEND_HISTORY -{% endhighlight %} +``` -

Не сохранять дубликаты в историю:

+Не сохранять дубликаты в историю: -{% highlight bash %} +```bash # ignore dups in history setopt HIST_IGNORE_ALL_DUPS -{% endhighlight %} +``` -

...и дополнительные пробелы:

+...и дополнительные пробелы: -{% highlight bash %} +```bash # ignore spaces in history setopt HIST_IGNORE_SPACE -{% endhighlight %} +``` -

...и пустые линии тоже:

+...и пустые линии тоже: -{% highlight bash %} +```bash # reduce blanks in history setopt HIST_REDUCE_BLANKS -{% endhighlight %} +``` -

Включаем pkgfile:

+Включаем `pkgfile`: -{% highlight bash %} +```bash # pkgfile source /usr/share/doc/pkgfile/command-not-found.zsh -{% endhighlight %} +``` -

Подсветка синтаксиса

+## Подсветка синтаксиса -{% highlight bash %} +```bash # highlighting source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh ZSH_HIGHLIGHT_HIGHLIGHTERS=(main brackets pattern) @@ -185,14 +190,15 @@ ZSH_HIGHLIGHT_STYLES[double-quoted-argument]='fg=yellow' # конс #ZSH_HIGHLIGHT_PATTERNS+=('rm -rf *' 'fg=white,bold,bg=red') # root #ZSH_HIGHLIGHT_STYLES[root]='bg=red' -{% endhighlight %} +``` -

В первой строке включаем подсветку. Затем включаем основную подсветку, а также подсветку скобок и шаблонов. Шаблоны указываются ниже (rm -rf * в примере). Также может быть включена подсветка команд от root и курсора cursor. Синтаксис настроек понятен, fg цвет шрифта, bg цвет фона.

+В первой строке включаем подсветку. Затем включаем основную подсветку, а также подсветку скобок и шаблонов. Шаблоны указываются ниже (`rm -rf *` в примере). Также может быть включена подсветка команд от `root` и курсора `cursor`. Синтаксис настроек понятен, `fg` цвет шрифта, `bg` цвет фона. -

$PROMPT и $RPROMPT

-

Я хочу использовать один файл .zshrc для рута и обычного пользователя:

+## $PROMPT и $RPROMPT -{% highlight bash %} +Я хочу использовать один файл `.zshrc` для рута и обычного пользователя: + +```bash # PROMPT && RPROMPT if [[ $EUID == 0 ]]; then # [root@host dir]# @@ -211,11 +217,11 @@ else %{$fg_bold[yellow]%}%1/%{$reset_color%}\ %{$fg_bold[white]%}]$ %{$reset_color%}" fi -{% endhighlight %} +``` -

fg цвет шрифта, bg цвет фона. _bold и _no_bold регулируют оттенок. Команды должны быть обрамлены в %{ ... %}, чтобы не показывались. Доступные цвета:

+`fg` цвет шрифта, `bg` цвет фона. `_bold` и `_no_bold` регулируют оттенок. Команды должны быть обрамлены в `%{ ... %}`, чтобы не показывались. Доступные цвета: -{% highlight bash %} +```bash black red green @@ -224,11 +230,11 @@ blue magenta cyan white -{% endhighlight %} +``` -

Доступные переменные:

+Доступные переменные: -{% highlight bash %} +```bash %n - имя пользователя %m - хостнейм (выставляется только в начале сессии) %M - хостнейм @@ -241,11 +247,11 @@ white %d - текущая директория %~ - то же, домашняя директория будет заменена на ~ %1/ - то же, но только последняя директория -{% endhighlight %} +``` -

RPROMPT (необходим пакет acpi):

+RPROMPT (необходим пакет `acpi`): -{% highlight bash %} +```bash precmd () { # battery charge function batcharge { @@ -268,25 +274,26 @@ $(batcharge)\ "%{$fg_bold[white]%}[%{$reset_color%}"\ $returncode\ "%{$fg_bold[white]%}]%{$reset_color%}" -{% endhighlight %} +``` -

Мой RPROMPT показывает текущее время, заряд батареи и код возврата последнего приложения. precmd() необходимо для автоматического обновления. Конструкция $(if.true.false) является условным оператором в zsh.

+Мой RPROMPT показывает текущее время, заряд батареи и код возврата последнего приложения. `precmd()` необходимо для автоматического обновления. Конструкция `$(if.true.false)` является условным оператором в `zsh`. -

Аллиасы

-

Копируйте только те аллиасы, которые Вам необходимы. Если какой-либо аллиас использует приложение, которое не установлено, это приведет к сбою загрузки конфигурационного файла.

+## Аллиасы -

Полезная (или не очень) функция:

+**Копируйте только те аллиасы, которые Вам необходимы.** Если какой-либо аллиас использует приложение, которое не установлено, это приведет к сбою загрузки конфигурационного файла. -{% highlight bash %} +Полезная (или не очень) функция: + +```bash show_which() { OUTPUT=$(which $1 | cut -d " " -f7-) echo "Running '$OUTPUT'" 1>&2 } -{% endhighlight %} +``` -

Первая группа аллиасов:

+Первая группа аллиасов: -{% highlight bash %} +```bash ## alias # цветной grep alias grep='grep --colour=auto' @@ -302,11 +309,11 @@ alias du='show_which du && du -k --total --human-readable' # замена less и zless на vimpager alias less='vimpager' alias zless='vimpager' -{% endhighlight %} +``` -

ls аллиасы (смотри man ls):

+ls аллиасы (смотри [man ls](//unixhelp.ed.ac.uk/CGI/man-cgi?ls "Мануал")): -{% highlight bash %} +```bash alias ls='show_which ls && ls --color=auto --group-directories-first' alias ll='show_which ll && ls -l --human-readable' alias lr='show_which lr && ls --recursive' @@ -315,11 +322,11 @@ alias lx='show_which lx && ll -X --ignore-backups' alias lz='show_which lz && ll -S --reverse' alias lt='show_which lt && ll -t --reverse' alias lm='show_which lm && la | more' -{% endhighlight %} +``` -

Аллиасы для быстрого просмотра файлов из консоли (просто набери имя файла!):

+Аллиасы для быстрого просмотра файлов из консоли (просто набери имя файла!): -{% highlight bash %} +```bash # alias -s alias -s {avi,mpeg,mpg,mov,m2v,mkv}=mpv alias -s {mp3,flac}=qmmp @@ -327,11 +334,11 @@ alias -s {odt,doc,xls,ppt,docx,xlsx,pptx,csv}=libreoffice alias -s {pdf}=okular autoload -U pick-web-browser alias -s {html,htm}=opera -{% endhighlight %} +``` -

"sudo" аллиасы:

+"sudo" аллиасы: -{% highlight bash %} +```bash # sudo alias if [[ $EUID == 0 ]]; then alias fat32mnt='show_which fat32mnt && mount -t vfat -o codepage=866,iocharset=utf8,umask=000' @@ -351,23 +358,24 @@ else alias staging-i686-build='show_which staging-i686-build && sudo staging-i686-build' alias staging-x86_64-build='show_which staging-x86_64-build && sudo staging-x86_64-build' fi -{% endhighlight %} +``` -

Некоторые глобальные аллиасы. Если они включены, команда cat foo g bar будет эквивалентна cat foo | grep bar:

+Некоторые глобальные аллиасы. Если они включены, команда `cat foo g bar` будет эквивалентна `cat foo | grep bar`: -{% highlight bash %} +```bash # global alias alias -g g="| grep" alias -g l="| less" alias -g t="| tail" alias -g h="| head" alias -g dn="&> /dev/null &" -{% endhighlight %} +``` -

Функции

-

Специальная функция для xrandr:

+## Функции -{% highlight bash %} +Специальная функция для `xrandr`: + +```bash # function to contorl xrandr # EXAMPLE: projctl 1024x768 projctl () { @@ -388,11 +396,11 @@ projctl () { xrandr --output VGA1 --mode 1366x768 --output LVDS1 --mode 1366x768 fi } -{% endhighlight %} +``` -

К сожалению, я не могу запомнить флаги tar, поэтому я использую специальные функции:

+К сожалению, я не могу запомнить флаги `tar`, поэтому я использую специальные функции: -{% highlight bash %} +```bash # function to extract archives # EXAMPLE: unpack file unpack () { @@ -442,11 +450,11 @@ pack () { echo "'$1' is not a valid file" fi } -{% endhighlight %} +``` -

Специальная функция для su:

+Специальная функция для `su`: -{% highlight bash %} +```bash su () { CHECKSU=0 for FLAG in $*; do @@ -461,11 +469,11 @@ su () { /usr/bin/su $* fi } -{% endhighlight %} +``` -

Функция, которая заменяет оригиналькую команду rm. Если Вы наберете rm, это будет эквивалентно перемещению в корзину, также, Вы можете легко восстановить удаленный файл:

+Функция, которая заменяет оригиналькую команду `rm`. Если Вы наберете `rm`, это будет эквивалентно перемещению в корзину, также, Вы можете легко восстановить удаленный файл: -{% highlight bash %} +```bash rm () { # error check [ $# -eq 0 ] && { echo "Files are not set!"; return 1 } @@ -505,11 +513,11 @@ rm () { fi done } -{% endhighlight %} +``` -

Функция для автоматических обновлений путей после установки пакетов:

+Функция для автоматических обновлений путей после установки пакетов: -{% highlight bash %} +```bash pacman () { /usr/bin/sudo /usr/bin/pacman $* && echo "$*" | grep -q "S\|R\|U" && rehash } @@ -520,14 +528,15 @@ yaourt () { yatest () { /usr/bin/yaourt --config /etc/pactest.conf $* && echo "$*" | grep -q "S\|R\|U" && rehash } -{% endhighlight %} +``` -

Переменные

-

Рекомендуется хранить свои переменные в ~/.zshenv. Но я все храню в одном файле.

+## Переменные -

Пути, маска создаваемых файлов, редактор и пейджер:

+Рекомендуется хранить свои переменные в `~/.zshenv`. Но я все храню в одном файле. -{% highlight bash %} +Пути, маска создаваемых файлов, редактор и пейджер: + +```bash # path export PATH="$PATH:$HOME/.local/bin" # umask @@ -535,25 +544,27 @@ umask 022 # editor export EDITOR="vim" export PAGER="vimpager" -{% endhighlight %} +``` -

Хэши. Если они включены, команда ~global будет эквивалентна команде /mnt/global:

+Хэши. Если они включены, команда `~global` будет эквивалентна команде `/mnt/global`: -{% highlight bash %} +```bash # hash hash -d global=/mnt/global hash -d windows=/mnt/windows hash -d iso=/mnt/iso hash -d u1=/mnt/usbdev1 hash -d u2=/mnt/usbdev2 -{% endhighlight %} +``` + +## Скриншот -

Скриншот

{% assign scrdesc = "Как оно выглядит" %} {% assign scrname = "zshrc_demo" %} {% include prj_scr.html %}
-

Файл

-

Мой .zshrc.

+## Файл + +[Мой](//raw.github.com/arcan1s/dotfiles/master/zshrc "Github") `.zshrc`. diff --git a/ru/_posts/2014-01-21-building-qutim-using-qt5.html b/ru/_posts/2014-01-21-building-qutim-using-qt5.html deleted file mode 100644 index 73dfc89..0000000 --- a/ru/_posts/2014-01-21-building-qutim-using-qt5.html +++ /dev/null @@ -1,203 +0,0 @@ ---- -category: ru -type: paper -hastr: true -layout: paper -tags: archlinux, linux, сборка, qutim -title: Сборка Qutim с Qt5 -short: building-qutim-using-qt5 -description: Если кто-то не знает, Qutim - мультипротокольный кросс-платформенный месседжер. Написан он на CPP с использованием библиотек Qt. Проект активно развивается. В этой статье речь пойдет о реализации сборки данного пакета в Archlinux с использованием библиотек Qt5 (а не Qt4, как это делают текущие пакеты в AUR). ---- -

Что не так?

-

Да все так. Просто пакет использует для сборки систему qbs, которая, на мой взгляд, немного странная. Пакет, необходимый для сборки, находится в AUR (рекомендую git-версию). Когда я спросил у Andrea Scarpino (который сопровождает все KDE и Qt пакеты в официальные репозитории) по поводу переноса этого пакета в репозитории, он ответил, что всему свое время. В принципе, я с ним согласен, так как проект, судя по всему, еще немного сыроват.

- -

Подготовка

-

Установим зависимости. Что-то может быть пропустил, зависимости сканировал с использованием namcap:

- -{% highlight bash %} -pacman -Sy --asdeps clang git libc++abi qt5-quick1 qt5-x11extras -yaourt -S --asdeps jreen-git qbs-git -{% endhighlight %} - -

Настройка qbs

-

Желающие могут почитать документацию по ссылке или посмотреть примеры (включены в пакет). Загвоздка в том, что эта штука использует файл настроек, который, во-первых, нужно сначала сгенерировать, во-вторых, хранится в домашней директории (и только там). В теории, генерация файла настроек (~/.config/QtProject/qbs.conf) происходит следующим образом:

- -{% highlight bash %} -qbs-setup-qt --detect -qbs-detect-toolchains -{% endhighlight %} - -

Сначала находим Qt для сборки, потом находим инструментарий (компиляторы, например). Дальше вставляем инструментарий (например, нам для Qutim нужен clang) в Qt, например, так:

- -{% highlight bash %} -sed 's/clang\\/qt-5-2-0\\/g' -i ~/.config/QtProject/qbs.conf -{% endhighlight %} - -

Альтернативные варианты - править файл вручную или воспользоваться qbs-config-ui или qbs-config на Ваш выбор.

-

Так или иначе, нужный файл мы сгенерировали, сохраним его в будущей директории сборки:

- -{% highlight ini %} -[General] - -[Qt] -filedialog= - -[profiles] -clang\cpp\compilerName=clang++ -clang\cpp\toolchainInstallPath=/usr/bin -clang\qbs\architecture=x86_64 -clang\qbs\endianness=little -clang\qbs\toolchain=clang, llvm, gcc -gcc\cpp\compilerName=g++ -gcc\cpp\toolchainInstallPath=/usr/bin -gcc\qbs\architecture=x86_64 -gcc\qbs\endianness=little -gcc\qbs\toolchain=gcc -qutim\Qt\core\binPath=/usr/lib/qt/bin -qutim\Qt\core\buildVariant=release -qutim\Qt\core\config=shared, qpa, no_mocdepend, release, qt_no_framework -qutim\Qt\core\docPath=/usr/share/doc/qt -qutim\Qt\core\incPath=/usr/include/qt -qutim\Qt\core\libInfix= -qutim\Qt\core\libPath=/usr/lib -qutim\Qt\core\mkspecPath=/usr/lib/qt/mkspecs/linux-g++ -qutim\Qt\core\namespace= -qutim\Qt\core\pluginPath=/usr/lib/qt/plugins -qutim\Qt\core\qtConfig=minimal-config, small-config, medium-config, large-config, full-config, gtk2, gtkstyle, fontconfig, libudev, evdev, xlib, xcb-glx, xcb-xlib, xcb-sm, xrender, accessibility-atspi-bridge, linuxfb, c++11, accessibility, opengl, shared, qpa, reduce_exports, reduce_relocations, clock-gettime, clock-monotonic, mremap, getaddrinfo, ipv6ifname, getifaddrs, inotify, eventfd, system-jpeg, system-png, png, system-freetype, no-harfbuzz, system-zlib, nis, cups, iconv, glib, dbus, dbus-linked, openssl-linked, xcb, xinput2, alsa, pulseaudio, icu, concurrent, audio-backend, release -qutim\Qt\core\version=5.2.0 -qutim\cpp\compilerName=clang++ -qutim\cpp\toolchainInstallPath=/usr/bin -qutim\qbs\architecture=x86_64 -qutim\qbs\endianness=little -qutim\qbs\toolchain=clang, llvm, gcc -{% endhighlight %} - -

qbs-qutim.conf

- -

Готовим патч для исходников

-

Первая проблема - clang (по крайней мере, в Archlinux):

- -{% highlight diff %} -diff -ruN qutim.orig/core/libqutim.qbs qutim/core/libqutim.qbs ---- qutim.orig/core/libqutim.qbs 2014-01-06 15:39:56.000000000 +0400 -+++ qutim/core/libqutim.qbs 2014-01-06 15:44:54.502175067 +0400 -@@ -75,7 +75,7 @@ - cpp.linkerFlags: { - var flags = base; - if (qbs.toolchain.contains("clang") && qbs.targetOS.contains("linux")) -- flags = flags.concat("-stdlib=libc++ -lcxxrt"); -+ flags = flags.concat("-lc++abi"); - return flags; - } - -{% endhighlight %} - -

И пофиксить сборку библиотеки для Vk:

- -{% highlight diff %} -diff -ruN qutim.orig/protocols/vkontakte/vreen/vreen.qbs qutim/protocols/vkontakte/vreen/vreen.qbs ---- qutim.orig/protocols/vkontakte/vreen/vreen.qbs 2014-01-06 15:41:42.000000000 +0400 -+++ qutim/protocols/vkontakte/vreen/vreen.qbs 2014-01-06 15:46:47.142178486 +0400 -@@ -5,6 +5,7 @@ - property string vreen_qml_path: "bin" - property string vreen_lib_path: "lib" - property string vreen_libexec_path: "lib" -+ property string lib_path: "lib" - - property string vreen_version_major: 1 - property string vreen_version_minor: 9 -{% endhighlight %} - -

qutim-qbs-1.1.patch

- -

Получаем исходники

- -{% highlight bash %} -# клонируем репозиторий -git clone https://github.com/euroelessar/qutim -# кладем файл настроек qbs -mkdir -p .config/QtProject -cp qbs-qutim.conf .config/QtProject/qbs.conf -# создаем директорию сборки -mkdir build -# обновляем подмодули -cd qutim -git submodule update --init --recursive -# патчим -cd .. -patch -p0 -i qutim-qbs-1.1.patch -{% endhighlight %} - -

Сборка

- -{% highlight bash %} -cd qutim -HOME=$(pwd) qbs -j $(nproc) -d ../build release profile:qutim -{% endhighlight %} - -

Я пытался сделать универсальный способ сборки пакета, поэтому такое странное переназначение домашней директории. Флаг -j указывает число потоков сборки, флаг -d директорию сборки, release тип сборки (debug, release), profile используемый профиль, описанный в файле настроек.

- -

Установка

- -{% highlight bash %} -HOME=$(pwd) sudo qbs install -d ../build --install-root "/usr" profile:qutim -{% endhighlight %} - -

Из нового - указание корневого каталога (--install-root). Без этого пакет будет установлен в / (/bin и /lib).

- -

PKGBUILD

- -{% highlight bash %} -pkgname=qutim-qt5-git -_gitname=qutim -pkgver=v0.3.1.967.gc56d61e -pkgrel=1 -pkgdesc="Multiplatform instant messenger (qt5 build). Git version" -arch=('i686' 'x86_64') -url="http://qutim.org" -license=('LGPL' 'GPL3') -depends=('jreen-git' 'libc++abi' 'qt5-quick1' 'qt5-x11extras') -makedepends=('clang' 'qbs') -conflicts=(qutim-0.2_ru-git, qutim-0.3-git, qutim-stable, qutim-git) -source=("${_gitname}::git+https://github.com/euroelessar/qutim.git" - "qutim-qbs-1.1.patch" - "qbs-qutim.conf") -md5sums=('SKIP' - '12c30176729a5230ff7e6effbb1b37f8' - '40f096b269eb00b040035591fce8e259') - -pkgver() { - cd "${_gitname}" - git describe --always | sed 's|-|.|g' -} - -prepare() { - # FIXME: dirty hack - mkdir -p "${srcdir}/.config/QtProject" - cp "${srcdir}/qbs-qutim.conf" "${srcdir}/.config/QtProject/qbs.conf" - # create build directory - if [[ -d ${srcdir}/build ]]; then - rm -rf "${srcdir}/build" - fi - mkdir "${srcdir}/build" - - cd "${_gitname}" - # update modules - git submodule update --init --recursive - # fix qbs build - cd .. - patch -p0 -i "${srcdir}/qutim-qbs-1.1.patch" -} - -build() { - cd "${_gitname}" - HOME="${srcdir}" qbs -j $(nproc) -d ../build release profile:qutim -} - -package() { - cd "${srcdir}/${_gitname}" - HOME="${srcdir}" qbs install -d ../build --install-root "${pkgdir}/usr" profile:qutim -} -{% endhighlight %} - -

PKGBUILD

diff --git a/ru/_posts/2014-01-21-building-qutim-using-qt5.md b/ru/_posts/2014-01-21-building-qutim-using-qt5.md new file mode 100644 index 0000000..8b76854 --- /dev/null +++ b/ru/_posts/2014-01-21-building-qutim-using-qt5.md @@ -0,0 +1,210 @@ +--- +category: ru +type: paper +hastr: true +layout: paper +tags: archlinux, linux, сборка, qutim +title: Сборка Qutim с Qt5 +short: building-qutim-using-qt5 +--- +Если кто-то не знает, [Qutim](//qutim.org "Домашняя страница Qutim") - мультипротокольный кросс-платформенный месседжер. Написан он на `CPP` с использованием библиотек Qt. Проект активно развивается. В этой статье речь пойдет о реализации сборки данного пакета в Archlinux с использованием библиотек Qt5 (а не Qt4, как это делают текущие пакеты в AUR). + + + +## Что не так? + +Да все так. Просто пакет использует для сборки систему [qbs](//qt-project.org/wiki/qbs "Wiki"), которая, на мой взгляд, немного странная. Пакет, необходимый для сборки, [находится в AUR](//aur.archlinux.org/packages/qbs-git/ "AUR") (рекомендую git-версию). Когда я спросил у Andrea Scarpino (который сопровождает все KDE и Qt пакеты в официальные репозитории) по поводу переноса этого пакета в репозитории, он ответил, что всему свое время. В принципе, я с ним согласен, так как проект, судя по всему, еще немного сыроват. + +## Подготовка + +Установим зависимости. Что-то может быть пропустил, зависимости сканировал с использованием `namcap`: + +```bash +pacman -Sy --asdeps clang git libc++abi qt5-quick1 qt5-x11extras +yaourt -S --asdeps jreen-git qbs-git +``` + +### Настройка qbs + +Желающие могут почитать документацию [по ссылке](//qt-project.org/wiki/qbs "Wiki") или посмотреть примеры (включены в пакет). Загвоздка в том, что эта штука использует файл настроек, который, во-первых, нужно сначала сгенерировать, во-вторых, хранится в домашней директории (и только там). В теории, генерация файла настроек (`~/.config/QtProject/qbs.conf`) происходит следующим образом: + +```bash +qbs-setup-qt --detect +qbs-detect-toolchains +``` + +Сначала находим Qt для сборки, потом находим инструментарий (компиляторы, например). Дальше вставляем инструментарий (например, нам для Qutim нужен `clang`) в Qt, например, так: + +```bash +sed 's/clang\\/qt-5-2-0\\/g' -i ~/.config/QtProject/qbs.conf +``` + +Альтернативные варианты - править файл вручную или воспользоваться `qbs-config-ui` или `qbs-config` на Ваш выбор. +Так или иначе, нужный файл мы сгенерировали, сохраним его в будущей директории сборки: + +```ini +[General] + +[Qt] +filedialog= + +[profiles] +clang\cpp\compilerName=clang++ +clang\cpp\toolchainInstallPath=/usr/bin +clang\qbs\architecture=x86_64 +clang\qbs\endianness=little +clang\qbs\toolchain=clang, llvm, gcc +gcc\cpp\compilerName=g++ +gcc\cpp\toolchainInstallPath=/usr/bin +gcc\qbs\architecture=x86_64 +gcc\qbs\endianness=little +gcc\qbs\toolchain=gcc +qutim\Qt\core\binPath=/usr/lib/qt/bin +qutim\Qt\core\buildVariant=release +qutim\Qt\core\config=shared, qpa, no_mocdepend, release, qt_no_framework +qutim\Qt\core\docPath=/usr/share/doc/qt +qutim\Qt\core\incPath=/usr/include/qt +qutim\Qt\core\libInfix= +qutim\Qt\core\libPath=/usr/lib +qutim\Qt\core\mkspecPath=/usr/lib/qt/mkspecs/linux-g++ +qutim\Qt\core\namespace= +qutim\Qt\core\pluginPath=/usr/lib/qt/plugins +qutim\Qt\core\qtConfig=minimal-config, small-config, medium-config, large-config, full-config, gtk2, gtkstyle, fontconfig, libudev, evdev, xlib, xcb-glx, xcb-xlib, xcb-sm, xrender, accessibility-atspi-bridge, linuxfb, c++11, accessibility, opengl, shared, qpa, reduce_exports, reduce_relocations, clock-gettime, clock-monotonic, mremap, getaddrinfo, ipv6ifname, getifaddrs, inotify, eventfd, system-jpeg, system-png, png, system-freetype, no-harfbuzz, system-zlib, nis, cups, iconv, glib, dbus, dbus-linked, openssl-linked, xcb, xinput2, alsa, pulseaudio, icu, concurrent, audio-backend, release +qutim\Qt\core\version=5.2.0 +qutim\cpp\compilerName=clang++ +qutim\cpp\toolchainInstallPath=/usr/bin +qutim\qbs\architecture=x86_64 +qutim\qbs\endianness=little +qutim\qbs\toolchain=clang, llvm, gcc +``` + +[qbs-qutim.conf](/resources/docs/qutim-qt5-git/qbs-qutim.conf "Файл") + +### Готовим патч для исходников + +Первая проблема - `clang` (по крайней мере, в Archlinux): + +```diff +diff -ruN qutim.orig/core/libqutim.qbs qutim/core/libqutim.qbs +--- qutim.orig/core/libqutim.qbs 2014-01-06 15:39:56.000000000 +0400 ++++ qutim/core/libqutim.qbs 2014-01-06 15:44:54.502175067 +0400 +@@ -75,7 +75,7 @@ + cpp.linkerFlags: { + var flags = base; + if (qbs.toolchain.contains("clang") && qbs.targetOS.contains("linux")) +- flags = flags.concat("-stdlib=libc++ -lcxxrt"); ++ flags = flags.concat("-lc++abi"); + return flags; + } + +``` + +И пофиксить сборку библиотеки для Vk: + +```diff +diff -ruN qutim.orig/protocols/vkontakte/vreen/vreen.qbs qutim/protocols/vkontakte/vreen/vreen.qbs +--- qutim.orig/protocols/vkontakte/vreen/vreen.qbs 2014-01-06 15:41:42.000000000 +0400 ++++ qutim/protocols/vkontakte/vreen/vreen.qbs 2014-01-06 15:46:47.142178486 +0400 +@@ -5,6 +5,7 @@ + property string vreen_qml_path: "bin" + property string vreen_lib_path: "lib" + property string vreen_libexec_path: "lib" ++ property string lib_path: "lib" + + property string vreen_version_major: 1 + property string vreen_version_minor: 9 +``` + +[qutim-qbs-1.1.patch](/resources/docs/qutim-qt5-git/qutim-qbs-1.1.patch "Файл") + +### Получаем исходники + +```bash +# клонируем репозиторий +git clone https://github.com/euroelessar/qutim +# кладем файл настроек qbs +mkdir -p .config/QtProject +cp qbs-qutim.conf .config/QtProject/qbs.conf +# создаем директорию сборки +mkdir build +# обновляем подмодули +cd qutim +git submodule update --init --recursive +# патчим +cd .. +patch -p0 -i qutim-qbs-1.1.patch +``` + +## Сборка + +```bash +cd qutim +HOME=$(pwd) qbs -j $(nproc) -d ../build release profile:qutim +``` + +Я пытался сделать универсальный способ сборки пакета, поэтому такое странное переназначение домашней директории. Флаг `-j` указывает число потоков сборки, флаг `-d` директорию сборки, `release` тип сборки (debug, release), `profile` используемый профиль, описанный в файле настроек. + +## Установка + +```bash +HOME=$(pwd) sudo qbs install -d ../build --install-root "/usr" profile:qutim +``` + +Из нового - указание корневого каталога (`--install-root`). Без этого пакет будет установлен в `/` (`/bin` и `/lib`). + +## PKGBUILD + +```bash +pkgname=qutim-qt5-git +_gitname=qutim +pkgver=v0.3.1.967.gc56d61e +pkgrel=1 +pkgdesc="Multiplatform instant messenger (qt5 build). Git version" +arch=('i686' 'x86_64') +url="http://qutim.org" +license=('LGPL' 'GPL3') +depends=('jreen-git' 'libc++abi' 'qt5-quick1' 'qt5-x11extras') +makedepends=('clang' 'qbs') +conflicts=(qutim-0.2_ru-git, qutim-0.3-git, qutim-stable, qutim-git) +source=("${_gitname}::git+https://github.com/euroelessar/qutim.git" + "qutim-qbs-1.1.patch" + "qbs-qutim.conf") +md5sums=('SKIP' + '12c30176729a5230ff7e6effbb1b37f8' + '40f096b269eb00b040035591fce8e259') + +pkgver() { + cd "${_gitname}" + git describe --always | sed 's|-|.|g' +} + +prepare() { + # FIXME: dirty hack + mkdir -p "${srcdir}/.config/QtProject" + cp "${srcdir}/qbs-qutim.conf" "${srcdir}/.config/QtProject/qbs.conf" + # create build directory + if [[ -d ${srcdir}/build ]]; then + rm -rf "${srcdir}/build" + fi + mkdir "${srcdir}/build" + + cd "${_gitname}" + # update modules + git submodule update --init --recursive + # fix qbs build + cd .. + patch -p0 -i "${srcdir}/qutim-qbs-1.1.patch" +} + +build() { + cd "${_gitname}" + HOME="${srcdir}" qbs -j $(nproc) -d ../build release profile:qutim +} + +package() { + cd "${srcdir}/${_gitname}" + HOME="${srcdir}" qbs install -d ../build --install-root "${pkgdir}/usr" profile:qutim +} +``` + +[PKGBUILD](/resources/docs/qutim-qt5-git/PKGBUILD "Файл") diff --git a/ru/_posts/2014-03-06-site-changes.html b/ru/_posts/2014-03-06-site-changes.html deleted file mode 100644 index 35aa0db..0000000 --- a/ru/_posts/2014-03-06-site-changes.html +++ /dev/null @@ -1,76 +0,0 @@ ---- -category: ru -type: paper -hastr: true -layout: paper -tags: сайт, github pages -title: Изменения сайта -short: site-changes -description: Решил немного поиграться с сайтом. Краткий список изменений ниже. ---- -

Cписок изменений:

-
    -
  • Арендовал домен arcanis.me. Теперь, как и все белые люди, имею нормальный адрес. Небольшое описание (мне, как человеку далекому от интернет-технологий, пришлось немного попариться на эту тему). Арендуем домен, подключаем услугу редактирования DNS (для Ru-center DNS-master) - суммарно мне обошлось около 1100 рублей/год. Кладем в наш репозиторий с сайтом файл CNAME, содержащий имя желаемого домена. Идем и добавляем две записи в DNS для нашего домена: - -{% highlight bash %} -@ A 192.30.252.153 -@ A 192.30.252.154 -# перенаправление с www.* -www CNAME @ -{% endhighlight %} - -(@ значит наш корневой домен.) Ждем пару часов. Результат можно узнать примерно так: - -{% highlight bash %} -$ dig domain.name +nostats +nocomments +nocmd -; <<>> DiG 9.9.2-P2 <<>> domain.name +nostats +nocomments +nocmd -;; global options: +cmd -;domain.name. IN A -domain.name. 912 IN A 192.30.252.153 -domain.name. 912 IN A 192.30.252.154 -... -{% endhighlight %}
  • - -
  • На радостях создал собственный репозиторий, в котором будут лежать некоторые пакеты из AUR, которые я использую. Планируется поддержка обеих архитектур.
  • -
  • Поскольку репозиторий требует ftp, то перевел samba на ftp. Проблему доступа решил опциями монтирования: - -{% highlight bash %} -# только чтение -/home/arcanis/music /srv/ftp/music ext4 defaults,bind,ro 0 0 -/home/arcanis/arch/repo /srv/ftp/repo ext4 defaults,bind,ro 0 0 -# чтение и запись (файл ограничен 2 Гб) -/home/arcanis/share.fs /srv/ftp/share ext4 defaults,rw 0 0 -{% endhighlight %} - -Для отсутствия доступа извне к директории с музыкой, используется логин под специальным пользователем и ограничение anon_world_readable_only=YES. Также привожу свой файл настроек /etc/vsftpd.conf: - -{% highlight bash %} -anonymous_enable=YES -anon_root=/srv/ftp -local_enable=YES -write_enable=YES -local_umask=022 -anon_upload_enable=YES -anon_mkdir_write_enable=YES -anon_other_write_enable=YES -anon_world_readable_only=YES -dirmessage_enable=YES -xferlog_enable=YES -connect_from_port_20=YES -nopriv_user=music -ascii_upload_enable=YES -ftpd_banner=Welcome to arcanis -chroot_local_user=YES -local_root=/srv/ftp/music -listen=YES -{% endhighlight %} - -Теперь добавим переадресацию с repo.arcanis.me на нужный IP адрес. Для этого внесем следующие записи в DNS: - -{% highlight bash %} -repo A 89.249.170.38 -{% endhighlight %} - -
  • -
  • В ближайшее время (как дойду до магазина с деньгами) планируется приобретение небольшого сервера для работы на постоянной основе (компиляция пакетов, репозиторий, файлообмен, бэкапы).
  • -
diff --git a/ru/_posts/2014-03-06-site-changes.md b/ru/_posts/2014-03-06-site-changes.md new file mode 100644 index 0000000..f47744a --- /dev/null +++ b/ru/_posts/2014-03-06-site-changes.md @@ -0,0 +1,77 @@ +--- +category: ru +type: paper +hastr: true +layout: paper +tags: сайт, github pages +title: Изменения сайта +short: site-changes +--- +Решил немного поиграться с сайтом. Краткий список изменений ниже. + + + +## Cписок изменений: + +* Арендовал домен `arcanis.me`. Теперь, как и все белые люди, имею нормальный адрес. Небольшое описание (мне, как человеку далекому от интернет-технологий, пришлось немного попариться на эту тему). Арендуем домен, подключаем услугу редактирования DNS (для Ru-center [DNS-master](//www.nic.ru/dns/service/dns_hosting/ "Сервис")) - суммарно мне обошлось около 1100 рублей/год. Кладем в наш репозиторий с сайтом файл CNAME, содержащий имя желаемого домена. Идем и добавляем две записи в DNS для нашего домена: + + ```bash + @ A 192.30.252.153 + @ A 192.30.252.154 + # перенаправление с www.* + www CNAME @ + ``` + + (`@` значит наш корневой домен.) Ждем пару часов. Результат можно узнать примерно так: + + ```bash + $ dig domain.name +nostats +nocomments +nocmd + ; <<>> DiG 9.9.2-P2 <<>> domain.name +nostats +nocomments +nocmd + ;; global options: +cmd + ;domain.name. IN A + domain.name. 912 IN A 192.30.252.153 + domain.name. 912 IN A 192.30.252.154 + ... + ``` + +* На радостях создал [собственный репозиторий](ftp://repo.arcanis.me/repo "Репозиторий"), в котором будут лежать некоторые пакеты из AUR, которые я использую. Планируется поддержка обеих архитектур. +* Поскольку репозиторий требует ftp, то перевел samba на ftp. Проблему доступа решил опциями монтирования: + + ```bash + # только чтение + /home/arcanis/music /srv/ftp/music ext4 defaults,bind,ro 0 0 + /home/arcanis/arch/repo /srv/ftp/repo ext4 defaults,bind,ro 0 0 + # чтение и запись (файл ограничен 2 Гб) + /home/arcanis/share.fs /srv/ftp/share ext4 defaults,rw 0 0 + ``` + + Для отсутствия доступа извне к директории с музыкой, используется логин под специальным пользователем и ограничение `anon_world_readable_only=YES`. Также привожу свой файл настроек `/etc/vsftpd.conf`: + + ```bash + anonymous_enable=YES + anon_root=/srv/ftp + local_enable=YES + write_enable=YES + local_umask=022 + anon_upload_enable=YES + anon_mkdir_write_enable=YES + anon_other_write_enable=YES + anon_world_readable_only=YES + dirmessage_enable=YES + xferlog_enable=YES + connect_from_port_20=YES + nopriv_user=music + ascii_upload_enable=YES + ftpd_banner=Welcome to arcanis + chroot_local_user=YES + local_root=/srv/ftp/music + listen=YES + ``` + + Теперь добавим переадресацию с `repo.arcanis.me` на нужный IP адрес. Для этого внесем следующие записи в DNS: + + ```bash + repo A 89.249.170.38 + ``` + +* В ближайшее время (как дойду до магазина с деньгами) планируется приобретение небольшого сервера для работы на постоянной основе (компиляция пакетов, репозиторий, файлообмен, бэкапы). diff --git a/ru/_posts/2014-03-23-creating-custom-repo.html b/ru/_posts/2014-03-23-creating-custom-repo.md similarity index 53% rename from ru/_posts/2014-03-23-creating-custom-repo.html rename to ru/_posts/2014-03-23-creating-custom-repo.md index 47dcb84..bbe2e92 100644 --- a/ru/_posts/2014-03-23-creating-custom-repo.html +++ b/ru/_posts/2014-03-23-creating-custom-repo.md @@ -6,19 +6,23 @@ layout: paper tags: archlinux, настройка, linux title: Создание собственного репозитория short: creating-custom-repo -description: Небольшая статья, посвященная созданию собственного репозитория для Archlinux. --- -

Подготовка

-

Для начала находим сервер и желание с ним заниматься сексом. Для простоты, лучше, чтобы там стоял Archlinux, хотя, это и не совсем обязательно (можно создать отдельный корень под Arch). Из пакетов, пожалуй, нам понадобится только два, devtools и сам pacman:

+Небольшая статья, посвященная созданию собственного репозитория для Archlinux. -{% highlight bash %} + + +## Подготовка + +Для начала находим сервер и желание с ним заниматься сексом. Для простоты, лучше, чтобы там стоял Archlinux, хотя, это и не совсем обязательно (можно создать отдельный корень под Arch). Из пакетов, пожалуй, нам понадобится только два, `devtools` и сам `pacman`: + +```bash pacman -Sy devtools -{% endhighlight %} +``` -

devtools - набор скриптов, предназначенный для автоматизации сборки пакетов в чистом чруте. Думаю, большинство мейнтейнеров Arch'а пользуются им.

-

Создадим рабочие директории и установим цвета:

+[devtools](//www.archlinux.org/packages/devtools/ "Пакет Archlinux") - набор скриптов, предназначенный для автоматизации сборки пакетов в чистом чруте. Думаю, большинство мейнтейнеров Arch'а пользуются им. +Создадим рабочие директории и установим цвета: -{% highlight bash %} +```bash # цвета if [ ${USECOLOR} == "yes" ]; then bblue='\e[1;34m' @@ -52,41 +56,42 @@ if [ ! -d "${STAGINGDIR}" ]; then echo -e "${bwhite}[II] ${bblue}Creating directory ${bwhite}'${STAGINGDIR}'${cclose}" mkdir -p "${STAGINGDIR}" || error_mes "unknown" fi -{% endhighlight %} +``` -

Директории ${REPODIR}/{i686,x86_64} для самого репозитория, ${PREPAREDIR} - директория, где будут лежать собранные пакеты, ${STAGINGDIR} - директория, откуда будут собираться пакеты.

+Директории `${REPODIR}/{i686,x86_64}` для самого репозитория, `${PREPAREDIR}` - директория, где будут лежать собранные пакеты, `${STAGINGDIR}` - директория, откуда будут собираться пакеты. -

Немного теории

-

Создаем директорию, расшариваем ее (например, по ftp). В ней две субдиректории - i686 и x86_64, для каждого типа архитектур соответственно. И наполняем их набором пакетов по Вашему усмотрению.

+## Немного теории -

Процесс обновления репозитория можно разбить на следующие части:

-
    -
  1. Создание PKGBUILD'ов (обновление их из AUR'а).
  2. -
  3. Сборка пакетов для различных архитектур в чистом чруте.
  4. -
  5. Подписывание пакетов.
  6. -
  7. Создание списка пакетов.
  8. -
  9. Обновление репозиториев: -
    1. Удаление старых пакетов из репозитория.
    2. -
    3. Копирование новых пакетов.
    4. -
    5. Обновление базы.
    -
  10. -
  11. Очистка.
  12. -
+Создаем директорию, расшариваем ее (например, по [ftp](/ru/2014/03/06/site-changes/ "Статья про изменения сайта")). В ней две субдиректории - `i686` и `x86_64`, для каждого типа архитектур соответственно. И наполняем их набором пакетов по Вашему усмотрению. -

Теперь по шагам.

+Процесс обновления репозитория можно разбить на следующие части: -

Создание PKGBUILD'ов

-

Скачаем исходники для всех нужных пакетов из AUR'а:

+1. Создание PKGBUILD'ов (обновление их из AUR'а). +2. Сборка пакетов для различных архитектур в чистом чруте. +3. Подписывание пакетов. +4. Создание списка пакетов. +5. Обновление репозиториев: + 1. Удаление старых пакетов из репозитория. + 2. Копирование новых пакетов. + 3. Обновление базы. +6. Очистка. -{% highlight bash %} +Теперь по шагам. + +### Создание PKGBUILD'ов + +Скачаем исходники для всех нужных пакетов из AUR'а: + +```bash cd "${STAGINGDIR}" yaourt -G package-name -{% endhighlight %} +``` -

Сборка пакетов

-

Автоматически соберем каждый пакет:

+### Сборка пакетов -{% highlight bash %} +Автоматически соберем каждый пакет: + +```bash func_build() { if [ ${USECOLOR} == "yes" ]; then _bblue='\e[1;34m' @@ -122,19 +127,19 @@ export -f func_build echo -e "${bwhite}[II]${cclose} Building packages" cd "${STAGINGDIR}" /usr/bin/find -name 'PKGBUILD' -type f -execdir /usr/bin/bash -c "func_build "${PREPAREDIR}" "${ROOTDIR}"" \; -{% endhighlight %} +``` -

Для удобства рекомендую добавить в файл /etc/sudoers следующие строки:

+Для удобства рекомендую добавить в файл `/etc/sudoers` следующие строки: -{% highlight bash %} +```bash username ALL=NOPASSWD: /usr/bin/staging-i686-build username ALL=NOPASSWD: /usr/bin/staging-x86_64-build username ALL=NOPASSWD: /usr/bin/multilib-staging-build -{% endhighlight %} +``` -

Подпись пакетов

+### Подпись пакетов -{% highlight bash %} +```bash # подпись if [ ${USEGPG} == "yes" ]; then echo -e "${bwhite}[II]${cclose} Signing" @@ -143,34 +148,35 @@ if [ ${USEGPG} == "yes" ]; then /usr/bin/gpg -b ${PACKAGE} done fi -{% endhighlight %} +``` -

Для удобства рекомендую настроить gpg-agent.

+Для удобства рекомендую настроить [gpg-agent](//wiki.archlinux.org/index.php/GPG#gpg-agent "ArchWiki"). -

Создание списка пакетов

+### Создание списка пакетов -{% highlight bash %} +```bash # создание списка пакетов cd "${PREPAREDIR}" i686_PACKAGES=$(/usr/bin/find * -name '*-i686.pkg.tar.xz' -o -name '*-any.pkg.tar.xz') x86_64_PACKAGES=$(/usr/bin/find * -name '*-x86_64.pkg.tar.xz' -o -name '*-any.pkg.tar.xz') echo -e "${bwhite}[II] ${bblue}=>${cclose} i686 packages: \n${bwhite}${i686_PACKAGES}${cclose}" echo -e "${bwhite}[II] ${bblue}=>${cclose} x86_64 packages: \n${bwhite}${x86_64_PACKAGES}${cclose}" -{% endhighlight %} +``` -

Обновление репозиториев

-

Функция для удаления пакетов из базы данных и из репозитория:

+### Обновление репозиториев -{% highlight bash %} +Функция для удаления пакетов из базы данных и из репозитория: + +```bash func_remove() { _PACKAGE="$1" /usr/bin/rm -f "${_PACKAGE}"{,.sig} } -{% endhighlight %} +``` -

Обновление репозитория i686:

+Обновление репозитория `i686`: -{% highlight bash %} +```bash # обновление репозитория i686 echo -e "${bwhite}[II]${cclose} Updating ${bwhite}i686${cclose} repo" cd "${REPODIR}/i686" @@ -185,11 +191,11 @@ for PACKAGE in ${i686_PACKAGES}; do /usr/bin/repo-add ${DBNAME}.db.tar.gz "${PACKAGE}" /usr/bin/repo-add --files ${DBNAME}.files.tar.gz "${PACKAGE}" done -{% endhighlight %} +``` -

Обновление репозитория x86_64:

+Обновление репозитория `x86_64`: -{% highlight bash %} +```bash # обновление репозитория x86_64 echo -e "${bwhite}[II]${cclose} Updating ${bwhite}x86_64${cclose} repo" cd "${REPODIR}/x86_64" @@ -204,22 +210,23 @@ for PACKAGE in ${x86_64_PACKAGES}; do /usr/bin/repo-add ${DBNAME}.db.tar.gz "${PACKAGE}" /usr/bin/repo-add --files ${DBNAME}.files.tar.gz "${PACKAGE}" done -{% endhighlight %} +``` -

Очистка

+### Очистка -{% highlight bash %} +```bash # очистка cd "${PREPAREDIR}" /usr/bin/rm -rf * cd "${STAGINGDIR}" /usr/bin/rm -rf * -{% endhighlight %} +``` -

Создание симлинков

-

Вы можете захотеть создать директорию, которая будет содержать симлинки на актуальные версии пакетов с именами, не содержащими версии:

+### Создание симлинков -{% highlight bash %} +Вы можете захотеть создать директорию, которая будет содержать симлинки на актуальные версии пакетов с именами, не содержащими версии: + +```bash # создание симлинков if [ ${SYMLINK} == "yes" ]; then echo -e "${bwhite}[II]${cclose} Creating symlinks" @@ -238,15 +245,17 @@ if [ ${SYMLINK} == "yes" ]; then /usr/bin/ln -sf "../x86_64/${PACKAGE}" "${PKGNAME}-x86_64.pkg.tar.xz" done fi -{% endhighlight %} +``` -

Файл

-

Скрипты целиком. Скачиваем исходники для пакетов, запускаем скрипт (при необходимости, редактируем переменные) и радуемся жизни.

+### Файл -

Использование репозитория

-

Просто добавляем в файл /etc/pacman.conf следующие строки:

+[Скрипты](//github.com/arcan1s/repo-scripts "GitHub") целиком. Скачиваем исходники для пакетов, запускаем скрипт (при необходимости, редактируем переменные) и радуемся жизни. -{% highlight bash %} +## Использование репозитория + +Просто добавляем в файл `/etc/pacman.conf` следующие строки: + +```bash [$REPONAME] Server = ftp://$REPOADDRESS/repo/$arch -{% endhighlight %} +``` diff --git a/ru/_posts/2014-05-07-my-desktop.html b/ru/_posts/2014-05-07-my-desktop.html deleted file mode 100644 index 16732b0..0000000 --- a/ru/_posts/2014-05-07-my-desktop.html +++ /dev/null @@ -1,86 +0,0 @@ ---- -category: ru -type: paper -hastr: true -layout: paper -tags: настройка, linux, archlinux -title: Приложения, которые я использую -short: my-desktop -description: Небольшая статья, посвященная набору приложений и расширений, которые я использую в повседневной жизни на моем домашнем компьютере. ---- -

Приложения

-
    -
  • Shell - zshrc без вариантов. Некоторое описание моих настроек шелла могут быть найдены тут. Сами настройки хранятся тут или тут.

  • - -
  • DE - KDE со всеми вытекающими (поэтому набор приложений, преимущественно, Qt-based). Некоторые подробности приготовления KDE будут даны ниже.

  • - -
  • Работа с изображениями - gwenview для просмотра и быстрого редактирования, kolourpaint для простого редактирования стандартных форматов пиксельной графики, gimp (без плагинов, ибо не было необходимости) для более сурового редактирования и inkskape для работы с векторной графикой.

  • - -
  • Браузер - Firefox, ранее Qupzilla, еще ранее Opera. Некоторый набор настроек Firefox будет дан ниже. Дополнительный браузер - Chromium. Консольный - elinks.

  • - -
  • IM клиент - qutIM. Кроссплатформенный, мультипротокольный, с необходимым набором фич. Kopete, который использовался ранее, часто падал, работал как хотел и вообще не дружил с кодировкой. Раньше еще был какой то консольный, но сейчас его нет. Для таких случаев предпочитаю использовать клиент с планшета. Skype для скайпа, очевидно.

  • - -
  • Почтовый клиент - kmail. Много фич, большая часть из которых мною используется, симпатично выглядит и удобный. Еще бы был DE-независимый, цены бы ему не было.

  • - -
  • IRC клиент - konversation. Самый обычный IRC-клиент. Хотя, если мне не изменяет память, qutIM тоже поддерживает IRC протокол, лично мне удобнее использовать отдельный клиент для этого.

  • - -
  • Torrent клиент - transmission с Qt5 интерфейсом (gtk тоже имеется). Для сервера он же, но без GUI.

  • - -
  • Видео плеер - mpv. Mplayer умер, а mplayer2 родился мертворожденным. Ах да, графические надстройки сверху ненужны.

  • - -
  • Аудио плеер - qmmp. Хороший, годный плеер с закосом под winamp. Легким движением руки делаем ему человеческий интерфейс aka simpleui.

  • - -
  • Работа с аудио/видео - kdenlive для работы с видео, soundkonverter для работы с аудио, easytag для работы с аудио тегами (gtk, но зато единственный, чья функциональность меня устроила). Ну и командная строка и небольшие скрипты на bash.

  • - -
  • Офис - Kingsoft Office в качестве замены Microsoft Office; в общем то ничем не примечательный, разве что не так ущербно смотрится, как стандартные офисы, Qt-based и, говорят, с хорошей поддержкой стандартных форматов. Версия под линукс находится в состоянии альфы. Kile в качестве фронтенда к LaTeX. Okular, как просмотрщик всего. GoldenDict в качестве словаря.

  • - -
  • Редакторы - kwrite в качестве легковесного редактора, kate (с плагином cpp-helper) для более суровых вещей. Ну и, конечно, vim для консоли.

  • - -
  • Научный софт. Визуализаторы химические - vmd, chimera и pymol. Физический симулятор step. Калькулятор kalgebra и консольный ipython. Рисовалка графиков и анализ qtiplot (его форк scidavis, к сожалению, полумертв), только рисовалка - grace. Chemtool в качестве замены ChemDraw.

  • - -
  • Системное. Файловый менеджер dolphin, doublecmd как двухпанельный менеджер. Эмуляторы терминала - yakuake и urxvt в качестве оконного. Графический интерфейс для архиваторов ark.

  • -
- - -

Настройка KDE

-
- {% assign scrdesc = "Нотариально заверенный скриншот" %} - {% assign scrname = "kde" %} - {% include prj_scr.html %} -
- -

В качестве стиля Qt используется QtCurve, настройки могут быть найдены здесь, оформление окон оттуда же. Курсор ecliz-small. Тема плазмы volatile. Значки compass. Шрифты на базе Liberation.

- -

Используемые виджеты (слева направо, сверху вниз): menubar, homerun с прозрачной иконкой, icontask, netctl, стандартный трей от KDE, colibri в качестве уведомлений, Awesome Widgets.

- -

В качестве бонусного материала - яркие цвета в консоли (для konsole):

-
- {% assign scrdesc = "Как оно выглядит" %} - {% assign scrname = "zshrc_demo" %} - {% include prj_scr.html %} -
- - -

Настройка Firefox

-

В самих настройках ничего интересного нет, я просто напишу список аддонов. Дико радует, что для того, чтобы интерфейс был минималистичным (и удобным), нужно поставить кучу плагинов.

-
    -
  • Adblock plus - куда же без него.

  • -
  • Add to search bar - для кастомных поисков.

  • -
  • Auto Refresh - автоматическое обновление страниц.

  • -
  • Clone tab - добавляет функцию "Дублировать вкладку".

  • -
  • Close tab by double click - понятно, короче.

  • -
  • New scrollbars используется для кастомизации скроллбаров, потому что оригинальные смотрятся ущербно в Qt окружении.

  • -
  • NoScript используется, например, для I2P и Tor.

  • -
  • PrivateTab - добавляет приватную вкладку (а не окно).

  • -
  • Proxy Selector добавляет возможность использовать несколько прокси-серверов.

  • -
  • QuickJava используется примерно с той же целью, что и NoScript.

  • -
  • RSS иконка в строке адреса - очевидно.

  • -
  • Словари для проверки орфографии (eng/rus).

  • -
  • Space Next - на нажатие на пробел внизу страницы реагирует, как на нажатие кнопки "Далее".

  • -
  • Speed Dial - простая экспресс-панель.

  • -
  • Status-4-Evar - нормальная строка состояния.

  • -
  • tab delabelifier - сворачивает неиспользуемые вкладки.

  • -
  • Tab Scope + Tab Scope Tweaker - всплывающая подсказка у вкладок.

  • -
  • accessKey - пока не работает. Вообще служит для удобной навигации (opera-like) с клавиатуры.

  • -
  • FXOpera - нормальный минималистичный вид.

  • -
diff --git a/ru/_posts/2014-05-07-my-desktop.md b/ru/_posts/2014-05-07-my-desktop.md new file mode 100644 index 0000000..e4c9575 --- /dev/null +++ b/ru/_posts/2014-05-07-my-desktop.md @@ -0,0 +1,76 @@ +--- +category: ru +type: paper +hastr: true +layout: paper +tags: настройка, linux, archlinux +title: Приложения, которые я использую +short: my-desktop +--- +Небольшая статья, посвященная набору приложений и расширений, которые я использую в повседневной жизни на моем домашнем компьютере. + + + +## Приложения + +* **Shell** - zshrc без вариантов. Некоторое описание моих настроек шелла могут быть найдены [тут](/ru/2014/01/14/about-zshrc/ "Статья о zshrc"). Сами настройки хранятся [тут](//raw.githubusercontent.com/arcan1s/dotfiles/master/zshrc "Файл") или [тут](//raw.githubusercontent.com/arcan1s/dotfiles/master/zshrc_server "Файл"). +* **DE** - KDE со всеми вытекающими (поэтому набор приложений, преимущественно, Qt-based). Некоторые подробности приготовления KDE будут даны ниже. +* **Работа с изображениями** - [gwenview](//kde.org/applications/graphics/gwenview/ "Домашняя страница Gwenview") для просмотра и быстрого редактирования, [kolourpaint](//kde.org/applications/graphics/kolourpaint/ "Домашняя страница Kolourpaint") для простого редактирования стандартных форматов пиксельной графики, [gimp](//www.gimp.org/ "Домашняя страница Gimp") (без плагинов, ибо не было необходимости) для более сурового редактирования и [inkskape](//www.inkscape.org/ "Домашняя страница Inkskape") для работы с векторной графикой. +* **Браузер** - Firefox, ранее Qupzilla, еще ранее Opera. Некоторый набор настроек Firefox будет дан ниже. Дополнительный браузер - Chromium. Консольный - elinks. +* **IM клиент** - [qutIM](//qutim.org "Домашняя страница Qutim"). Кроссплатформенный, мультипротокольный, с необходимым набором фич. [Kopete](//kde.org/applications/internet/kopete/ "Домашняя страница Kopete"), который использовался ранее, часто падал, работал как хотел и вообще не дружил с кодировкой. Раньше еще был какой то консольный, но сейчас его нет. Для таких случаев предпочитаю использовать клиент с планшета. Skype для скайпа, очевидно. +* **Почтовый клиент** - [kmail](//kde.org/applications/internet/kmail/ "Домашняя страница Kmail"). Много фич, большая часть из которых мною используется, симпатично выглядит и удобный. Еще бы был DE-независимый, цены бы ему не было. +* **IRC клиент** - [konversation](//konversation.kde.org/ "Домашняя страница Konversation"). Самый обычный IRC-клиент. Хотя, если мне не изменяет память, qutIM тоже поддерживает IRC протокол, лично мне удобнее использовать отдельный клиент для этого. +* **Torrent клиент** - [transmission](//www.transmissionbt.com/ "Домашняя страница Transmission") с Qt5 интерфейсом (gtk тоже имеется). Для сервера он же, но без GUI. +* **Видео плеер** - [mpv](//mpv.io/ "Домашняя страница mpv"). Mplayer умер, а mplayer2 родился мертворожденным. Ах да, графические надстройки сверху ненужны. +* **Аудио плеер** - [qmmp](//qmmp.ylsoftware.com/ "Домашняя страница Qmmp"). Хороший, годный плеер с закосом под winamp. Легким движением руки делаем ему человеческий интерфейс aka simpleui. +* **Работа с аудио/видео** - [kdenlive](//kde-apps.org/content/show.php?content=29024 "Домашняя страница kdenlive") для работы с видео, [soundkonverter](//kde-apps.org/content/show.php?content=29024 "Домашняя страница Soundkonverter") для работы с аудио, [easytag](//wiki.gnome.org/Apps/EasyTAG "Домашняя страница Easytag") для работы с аудио тегами (gtk, но зато единственный, чья функциональность меня устроила). Ну и командная строка и небольшие скрипты на bash. +* **Офис** - [Kingsoft Office](//wps-community.org/ "Домашняя страница KO") в качестве замены Microsoft Office; в общем то ничем не примечательный, разве что не так ущербно смотрится, как стандартные офисы, Qt-based и, говорят, с хорошей поддержкой стандартных форматов. Версия под линукс находится в состоянии альфы. [Kile](//kile.sourceforge.net/ "Домашняя страница Kile") в качестве фронтенда к LaTeX. [Okular](//kde.org/applications/graphics/okular/ "Домашняя страница Okular"), как просмотрщик всего. [GoldenDict](//goldendict.org/ "Домашняя страница GoldenDict") в качестве словаря. +* **Редакторы** - [kwrite](//www.kde.org/applications/utilities/kwrite/ "Домашняя страница Kwrite") в качестве легковесного редактора, [kate](//www.kde.org/applications/utilities/kate/ "Домашняя страница Kate") (с плагином [cpp-helper](//zaufi.github.io/kate-cpp-helper-plugin.html "Домашняя страница плагина")) для более суровых вещей. Ну и, конечно, vim для консоли. +* **Научный софт**. Визуализаторы химические - [vmd](//www.ks.uiuc.edu/Research/vmd/ "Домашняя страница VMD"), [chimera](//www.cgl.ucsf.edu/chimera/ "Домашняя страница Chimera") и [pymol](//pymol.org/ "Домашняя страница Pymol"). Физический симулятор [step](//kde.org/applications/education/step/ "Домашняя страница Step"). Калькулятор [kalgebra](//kde.org/applications/education/kalgebra/ "Домашняя страница Kalgebra") и консольный [ipython](//ipython.org/ "Домашняя страница ipython"). Рисовалка графиков и анализ [qtiplot](//qtiplot.com/ "Домашняя страница Qtiplot") (его форк scidavis, к сожалению, полумертв), только рисовалка - [grace](//plasma-gate.weizmann.ac.il/Grace/ "Домашняя страница Grace"). [Chemtool](//ruby.chemie.uni-freiburg.de/~martin/chemtool/chemtool.html "Домашняя страница Chemtool") в качестве замены ChemDraw. +* **Системное**. Файловый менеджер [dolphin](//kde.org/applications/system/dolphin/ "Домашняя страница Dolphin"), [doublecmd](//doublecmd.sourceforge.net/ "Домашняя страница Doublecmd") как двухпанельный менеджер. Эмуляторы терминала - [yakuake](//yakuake.kde.org/ "Домашняя страница Yakuake") и [urxvt](//software.schmorp.de/pkg/rxvt-unicode.html "Домашняя страница urxvt") в качестве оконного. Графический интерфейс для архиваторов [ark](//kde.org/applications/utilities/ark/ "Домашняя страница Ark"). + + +## Настройка KDE + +
+ {% assign scrdesc = "Нотариально заверенный скриншот" %} + {% assign scrname = "kde" %} + {% include prj_scr.html %} +
+ +В качестве стиля Qt используется QtCurve, настройки могут быть найдены [здесь](//github.com/arcan1s/dotfiles/tree/master/qtcurve "GitHub"), оформление окон оттуда же. Курсор [ecliz-small](//kde-look.org/content/show.php/Ecliz?content=110340 "Домашняя страница курсоров"). Тема плазмы [volatile](//kde-look.org/content/show.php/Volatile?content=128110 "Домашняя страница темы"). Значки [compass](//nitrux.in/ "Домашняя страница Nitrux"). Шрифты на базе Liberation. + +**Используемые виджеты** (слева направо, сверху вниз): [menubar](//launchpad.net/plasma-widget-menubar "Домашняя страница виджета"), [homerun](//userbase.kde.org/Homerun "Домашняя страница виджета") с прозрачной иконкой, [icontask](//kde-apps.org/content/show.php?content=144808 "Домашняя страница виджета"), [netctl](/ru/projects/netctl-gui/ "Домашняя страница виджета"), стандартный трей от KDE, [colibri](//agateau.com/projects/colibri/ "Домашняя страница виджета") в качестве уведомлений, [Awesome Widgets](/ru/projects/awesome-widgets "Домашняя страница виджета"). + +В качестве бонусного материала - яркие цвета в консоли (для [konsole](//github.com/arcan1s/dotfiles/blob/master/themes/yakuake/My%20color.colorscheme "GitHub")): + +
+ {% assign scrdesc = "Как оно выглядит" %} + {% assign scrname = "zshrc_demo" %} + {% include prj_scr.html %} +
+ + +## Настройка Firefox + +В самих настройках ничего интересного нет, я просто напишу список аддонов. Дико радует, что для того, чтобы интерфейс был минималистичным (и удобным), нужно поставить кучу плагинов. + +* **Adblock plus** - куда же без него. +* **Add to search bar** - для кастомных поисков. +* **Auto Refresh** - автоматическое обновление страниц. +* **Clone tab** - добавляет функцию "Дублировать вкладку". +* **Close tab by double click** - понятно, короче. +* **New scrollbars** используется для кастомизации скроллбаров, потому что оригинальные смотрятся ущербно в Qt окружении. +* **NoScript** используется, например, для I2P и Tor. +* **PrivateTab** - добавляет приватную вкладку (а не окно). +* **Proxy Selector** добавляет возможность использовать несколько прокси-серверов. +* **QuickJava** используется примерно с той же целью, что и NoScript. +* **RSS иконка в строке адреса** - очевидно. +* **Словари для проверки орфографии** (eng/rus). +* **Space Next** - на нажатие на пробел внизу страницы реагирует, как на нажатие кнопки "Далее". +* **Speed Dial** - простая экспресс-панель. +* **Status-4-Evar** - нормальная строка состояния. +* **tab delabelifier** - сворачивает неиспользуемые вкладки. +* **Tab Scope + Tab Scope Tweaker** - всплывающая подсказка у вкладок. +* **accessKey** - пока не работает. Вообще служит для удобной навигации (opera-like) с клавиатуры. +* **FXOpera** - нормальный минималистичный вид. diff --git a/ru/_posts/2014-05-18-disabling-baloo.html b/ru/_posts/2014-05-18-disabling-baloo.html deleted file mode 100644 index 0fe7fd3..0000000 --- a/ru/_posts/2014-05-18-disabling-baloo.html +++ /dev/null @@ -1,39 +0,0 @@ ---- -category: ru -type: paper -hastr: true -layout: paper -tags: linux, archlinux, сборка -title: Отключение baloo, gentoo-way -short: disabling-baloo -description: Пока ононимные онолитеги ЛОР'а ноют на тему baloo, я предпочел потратить 15 минут на то, чтобы отвязать приложения от этого чуда человеческой мысли. ---- -

Дисклеймер

-

Сам этим я не пользуюсь, поскольку предпочитаю менее деструктивные методы. Однако, судя по всему, все работает без проблем, поскольку жалоб нет. Так как патч делался действительно за несколько минут, то он просто выкорчевывает все вызовы baloo из исходников (возможно, когда-нибудь я сделаю нормальный патч).

- -

С другой стороны, я настоятельно рекомендую людям, которым по каким-либо причинам baloo не нужен, отключить его из меню настроек (добавили пункт в 4.13.1), либо воспользоваться этой статьей.

- -

Введение

-

В Archlinux, на текущий момент (2014-05-18) от baloo, помимо baloo-widgets, зависит gwenview и kdepim. В версии 4.13.0, почему то, kactivities тоже зависел от baloo, однако, эта зависимость не требовалась явно (таким образом, достаточно было просто пересобрать его, удалив baloo из списка зависимостей).

- -

gwenview

-

Тут все довольно просто. Разработчики сами позаботились за нас о возможных пожеланиях простых пользователей и добавили специальный флаг:

- -{% highlight cmake %} -//Semantic info backend for Gwenview (Baloo/Fake/None) -GWENVIEW_SEMANTICINFO_BACKEND:STRING=Baloo -{% endhighlight %} -

Таким образом, в сценарий сборки к cmake добавляем нужный флаг:

-{% highlight bash %} -cmake ../gwenview-${pkgver} \ - -DCMAKE_BUILD_TYPE=Release \ - -DKDE4_BUILD_TESTS=OFF \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DGWENVIEW_SEMANTICINFO_BACKEND=None -{% endhighlight %} - -

kdepim

-

Так как делалось все на скорую руку, то я предпочел пробежаться по исходникам с помощью grep и найти все упоминания baloo. Нужные строки (а это указания на baloo в файлах CMakeLists.txt, вызовы функций из его библиотек, объявления заголовочных файлов) просто закомментировал (в исходном коде местами пришлось добавить фейковые вызовы). Патч полностью здесь приводить не буду (он, к тому же, немного большой), а дам ссылку на него (4.13.3). Далее просто требуется применить этот патч к исходникам и пересобрать kdepim.

- -

Пакеты

-

Все пакеты для Archlinux для обеих архитектур доступны в моем репозитории.

diff --git a/ru/_posts/2014-05-18-disabling-baloo.md b/ru/_posts/2014-05-18-disabling-baloo.md new file mode 100644 index 0000000..36749af --- /dev/null +++ b/ru/_posts/2014-05-18-disabling-baloo.md @@ -0,0 +1,48 @@ +--- +category: ru +type: paper +hastr: true +layout: paper +tags: linux, archlinux, сборка +title: Отключение baloo, gentoo-way +short: disabling-baloo +--- +Пока ононимные онолитеги ЛОР'а ноют на тему baloo, я предпочел потратить 15 минут на то, чтобы отвязать приложения от этого чуда человеческой мысли. + + + +## Дисклеймер + +Сам этим я не пользуюсь, поскольку предпочитаю менее деструктивные методы. Однако, судя по всему, все работает без проблем, поскольку жалоб нет. Так как патч делался действительно за несколько минут, то он просто выкорчевывает все вызовы baloo из исходников (возможно, когда-нибудь я сделаю нормальный патч). + +С другой стороны, я настоятельно рекомендую людям, которым по каким-либо причинам baloo не нужен, отключить его из меню настроек (добавили пункт в 4.13.1), либо воспользоваться этой [статьей](//blog.andreascarpino.it/disabling-baloo-the-arch-way/ "Блог Скарпино"). + +## Введение + +В Archlinux, на текущий момент (2014-05-18) от baloo, помимо **baloo-widgets**, зависит **gwenview** и **kdepim**. В версии 4.13.0, почему то, **kactivities** тоже зависел от baloo, однако, эта зависимость не требовалась явно (таким образом, достаточно было просто пересобрать его, удалив baloo из списка зависимостей). + +## gwenview + +Тут все довольно просто. Разработчики сами позаботились за нас о возможных пожеланиях простых пользователей и добавили специальный флаг: + +```cmake +//Semantic info backend for Gwenview (Baloo/Fake/None) +GWENVIEW_SEMANTICINFO_BACKEND:STRING=Baloo +``` +Таким образом, в сценарий сборки к cmake добавляем нужный флаг: + +```bash +cmake ../gwenview-${pkgver} \ + -DCMAKE_BUILD_TYPE=Release \ + -DKDE4_BUILD_TESTS=OFF \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DGWENVIEW_SEMANTICINFO_BACKEND=None +``` + +## kdepim + +Так как делалось все на скорую руку, то я предпочел пробежаться по исходникам с помощью grep и найти все упоминания baloo. Нужные строки (а это указания на baloo в файлах CMakeLists.txt, вызовы функций из его библиотек, объявления заголовочных файлов) просто закомментировал (в исходном коде местами пришлось добавить фейковые вызовы). Патч полностью здесь приводить не буду (он, к тому же, немного большой), а дам [ссылку на него](//gist.github.com/arcan1s/b698bb586faef627b3bb "Gist") (4.13.3). Далее просто требуется применить этот патч к исходникам и пересобрать kdepim. + +## Пакеты + +Все пакеты для Archlinux для обеих архитектур доступны [в моем репозитории](//wiki.archlinux.org/index.php/Unofficial_user_repositories#arcanisrepo "ArchWiki"). diff --git a/ru/_posts/2014-06-23-about-aur.html b/ru/_posts/2014-06-23-about-aur.html deleted file mode 100644 index aaa4704..0000000 --- a/ru/_posts/2014-06-23-about-aur.html +++ /dev/null @@ -1,186 +0,0 @@ ---- -category: ru -type: paper -hastr: false -layout: paper -tags: archlinux -title: Немного об Arch User Repository -short: about-aur -description: Статья посвященная работе с пользовательским репозиторием Archlinux. Постарался сделать акцент на сопровождении пакетов. Данная статья, в большей степени, представляет собой компиляцию нескольких англоязычных статей Wiki и немного личного опыта. Поэтому не уверен, что в данной статье на английском языке будет толк. ---- -

AUR

-

Итак, Arch User Repository (AUR или АУР) - это репозиторий, поддерживаемый и развиваемый практически исключительно сообществом Archlinux. Есть еще отдельные люди, называемые доверенными пользователями (TU), на плечах которых лежит своеобразная "модерация" этого репозитория. На мой скромный взгляд, едва ли не единственное отличие Archlinux от других дистрибутивов - это наличие AUR'а. Отличие этого репозитория от обычных прежде всего в том, что он не содержит архивов с исходниками или собранных пакетов - только скрипт сборки (PKGBUILD) и, возможно, дополнительные текстовые файлы.

- -

Конечно, вручную скачивать архив с сайта AUR'а, а также проверять обновления, не совсем удобно, поэтому существует набор хелперов. Большинство хелперов представляет собой обертку над pacman. Я выделю только два - packer - минималистичный, удобный, быстрый - и yaourt - на шелле, но зато более функциональный. По не особо понятным мне причинам, в русскоязычном сегменте большее распространение получил yaourt, зарубежом - packer.

- -

Помимо хелперов, существуют также консольные клиенты для работы с AUR. Я выделю, пожалуй, только один - python-aur. Иногда удобная альтернатива веб-интерфейсу.

- -

Другая особенность данного репозитория - и не менее важная - все действия с ним осуществляются на свой страх и риск. Опасные и некорректные пакеты, конечно же, удаляются, но вполне могут быть и ошибки при сборке и еще все, что сможете придумать. Дык вот - работа с ним на вашей совести, и никто вам ничем не обязан, если что-то сломается. По этой же причине, ни один хелпер в обозримом будущем не будет перенесен в официальные репозитории.

- -

У пакетов в AUR есть несколько характеристик, которых нет у пакетов в официальных репозиториях: -

    -
  • группа - скорее для удобства поиска, сортировки. Немного помогает доверенным пользователям.
  • -
  • автор, мейнтейнер, последний приславший - люди, кто, соответственно, первый раз прислал данный пакет, сопровождает его в настоящий момент, и последний прислал.
  • -
  • голоса - когда кому-либо понравился этот пакет или он находит его полезным, он голосует. Теоретически, пакеты, имеющие больше 10 голосов могут попасть в официальные репозитории (если найдется желающий среди доверенных пользователей). Другой путь в официальные репозитории - попасть в список часто используемых, но вы же не пользуетесь pkgstats.
  • -
-

- -

Установка с AUR

-

Для работы с AUR требуется установить группу пакетов base-devel. Пакеты с этой группы, как правило, не включены в зависимости. Рекомендуемая установка пакетов с AUR выглядит примерно так:

- -{% highlight bash %} -# скачать архив с PKGBUILD'ом c AUR -curl -L -O //aur.archlinux.org/packages/fo/foo/foo.tar.gz -cd foo -# отредактировать / проверить PKGBUILD -vi PKGBUILD -# собрать пакет. Флаг -c удалить директорию сборки, -# -s установить недостающие зависимости, -# -r удалить их после установки, -# -f перезаписать существующий пакет, если он есть -makepkg -csrf -# установить его -pacman -U foo-0.1-1-i686.pkg.tar.xz -{% endhighlight %} - -

Загрузка пакета в AUR

-

Никаких makepkg -S. С недавних пор данный метод считается устаревшим. Но обо всем по-порядку

- -

Нам нужно загрузить архив на сайт. В этом архиве должны быть PKGBUILD и .AURINFO. По поводу первого я расскажу еще чуть ниже, второй генерируется автоматически. Также, там могут быть установочные скрипты (*.install), патчи, файлы лицензии (если не предоставляются апстримом с исходниками), сервисы systemd, скрипты запуска - это то, что обычно включено. Никаких исходников. И тем более никаких бинарников. (Шутки-шутками, а я помню пакет, в котором исходный код записывался с помощью cat << EOF прямо в тексте PKGBUILD'а.)

- -

Все файлы кладем в одну директорию. Убедились, что install файл, если он есть, указан в переменной install, все другие исходные файлы указаны в массиве source, а хэш-суммы правильные (их легко можно сгенерировать, набрав makepkg -g). Далее из этой директории запустить команду mkaurball (пакет pkgbuild-introspection) - и архив готов.

- -

Несколько правил загрузки пакета в AUR: -

    -
  • Если такой пакет существует в официальном репозитории (любой версии), то не нужно заливать новый пакет. Если репозиторный пакет устарел, просто пометьте его, как устаревший. Исключение из этого правила составляют пакеты из системы контрля версий (VCS), о них чуть ниже.
  • -
  • Проверьте AUR. Если такой пакет уже существует и у него есть мейнтейнер, вы не сможете залить свой пакет. Если у него нет мейнтейнера, то вы автоматически будете его сопровождающим после обновления. Еще может быть такой же пакет, но с другим названием, будьте внимательны.
  • -
  • PKGBUILD должен следовать (более-менее) стандартам и должен быть более-менее аккуратным. В противном случае, пакет может быть удален без предупреждения.
  • -
  • Пакет должен быть полезен еще кому-либо кроме Вас =)
  • -
  • Рекомендуется проверить собранный пакет и PKGBUILD с помощью namcap. Это не даст 100% гарантии, но на основные ошибки укажет.
  • -
-

- -

Сопровождение пакетов

-

Если вы сопровождаете пакет и хотите его обновить, просто загрузите обновленный пакет еще раз. Читайте - и, по возможности, отвечайте - комментарии к вашему пакету, там иногда могут быть очень полезные замечания или дельные предложения. Если вы не хотите сопровождать больше ваш пакет (или нет времени), то, пожалуйста, нажмите на кнопку справа (бросить/disown), чтобы те, кто в нем заинтересован, смогли поддерживать его. Если есть пакет, который не имеет сопровождающего, и вы хотели бы им стать, вы также можете нажать на соответствующую кнопку справа в веб-интерфейсе =)

- -

Список рассылки AUR

-

По любому вопросу, связанному с работой AUR вы всегда можете обратиться в список рассылки aur-general (at) archlinux (dot) org. На ваш вопрос ответят, вероятно, достаточно быстро; причем, ответить могут не только обычные пользователи, но и доверенные пользователи. Также, если вы вдруг неуверены в своем PKGBUILD'е, вы тоже можете всегда обратиться в список рассылки и показать свой PKGBUILD.

- -

Существует также отдельный список рассылки для запросов aur-requests (at) archlinux (dot) org. На текущий момент (AUR 3.2.0) общение через данный список рассылки напрямую не рекомендуется - все обычные запросы должны отсылаться с использованием веб-интерфейса (подробности). Запросы, которые вы можете послать: -

    -
  • Удаление пакета. Запрос должен включать краткое описание причины, почему вы его хотите удалить. Обычные причины - специальный патч, который больше не нужен; пакет уныл и более не поддерживается апстримом; переименование; функциональность предоставляется другим пакетом.
  • -
  • "Бросить пакет". Лишить текущего мейнтейнера права сопровождать данный пакет. Официальное требование - вы должны связаться до этого с мейнтейнером по e-mail и ожидать от него ответа в течение двух недель (теперь это делается автоматически при отправке запроса через веб-интерфейс). Однако, если мейнтейнер неактивен в течение длительного времени, или пакет помечен, как устаревший, в течение длительного времени, то можно сделать исключение из этого правила. (Например, если пакет отмечен устаревшим более шести месяцев, то запрос удовлетворяется автоматически.)
  • -
  • Объединение пакетов. Если пакет подлежит удалению, но имеет голоса (или важные комментарии), то его можно объединить с другим, который предоставляет то же самое. Частный случай - это аналогично переименованию пакета из одного в другой.
  • -
-

- -

Пожалуйста, пишите письма в список рассылки аккуратно. И, желательно, вежливо (а то потом будете генерировать что-то вроде такого) (мы все знаем, что мы арче-школьники, не надо нас еще раз этим тыкать, мы обидимся). Также старайтесь избегать избыточного цитирования. И - это практически требование - предоставляйте ссылки на пакеты. Хороший вариант - составление списка ссылок в конце письма, а в теле ссылаться на них таким образом [1]. Если не уверены в корректности запроса - посмотрите архив списка рассылки.

- - -

PKGBUILD

-

PKGBUILD - это, де-факто, сценарий шелла, указывающий как и почему (в смысле, зачем) собираться пакету. Он имеет 4 части: -

    -
  • Объявление основных переменных. Об этом я расскажу чуть ниже.
  • -
  • Подготовка исходников. Этот пункт необязательный. Включает в себя копирование (если вдруг нужно), применение патчей, sed и прочие мелочи. Функция обозначается, как prepare().
  • -
  • Сборка. Также необязательный пункт. Здесь - и только здесь - должна проводиться компиляция. Функция обозначается, как build().
  • -
  • Установка. Обязательный пункт. Здесь происходит копирование нужных файлов в указанный корень ($pkgdir). Функция обозначается, как package() (для совмещенных пакетов таких функций несколько и они называются примерно так: package_$pkgname()).
  • -
-

- -

Переменные PKGBUILD

-

Основные переменные следующие: -

    -
  • pkgbase - группа пакетов. Например, пакеты python-pyqt4 и python2-pyqt4 имеют одну группу pyqt4.
  • -
  • pkgname - имя (или массив имен для совмещенных пакетов) пакета; обязательная переменная.
  • -
  • pkgver - версия пакета, указанная в апстриме, pkgrel - арче-специфичный релиз пакета.
  • -
  • pkgdesc - краткое описание пакета.
  • -
  • arch - массив архитектур. Как правило, arch=('i686' 'x86_64') для бинарных пакетов (очень-очень редко бывают пакеты, которые предоставляются только для одной архитектуры) и arch=('any') для пакетов, не содержащих бинарные файлы.
  • -
  • url - адрес апстрима.
  • -
  • license - лицензия. Если лицензия отлична от обычных (распространенные типы MIT, BSD и custom) - смотри пакет core/licenses - то ее надо установить вместе с пакетом по пути /usr/share/licenses/$pkgname/LICENSE).
  • -
  • depends - массив зависимостей, необходимых для работы пакета. optdepends - это дополнительные зависимости, которые не необходимы для работы, но предоставляют дополнительную функциональность. makedepends - это зависимости, которые не включены в depends, но необходимы при сборке пакета.
    - Лучший способ проверить, правильно ли указаны зависимости сборки (зачастую, это самое важное) - попробуйте собрать пакет в чистом окружении (то есть совсем совсем чистом). И да, зависимости из группы base-devel указывать не надо.
  • -
  • Следующие три переменные необязательны. provides - список пакетов, функциональность которых предоставляет данный пакет. replaces - список пакетов, которые данный пакет замещает (обычно используется для решения проблем с переименованием пакетов при обновлении). conflicts - список пакетов, с которым конфликтует данный пакет (имеет такие же файлы).
    - Пример различия provides и replaces - gvim предоставляет vim, а wireshark-gtk замещает wireshark.
  • -
  • install - файл, содержащий сценарии, запускающиеся после установки/удаления/обновления (смотрите файл /usr/share/pacman/proto.install).
  • -
  • source - где брать исходники, файлы предоставляемые вместе с пакетом указываются только по имени, к данному массиму также прилагается массив хэш сумм (md5sums/sha1sums/sha256sums/sha384sums/sha512sums).
  • -
-

- -

Все перечисленные выше переменные указываются в заголовке PKGBUILD. К ним также можно обращаться внутри PKGBUILD'а. Дополнительно стоит упомянуть переменные startdir - директория, откуда запускается makepkg, srcdir - директория с исходниками ($startdir/src по умолчанию), pkgdir - директория с собранным пакетом ($startdir/pkg/$pkgname по умолчанию). Не используйте переменную startdir без крайней необходимости.

- -

Некоторые особенности PKGBUILD'ов

-

К PKGBUILD применимы все правила программирования на шелле. Например, "смешная шутка": - -{% highlight bash %} -pkgdir="/usr pkg" -rm -rf $pkgdir -{% endhighlight %} - -кому-то может показаться не очень смешной, увы. Поэтому все пути (да и вообще переменные - там где надо, конечно) лучше обрамлять в двойные кавычки (исключение - условия в двойных квадратных скобках [[ ... ]]). Если вы вводите какие-либо свои переменные, то настоятельно рекоммендуется добавить в начале подчеркивание _ во избежание перекрытия переменными makepkg.

- -

В русскоязычном сегменте до сих пор зачастую встречаются строки типа make || return 1. Дык вот, return 1 теперь уже давно как не нужен.

- -

Еще можно работать с рядом других переменных, определенных makepkg. Их список можно глянуть в /etc/makepkg.conf. Самые ходовые - флаги компиляции и CARCH. Так, например, если вы собираете пакет, исходники к которому предоставляются в бинарном виде (проприетарный драйвер, например), то кусок PKGBUILD может выглядеть так: - -{% highlight bash %} -if [ "${CARCH}" == "x86_64" ]; then - _filearch=amd64 - md5sums=('1f58521c2ddb9195a26a0bb3713a52a6') -else - _filearch=i386 - md5sums=('ef5a8809b6bff8c9bcf5a28e860a606b') -fi -source=(${pkgname}-${pkgver}.tar.gz:://istodo.ru/distribs/${pkgname}-linux-${pkgver}-${_filearch}.tar.gz) -{% endhighlight %} - -

- -

pkgbase вообще удобная штука. Например, для создания пакетов одновременно для двух версий Python PKGBUILD может выглядеть примерно так. Или, в общем случае, как-то так.

- -

Вообще говоря, для стандартных случаев существуют прототипы PKGBUILD'ов. Их можно найти в /usr/share/pacman/, хотя местами они могли немного устареть (больше года как). Так, прототипы для пакетов из системы контроля версий (git/svn/hg/bzr) однозначно устарели - сейчас используется другой, куда более аккуратный, формат. Настоятельно рекомендую ознакомиться на эту тему с данной статьей. Например, для пакета qmmp-qsmmp-git кусок PKGBUILD'а выглядит так: - -{% highlight bash %} -pkgname=qmmp-qsmmp-git -_gitname=qsmmp -pkgver=0.5.34.gcd1ca1a -# еще какие-то строки -makedepends=('git') -source=(${_gitname}::git+//gitorious.org/qsmmp/qsmmp.git#branch=qmmp-9999) -md5sums=('SKIP') -pkgver() { - cd "${_gitname}" - local ver=`git describe --long` - printf "%s" "${${ver//-/.}//qmmp./}" -} -{% endhighlight %} - -А для пакета kdeplasma-applets-stdin-svn так: - -{% highlight bash %} -pkgname=kdeplasma-applets-stdin-svn -pkgver=57 -pkgrel=1 -_pkgname=plasmoidstdin -_pkgver=0.2 -# еще какие-то строки -makedepends=('automoc4' 'cmake' 'subversion') -source=(${_pkgname}::svn+//plasmoidstdin.svn.sourceforge.net/svnroot/${_pkgname}/${_pkgver}/trunk) -md5sums=('SKIP') -pkgver() { - cd "${srcdir}/${_pkgname}" - local ver=`svnversion` - printf "%s" "${ver//[[:alpha:]]}" -} -{% endhighlight %} - -Также, я отмечу, что некоторые пакеты имеют свой устоявшийся формат, поэтому, зачастую, полезно поискать что-то похожее в AUR и сделать свой PKGBUILD по образу и подобию. -

- -

Дополнительные ссылки

- diff --git a/ru/_posts/2014-06-23-about-aur.md b/ru/_posts/2014-06-23-about-aur.md new file mode 100644 index 0000000..6772de8 --- /dev/null +++ b/ru/_posts/2014-06-23-about-aur.md @@ -0,0 +1,185 @@ +--- +category: ru +type: paper +hastr: false +layout: paper +tags: archlinux +title: Немного об Arch User Repository +short: about-aur +--- +Статья посвященная работе с пользовательским репозиторием Archlinux. Постарался сделать акцент на сопровождении пакетов. Данная статья, в большей степени, представляет собой компиляцию нескольких англоязычных статей Wiki и немного личного опыта. Поэтому не уверен, что в данной статье на английском языке будет толк. + + + +## AUR + +Итак, [Arch User Repository](//aur.archlinux.org/ "AUR") (AUR или АУР) - это репозиторий, поддерживаемый и развиваемый практически исключительно сообществом Archlinux. Есть еще отдельные люди, называемые [доверенными пользователями](//www.archlinux.org/trustedusers/ "Доверенные пользователи") (TU), на плечах которых лежит своеобразная "модерация" этого репозитория. На мой скромный взгляд, едва ли не единственное отличие Archlinux от других дистрибутивов - это наличие AUR'а. Отличие этого репозитория от обычных прежде всего в том, что он **не содержит** архивов с исходниками или собранных пакетов - только скрипт сборки (PKGBUILD) и, возможно, дополнительные текстовые файлы. + +Конечно, вручную скачивать архив с сайта AUR'а, а также проверять обновления, не совсем удобно, поэтому существует [набор хелперов](//wiki.archlinux.org/index.php/AUR_Helpers "ArchWiki"). Большинство хелперов представляет собой обертку над pacman. Я выделю только два - [packer](//aur.archlinux.org/packages/packer/ "AUR") - минималистичный, удобный, быстрый - и [yaourt](//aur.archlinux.org/packages/yaourt/ "AUR") - на шелле, но зато более функциональный. По не особо понятным мне причинам, в русскоязычном сегменте большее распространение получил yaourt, зарубежом - packer. + +Помимо хелперов, существуют также консольные клиенты для работы с AUR. Я выделю, пожалуй, только один - [python-aur](//aur.archlinux.org/packages/python3-aur/ "AUR"). Иногда удобная альтернатива веб-интерфейсу. + +Другая особенность данного репозитория - и не менее важная - **все действия с ним осуществляются на свой страх и риск**. Опасные и некорректные пакеты, конечно же, удаляются, но вполне могут быть и ошибки при сборке и еще все, что сможете придумать. Дык вот - работа с ним на вашей совести, и никто вам ничем не обязан, если что-то сломается. По этой же причине, ни один хелпер в обозримом будущем не будет перенесен в официальные репозитории. + +У пакетов в AUR есть несколько характеристик, которых нет у пакетов в официальных репозиториях: + +* группа - скорее для удобства поиска, сортировки. Немного помогает доверенным пользователям. +* автор, мейнтейнер, последний приславший - люди, кто, соответственно, первый раз прислал данный пакет, сопровождает его в настоящий момент, и последний прислал. +* голоса - когда кому-либо понравился этот пакет или он находит его полезным, он голосует. Теоретически, пакеты, имеющие больше 10 голосов могут попасть в официальные репозитории (если найдется желающий среди доверенных пользователей). Другой путь в официальные репозитории - попасть в [список часто используемых](//www.archlinux.de/?page=PackageStatistics "Статистика"), но вы же не пользуетесь [pkgstats](//www.archlinux.org/packages/pkgstats "Пакет Archlinux"). + + +## Установка с AUR + +Для работы с AUR требуется установить группу пакетов [base-devel](//www.archlinux.org/groups/x86_64/base-devel/ "Группа пакетов Archlinux"). Пакеты с этой группы, как правило, **не включены** в зависимости. Рекомендуемая установка пакетов с AUR выглядит примерно так: + +```bash +# скачать архив с PKGBUILD'ом c AUR +curl -L -O //aur.archlinux.org/packages/fo/foo/foo.tar.gz +cd foo +# отредактировать / проверить PKGBUILD +vi PKGBUILD +# собрать пакет. Флаг -c удалить директорию сборки, +# -s установить недостающие зависимости, +# -r удалить их после установки, +# -f перезаписать существующий пакет, если он есть +makepkg -csrf +# установить его +pacman -U foo-0.1-1-i686.pkg.tar.xz +``` + +## Загрузка пакета в AUR + +**Никаких** `makepkg -S`. С недавних пор данный метод считается устаревшим. Но обо всем по-порядку + +Нам нужно загрузить архив на сайт. В этом архиве **должны быть** PKGBUILD и .AURINFO. По поводу первого я расскажу еще чуть ниже, второй генерируется автоматически. Также, там могут быть установочные скрипты (*.install), патчи, файлы лицензии (если не предоставляются апстримом с исходниками), сервисы systemd, скрипты запуска - это то, что обычно включено. **Никаких исходников**. И тем более **никаких бинарников**. (Шутки-шутками, а я помню пакет, в котором исходный код записывался с помощью `cat << EOF` прямо в тексте PKGBUILD'а.) + +Все файлы кладем в одну директорию. Убедились, что install файл, если он есть, указан в переменной install, все другие исходные файлы указаны в массиве source, а хэш-суммы правильные (их легко можно сгенерировать, набрав `makepkg -g`). Далее из этой директории запустить команду `mkaurball` (пакет [pkgbuild-introspection](//www.archlinux.org/packages/pkgbuild-introspection "Пакет Archlinux")) - и архив готов. + +Несколько правил загрузки пакета в AUR: + +* Если такой пакет существует в официальном репозитории (любой версии), то **не нужно** заливать новый пакет. Если репозиторный пакет устарел, просто пометьте его, как устаревший. Исключение из этого правила составляют пакеты из системы контрля версий (VCS), о них чуть ниже. +* Проверьте AUR. Если такой пакет уже существует и у него есть мейнтейнер, вы **не сможете залить** свой пакет. Если у него нет мейнтейнера, то вы автоматически будете его сопровождающим после обновления. Еще может быть такой же пакет, но с другим названием, будьте внимательны. +* PKGBUILD должен следовать (более-менее) стандартам и должен быть более-менее аккуратным. В противном случае, пакет может быть удален без предупреждения. +* Пакет должен быть полезен еще кому-либо кроме Вас =) +* Рекомендуется проверить **собранный пакет и PKGBUILD** с помощью [namcap](//www.archlinux.org/packages/namcap "Пакет Archlinux"). Это не даст 100% гарантии, но на основные ошибки укажет. + + +## Сопровождение пакетов + +Если вы сопровождаете пакет и хотите его обновить, просто загрузите обновленный пакет еще раз. Читайте - и, по возможности, отвечайте - комментарии к вашему пакету, там иногда могут быть очень полезные замечания или дельные предложения. Если вы не хотите сопровождать больше ваш пакет (или нет времени), то, пожалуйста, нажмите на кнопку справа (бросить/disown), чтобы те, кто в нем заинтересован, смогли поддерживать его. Если есть пакет, который не имеет сопровождающего, и вы хотели бы им стать, вы также можете нажать на соответствующую кнопку справа в веб-интерфейсе =) + +## Список рассылки AUR + +По любому вопросу, связанному с работой AUR вы всегда можете обратиться в [список рассылки](//mailman.archlinux.org/mailman/listinfo/aur-general "Список рассылки") [aur-general (at) archlinux (dot) org](mailto:aur-general@archlinux.org "email"). На ваш вопрос ответят, вероятно, достаточно быстро; причем, ответить могут не только обычные пользователи, но и доверенные пользователи. Также, если вы вдруг неуверены в своем PKGBUILD'е, вы тоже можете всегда обратиться в список рассылки и показать свой PKGBUILD. + +Существует также отдельный список [рассылки для запросов](//mailman.archlinux.org/mailman/listinfo/aur-requests "Список рассылки") [aur-requests (at) archlinux (dot) org](mailto:aur-requests@archlinux.org "email"). На текущий момент (AUR 3.2.0) общение через данный список рассылки напрямую не рекомендуется - все обычные запросы должны отсылаться с использованием веб-интерфейса ([подробности](//mailman.archlinux.org/pipermail/aur-general/2014-July/029045.html "Тред")). Запросы, которые вы можете послать: + +* **Удаление пакета**. Запрос должен включать **краткое описание причины**, почему вы его хотите удалить. Обычные причины - специальный патч, который больше не нужен; пакет уныл и более не поддерживается апстримом; переименование; функциональность предоставляется другим пакетом. +* **"Бросить пакет"**. Лишить текущего мейнтейнера права сопровождать данный пакет. Официальное требование - вы должны связаться до этого с мейнтейнером по e-mail и **ожидать от него ответа в течение двух недель** (теперь это делается автоматически при отправке запроса через веб-интерфейс). Однако, если мейнтейнер неактивен в течение длительного времени, или пакет помечен, как устаревший, в течение длительного времени, то можно сделать исключение из этого правила. (Например, если пакет отмечен устаревшим более шести месяцев, то запрос удовлетворяется автоматически.) +* **Объединение пакетов**. Если пакет подлежит удалению, но имеет голоса (или важные комментарии), то его можно объединить с другим, который предоставляет то же самое. Частный случай - это аналогично переименованию пакета из одного в другой. + + +Пожалуйста, пишите письма в список рассылки аккуратно. И, желательно, вежливо (а то потом будете генерировать что-то вроде [такого](//linux.sytes.net/post/2014/05/aur-driven-by-idiots/ "Блог")) (мы все знаем, что мы арче-школьники, не надо нас еще раз этим тыкать, мы обидимся). Также старайтесь избегать избыточного цитирования. И - это практически требование - предоставляйте ссылки на пакеты. Хороший вариант - составление списка ссылок в конце письма, а в теле ссылаться на них таким образом `[1]`. Если не уверены в корректности запроса - посмотрите [архив списка рассылки](//mailman.archlinux.org/pipermail/aur-requests/ "Список рассылки"). + + +## PKGBUILD + +PKGBUILD - это, де-факто, сценарий шелла, указывающий как и почему (в смысле, зачем) собираться пакету. Он имеет 4 части: + +* **Объявление основных переменных**. Об этом я расскажу чуть ниже. +* **Подготовка исходников**. Этот пункт необязательный. Включает в себя копирование (если вдруг нужно), применение патчей, sed и прочие мелочи. Функция обозначается, как **prepare()**. +* **Сборка**. Также необязательный пункт. Здесь - и только здесь - должна проводиться компиляция. Функция обозначается, как **build()**. +* **Установка**. Обязательный пункт. Здесь происходит копирование нужных файлов в указанный корень (`$pkgdir`). Функция обозначается, как **package()** (для совмещенных пакетов таких функций несколько и они называются примерно так: **package_$pkgname()**). + +### Переменные PKGBUILD + +Основные переменные следующие: + +* **pkgbase** - группа пакетов. Например, пакеты `python-pyqt4` и `python2-pyqt4` имеют одну группу `pyqt4`. +* **pkgname** - имя (или массив имен для совмещенных пакетов) пакета; обязательная переменная. +* **pkgver** - версия пакета, указанная в апстриме, **pkgrel** - арче-специфичный релиз пакета. +* **pkgdesc** - краткое описание пакета. +* **arch** - массив архитектур. Как правило, `arch=('i686' 'x86_64')` для бинарных пакетов (очень-очень редко бывают пакеты, которые предоставляются только для одной архитектуры) и `arch=('any')` для пакетов, не содержащих бинарные файлы. +* **url** - адрес апстрима. +* **license** - лицензия. Если лицензия отлична от обычных (распространенные типы MIT, BSD и custom) - смотри пакет [core/licenses](//www.archlinux.org/packages/core/any/licenses/ "Пакет Archlinux") - то ее надо установить вместе с пакетом по пути `/usr/share/licenses/$pkgname/LICENSE`). +* **depends** - массив зависимостей, **необходимых для работы** пакета. **optdepends** - это **дополнительные зависимости**, которые не необходимы для работы, но предоставляют дополнительную функциональность. **makedepends** - это зависимости, которые не включены в **depends**, но **необходимы при сборке** пакета. Лучший способ проверить, правильно ли указаны зависимости сборки (зачастую, это самое важное) - попробуйте собрать пакет в чистом окружении (то есть совсем совсем чистом). И да, зависимости из группы [base-devel](//www.archlinux.org/groups/x86_64/base-devel/ "Группа пакетов Archlinux") указывать не надо. +* Следующие три переменные необязательны. **provides** - список пакетов, функциональность которых предоставляет данный пакет. **replaces** - список пакетов, которые данный пакет замещает (обычно используется для решения проблем с переименованием пакетов при обновлении). **conflicts** - список пакетов, с которым конфликтует данный пакет (имеет такие же файлы). Пример различия **provides** и **replaces** - [gvim](//www.archlinux.org/packages/gvim/ "Пакет Archlinux") предоставляет [vim](//www.archlinux.org/packages/vim/ "Пакет Archlinux"), а [wireshark-gtk](//www.archlinux.org/packages/wireshark-gtk/ "Пакет Archlinux") замещает wireshark. +* **install** - файл, содержащий сценарии, запускающиеся после установки/удаления/обновления (смотрите файл `/usr/share/pacman/proto.install`). +* **source** - где брать исходники, файлы предоставляемые вместе с пакетом указываются только по имени, к данному массиму также прилагается массив хэш сумм (md5sums/sha1sums/sha256sums/sha384sums/sha512sums). + +Все перечисленные выше переменные указываются в заголовке PKGBUILD. К ним также можно обращаться внутри PKGBUILD'а. Дополнительно стоит упомянуть переменные **startdir** - директория, откуда запускается makepkg, **srcdir** - директория с исходниками (`$startdir/src` по умолчанию), **pkgdir** - директория с собранным пакетом (`$startdir/pkg/$pkgname` по умолчанию). **Не используйте** переменную **startdir** без крайней необходимости. + +### Некоторые особенности PKGBUILD'ов + +К PKGBUILD применимы все правила программирования на шелле. Например, "смешная шутка": + +```bash +pkgdir="/usr pkg" +rm -rf $pkgdir +``` + +кому-то может показаться не очень смешной, увы. Поэтому все пути (да и вообще переменные - там где надо, конечно) лучше обрамлять в двойные кавычки (исключение - условия в двойных квадратных скобках `[[ ... ]]`). Если вы вводите какие-либо свои переменные, то настоятельно рекоммендуется добавить в начале подчеркивание `_` во избежание перекрытия переменными makepkg. + +В русскоязычном сегменте до сих пор зачастую встречаются строки типа `make || return 1`. Дык вот, `return 1` теперь уже давно как не нужен. + +Еще можно работать с рядом других переменных, определенных makepkg. Их список можно глянуть в `/etc/makepkg.conf`. Самые ходовые - флаги компиляции и `CARCH`. Так, например, если вы собираете пакет, исходники к которому предоставляются в бинарном виде (проприетарный драйвер, например), то кусок PKGBUILD может выглядеть так: + +```bash +if [ "${CARCH}" == "x86_64" ]; then + _filearch=amd64 + md5sums=('1f58521c2ddb9195a26a0bb3713a52a6') +else + _filearch=i386 + md5sums=('ef5a8809b6bff8c9bcf5a28e860a606b') +fi +source=(${pkgname}-${pkgver}.tar.gz:://istodo.ru/distribs/${pkgname}-linux-${pkgver}-${_filearch}.tar.gz) +``` + +**pkgbase** вообще удобная штука. Например, для создания пакетов одновременно для двух версий Python PKGBUILD может выглядеть [примерно так](//projects.archlinux.org/svntogit/community.git/tree/trunk/PKGBUILD?h=packages/python-biopython "Archlinux svn"). Или, в общем случае, [как-то так](//aur.archlinux.org/packages/ne/netctl-gui/PKGBUILD "AUR"). + +Вообще говоря, для стандартных случаев существуют прототипы PKGBUILD'ов. Их можно найти в `/usr/share/pacman/`, хотя местами они могли немного устареть (больше года как). Так, прототипы для пакетов из системы контроля версий (git/svn/hg/bzr) однозначно устарели - сейчас используется другой, куда более аккуратный, формат. Настоятельно рекомендую ознакомиться на эту тему [с данной статьей](//wiki.archlinux.org/index.php/VCS_PKGBUILD_Guidelines "ArchWiki"). Например, для пакета **qmmp-qsmmp-git** кусок PKGBUILD'а выглядит так: + +```bash +pkgname=qmmp-qsmmp-git +_gitname=qsmmp +pkgver=0.5.34.gcd1ca1a +# еще какие-то строки +makedepends=('git') +source=(${_gitname}::git+//gitorious.org/qsmmp/qsmmp.git#branch=qmmp-9999) +md5sums=('SKIP') +pkgver() { + cd "${_gitname}" + local ver=`git describe --long` + printf "%s" "${${ver//-/.}//qmmp./}" +} +``` + +А для пакета **kdeplasma-applets-stdin-svn** так: + +```bash +pkgname=kdeplasma-applets-stdin-svn +pkgver=57 +pkgrel=1 +_pkgname=plasmoidstdin +_pkgver=0.2 +# еще какие-то строки +makedepends=('automoc4' 'cmake' 'subversion') +source=(${_pkgname}::svn+//plasmoidstdin.svn.sourceforge.net/svnroot/${_pkgname}/${_pkgver}/trunk) +md5sums=('SKIP') +pkgver() { + cd "${srcdir}/${_pkgname}" + local ver=`svnversion` + printf "%s" "${ver//[[:alpha:]]}" +} +``` + +Также, я отмечу, что некоторые пакеты имеют свой устоявшийся формат, поэтому, зачастую, полезно поискать что-то похожее в AUR и сделать свой PKGBUILD по образу и подобию. + + +## Дополнительные ссылки + +* [Зеркало (git)](//pkgbuild.com/git/aur-mirror.git/ "Зеркало") +* [ArchWiki про AUR](//wiki.archlinux.org/index.php/AUR "ArchWiki") +* [ArchWiki про PKGBUILD](//wiki.archlinux.org/index.php/PKGBUILD "ArchWiki") +* [ArchWiki про makepkg](//wiki.archlinux.org/index.php/Makepkg "ArchWiki") +* [ArchWiki немного про стандарты](//wiki.archlinux.org/index.php/Arch_packaging_standards "ArchWiki") (внизу есть весьма полезные ссылки на гайды для конкретных типов пакетов) diff --git a/ru/_posts/2014-07-17-writting-own-completions-p1.html b/ru/_posts/2014-07-17-writting-own-completions-p1.html deleted file mode 100644 index 9eff18a..0000000 --- a/ru/_posts/2014-07-17-writting-own-completions-p1.html +++ /dev/null @@ -1,143 +0,0 @@ ---- -category: ru -type: paper -hastr: true -layout: paper -tags: linux, разработка -title: Написание своих дополнений для Shell. Zsh -short: writting-own-completions-p1 -description:
bash_completion
В данных статьях описываются некоторые основы создания файлов дополнений для собственной программы. ---- -

Преамбула

-

В процессе разработки одного своего проекта возникло желание добавить также файлы дополнений (только не спрашивайте зачем). Благо я как-то уже брался за написание подобных вещей, но читать что-либо тогда мне было лень, и так и не осилил.

- -

Введение

-

Существует несколько возможных вариантов написания файла автодополнения для zsh. В случае данной статьи я остановлюсь только на одном из них, который предоставляет большие возможности и не требует больших затрат (например, работы с регулярными выражениями).

- -

Рассмотрим на примере моего же приложения, часть справки к которому выглядит таким образом:

- -{% highlight bash %} -netctl-gui [ -h | --help ] [ -e ESSID | --essid ESSID ] [ -с FILE | --config FILE ] - [ -o PROFILE | --open PROFILE ] [ -t NUM | --tab NUM ] [ --set-opts OPTIONS ] -{% endhighlight %} - -

Список флагов:

-
    -
  • флаги -h и --help не требуют аргументов;
  • -
  • флаги -e и --essid требуют аргумента в виде строки, без дополнения;
  • -
  • флаги -c и --config требуют аргумента в виде строки, файл с произвольной локацией;
  • -
  • флаги -o и --open требуют аргумента в виде строки, дополнение по файлам из определенной директории;
  • -
  • флаги -t и --tab требуют аргумента в виде строки, дополнение из указанного массива;
  • -
  • флаг --set-opts требует аргумента в виде строки, дополнение из указанного массива, разделены запятыми;
  • -
- -

Структура файла

-

В заголовке должно быть обязательно указано, что это файл дополнений и для каких приложений он служит (можно строкой, если в файле будет содержаться дополнение для нескольких команд):

- -{% highlight bash %} -#compdef netctl-gui -{% endhighlight %} - -

Дальше идет описание флагов, вспомогательные функции и переменные. Замечу, что функции и переменные, которые будут использоваться для дополнения должны возвращать массивы, а не строки. В моем случае схема выглядит примерно так (все функции и переменные в этой главе умышленно оставлены пустыми):

- -{% highlight bash %} -# variables -_netctl_gui_arglist=() -_netctl_gui_settings=() -_netctl_gui_tabs=() -_netctl_profiles() {} -{% endhighlight %} - -

Затем идут основные функции, которые будут вызываться для дополнения для определенной команды. В моем случае команда одна, и функция одна:

- -{% highlight bash %} -# work block -_netctl-gui() {} -{% endhighlight %} - -

Далее без выделения в отдельную функцию идет небольшое шаманство, связанное с соотнесением приложения, которое было декларировано в первой строке, с функцией в теле скрипта:

- -{% highlight bash %} -case "$service" in - netctl-gui) - _netctl-gui "$@" && return 0 - ;; -esac -{% endhighlight %} - -

Флаги

-

Как я и говорил во введении, существует несколько способов создания подобных файлов. В частности, они различаются декларацией флагов и их дальнейшей обработкой. В данном случае я буду использовать команду _arguments, которая требует специфичный формат переменных. Выглядит он таким образом ФЛАГ[описание]:СООБЩЕНИЕ:ДЕЙСТВИЕ. Последние два поля не обязательны и, как Вы увидите чуть ниже, вовсе и не нужны в некоторых местах. Если Вы предусматриваете два флага (короткий и длинный формат) на одно действие, то формат чуть-чуть усложняется: {(ФЛАГ_2)ФЛАГ_1,(ФЛАГ_1)ФЛАГ_2}[описание]:СООБЩЕНИЕ:ДЕЙСТВИЕ. Замечу, что, если Вы хотите сделать дополнения для двух типов флагов, но некоторые флаги не имеют второй записи, то Вам необходимо продублировать его таким образом: {ФЛАГ,ФЛАГ}[описание]:СООБЩЕНИЕ:ДЕЙСТВИЕ. СООБЩЕНИЕ - сообщение, которое будет показано, ДЕЙСТВИЕ - действие, которое будет выполнено после этого флага. В случае данного туториала, ДЕЙСТВИЕ будет иметь вид ->СОСТОЯНИЕ.

- -

Итак, согласно нашим требованиям, получается такое объявление аргументов:

- -{% highlight bash %} -_netctl_gui_arglist=( - {'(--help)-h','(-h)--help'}'[show help and exit]' - {'(--essid)-e','(-e)--essid'}'[select ESSID]:type ESSID:->essid' - {'(--config)-c','(-c)--config'}'[read configuration from this file]:select file:->files' - {'(--open)-o','(-o)--open'}'[open profile]:select profile:->profiles' - {'(--tab)-t','(-t)--tab'}'[open a tab with specified number]:select tab:->tab' - {'--set-opts','--set-opts'}'[set options for this run, comma separated]:comma separated:->settings' -) -{% endhighlight %} - -

Массивы переменных

-

В нашем случае есть два статических массива (не изменятся ни сейчас, ни через пять минут) (массивы умышленно уменьшены):

- -{% highlight bash %} -_netctl_gui_settings=( - 'CTRL_DIR' - 'CTRL_GROUP' -) - -_netctl_gui_tabs=( - '1' - '2' -) -{% endhighlight %} - -

И есть динамический массив, который должен каждый раз генерироваться. Он содержит, в данном случае, файлы в указанной директории (это можно сделать и средствами zsh, кстати):

- -{% highlight bash %} -_netctl_profiles() { - print $(find /etc/netctl -maxdepth 1 -type f -printf "%f\n") -} -{% endhighlight %} - -

Тело функции

-

Помните, там выше было что-то про состояние? Оно хранится в переменной $state, и в теле функции делается проверка на то, чему оно равно, чтобы подобрать соответствующие действия. В начале также нужно не забыть вызвать _arguments с нашими флагами.

- -{% highlight bash %} -_netctl-gui() { - _arguments $_netctl_gui_arglist - case "$state" in - essid) - # не делать дополнения, ждать введенной строки - ;; - files) - # дополнение по существующим файлам - _files - ;; - profiles) - # дополнение из функции - # первая переменная описание - # вторая массив для дополнения - _values 'profiles' $(_netctl_profiles) - ;; - tab) - # дополнение из массива - _values 'tab' $_netctl_gui_tabs - ;; - settings) - # дополнение из массива - # флаг -s устанавливает разделитель и включает мультивыбор - _values -s ',' 'settings' $_netctl_gui_settings - ;; - esac -} -{% endhighlight %} - -

Заключение

-

Файл хранится в директории /usr/share/zsh/site-functions/ с произвольным, в общем-то, именем с префиксом _. Файл примера полностью может быть найден в моем репозитории.

- -

Дополнительная информация может быть найдена в репозитории zsh-completions. Например, там есть такой How-To. А еще там есть много примеров.

diff --git a/ru/_posts/2014-07-17-writting-own-completions-p1.md b/ru/_posts/2014-07-17-writting-own-completions-p1.md new file mode 100644 index 0000000..7b4e2d6 --- /dev/null +++ b/ru/_posts/2014-07-17-writting-own-completions-p1.md @@ -0,0 +1,152 @@ +--- +category: ru +type: paper +hastr: true +layout: paper +tags: linux, разработка +title: Написание своих дополнений для Shell. Zsh +short: writting-own-completions-p1 +--- +
![bash_completion](/resources/papers/zsh_completion.png)
В данных статьях описываются некоторые основы создания файлов дополнений для собственной программы. + + + +## Преамбула + +В процессе разработки [одного своего проекта](/ru/projects/netctl-gui "Страница netctl-gui") возникло желание добавить также файлы дополнений (только не спрашивайте зачем). Благо я как-то уже брался за написание подобных вещей, но читать что-либо тогда мне было лень, и так и не осилил. + +## Введение + +Существует несколько возможных вариантов написания файла автодополнения для zsh. В случае данной статьи я остановлюсь только на одном из них, который предоставляет большие возможности и не требует больших затрат (например, работы с регулярными выражениями). + +Рассмотрим на примере моего же приложения, часть справки к которому выглядит таким образом: + +```bash +netctl-gui [ -h | --help ] [ -e ESSID | --essid ESSID ] [ -с FILE | --config FILE ] + [ -o PROFILE | --open PROFILE ] [ -t NUM | --tab NUM ] [ --set-opts OPTIONS ] +``` + +Список флагов: + +* флаги `-h` и `--help` не требуют аргументов; +* флаги `-e` и `--essid` требуют аргумента в виде строки, без дополнения; +* флаги `-c` и `--config` требуют аргумента в виде строки, файл с произвольной локацией; +* флаги `-o` и `--open` требуют аргумента в виде строки, дополнение по файлам из определенной директории; +* флаги `-t` и `--tab` требуют аргумента в виде строки, дополнение из указанного массива; +* флаг `--set-opts` требует аргумента в виде строки, дополнение из указанного массива, разделены запятыми; + +## Структура файла + +В заголовке должно быть обязательно указано, что это файл дополнений и для каких приложений он служит (можно строкой, если в файле будет содержаться дополнение для нескольких команд): + +```bash +#compdef netctl-gui +``` + +Дальше идет описание флагов, вспомогательные функции и переменные. Замечу, что функции и переменные, которые будут использоваться для дополнения **должны возвращать массивы**, а не строки. В моем случае схема выглядит примерно так (все функции и переменные в этой главе умышленно оставлены пустыми): + +```bash +# variables +_netctl_gui_arglist=() +_netctl_gui_settings=() +_netctl_gui_tabs=() +_netctl_profiles() {} +``` + +Затем идут основные функции, которые будут вызываться для дополнения для определенной команды. В моем случае команда одна, и функция одна: + +```bash +# work block +_netctl-gui() {} +``` + +Далее **без выделения в отдельную функцию** идет небольшое шаманство, связанное с соотнесением приложения, которое было декларировано в первой строке, с функцией в теле скрипта: + +```bash +case "$service" in + netctl-gui) + _netctl-gui "$@" && return 0 + ;; +esac +``` + +## Флаги + +Как я и говорил во введении, существует несколько способов создания подобных файлов. В частности, они различаются декларацией флагов и их дальнейшей обработкой. В данном случае я буду использовать команду `_arguments`, которая требует специфичный формат переменных. Выглядит он таким образом `ФЛАГ[описание]:СООБЩЕНИЕ:ДЕЙСТВИЕ`. Последние два поля не обязательны и, как Вы увидите чуть ниже, вовсе и не нужны в некоторых местах. Если Вы предусматриваете два флага (короткий и длинный формат) на одно действие, то формат чуть-чуть усложняется: `{(ФЛАГ_2)ФЛАГ_1,(ФЛАГ_1)ФЛАГ_2}[описание]:СООБЩЕНИЕ:ДЕЙСТВИЕ`. Замечу, что, если Вы хотите сделать дополнения для двух типов флагов, но некоторые флаги не имеют второй записи, то Вам необходимо продублировать его таким образом: `{ФЛАГ,ФЛАГ}[описание]:СООБЩЕНИЕ:ДЕЙСТВИЕ`. `СООБЩЕНИЕ` - сообщение, которое будет показано, `ДЕЙСТВИЕ` - действие, которое будет выполнено после этого флага. В случае данного туториала, `ДЕЙСТВИЕ` будет иметь вид `->СОСТОЯНИЕ`. + +Итак, согласно нашим требованиям, получается такое объявление аргументов: + +```bash +_netctl_gui_arglist=( + {'(--help)-h','(-h)--help'}'[show help and exit]' + {'(--essid)-e','(-e)--essid'}'[select ESSID]:type ESSID:->essid' + {'(--config)-c','(-c)--config'}'[read configuration from this file]:select file:->files' + {'(--open)-o','(-o)--open'}'[open profile]:select profile:->profiles' + {'(--tab)-t','(-t)--tab'}'[open a tab with specified number]:select tab:->tab' + {'--set-opts','--set-opts'}'[set options for this run, comma separated]:comma separated:->settings' +) +``` + +## Массивы переменных + +В нашем случае есть два статических массива (не изменятся ни сейчас, ни через пять минут) (массивы умышленно уменьшены): + +```bash +_netctl_gui_settings=( + 'CTRL_DIR' + 'CTRL_GROUP' +) + +_netctl_gui_tabs=( + '1' + '2' +) +``` + +И есть динамический массив, который должен каждый раз генерироваться. Он содержит, в данном случае, файлы в указанной директории (это можно сделать и средствами zsh, кстати): + +```bash +_netctl_profiles() { + print $(find /etc/netctl -maxdepth 1 -type f -printf "%f\n") +} +``` + +## Тело функции + +Помните, там выше было что-то про состояние? Оно хранится в переменной `$state`, и в теле функции делается проверка на то, чему оно равно, чтобы подобрать соответствующие действия. В начале также нужно не забыть вызвать `_arguments` с нашими флагами. + +```bash +_netctl-gui() { + _arguments $_netctl_gui_arglist + case "$state" in + essid) + # не делать дополнения, ждать введенной строки + ;; + files) + # дополнение по существующим файлам + _files + ;; + profiles) + # дополнение из функции + # первая переменная описание + # вторая массив для дополнения + _values 'profiles' $(_netctl_profiles) + ;; + tab) + # дополнение из массива + _values 'tab' $_netctl_gui_tabs + ;; + settings) + # дополнение из массива + # флаг -s устанавливает разделитель и включает мультивыбор + _values -s ',' 'settings' $_netctl_gui_settings + ;; + esac +} +``` + +## Заключение + +Файл хранится в директории `/usr/share/zsh/site-functions/` с произвольным, в общем-то, именем с префиксом `_`. Файл примера полностью может быть найден [в моем репозитории](//raw.githubusercontent.com/arcan1s/netctl-gui/master/sources/gui/zsh-completions "Файл"). + +Дополнительная информация может быть найдена в репозитории [zsh-completions](//github.com/zsh-users/zsh-completions "GitHub"). Например, там есть такой [How-To](//github.com/zsh-users/zsh-completions/blob/master/zsh-completions-howto.org "Туториал"). А еще там есть много примеров. diff --git a/ru/_posts/2014-07-17-writting-own-completions-p2.html b/ru/_posts/2014-07-17-writting-own-completions-p2.html deleted file mode 100644 index b5afe48..0000000 --- a/ru/_posts/2014-07-17-writting-own-completions-p2.html +++ /dev/null @@ -1,135 +0,0 @@ ---- -category: ru -type: paper -hastr: true -layout: paper -tags: linux, разработка -title: Написание своих дополнений для Shell. Bash -short: writting-own-completions-p2 -description:
bash_completion
В данных статьях описываются некоторые основы создания файлов дополнений для собственной программы. ---- -

Преамбула

-

В процессе разработки одного своего проекта возникло желание добавить также файлы дополнений (только не спрашивайте зачем). Благо я как-то уже брался за написание подобных вещей, но читать что-либо тогда мне было лень, и так и не осилил.

- -

Введение

-

Bash, в отличие от zsh, требует к себе некоторого велосипедостроения в отношении дополнений. Бегло погуглив, я не нашел более-менее нормальных туториалов, потому за основу были взяты имеющиеся в системе файлы дополнений для pacman.

- -

Рассмотрим на примере все того же моего приложения. Я напомню, что часть справки к которому выглядит таким образом:

- -{% highlight bash %} -netctl-gui [ -h | --help ] [ -e ESSID | --essid ESSID ] [ -с FILE | --config FILE ] - [ -o PROFILE | --open PROFILE ] [ -t NUM | --tab NUM ] [ --set-opts OPTIONS ] -{% endhighlight %} - -

Список флагов:

-
    -
  • флаги -h и --help не требуют аргументов;
  • -
  • флаги -e и --essid требуют аргумента в виде строки, без дополнения;
  • -
  • флаги -c и --config требуют аргумента в виде строки, файл с произвольной локацией;
  • -
  • флаги -o и --open требуют аргумента в виде строки, дополнение по файлам из определенной директории;
  • -
  • флаги -t и --tab требуют аргумента в виде строки, дополнение из указанного массива;
  • -
  • флаг --set-opts требует аргумента в виде строки, дополнение из указанного массива, разделены запятыми;
  • -
- -

Структура файла

-

Здесь все переменные должны возвращать массив. Каких-либо особых форматов тут уже нет. Сначала опишем флаги, потом уже все остальные переменные. Я напомню (так как ниже я уже не буду приводить функции более подробно), что _netctl_profiles(), в отличие от других переменных, должна возвращать актуальный на данный момент массив:

- -{% highlight bash %} -# variables -_netctl_gui_arglist=() -_netctl_gui_settings=() -_netctl_gui_tabs=() -_netctl_profiles() {} -{% endhighlight %} - -

Затем идут основные функции, которые будут вызываться для дополнения для определенной команды. В моем случае команда одна, и функция одна:

- -{% highlight bash %} -# work block -_netctl-gui() {} -{% endhighlight %} - -

Далее, опять, без выделения в отдельную функцию делаем соответствие "функция-команда":

- -{% highlight bash %} -complete -F _netctl_gui netctl-gui -{% endhighlight %} - -

Флаги

-

Как было сказано выше, особого формата тут нет, доступные флаги располагаются просто массивом:

- -{% highlight bash %} -_netctl_gui_arglist=( - '-h' - '--help' - '-e' - '--essid' - '-c' - '--config' - '-o' - '--open' - '-t' - '--tab' - '--set-opts' -) -{% endhighlight %} - -

Массивы переменных

-

Приведу только функцию, которая в zsh выглядела таким образом:

- -{% highlight bash %} -_netctl_profiles() { - print $(find /etc/netctl -maxdepth 1 -type f -printf "%f\n") -} -{% endhighlight %} - -

В bash так не получится, пришлось чуть-чуть изменить:

- -{% highlight bash %} -_netctl_profiles() { - echo $(find /etc/netctl -maxdepth 1 -type f -printf "%f\n") -} -{% endhighlight %} - -

Тело функции

-

За дополнение в bash отвечает переменная COMPREPLY. Для отслеживания текущего состояния нужно вызвать функцию _get_comp_words_by_ref с параметрами cur (текущая опция) и prev (предыдущая, собственно состояние). Ну и нужно несколько точек, на которых сворачивать в определенную часть case (переменные want*). Для генерации дополнения используется compgen. После флага -W ему подается список слов. (Есть еще флаг -F, который вызывает функцию, но у меня он помимо этого еще и ворнинг выдает.) Последним аргументом идет текущая строка, к которой и нужно генерировать дополнение.

- -

Таким образом, наша функция выглядит так:

- -{% highlight bash %} -_netctl_gui() { - COMPREPLY=() - wantfiles='-@(c|-config)' - wantprofiles='-@(o|-open|s|-select)' - wantsettings='-@(-set-opts)' - - wanttabs='-@(t|-tab)' - _get_comp_words_by_ref cur prev - - if [[ $prev = $wantstring ]]; then - # не делать дополнения, ждать введенной строки - COMPREPLY=() - elif [[ $prev = $wantfiles ]]; then - # дополнение по существующим файлам - _filedir - elif [[ $prev = $wantprofiles ]]; then - # дополнение из функции - COMPREPLY=($(compgen -W '${_netctl_profiles[@]}' -- "$cur")) - elif [[ $prev = $wanttabs ]]; then - # дополнение из массива - COMPREPLY=($(compgen -W '${_netctl_gui_tabs[@]}' -- "$cur")) - elif [[ $prev = $wantsettings ]]; then - # дополнение из массива - # -S вставит запятую после, но вот мультивыбор не включил =( - COMPREPLY=($(compgen -S ',' -W '${_netctl_gui_settings[@]}' -- "$cur")) - else - # вывести доступные аргументы - COMPREPLY=($(compgen -W '${_netctl_gui_arglist[@]}' -- "$cur")) - fi - - true -} -{% endhighlight %} - -

Заключение

-

Файл хранится в директории /usr/share/bash-completion/completions/ с произвольным именем. Файл примера полностью может быть найден в моем репозитории.

diff --git a/ru/_posts/2014-07-17-writting-own-completions-p2.md b/ru/_posts/2014-07-17-writting-own-completions-p2.md new file mode 100644 index 0000000..7605424 --- /dev/null +++ b/ru/_posts/2014-07-17-writting-own-completions-p2.md @@ -0,0 +1,144 @@ +--- +category: ru +type: paper +hastr: true +layout: paper +tags: linux, разработка +title: Написание своих дополнений для Shell. Bash +short: writting-own-completions-p2 +--- +
![bash_completion](/resources/papers/bash_completion.png)
В данных статьях описываются некоторые основы создания файлов дополнений для собственной программы. + + + +## Преамбула + +В процессе разработки [одного своего проекта](/ru/projects/netctl-gui "Страница netctl-gui") возникло желание добавить также файлы дополнений (только не спрашивайте зачем). Благо я как-то уже брался за написание подобных вещей, но читать что-либо тогда мне было лень, и так и не осилил. + +## Введение + +Bash, в [отличие от zsh](/ru/2014/07/17/writting-own-completions-p1 "Статья о дополнениях zsh"), требует к себе некоторого велосипедостроения в отношении дополнений. Бегло погуглив, я не нашел более-менее нормальных туториалов, потому за основу были взяты имеющиеся в системе файлы дополнений для `pacman`. + +Рассмотрим на примере все того же моего приложения. Я напомню, что часть справки к которому выглядит таким образом: + +```bash +netctl-gui [ -h | --help ] [ -e ESSID | --essid ESSID ] [ -с FILE | --config FILE ] + [ -o PROFILE | --open PROFILE ] [ -t NUM | --tab NUM ] [ --set-opts OPTIONS ] +``` + +Список флагов: + +* флаги `-h` и `--help` не требуют аргументов; +* флаги `-e` и `--essid` требуют аргумента в виде строки, без дополнения; +* флаги `-c` и `--config` требуют аргумента в виде строки, файл с произвольной локацией; +* флаги `-o` и `--open` требуют аргумента в виде строки, дополнение по файлам из определенной директории; +* флаги `-t` и `--tab` требуют аргумента в виде строки, дополнение из указанного массива; +* флаг `--set-opts` требует аргумента в виде строки, дополнение из указанного массива, разделены запятыми; + +## Структура файла + +Здесь **все** переменные должны возвращать массив. Каких-либо особых форматов тут уже нет. Сначала опишем флаги, потом уже все остальные переменные. Я напомню (так как ниже я уже не буду приводить функции более подробно), что `_netctl_profiles()`, в отличие от других переменных, должна возвращать актуальный на данный момент массив: + +```bash +# variables +_netctl_gui_arglist=() +_netctl_gui_settings=() +_netctl_gui_tabs=() +_netctl_profiles() {} +``` + +Затем идут основные функции, которые будут вызываться для дополнения для определенной команды. В моем случае команда одна, и функция одна: + +```bash +# work block +_netctl-gui() {} +``` + +Далее, опять, **без выделения в отдельную функцию** делаем соответствие "функция-команда": + +```bash +complete -F _netctl_gui netctl-gui +``` + +## Флаги + +Как было сказано выше, особого формата тут нет, доступные флаги располагаются просто массивом: + +```bash +_netctl_gui_arglist=( + '-h' + '--help' + '-e' + '--essid' + '-c' + '--config' + '-o' + '--open' + '-t' + '--tab' + '--set-opts' +) +``` + +## Массивы переменных + +Приведу только функцию, которая в zsh выглядела таким образом: + +```bash +_netctl_profiles() { + print $(find /etc/netctl -maxdepth 1 -type f -printf "%f\n") +} +``` + +В bash так не получится, пришлось чуть-чуть изменить: + +```bash +_netctl_profiles() { + echo $(find /etc/netctl -maxdepth 1 -type f -printf "%f\n") +} +``` + +## Тело функции + +За дополнение в bash отвечает переменная `COMPREPLY`. Для отслеживания текущего состояния нужно вызвать функцию `_get_comp_words_by_ref` с параметрами `cur` (текущая опция) и `prev` (предыдущая, собственно состояние). Ну и нужно несколько точек, на которых сворачивать в определенную часть case (переменные `want*`). Для генерации дополнения используется `compgen`. После флага `-W` ему подается список слов. (Есть еще флаг `-F`, который вызывает функцию, но у меня он помимо этого еще и ворнинг выдает.) Последним аргументом идет текущая строка, к которой и нужно генерировать дополнение. + +Таким образом, наша функция выглядит так: + +```bash +_netctl_gui() { + COMPREPLY=() + wantfiles='-@(c|-config)' + wantprofiles='-@(o|-open|s|-select)' + wantsettings='-@(-set-opts)' + + wanttabs='-@(t|-tab)' + _get_comp_words_by_ref cur prev + + if [[ $prev = $wantstring ]]; then + # не делать дополнения, ждать введенной строки + COMPREPLY=() + elif [[ $prev = $wantfiles ]]; then + # дополнение по существующим файлам + _filedir + elif [[ $prev = $wantprofiles ]]; then + # дополнение из функции + COMPREPLY=($(compgen -W '${_netctl_profiles[@]}' -- "$cur")) + elif [[ $prev = $wanttabs ]]; then + # дополнение из массива + COMPREPLY=($(compgen -W '${_netctl_gui_tabs[@]}' -- "$cur")) + elif [[ $prev = $wantsettings ]]; then + # дополнение из массива + # -S вставит запятую после, но вот мультивыбор не включил =( + COMPREPLY=($(compgen -S ',' -W '${_netctl_gui_settings[@]}' -- "$cur")) + else + # вывести доступные аргументы + COMPREPLY=($(compgen -W '${_netctl_gui_arglist[@]}' -- "$cur")) + fi + + true +} +``` + +## Заключение + +Файл хранится в директории `/usr/share/bash-completion/completions/` с произвольным именем. Файл примера полностью может быть найден [в моем репозитории](//raw.githubusercontent.com/arcan1s/netctl-gui/master/sources/gui/bash-completions "Файл"). diff --git a/ru/_posts/2014-09-04-migration-to-v2.html b/ru/_posts/2014-09-04-migration-to-v2.html deleted file mode 100644 index bfa9431..0000000 --- a/ru/_posts/2014-09-04-migration-to-v2.html +++ /dev/null @@ -1,38 +0,0 @@ ---- -category: ru -type: paper -hastr: true -layout: paper -tags: awesome-widgets, pytextmonitor -title: Миграция Awesome Widgets (ex-PyTextMonitor) на версию 2.0 -short: migration-to-v2 -description:
broken-computer
В версии 2.0 произошел ряд значительных изменений (совершенно случайно, само по себе, я тут не при чем) и было полностью переписано пользовательское API. Данная статья призвана облегчить миграцию со старых версий PyTextMonitor (<1.11.0) на новую (>2.0). ---- -

Новые фичи

-

Во-первых, это ряд нововведений, среди которых:

- -
    -
  • Новый виджет - Desktop panel. Показывает список рабочих столов, выделяя активный. Умеет переключаться между ними по клику. Также умеет скрывать выбранные панели по хоткею.
  • -
  • Новые теги - hddfreemb, hddfreegb, memusedmb, memusedgb, memfreemb, memfreegb, swapfreemb, swapfreegb. А также новые теги, связанные с новыми возможностями - desktop, ndesktop, tdesktops.
  • -
  • Новый графический тултип - батарея. Двухцветный, в зависимости от статуса адаптора питания.
  • -
- -

Значительные изменения

-

Во-вторых, и это главное - произошел ряд изменений, из-за которых старые настройки не будут более работать. Среди пользовательских следует выделить:

- -
    -
  • Переписка основного виджета на С++, что вызвало переименование проекта в Awesome Widgets, а главного виджета в Awesome Widget
  • -
  • Настройки файлов батареи и адаптора питания вынесены в DataEngine.
  • -
  • Убраны поля. Теперь виджет представляет собой монолитное поле. Текст настраивается в специальном браузере.
  • -
  • В связи с удалением отдельных полей, тултип теперь настраивается отдельно.
  • -
  • Настройка выравнивания текста теперь может быть осуществлена только с использованием HTML тегов.
  • -
  • В связи с объединением полей, несколько тегов были переименованы: -
      -
    • custom (время) -> ctime
    • -
    • custom (время работы) -> cuptime
    • -
    • time (плеер) -> duration
    • -
    -
  • -
- -

По любым проблемам, связанным с миграцией, не стесняйтесь оставлять здесь комментарий.

diff --git a/ru/_posts/2014-09-04-migration-to-v2.md b/ru/_posts/2014-09-04-migration-to-v2.md new file mode 100644 index 0000000..a8a80d1 --- /dev/null +++ b/ru/_posts/2014-09-04-migration-to-v2.md @@ -0,0 +1,36 @@ +--- +category: ru +type: paper +hastr: true +layout: paper +tags: awesome-widgets, pytextmonitor +title: Миграция Awesome Widgets (ex-PyTextMonitor) на версию 2.0 +short: migration-to-v2 +--- +
![broken-computer](/resources/papers/broken-computer.jpg)
В версии 2.0 произошел ряд значительных изменений (совершенно случайно, само по себе, я тут не при чем) и было полностью переписано пользовательское API. Данная статья призвана облегчить миграцию со старых версий PyTextMonitor (<1.11.0) на новую (>2.0). + + + +## Новые фичи + +Во-первых, это ряд нововведений, среди которых: + +* Новый виджет - **Desktop panel**. Показывает список рабочих столов, выделяя активный. Умеет переключаться между ними по клику. Также умеет скрывать выбранные панели по хоткею. +* Новые теги - `hddfreemb`, `hddfreegb`, `memusedmb`, `memusedgb`, `memfreemb`, `memfreegb`, `swapfreemb`, `swapfreegb`. А также новые теги, связанные с новыми возможностями - `desktop`, `ndesktop`, `tdesktops`. +* Новый графический тултип - батарея. Двухцветный, в зависимости от статуса адаптора питания. + +## Значительные изменения + +Во-вторых, и это главное - произошел ряд изменений, из-за которых старые настройки **не будут** более работать. Среди пользовательских следует выделить: + +* Переписка основного виджета на `С++`, что вызвало переименование проекта в **Awesome Widgets**, а главного виджета в **Awesome Widget** +* Настройки файлов батареи и адаптора питания **вынесены в DataEngine**. +* **Убраны поля**. Теперь виджет представляет собой монолитное поле. Текст настраивается в специальном браузере. +* В связи с удалением отдельных полей, тултип теперь **настраивается отдельно**. +* Настройка выравнивания текста теперь может быть осуществлена только с использованием HTML тегов. +* В связи с объединением полей, несколько тегов были переименованы: + * `custom` (время) -> `ctime` + * `custom` (время работы) -> `cuptime` + * `time` (плеер) -> `duration` + +По любым проблемам, связанным с миграцией, не стесняйтесь оставлять здесь комментарий. diff --git a/ru/_posts/2014-12-12-encryption-home-directory.html b/ru/_posts/2014-12-12-encryption-home-directory.html deleted file mode 100644 index 0afda3f..0000000 --- a/ru/_posts/2014-12-12-encryption-home-directory.html +++ /dev/null @@ -1,172 +0,0 @@ ---- -category: ru -type: paper -hastr: true -layout: paper -tags: linux, systemd, ecryptfs -title: Как зашифровать хомяк и не об%$#аться. For dummies -short: ecnryption-home-directory -description:
single-door
Статья посвящена шифрованию домашнего каталога с использованием ecryptfs и настройке автомонтирования посредством systemd с использованием ключа на флешке. ---- -

Шаг 0: Подготовка

-
    -
  1. Разлогинились пользователем. То есть совсем-совсем.
  2. -
  3. Зашли под root в tty. Дальнейшие действия описаны от него.
  4. -
  5. Передвинули наш хомяк и создали пустую директорию (s/$USER/имя пользователя/): - -{% highlight bash %} -mv /home/{$USER,$USER-org} -mkdir /home/$USER -chmod 700 /home/$USER -chown $USER:users /home/$USER -{% endhighlight %} - -
  6. -
- -

Шаг 1: Шифрование

-

Самое распространенное решение в интернетах - воспользоваться автоматическими тулзами. Однако в нашем случае они не подходят, так как нам необходимо импортировать сигнатуру ключа / пароля, что при данном решении невозможно (или у автора руки кривые).

- -

Делается шифрование следующим образом (lol):

- -{% highlight bash %} -mount -t ecryptfs /home/$USER /home/$USER -{% endhighlight %} - -

В процессе он у нас задаст несколько вопросов (я предлагаю первое монтирование делать в интерактивном режиме). Ответы можно взять примерно такие (в комментариях показано, что эти опции делают), обратите внимание, что если вы что то измените, то изменится и некоторые строчки далее:

- -{% highlight bash %} -# ключ или сертификат. Второе надежнее, но до тех пор пока не потеряете %) -Select key type to use for newly created files: - 1) passphrase - 2) openssl -Selection: 1 -# пароль -Passphrase: -# шифрование, ставим берем дефолт -Select cipher: - 1) aes: blocksize = 16; min keysize = 16; max keysize = 32 - 2) blowfish: blocksize = 8; min keysize = 16; max keysize = 56 - 3) des3_ede: blocksize = 8; min keysize = 24; max keysize = 24 - 4) twofish: blocksize = 16; min keysize = 16; max keysize = 32 - 5) cast6: blocksize = 16; min keysize = 16; max keysize = 32 - 6) cast5: blocksize = 8; min keysize = 5; max keysize = 16 -Selection [aes]: 1 -# размер ключа, берем дефолт -Select key bytes: - 1) 16 - 2) 32 - 3) 24 -Selection [16]: 1 -# разрешать читать/писать в нешифрованные файлы в точке монтирования -Enable plaintext passthrough (y/n) [n]: n -# включить шифрование имен файлов -Enable filename encryption (y/n) [n]: y -Filename Encryption Key (FNEK) Signature [360d0573e701851e]: -# многабукафниасилил -Attempting to mount with the following options: - ecryptfs_unlink_sigs - ecryptfs_fnek_sig=360d0573e701851e - ecryptfs_key_bytes=16 - ecryptfs_cipher=aes - ecryptfs_sig=360d0573e701851e -WARNING: Based on the contents of [/root/.ecryptfs/sig-cache.txt], -it looks like you have never mounted with this key -before. This could mean that you have typed your -passphrase wrong. - -# подтверждаем, выходим -Would you like to proceed with the mount (yes/no)? : yes -Would you like to append sig [360d0573e701851e] to -[/root/.ecryptfs/sig-cache.txt] -in order to avoid this warning in the future (yes/no)? : yes -Successfully appended new sig to user sig cache file -Mounted eCryptfs -{% endhighlight %} - -

Далее просто копируем файлы из родного хомяка:

- -{% highlight bash %} -cp -a /home/$USER-org/. /home/$USER -{% endhighlight %} - -

Шаг 2: Автомонтирование с systemd

-

Создадим файл на флешке (я использовал microSD) со следующим содержанием (пароль только поставьте свой):

- -{% highlight bash %} -passphrase_passwd=someverystronguniqpassword -{% endhighlight %} - -

Добавим автомонтирование флешки (направление /mnt/key) в fstab с опцией ro, например так:

- -{% highlight bash %} -UUID=dc3ecb41-bc40-400a-b6bf-65c5beeb01d7 /mnt/key ext2 ro,defaults 0 0 -{% endhighlight %} - -

Теперь настроим монтирование хомяка. Опции монтирования можно подглядеть как то так:

- -{% highlight bash %} -mount | grep ecryptfs -{% endhighlight %} - -

Однако замечу, что там указаны не все опции, необходимо добавить также key, no_sig_cache, ecryptfs_passthrough. Таким образом, для systemd mount-юнит выглядит примерно так (любители shell-простыней смогут написать свой демон, потому что через fstab не сработает просто так (см. ниже)).

- -{% highlight bash %} -# cat /etc/systemd/system/home-$USER.mount -[Unit] -Before=local-fs.target -After=mnt-key.mount - -[Mount] -What=/home/$USER -Where=/home/$USER -Type=ecryptfs -Options=rw,nosuid,nodev,relatime,key=passphrase:passphrase_passwd_file=/mnt/key/keyfile,no_sig_cache,ecryptfs_fnek_sig=XXXXX,ecryptfs_sig=XXXXX,ecryptfs_cipher=aes,ecryptfs_key_bytes=16,ecryptfs_passthrough=n,ecryptfs_unlink_sigs - -[Install] -WantedBy=local-fs.target -{% endhighlight %} - -

XXXXX нужно заменить на сигнатуру из опций, с которыми сейчас смонтирована директория. Также нужно вставить имя пользователя и отредактировать путь к файлу с паролем (и имя mount-юнита), если это необходимо. Автозагрука:

- -{% highlight bash %} -systemctl enable home-$USER.mount -{% endhighlight %} - -

Сервис для отмонтирования флешки, когда она не нужна будет:

- -{% highlight bash %} -# cat /etc/systemd/system/umount-key.service -[Unit] -Description=Unmount key card -Before=local-fs.target -After=home-arcanis.mount - -[Service] -Type=oneshot -ExecStart=/usr/bin/umount /mnt/key - -[Install] -WantedBy=local-fs.target -{% endhighlight %} - -

Включаем:

- -{% highlight bash %} -systemctl enable umount-key.service -{% endhighlight %} - -

Перезагружаемся, если все ок, удаляем бекап. Если нет - значит что то где то неправильно сделали, восстанавливаем из режима восстановления.

- -

Почему не fstab?

-

В моем случае, мне не получилось заставить флешку монтироваться раньше. Таким образом на загрузке я попадал в консоль восстановления из которой нужно было просто продолжить загрузку. Существующие в интернете методы предлагают два возможных варианта:

- -
    -
  • Создать запись с опцией noauto, потом монтировать через специальную запись в rc.local.
  • -
  • Создать запись с опцией nofail, потом перемонтировать все разделы через rc.local.
  • -
- -

Оба варианта меня не устроили в виду их костыльности.

- -

Почему не pam?

-

Другое распространенное предложение - монтировать через запись в настройках pam. Мне этот вариант не подходит, так как у меня авторизация беспарольная по отпечатку пальца.

\ No newline at end of file diff --git a/ru/_posts/2014-12-12-encryption-home-directory.md b/ru/_posts/2014-12-12-encryption-home-directory.md new file mode 100644 index 0000000..daacbe7 --- /dev/null +++ b/ru/_posts/2014-12-12-encryption-home-directory.md @@ -0,0 +1,174 @@ +--- +category: ru +type: paper +hastr: true +layout: paper +tags: linux, systemd, ecryptfs +title: Как зашифровать хомяк и не об%$#аться. For dummies +short: ecnryption-home-directory +--- +
![single-door](/resources/papers/single-door.jpg)
Статья посвящена шифрованию домашнего каталога с использованием ecryptfs и настройке автомонтирования посредством systemd с использованием ключа на флешке. + + + +## Шаг 0: Подготовка + +1. Разлогинились пользователем. То есть совсем-совсем. +2. Зашли под root в tty. Дальнейшие действия описаны от него. +3. Передвинули наш хомяк и создали пустую директорию (`s/$USER/имя пользователя/`): + + ```bash + mv /home/{$USER,$USER-org} + mkdir /home/$USER + chmod 700 /home/$USER + chown $USER:users /home/$USER + ``` + +## Шаг 1: Шифрование + +Самое распространенное решение в интернетах - воспользоваться автоматическими тулзами. Однако в нашем случае они не подходят, так как нам необходимо импортировать сигнатуру ключа / пароля, что при данном решении невозможно (или у автора руки кривые). + +Делается шифрование следующим образом (lol): + +```bash +mount -t ecryptfs /home/$USER /home/$USER +``` + +В процессе он у нас задаст несколько вопросов (я предлагаю первое монтирование делать в интерактивном режиме). Ответы можно взять примерно такие (в комментариях показано, что эти опции делают), обратите внимание, что если вы что то измените, то изменится и некоторые строчки далее: + +```bash +# ключ или сертификат. Второе надежнее, но до тех пор пока не потеряете %) +Select key type to use for newly created files: + 1) passphrase + 2) openssl +Selection: 1 +# пароль +Passphrase: +# шифрование, ставим берем дефолт +Select cipher: + 1) aes: blocksize = 16; min keysize = 16; max keysize = 32 + 2) blowfish: blocksize = 8; min keysize = 16; max keysize = 56 + 3) des3_ede: blocksize = 8; min keysize = 24; max keysize = 24 + 4) twofish: blocksize = 16; min keysize = 16; max keysize = 32 + 5) cast6: blocksize = 16; min keysize = 16; max keysize = 32 + 6) cast5: blocksize = 8; min keysize = 5; max keysize = 16 +Selection [aes]: 1 +# размер ключа, берем дефолт +Select key bytes: + 1) 16 + 2) 32 + 3) 24 +Selection [16]: 1 +# разрешать читать/писать в нешифрованные файлы в точке монтирования +Enable plaintext passthrough (y/n) [n]: n +# включить шифрование имен файлов +Enable filename encryption (y/n) [n]: y +Filename Encryption Key (FNEK) Signature [360d0573e701851e]: +# многабукафниасилил +Attempting to mount with the following options: + ecryptfs_unlink_sigs + ecryptfs_fnek_sig=360d0573e701851e + ecryptfs_key_bytes=16 + ecryptfs_cipher=aes + ecryptfs_sig=360d0573e701851e +WARNING: Based on the contents of [/root/.ecryptfs/sig-cache.txt], +it looks like you have never mounted with this key +before. This could mean that you have typed your +passphrase wrong. + +# подтверждаем, выходим +Would you like to proceed with the mount (yes/no)? : yes +Would you like to append sig [360d0573e701851e] to +[/root/.ecryptfs/sig-cache.txt] +in order to avoid this warning in the future (yes/no)? : yes +Successfully appended new sig to user sig cache file +Mounted eCryptfs +``` + +Далее просто копируем файлы из родного хомяка: + +```bash +cp -a /home/$USER-org/. /home/$USER +``` + +## Шаг 2: Автомонтирование с systemd + +Создадим файл на флешке (я использовал microSD) со следующим содержанием (пароль только поставьте свой): + +```bash +passphrase_passwd=someverystronguniqpassword +``` + +Добавим автомонтирование флешки (направление `/mnt/key`) в `fstab` с опцией `ro`, например так: + +```bash +UUID=dc3ecb41-bc40-400a-b6bf-65c5beeb01d7 /mnt/key ext2 ro,defaults 0 0 +``` + +Теперь настроим монтирование хомяка. Опции монтирования можно подглядеть как то так: + +```bash +mount | grep ecryptfs +``` + +Однако замечу, что там указаны не все опции, необходимо добавить также `key`, `no_sig_cache`, `ecryptfs_passthrough`. Таким образом, для systemd mount-юнит выглядит примерно так (любители shell-простыней смогут написать свой демон, потому что через `fstab` не сработает просто так (см. ниже)). + +```bash +# cat /etc/systemd/system/home-$USER.mount +[Unit] +Before=local-fs.target +After=mnt-key.mount + +[Mount] +What=/home/$USER +Where=/home/$USER +Type=ecryptfs +Options=rw,nosuid,nodev,relatime,key=passphrase:passphrase_passwd_file=/mnt/key/keyfile,no_sig_cache,ecryptfs_fnek_sig=XXXXX,ecryptfs_sig=XXXXX,ecryptfs_cipher=aes,ecryptfs_key_bytes=16,ecryptfs_passthrough=n,ecryptfs_unlink_sigs + +[Install] +WantedBy=local-fs.target +``` + +`XXXXX` нужно заменить на сигнатуру из опций, с которыми сейчас смонтирована директория. Также нужно вставить имя пользователя и отредактировать путь к файлу с паролем (и имя mount-юнита), если это необходимо. Автозагрука: + +```bash +systemctl enable home-$USER.mount +``` + +Сервис для отмонтирования флешки, когда она не нужна будет: + +```bash +# cat /etc/systemd/system/umount-key.service +[Unit] +Description=Unmount key card +Before=local-fs.target +After=home-arcanis.mount + +[Service] +Type=oneshot +ExecStart=/usr/bin/umount /mnt/key + +[Install] +WantedBy=local-fs.target +``` + +Включаем: + +```bash +systemctl enable umount-key.service +``` + +Перезагружаемся, если все ок, удаляем бекап. Если нет - значит что то где то неправильно сделали, восстанавливаем из режима восстановления. + +## Почему не fstab? + +В моем случае, мне не получилось заставить флешку монтироваться раньше. Таким образом на загрузке я попадал в консоль восстановления из которой нужно было просто продолжить загрузку. Существующие в интернете методы предлагают два возможных варианта: + +* Создать запись с опцией noauto, потом монтировать через специальную запись в `rc.local`. +* Создать запись с опцией nofail, потом перемонтировать все разделы через `rc.local`. + +Оба варианта меня не устроили в виду их костыльности. + +## Почему не pam? + +Другое распространенное предложение - монтировать через запись в настройках pam. Мне этот вариант не подходит, так как у меня авторизация беспарольная по отпечатку пальца. diff --git a/ru/_posts/2014-12-19-aw-v21-bells-and-whistles.html b/ru/_posts/2014-12-19-aw-v21-bells-and-whistles.html deleted file mode 100644 index 6621ef1..0000000 --- a/ru/_posts/2014-12-19-aw-v21-bells-and-whistles.html +++ /dev/null @@ -1,327 +0,0 @@ ---- -category: ru -type: paper -hastr: true -layout: paper -tags: awesome-widgets, pytextmonitor -title: Awesome Widgets - свистелки и перделки -short: aw-v21-bells-and-whistles -description: Данная статья посвящена обсуждению настройки своих скриптов и графических баров в новой версии Awesome Widgets (2.1). ---- -

Введение

-

Для начала, я настоятельно рекомендую для после обновления не открывая настроек виджета скопировать в безопасное место файл $HOME/.kde4/share/config/extsysmon.conf, так как старые настройки кастомных скриптов теперь несовместимы. Вообще, следует заметить, что все фичи можно настраивать и из графического интерфейса, однако я опишу, как это делается простым редактированием desktop файлов.

- -

Общее

-

Все элементы хранятся в двух директориях: /usr/share/awesomewidgets/%TYPE%/ и $HOME/.local/share/awesomewidgets/%TYPE%/ (пути могут немного отличаться в зависимости от используемого дистрибутива). Настройки в домашней директории перезаписывают глобальные настройки.

- -

Бары

-

Директория называется desktops, файлы настроек имеют следующие поля:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ПолеОбязательноеЗначениеПо-умолчанию
Nameдаимя бара. Должно иметь вид barN и быть уникальнымnone
Commentнеткомментарийempty
X-AW-Valueдазначение бара. Доступны теги cpu*, gpu, mem, swap, hdd*, batcpu
X-AW-ActiveColorдазаполнение активной части в формате R,G,B,A0,0,0,130
X-AW-InactiveColorдазаполнение неактивной части в формате R,G,B,A255,255,255,130
X-AW-Typeдатип бара. Поддерживаемые типы Horizontal, Vertical, Circle, GraphHorizontal
X-AW-Directionданаправление заполнения. Доступны варианты LeftToRight, RightToLeftLeftToRight
X-AW-Heightдавысота в пикселях100
X-AW-Widthдаширина в пикселях100
X-AW-Numberдауникальный номер, который будет ассоциирован с данным баром. Введено для совместимости с другими расширениями. Должно быть такое же, как и в поле Nameчисло из Name
- -

Котировки

-

Директория называется quotes, файлы настроек имеют следующие поля:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ПолеОбязательноеЗначениеПо-умолчанию
Nameдаимя котировокnone
Commentнеткомментарийempty
X-AW-Tickerдатикер из системы Yahoo! FinanceEURUSD=X
X-AW-Activeнетактивны или нет данные котировкиtrue
X-AW-Intervalдаинтервал запуска котировок в стандартных интервалах обновления виджета1
X-AW-Numberдауникальный номер, который будет ассоциирован с данными котировкамислучайное число меньше 1000
- -

Скрипты

-

Директория называется scripts, файлы настроек имеют следующие поля:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ПолеОбязательноеЗначениеПо-умолчанию
Nameдаимя скриптаnone
Commentнеткомментарийempty
Execдапуть к исполняемому файлу/usr/bin/true
X-AW-Prefixнетпрефикс к исполняемому файлу. Обычно не требуется, однако в отдельных случаях может потребоваться явно указать путь, например, к используемому интерпретатору
X-AW-Activeнетактивен или нет данный скриптtrue
X-AW-Redirectнетперенаправление потоков сообщений. Доступны варианты stderr2stdout, nothing, stdout2stderr, swap. stderr доступен, если запустить в режиме отладкиnothing
X-AW-Intervalдаинтервал запуска скрипта в стандартных интервалах обновления виджета1
X-AW-Numberдауникальный номер, который будет ассоциирован с данным скриптомслучайное число меньше 1000
X-AW-Filtersнетфильтры из awesomewidgets-extscripts-filters.json разделенные запятой
- -

Обновления

-

Директория называется upgrade, файлы настроек имеют следующие поля:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ПолеОбязательноеЗначениеПо-умолчанию
Nameдаимя скрипта обновленийnone
Commentнеткомментарийempty
Execдапуть к исполняемому файлу/usr/bin/true
X-AW-Filterнетрегулярное выражение, которое будет применено к выдаче команды. Если не пустое, параметр X-AW-Null будет проигнорирован
X-AW-Activeнетактивен или нет данный скрипт обновленияtrue
X-AW-Nullнетчисло строк stdout, которые будут пропущены при подсчете0
X-AW-Intervalдаинтервал запуска скрипта в стандартных интервалах обновления виджета1
X-AW-Numberдауникальный номер, который будет ассоциирован с данным скриптомслучайное число меньше 1000
- -

Погода

-

Для показа погоды используются данные и API OpenWeatherMap. Директория называется weather, файлы настроек имеют следующие поля:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ПолеОбязательноеЗначениеПо-умолчанию
Nameдаимя погодыnone
Commentнеткомментарийempty
X-AW-CityдагородLondon
X-AW-Countryдадвухбуквенное обозначения страныuk
X-AW-Imageнетиспользовать изображения в качестве иконки погоды или текстuk
X-AW-TSдана какое время прогноз (целое число). 0 - текущая погода, 1 - погода через 3 часа и т.д.0
X-AW-Activeнетактивен или нет данный монитор погодыtrue
X-AW-Intervalдаинтервал запуска монитора в стандартных интервалах обновления виджета1
X-AW-Numberдауникальный номер, который будет ассоциирован с данным мониторомслучайное число меньше 1000
diff --git a/ru/_posts/2014-12-19-aw-v21-bells-and-whistles.md b/ru/_posts/2014-12-19-aw-v21-bells-and-whistles.md new file mode 100644 index 0000000..86c93d8 --- /dev/null +++ b/ru/_posts/2014-12-19-aw-v21-bells-and-whistles.md @@ -0,0 +1,97 @@ +--- +category: ru +type: paper +hastr: true +layout: paper +tags: awesome-widgets, pytextmonitor +title: Awesome Widgets - свистелки и перделки +short: aw-v21-bells-and-whistles +--- +Данная статья посвящена обсуждению настройки своих скриптов и графических баров в новой версии Awesome Widgets (2.1). + + + +## Введение + +Для начала, я настоятельно рекомендую для после обновления **не открывая настроек виджета** скопировать в безопасное место файл `$HOME/.kde4/share/config/extsysmon.conf`, так как старые настройки кастомных скриптов теперь несовместимы. Вообще, следует заметить, что все фичи можно настраивать и из графического интерфейса, однако я опишу, как это делается простым редактированием desktop файлов. + +## Общее + +Все элементы хранятся в двух директориях: `/usr/share/awesomewidgets/%TYPE%/` и `$HOME/.local/share/awesomewidgets/%TYPE%/` (пути могут немного отличаться в зависимости от используемого дистрибутива). Настройки в домашней директории перезаписывают глобальные настройки. + +## Бары + +Директория называется `desktops`, файлы настроек имеют следующие поля: + +| Поле | Обязательное | Значение | По-умолчанию | +|------|--------------|----------|--------------| +| Name | да | имя бара. Должно иметь вид `barN` и быть уникальным | none | +| Comment | нет | комментарий | empty | +| X-AW-Value | да | значение бара. Доступны теги `cpu*`, `gpu`, `mem`, `swap`, `hdd*`, `bat` | cpu | +| X-AW-ActiveColor | да | заполнение активной части в формате `R,G,B,A` | 0,0,0,130 | +| X-AW-InactiveColor | да | заполнение неактивной части в формате `R,G,B,A` | 255,255,255,130 | +| X-AW-Type | да | тип бара. Поддерживаемые типы `Horizontal`, `Vertical`, `Circle`, `Graph` | Horizontal | +| X-AW-Direction | да | направление заполнения. Доступны варианты `LeftToRight`, `RightToLeft` | LeftToRight | +| X-AW-Height | да | высота в пикселях | 100 | +| X-AW-Width | да | ширина в пикселях | 100 | +| X-AW-Number | да | уникальный номер, который будет ассоциирован с данным баром. Введено для совместимости с другими расширениями. Должно быть такое же, как и в поле Name | число из Name | + +## Котировки + +Директория называется `quotes`, файлы настроек имеют следующие поля: + +| Поле | Обязательное | Значение | По-умолчанию | +|------|--------------|----------|--------------| +| Name | да | имя котировок | none | +| Comment | нет | комментарий | empty | +| X-AW-Ticker | да | тикер из системы Yahoo! Finance | EURUSD=X | +| X-AW-Active | нет | активны или нет данные котировки | true | +| X-AW-Interval | да | интервал запуска котировок в стандартных интервалах обновления виджета | 1 | +| X-AW-Number | да | уникальный номер, который будет ассоциирован с данными котировками | случайное число меньше 1000 | + +## Скрипты + +Директория называется `scripts`, файлы настроек имеют следующие поля: + +| Поле | Обязательное | Значение | По-умолчанию | +|------|--------------|----------|--------------| +| Name | да | имя скрипта | none | +| Comment | нет | комментарий | empty | +| Exec | да | путь к исполняемому файлу | /usr/bin/true | +| X-AW-Prefix | нет | префикс к исполняемому файлу. Обычно не требуется, однако в отдельных случаях может потребоваться явно указать путь, например, к используемому интерпретатору | +| X-AW-Active | нет | активен или нет данный скрипт | true | +| X-AW-Redirect | нет | перенаправление потоков сообщений. Доступны варианты `stderr2stdout`, `nothing`, `stdout2stderr`, `swap`. stderr доступен, если запустить в режиме отладки | nothing | +| X-AW-Interval | да | интервал запуска скрипта в стандартных интервалах обновления виджета | 1 | +| X-AW-Number | да | уникальный номер, который будет ассоциирован с данным скриптом | случайное число меньше 1000 | +| X-AW-Filters | нет | фильтры из `awesomewidgets-extscripts-filters.json` разделенные запятой | + +## Обновления + +Директория называется `upgrade`, файлы настроек имеют следующие поля: + +| Поле | Обязательное | Значение | По-умолчанию | +|------|--------------|----------|--------------| +| Name | да | имя скрипта обновлений | none | +| Comment | нет | комментарий | empty | +| Exec | да | путь к исполняемому файлу | /usr/bin/true | +| X-AW-Filter | нет | регулярное выражение, которое будет применено к выдаче команды. Если не пустое, параметр `X-AW-Null` будет проигнорирован | +| X-AW-Active | нет | активен или нет данный скрипт обновления | true | +| X-AW-Null | нет | число строк stdout, которые будут пропущены при подсчете | 0 | +| X-AW-Interval | да | интервал запуска скрипта в стандартных интервалах обновления виджета | 1 | +| X-AW-Number | да | уникальный номер, который будет ассоциирован с данным скриптом | случайное число меньше 1000 | + +## Погода + +Для показа погоды используются данные и API [OpenWeatherMap](//openweathermap.org/ "Сайт OpenWeatherMap"). Директория называется `weather`, файлы настроек имеют следующие поля: + +| Поле | Обязательное | Значение | По-умолчанию | +|------|--------------|----------|--------------| +| Name | да | имя погоды | none | +| Comment | нет | комментарий | empty | +| X-AW-City | да | город | London | +| X-AW-Country | да | двухбуквенное обозначения страны | uk | +| X-AW-Image | нет | использовать изображения в качестве иконки погоды или текст | uk | +| X-AW-TS | да | на какое время прогноз (целое число). `0` - текущая погода, `1` - погода через 3 часа и т.д. | 0 | +| X-AW-Active | нет | активен или нет данный монитор погоды | true | +| X-AW-Interval | да | интервал запуска монитора в стандартных интервалах обновления виджета | 1 | +| X-AW-Number | да | уникальный номер, который будет ассоциирован с данным монитором | случайное число меньше 1000 | diff --git a/ru/_posts/2015-10-17-cppcheck-and-clang-format.html b/ru/_posts/2015-10-17-cppcheck-and-clang-format.html deleted file mode 100644 index 4c2d66b..0000000 --- a/ru/_posts/2015-10-17-cppcheck-and-clang-format.html +++ /dev/null @@ -1,161 +0,0 @@ ---- -category: ru -type: paper -hastr: true -layout: paper -tags: разработка, c++, cmake -title: Добавляем cppcheck и clang-format для проекта на cmake -short: cppcheck-and-clang-format -description: Небольшое How-To посвященное прикручиванию автоматической проверки стиля, а также статического анализатора к проекту на C++, который использует в качестве системы сборки cmake. ---- -

Проект

-

Наш проект имеет следующую структуру:

- -{% highlight bash %} -sources/ -|- CMakeLists.txt -|- 3rdparty/ -|- first_component/ -|- second_component/ -{% endhighlight %} - -

3rdparty - директория с различными дополнительными библиотеками, которую надо исключить из проверок (в дальнейшем соответствует переменной cmake PROJECT_TRDPARTY_DIR). Дополнительно допустим, что у нас, помимо обычных файлов исходного кода (*.cpp, *.h) есть еще какие-либо (например, *.qml).

- -

Дополнительно используемые ниже команды можно вставить в pre-commit hook и невозбранно тролить коллег по ынтырпрайзу, не давая им закоммитить ничего, пока они не научатся читать CONTRIBUTING.md.

- -

cppcheck

-

Коль скоро нормальных (из коробки) статических анализаторов не завезли в open source будем использовать то, что имеется. Знатоки говорят, что cppcheck при должной конфигурации будет лучше, чем любой аналог, но конфигурация его для достаточно большого проекта похожа больше на написание нового проекта. Суть добавления cppheck к проекту сводится к указанию очевидных недоработок в коде и тыканью в лужу них.

- -

Общий пример запуска

-

Тут все, казалось бы, очень просто:

- -{% highlight bash %} -cppcheck --enable=warning,performance,portability,information,missingInclude --std=c++11 --library=qt.cfg --template="[{severity}][{id}] {message} {callstack} (On {file}:{line})" --verbose --quiet path/to/source/files/or/directory -{% endhighlight %} - -
    -
  • --enable говорит о том, какие уведомления надо включить. Я выключил style (для этого ниже мы заведем clang-format), unusedFunction - выдает false-positive для некоторых мест.
  • -
  • --std говорит об используемом стандарте.
  • -
  • --library=qt.cfg некий файл настроек, который говорит о том, что и как надо обрабатывать. Добрые разработчики предлагаю почитать на эту тему мануал. В данном случае я использовал шаблон из /usr/share/cppcheck/cfg/.
  • -
  • --template - шаблон строки уведомления.
  • -
  • ---verbose --quiet две противоречащие друг другу опции. Первая включает более информативные сообщения, вторая выключает отчет о прогрессе.
  • -
- -

Интеграция с cmake

-

Файл cppcheck.cmake в корне проекта:

- -{% highlight cmake %} -# additional target to perform cppcheck run, requires cppcheck - -# get all project files -# HACK this workaround is required to avoid qml files checking ^_^ -file(GLOB_RECURSE ALL_SOURCE_FILES *.cpp *.h) -foreach (SOURCE_FILE ${ALL_SOURCE_FILES}) - string(FIND ${SOURCE_FILE} ${PROJECT_TRDPARTY_DIR} PROJECT_TRDPARTY_DIR_FOUND) - if (NOT ${PROJECT_TRDPARTY_DIR_FOUND} EQUAL -1) - list(REMOVE_ITEM ALL_SOURCE_FILES ${SOURCE_FILE}) - endif () -endforeach () - -add_custom_target( - cppcheck - COMMAND /usr/bin/cppcheck - --enable=warning,performance,portability,information,missingInclude - --std=c++11 - --library=qt.cfg - --template="[{severity}][{id}] {message} {callstack} \(On {file}:{line}\)" - --verbose - --quiet - ${ALL_SOURCE_FILES} -) -{% endhighlight %} - -

cppcheck умеет рекурсивно директории проверять, однако, на моем примере, мне нужно было пропустить проверку qml-файлов, потому что open source проект, в лучших традициях, сегфолтился на некоторых из них - именно для этого используется поиск исходных файлов с дальнейшим выбрасыванием из них файлов, которые не должны проверяться.

- -

Включаем в проект (CMakeLists.txt)...

- -{% highlight cmake %} -include(cppcheck.cmake) -{% endhighlight %} - -

...и запускаем:

- -{% highlight bash %} -cmake -make cppcheck -{% endhighlight %} - -

Дальше руками вносим необходимые исправления.

- -

Дополнительно

-
    -
  • Можно добавить свои директории для поиска хидеров, используя опцию -I dir.
  • -
  • Можно вычеркнуть файлы и/или директории из проверки, используя опцию -i path/to/file/or/directory.
  • -
- -

clang-format

-

clang-format предназначен для автоматического подгона стиля под желаемый или требуемый. Среди аналогов стоит выделить astyle, который имеет очень скромные возможности, и uncrustify, который, наоборот, имеет слишком много опций.

- -

Общий пример запуска

-{% highlight bash %} -clang-format -i -style=LLVM /path/to/source/files -{% endhighlight %} - -

(К сожалению, он не умеет в рекурсивный обход директории.)

- -
    -
  • -i включает автозамену файлов (в противном случае, результат будет печататься в stdout).
  • -
  • -style выбор определенного стиля либо из предустановленных, либо из файла (file), см. ниже.
  • -
- -

Интеграция с cmake

-

Файл clang-format.cmake в корне проекта:

- -{% highlight cmake %} -# additional target to perform clang-format run, requires clang-format - -# get all project files -file(GLOB_RECURSE ALL_SOURCE_FILES *.cpp *.h) -foreach (SOURCE_FILE ${ALL_SOURCE_FILES}) - string(FIND ${SOURCE_FILE} ${PROJECT_TRDPARTY_DIR} PROJECT_TRDPARTY_DIR_FOUND) - if (NOT ${PROJECT_TRDPARTY_DIR_FOUND} EQUAL -1) - list(REMOVE_ITEM ALL_SOURCE_FILES ${SOURCE_FILE}) - endif () -endforeach () - -add_custom_target( - clangformat - COMMAND /usr/bin/clang-format - -style=LLVM - -i - ${ALL_SOURCE_FILES} -) -{% endhighlight %} - -

Аналогичных способ поиска исходных файлов, как и для cppcheck, поскольку clang-format не умеет в рекурсию.

- -

Включаем в проект (CMakeLists.txt)...

- -{% highlight cmake %} -include(clang-format.cmake) -{% endhighlight %} - -

...и запускаем:

- -{% highlight bash %} -cmake -make clangformat -{% endhighlight %} - -

Никаких дополнительных действий не требуется.

- -

Дополнительно

-
    -
  • Настройка. Можно почитать опции на официальном сайте. Также можно воспользоваться интерактивной утилитой для просмотра опций. Для использования уже готового стиля за базу используем следующую команду: - -{% highlight bash %} -clang-format -style=LLVM -dump-config > .clang-format -{% endhighlight %} - - Далее редактируется полученный файл .clang-format. Для включения его необходимо передать опцию -style=file, файл должен находиться в одной из родительских директории для каждого файла (например, в корне проекта). Также, можно передать нужные опции прямо в командной строке, например -style="{BasedOnStyle: llvm, IndentWidth: 8}".
  • -
diff --git a/ru/_posts/2015-10-17-cppcheck-and-clang-format.md b/ru/_posts/2015-10-17-cppcheck-and-clang-format.md new file mode 100644 index 0000000..823a711 --- /dev/null +++ b/ru/_posts/2015-10-17-cppcheck-and-clang-format.md @@ -0,0 +1,165 @@ +--- +category: ru +type: paper +hastr: true +layout: paper +tags: разработка, c++, cmake +title: Добавляем cppcheck и clang-format для проекта на cmake +short: cppcheck-and-clang-format +--- +Небольшое How-To посвященное прикручиванию автоматической проверки стиля, а также статического анализатора к проекту на `C++`, который использует в качестве системы сборки `cmake`. + + + +## Проект + +Наш проект имеет следующую структуру: + +```bash +sources/ +|- CMakeLists.txt +|- 3rdparty/ +|- first_component/ +|- second_component/ +``` + +**3rdparty** - директория с различными дополнительными библиотеками, которую надо исключить из проверок (в дальнейшем соответствует переменной cmake `PROJECT_TRDPARTY_DIR`). Дополнительно допустим, что у нас, помимо обычных файлов исходного кода (`*.cpp`, `*.h`) есть еще какие-либо (например, `*.qml`). + +Дополнительно используемые ниже команды можно вставить в pre-commit hook и невозбранно тролить коллег по ынтырпрайзу, не давая им закоммитить ничего, пока они не научатся читать `CONTRIBUTING.md`. + +## cppcheck + +Коль скоро нормальных (из коробки) статических анализаторов не завезли в open source будем использовать то, что имеется. Знатоки говорят, что [cppcheck](//cppcheck.sourceforge.net/ "Сайт cppcheck") при должной конфигурации будет лучше, чем любой аналог, но конфигурация его для достаточно большого проекта похожа больше на написание нового проекта. Суть добавления cppheck к проекту сводится к указанию очевидных недоработок в коде и тыканью в ~~лужу~~ них. + +### Общий пример запуска + +Тут все, казалось бы, очень просто: + +```bash +cppcheck --enable=warning,performance,portability,information,missingInclude --std=c++11 --library=qt.cfg --template="[{severity}][{id}] {message} {callstack} (On {file}:{line})" --verbose --quiet path/to/source/files/or/directory +``` + +* `--enable` говорит о том, какие уведомления надо включить. Я выключил `style` (для этого ниже мы заведем `clang-format`), `unusedFunction` - выдает false-positive для некоторых мест. +* `--std` говорит об используемом стандарте. +* `--library=qt.cfg` некий файл настроек, который говорит о том, что и как надо обрабатывать. Добрые разработчики предлагаю почитать на эту тему [мануал](//cppcheck.sourceforge.net/manual.pdf "cppcheck мануал"). В данном случае я использовал шаблон из `/usr/share/cppcheck/cfg/`. +* `--template` - шаблон строки уведомления. +* `---verbose --quiet` две противоречащие друг другу опции. Первая включает более информативные сообщения, вторая выключает отчет о прогрессе. + +### Интеграция с cmake + +Файл `cppcheck.cmake` в корне проекта: + +```cmake +# additional target to perform cppcheck run, requires cppcheck + +# get all project files +# HACK this workaround is required to avoid qml files checking ^_^ +file(GLOB_RECURSE ALL_SOURCE_FILES *.cpp *.h) +foreach (SOURCE_FILE ${ALL_SOURCE_FILES}) + string(FIND ${SOURCE_FILE} ${PROJECT_TRDPARTY_DIR} PROJECT_TRDPARTY_DIR_FOUND) + if (NOT ${PROJECT_TRDPARTY_DIR_FOUND} EQUAL -1) + list(REMOVE_ITEM ALL_SOURCE_FILES ${SOURCE_FILE}) + endif () +endforeach () + +add_custom_target( + cppcheck + COMMAND /usr/bin/cppcheck + --enable=warning,performance,portability,information,missingInclude + --std=c++11 + --library=qt.cfg + --template="[{severity}][{id}] {message} {callstack} \(On {file}:{line}\)" + --verbose + --quiet + ${ALL_SOURCE_FILES} +) +``` + +`cppcheck` умеет рекурсивно директории проверять, однако, на моем примере, мне нужно было пропустить проверку qml-файлов, потому что open source проект, в лучших традициях, сегфолтился на некоторых из них - именно для этого используется поиск исходных файлов с дальнейшим выбрасыванием из них файлов, которые не должны проверяться. + +Включаем в проект (`CMakeLists.txt`)... + +```cmake +include(cppcheck.cmake) +``` + +...и запускаем: + +```bash +cmake +make cppcheck +``` + +Дальше руками вносим необходимые исправления. + +### Дополнительно + +* Можно добавить свои директории для поиска хидеров, используя опцию `-I dir`. +* Можно вычеркнуть файлы и/или директории из проверки, используя опцию `-i path/to/file/or/directory`. + +## clang-format + +[clang-format](//clang.llvm.org/docs/ClangFormat.html "Сайт clang-format") предназначен для автоматического подгона стиля под желаемый или требуемый. Среди аналогов стоит выделить [astyle](//astyle.sourceforge.net/ "Сайт astyle"), который имеет очень скромные возможности, и [uncrustify](//uncrustify.sourceforge.net/ "Сайт uncrustify"), который, наоборот, имеет слишком много опций. + +### Общий пример запуска + +```bash +clang-format -i -style=LLVM /path/to/source/files +``` + +(К сожалению, он **не умеет** в рекурсивный обход директории.) + +* `-i` включает автозамену файлов (в противном случае, результат будет печататься в stdout). +* `-style` выбор определенного стиля либо из предустановленных, либо из файла (`file`), см. ниже. + +### Интеграция с cmake + +Файл `clang-format.cmake` в корне проекта: + +```cmake +# additional target to perform clang-format run, requires clang-format + +# get all project files +file(GLOB_RECURSE ALL_SOURCE_FILES *.cpp *.h) +foreach (SOURCE_FILE ${ALL_SOURCE_FILES}) + string(FIND ${SOURCE_FILE} ${PROJECT_TRDPARTY_DIR} PROJECT_TRDPARTY_DIR_FOUND) + if (NOT ${PROJECT_TRDPARTY_DIR_FOUND} EQUAL -1) + list(REMOVE_ITEM ALL_SOURCE_FILES ${SOURCE_FILE}) + endif () +endforeach () + +add_custom_target( + clangformat + COMMAND /usr/bin/clang-format + -style=LLVM + -i + ${ALL_SOURCE_FILES} +) +``` + +Аналогичных способ поиска исходных файлов, как и для `cppcheck`, поскольку `clang-format` не умеет в рекурсию. + +Включаем в проект (`CMakeLists.txt`)... + +```cmake +include(clang-format.cmake) +``` + +...и запускаем: + +```bash +cmake +make clangformat +``` + +Никаких дополнительных действий не требуется. + +### Дополнительно + +* Настройка. Можно почитать опции на [официальном сайте](//clang.llvm.org/docs/ClangFormat.html "Сайт clang-format"). Также можно воспользоваться [интерактивной утилитой](//clangformat.com/ "Сайт") для просмотра опций. Для использования уже готового стиля за базу используем следующую команду: + + ```bash + clang-format -style=LLVM -dump-config > .clang-format + ``` + + Далее редактируется полученный файл `.clang-format`. Для включения его необходимо передать опцию `-style=file`, файл должен находиться в одной из родительских директории для каждого файла (например, в корне проекта). Также, можно передать нужные опции прямо в командной строке, например `-style="{BasedOnStyle: llvm, IndentWidth: 8}"`. diff --git a/ru/_posts/2016-01-09-url-changes.html b/ru/_posts/2016-01-09-url-changes.html deleted file mode 100644 index 0157f26..0000000 --- a/ru/_posts/2016-01-09-url-changes.html +++ /dev/null @@ -1,10 +0,0 @@ ---- -category: ru -type: paper -hastr: true -layout: paper -tags: сайт -title: Изменения URL -short: url-changes -description: Хочу заметить, что я изменил адреса сайта и репозитория с arcanis.name на arcanis.me. Изменения были сделаны исключительно потому что ME домен чуть более симпатичнее. Старые адреса пока еще рабочие и будут такими до марта 2016 год (дата регистрации домена), но на текущий момент я настроил переадресацию со старых адресов на новые. Извините за недобства. ---- diff --git a/ru/_posts/2016-01-09-url-changes.md b/ru/_posts/2016-01-09-url-changes.md new file mode 100644 index 0000000..eb63eb8 --- /dev/null +++ b/ru/_posts/2016-01-09-url-changes.md @@ -0,0 +1,10 @@ +--- +category: ru +type: paper +hastr: true +layout: paper +tags: сайт +title: Изменения URL +short: url-changes +--- +Хочу заметить, что я изменил адреса сайта и репозитория с [arcanis.name](//arcanis.name) на [arcanis.me](//arcanis.me). Изменения были сделаны исключительно потому что ME домен чуть более симпатичнее. Старые адреса пока еще рабочие и будут такими до марта 2016 год (дата регистрации домена), но на текущий момент я настроил переадресацию со старых адресов на новые. Извините за недобства. diff --git a/ru/blog/index.html b/ru/blog/index.html index 6359e2f..0a50d20 100644 --- a/ru/blog/index.html +++ b/ru/blog/index.html @@ -24,6 +24,6 @@ hastr: true {{ post.title }}

{% include shortdate_to_ru.html %}

-

{{ post.description }}

+

{{ post.excerpt }}

Теги: {{ post.tags }}

{% endfor %} diff --git a/ru/feed-short.xml b/ru/feed-short.xml index 42b5f4c..e89dbab 100644 --- a/ru/feed-short.xml +++ b/ru/feed-short.xml @@ -18,7 +18,7 @@ {% else %} {{ post.title | xml_escape }} - {{ post.description | xml_escape }} + {{ post.excerpt | xml_escape }} {{ post.date | date: "%a, %d %b %Y %H:%M:%S %z" }} {{ site.url }}{{ post.url }} {{ site.url }}{{ post.url }} diff --git a/ru/feed.xml b/ru/feed.xml index fbd2b58..7503a43 100644 --- a/ru/feed.xml +++ b/ru/feed.xml @@ -19,7 +19,6 @@ {{ post.title | xml_escape }} - {{ post.description | xml_escape }} {{ post.content | xml_escape}} {{ post.date | date: "%a, %d %b %Y %H:%M:%S %z" }}