Tkabber Wiki

Check-in Differences
Login

Check-in Differences

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Difference From 58c40c3f66b28bc5 To 423ce9de23111eb5

2015-12-10
19:17
Fixed Markdown markup, refreshed auxiliary pages. check-in: 2981ccc72b user: sergei tags: trunk
14:17
Fixed Markdown markup. check-in: 58c40c3f66 user: sgolovan tags: trunk
11:25
Fixed markdown markup and refreshed auxiliary pages. check-in: c4a11d078e user: sgolovan tags: trunk
2015-12-07
10:56
Refreshed missing refs pages. check-in: fc16d1976e user: sgolovan tags: trunk
10:50
Read the files for links searching in UTF-8 encoding. check-in: 423ce9de23 user: sgolovan tags: trunk
09:43
Moved the UTF-8 encoded strings to the message catalog files. This helps with executing the refresh_tocs.tcl script under different locale settings. check-in: f5509f5883 user: sgolovan tags: trunk

Changes to msgs/es.msg.

1
2
3
4
5
6
7
8
::msgcat::mcset es "allpages_file" "Especial/Todas_las_Páginas.md"
::msgcat::mcset es "missingrefs_file" "Especial/Referencios_que_Falta.md"
::msgcat::mcset es "contents" "Contenido"
::msgcat::mcset es "refs0" "referencias"
::msgcat::mcset es "refs1" "referencia"
::msgcat::mcset es "refs2" "referencias"
::msgcat::mcset es "otherlang" "from other language pages"

|







1
2
3
4
5
6
7
8
::msgcat::mcset es "allpages_file" "Especial/Todas_las_Paginas.md"
::msgcat::mcset es "missingrefs_file" "Especial/Referencios_que_Falta.md"
::msgcat::mcset es "contents" "Contenido"
::msgcat::mcset es "refs0" "referencias"
::msgcat::mcset es "refs1" "referencia"
::msgcat::mcset es "refs2" "referencias"
::msgcat::mcset es "otherlang" "from other language pages"

Changes to tools/refresh_allpages.tcl.

8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

set langs {en es ru uk}

proc md_filter {fn} {
    expr {[file isfile $fn] && [file extension $fn] eq ".md"}
}

proc find_linked_files {data file} {
    set dir [file dirname $file]
    set norm_file [file normalize $file]
    set matches [regexp -all -inline {]\(([^)]*)\)} $data]
    set res {}
    foreach {_ link} $matches {
        # Store only internal (relative) links to .md without anchors

        if {[string first : $link] >= 0 || [string first # $link] == 0} continue

        if {[regexp {^([^#]*\.md)(#|$)} $link -> name _]} {
            set norm_name [file normalize [file join $dir $name]]
            if {$norm_file ne $norm_name} {
                # Do not store links to the file itself

	        lappend res $norm_name
            }
        }
    }

    return $res
}

proc get_all_links {dir} {
    set res {}
    foreach fn [::fileutil::find $dir md_filter] {
        set fd [open $fn]
        fconfigure $fd -encoding utf-8
        set data [read $fd]
        close $fd

        lappend res {*}[find_linked_files $data $fn]
    }
    return $res
}

proc pagename {title} {
    return [string map {" " _} $title].md
}







|
<
<








|
<
<
<
<
<














|







8
9
10
11
12
13
14
15


16
17
18
19
20
21
22
23
24





25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

set langs {en es ru uk}

proc md_filter {fn} {
    expr {[file isfile $fn] && [file extension $fn] eq ".md"}
}

proc find_linked_files {data dir} {


    set matches [regexp -all -inline {]\(([^)]*)\)} $data]
    set res {}
    foreach {_ link} $matches {
        # Store only internal (relative) links to .md without anchors

        if {[string first : $link] >= 0 || [string first # $link] == 0} continue

        if {[regexp {^([^#]*\.md)(#|$)} $link -> name _]} {
	    lappend res [file normalize [file join $dir $name]]





        }
    }

    return $res
}

proc get_all_links {dir} {
    set res {}
    foreach fn [::fileutil::find $dir md_filter] {
        set fd [open $fn]
        fconfigure $fd -encoding utf-8
        set data [read $fd]
        close $fd

        lappend res {*}[find_linked_files $data [file dirname $fn]]
    }
    return $res
}

proc pagename {title} {
    return [string map {" " _} $title].md
}

Changes to tools/refresh_missingrefs.tcl.

82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
        set data [read $fd]
        close $fd

        set links [find_links $data]

        set stripped_links {}
        foreach link $links {
            if {[regexp {(mailto:|xmpp:|news:|ftp://|http://|https://)} $link] &&
                    ![regexp {tkabber\.jabe\.ru} $link]} {
                continue
            }

            set idx [string first # $link]
            if {$idx == 0} {
                lappend stripped_links $link







|







82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
        set data [read $fd]
        close $fd

        set links [find_links $data]

        set stripped_links {}
        foreach link $links {
            if {[regexp {(xmpp:|ftp://|http://|https://)} $link] &&
                    ![regexp {tkabber\.jabe\.ru} $link]} {
                continue
            }

            set idx [string first # $link]
            if {$idx == 0} {
                lappend stripped_links $link

Changes to tools/refresh_tocs.tcl.

13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    while {[string index $h $offset] eq "#"} {
        incr offset
    }
    return $offset
}

proc sanitize_anchor {text} {
    string map {\" "" / _ \u2014 - ( "" ) "" ! "" ? "" , "" : "" ; "" # N
                \[ "" \] "" \\ "" ' "" * "" < "" > "" @ "" % "" & ""} \
           [regsub -all {\s} [string trim $text] {_}]
}

proc remove_links {text} {
    regsub -all {\[(.*)\]\([^)]*\)} $text {\1}
}

proc md_filter {fn} {
    expr {[file isfile $fn] && [file extension $fn] eq ".md"}
}

proc refresh_tocs {lang dir} {
    ::msgcat::mclocale $lang
    ::msgcat::mcload [file join $::scriptdir .. msgs]







|
|



<
<
<
<







13
14
15
16
17
18
19
20
21
22
23
24




25
26
27
28
29
30
31
    while {[string index $h $offset] eq "#"} {
        incr offset
    }
    return $offset
}

proc sanitize_anchor {text} {
    string map {\" "" / _  - ( "" ) "" ! "" ? "" , "" : "" ; "" # N
                \[ "" \] "" \\ "" ' "" * "" < "" > ""} \
           [regsub -all {\s} [string trim $text] {_}]
}





proc md_filter {fn} {
    expr {[file isfile $fn] && [file extension $fn] eq ".md"}
}

proc refresh_tocs {lang dir} {
    ::msgcat::mclocale $lang
    ::msgcat::mcload [file join $::scriptdir .. msgs]
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
        set newtoc [list ""]
        foreach {l h} $headers {
            if {![regexp {^(#+)\s*(<a\s+.*\s*</a>)*\s*(.*)} $h -> hashes anchor header]} {
                error "Invalid header in file '$fn' at line $l"
            }

            set header [string trim $header]
            set tocheader [remove_links $header]
            set newanchor [sanitize_anchor $tocheader]
            lset body $l "$hashes <a id=\"$newanchor\"></a>$header"

            set level [h_level $h]
            if {$level > $min_level + 2} continue

            incr counter($level)
            for {set i [expr {$level+1}]} {$i <= $min_level+2} {incr i} {
                set counter($i) 0
            }
            set spaces [string repeat "   " [expr {$level-$min_level}]]
            set num $counter($min_level)
            for {set i [expr {$min_level+1}]} {$i <= $min_level+2} {incr i} {
                if {$counter($i) == 0} break
                append num .$counter($i)
            }
            lappend newtoc "$spaces* \[$num $tocheader\](#$newanchor)"
        }
        lappend newtoc ""

        if {$toc eq $newtoc} continue

        set out [open $fn w]
        fconfigure $out -encoding utf-8 -translation lf







<
|



<
<




|





|







113
114
115
116
117
118
119

120
121
122
123


124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
        set newtoc [list ""]
        foreach {l h} $headers {
            if {![regexp {^(#+)\s*(<a\s+.*\s*</a>)*\s*(.*)} $h -> hashes anchor header]} {
                error "Invalid header in file '$fn' at line $l"
            }

            set header [string trim $header]

            set newanchor [sanitize_anchor $header]
            lset body $l "$hashes <a id=\"$newanchor\"></a>$header"

            set level [h_level $h]


            incr counter($level)
            for {set i [expr {$level+1}]} {$i <= $min_level+2} {incr i} {
                set counter($i) 0
            }
            set spaces [string repeat " " [expr {$level-$min_level}]]
            set num $counter($min_level)
            for {set i [expr {$min_level+1}]} {$i <= $min_level+2} {incr i} {
                if {$counter($i) == 0} break
                append num .$counter($i)
            }
            lappend newtoc "$spaces* \[$num $header\](#$newanchor)"
        }
        lappend newtoc ""

        if {$toc eq $newtoc} continue

        set out [open $fn w]
        fconfigure $out -encoding utf-8 -translation lf

Deleted wiki/en/For_Beginners.md.

1
2
3
4
5
6
7
8
9
10
[//]: # (Generated from ../selected/en.tkabber.jabe.ru/index.php/For_Beginners_(en)/index.html)


# For Beginners

From Tkabber Wiki

(There is currently no text in this page) 


<
<
<
<
<
<
<
<
<
<




















Added wiki/en/For_Beginners_(en).md.





















>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
[//]: # (Generated from ../selected/en.tkabber.jabe.ru/index.php/For_Beginners_(en)/index.html)


# For Beginners (en)

From Tkabber Wiki

(There is currently no text in this page) 


Changes to wiki/en/Help_Contents.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[//]: # (Generated from ../selected/en.tkabber.jabe.ru/index.php/Help:Contents/index.html)


# Help:Contents

From Tkabber Wiki

 This page is written for those who would like to take part in the Tkabber Wiki project as an author or a translator. The goal of the following text is to define a common style of Tkabber Wiki articles so that they would look more or less identical, were not too variegated with bold and italic styles and were clear for understanding. 

If you have got some suggestions about the wiki's style, please contact [User:bigote](User_Bigote.md), or [Kostix](../ru/Участник_Kostix.md), or [LKnight](../ru/Участник_Lknight.md). All of them speak English. 

There is a conference `[xmpp:tkabber-wiki@confernce.jabber.ru](xmpp:tkabber-wiki@confernce.jabber.ru)` created for discussing our wiki work progress and its problems. It is invite-only, so if you would like to enter it, please contact us first. 

Well, let's begin. 

## <a id="toc"></a>Contents

* [1 If you have no experience with wikis](#If_you_have_no_experience_with_wikis)
* [2 About Tkabber Wiki style](#About_Tkabber_Wiki_style)
   * [2.1 For new article authors](#For_new_article_authors)
      * [2.1.1 Indentation by a space](#Indentation_by_a_space)
      * [2.1.2 Using HTML](#Using_HTML)
      * [2.1.3 Using **\<tt>** tag](#Using_tt_tag)
      * [2.1.4 Using bold](#Using_bold)
      * [2.1.5 Using italic](#Using_italic)
      * [2.1.6 Using smilies in the text](#Using_smilies_in_the_text)
      * [2.1.7 Language particularities](#Language_particularities)
      * [2.1.8 Other appearance elements](#Other_appearance_elements)
      * [2.1.9 Sandbox](#Sandbox)
   * [2.2 For translators](#For_translators)
      * [2.2.1 How to begin making a new language version](#How_to_begin_making_a_new_language_version)
      * [2.2.2 Translation into mother tongue](#Translation_into_mother_tongue)
      * [2.2.3 Translation into a foreign language](#Translation_into_a_foreign_language)
      * [2.2.4 Menu translation](#Menu_translation)
      * [2.2.5 Tkabber localization](#Tkabber_localization)

# <a id="If_you_have_no_experience_with_wikis"></a>If you have no experience with wikis
*  There is a complete and quite decent [manual](http://en.wikipedia.org/wiki/Wikipedia:How_to_edit_a_page) about WikiPedia editing. That page contains links to more specific themes like "Images", "How to start a new page", etc. It is an ideal place for beginners. 
*  However, it is more convenient to take a look at [the correspondent page of MediaWiki](http://www.mediawiki.org/w/index.php?title=Sites_using_MediaWiki/gallery&action=submit) to build galleries, which shows you a correct piece of code (it is strange but at wikipedia.org gallery building is explained in few words, and there is no example of working code, so one has to think and try long enough to make something decent ;)) 
*  You can also read [interface setting documentation](http://meta.wikipedia.org/wiki/MediaWiki_i18n) and [MediaWiki User's Manual](http://meta.wikipedia.org/wiki/MediaWiki_User's_Guide). 

# <a id="About_Tkabber_Wiki_style"></a>About Tkabber Wiki style









|









|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[//]: # (Generated from ../selected/en.tkabber.jabe.ru/index.php/Help:Contents/index.html)


# Help:Contents

From Tkabber Wiki

 This page is written for those who would like to take part in the Tkabber Wiki project as an author or a translator. The goal of the following text is to define a common style of Tkabber Wiki articles so that they would look more or less identical, were not too variegated with bold and italic styles and were clear for understanding. 

If you have got some suggestions about the wiki's style, please contact [User:bigote](User_Bigote.md), or [Kostix](../ru/Участник_kostix.md), or [LKnight](../ru/Участник_lknight.md). All of them speak English. 

There is a conference `[xmpp:tkabber-wiki@confernce.jabber.ru](xmpp:tkabber-wiki@confernce.jabber.ru)` created for discussing our wiki work progress and its problems. It is invite-only, so if you would like to enter it, please contact us first. 

Well, let's begin. 

## <a id="toc"></a>Contents

* [1 If you have no experience with wikis](#If_you_have_no_experience_with_wikis)
* [2 About Tkabber Wiki style](#About_Tkabber_Wiki_style)
 * [2.1 For new article authors](#For_new_article_authors)
  * [2.1.1 Indentation by a space](#Indentation_by_a_space)
  * [2.1.2 Using HTML](#Using_HTML)
  * [2.1.3 Using **\<tt>** tag](#Using_tt_tag)
  * [2.1.4 Using bold](#Using_bold)
  * [2.1.5 Using italic](#Using_italic)
  * [2.1.6 Using smilies in the text](#Using_smilies_in_the_text)
  * [2.1.7 Language particularities](#Language_particularities)
  * [2.1.8 Other appearance elements](#Other_appearance_elements)
  * [2.1.9 Sandbox](#Sandbox)
 * [2.2 For translators](#For_translators)
  * [2.2.1 How to begin making a new language version](#How_to_begin_making_a_new_language_version)
  * [2.2.2 Translation into mother tongue](#Translation_into_mother_tongue)
  * [2.2.3 Translation into a foreign language](#Translation_into_a_foreign_language)
  * [2.2.4 Menu translation](#Menu_translation)
  * [2.2.5 Tkabber localization](#Tkabber_localization)

# <a id="If_you_have_no_experience_with_wikis"></a>If you have no experience with wikis
*  There is a complete and quite decent [manual](http://en.wikipedia.org/wiki/Wikipedia:How_to_edit_a_page) about WikiPedia editing. That page contains links to more specific themes like "Images", "How to start a new page", etc. It is an ideal place for beginners. 
*  However, it is more convenient to take a look at [the correspondent page of MediaWiki](http://www.mediawiki.org/w/index.php?title=Sites_using_MediaWiki/gallery&action=submit) to build galleries, which shows you a correct piece of code (it is strange but at wikipedia.org gallery building is explained in few words, and there is no example of working code, so one has to think and try long enough to make something decent ;)) 
*  You can also read [interface setting documentation](http://meta.wikipedia.org/wiki/MediaWiki_i18n) and [MediaWiki User's Manual](http://meta.wikipedia.org/wiki/MediaWiki_User's_Guide). 

# <a id="About_Tkabber_Wiki_style"></a>About Tkabber Wiki style
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191

Welcome to the **[Sandbox](Sandbox.md)** if you need to check some style or HTML tag behaviour. 

## <a id="For_translators"></a>For translators

### <a id="How_to_begin_making_a_new_language_version"></a>How to begin making a new language version

1.  If your language is not present in the [languages list](../index.md) please contact [LKnight](../ru/Участник_Lknight.md) or, if it is impossible to locate him, you can send your request to [Bigote](User_Bigote.md). Also you will need to help the project administrators in editing the new wiki's navigation menu and in adding a link to it to the [main index page](../index.md) ;) 
1.  Well, a subdomain is ready. Now create an account at the new wiki version and also at all the rest version (if not, you will not get access to the source code of other articles, and besides, you will have to add links to the articles translated by you to all the rest of versions). 
1.  We would recommend that this page is translated first if possible, as it provides users with information on this wiki's style guidelines. 
1.  Put in your browser http://your\_language\_code.tkabber.jabe.ru and you will see the main page of the new wiki version (empty, of course). On the left, under the logo is the navigation menu. Click the "Help" link and open it for editing. You will need to obtain the text to translate by opening the Help page of another language in a new browser window or tab for editing, copy all the text, then cancel editing of that language. Paste the text into the edit frame in the new language and save it. Click "edit" again and you are now ready to begin translating the text. 
1.  Do not forget you have to provide cross-linking between the page you are working on and other its language versions. To do that include somewhere in the text (better at the beginning of the article) a line that looks like **[[en:Help:Contents]]** where "en" is the language code and "Help:Contents" is the article's name in that language. There should be no spaces between the language code, the colon following it, and the first word of the article's name. When you save the page you will see a new section at the bottom of the left menu: links to other languages versions of this page. You will need to add as many links as there are other versions of your page. Do not forget to add a link pointing to your page to all other versions of it. 
1.  We hope that after this page is translated, consider translating **Main Page** and **Tkabber FAQ** — a collection of answers to the most popular questions regarding Tkabber. We would also recommend translating the articles that **Tkabber FAQ** references too, and so on. You are also free to translate any other page, especially those of interest to you. Note that there is a special page [Special:Allpages](Special/All_Pages.md) where you can find the articles that are left to translate.
1.  A couple of advices about how to translate things like [[Member:bigote]], [Special:Recentchanges](Special_Recentchanges.md), etc. 
 *  You are already done with the "Help" page, so now go to the [page of recent changes](Special_Recentchanges.md) (it will have other name in your language) where you could see a link to the page you have just translated and your nick next to it. Click it and in your personal info edit page (which, by the way, we'd recommend to fill up, at least put your JID) you will see its name. It will look like "Editando Usuario:Bigote" (this example is in Spanish but of course it would be different in other language). So if you need to put a link to a user's personal page that has an account at your language version, use a pattern [[Usuario:bigote|Bigote]]. If this user does not have a personal page in your language but he or she has one in other language, you might want to give an interwiki link like this: [[:ru:Участник:bigote|Bigote]]. It will look like a local link but it will lead to a personal page of that user in other language. Of course, the language code and the name space will be different, depending on the language version you link to. 
 *  Use this approach to know the names of the rest of special pages. (You could just hover the mouse pointer over a link and in the status bar of your browser you will see the fill link to the pointed article, so you only have to "extract" the article's name and to put it in your text.) 

### <a id="Translation_into_mother_tongue"></a>Translation into mother tongue

This part is dediacted to the languages other than English. We are trying to explain the problem giving Russian terms as an example but our recommendations could be helpful for other languages too, especially if they differ from English very much, like other slavic languages, Japanese, etc. 

When you translate into your own language, some problems with using specific IT terms could appear. On the one hand, in Russian IT slang there is a lot of transliterated English words like "файл" (file), "биндинг" (binding) and adapted words like "винт" (winchester, HDD), "аська" (ICQ). On the other hand, it has sense to translate some words, for example "список контактов" (a list of contacts, or just "contacts") instead of transliterated "ростер" (roster). It is up to you to decide which variant is the best, but the main recommendation is: try to avoid extremes. There is an article on our wiki named **[Terminology](Terminology.md)** where you can look for some difficult terms and also enlarge it if you think it is necessary. 

Another problem that grows when translating between languages of different language groups is loan translation, or calque. Try to avoid literal translation. If you do not understand some phrase, literal translation will not save its sense, on the contrary, it will break it. In most cases of such difficulties, it is still possible to achieve a good translation simplifying the sense of the phrase or splitting a long sentence into two or more simple ones. The last remedy: leave the source phrase next to your translation enclosed in parentheses. Somebody else will translate it later; wiki is perfect in this sense. By the way, if you read some article and see an obvious calque that spoils the discourse, do not be lazy: take a look at the source article and correct the translation. If you do not know the source language but nevertheless some place in the translation irritates you, use Discussion of that article (a link to each page's Discussion can be found at the top service menu). 

### <a id="Translation_into_a_foreign_language"></a>Translation into a foreign language

All of us know that to do a good translation it is very important to speak fluently the destination language. In most cases, we translate into our native languages but sometimes it is necessary to translate into a foreign one. What can we advise for such cases with reference to our wiki? 

*  Do not translate puns and jokes that we put here and there, if you are not sure if they sound good and adequate. It is better to translate the main sense of the phrase. After all, the people comes here to look for information, not for jokes. So try to translate its **information** component as good as you can. But of course, if you are able to write humorously in other language, nobody will mind a good joke in your translation :) 
*  If there is a possibility to get a native speaker to make a proof-reading of your translation, do not miss it even if your friend knows little about Jabber and computers in general. Although the code is international, one can make mistakes, not only grammatical ones which could be forgivable, but also logical ones which is worse. 
*  Do not neglect spell-checkers. It is true even if you are translating into your mother tongue ;) 
*  Remember of the destination language syntax rules when translating the wiki articles. For example, in French, all two-element punctuation marks (colon, semicolon, exclamation and question marks, etc.) are divided from the previous word by a space. So, thanks to this particularity, there is no head-ache about setting these marks in bold. 
*  As a consequence from the previous advice, we would recommend **not** to follow the rules explained above if they go against the syntax or stylistics of the other language. It is difficult to give a good example, but if you feel that some style could not be applied (for instance, I have no idea if it is possible to apply italic to Japanese hieroglyphs), so you will have to invent another way of emphasizing some text phragment. 

### <a id="Menu_translation"></a>Menu translation

Only project administrators are able to edit the navigation menu of our wiki, so please contact [Bigote](User_Bigote.md) or [LKnight](../ru/Участник_Lknight.md). 

### <a id="Tkabber_localization"></a>Tkabber localization

There is [an article (in English)](http://tkabber.jabber.ru/translate/how-to-start-new) at the official Tkabber site that could be very helpful for any person who would like to make a new Tkabber localization or maintain an existent one. Please consult it if you'd like to participate. 









|




|








|















|






148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191

Welcome to the **[Sandbox](Sandbox.md)** if you need to check some style or HTML tag behaviour. 

## <a id="For_translators"></a>For translators

### <a id="How_to_begin_making_a_new_language_version"></a>How to begin making a new language version

1.  If your language is not present in the [languages list](http://tkabber.jabe.ru) please contact [[1]](http://ru.tkabber.jabe.ru/Участник:Lknight|LKnight) or, if it is impossible to locate him, you can send your request to [Bigote](User_Bigote.md). Also you will need to help the project administrators in editing the new wiki's navigation menu and in adding a link to it to the Main Page [http://tkabber.jabe.ru](http://tkabber.jabe.ru) ;) 
1.  Well, a subdomain is ready. Now create an account at the new wiki version and also at all the rest version (if not, you will not get access to the source code of other articles, and besides, you will have to add links to the articles translated by you to all the rest of versions). 
1.  We would recommend that this page is translated first if possible, as it provides users with information on this wiki's style guidelines. 
1.  Put in your browser http://your\_language\_code.tkabber.jabe.ru and you will see the main page of the new wiki version (empty, of course). On the left, under the logo is the navigation menu. Click the "Help" link and open it for editing. You will need to obtain the text to translate by opening the Help page of another language in a new browser window or tab for editing, copy all the text, then cancel editing of that language. Paste the text into the edit frame in the new language and save it. Click "edit" again and you are now ready to begin translating the text. 
1.  Do not forget you have to provide cross-linking between the page you are working on and other its language versions. To do that include somewhere in the text (better at the beginning of the article) a line that looks like **[[en:Help:Contents]]** where "en" is the language code and "Help:Contents" is the article's name in that language. There should be no spaces between the language code, the colon following it, and the first word of the article's name. When you save the page you will see a new section at the bottom of the left menu: links to other languages versions of this page. You will need to add as many links as there are other versions of your page. Do not forget to add a link pointing to your page to all other versions of it. 
1.  We hope that after this page is translated, consider translating **Main Page** and **Tkabber FAQ** — a collection of answers to the most popular questions regarding Tkabber. We would also recommend translating the articles that **Tkabber FAQ** references too, and so on. You are also free to translate any other page, especially those of interest to you. Note that there is a special page [Special:Allpages](Special_Allpages.md) where you can find the articles that are left to translate. 
1.  A couple of advices about how to translate things like [[Member:bigote]], [Special:Recentchanges](Special_Recentchanges.md), etc. 
 *  You are already done with the "Help" page, so now go to the [page of recent changes](Special_Recentchanges.md) (it will have other name in your language) where you could see a link to the page you have just translated and your nick next to it. Click it and in your personal info edit page (which, by the way, we'd recommend to fill up, at least put your JID) you will see its name. It will look like "Editando Usuario:Bigote" (this example is in Spanish but of course it would be different in other language). So if you need to put a link to a user's personal page that has an account at your language version, use a pattern [[Usuario:bigote|Bigote]]. If this user does not have a personal page in your language but he or she has one in other language, you might want to give an interwiki link like this: [[:ru:Участник:bigote|Bigote]]. It will look like a local link but it will lead to a personal page of that user in other language. Of course, the language code and the name space will be different, depending on the language version you link to. 
 *  Use this approach to know the names of the rest of special pages. (You could just hover the mouse pointer over a link and in the status bar of your browser you will see the fill link to the pointed article, so you only have to "extract" the article's name and to put it in your text.) 

### <a id="Translation_into_mother_tongue"></a>Translation into mother tongue

This part is dediacted to the languages other than English. We are trying to explain the problem giving Russian terms as an example but our recommendations could be helpful for other languages too, especially if they differ from English very much, like other slavic languages, Japanese, etc. 

When you translate into your own language, some problems with using specific IT terms could appear. On the one hand, in Russian IT slang there is a lot of transliterated English words like "файл" (file), "биндинг" (binding) and adapted words like "винт" (winchester, HDD), "аська" (ICQ). On the other hand, it has sense to translate some words, for example "список контактов" (a list of contacts, or just "contacts") instead of transliterated "ростер" (roster). It is up to you to decide which variant is the best, but the main recommendation is: try to avoid extremes. There is an article on our wiki named **[Terminology](Terminology_(en).md)** where you can look for some difficult terms and also enlarge it if you think it is necessary. 

Another problem that grows when translating between languages of different language groups is loan translation, or calque. Try to avoid literal translation. If you do not understand some phrase, literal translation will not save its sense, on the contrary, it will break it. In most cases of such difficulties, it is still possible to achieve a good translation simplifying the sense of the phrase or splitting a long sentence into two or more simple ones. The last remedy: leave the source phrase next to your translation enclosed in parentheses. Somebody else will translate it later; wiki is perfect in this sense. By the way, if you read some article and see an obvious calque that spoils the discourse, do not be lazy: take a look at the source article and correct the translation. If you do not know the source language but nevertheless some place in the translation irritates you, use Discussion of that article (a link to each page's Discussion can be found at the top service menu). 

### <a id="Translation_into_a_foreign_language"></a>Translation into a foreign language

All of us know that to do a good translation it is very important to speak fluently the destination language. In most cases, we translate into our native languages but sometimes it is necessary to translate into a foreign one. What can we advise for such cases with reference to our wiki? 

*  Do not translate puns and jokes that we put here and there, if you are not sure if they sound good and adequate. It is better to translate the main sense of the phrase. After all, the people comes here to look for information, not for jokes. So try to translate its **information** component as good as you can. But of course, if you are able to write humorously in other language, nobody will mind a good joke in your translation :) 
*  If there is a possibility to get a native speaker to make a proof-reading of your translation, do not miss it even if your friend knows little about Jabber and computers in general. Although the code is international, one can make mistakes, not only grammatical ones which could be forgivable, but also logical ones which is worse. 
*  Do not neglect spell-checkers. It is true even if you are translating into your mother tongue ;) 
*  Remember of the destination language syntax rules when translating the wiki articles. For example, in French, all two-element punctuation marks (colon, semicolon, exclamation and question marks, etc.) are divided from the previous word by a space. So, thanks to this particularity, there is no head-ache about setting these marks in bold. 
*  As a consequence from the previous advice, we would recommend **not** to follow the rules explained above if they go against the syntax or stylistics of the other language. It is difficult to give a good example, but if you feel that some style could not be applied (for instance, I have no idea if it is possible to apply italic to Japanese hieroglyphs), so you will have to invent another way of emphasizing some text phragment. 

### <a id="Menu_translation"></a>Menu translation

Only project administrators are able to edit the navigation menu of our wiki, so please contact [Bigote](User_Bigote.md) or [LKnight](../ru/Участник_lknight.md). 

### <a id="Tkabber_localization"></a>Tkabber localization

There is [an article (in English)](http://tkabber.jabber.ru/translate/how-to-start-new) at the official Tkabber site that could be very helpful for any person who would like to make a new Tkabber localization or maintain an existent one. Please consult it if you'd like to participate. 


Changes to wiki/en/How_to_add_a_new_remote_command.md.

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

You'll learn from this article how to create and register your own function for remote control. 

## <a id="toc"></a>Contents

* [1 Understanding](#Understanding)
* [2 Coding](#Coding)
   * [2.1 Registering your remote command](#Registering_your_remote_command)
   * [2.2 Scheduler](#Scheduler)
   * [2.3 Steps](#Steps)
   * [2.4 Last step](#Last_step)
   * [2.5 Sending errors](#Sending_errors)
   * [2.6 Cleanup](#Cleanup)
* [3 Read sources!](#Read_sources)
* [4 See also](#See_also)

## <a id="Understanding"></a>Understanding

Ok. If you are ready let's try to understand base blocks of remote control internals. 








|
|
|
|
|
|







9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

You'll learn from this article how to create and register your own function for remote control. 

## <a id="toc"></a>Contents

* [1 Understanding](#Understanding)
* [2 Coding](#Coding)
 * [2.1 Registering your remote command](#Registering_your_remote_command)
 * [2.2 Scheduler](#Scheduler)
 * [2.3 Steps](#Steps)
 * [2.4 Last step](#Last_step)
 * [2.5 Sending errors](#Sending_errors)
 * [2.6 Cleanup](#Cleanup)
* [3 Read sources!](#Read_sources)
* [4 See also](#See_also)

## <a id="Understanding"></a>Understanding

Ok. If you are ready let's try to understand base blocks of remote control internals. 

Changes to wiki/en/Main_Page.md.

8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 Welcome to the official documentation page of one of the advanced [Jabber (XMPP)](http://jabber.org) client, [Tkabber](http://tkabber.jabber.ru). 

Please note that in Russian and Ukrainian parts of this wiki we write Tkabber in Cyrillic, like this — Ткаббер. The reason is simple: Tkabber is a Russian program, so at least in Russian we can permit us do this ;) Besides, declensions make the discourse more smooth and fluent. 

## <a id="toc"></a>Contents

* [1 Contents](#Contents)
   * [1.1 Theory](#Theory)
   * [1.2 Articles](#Articles)
   * [1.3 Development](#Development)
   * [1.4 Practice](#Practice)
   * [1.5 Repair Parts](#Repair_Parts)
   * [1.6 Discussions](#Discussions)
   * [1.7 Special Pages](#Special_Pages)
* [2 A Short Description Of Some Articles](#A_Short_Description_Of_Some_Articles)
* [3 About Wiki](#About_Wiki)

# <a id="Contents"></a>Contents
Made for rapid search by topics. Please don't forget that you can find a full list of pages [here.](Special_AllPages.md) 

## <a id="Theory"></a>[Theory](Theory.md)
 
*  [Terminology](Terminology.md) 
*  [About Tkabber](Is_Tkabber_A_Champion_.md) 
*  [Config.tcl For Beginners](Config.tcl_For_Beginners.md) 
*  [For Beginners](For_Beginners.md) 
*  [Configuring Tkabber: Basic And More Advanced Steps](Configuring_Tkabber__Basic_And_More_Advanced_Steps.md) 
  
## <a id="Articles"></a>[Articles](Theory.md#For_Advanced_Users)
 
*  [Sending Files: Theory](Sending_Files__Theory.md) 
*  [Remote Control With "send"](Remote_Control_With__send_.md) 
*  [Encryption In Tkabber](Encryption_In_Tkabber.md) 
*  [Tkabber Inside Out](Tkabber_Inside_Out.md) 
  
## <a id="Development"></a>[Development](Development.md)
 
*  [Creating Tkabber Starpack](Tkabber_starpack.md) 
*  [Wish And Russian Layout In Windows](Wish_And_Russian_Layout_In_Windows.md) 
*  [MUC Ignore](MUC_Ignore.md) 
*  [Nick coloring](Nick_coloring.md) 
*  [Config dir](Config_dir.md) 
*  [Suppressing Spam Using Privacy Lists](Suppressing_Spam_Using_Privacy_Lists.md) 
*  [New Appearance Of Tk In 8.5](New_Appearance_Of_Tk_In_8.5.md) 

## <a id="Practice"></a>[Practice](Practice.md)
 
*  [Tkabber FAQ](Tkabber_FAQ.md) 
*  [Fonts](Fonts.md) 
*  [Smilies And Avatars](Smilies_And_Avatars.md) 
*  [Color Schemes And Icons](Color_Schemes_And_Icons.md) 
*  [Troubles With Sound](Troubles_With_Sound.md) 
*  [Sound Schemes](Sound_Schemes.md) 







|
|
|
|
|
|
|






|







|






|









|







8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 Welcome to the official documentation page of one of the advanced [Jabber (XMPP)](http://jabber.org) client, [Tkabber](http://tkabber.jabber.ru). 

Please note that in Russian and Ukrainian parts of this wiki we write Tkabber in Cyrillic, like this — Ткаббер. The reason is simple: Tkabber is a Russian program, so at least in Russian we can permit us do this ;) Besides, declensions make the discourse more smooth and fluent. 

## <a id="toc"></a>Contents

* [1 Contents](#Contents)
 * [1.1 [Theory](Theory.md)](#TheoryTheory.md)
 * [1.2 [Articles](Theory.md#For_Advanced_Users)](#ArticlesTheory.mdNFor_Advanced_Users)
 * [1.3 [Development](Development.md)](#DevelopmentDevelopment.md)
 * [1.4 [Practice](Practice.md)](#PracticePractice.md)
 * [1.5 Repair Parts](#Repair_Parts)
 * [1.6 Discussions](#Discussions)
 * [1.7 Special Pages](#Special_Pages)
* [2 A Short Description Of Some Articles](#A_Short_Description_Of_Some_Articles)
* [3 About Wiki](#About_Wiki)

# <a id="Contents"></a>Contents
Made for rapid search by topics. Please don't forget that you can find a full list of pages [here.](Special_AllPages.md) 

## <a id="TheoryTheory.md"></a>[Theory](Theory.md)
 
*  [Terminology](Terminology.md) 
*  [About Tkabber](Is_Tkabber_A_Champion_.md) 
*  [Config.tcl For Beginners](Config.tcl_For_Beginners.md) 
*  [For Beginners](For_Beginners.md) 
*  [Configuring Tkabber: Basic And More Advanced Steps](Configuring_Tkabber__Basic_And_More_Advanced_Steps.md) 
  
## <a id="ArticlesTheory.mdNFor_Advanced_Users"></a>[Articles](Theory.md#For_Advanced_Users)
 
*  [Sending Files: Theory](Sending_Files__Theory.md) 
*  [Remote Control With "send"](Remote_Control_With__send_.md) 
*  [Encryption In Tkabber](Encryption_In_Tkabber.md) 
*  [Tkabber Inside Out](Tkabber_Inside_Out.md) 
  
## <a id="DevelopmentDevelopment.md"></a>[Development](Development.md)
 
*  [Creating Tkabber Starpack](Tkabber_starpack.md) 
*  [Wish And Russian Layout In Windows](Wish_And_Russian_Layout_In_Windows.md) 
*  [MUC Ignore](MUC_Ignore.md) 
*  [Nick coloring](Nick_coloring.md) 
*  [Config dir](Config_dir.md) 
*  [Suppressing Spam Using Privacy Lists](Suppressing_Spam_Using_Privacy_Lists.md) 
*  [New Appearance Of Tk In 8.5](New_Appearance_Of_Tk_In_8.5.md) 

## <a id="PracticePractice.md"></a>[Practice](Practice.md)
 
*  [Tkabber FAQ](Tkabber_FAQ.md) 
*  [Fonts](Fonts.md) 
*  [Smilies And Avatars](Smilies_And_Avatars.md) 
*  [Color Schemes And Icons](Color_Schemes_And_Icons.md) 
*  [Troubles With Sound](Troubles_With_Sound.md) 
*  [Sound Schemes](Sound_Schemes.md) 

Changes to wiki/en/Plugins.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[//]: # (Generated from ../selected/en.tkabber.jabe.ru/index.php/Plugins/index.html)


# Plugins

From Tkabber Wiki

## <a id="toc"></a>Contents

* [1 Плагинология](#Плагинология)
   * [1.1 Как подключить плагин](#Как_подключить_плагин)
   * [1.2 Подводные камни при обновлении Ткаббера](#Подводные_камни_при_обновлении_Ткаббера)
   * [1.3 Анатомия плагина](#Анатомия_плагина)
   * [1.4 Сисадмину на заметку](#Сисадмину_на_заметку)
* [2 Официальные плагины для Ткаббера](#Официальные_плагины_для_Ткаббера)
* [3 Неофициальные плагины для Ткаббера](#Неофициальные_плагины_для_Ткаббера)
   * [3.1 Alarm](#Alarm)
   * [3.2 Autoconnect](#Autoconnect)
   * [3.3 Tab number](#Tab_number)
   * [3.4 Confirm](#Confirm)
   * [3.5 Rsssaver](#Rsssaver)
   * [3.6 Bookmarks](#Bookmarks)
   * [3.7 Meebo me](#Meebo_me)
   * [3.8 Floating Roster Contact](#Floating_Roster_Contact)
   * [3.9 Postpone Text (chat plugin)](#Postpone_Text_chat_plugin)
   * [3.10 Autoretrieve](#Autoretrieve)
   * [3.11 Last Activity](#Last_Activity)
   * [3.12 Server Info](#Server_Info)
   * [3.13 Open URL](#Open_URL)
   * [3.14 Hihglight XEP URLs](#Hihglight_XEP_URLs)
   * [3.15 Tkabber-KHIM](#Tkabber-KHIM)
   * [3.16 so\_keepalive](#so_keepalive)

# <a id="Плагинология"></a>Плагинология
В этом разделе рассказано о внешних плагинах Ткаббера. 

Если вы — новичок, прочитайте как минимум первые два раздела. 

## <a id="Как_подключить_плагин"></a>Как подключить плагин










|
|
|
|


|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[//]: # (Generated from ../selected/en.tkabber.jabe.ru/index.php/Plugins/index.html)


# Plugins

From Tkabber Wiki

## <a id="toc"></a>Contents

* [1 Плагинология](#Плагинология)
 * [1.1 Как подключить плагин](#Как_подключить_плагин)
 * [1.2 Подводные камни при обновлении Ткаббера](#Подводные_камни_при_обновлении_Ткаббера)
 * [1.3 Анатомия плагина](#Анатомия_плагина)
 * [1.4 Сисадмину на заметку](#Сисадмину_на_заметку)
* [2 Официальные плагины для Ткаббера](#Официальные_плагины_для_Ткаббера)
* [3 Неофициальные плагины для Ткаббера](#Неофициальные_плагины_для_Ткаббера)
 * [3.1 Alarm](#Alarm)
 * [3.2 Autoconnect](#Autoconnect)
 * [3.3 Tab number](#Tab_number)
 * [3.4 Confirm](#Confirm)
 * [3.5 Rsssaver](#Rsssaver)
 * [3.6 Bookmarks](#Bookmarks)
 * [3.7 Meebo me](#Meebo_me)
 * [3.8 Floating Roster Contact](#Floating_Roster_Contact)
 * [3.9 Postpone Text (chat plugin)](#Postpone_Text_chat_plugin)
 * [3.10 Autoretrieve](#Autoretrieve)
 * [3.11 Last Activity](#Last_Activity)
 * [3.12 Server Info](#Server_Info)
 * [3.13 Open URL](#Open_URL)
 * [3.14 Hihglight XEP URLs](#Hihglight_XEP_URLs)
 * [3.15 Tkabber-KHIM](#Tkabber-KHIM)
 * [3.16 so\_keepalive](#so_keepalive)

# <a id="Плагинология"></a>Плагинология
В этом разделе рассказано о внешних плагинах Ткаббера. 

Если вы — новичок, прочитайте как минимум первые два раздела. 

## <a id="Как_подключить_плагин"></a>Как подключить плагин

Changes to wiki/en/Special/All_Pages.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# Special/All Pages

From Tkabber Wiki

## All Pages

* [Devel](../Devel.md) (1 reference)
* [For Beginners](../For_Beginners.md) (2 references)
* [Help:Contents](../Help_Contents.md) (4 references)
* [How to add a new remote command](../How_to_add_a_new_remote_command.md) (5 references, 2 from other language pages)
* [Main Page](../Main_Page.md) (3 references, 1 from other language pages)
* [Non-obvious config hacks](../Non-obvious_config_hacks.md) (1 reference)
* [Pages](../Pages.md) (2 references)
* [Patches](../Patches.md) (4 references)
* [Plugins](../Plugins.md) (5 references)
* [Practice](../Practice.md) (3 references)
* [Special/All Pages](../Special/All_Pages.md) (1 reference)
* [Special/Missing References](../Special/Missing_References.md) (1 reference)
* [TODO](../TODO.md) (4 references, 1 from other language pages)
* [Theory](../Theory.md) (4 references)
* [Tkabber FAQ](../Tkabber_FAQ.md) (6 references)
* [Tkabber FAQ/Appearance and sound](../Tkabber_FAQ/Appearance_and_sound.md) (2 references)
* [Tkabber FAQ/How can I...](../Tkabber_FAQ/How_can_I....md) (1 reference)
* [Tkabber for Developers](../Tkabber_for_Developers.md) (3 references)
* [User:Bigote](../User_Bigote.md) (6 references)
* [User:Kostix](../User_Kostix.md) (3 references)








|







|
|
|

|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# Special/All Pages

From Tkabber Wiki

## All Pages

* [Devel](../Devel.md) (1 reference)
* [For Beginners (en)](../For_Beginners_(en).md) (**0** references)
* [Help:Contents](../Help_Contents.md) (4 references)
* [How to add a new remote command](../How_to_add_a_new_remote_command.md) (5 references, 2 from other language pages)
* [Main Page](../Main_Page.md) (3 references, 1 from other language pages)
* [Non-obvious config hacks](../Non-obvious_config_hacks.md) (1 reference)
* [Pages](../Pages.md) (2 references)
* [Patches](../Patches.md) (4 references)
* [Plugins](../Plugins.md) (5 references)
* [Practice](../Practice.md) (4 references)
* [Special/All Pages](../Special/All_Pages.md) (2 references)
* [Special/Missing References](../Special/Missing_References.md) (**0** references)
* [TODO](../TODO.md) (4 references, 1 from other language pages)
* [Theory](../Theory.md) (6 references)
* [Tkabber FAQ](../Tkabber_FAQ.md) (6 references)
* [Tkabber FAQ/Appearance and sound](../Tkabber_FAQ/Appearance_and_sound.md) (2 references)
* [Tkabber FAQ/How can I...](../Tkabber_FAQ/How_can_I....md) (1 reference)
* [Tkabber for Developers](../Tkabber_for_Developers.md) (3 references)
* [User:Bigote](../User_Bigote.md) (6 references)
* [User:Kostix](../User_Kostix.md) (3 references)

Changes to wiki/en/Special/Missing_References.md.

1
2
3
4
5
6
7
8


9

10
11


12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

28
29
30
31
32
33
34
# Special/Missing References

From Tkabber Wiki

## Missing References

#### [Help:Contents](../Help_Contents.md)



* Sandbox.md

* Special\_Recentchanges.md
* Terminology.md



#### [How to add a new remote command](../How_to_add_a_new_remote_command.md)

* Category\_Devel.md
* Special\_Categories.md

#### [Main Page](../Main_Page.md)

* Color\_Schemes\_And\_Icons.md
* Config.tcl\_For\_Beginners.md
* Config\_dir.md
* Configurator.md
* Configuring\_Tkabber\_\_Basic\_And\_More\_Advanced\_Steps.md
* Development.md
* Encryption\_In\_Tkabber.md
* Fonts.md

* Is\_Tkabber\_A\_Champion\_.md
* Links.md
* MUC\_Ignore.md
* New\_Appearance\_Of\_Tk\_In\_8.5.md
* Nick\_coloring.md
* Non-trivial\_Settings.md
* Plugins/AntiSPIM.md








>
>

>

|
>
>
















>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# Special/Missing References

From Tkabber Wiki

## Missing References

#### [Help:Contents](../Help_Contents.md)

* ../ru/Участник\_kostix.md
* ../ru/Участник\_lknight.md
* Sandbox.md
* Special\_Allpages.md
* Special\_Recentchanges.md
* Terminology\_(en
* http://ru.tkabber.jabe.ru/Участник:Lknight|LKnight
* http://tkabber.jabe.ru

#### [How to add a new remote command](../How_to_add_a_new_remote_command.md)

* Category\_Devel.md
* Special\_Categories.md

#### [Main Page](../Main_Page.md)

* Color\_Schemes\_And\_Icons.md
* Config.tcl\_For\_Beginners.md
* Config\_dir.md
* Configurator.md
* Configuring\_Tkabber\_\_Basic\_And\_More\_Advanced\_Steps.md
* Development.md
* Encryption\_In\_Tkabber.md
* Fonts.md
* For\_Beginners.md
* Is\_Tkabber\_A\_Champion\_.md
* Links.md
* MUC\_Ignore.md
* New\_Appearance\_Of\_Tk\_In\_8.5.md
* Nick\_coloring.md
* Non-trivial\_Settings.md
* Plugins/AntiSPIM.md
68
69
70
71
72
73
74




75
76
77
78
79
80
81
82

















83
84
85
86
87
88
89
* Участник\_Kostix.md
* Участник\_Teo.md
* Участник\_archimed.md
* Участник\_eXire.md
* Участник\_feez.md
* Участник\_lknight.md





#### [TODO](../TODO.md)

* ../ru/Nick+coloring.md

#### [Tkabber FAQ](../Tkabber_FAQ.md)

* Configuration\_file.md
* Emoticons\_And\_Avatars.md


















#### [Tkabber FAQ/Appearance and sound](../Tkabber_FAQ/Appearance_and_sound.md)

* ../Configuration\_file.md
* ../Emoticons\_and\_avatars.md
* ../Fonts.md
* ../Implementation\_peculiarities.md







>
>
>
>






|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
* Участник\_Kostix.md
* Участник\_Teo.md
* Участник\_archimed.md
* Участник\_eXire.md
* Участник\_feez.md
* Участник\_lknight.md

#### [Special/All Pages](../Special/All_Pages.md)

* ../For\_Beginners\_(en

#### [TODO](../TODO.md)

* ../ru/Nick+coloring.md

#### [Tkabber FAQ](../Tkabber_FAQ.md)

* Configuration\_file\_(en
* Emoteicons\_And\_Avatars\_(en
* Low\_traffic\_HOWTO.md
* Tkabber\_Windows\_Mini\_HOWTO.md
* Дистрибутивы\_\_которые\_мы\_выбираем\_(ru
* Начинающим\_(ru
* Нетривиальные\_настройки.md
* Патчи\_(ru
* Пересылка\_файлов\_\_теория\_(ru
* Плагины.md
* Плагины\_(ru
* Проблемы\_X\_Window\_и\_TTF\_(ru
* Проблемы\_со\_звуком.md
* Проблемы\_со\_звуком\_(ru
* Смайлики\_и\_аватары.md
* Удалённое\_управление\_с\_помощью\_send.md
* Участник\_Kostix.md
* Файл\_конфигурации\_(ru
* Шифрование\_в\_Ткаббере\_(ru

#### [Tkabber FAQ/Appearance and sound](../Tkabber_FAQ/Appearance_and_sound.md)

* ../Configuration\_file.md
* ../Emoticons\_and\_avatars.md
* ../Fonts.md
* ../Implementation\_peculiarities.md

Changes to wiki/en/TODO.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[//]: # (Generated from ../selected/en.tkabber.jabe.ru/index.php/TODO/index.html)


# TODO

From Tkabber Wiki

## <a id="toc"></a>Contents

* [1 XMPP](#XMPP)
   * [1.1 Interface for pubsub](#Interface_for_pubsub)
   * [1.2 IQ/IBB](#IQ_IBB)
   * [1.3 xmpp: URIs](#xmpp_URIs)
   * [1.4 Private storage](#Private_storage)
* [2 Internals](#Internals)
   * [2.1 Virtual events](#Virtual_events)
   * [2.2 Searching](#Searching)
   * [2.3 Roster code improvements](#Roster_code_improvements)
      * [2.3.1 "MUC Ignoring" ruleset editor](#MUC_Ignoring_ruleset_editor)
* [3 UI improvements](#UI_improvements)
   * [3.1 Chats history](#Chats_history)
   * [3.2 Generalize "chat window UI" API](#Generalize_chat_window_UI_API)
   * [3.3 File transfers](#File_transfers)
   * [3.4 Handling of "normal" messages](#Handling_of_normal_messages)
   * [3.5 Searching](#Searching)
   * [3.6 Improve nick coloring](#Improve_nick_coloring)
   * [3.7 Omniscent context menus](#Omniscent_context_menus)
   * [3.8 Accelerated menus](#Accelerated_menus)
   * [3.9 BWidget](#BWidget)
   * [3.10 Buttonbar improvements](#Buttonbar_improvements)
      * [3.10.1 Generic labels (may be)](#Generic_labels_may_be)
* [4 Plugins](#Plugins)
   * [4.1 Move some plugins to the trunk](#Move_some_plugins_to_the_trunk)
   * [4.2 New plugins](#New_plugins)

## <a id="XMPP"></a>XMPP

### <a id="Interface_for_pubsub"></a>Interface for pubsub

Create visual interface for pubsub. 











|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|

|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[//]: # (Generated from ../selected/en.tkabber.jabe.ru/index.php/TODO/index.html)


# TODO

From Tkabber Wiki

## <a id="toc"></a>Contents

* [1 XMPP](#XMPP)
 * [1.1 Interface for pubsub](#Interface_for_pubsub)
 * [1.2 IQ/IBB](#IQ_IBB)
 * [1.3 xmpp: URIs](#xmpp_URIs)
 * [1.4 Private storage](#Private_storage)
* [2 Internals](#Internals)
 * [2.1 Virtual events](#Virtual_events)
 * [2.2 Searching](#Searching)
 * [2.3 Roster code improvements](#Roster_code_improvements)
  * [2.3.1 "MUC Ignoring" ruleset editor](#MUC_Ignoring_ruleset_editor)
* [3 UI improvements](#UI_improvements)
 * [3.1 Chats history](#Chats_history)
 * [3.2 Generalize "chat window UI" API](#Generalize_chat_window_UI_API)
 * [3.3 File transfers](#File_transfers)
 * [3.4 Handling of "normal" messages](#Handling_of_normal_messages)
 * [3.5 Searching](#Searching)
 * [3.6 Improve nick coloring](#Improve_nick_coloring)
 * [3.7 Omniscent context menus](#Omniscent_context_menus)
 * [3.8 Accelerated menus](#Accelerated_menus)
 * [3.9 BWidget](#BWidget)
 * [3.10 Buttonbar improvements](#Buttonbar_improvements)
  * [3.10.1 Generic labels (may be)](#Generic_labels_may_be)
* [4 Plugins](#Plugins)
 * [4.1 Move some plugins to the trunk](#Move_some_plugins_to_the_trunk)
 * [4.2 New plugins](#New_plugins)

## <a id="XMPP"></a>XMPP

### <a id="Interface_for_pubsub"></a>Interface for pubsub

Create visual interface for pubsub. 

Changes to wiki/en/Tkabber_FAQ.md.

8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
 **THIS PAGE IS BEING TRANSLATED. PLEASE BE PATIENT (OR HELP US IF YOU SPEAK RUSSIAN)** 

If your problem is not solved here please visit `[xmpp:tkabber@conference.jabber.ru](xmpp:tkabber@conference.jabber.ru)`. If we manage to solve it, the answer will be added here or as a new article of this wiki. 

## <a id="toc"></a>Contents

* [1 What is...?](#What_is...)
   * [1.1 Roster](#Roster)
   * [1.2 Resource](#Resource)
   * [1.3 Priority](#Priority)
   * [1.4 Tkabber Console](#Tkabber_Console)
* [2 Visual Appearance And Sounds](#Visual_Appearance_And_Sounds)
   * [2.1 Fonts](#Fonts)
   * [2.2 Cannot connect up new smilies sets (sound schemes)](#Cannot_connect_up_new_smilies_sets_sound_schemes)
   * [2.3 How to enter smilies "from a menu"?](#How_to_enter_smilies_from_a_menu)
   * [2.4 Can I **disable** smilies?](#Can_I_disable_smilies)
   * [2.5 Can't see smilies/photos/etc in PNG format](#Cant_see_smilies_photos_etc_in_PNG_format)
   * [2.6 Color Schemes](#Color_Schemes)
   * [2.7 Поддерживает ли Ткаббер аватары?](#Поддерживает_ли_Ткаббер_аватары)
   * [2.8 Проблема со звуковой схемой](#Проблема_со_звуковой_схемой)
   * [2.9 Регулировка громкости звука](#Регулировка_громкости_звука)
* [3 Problems Arising During Work](#Problems_Arising_During_Work)
   * [3.1 Долгая загрузка Ткаббера](#Долгая_загрузка_Ткаббера)
   * [3.2 Пересылка файлов](#Пересылка_файлов)
   * [3.3 Шифрование в Ткаббере: проблемы с **gpgme/tclgpgme**](#Шифрование_в_Ткаббере_проблемы_с_gpgme_tclgpgme)
   * [3.4 Проблема с новым релизом Ткаббера 0.9.9-1.2](#Проблема_с_новым_релизом_Ткаббера_0.9.9-1.2)
   * [3.5 Ткаббер под X Window падает при попытке показать "странные" символы](#Ткаббер_под_X_Window_падает_при_попытке_показать_странные_символы)
   * [3.6 Не работает вставка по Control-v под X Window](#Не_работает_вставка_по_Control-v_под_X_Window)
   * [3.7 Tkabber постоянно держит меня в состоянии "отошёл" ("away")](#Tkabber_постоянно_держит_меня_в_состоянии_отошёл_away)
   * [3.8 В старпаке/старките нет звука](#В_старпаке_старките_нет_звука)
   * [3.9 Пропадает содержимое ростера](#Пропадает_содержимое_ростера)
   * [3.10 Не могу приконнектиться к серверу через прокси](#Не_могу_приконнектиться_к_серверу_через_прокси)
   * [3.11 Keep alive в Ткаббере — возможно ли?](#Keep_alive_в_Ткаббере_-_возможно_ли)
* [4 How Do I Do...?](#How_Do_I_Do...)
   * [4.1 Отправка сообщений по Ctrl-Enter](#Отправка_сообщений_по_Ctrl-Enter)
   * [4.2 Можно ли добавить в ростер самого себя?](#Можно_ли_добавить_в_ростер_самого_себя)
   * [4.3 Одновременная работа с несколькими аккаунтами](#Одновременная_работа_с_несколькими_аккаунтами)
   * [4.4 Как насчёт автозахода на конференции?](#Как_насчёт_автозахода_на_конференции)
   * [4.5 Сжатие трафика в Ткаббере](#Сжатие_трафика_в_Ткаббере)
   * [4.6 Выделение текста жирным, курсивом и подчёркиванием](#Выделение_текста_жирным_курсивом_и_подчёркиванием)
   * [4.7 Ввод "хитрых" юникодных символов](#Ввод_хитрых_юникодных_символов)
   * [4.8 Игнор — великая вещь!](#Игнор_-_великая_вещь)
   * [4.9 Подтверждения](#Подтверждения)
   * [4.10 Удалённое управление](#Удалённое_управление)
   * [4.11 Команды Ткаббера](#Команды_Ткаббера)
   * [4.12 Скрытие версий клиента и ОС](#Скрытие_версий_клиента_и_ОС)
   * [4.13 Как подключить плагин?](#Как_подключить_плагин)
   * [4.14 Как уменьшить трафик?](#Как_уменьшить_трафик)
* [5 Miscellaneous](#Miscellaneous)
   * [5.1 Что случилось с сайтом http://sgolovan.nes.ru/ ?](#Что_случилось_с_сайтом_http__sgolovan.nes.ru__)
   * [5.2 ...а мне ИГРАТЬ охота!!!](#...а_мне_ИГРАТЬ_охота)
   * [5.3 Старые версии Ткаббера и плагинов](#Старые_версии_Ткаббера_и_плагинов)
* [6 Questions related with XMPP](#Questions_related_with_XMPP)
   * [6.1 MUC](#MUC)
      * [6.1.1 Не работают инвайты](#Не_работают_инвайты)

# <a id="What_is..."></a>What is...?
## <a id="Roster"></a>Roster

Answer: Roster is a list of contacts. See [definitions](http://www.google.com/search?q=define:roster&start=0&ie=utf-8&oe=utf-8) of this term found by google. 

## <a id="Resource"></a>Resource







|
|
|
|

|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|

|
|







8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
 **THIS PAGE IS BEING TRANSLATED. PLEASE BE PATIENT (OR HELP US IF YOU SPEAK RUSSIAN)** 

If your problem is not solved here please visit `[xmpp:tkabber@conference.jabber.ru](xmpp:tkabber@conference.jabber.ru)`. If we manage to solve it, the answer will be added here or as a new article of this wiki. 

## <a id="toc"></a>Contents

* [1 What is...?](#What_is...)
 * [1.1 Roster](#Roster)
 * [1.2 Resource](#Resource)
 * [1.3 Priority](#Priority)
 * [1.4 Tkabber Console](#Tkabber_Console)
* [2 Visual Appearance And Sounds](#Visual_Appearance_And_Sounds)
 * [2.1 Fonts](#Fonts)
 * [2.2 Cannot connect up new smilies sets (sound schemes)](#Cannot_connect_up_new_smilies_sets_sound_schemes)
 * [2.3 How to enter smilies "from a menu"?](#How_to_enter_smilies_from_a_menu)
 * [2.4 Can I **disable** smilies?](#Can_I_disable_smilies)
 * [2.5 Can't see smilies/photos/etc in PNG format](#Cant_see_smilies_photos_etc_in_PNG_format)
 * [2.6 Color Schemes](#Color_Schemes)
 * [2.7 Поддерживает ли Ткаббер аватары?](#Поддерживает_ли_Ткаббер_аватары)
 * [2.8 Проблема со звуковой схемой](#Проблема_со_звуковой_схемой)
 * [2.9 Регулировка громкости звука](#Регулировка_громкости_звука)
* [3 Problems Arising During Work](#Problems_Arising_During_Work)
 * [3.1 Долгая загрузка Ткаббера](#Долгая_загрузка_Ткаббера)
 * [3.2 Пересылка файлов](#Пересылка_файлов)
 * [3.3 Шифрование в Ткаббере: проблемы с **gpgme/tclgpgme**](#Шифрование_в_Ткаббере_проблемы_с_gpgme_tclgpgme)
 * [3.4 Проблема с новым релизом Ткаббера 0.9.9-1.2](#Проблема_с_новым_релизом_Ткаббера_0.9.9-1.2)
 * [3.5 Ткаббер под X Window падает при попытке показать "странные" символы](#Ткаббер_под_X_Window_падает_при_попытке_показать_странные_символы)
 * [3.6 Не работает вставка по Control-v под X Window](#Не_работает_вставка_по_Control-v_под_X_Window)
 * [3.7 Tkabber постоянно держит меня в состоянии "отошёл" ("away")](#Tkabber_постоянно_держит_меня_в_состоянии_отошёл_away)
 * [3.8 В старпаке/старките нет звука](#В_старпаке_старките_нет_звука)
 * [3.9 Пропадает содержимое ростера](#Пропадает_содержимое_ростера)
 * [3.10 Не могу приконнектиться к серверу через прокси](#Не_могу_приконнектиться_к_серверу_через_прокси)
 * [3.11 Keep alive в Ткаббере — возможно ли?](#Keep_alive_в_Ткаббере_-_возможно_ли)
* [4 How Do I Do...?](#How_Do_I_Do...)
 * [4.1 Отправка сообщений по Ctrl-Enter](#Отправка_сообщений_по_Ctrl-Enter)
 * [4.2 Можно ли добавить в ростер самого себя?](#Можно_ли_добавить_в_ростер_самого_себя)
 * [4.3 Одновременная работа с несколькими аккаунтами](#Одновременная_работа_с_несколькими_аккаунтами)
 * [4.4 Как насчёт автозахода на конференции?](#Как_насчёт_автозахода_на_конференции)
 * [4.5 Сжатие трафика в Ткаббере](#Сжатие_трафика_в_Ткаббере)
 * [4.6 Выделение текста жирным, курсивом и подчёркиванием](#Выделение_текста_жирным_курсивом_и_подчёркиванием)
 * [4.7 Ввод "хитрых" юникодных символов](#Ввод_хитрых_юникодных_символов)
 * [4.8 Игнор — великая вещь!](#Игнор_-_великая_вещь)
 * [4.9 Подтверждения](#Подтверждения)
 * [4.10 Удалённое управление](#Удалённое_управление)
 * [4.11 Команды Ткаббера](#Команды_Ткаббера)
 * [4.12 Скрытие версий клиента и ОС](#Скрытие_версий_клиента_и_ОС)
 * [4.13 Как подключить плагин?](#Как_подключить_плагин)
 * [4.14 Как уменьшить трафик?](#Как_уменьшить_трафик)
* [5 Miscellaneous](#Miscellaneous)
 * [5.1 Что случилось с сайтом [http://sgolovan.nes.ru/](http://sgolovan.nes.ru/) ?](#Что_случилось_с_сайтом_http__sgolovan.nes.ru_http__sgolovan.nes.ru__)
 * [5.2 ...а мне ИГРАТЬ охота!!!](#...а_мне_ИГРАТЬ_охота)
 * [5.3 Старые версии Ткаббера и плагинов](#Старые_версии_Ткаббера_и_плагинов)
* [6 Questions related with XMPP](#Questions_related_with_XMPP)
 * [6.1 MUC](#MUC)
  * [6.1.1 Не работают инвайты](#Не_работают_инвайты)

# <a id="What_is..."></a>What is...?
## <a id="Roster"></a>Roster

Answer: Roster is a list of contacts. See [definitions](http://www.google.com/search?q=define:roster&start=0&ie=utf-8&oe=utf-8) of this term found by google. 

## <a id="Resource"></a>Resource
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113

    % package present Img

Выяснить список доступных виндовых кодировок: 

    % lsearch -all -inline -glob [encoding names] cp125*

Кроме отладки консоль может служить и для многих других издевательств над Ткаббером, о некоторых из которых можно прочитать [**здесь**](../ru/Удалённое_управление_с_помощью_send.md). Естественно, пользу приносить консоль будет лишь тем, кто ею пользоваться умеет, то есть вам надо иметь в голове некоторый ликбезный минимум по [Tcl/Tk](http://www.tcl.tk). 

В юниксовых версиях интерпретатора Tcl/Tk встроенной консоли нет. Нет, соответственно, и описанного выше пункта главного меню Ткаббера. Сей "перекос" объясняется техническими и историческими причинами, изложенными [здесь](http://wiki.tcl.tk/672) (по-английски), а отладка Ткаббера в "иксах" ничуть не сложнее, чем в Windows, просто здесь следует применять другое средство — [tkcon](http://tkcon.sourceforge.net/). 

Tkcon, в отличие от большинства лекарств, допускает как "внутреннее", так и "внешнее" применение на Ткаббере: 

*  Можно запустить Ткаббер "из-под" tkcon. В этом случае последний будет доступен примерно в таком же виде, что и консоль виндового wish. Об этом методе читайте в [соответствующем разделе официальной документации](http://tkabber.jabber.ru/files/doc/tkabber.html#s.download). 
*  Можно запустить tkcon отдельно, а затем "прицепиться" из него к работающей копии Ткаббера. Для этого в tkcon активируйте пункт меню **Console → Attach to... → Interpreter**, и в появившемся подменю, озаглавленном "Foreign Interpreters", выберите "tkabber". (Также там могут быть "tkabber \#2", "tkabber \#3" и т.д. — это, соответственно, вторая, третья и прочие запущенные копии Ткаббера.) 

**Внимание:** виндовая "консоль Ткаббера" имеет один подводный камень: активация пункта её главного меню **File → Выход** вызывает завершение управляемого консолью интерпретатора (то есть самого Ткаббера). Поэтому закрывайте консоль либо "крестиком", либо повторно активировав соответствующий пункт главного меню Ткаббера. Также, если вам приспичило учинить "хАкЕрСк0е" завершение работы Ткаббера, пишите в консоли  "quit", а не "exit", чтобы работа Ткаббера завершилась корректно. 

**Примечание:** ещё одним свойством консоли виндового wish является то, что стандартные потоки ввода/вывода этого процесса по умолчанию "направлены в консоль". Поэтому открыв консоль, иногда можно увидеть там предупреждения (к примеру, возникающие при загрузке пакетов Tcl/Tk.) Так же туда попадает любой отладочный вывод, если вы, скажем, установили в конфиге переменную `debug_lvls`, но не [**перенаправили стандартные потоки ввода/вывода в файл**](../ru/Нетривиальные_настройки.md) или не воспользовались плагином **debug**. 

**(TODO: написать статью про tkcon, tkinspect, send, conn, и дать ссылку на неё отсюда)** 

# <a id="Visual_Appearance_And_Sounds"></a>Visual Appearance And Sounds
## <a id="Fonts"></a>Fonts

**Question: How could I change font/font size for chat windows and menu items?** 







|










|







88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113

    % package present Img

Выяснить список доступных виндовых кодировок: 

    % lsearch -all -inline -glob [encoding names] cp125*

Кроме отладки консоль может служить и для многих других издевательств над Ткаббером, о некоторых из которых можно прочитать [здесь](Удалённое_управление_с_помощью_send.md). Естественно, пользу приносить консоль будет лишь тем, кто ею пользоваться умеет, то есть вам надо иметь в голове некоторый ликбезный минимум по [Tcl/Tk](http://www.tcl.tk). 

В юниксовых версиях интерпретатора Tcl/Tk встроенной консоли нет. Нет, соответственно, и описанного выше пункта главного меню Ткаббера. Сей "перекос" объясняется техническими и историческими причинами, изложенными [здесь](http://wiki.tcl.tk/672) (по-английски), а отладка Ткаббера в "иксах" ничуть не сложнее, чем в Windows, просто здесь следует применять другое средство — [tkcon](http://tkcon.sourceforge.net/). 

Tkcon, в отличие от большинства лекарств, допускает как "внутреннее", так и "внешнее" применение на Ткаббере: 

*  Можно запустить Ткаббер "из-под" tkcon. В этом случае последний будет доступен примерно в таком же виде, что и консоль виндового wish. Об этом методе читайте в [соответствующем разделе официальной документации](http://tkabber.jabber.ru/files/doc/tkabber.html#s.download). 
*  Можно запустить tkcon отдельно, а затем "прицепиться" из него к работающей копии Ткаббера. Для этого в tkcon активируйте пункт меню **Console → Attach to... → Interpreter**, и в появившемся подменю, озаглавленном "Foreign Interpreters", выберите "tkabber". (Также там могут быть "tkabber \#2", "tkabber \#3" и т.д. — это, соответственно, вторая, третья и прочие запущенные копии Ткаббера.) 

**Внимание:** виндовая "консоль Ткаббера" имеет один подводный камень: активация пункта её главного меню **File → Выход** вызывает завершение управляемого консолью интерпретатора (то есть самого Ткаббера). Поэтому закрывайте консоль либо "крестиком", либо повторно активировав соответствующий пункт главного меню Ткаббера. Также, если вам приспичило учинить "хАкЕрСк0е" завершение работы Ткаббера, пишите в консоли  "quit", а не "exit", чтобы работа Ткаббера завершилась корректно. 

**Примечание:** ещё одним свойством консоли виндового wish является то, что стандартные потоки ввода/вывода этого процесса по умолчанию "направлены в консоль". Поэтому открыв консоль, иногда можно увидеть там предупреждения (к примеру, возникающие при загрузке пакетов Tcl/Tk.) Так же туда попадает любой отладочный вывод, если вы, скажем, установили в конфиге переменную `debug_lvls`, но не [перенаправили стандартные потоки ввода/вывода в файл](Нетривиальные_настройки.md) или не воспользовались плагином **debug**. 

**(TODO: написать статью про tkcon, tkinspect, send, conn, и дать ссылку на неё отсюда)** 

# <a id="Visual_Appearance_And_Sounds"></a>Visual Appearance And Sounds
## <a id="Fonts"></a>Fonts

**Question: How could I change font/font size for chat windows and menu items?** 
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188

Unix-users can adapt this solution for them: copying these lines from badlop-config file **/usr/share/tkabber/examples/badlop-config.tcl** to the user's config **~/.tkabber/config.tcl** or writing their own code based on the given options. 

## <a id="Cannot_connect_up_new_smilies_sets_sound_schemes"></a>Cannot connect up new smilies sets (sound schemes)

**Question: I have edited the config putting there the path to a new smilies set (sound scheme) but they do not work after restarting Tkabber.** 

Answer: First read the [information](Emoticons_And_Avatars.md) we have about it. Then make sure the path points **exactly** to where your files are placed. For example, badlop-config contains the following path: **/usr/share/tkabber/emoticons-tkabber** (i.e., in Tkabber installing directory). When adding new packs of smilies they are usually put into the user's home directory, in **~/.tkabber/emoticons-tkabber**. So note that just adding a new pack's name to the end of the existing path will give no effect. 

By the way, since the 0.9.8 version Tkabber does not manipulate sound schemes as a whole. Each event can be assigned any separate wav-file. 

## <a id="How_to_enter_smilies_from_a_menu"></a>How to enter smilies "from a menu"?

**Question: I would like to have a small menu that contains all available smilies so that I could choose one by a simple click.** 

Answer: The **Alt-E** hotkey will do this perfectly. By the way, this (and many more) hotkey can be found in the **Help → Quick help** menu of Tkabber. 

Notice: There are at least three arguments against this approach: 

*  after some practice one can type smilies much more rapidly than it takes to look for them in the menu; 
*  note that there are very few "standard" (known to everybody) smilies, and since many people use different smilie sets, often your cool smilie will be seen by your chat pals someway like **:BEER:** — it is understandable but not very cool, isn't it? ;) 
*  many people disabple smilies at all; think about it bearing in mind the previous advice. 

## <a id="Can_I_disable_smilies"></a>Can I **disable** smilies?

**Question: Subj. I don't want any smilies, even default ones.** 

Answer: It's easy. Read [this](Emoticons_And_Avatars.md). 

## <a id="Cant_see_smilies_photos_etc_in_PNG_format"></a>Can't see smilies/photos/etc in PNG format

**Question: My linux version of Tkabber can't display photos in vcard if they aren't in GIF format.** 

Answer: Install [tkImg](http://sourceforge.net/projects/tkimg/). 

## <a id="Color_Schemes"></a>Color Schemes

**Question: I don't like default color scheme. What can I do?** 

Answer: First try existing schemes, you can find them in examples. Read [this](Configuration_file.md) about how to enable them. If you do not like any of them try to create your own scheme. Open one of these .xrdb files in your favourite text editor, save it with a new name and make changes until the result pleases you :) Add the path to this file to your **config.tcl**, and after starting Tkabber you will see what and where is changed. Yes, it is very difficult to "paint" without a WISIWIG editor but at least you can use [Photoshop](http://www.adobe.com/products/photoshop/) or [The Gimp](http://gimp.org/) to choose colors and get their hex-values ;) If you are a tcl programmer you can write a plugin that allows to create new color schemes easily, and everybody will thank you! 

## <a id="Поддерживает_ли_Ткаббер_аватары"></a>Поддерживает ли Ткаббер аватары?

**Вопрос: Вот JAJC с аватарами работает превосходно — и подключает, и показывает собеседникам в систрее. Ткаббер так умеет?** 

Ответ: Систрей для Ткаббера — ахиллесова пята :) Но аватары он поддерживает. Читайте об этом в [**отдельной статье**](../ru/Смайлики_и_аватары.md). 

Альтернативное и готовое решение _под Windows_ — скачать старпак ткаббера 0.9.9, собранный Архимедом. Процитируем автора: 

    В окно chat добавлен показ аватара собеседника (hack from badlop).
    По умолчанию эта возможность выключена (по настоянию kostix и teo).
    Включается через настройки в разделе Chat.








|



















|











|





|







136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188

Unix-users can adapt this solution for them: copying these lines from badlop-config file **/usr/share/tkabber/examples/badlop-config.tcl** to the user's config **~/.tkabber/config.tcl** or writing their own code based on the given options. 

## <a id="Cannot_connect_up_new_smilies_sets_sound_schemes"></a>Cannot connect up new smilies sets (sound schemes)

**Question: I have edited the config putting there the path to a new smilies set (sound scheme) but they do not work after restarting Tkabber.** 

Answer: First read the [information](Emoteicons_And_Avatars_(en).md) we have about it. Then make sure the path points **exactly** to where your files are placed. For example, badlop-config contains the following path: **/usr/share/tkabber/emoticons-tkabber** (i.e., in Tkabber installing directory). When adding new packs of smilies they are usually put into the user's home directory, in **~/.tkabber/emoticons-tkabber**. So note that just adding a new pack's name to the end of the existing path will give no effect. 

By the way, since the 0.9.8 version Tkabber does not manipulate sound schemes as a whole. Each event can be assigned any separate wav-file. 

## <a id="How_to_enter_smilies_from_a_menu"></a>How to enter smilies "from a menu"?

**Question: I would like to have a small menu that contains all available smilies so that I could choose one by a simple click.** 

Answer: The **Alt-E** hotkey will do this perfectly. By the way, this (and many more) hotkey can be found in the **Help → Quick help** menu of Tkabber. 

Notice: There are at least three arguments against this approach: 

*  after some practice one can type smilies much more rapidly than it takes to look for them in the menu; 
*  note that there are very few "standard" (known to everybody) smilies, and since many people use different smilie sets, often your cool smilie will be seen by your chat pals someway like **:BEER:** — it is understandable but not very cool, isn't it? ;) 
*  many people disabple smilies at all; think about it bearing in mind the previous advice. 

## <a id="Can_I_disable_smilies"></a>Can I **disable** smilies?

**Question: Subj. I don't want any smilies, even default ones.** 

Answer: It's easy. Read [this](Emoteicons_And_Avatars_(en).md). 

## <a id="Cant_see_smilies_photos_etc_in_PNG_format"></a>Can't see smilies/photos/etc in PNG format

**Question: My linux version of Tkabber can't display photos in vcard if they aren't in GIF format.** 

Answer: Install [tkImg](http://sourceforge.net/projects/tkimg/). 

## <a id="Color_Schemes"></a>Color Schemes

**Question: I don't like default color scheme. What can I do?** 

Answer: First try existing schemes, you can find them in examples. Read [this](Configuration_file_(en).md) about how to enable them. If you do not like any of them try to create your own scheme. Open one of these .xrdb files in your favourite text editor, save it with a new name and make changes until the result pleases you :) Add the path to this file to your **config.tcl**, and after starting Tkabber you will see what and where is changed. Yes, it is very difficult to "paint" without a WISIWIG editor but at least you can use [Photoshop](http://www.adobe.com/products/photoshop/) or [The Gimp](http://gimp.org/) to choose colors and get their hex-values ;) If you are a tcl programmer you can write a plugin that allows to create new color schemes easily, and everybody will thank you! 

## <a id="Поддерживает_ли_Ткаббер_аватары"></a>Поддерживает ли Ткаббер аватары?

**Вопрос: Вот JAJC с аватарами работает превосходно — и подключает, и показывает собеседникам в систрее. Ткаббер так умеет?** 

Ответ: Систрей для Ткаббера — ахиллесова пята :) Но аватары он поддерживает. Читайте об этом в [отдельной статье](Смайлики_и_аватары.md). 

Альтернативное и готовое решение _под Windows_ — скачать старпак ткаббера 0.9.9, собранный Архимедом. Процитируем автора: 

    В окно chat добавлен показ аватара собеседника (hack from badlop).
    По умолчанию эта возможность выключена (по настоянию kostix и teo).
    Включается через настройки в разделе Chat.

196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225

Ответ: Судя по всему, вы работаете в Linux, а версия Ткаббера у вас — 0.9.7, потому что в версии 0.9.8 уже можно выбрать для каждого события любой звук. Возможно, проблема в том, что программа esdplay, которая установлена по умолчанию, не может проиграть некоторые wav-файлы из схемы Psi, потому что у них частота дискретизации слишком низка — 5000 Hz. Попробуйте прописать другую программу или в звуковом редакторе вроде Audacity отредактируйте файлы, поменяв частоту дискретизации на 11000 Hz. Не забудьте, что если вы указываете в настройках звука просто имя звуковой схемы, то файлы, которые вам нужно редактировать, лежат в **/usr/share/tkabber/sounds/psi**. 

## <a id="Регулировка_громкости_звука"></a>Регулировка громкости звука

**Вопрос: Можно ли в Ткаббере регулировать громкость звука?** 

Ответ: Да, и даже несколькими способами. Почитайте подробно в [**этой статье**](../ru/Проблемы_со_звуком.md). 

# <a id="Problems_Arising_During_Work"></a>Problems Arising During Work
This section will help you in solving non-standard behaviour of Tkabber in standard situations. 

## <a id="Долгая_загрузка_Ткаббера"></a>Долгая загрузка Ткаббера

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

Ответ: Посмотрите внимательно, что при этом показывает прогресс-бар сплэш-скрина. Если на нём застыли слова "пользовательский интерфейс", то возможно, дело вот в чём. Если у вас включено кэширование новостей, а самих новостных фидов в ростере — вагон и маленькая тележка, то через некоторое время общее число сообщений может с лёгкостью перевалить за несколько сотен. Естественно, чтобы все их подгрузить из файла, требуется время. Решений несколько: 1) отключить кэширование, тогда при закрытии программы новости, которые вы не успели прочитать, пропадут; 2) избавиться от лишних очень активных фидов или хотя бы просматривать и удалять вручную большие списки новостей перед закрытием программы; 3) смириться с долгой загрузкой или перегружаться как можно реже; 4) проапгрейдить компьютер; 5) оптимизировать код. Выбирать вам :) 

## <a id="Пересылка_файлов"></a>Пересылка файлов

**Вопрос: Так работает в Ткаббере пересылка файлов или нет? Мы с другом пробовали сто раз через все доступные протоколы, и ничего не шлётся.** 

Ответ: Для начала почитайте [**введение**](../ru/Пересылка_файлов__теория.md), также в сжатой форме это объяснено в официальной документации Ткаббера (разделы 4.2.12. The Stream Initiation Module и 4.2.13. The Jidlink Module): 

*  Windows: **C:\\Program Files\\Tkabber\\tkabber\\doc\\tkabber.html** 
*  \*nix: **/usr/share/doc/tkabber/tkabber.html** 

Практическая же реализация (для большинства, но _не всех_ случаев) такова. 

Зайдите в **Настройки → File Transfer** и затем по очереди в **Jidlink** и **SI**. В Jidlink включите опцию 







|














|







196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225

Ответ: Судя по всему, вы работаете в Linux, а версия Ткаббера у вас — 0.9.7, потому что в версии 0.9.8 уже можно выбрать для каждого события любой звук. Возможно, проблема в том, что программа esdplay, которая установлена по умолчанию, не может проиграть некоторые wav-файлы из схемы Psi, потому что у них частота дискретизации слишком низка — 5000 Hz. Попробуйте прописать другую программу или в звуковом редакторе вроде Audacity отредактируйте файлы, поменяв частоту дискретизации на 11000 Hz. Не забудьте, что если вы указываете в настройках звука просто имя звуковой схемы, то файлы, которые вам нужно редактировать, лежат в **/usr/share/tkabber/sounds/psi**. 

## <a id="Регулировка_громкости_звука"></a>Регулировка громкости звука

**Вопрос: Можно ли в Ткаббере регулировать громкость звука?** 

Ответ: Да, и даже несколькими способами. Почитайте подробно в [этой статье](Проблемы_со_звуком.md). 

# <a id="Problems_Arising_During_Work"></a>Problems Arising During Work
This section will help you in solving non-standard behaviour of Tkabber in standard situations. 

## <a id="Долгая_загрузка_Ткаббера"></a>Долгая загрузка Ткаббера

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

Ответ: Посмотрите внимательно, что при этом показывает прогресс-бар сплэш-скрина. Если на нём застыли слова "пользовательский интерфейс", то возможно, дело вот в чём. Если у вас включено кэширование новостей, а самих новостных фидов в ростере — вагон и маленькая тележка, то через некоторое время общее число сообщений может с лёгкостью перевалить за несколько сотен. Естественно, чтобы все их подгрузить из файла, требуется время. Решений несколько: 1) отключить кэширование, тогда при закрытии программы новости, которые вы не успели прочитать, пропадут; 2) избавиться от лишних очень активных фидов или хотя бы просматривать и удалять вручную большие списки новостей перед закрытием программы; 3) смириться с долгой загрузкой или перегружаться как можно реже; 4) проапгрейдить компьютер; 5) оптимизировать код. Выбирать вам :) 

## <a id="Пересылка_файлов"></a>Пересылка файлов

**Вопрос: Так работает в Ткаббере пересылка файлов или нет? Мы с другом пробовали сто раз через все доступные протоколы, и ничего не шлётся.** 

Ответ: Для начала почитайте **[введение](Пересылка_файлов__теория_(ru).md),** также в сжатой форме это объяснено в официальной документации Ткаббера (разделы 4.2.12. The Stream Initiation Module и 4.2.13. The Jidlink Module): 

*  Windows: **C:\\Program Files\\Tkabber\\tkabber\\doc\\tkabber.html** 
*  \*nix: **/usr/share/doc/tkabber/tkabber.html** 

Практическая же реализация (для большинства, но _не всех_ случаев) такова. 

Зайдите в **Настройки → File Transfer** и затем по очереди в **Jidlink** и **SI**. В Jidlink включите опцию 
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256

Не забудьте сохранить каждую изменяемую опцию для следующих сессий. Если всё равно не работает, перечитайте ещё раз теорию (ссылка в начале ответа). 

## <a id="Шифрование_в_Ткаббере_проблемы_с_gpgme_tclgpgme"></a>Шифрование в Ткаббере: проблемы с **gpgme/tclgpgme**

**Вопрос: Что-то не могу скомпилировать tclgpgme.** 

Ответ: В зависимости от того, какую версию gpgme вы используете и в какой операционной системе работаете, сильно зависит, удастся ли вам подключить шифрование в Ткаббере. Почитайте сначала коротенькую [статью об этом](../ru/Шифрование_в_Ткаббере.md). Исходя из этого ответов может быть несколько. 

1.  Под Windows шифрование работать не будет. 
1.  Под Linux — в зависимости от дистрибутива: 
 *  В Debian в стабильной ветке всё работает без излишних телодвижений (правда, что там будет в Etch'е — не ясно); 
 *  В rpm-based дистрибутивах проблема пока не исследована (даже неизвестно, есть ли она); 
 *  В source-based дистрибутивах проблема, возможно, решится благодаря следующему совету. 








|







242
243
244
245
246
247
248
249
250
251
252
253
254
255
256

Не забудьте сохранить каждую изменяемую опцию для следующих сессий. Если всё равно не работает, перечитайте ещё раз теорию (ссылка в начале ответа). 

## <a id="Шифрование_в_Ткаббере_проблемы_с_gpgme_tclgpgme"></a>Шифрование в Ткаббере: проблемы с **gpgme/tclgpgme**

**Вопрос: Что-то не могу скомпилировать tclgpgme.** 

Ответ: В зависимости от того, какую версию gpgme вы используете и в какой операционной системе работаете, сильно зависит, удастся ли вам подключить шифрование в Ткаббере. Почитайте сначала коротенькую [статью об этом](Шифрование_в_Ткаббере_(ru).md). Исходя из этого ответов может быть несколько. 

1.  Под Windows шифрование работать не будет. 
1.  Под Linux — в зависимости от дистрибутива: 
 *  В Debian в стабильной ветке всё работает без излишних телодвижений (правда, что там будет в Etch'е — не ясно); 
 *  В rpm-based дистрибутивах проблема пока не исследована (даже неизвестно, есть ли она); 
 *  В source-based дистрибутивах проблема, возможно, решится благодаря следующему совету. 

293
294
295
296
297
298
299
300
301
302
303
304
305
306
307

    X Error of failed request: BadValue (integer parameter out of range for operation)
    Major opcode of failed request: 45 (X_OpenFont)
    ...

Ответ: Причина может быть либо в "кривых" шрифтах, которые стоят у вас в системе, либо в "кривизне" сервера шрифтов, либо в "кривизне" X-сервера, который сам "раздаёт" шрифты. 

Подробнее читайте [тут](../ru/Проблемы_X_Window_и_TTF.md). 

## <a id="Не_работает_вставка_по_Control-v_под_X_Window"></a>Не работает вставка по Control-v под X Window

**Вопрос: В многострочных полях ввода не работает вставка текста из буфера обмена, помещённого туда по Control-c (и другим комбинациям).** 

Ответ: В текущих стабильных версиях Tk комбинация **\<Control-KeyPress-v>** в многострочных полях ввода (Tk-виджет "text") привязана к Emacs'овскому действию "прокрутить вниз на полстраницы". 








|







293
294
295
296
297
298
299
300
301
302
303
304
305
306
307

    X Error of failed request: BadValue (integer parameter out of range for operation)
    Major opcode of failed request: 45 (X_OpenFont)
    ...

Ответ: Причина может быть либо в "кривых" шрифтах, которые стоят у вас в системе, либо в "кривизне" сервера шрифтов, либо в "кривизне" X-сервера, который сам "раздаёт" шрифты. 

Подробнее читайте [тут](Проблемы_X_Window_и_TTF_(ru).md). 

## <a id="Не_работает_вставка_по_Control-v_под_X_Window"></a>Не работает вставка по Control-v под X Window

**Вопрос: В многострочных полях ввода не работает вставка текста из буфера обмена, помещённого туда по Control-c (и другим комбинациям).** 

Ответ: В текущих стабильных версиях Tk комбинация **\<Control-KeyPress-v>** в многострочных полях ввода (Tk-виджет "text") привязана к Emacs'овскому действию "прокрутить вниз на полстраницы". 

329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
    % puts [expr 600000*60*1000]
    1640261632
    % puts [expr 600000*120*1000]
    -1014444032

То есть, при тайм-ауте в одну минуту всё бы было хорошо, но как только мы ставим две минуты, появляется ошибка. Модуль Autoaway сравнивает текущее время неактивности со значением тайм-аута, и если тайм-аут меньше, Ткаббер переводится в режим "Отошёл". Как видите, при тайм-ауте две минуты и больше Ткаббер всегда будет считать, что мы "отошли". 

Такая проблема существует, в частности, в официальном [Ткаббер-паке](../ru/Дистрибутивы__которые_мы_выбираем.md) под Windows версии 0.9.8. 

**Решение:** Достаточно пойти в настройки плагина **AutoAway** **(Tkabber → Настройки → AutoAway)** и установить там параметры `plugins::autoaway::options(awaytime)` и `plugins::autoaway::options(xatime)` в некоторое разумное количество _минут._ 

Не забудьте сохранить _каждую_ настройку "для текущей и следующих сессий", выбрав соответствующий пункт в меню, вызываемом кнопками "Состояние". 

## <a id="В_старпаке_старките_нет_звука"></a>В старпаке/старките нет звука

**Вопрос: В старпаке (или старките) не работает звук. Его включение/выключение ни к чему не приводит. Что делать?** 

Ответ: Статья о решении этой проблемы перенесена [**сюда**](../ru/Проблемы_со_звуком.md). 

## <a id="Пропадает_содержимое_ростера"></a>Пропадает содержимое ростера

**Вопрос: Если отключить показ в ростере транспортных иконок `show_transport_user_icons 0` и включить показ активных разговоров `::ifacetk::roster::options(chats_group) 1`, то при попытке открыть хоть один чат с каким-нибудь JID, содержимое ростера пропадает и до перезапуска Ткаббера не восстанавливается.** 

Ответ: Обновитесь с [Tkabber SVN](http://tkabber.jabber.ru/svn) — всё уже исправлено. 








|









|







329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
    % puts [expr 600000*60*1000]
    1640261632
    % puts [expr 600000*120*1000]
    -1014444032

То есть, при тайм-ауте в одну минуту всё бы было хорошо, но как только мы ставим две минуты, появляется ошибка. Модуль Autoaway сравнивает текущее время неактивности со значением тайм-аута, и если тайм-аут меньше, Ткаббер переводится в режим "Отошёл". Как видите, при тайм-ауте две минуты и больше Ткаббер всегда будет считать, что мы "отошли". 

Такая проблема существует, в частности, в официальном [Ткаббер-паке](Дистрибутивы__которые_мы_выбираем_(ru).md) под Windows версии 0.9.8. 

**Решение:** Достаточно пойти в настройки плагина **AutoAway** **(Tkabber → Настройки → AutoAway)** и установить там параметры `plugins::autoaway::options(awaytime)` и `plugins::autoaway::options(xatime)` в некоторое разумное количество _минут._ 

Не забудьте сохранить _каждую_ настройку "для текущей и следующих сессий", выбрав соответствующий пункт в меню, вызываемом кнопками "Состояние". 

## <a id="В_старпаке_старките_нет_звука"></a>В старпаке/старките нет звука

**Вопрос: В старпаке (или старките) не работает звук. Его включение/выключение ни к чему не приводит. Что делать?** 

Ответ: Статья о решении этой проблемы перенесена **[сюда](Проблемы_со_звуком_(ru).md)**. 

## <a id="Пропадает_содержимое_ростера"></a>Пропадает содержимое ростера

**Вопрос: Если отключить показ в ростере транспортных иконок `show_transport_user_icons 0` и включить показ активных разговоров `::ifacetk::roster::options(chats_group) 1`, то при попытке открыть хоть один чат с каким-нибудь JID, содержимое ростера пропадает и до перезапуска Ткаббера не восстанавливается.** 

Ответ: Обновитесь с [Tkabber SVN](http://tkabber.jabber.ru/svn) — всё уже исправлено. 

403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
Ответ: точный ответ на этот вопрос затруднён несколькими обстоятельствами: 

*  Разные люди подразумевают разные вещи под понятием "keep alive"; 
*  Многие не понимают принципов работы протокола TCP (поверх которого "ездит" XMPP (он же Jabber)) и того, как он обрабатывает "внешние" разрывы соединений. 

**(TODO: расписать подробно)** 

Пока что почитайте [вот этот трёп](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2006/08/09.html#00:43:46) между [Kostix](../ru/Участник_Kostix.md) и j-dreamer: 

**(TODO: вынести этот чатлог в отдельную страницу, облагородив, т.е. он со временем отэкспайрится и будет удалён на сервере)** 

# <a id="How_Do_I_Do..."></a>How Do I Do...?
Some non-obvious tricks will be explained here. 

## <a id="Отправка_сообщений_по_Ctrl-Enter"></a>Отправка сообщений по Ctrl-Enter

**Вопрос: Можно ли сделать так, чтобы сообщения отправлялись по нажатию Ctrl-Enter, а перевод строки происходил по нажатию Enter, как это сделано в Miranda и других мессенджерах?** 

Ответ: Можно. Вам [**сюда**](../ru/Патчи.md). 

## <a id="Можно_ли_добавить_в_ростер_самого_себя"></a>Можно ли добавить в ростер самого себя?

**Вопрос: У меня запущено два Ткаббера: один дома, другой на работе. Оба запущены от одного аккаунта, просто ресурсы разные (к примеру, **login@jabber.ru/Home** и **login@jabber.ru/Work**). Безуспешно пытаюсь добавить их в ростер, чтобы, находясь дома, видеть и отправлять сообщения самому себе на работу, и наоборот.** 

Ответ: Проблема решаема, правда, придётся пойти на небольшую хитрость. Впрочем, всё по порядку. 








|










|







403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
Ответ: точный ответ на этот вопрос затруднён несколькими обстоятельствами: 

*  Разные люди подразумевают разные вещи под понятием "keep alive"; 
*  Многие не понимают принципов работы протокола TCP (поверх которого "ездит" XMPP (он же Jabber)) и того, как он обрабатывает "внешние" разрывы соединений. 

**(TODO: расписать подробно)** 

Пока что почитайте [вот этот трёп](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2006/08/09.html#00:43:46) между [Kostix](Участник_Kostix.md) и j-dreamer: 

**(TODO: вынести этот чатлог в отдельную страницу, облагородив, т.е. он со временем отэкспайрится и будет удалён на сервере)** 

# <a id="How_Do_I_Do..."></a>How Do I Do...?
Some non-obvious tricks will be explained here. 

## <a id="Отправка_сообщений_по_Ctrl-Enter"></a>Отправка сообщений по Ctrl-Enter

**Вопрос: Можно ли сделать так, чтобы сообщения отправлялись по нажатию Ctrl-Enter, а перевод строки происходил по нажатию Enter, как это сделано в Miranda и других мессенджерах?** 

Ответ: Можно. Вам [сюда](Патчи_(ru).md). 

## <a id="Можно_ли_добавить_в_ростер_самого_себя"></a>Можно ли добавить в ростер самого себя?

**Вопрос: У меня запущено два Ткаббера: один дома, другой на работе. Оба запущены от одного аккаунта, просто ресурсы разные (к примеру, **login@jabber.ru/Home** и **login@jabber.ru/Work**). Безуспешно пытаюсь добавить их в ростер, чтобы, находясь дома, видеть и отправлять сообщения самому себе на работу, и наоборот.** 

Ответ: Проблема решаема, правда, придётся пойти на небольшую хитрость. Впрочем, всё по порядку. 

443
444
445
446
447
448
449
450
451
452
453
454
455
456
457

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

Ответ: 1) Да. 2) Нет. 

Теперь подробнее. 

1.  Сначала логинитесь как обычно, затем снова жмёте Ctrl-L ещё раз и в окне логина идёте на вкладку "Соединение" и **убираете галочку "Закрыть открытые соединения",** если она отмечена. Затем либо вводите в первой вкладке новые параметры логина, либо выбираете их, нажав кнопку "Профили". Чтобы было из чего выбирать, сначала нужно подредактировать [**раздел логина в файле конфигурации**](../ru/Файл_конфигурации.md). После логина в ростере под первым аккаунтом появится второй. Работа с двумя аккаунтами ничем не отличается от обычной, надо только помнить о таких вещах как отправка сообщений, добавление пользователей в контакты и прочие, что имеются в меню Ткаббера **Службы.** При выполнении этих действий у вас появляется окошко, где помимо прочих имеется раскладное (drop-down) меню, которое называется либо "Соединение", либо "От кого", где можно выбрать аккаунт, от имени которого вы будете эти действия совершать.  
1.  Если работа с несколькими аккаунтами протекает вполне нормально, то вот автоматически логиниться к ним всем, похоже, нельзя. Во всяком случае, на сегодняшний день это не реализовано. И не будет реализовано, пока кто-нибудь сильно не захочет и не напишет ;) 

## <a id="Как_насчёт_автозахода_на_конференции"></a>Как насчёт автозахода на конференции?

**Вопрос: Надоело каждый раз заходить в десяток комнат. Можно ли это дело автоматизировать?** 

**Ответ:** Начиная с версии 0.9.8, Ткаббер умеет хранить признак автозахода в комнату вместе с самой комнатой в списке контактов. 







|







443
444
445
446
447
448
449
450
451
452
453
454
455
456
457

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

Ответ: 1) Да. 2) Нет. 

Теперь подробнее. 

1.  Сначала логинитесь как обычно, затем снова жмёте Ctrl-L ещё раз и в окне логина идёте на вкладку "Соединение" и **убираете галочку "Закрыть открытые соединения",** если она отмечена. Затем либо вводите в первой вкладке новые параметры логина, либо выбираете их, нажав кнопку "Профили". Чтобы было из чего выбирать, сначала нужно подредактировать [раздел логина в файле конфигурации](Файл_конфигурации_(ru).md). После логина в ростере под первым аккаунтом появится второй. Работа с двумя аккаунтами ничем не отличается от обычной, надо только помнить о таких вещах как отправка сообщений, добавление пользователей в контакты и прочие, что имеются в меню Ткаббера **Службы.** При выполнении этих действий у вас появляется окошко, где помимо прочих имеется раскладное (drop-down) меню, которое называется либо "Соединение", либо "От кого", где можно выбрать аккаунт, от имени которого вы будете эти действия совершать.  
1.  Если работа с несколькими аккаунтами протекает вполне нормально, то вот автоматически логиниться к ним всем, похоже, нельзя. Во всяком случае, на сегодняшний день это не реализовано. И не будет реализовано, пока кто-нибудь сильно не захочет и не напишет ;) 

## <a id="Как_насчёт_автозахода_на_конференции"></a>Как насчёт автозахода на конференции?

**Вопрос: Надоело каждый раз заходить в десяток комнат. Можно ли это дело автоматизировать?** 

**Ответ:** Начиная с версии 0.9.8, Ткаббер умеет хранить признак автозахода в комнату вместе с самой комнатой в списке контактов. 
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489

Вполне естественно, что автозаход можно настроить и через конфиг (для версии 0.9.7 и старше это вообще единственная возможность). Как водится, всё уже сделали до нас, осталось только разыскать решение. Надеюсь, вы не обидитесь, если на этом примере я научу вас пользоваться гуглем ;) Когда ищешь что-нибудь в этом самом гугле, главное — правильно задать вопрос. В данном случае ключевые слова: **tkabber**, **autojoin**, **conference**. Первый же [результат](http://lists.jabber.ru/pipermail/tkabber/2005-March/000324.html) [поиска](http://www.google.com/search?q=tkabber+autojoin+conference&start=0&ie=utf-8&oe=utf-8) убивает нам двух зайцев, так как содержит [ссылку на частный случай](http://lists.jabber.ru/pipermail/tkabber/2003-November/000244.html). 

## <a id="Сжатие_трафика_в_Ткаббере"></a>Сжатие трафика в Ткаббере

**Вопрос: В "фичах" версии 0.9.9 написано, что в этой версии реализована поддержка сжатия трафика. Как это осуществить на практике?** 

Ответ: Для включения сжатия вам потребуется установить пакет [ztcl](https://gna.org/projects/ztcl/) (если вы работаете в Дебиане, можете установить ztcl из репозитория Сергея Голованя aka teopetuk (`[xmpp:sgolovan@nes.ru](xmpp:sgolovan@nes.ru)`): найдите ниже вопрос про репозиторий и действуйте в соответствии с инструкциями). Установив пакет, перезапустите Ткаббер. При этом в окне логина закладка **SSL** будет называться теперь **SSL & Сжатие.** Идите туда и отметьте галочку "Сжатие". Учтите, что нельзя одновременно включить и сжатие, и шифрование, поэтому мы не рекомендуем пользоваться сжатием без крайней нужды — очень дорогого трафика. Помните, что при передаче файлов сжатие будет возможно лишь при использовании inband bytestream — без разницы, в SI или в Jidlink, — так как лишь в этом случае файлы шлются через сервер. Подробнее о пересылке читайте [**тут**](../ru/Пересылка_файлов__теория.md).

**На заметку:** частично уменьшить трафик (и сильно обезопасить приватные разговоры) можно, используя шифрование с помощью gpg. Gpg при шифровании сжимает данные (конечно, в случае, если их можно сжать и zip'ом, то есть, обычный текст). Естественно, ваши собеседники тоже должны пользоваться gpg или pgp. 

## <a id="Выделение_текста_жирным_курсивом_и_подчёркиванием"></a>Выделение текста жирным, курсивом и подчёркиванием

**Вопрос: Как выделить слово или фразу одним или несколькими из этих стилей?** 

Ответ: Перечитайте статью [**Быстрый старт**](../ru/Начинающим.md) — там всё подробно расписано, и даны примеры. Ещё раз напоминаем, что _в настоящее время_ выделять фразы, содержащие пробелы, лишь двумя форматирующими символами по краям **невозможно.** То есть, выделять надо каждое слово. В будущем ситуация, возможно, изменится. Если да — свистнем ;) А до тех пор \*фраза вот такого типа\* будет выводиться в окне чата "as is". Кроме того, стартовый и стоповый символы выделения должны граничить с пробельными символами (пробел, таб, перевод строки) слева и справа, соответственно. То есть, к примеру: 

    watch *this*! → watch *this*! (ошибка: "!" сразу после "*")
    now *watch* this! → now **watch** this!
    
    (*фиг* вам!) → (*фиг* вам!) (ошибка: "(" перед "*")
    (а вот *фиг* вам!) → (а вот **фиг** вам!)








|







|







467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489

Вполне естественно, что автозаход можно настроить и через конфиг (для версии 0.9.7 и старше это вообще единственная возможность). Как водится, всё уже сделали до нас, осталось только разыскать решение. Надеюсь, вы не обидитесь, если на этом примере я научу вас пользоваться гуглем ;) Когда ищешь что-нибудь в этом самом гугле, главное — правильно задать вопрос. В данном случае ключевые слова: **tkabber**, **autojoin**, **conference**. Первый же [результат](http://lists.jabber.ru/pipermail/tkabber/2005-March/000324.html) [поиска](http://www.google.com/search?q=tkabber+autojoin+conference&start=0&ie=utf-8&oe=utf-8) убивает нам двух зайцев, так как содержит [ссылку на частный случай](http://lists.jabber.ru/pipermail/tkabber/2003-November/000244.html). 

## <a id="Сжатие_трафика_в_Ткаббере"></a>Сжатие трафика в Ткаббере

**Вопрос: В "фичах" версии 0.9.9 написано, что в этой версии реализована поддержка сжатия трафика. Как это осуществить на практике?** 

Ответ: Для включения сжатия вам потребуется установить пакет [ztcl](https://gna.org/projects/ztcl/) (если вы работаете в Дебиане, можете установить ztcl из репозитория Сергея Голованя aka teopetuk (`[xmpp:sgolovan@nes.ru](xmpp:sgolovan@nes.ru)`): найдите ниже вопрос про репозиторий и действуйте в соответствии с инструкциями). Установив пакет, перезапустите Ткаббер. При этом в окне логина закладка **SSL** будет называться теперь **SSL & Сжатие.** Идите туда и отметьте галочку "Сжатие". Учтите, что нельзя одновременно включить и сжатие, и шифрование, поэтому мы не рекомендуем пользоваться сжатием без крайней нужды — очень дорогого трафика. Помните, что при передаче файлов сжатие будет возможно лишь при использовании inband bytestream — без разницы, в SI или в Jidlink, — так как лишь в этом случае файлы шлются через сервер. Подробнее о пересылке читайте **[тут](Пересылка_файлов__теория_(ru).md).** 

**На заметку:** частично уменьшить трафик (и сильно обезопасить приватные разговоры) можно, используя шифрование с помощью gpg. Gpg при шифровании сжимает данные (конечно, в случае, если их можно сжать и zip'ом, то есть, обычный текст). Естественно, ваши собеседники тоже должны пользоваться gpg или pgp. 

## <a id="Выделение_текста_жирным_курсивом_и_подчёркиванием"></a>Выделение текста жирным, курсивом и подчёркиванием

**Вопрос: Как выделить слово или фразу одним или несколькими из этих стилей?** 

Ответ: Перечитайте статью **[Быстрый старт](Начинающим_(ru).md)** — там всё подробно расписано, и даны примеры. Ещё раз напоминаем, что _в настоящее время_ выделять фразы, содержащие пробелы, лишь двумя форматирующими символами по краям **невозможно.** То есть, выделять надо каждое слово. В будущем ситуация, возможно, изменится. Если да — свистнем ;) А до тех пор \*фраза вот такого типа\* будет выводиться в окне чата "as is". Кроме того, стартовый и стоповый символы выделения должны граничить с пробельными символами (пробел, таб, перевод строки) слева и справа, соответственно. То есть, к примеру: 

    watch *this*! → watch *this*! (ошибка: "!" сразу после "*")
    now *watch* this! → now **watch** this!
    
    (*фиг* вам!) → (*фиг* вам!) (ошибка: "(" перед "*")
    (а вот *фиг* вам!) → (а вот **фиг** вам!)

521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541

**Важное дополнение:** исследования практической стороны показали, что эффективность такого способа игнорирования очень низка. Надоеда меняет ник и тут же появляется в списке участников конференции. Вам же приходится заново вносить новый JID в список, при этом вас снова вышибет из комнаты. Игра не стоит свеч. Впрочем, если надоеде никто не скажет, что его добавили в игнор, то он может и не догадаться сменить ник. На крайний случай у комнаты есть владелец и администраторы. Вряд ли им понравится, если кто-то будет издеваться над посетителями. 

## <a id="Подтверждения"></a>Подтверждения

**Вопрос: Я тут уже несколько раз случайно закрыл "Все вкладки" вместо одной, промазав мышью, а Ткаббер даже не поинтересовался, в своём ли я уме. Не очень-то интеллектуальное поведение для такой продвинутой программы :-P** 

Ответ: Проблема решена. Скачайте соответствующий [**плагин**](../ru/Плагины.md). Заодно Ткаббер станет спрашивать у вас, в своём ли вы уме, закрывая такую продвинутую программу ;-P 

## <a id="Удалённое_управление"></a>Удалённое управление

**Вопрос: Ткаббер поддерживает удалённое управление, чтобы я, к примеру, мог с домашней машины шурудить Ткаббером, запущенным на работе?** 

Ответ: Ещё как. Курите [теорию](../ru/Удалённое_управление_с_помощью_send.md).  

Но, если после прочтения вы не прониклись мощью tcl/tk и команды send, то [версия из SVN](http://tkabber.jabber.ru/svn) поддеживает [JEP-0146 Remote Controlling Clients](http://www.jabber.org/jeps/jep-0146.html). Управление производится через диско-браузер. Откройте его, введите свой полный jid с ресурсом в поле "JID", и вы увидите пункт "Удаленное управление", а дальше как обычно. Обратите внимание, что по-умолчанию доступ к управлению разрешен только jid-ам, у которых базовая часть без ресурса совпадает с такой же частью jid-а управляемой машины. Если вам нужно больше, посмотрите настройки. 

## <a id="Команды_Ткаббера"></a>Команды Ткаббера

**Вопрос: Как можно по-быстрому глянуть версию клиента и OS собеседника? Вообще, какими командами располагает Ткаббер и как ими пользоваться?** 








|





|







521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541

**Важное дополнение:** исследования практической стороны показали, что эффективность такого способа игнорирования очень низка. Надоеда меняет ник и тут же появляется в списке участников конференции. Вам же приходится заново вносить новый JID в список, при этом вас снова вышибет из комнаты. Игра не стоит свеч. Впрочем, если надоеде никто не скажет, что его добавили в игнор, то он может и не догадаться сменить ник. На крайний случай у комнаты есть владелец и администраторы. Вряд ли им понравится, если кто-то будет издеваться над посетителями. 

## <a id="Подтверждения"></a>Подтверждения

**Вопрос: Я тут уже несколько раз случайно закрыл "Все вкладки" вместо одной, промазав мышью, а Ткаббер даже не поинтересовался, в своём ли я уме. Не очень-то интеллектуальное поведение для такой продвинутой программы :-P** 

Ответ: Проблема решена. Скачайте соответствующий [плагин](Плагины_(ru).md). Заодно Ткаббер станет спрашивать у вас, в своём ли вы уме, закрывая такую продвинутую программу ;-P 

## <a id="Удалённое_управление"></a>Удалённое управление

**Вопрос: Ткаббер поддерживает удалённое управление, чтобы я, к примеру, мог с домашней машины шурудить Ткаббером, запущенным на работе?** 

Ответ: Ещё как. Курите [теорию](Удалённое_управление_с_помощью_send.md).  

Но, если после прочтения вы не прониклись мощью tcl/tk и команды send, то [версия из SVN](http://tkabber.jabber.ru/svn) поддеживает [JEP-0146 Remote Controlling Clients](http://www.jabber.org/jeps/jep-0146.html). Управление производится через диско-браузер. Откройте его, введите свой полный jid с ресурсом в поле "JID", и вы увидите пункт "Удаленное управление", а дальше как обычно. Обратите внимание, что по-умолчанию доступ к управлению разрешен только jid-ам, у которых базовая часть без ресурса совпадает с такой же частью jid-а управляемой машины. Если вам нужно больше, посмотрите настройки. 

## <a id="Команды_Ткаббера"></a>Команды Ткаббера

**Вопрос: Как можно по-быстрому глянуть версию клиента и OS собеседника? Вообще, какими командами располагает Ткаббер и как ими пользоваться?** 

556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
 
*  Чтобы вообще никто ничего никогда о вас не узнал, **закройте Ткаббер, выдерните сетевой кабель и выключите компьютер.** Прямо сейчас. Пока этого не сделали МЫ! ;) 

## <a id="Как_подключить_плагин"></a>Как подключить плагин?

**Вопрос: как подключить плагин к ткабберу?** 

Ответ: прочитайте первые два раздела [**здесь**](../ru/Плагины.md). 

## <a id="Как_уменьшить_трафик"></a>Как уменьшить трафик?

**Вопрос: как уменьшить передаваемый/принимаемый Ткаббером трафик (у меня дорогой интернет)?** 

Ответ: прочитайте [**Low traffic HOWTO**](../ru/Low_traffic_HOWTO.md). 

# <a id="Miscellaneous"></a>Miscellaneous
## <a id="Что_случилось_с_сайтом_http__sgolovan.nes.ru__"></a>Что случилось с сайтом [http://sgolovan.nes.ru/](http://sgolovan.nes.ru/) ?

**Хочу установить кое-какие пакеты, которые имеются только в его репозитории, но вот уже который день он "в дауне" :( Да и статья там была хорошая про Ткаббер и Windows.** 

Ответ: **5 августа 2006 года. Тео вернулся, сайт работает.** 

На данный момент (конец июля — начало августа 2006 года) сайт закрыт в связи с реконструкцией. Когда он заработает снова, мы пока не знаем (а как узнаем, сообщим), однако можем сказать, что существует зеркало репозитория: 

    [http://sgolovan.jabber.ru/debian/](http://sgolovan.jabber.ru/debian/)

Вписывать в **/etc/apt/sources.list** так: 

    # Sarge:
    deb     http://sgolovan.jabber.ru/debian/ sarge main
    deb-src http://sgolovan.jabber.ru/debian/ sarge main
    
    # Woody (old-stable, скорее всего вам не нужен):
    deb     http://sgolovan.jabber.ru/debian/ woody main
    deb-src http://sgolovan.jabber.ru/debian/ woody main

По поводу статей — придётся вам подождать, пока сайт не возобновит работу. На зеркале имеется только репозиторий. Самая Главная Статья, впрочем, доступна на этой вики: [**Tkabber Windows Mini HOWTO**](../ru/Tkabber_Windows_Mini_HOWTO.md) 

## <a id="...а_мне_ИГРАТЬ_охота"></a>...а мне ИГРАТЬ охота!!!

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

Ответ: Ещё как можно. Для начала вам надо установить игровые [**плагины**](../ru/Плагины.md). А если не с кем играть, добро пожаловать в `[xmpp:tkabber-games@conference.jabber.ru](xmpp:tkabber-games@conference.jabber.ru)` — чем больше народу будет там тусоваться, тем больше шансов найти себе соперника по силам. 

Владелец комнаты `[xmpp:agnessa@jabber.ru](xmpp:agnessa@jabber.ru)`, по всем вопросам касательно этой комнаты обращайтесь к ней. 

## <a id="Старые_версии_Ткаббера_и_плагинов"></a>Старые версии Ткаббера и плагинов

**Вопрос: Где я могу скачать сабж?** 








|





|


|



















|





|







556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
 
*  Чтобы вообще никто ничего никогда о вас не узнал, **закройте Ткаббер, выдерните сетевой кабель и выключите компьютер.** Прямо сейчас. Пока этого не сделали МЫ! ;) 

## <a id="Как_подключить_плагин"></a>Как подключить плагин?

**Вопрос: как подключить плагин к ткабберу?** 

Ответ: прочитайте первые два раздела [здесь](Плагины.md). 

## <a id="Как_уменьшить_трафик"></a>Как уменьшить трафик?

**Вопрос: как уменьшить передаваемый/принимаемый Ткаббером трафик (у меня дорогой интернет)?** 

Ответ: прочитайте [Low traffic HOWTO](Low_traffic_HOWTO.md). 

# <a id="Miscellaneous"></a>Miscellaneous
## <a id="Что_случилось_с_сайтом_http__sgolovan.nes.ru_http__sgolovan.nes.ru__"></a>Что случилось с сайтом [http://sgolovan.nes.ru/](http://sgolovan.nes.ru/) ?

**Хочу установить кое-какие пакеты, которые имеются только в его репозитории, но вот уже который день он "в дауне" :( Да и статья там была хорошая про Ткаббер и Windows.** 

Ответ: **5 августа 2006 года. Тео вернулся, сайт работает.** 

На данный момент (конец июля — начало августа 2006 года) сайт закрыт в связи с реконструкцией. Когда он заработает снова, мы пока не знаем (а как узнаем, сообщим), однако можем сказать, что существует зеркало репозитория: 

    [http://sgolovan.jabber.ru/debian/](http://sgolovan.jabber.ru/debian/)

Вписывать в **/etc/apt/sources.list** так: 

    # Sarge:
    deb     http://sgolovan.jabber.ru/debian/ sarge main
    deb-src http://sgolovan.jabber.ru/debian/ sarge main
    
    # Woody (old-stable, скорее всего вам не нужен):
    deb     http://sgolovan.jabber.ru/debian/ woody main
    deb-src http://sgolovan.jabber.ru/debian/ woody main

По поводу статей — придётся вам подождать, пока сайт не возобновит работу. На зеркале имеется только репозиторий. Самая Главная Статья, впрочем, доступна на этой вики: [Tkabber Windows Mini HOWTO](Tkabber_Windows_Mini_HOWTO.md) 

## <a id="...а_мне_ИГРАТЬ_охота"></a>...а мне ИГРАТЬ охота!!!

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

Ответ: Ещё как можно. Для начала вам надо установить игровые **[плагины](Плагины.md).** А если не с кем играть, добро пожаловать в `[xmpp:tkabber-games@conference.jabber.ru](xmpp:tkabber-games@conference.jabber.ru)` — чем больше народу будет там тусоваться, тем больше шансов найти себе соперника по силам. 

Владелец комнаты `[xmpp:agnessa@jabber.ru](xmpp:agnessa@jabber.ru)`, по всем вопросам касательно этой комнаты обращайтесь к ней. 

## <a id="Старые_версии_Ткаббера_и_плагинов"></a>Старые версии Ткаббера и плагинов

**Вопрос: Где я могу скачать сабж?** 

Changes to wiki/en/Tkabber_FAQ/Appearance_and_sound.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[//]: # (Generated from ../selected/en.tkabber.jabe.ru/index.php/Tkabber_FAQ/Appearance_and_sound/index.html)


# Tkabber FAQ/Appearance and sound

From Tkabber Wiki

[Tkabber FAQ](../Tkabber_FAQ.md) was divided into several parts. This article is about Tkabber's appearance (fonts, color themes, icons, avatars) and its work with sound. There are links to other Tkabber FAQ pages at the bottom. 

## <a id="toc"></a>Contents

* [1 Appearance and sound](#Appearance_and_sound)
   * [1.1 Why is Tkabber so ugly?](#Why_is_Tkabber_so_ugly)
   * [1.2 Fonts](#Fonts)
   * [1.3 Smilies: 1) using a menu; 2) cannot connect a set; 3) don't want any; 4) animated](#Smilies_1_using_a_menu_2_cannot_connect_a_set_3_dont_want_any_4_animated)
   * [1.4 Can't see smilies/photos/etc in PNG/JPEG format](#Cant_see_smilies_photos_etc_in_PNG_JPEG_format)
   * [1.5 Color Schemes](#Color_Schemes)
   * [1.6 Message colours of ICQ/MSN/etc-users](#Message_colours_of_ICQ_MSN_etc-users)
   * [1.7 Does Tkabber support avatars?](#Does_Tkabber_support_avatars)
   * [1.8 Adjusting sound volume](#Adjusting_sound_volume)
   * [1.9 Starpack/starkit doesn't support sound/JPEG,PNG](#Starpack_starkit_doesnt_support_sound_JPEGPNG)
* [2 Glitches arising during work](#Glitches_arising_during_work)
* [3 How can I...?](#How_can_I...)
* [4 Miscellanea](#Miscellanea)

# <a id="Appearance_and_sound"></a>Appearance and sound
## <a id="Why_is_Tkabber_so_ugly"></a>Why is Tkabber so ugly?













|
|
|
|
|
|
|
|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[//]: # (Generated from ../selected/en.tkabber.jabe.ru/index.php/Tkabber_FAQ/Appearance_and_sound/index.html)


# Tkabber FAQ/Appearance and sound

From Tkabber Wiki

[Tkabber FAQ](../Tkabber_FAQ.md) was divided into several parts. This article is about Tkabber's appearance (fonts, color themes, icons, avatars) and its work with sound. There are links to other Tkabber FAQ pages at the bottom. 

## <a id="toc"></a>Contents

* [1 Appearance and sound](#Appearance_and_sound)
 * [1.1 Why is Tkabber so ugly?](#Why_is_Tkabber_so_ugly)
 * [1.2 Fonts](#Fonts)
 * [1.3 Smilies: 1) using a menu; 2) cannot connect a set; 3) don't want any; 4) animated](#Smilies_1_using_a_menu_2_cannot_connect_a_set_3_dont_want_any_4_animated)
 * [1.4 Can't see smilies/photos/etc in PNG/JPEG format](#Cant_see_smilies_photos_etc_in_PNG_JPEG_format)
 * [1.5 Color Schemes](#Color_Schemes)
 * [1.6 Message colours of ICQ/MSN/etc-users](#Message_colours_of_ICQ_MSN_etc-users)
 * [1.7 Does Tkabber support avatars?](#Does_Tkabber_support_avatars)
 * [1.8 Adjusting sound volume](#Adjusting_sound_volume)
 * [1.9 Starpack/starkit doesn't support sound/JPEG,PNG](#Starpack_starkit_doesnt_support_sound_JPEGPNG)
* [2 Glitches arising during work](#Glitches_arising_during_work)
* [3 How can I...?](#How_can_I...)
* [4 Miscellanea](#Miscellanea)

# <a id="Appearance_and_sound"></a>Appearance and sound
## <a id="Why_is_Tkabber_so_ugly"></a>Why is Tkabber so ugly?

Changes to wiki/en/Tkabber_for_Developers.md.

8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[Tips and tricks in debugging Tkabber](Tips_and_tricks_in_debugging_Tkabber.md)
 [How to create your own plugin](How_to_create_your_own_plugin.md) 

## <a id="toc"></a>Contents

* [1 Working with Tkabber internals](#Working_with_Tkabber_internals)
* [2 Working with XMPP Protocol](#Working_with_XMPP_Protocol)
   * [2.1 Base](#Base)
   * [2.2 Disco](#Disco)
   * [2.3 Specific](#Specific)
* [3 Working with Tkabber GUI](#Working_with_Tkabber_GUI)

## <a id="Working_with_Tkabber_internals"></a>Working with Tkabber internals

[What is connid and how to work with it](What_is_connid_and_how_to_work_with_it.md)
 [What is chatid and how to work with it](What_is_chatid_and_how_to_work_with_it.md)
 [What are hooks and avaible hooks list](What_are_hooks_and_avaible_hooks_list.md)







|
|
|







8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[Tips and tricks in debugging Tkabber](Tips_and_tricks_in_debugging_Tkabber.md)
 [How to create your own plugin](How_to_create_your_own_plugin.md) 

## <a id="toc"></a>Contents

* [1 Working with Tkabber internals](#Working_with_Tkabber_internals)
* [2 Working with XMPP Protocol](#Working_with_XMPP_Protocol)
 * [2.1 Base](#Base)
 * [2.2 Disco](#Disco)
 * [2.3 Specific](#Specific)
* [3 Working with Tkabber GUI](#Working_with_Tkabber_GUI)

## <a id="Working_with_Tkabber_internals"></a>Working with Tkabber internals

[What is connid and how to work with it](What_is_connid_and_how_to_work_with_it.md)
 [What is chatid and how to work with it](What_is_chatid_and_how_to_work_with_it.md)
 [What are hooks and avaible hooks list](What_are_hooks_and_avaible_hooks_list.md)

Changes to wiki/es/Especial/Todas_las_Páginas.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Especial/Todas las Páginas

De Tkabber Wiki

## Todas las Páginas

* [Especial/Referencios que Falta](../Especial/Referencios_que_Falta.md) (1 referencia)
* [Especial/Todas las Páginas](../Especial/Todas_las_Páginas.md) (**0** referencias)
* [Plugin para usar el muñeco iBuddy con Tkabber](../Plugin_para_usar_el_muñeco_iBuddy_con_Tkabber.md) (2 referencias)
* [Portada](../Portada.md) (2 referencias, 1 from other language pages)
* [Preguntas frecuentes sobre Tkabber](../Preguntas_frecuentes_sobre_Tkabber.md) (1 referencia)
* [Preguntas frecuentes sobre Tkabber/Apariencia y sonido](../Preguntas_frecuentes_sobre_Tkabber/Apariencia_y_sonido.md) (1 referencia)
* [Tkabber para desarrolladores](../Tkabber_para_desarrolladores.md) (1 referencia)







|
|






1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Especial/Todas las Páginas

De Tkabber Wiki

## Todas las Páginas

* [Especial/Referencios que Falta](../Especial/Referencios_que_Falta.md) (**0** referencias)
* [Especial/Todas las Páginas](../Especial/Todas_las_Páginas.md) (1 referencia)
* [Plugin para usar el muñeco iBuddy con Tkabber](../Plugin_para_usar_el_muñeco_iBuddy_con_Tkabber.md) (2 referencias)
* [Portada](../Portada.md) (2 referencias, 1 from other language pages)
* [Preguntas frecuentes sobre Tkabber](../Preguntas_frecuentes_sobre_Tkabber.md) (1 referencia)
* [Preguntas frecuentes sobre Tkabber/Apariencia y sonido](../Preguntas_frecuentes_sobre_Tkabber/Apariencia_y_sonido.md) (1 referencia)
* [Tkabber para desarrolladores](../Tkabber_para_desarrolladores.md) (1 referencia)

Changes to wiki/es/Plugin_para_usar_el_muñeco_iBuddy_con_Tkabber.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59


[//]: # (Generated from ../selected/es.tkabber.jabe.ru/index.php/Plugin_para_usar_el_muñeco_iBuddy_con_Tkabber/index.html)


# Plugin para usar el muñeco iBuddy con Tkabber

De Tkabber Wiki

i-buddy es un muñeco originalmente diseñado para responder a los eventos de MSN
Messenger [Página oficial de i-buddy](http://www.i-buddy.com/) Afortunadamente, podemos
utilizarlo para que reaccione a los eventos en Jabber utilizando nuestro cliente favorito, **Tkabber**.

## <a id="toc"></a>Contenido

* [1 Requisitos](#Requisitos)
* [2 El plugin](#El_plugin)
* [3 El código](#El_código)
* [4 Otros clientes de jabber con los que también puedes utilizar tu i-buddy](#Otros_clientes_de_jabber_con_los_que_también_puedes_utilizar_tu_i-buddy)

## <a id="Requisitos"></a>Requisitos

*  pybuddy

Es un demonio escrito en python para controlar el i-buddy. Debes bajarte el código
de [http://code.google.com/p/pybuddy/](http://code.google.com/p/pybuddy/) y tenerlo corriendo en tu máquina.

*  tcludp

Proporciona una forma de enviar y recibir paquetes UDP a un socket desde Tcl. Debes
tenerlo instalado. Puedes bajártelo de [http://sourceforge.net/projects/tcludp/](http://sourceforge.net/projects/tcludp/)
(en Fedora, desde la consola, sólo tuve que hacer _sudo yum install tcl-tcludp_).

## <a id="El_plugin"></a>El plugin

*  Copia el siguiente código en un fichero de texto llamado _ibuddy.tcl_ y mételo en

    /tu_directorio_de_tkabber/plugins/general/

*  Abre **Tkabber** y en el menú _Tkabber/Personalizar_ encontrarás un botón que pone _Plugins_.
   Una vez dentro, debería aparecer, entre otros, _iBuddy manager_ junto a un checkbox en blanco,
   debes marcarlo y guardar los cambios.
*  Tu i-buddy está listo para ser usado. Responderá a los eventos de tu chat moviendo las alas
   y emitiendo diversos colores.

*  Si prefieres modificar el código (eres libre de hacerlo) puedes encontrar un listado de los
   comandos que i-buddy es capaz de realizar
   en [http://code.google.com/p/pybuddy/wiki/Commands](http://code.google.com/p/pybuddy/wiki/Commands).

## <a id="El_código"></a>El código

Este plugin está disponible en el
repositorio [3rd party](https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/) de Tkabber.

Además, puedes encontrarlo en: [http://pastebin.com/4qnNxecz](http://pastebin.com/4qnNxecz).

[[Download](http://leandro.org/trash/ibuddy.tar.gz)]

## <a id="Otros_clientes_de_jabber_con_los_que_también_puedes_utilizar_tu_i-buddy"></a>Otros clientes de jabber con los que también puedes utilizar tu i-buddy

[[http://www.jabbim.com/](http://www.jabbim.com/)]







|

|
<
<

|


|
|
|

|

|

|
<

|

|
<
<

|

|



<
|
<
|
<

|
<
<

|

<
|

|

|

|

|
>
>
1
2
3
4
5
6
7
8


9
10
11
12
13
14
15
16
17
18
19
20
21

22
23
24
25


26
27
28
29
30
31
32

33

34

35
36


37
38
39

40
41
42
43
44
45
46
47
48
49
50
[//]: # (Generated from ../selected/es.tkabber.jabe.ru/index.php/Plugin_para_usar_el_muñeco_iBuddy_con_Tkabber/index.html)


# Plugin para usar el muñeco iBuddy con Tkabber

De Tkabber Wiki, la enciclopedia libre.

i-buddy es un muñeco originalmente diseñado para responder a los eventos de MSN Messenger [[Página oficial de i-buddy](http://www.i-buddy.com/)] Afortunadamente, podemos utilizarlo para que reaccione a los eventos en Jabber utilizando nuestro cliente favorito, **Tkabber** 



## <a id="toc"></a>Содержание

* [1 Requisitos](#Requisitos)
* [2 el plugin](#el_plugin)
* [3 el código](#el_código)
* [4 otros clientes de jabber con los que también puedes utilizar tu i-buddy](#otros_clientes_de_jabber_con_los_que_también_puedes_utilizar_tu_i-buddy)

## <a id="Requisitos"></a> Requisitos 

*  pybuddy 

es un demonio escrito en python para controlar el i-buddy. Debes bajarte el código de [[http://code.google.com/p/pybuddy/](http://code.google.com/p/pybuddy/)] y tenerlo corriendo en tu máquina 


*  tcludp 

proporciona una forma de enviar y recibir paquetes UDP a un socket desde Tcl. Debes tenerlo instalado. Puedes bajártelo de [[http://sourceforge.net/projects/tcludp/](http://sourceforge.net/projects/tcludp/)]  (en Fedora, desde la consola, sólo tuve que hacer _sudo yum install tcl-tcludp_ ) 



## <a id="el_plugin"></a> el plugin 

*  copia el siguiente código en un fichero de texto llamado _ibuddy.tcl_ y mételo en 

    /tu_directorio_de_tkabber/plugins/general/


*  abre **Tkabber** y en el menú _Tkabber/Personalizar_ encontrarás un botón que pone _Plugins_. Una vez dentro, debería aparecer, entre otros, _iBuddy manager_ junto a un checkbox en blanco, debes marcarlo y guardar los cambios. 

*  tu i-buddy está listo para ser usado. Responderá a los eventos de tu chat moviendo las alas y emitiendo diversos colores. 


*  si prefieres modificar el código (eres libre de hacerlo) puedes encontrar un listado de los comandos que i-buddy es capaz de realizar en [[http://code.google.com/p/pybuddy/wiki/Commands](http://code.google.com/p/pybuddy/wiki/Commands)] 



## <a id="el_código"></a> el código 


este plugin está disponible en el repositorio [3rd party](https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/) de Tkabber. 

además, puedes encontrarlo en: [[http://pastebin.com/4qnNxecz](http://pastebin.com/4qnNxecz)] 

[[Download:[download](http://leandro.org/trash/ibuddy.tar.gz)]] 

## <a id="otros_clientes_de_jabber_con_los_que_también_puedes_utilizar_tu_i-buddy"></a> otros clientes de jabber con los que también puedes utilizar tu i-buddy 

[[http://www.jabbim.com/](http://www.jabbim.com/)] 


Changes to wiki/es/Portada.md.

1
2
3
4
5
6
7
8
9
10


[//]: # (Generated from ../selected/es.tkabber.jabe.ru/index.php/Portada/index.html)


# Portada

De Tkabber Wiki

Bienvenido. En esta wiki encontrarás documentación en español sobre Tkabber.

*  [**Plugin para usar el muñeco iBuddy con Tkabber**](Plugin_para_usar_el_muñeco_iBuddy_con_Tkabber.md)







|

|

|
>
>
1
2
3
4
5
6
7
8
9
10
11
12
[//]: # (Generated from ../selected/es.tkabber.jabe.ru/index.php/Portada/index.html)


# Portada

De Tkabber Wiki, la enciclopedia libre.

Bienvenido. En esta wiki encontrarás documentación en español sobre Tkabber. 

*  [Plugin para usar el muñeco iBuddy con Tkabber](Plugin_para_usar_el_muñeco_iBuddy_con_Tkabber.md) 


Changes to wiki/es/Preguntas_frecuentes_sobre_Tkabber.md.

1
2
3
4
5
6
7
8


[//]: # (Generated from ../selected/es.tkabber.jabe.ru/index.php/Preguntas_frecuentes_sobre_Tkabber/index.html)


# Preguntas frecuentes sobre Tkabber

De Tkabber Wiki, la enciclopedia libre

(En este momento no hay texto en esta página)







|

|
>
>
1
2
3
4
5
6
7
8
9
10
[//]: # (Generated from ../selected/es.tkabber.jabe.ru/index.php/Preguntas_frecuentes_sobre_Tkabber/index.html)


# Preguntas frecuentes sobre Tkabber

De Tkabber Wiki, la enciclopedia libre.

(En este momento no hay texto en esta página) 


Changes to wiki/es/Preguntas_frecuentes_sobre_Tkabber/Apariencia_y_sonido.md.

1
2
3
4
5
6
7
8


[//]: # (Generated from ../selected/es.tkabber.jabe.ru/index.php/Preguntas_frecuentes_sobre_Tkabber/Apariencia_y_sonido/index.html)


# Preguntas frecuentes sobre Tkabber/Apariencia y sonido

De Tkabber Wiki

(En este momento no hay texto en esta página)







|

|
>
>
1
2
3
4
5
6
7
8
9
10
[//]: # (Generated from ../selected/es.tkabber.jabe.ru/index.php/Preguntas_frecuentes_sobre_Tkabber/Apariencia_y_sonido/index.html)


# Preguntas frecuentes sobre Tkabber/Apariencia y sonido

De Tkabber Wiki, la enciclopedia libre.

(En este momento no hay texto en esta página) 


Changes to wiki/es/Tkabber_para_desarrolladores.md.

1
2
3
4
5
6
7
8


[//]: # (Generated from ../selected/es.tkabber.jabe.ru/index.php/Tkabber_para_desarrolladores/index.html)


# Tkabber para desarrolladores

De Tkabber Wiki

(En este momento no hay texto en esta página)







|

|
>
>
1
2
3
4
5
6
7
8
9
10
[//]: # (Generated from ../selected/es.tkabber.jabe.ru/index.php/Tkabber_para_desarrolladores/index.html)


# Tkabber para desarrolladores

De Tkabber Wiki, la enciclopedia libre.

(En este momento no hay texto en esta página) 


Changes to wiki/ru/$__configdir.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32


[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/$::configdir/index.html)


# $::configdir

Материал из Tkabber Wiki

"Магическая переменная" **$::configdir** настолько часто цитируется на страницах нашей вики,
что заслужила свою собственную статью.

**$::configdir** — это глобальная переменная Tcl, которая устанавливается Ткаббером на
начальном этапе его загрузки и _содержит полный путь до **каталога настроек** Ткаббера._

Она появилась в версии Ткаббера 0.10.0 в связи с тем, что местоположение настроек этой
программы было сделано более "дружелюбным" к системам, не основанным на концепциях Unix.
Поскольку это сделало невозможным универсально (то есть платформо-независимо) ссылаться
на каталог настроек при помощи "стандартного заклинания" "`~/.tkabber`", была введена
сия переменная, а "стандартное заклинание" превратилось просто в

    $::configdir

Подробности о том, что хранит эта переменная на разных системах, можно узнать:

*  Технически строго — [в официальной документации](http://tkabber.jabber.ru/files/doc/tkabber.html#s.configuration);
*  Фактически просто — [**у нас**](Config.tcl_для_начинающих.md#Где).

---

Assorted bits of text:

*  Если для вас нотация **$::configdir** — "китайская грамота", идите и
   почитайте [**эту статью**](Настройка_Ткаббера__азы_и_глубже.md).
*  Завершить своё среднее образование про директорию конфигурации можно [**тут**](Config_dir.md).



>



|

|
<

|
<

|
<
<
<
<



|

|
|



|

<
|
|
>
>
1
2
3
4
5
6
7
8

9
10

11
12




13
14
15
16
17
18
19
20
21
22
23
24

25
26
27
28
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/$::configdir/index.html)


# $::configdir

Материал из Tkabber Wiki.

"Магическая переменная" **$::configdir** настолько часто цитируется на страницах нашей вики, что заслужила свою собственную статью. 


 **$::configdir** — это глобальная переменная Tcl, которая устанавливается Ткаббером на начальном этапе его загрузки и _содержит полный путь до **каталога настроек** Ткаббера._ 


Она появилась в версии Ткаббера 0.10.0 в связи с тем, что местоположение настроек этой программы было сделано более "дружелюбным" к системам, не основанным на концепциях Unix. Поскольку это сделало невозможным универсально (то есть платформо-независимо) ссылаться на каталог настроек при помощи "стандартного заклинания" "`~/.tkabber`", была введена сия переменная, а "стандартное заклинание" превратилось просто в 





    $::configdir

Подробности о том, что хранит эта переменная на разных системах, можно узнать: 

*  Технически строго — [в официальной документации](http://tkabber.jabber.ru/files/doc/tkabber.html#s.configuration); 
*  Фактически просто — [у нас](Config.tcl_для_начинающих.md#Где). 

---

Assorted bits of text: 


*  Если для вас нотация `**$::configdir**` — "китайская грамота", идите и почитайте [эту статью](Настройка_Ткаббера__азы_и_глубже.md). 
*  Завершить своё среднее образование про директорию конфигурации можно [тут](Config_dir.md). 


Changes to wiki/ru/0.10.x/Шрифты.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/0.10.x/Шрифты/index.html)


# 0.10.x/Шрифты

Материал из Tkabber Wiki

**![(!)](../../images/Warning.gif) Внимание!**

В систему управления настройками шрифтов версии 0.11.0 были внесены изменения, и данная
статья относится ко всем версиям, вышедшим до 0.11.0 (как минимум, к 0.9.7–0.10.0); если
вас интересует современная версия Ткаббера (0.11.0 и выше), читайте [**эту статью**](../Шрифты.md).

## <a id="toc"></a>Содержание

* [1 Что настраивать](#Что_настраивать)
* [2 Как настраивать](#Как_настраивать)
   * [2.1 Настройка системы](#Настройка_системы)
   * [2.2 Настройка Ткаббера](#Настройка_Ткаббера)
   * [2.3 Продвинутые спецификации шрифтов](#Продвинутые_спецификации_шрифтов)
      * [2.3.1 "Программное имя" шрифта](#Программное_имя_шрифта)
      * [2.3.2 Имя системного шрифта](#Имя_системного_шрифта)
      * [2.3.3 "Иксовый" формат](#Иксовый_формат)
      * [2.3.4 "Свободный" формат](#Свободный_формат)
      * [2.3.5 Формат "пары опция/значение"](#Формат_пары_опция_значение)
   * [2.4 Проблемы не-XLFD спецификаций в X Window](#Проблемы_не-XLFD_спецификаций_в_X_Window)
   * [2.5 Тонкая настройка шрифта интерфейса](#Тонкая_настройка_шрифта_интерфейса)
   * [2.6 Быстрый подбор шрифтов](#Быстрый_подбор_шрифтов)
      * [2.6.1 Шрифт интерфейса](#Шрифт_интерфейса)
      * [2.6.2 Шрифт окон чата и ростера](#Шрифт_окон_чата_и_ростера)
      * [2.6.3 Немножко хардкора](#Немножко_хардкора)
   * [2.7 Другие полезные средства](#Другие_полезные_средства)
* [3 Подводные камни](#Подводные_камни)
* [4 Примечания](#Примечания)
   * [4.1 Отдельная настройка шрифта ростеров](#Отдельная_настройка_шрифта_ростеров)
   * [4.2 Борьба с антиалиасингом в Xft](#Борьба_с_антиалиасингом_в_Xft)

## <a id="Что_настраивать"></a>Что настраивать
У Ткаббера можно "покрутить" настройки двух шрифтов:

*  Шрифт интерфейса (меню, всевозможные подписи, поля ввода и т.д.);
*  Шрифт окна чата и ростера.

Первый шрифт является главным, и если второй не задан явно, то шрифт интерфейса используется для отрисовки всего и везде.

Если ни один из шрифтов не задан явно, для всего используется _шрифт по умолчанию данной оконной системы_.

Это означает, что в X Window System, в которой [Tk](http://ru.wikipedia.org/wiki/Tk) "поднимает"
настройки из [**XRDB**](../XRDB.md), если таковая есть, будет взят указанный там шрифт.
Если подходящего шрифта там нет, Tk попросит сервер шрифтов выдать нечто, удовлетворяющее
формулировке "шрифт по умолчанию в такой-то кодировке". Поскольку в "иксах" достоверно
существует только шрифт "fixed", подобный запрос для случая отрисовки кириллического текста
обычно удовлетворяется первым попавшимся кириллическим шрифтом семейства "fixed"; нередко это
совершенно не то, что вы хотели бы видеть.

Непонимание этого факта порождает печально известный миф о "кривых шрифтах в Ткаббере";
так вот: в Ткаббере не бывает кривых шрифтов — бывают криво настроенные системы.

**Примечание:** приведённая выше дихотомия настроек шрифтов является сознательным упрощением,
так как [**база данных опций Tk**](../База_данных_опций_Tk.md) (и родственная ей [**XRDB**](../XRDB.md))
позволяют настраивать шрифты отдельно для разных классов виджетов и даже отдельно — для каждого
виджета, поддерживающего настройку шрифта. Тема чуть подробнее
изложена [**ниже**](#Тонкая_настройка_шрифта_интерфейса).

## <a id="Как_настраивать"></a>Как настраивать
Есть два варианта:

*  Настроить систему;
*  Настроить Ткаббер.

А также можно сначала настроить систему, а потом отдельно настроить шрифт для чата и ростера.

### <a id="Настройка_системы"></a>Настройка системы

В Microsoft® Windows™ шрифты системы можно настроить штатным конфигуратором,
который доступен в виде апплета "Экран" "Панели инструментов".

В X Window настраивать нужно [**XRDB**](../XRDB.md).

### <a id="Настройка_Ткаббера"></a>Настройка Ткаббера

Придётся отредактировать файл [**config.tcl**](../Config.tcl.md) в [**каталоге настроек**](../$__configdir.md)
Ткаббера. Если вы собираетесь делать это первый раз, _обязательно_
прочитайте [**эту статью**](../Config.tcl_для_начинающих.md)!

Настройки, интересующие нас, должны находиться либо "на верхнем уровне" файла конфигурации
(проще говоря, на чистом месте: вне каких-либо блоков) или в обработчике [**хука**](../Загрузка_настроек.md#Хуки)
**postload\_hook**.

Настроек, как говорилось, две:

##### <a id="Шрифт_интерфейса"></a>Шрифт интерфейса

Настраивается через базу данных опций Tk с использованием команды [option](http://www.tcl.tk/man/tcl8.4/TkCmd/option.htm), например:

    option add *font -monotype-arial-medium-r-*-*-11-*-100-100-*-*-iso10646-1

##### <a id="Шрифт_окон_чата_и_ростера"></a>Шрифт окон чата и ростера

Настраивается установкой глобальной переменной **font**, например:

    set font -monotype-arial-medium-r-*-*-11-*-100-100-*-*-iso10646-1

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

    # Шрифт элементов интерфейса:
    option add *font -monotype-arial-medium-r-*-*-11-*-100-100-*-*-iso10646-1
    # Шрифт окон чата и ростера:
    set font -monotype-arial-medium-r-*-*-11-*-100-100-*-*-iso10646-1

**Внимание!** Внутри обработчика хука **postload\_hook** необходимо ссылаться на глобальную
переменную **font**, используя её полностью квалифицированное имя: **::font**, либо вначале
объявить, что эта переменная глобальна, такой командой: `global font`. В противном случае
тикль создаст локальную (в пределах обработчика хука) переменную и будет изменять её.

**Интересный факт:** даже в X Window System кодировка шрифта не обязана совпадать с локалью.

**Подсказка:** в любой системе удобнее всего сначала подобрать требуемый шрифт при помощи
какого-либо специального программного средства, а затем уже указывать этот шрифт в
конфигурации Ткаббера. В X Window такой программой является, к примеру, **xfontsel**,
а в Windows можно воспользоваться средствами упомянутого апплета "Экран". Шрифты в
Ткаббере также можно подбирать [**интерактивно**](#Быстрый_подбор_шрифтов).

### <a id="Продвинутые_спецификации_шрифтов"></a>Продвинутые спецификации шрифтов

Если шрифты настраиваются в файле конфигурации Ткаббера (а не средствами системы),
для их спецификации можно использовать дополнительные возможности подсистемы Tk
для работы со шрифтами.

Строго говоря, все эти возможности подробно изложены на
соответствующей [странице руководства](http://www.tcl.tk/man/tcl8.4/TkCmd/font.htm),
однако тут мы "расшифруем" основные её положения.

Tk поддерживает пять способов указания шрифтов; приведённый в "каноническом" примере
стиль ["XLFD"](http://ftp.xfree86.org/pub/XFree86/4.5.0/doc/xlfd.txt) ("X Logical
Font Description") является одним из них, и вообще говоря, для пользователей систем,
не основанных на X Window System, он является непонятным и неудобным.

**Внимание!** прежде, чем вы ринетесь применять изложенное ниже на практике, имейте в
виду, что Tk имеет проблемы с не-XLFD спецификациями шрифтов в X Window. Подробнее об
этом написано [**ниже**](#Проблемы_не-XLFD_спецификаций_в_X_Window).

Вот эти пять способов:

#### <a id="Программное_имя_шрифта"></a>"Программное имя" шрифта

Это имя шрифта, созданного при помощи команды Tk `font create`: Это — наименее
интересный для нас способ, так как в основном предназначен для облегчения написания программ.

Пример:

    # Создаём новый шрифт:
    set myfont [font create {"Comic Sans MS" 12}]
    # Теперь переменная myfont содержит программное имя созданного шрифта.
    # Используем наш новый шрифт для настройки Ткаббера:
    set font $myfont

#### <a id="Имя_системного_шрифта"></a>Имя системного шрифта

Имеет смысл только в Windows и Macintosh. Позволяет сослаться на один из шрифтов, настроенных для использования в системе.

##### <a id="Системные_шрифты_Windows"></a>Системные шрифты Windows

system, ansi, device, systemfixed, ansifixed, oemfixed

##### <a id="Системные_шрифты_Macintosh"></a>Системные шрифты Macintosh

system, application

#### <a id="Иксовый_формат"></a>"Иксовый" формат

Это формат XLFD, представляющий собой строку вида

    -foundry-family-weight-slant-setwidth-addstyle-pixel-point-resx-resy-spacing-width-charset-encoding

Любое из полей может быть заменено символом "\*", что означает "любое значение".

---

Теперь перейдём к наиболее интересным форматам.

Следует заметить, что совокупность параметров, формирующих представление шрифта в этих форматах,
должна представлять собой "правильно сформированный список". Академическое описание этого
понятия, как ни странно, достаточно трудно для понимания; полные правила, которыми
руководствуется тикль, осуществляя группировку, можно изучить [здесь](http://wiki.tcl.tk/14940).
А в рамках данной статьи мы просто дадим пару советов, как получить такой список из набора параметров:

*  Список с точки зрения тикля должен представлять собой одно _слово._ Это значит, что _элементы_
списка нужно _сгруппировать_ друг с другом. Проще всего это сделать фигурными скобками или двойными
кавычками, например:

        # Список из трёх элементов:
        {a b c}
        # Список из четырёх элементов:
        "d ef gh ij"

*  Список состоит из _слов_, слова отделяются друг от друга пробельными символами. Это означает,
что если элементы-слова вашего списка сами содержат пробелы, их придётся сгруппировать, например:

        # Список из трёх элементов:
        {{первый элемент} второй {и третий элемент}}

Не стоит отчаиваться, если правила группировки вам не вполне понятны — ниже приводятся
готовые примеры, которые позволят вам "почувствовать", как работают эти правила.

#### <a id="Свободный_формат"></a>"Свободный" формат

Является "человекопонятным" и представляет собой _список_ из одного или более значений в указанном порядке:

    семейство ?размер? ?стиль? ?стиль ...?

(Запись **?foo?** означает "необязательный параметр класса foo".)

Обязательным является только семейство шрифта (font family).

Доступные стили:

*  Толщина начертания:
 *  **normal** — обычная;
 *  **bold** — полужирный шрифт;

*  Наклон символов:
 *  **roman** — обычное (прямое) начертание;
 *  **italic** — курсивное начертание;

*  Дополнительные стили:
 *  **underline** — подчёркнутый шрифт;
 *  **overstrike** — перечёркнутый шрифт.

Примеры:

    set font Tahoma
    set font {Arial 12}
    option add *font {{Times New Roman} 14 bold italic}

#### <a id="Формат_пары_опция_значение"></a>Формат "пары опция/значение"

Представляет собой _список_ пар опция/значение:

    опция значение ?опция значение ...?

Доступные опции и значения:

##### <a id="-family"></a>-family

Семейство шрифтов.

##### <a id="-size"></a>-size

Размер шрифта.

##### <a id="-weight"></a>-weight

Толщина начертания шрифта. Доступные значения: **bold** (полужирный) и **normal** (обычный).

##### <a id="-slant"></a>-slant

Наклон символов шрифта. Доступные значения: **italic** (курсив) и **roman** (прямой).

##### <a id="-underline"></a>-underline

Подчёркивание. Значением является значение булевого типа (**true**, **yes**, ненулевое число — истина; **false**, **no**, 0 — ложь).

##### <a id="-overstrike"></a>-overstrike

Зачёркивание. Доступные значения: истина и ложь.

В отличие от предыдущего способа, в этом:

*  Пары могут следовать в произвольном порядке;
*  Возможно не указывать семейство шрифтов и/или размер, а указать только один или несколько стилей начертания.

Примеры:

    set font "-family {Comic Sans MS} -overstrike yes"
    option add *font {-weight bold -size 12}
    set font {-underline 1}

### <a id="Проблемы_не-XLFD_спецификаций_в_X_Window"></a>Проблемы не-XLFD спецификаций в X Window

К сожалению, версия Tk для X Window имеет баг с подбором глифов к символам, не входящим
в Latin-1 (и поэтому он затрагивает русскоговорящих, а точнее, кириллически пишущих пользователей
Ткаббера).

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

Насколько нам известно, работы по переписыванию алгоритма подбора шрифтов в X Window ведутся,
но проблема всё ещё не решена.

Выходов из данной ситуации два:

*  Использовать XLFD-спецификацию для шрифтов.
*  Использовать версию 8.5 Tcl/Tk, собранную с поддержкой технологии [Xft](http://www.fontconfig.org/).

Остановимся подробнее на втором варианте.

Поддержка [Xft](http://wiki.tcl.tk/9015) появилась в Tk начиная с версии 8.5. Как для подбора,
так и для отображения шрифтов используются совершенно другие механизмы, и, в частности,
при использовании Xft полностью отсутствует обсуждаемая проблема.

Однако, надо понимать последствия перехода на Xft:

*  Подсистема Xft имеет собственные настройки, не имеющие отношения к стандартным механизмам
   X Window. В частности, вам, возможно, придётся познакомиться
   с [fontconfig](http://fontconfig.org/fontconfig-user.html).
*  Несмотря на поддержку TrueType и полную поддержку Unicode шрифтов, Xft также
   использует [антиалиасинг](http://en.wikipedia.org/wiki/Anti-aliasing), который
   нравится далеко не всем.

Узнать, поддерживает ли ваша версия **wish** Xft, можно двумя способами:

*  В Linux можно узнать, слинкован ли **wish** с соответствующей динамической библиотекой,
   примерно так:

        $ ldd `which wish` | grep -i xft

*  В любой системе можно запустить **wish** и выполнить там команду:

        tk::pkgconfig get fontsystem

Если она не "заругалась" и выдала строку "xft", — ваш Tcl/Tk поддеживает Xft.

О борьбе с антиалиазингом в Xft рассказано [**ниже**](#Борьба_с_антиалиасингом_в_Xft).

### <a id="Тонкая_настройка_шрифта_интерфейса"></a>Тонкая настройка шрифта интерфейса

Для понимания того, чего и где крутить, нужно осмыслить
работу [**базы данных опций Tk**](../База_данных_опций_Tk.md) и [**XRDB**](../XRDB.md).

Приведём пару готовых примеров:

*  Шрифт меню:

        option add *Menu.font "Arial 10"

*  Шрифт однострочных полей ввода:

        option add *Entry.font {-weight bold}

*  Шрифт меток (статического текста):

        option add *Label.font {-slant italic}

*  Шрифт табов (\<= 0.10.0):

        option add *nb.font {-size 8}

*  Шрифт "новых табов" (альфа 0.10.1):

        option add *nb.Button.font {-size 9}

...

### <a id="Быстрый_подбор_шрифтов"></a>Быстрый подбор шрифтов

Вовсе необязательно "до посинения" повторять цикл "редактирование файла конигурации +
перезапуск Ткаббера" — Ткаббер написан на тикле и поэтому позволяет управлять собой
интерактивно. Это можно использовать для быстрого — "натурного" — подбора подходящих
шрифтов чтобы затем один раз вписать правильные строчки в файл конфигурации.

Откройте [**консоль Ткаббера**](../Ткаббер_ЧаВо.md#Консоль_Ткаббера). Здесь можно
вводить те же самые команды, которые предназначены для помещения в файл конфигурации,
в точно таком же формате. Имейте также в виду, что как встроенная консоль Ткаббера,
так и **tkcon**, поддерживают историю введённых команд, доступную по нажатиям
клавиш ↑ и ↓.

Как было сказано выше, у Ткаббера есть две группы элементов интерфейса, у которых
можно настроить шрифты. Для быстрого тестирования нам нужно понять, как заставить
Ткаббер "применить" изменённый шрифт.

Это несложно:

#### <a id="Шрифт_интерфейса"></a>Шрифт интерфейса

Используется, помимо прочего, для отрисовки всевозможных меню.

Это означает, что для того, чтобы посмотреть настройку, изменённую при помощи
`option add *font ...`, нужно просто открыть какое-либо _динамически создаваемое_ меню.
Главное меню для этого не подходит, а вот меню на элементах ростера подходят замечательно.

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

1.  Запустите Ткаббер, залогиньтесь на сервер, чтобы получить ростер, откройте консоль.
1.  Напишите там

        option add *font ваша_спецификация_шрифта

1.  Откройте меню на любом контакте в ростере, рассмотрите шрифт.
1.  Повторяйте процедуру до получения удобоваримого результата.

#### <a id="Шрифт_окон_чата_и_ростера"></a>Шрифт окон чата и ростера

Для тестирования этого шрифта нам нужно открыть (или переоткрыть) какое-либо окно чата.
Лучше всего для этого подходит какая-либо специальная тестовая комната, например,
`test@conference.jabber.ru`. Также ничего не мешает вам открыть окно чата с самим собой
(или со второй копией Ткаббера).

Есть и более быстрый способ: вызов процедуры Ткаббера

    ::ifacetk::roster::redraw

перерисовывает основной ростер, применяя установленный шрифт.

Итак, для быстрого подбора шрифта для окон чата выполняйте такую последовательность действий:

1.  Запустите Ткаббер, залогиньтесь на сервер, чтобы получить доступ к чатам, откройте консоль.
1.  Напишите там

        set font ваша_спецификация_шрифта

1.  (Пере)откройте какое-либо окно чата или вызовите указанную выше процедуру, рассмотрите шрифт.
1.  Повторяйте процедуру до получения удобоваримого результата.

![(!)](../../images/Hammer.png) **Сделать:** Выяснить применимы ли тут команды `ifacetk::switch_font` и `ifacetk::define_fonts`

#### <a id="Немножко_хардкора"></a>Немножко хардкора

Вы можете узнать, что именно думает Tk по поводу шрифта, который вы установили. Для этого
используется команда `font actual`.

Используется она следующим образом:

*  Для шрифта интерфейса:

        font actual [option get . font [winfo class .]]

*  Для шрифта чатов и ростера:

        font actual $font

За подробностями обращайтесь к соответствующей [странице руководства](http://www.tcl.tk/man/tcl8.4/TkCmd/font.htm).

### <a id="Другие_полезные_средства"></a>Другие полезные средства

Интерес может представлять команда

    font families

которая возвращает список всех семейств шрифтов, доступных Ткабберу.

Её можно ввести с консоли работающего Ткаббера.

## <a id="Подводные_камни"></a>Подводные камни
Файлы с настройками Tk ("Tk option database") — те самые файлы с расширением ".xrdb",
называемые кое-кем "темами", — иногда содержат настройку шрифтов интерфейса. Подгрузка
такого файла при помощи `option readfile` "перекроет" системную настройку.

Иногда это то, что вам нужно, иногда — нет. В таком случае _после_ подгрузки xrdb-файла
нужно переписать настройку шрифта при помощи `option add` как описано выше.

## <a id="Примечания"></a>Примечания
### <a id="Отдельная_настройка_шрифта_ростеров"></a>Отдельная настройка шрифта ростеров

Существует [**"хак"**](../Нетривиальные_настройки.md#Собственный_шрифт_для_ростеров), позволяющий
отдельно настраивать шрифт ростеров.

### <a id="Борьба_с_антиалиасингом_в_Xft"></a>Борьба с антиалиасингом в Xft

Известно, что антиалиасинг был "введён в оборот" для борьбы с дешёвыми китайскими TFT-мониторами
и нравится [далеко не всем](http://www.joelonsoftware.com/articles/fog0000000041.html). Те, кто
обладает качественным монитором и нормальным набором шрифтов под его рабочий DPI, вероятно,
захотят антиалиасинг отключить.

Это делается при помощи настройки [fontconfig](http://www.fontconfig.org/). Настраивать
эту подсистему можно как на уровне _параметров_ отдельных шрифтов (то есть, к примеру,
можно отключить антиалиасинг для определённых семейств шрифтов, если используется размер
символов менее определённого порога, и т.д.), так и глобально — для всех шрифтов с любыми параметрами.

Потребуется отредактировать либо **~/.fonts.conf** — файл настроек конкретного пользователя,
либо **/etc/fonts/fonts.conf** — системный файл настроек.

Полное отключение антиалиасинга делается так:

    <?xml version="1.0"?>
    <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
    <fontconfig>
      <match target="font" >
        <edit mode="assign" name="antialias">
          <bool>false</bool>
        </edit>
      </match>
    </fontconfig>

В качестве примера конфигурирования избирательного отключения антиалиасинга приведём настройку
его подавления для шрифтов с размером символов от 8 до 15 пунктов (points)
(позаимствовано [отсюда](http://www.wlug.org.nz/AntiAliasedFonts)):

    <?xml version="1.0"?>
    <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
    <fontconfig>
      <match target="font" >
        <test compare="more" name="size" qual="any">
          <double>8</double>

>



|

|
|
|
<
<





|
|
|
|
|
|
|
|
|
|
|
|
|
|
|


|
|

|
|

|
|

|

|

|
<
<
<
<
<
<

|
<

|
<
<
<
<

|
|

|
|

|

|

|
<

|

|

|
<
<

|
<
<

|

|

|
<


|

|
<


|

|
|
|


|
<
<
<

|

|
<
<
<
<

|

|
<
<

|
<
<

|
<
<
<

|
<
<

|

|

|
<

|







|

|

|

|

|

|

|

|



|



|

|
<
<
<
<

|
<
<

|
|
|
|

|
<

|
|

|
<

|

|



|

|

|

|
|
|
|
|
|
|
|
|
|
|

|





|

|



|

|

|

|

|

|

|

|

|

|

|

|

|

|

|
|

|





|

|
<
<

|
<
<
<

|
<

|

|
|

|

|
<
<

|

|
<
<
|
<
<

|

|
<
<
|
|
|
<
|
<
|

|

|

|
<

|

|
<
|
|
|
<
|
|
|
<
|
|
|
<
|
|
|
<
|

|

|

|
<
<
<

<
|
<
<
<

|
<
<

|

|

|

|
<
<

|
<

|
|
<
|
|
|
|

|

|
<
<
<

|



|

|

|
|
<
|
|
|
|

|

|

|
<

|

|
<
|
|
|
<
|

|

|

|



|

|

|
|
<
<

|
<

|
|

|
<

|

|
<
<
<

|
<
<
<

|
<

|











|
<
<







1
2
3
4
5
6
7
8
9
10


11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46






47
48

49
50




51
52
53
54
55
56
57
58
59
60
61
62

63
64
65
66
67
68


69
70


71
72
73
74
75
76

77
78
79
80
81

82
83
84
85
86
87
88
89
90
91



92
93
94
95




96
97
98
99


100
101


102
103



104
105


106
107
108
109
110
111

112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145




146
147


148
149
150
151
152
153
154

155
156
157
158
159

160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236


237
238



239
240

241
242
243
244
245
246
247
248
249


250
251
252
253


254


255
256
257
258


259
260
261

262

263
264
265
266
267
268
269

270
271
272
273

274
275
276

277
278
279

280
281
282

283
284
285

286
287
288
289
290
291
292



293

294



295
296


297
298
299
300
301
302
303
304


305
306

307
308
309

310
311
312
313
314
315
316
317



318
319
320
321
322
323
324
325
326
327
328

329
330
331
332
333
334
335
336
337
338

339
340
341
342

343
344
345

346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361


362
363

364
365
366
367
368

369
370
371
372



373
374



375
376

377
378
379
380
381
382
383
384
385
386
387
388
389
390


391
392
393
394
395
396
397
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/0.10.x/Шрифты/index.html)


# 0.10.x/Шрифты

Материал из Tkabber Wiki.

 ** ![(!)](../../images/Warning.gif) Внимание! **
 
  В систему управления настройками шрифтов версии 0.11.0 были внесены изменения, и данная статья относится ко всем версиям, вышедшим до 0.11.0 (как минимум, к 0.9.7 – 0.10.0); если вас интересует современная версия Ткаббера (0.11.0 и выше), читайте [эту статью](../Шрифты.md). 



## <a id="toc"></a>Содержание

* [1 Что настраивать](#Что_настраивать)
* [2 Как настраивать](#Как_настраивать)
 * [2.1 Настройка системы](#Настройка_системы)
 * [2.2 Настройка Ткаббера](#Настройка_Ткаббера)
 * [2.3 Продвинутые спецификации шрифтов](#Продвинутые_спецификации_шрифтов)
  * [2.3.1 "Программное имя" шрифта](#Программное_имя_шрифта)
  * [2.3.2 Имя системного шрифта](#Имя_системного_шрифта)
  * [2.3.3 "Иксовый" формат](#Иксовый_формат)
  * [2.3.4 "Свободный" формат](#Свободный_формат)
  * [2.3.5 Формат "пары опция/значение"](#Формат_пары_опция_значение)
 * [2.4 Проблемы не-XLFD спецификаций в X Window](#Проблемы_не-XLFD_спецификаций_в_X_Window)
 * [2.5 Тонкая настройка шрифта интерфейса](#Тонкая_настройка_шрифта_интерфейса)
 * [2.6 Быстрый подбор шрифтов](#Быстрый_подбор_шрифтов)
  * [2.6.1 Шрифт интерфейса](#Шрифт_интерфейса)
  * [2.6.2 Шрифт окон чата и ростера](#Шрифт_окон_чата_и_ростера)
  * [2.6.3 Немножко хардкора](#Немножко_хардкора)
 * [2.7 Другие полезные средства](#Другие_полезные_средства)
* [3 Подводные камни](#Подводные_камни)
* [4 Примечания](#Примечания)
 * [4.1 Отдельная настройка шрифта ростеров](#Отдельная_настройка_шрифта_ростеров)
 * [4.2 Борьба с антиалиасингом в Xft](#Борьба_с_антиалиасингом_в_Xft)

# <a id="Что_настраивать"></a>Что настраивать
У Ткаббера можно "покрутить" настройки двух шрифтов: 

*  Шрифт интерфейса (меню, всевозможные подписи, поля ввода и т.д.); 
*  Шрифт окна чата и ростера. 

Первый шрифт является главным, и если второй не задан явно, то шрифт интерфейса используется для отрисовки всего и везде. 

Если ни один из шрифтов не задан явно, для всего используется _шрифт по умолчанию данной оконной системы_. 

Это означает, что в X Window System, в которой [Tk](http://ru.wikipedia.org/wiki/Tk) "поднимает" настройки из [XRDB](../XRDB.md), если таковая есть, будет взят указанный там шрифт. Если подходящего шрифта там нет, Tk попросит сервер шрифтов выдать нечто, удовлетворяющее формулировке "шрифт по умолчанию в такой-то кодировке". Поскольку в "иксах" достоверно существует только шрифт "fixed", подобный запрос для случая отрисовки кириллического текста обычно удовлетворяется первым попавшимся кириллическим шрифтом семейства "fixed"; нередко это совершенно не то, что вы хотели бы видеть. 







Непонимание этого факта порождает печально известный миф о "кривых шрифтах в Ткаббере"; так вот: в Ткаббере не бывает кривых шрифтов — бывают криво настроенные системы. 


**Примечание:** приведённая выше дихотомия настроек шрифтов является сознательным упрощением, так как [база данных опций Tk](../База_данных_опций_Tk.md) (и родственная ей [XRDB](../XRDB.md)) позволяют настраивать шрифты отдельно для разных классов виджетов и даже отдельно — для каждого виджета, поддерживающего настройку шрифта. Тема чуть подробнее изложена [ниже](../Шрифты.md#Тонкая_настройка_шрифта_интерфейса). 





# <a id="Как_настраивать"></a>Как настраивать
Есть два варианта: 

*  Настроить систему; 
*  Настроить Ткаббер. 

А также можно сначала настроить систему, а потом отдельно настроить шрифт для чата и ростера. 

## <a id="Настройка_системы"></a>Настройка системы

В Microsoft® Windows™ шрифты системы можно настроить штатным конфигуратором, который доступен в виде апплета "Экран" "Панели инструментов". 


В X Window настраивать нужно [XRDB](../XRDB.md). 

## <a id="Настройка_Ткаббера"></a>Настройка Ткаббера

Придётся отредактировать файл [**config.tcl**](../Config.tcl.md) в [каталоге настроек](../$__configdir.md) Ткаббера. Если вы собираетесь делать это первый раз, _обязательно_ прочитайте [эту статью](../Config.tcl_для_начинающих.md)! 



Настройки, интересующие нас, должны находиться либо "на верхнем уровне" файла конфигурации (проще говоря, на чистом месте: вне каких-либо блоков) или в обработчике [хука](../Загрузка_настроек.md#Хуки) **postload\_hook**. 



Настроек, как говорилось, две: 

 Шрифт интерфейса 

 Настраивается через базу данных опций Tk с использованием команды [option](http://www.tcl.tk/man/tcl8.4/TkCmd/option.htm), например: 

    option add *font -monotype-arial-medium-r-*-*-11-*-100-100-*-*-iso10646-1

 Шрифт окон чата и ростера 

 Настраивается установкой глобальной переменной **font**, например: 

    set font -monotype-arial-medium-r-*-*-11-*-100-100-*-*-iso10646-1

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

    # Шрифт элементов интерфейса: 
    option add *font -monotype-arial-medium-r-*-*-11-*-100-100-*-*-iso10646-1         
    # Шрифт окон чата и ростера:           
    set font -monotype-arial-medium-r-*-*-11-*-100-100-*-*-iso10646-1

**Внимание!** Внутри обработчика хука **postload\_hook** необходимо ссылаться на глобальную переменную **font**, используя её полностью квалифицированное имя: **::font**, либо вначале объявить, что эта переменная глобальна, такой командой: `global font`. В противном случае тикль создаст локальную (в пределах обработчика хука) переменную и будет изменять её. 




**Интересный факт:** даже в X Window System кодировка шрифта не обязана совпадать с локалью. 

**Подсказка:** в любой системе удобнее всего сначала подобрать требуемый шрифт при помощи какого-либо специального программного средства, а затем уже указывать этот шрифт в конфигурации Ткаббера. В X Window такой программой является, к примеру, **xfontsel**, а в Windows можно воспользоваться средствами упомянутого апплета "Экран". Шрифты в Ткаббере также можно подбирать [интерактивно](../Шрифты.md#Быстрое_тестирование_настроек). 





## <a id="Продвинутые_спецификации_шрифтов"></a>Продвинутые спецификации шрифтов

Если шрифты настраиваются в файле конфигурации Ткаббера (а не средствами системы), для их спецификации можно использовать дополнительные возможности подсистемы Tk для работы со шрифтами. 



Строго говоря, все эти возможности подробно изложены на соответствующей [странице руководства](http://www.tcl.tk/man/tcl8.4/TkCmd/font.htm), однако тут мы "расшифруем" основные её положения. 



Tk поддерживает пять способов указания шрифтов; приведённый в "каноническом" примере стиль ["XLFD"](http://ftp.xfree86.org/pub/XFree86/4.5.0/doc/xlfd.txt) ("X Logical Font Description") является одним из них, и вообще говоря, для пользователей систем, не основанных на X Window System, он является непонятным и неудобным. 




**Внимание!** прежде, чем вы ринетесь применять изложенное ниже на практике, имейте в виду, что Tk имеет проблемы с не-XLFD спецификациями шрифтов в X Window. Подробнее об этом написано [ниже](../Шрифты.md#Проблемы_не-XLFD_спецификаций_в_X_Window). 



Вот эти пять способов: 

### <a id="Программное_имя_шрифта"></a>"Программное имя" шрифта

Это имя шрифта, созданного при помощи команды Tk `font create`: Это — наименее интересный для нас способ, так как в основном предназначен для облегчения написания программ. 


Пример: 

    # Создаём новый шрифт:
    set myfont [font create {"Comic Sans MS" 12}]
    # Теперь переменная myfont содержит программное имя созданного шрифта.
    # Используем наш новый шрифт для настройки Ткаббера:
    set font $myfont

### <a id="Имя_системного_шрифта"></a>Имя системного шрифта

Имеет смысл только в Windows и Macintosh. Позволяет сослаться на один из шрифтов, настроенных для использования в системе. 

 Системные шрифты Windows

 system, ansi, device, systemfixed, ansifixed, oemfixed 

 Системные шрифты Macintosh

 system, application 

### <a id="Иксовый_формат"></a>"Иксовый" формат

Это формат XLFD, представляющий собой строку вида 

    -foundry-family-weight-slant-setwidth-addstyle-pixel-point-resx-resy-spacing-width-charset-encoding

Любое из полей может быть заменено символом "\*", что означает "любое значение". 

---

Теперь перейдём к наиболее интересным форматам. 

Следует заметить, что совокупность параметров, формирующих представление шрифта в этих форматах, должна представлять собой "правильно сформированный список". Академическое описание этого понятия, как ни странно, достаточно трудно для понимания; полные правила, которыми руководствуется тикль, осуществляя группировку, можно изучить [здесь](http://wiki.tcl.tk/14940). А в рамках данной статьи мы просто дадим пару советов, как получить такой список из набора параметров: 





*  Список с точки зрения тикля должен представлять собой одно _слово._ Это значит, что _элементы_ списка нужно _сгруппировать_ друг с другом. Проще всего это сделать фигурными скобками или двойными кавычками, например: 



    # Список из трёх элементов:
    {a b c}
    # Список из четырёх элементов:
    "d ef gh ij"

*  Список состоит из _слов_, слова отделяются друг от друга пробельными символами. Это означает, что если элементы-слова вашего списка сами содержат пробелы, их придётся сгруппировать, например: 


    # Список из трёх элементов:
    {{первый элемент} второй {и третий элемент}}

Не стоит отчаиваться, если правила группировки вам не вполне понятны — ниже приводятся готовые примеры, которые позволят вам "почувствовать", как работают эти правила. 


### <a id="Свободный_формат"></a>"Свободный" формат

Является "человекопонятным" и представляет собой _список_ из одного или более значений в указанном порядке: 

    семейство ?размер? ?стиль? ?стиль ...?

(Запись **?foo?** означает "необязательный параметр класса foo".) 

Обязательным является только семейство шрифта (font family). 

Доступные стили: 

*  Толщина начертания: 
 *  **normal** — обычная; 
 *  **bold** — полужирный шрифт; 
 
*  Наклон символов: 
 *  **roman** — обычное (прямое) начертание; 
 *  **italic** — курсивное начертание; 
 
*  Дополнительные стили: 
 *  **underline** — подчёркнутый шрифт; 
 *  **overstrike** — перечёркнутый шрифт. 

Примеры: 

    set font Tahoma
    set font {Arial 12}
    option add *font {{Times New Roman} 14 bold italic}

### <a id="Формат_пары_опция_значение"></a>Формат "пары опция/значение"

Представляет собой _список_ пар опция/значение: 

    опция значение ?опция значение ...?

Доступные опции и значения: 

 -family

 Семейство шрифтов. 

 -size

 Размер шрифта. 

 -weight

 Толщина начертания шрифта. Доступные значения: **bold** (полужирный) и **normal** (обычный). 

 -slant

 Наклон символов шрифта. Доступные значения: **italic** (курсив) и **roman** (прямой). 

 -underline

 Подчёркивание. Значением является значение булевого типа (**true**, **yes**, ненулевое число — истина; **false**, **no**, 0 — ложь). 

 -overstrike

 Зачёркивание. Доступные значения: истина и ложь. 

В отличие от предыдущего способа, в этом: 

*  Пары могут следовать в произвольном порядке; 
*  Возможно не указывать семейство шрифтов и/или размер, а указать только один или несколько стилей начертания. 

Примеры: 

    set font "-family {Comic Sans MS} -overstrike yes"
    option add *font {-weight bold -size 12}
    set font {-underline 1}

## <a id="Проблемы_не-XLFD_спецификаций_в_X_Window"></a>Проблемы не-XLFD спецификаций в X Window

К сожалению, версия Tk для X Window имеет баг с подбором глифов к символам, не входящим в Latin-1 (и поэтому он затрагивает русскоговорящих, а точнее, кириллически пишущих пользователей Ткаббера). 



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




Насколько нам известно, работы по переписыванию алгоритма подбора шрифтов в X Window ведутся, но проблема всё ещё не решена. 


Выходов из данной ситуации два: 

*  Использовать XLFD-спецификацию для шрифтов. 
*  Использовать версию 8.5 Tcl/Tk, собранную с поддержкой технологии [Xft](http://www.fontconfig.org/). 

Остановимся подробнее на втором варианте. 

Поддержка [Xft](http://wiki.tcl.tk/9015) появилась в Tk начиная с версии 8.5. Как для подбора, так и для отображения шрифтов используются совершенно другие механизмы, и, в частности, при использовании Xft полностью отсутствует обсуждаемая проблема. 



Однако, надо понимать последствия перехода на Xft: 

*  Подсистема Xft имеет собственные настройки, не имеющие отношения к стандартным механизмам X Window. В частности, вам, возможно, придётся познакомиться с [fontconfig](http://fontconfig.org/fontconfig-user.html). 


*  Несмотря на поддержку TrueType и полную поддержку Unicode шрифтов, Xft также использует [антиалиасинг](http://en.wikipedia.org/wiki/Anti-aliasing), который нравится далеко не всем. 



Узнать, поддерживает ли ваша версия **wish** Xft, можно двумя способами: 

*  В Linux можно узнать, слинкован ли **wish** с соответствующей динамической библиотекой, примерно так: 


    $ ldd `which wish` | grep -i xft
 
*  В любой системе можно запустить **wish** и выполнить там команду: 

    tk::pkgconfig get fontsystem

 Если она не "заругалась" и выдала строку "xft", — ваш Tcl/Tk поддеживает Xft. 

О борьбе с антиалиазингом в Xft рассказано [ниже](../Шрифты.md#Борьба_с_антиалиасингом_в_Xft). 

## <a id="Тонкая_настройка_шрифта_интерфейса"></a>Тонкая настройка шрифта интерфейса

Для понимания того, чего и где крутить, нужно осмыслить работу [базы данных опций Tk](../База_данных_опций_Tk.md) и [XRDB](../XRDB.md). 


Приведём пару готовых примеров: 

*  Шрифт меню: 

    option add *Menu.font "Arial 10"
 
*  Шрифт однострочных полей ввода: 

    option add *Entry.font {-weight bold}
 
*  Шрифт меток (статического текста): 

    option add *Label.font {-slant italic}
 
*  Шрифт табов (\<= 0.10.0): 

    option add *nb.font {-size 8}
 
*  Шрифт "новых табов" (альфа 0.10.1): 

    option add *nb.Button.font {-size 9}

... 

## <a id="Быстрый_подбор_шрифтов"></a>Быстрый подбор шрифтов

Вовсе необязательно "до посинения" повторять цикл "редактирование файла конигурации + перезапуск Ткаббера" — Ткаббер написан на тикле и поэтому позволяет управлять собой интерактивно. Это можно использовать для быстрого — "натурного" — подбора подходящих шрифтов чтобы затем один раз вписать правильные строчки в файл конфигурации. 





Откройте [консоль Ткаббера](../Ткаббер_ЧаВо.md#Консоль_Ткаббера). Здесь можно вводить те же самые команды, которые предназначены для помещения в файл конфигурации, в точно таком же формате. Имейте также в виду, что как встроенная консоль Ткаббера, так и tkcon, поддерживают историю введённых команд, доступную по нажатиям клавиш ↑ и ↓. 




Как было сказано выше, у Ткаббера есть две группы элементов интерфейса, у которых можно настроить шрифты. Для быстрого тестирования нам нужно понять, как заставить Ткаббер "применить" изменённый шрифт. 



Это несложно: 

### <a id="Шрифт_интерфейса"></a>Шрифт интерфейса

Используется, помимо прочего, для отрисовки всевозможных меню. 

Это означает, что для того, чтобы посмотреть настройку, изменённую при помощи `option add *font ...`, нужно просто открыть какое-либо _динамически создаваемое_ меню. Главное меню для этого не подходит, а вот меню на элементах ростера подходят замечательно. 



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


1.  Запустите Ткаббер, залогиньтесь на сервер, чтобы получить ростер, откройте консоль. 
1.  Напишите там 

    option add *font ваша_спецификация_шрифта
 
1.  Откройте меню на любом контакте в ростере, рассмотрите шрифт. 
1.  Повторяйте процедуру до получения удобоваримого результата. 

### <a id="Шрифт_окон_чата_и_ростера"></a>Шрифт окон чата и ростера

Для тестирования этого шрифта нам нужно открыть (или переоткрыть) какое-либо окно чата. Лучше всего для этого подходит какая-либо специальная тестовая комната, например, `test@conference.jabber.ru`. Также ничего не мешает вам открыть окно чата с самим собой (или со второй копией Ткаббера). 




Есть и более быстрый способ: вызов процедуры Ткаббера 

    ::ifacetk::roster::redraw

перерисовывает основной ростер, применяя установленный шрифт. 

Итак, для быстрого подбора шрифта для окон чата выполняйте такую последовательность действий: 

1.  Запустите Ткаббер, залогиньтесь на сервер, чтобы получить доступ к чатам, откройте консоль. 
1.  Напишите там 

    set font ваша_спецификация_шрифта
 
1.  (Пере)откройте какое-либо окно чата или вызовите указанную выше процедуру, рассмотрите шрифт. 
1.  Повторяйте процедуру до получения удобоваримого результата. 

![(!)](../../images/Hammer.png) **Сделать:** Выяснить применимы ли тут команды `ifacetk::switch_font` и `ifacetk::define_fonts` 

### <a id="Немножко_хардкора"></a>Немножко хардкора

Вы можете узнать, что именно думает Tk по поводу шрифта, который вы установили. Для этого используется команда `font actual`. 


Используется она следующим образом: 

*  Для шрифта интерфейса: 

    font actual [option get . font [winfo class .]]
 
*  Для шрифта чатов и ростера: 

    font actual $font

За подробностями обращайтесь к соответствующей [странице руководства](http://www.tcl.tk/man/tcl8.4/TkCmd/font.htm). 

## <a id="Другие_полезные_средства"></a>Другие полезные средства

Интерес может представлять команда 

    font families

которая возвращает список всех семейств шрифтов, доступных Ткабберу. 

Её можно ввести с консоли работающего Ткаббера. 

# <a id="Подводные_камни"></a>Подводные камни
Файлы с настройками Tk ("Tk option database") — те самые файлы с расширением ".xrdb", называемые кое-кем "темами", — иногда содержат настройку шрифтов интерфейса. Подгрузка такого файла при помощи `option readfile` "перекроет" системную настройку. 



Иногда это то, что вам нужно, иногда — нет. В таком случае _после_ подгрузки xrdb-файла нужно переписать настройку шрифта при помощи `option add` как описано выше. 


# <a id="Примечания"></a>Примечания
## <a id="Отдельная_настройка_шрифта_ростеров"></a>Отдельная настройка шрифта ростеров

Существует ["хак"](../Нетривиальные_настройки.md#Собственный_шрифт_для_ростеров), позволяющий отдельно настраивать шрифт ростеров. 


## <a id="Борьба_с_антиалиасингом_в_Xft"></a>Борьба с антиалиасингом в Xft

Известно, что антиалиасинг был "введён в оборот" для борьбы с дешёвыми китайскими TFT-мониторами и нравится [далеко не всем](http://www.joelonsoftware.com/articles/fog0000000041.html). Те, кто  обладает качественным монитором и нормальным набором шрифтов под его рабочий DPI, вероятно, захотят антиалиасинг отключить. 




Это делается при помощи настройки [fontconfig](http://www.fontconfig.org/). Настраивать эту подсистему можно как на уровне _параметров_ отдельных шрифтов (то есть, к примеру, можно отключить антиалиасинг для определённых семейств шрифтов, если используется размер символов менее определённого порога, и т.д.), так и глобально — для всех шрифтов с любыми параметрами. 




Потребуется отредактировать либо **~/.fonts.conf** — файл настроек конкретного пользователя, либо **/etc/fonts/fonts.conf** — системный файл настроек. 


Полное отключение антиалиасинга делается так: 

    <?xml version="1.0"?>
    <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
    <fontconfig>
      <match target="font" >
        <edit mode="assign" name="antialias">
          <bool>false</bool>
        </edit>
      </match>
    </fontconfig>

В качестве примера конфигурирования избирательного отключения антиалиасинга приведём настройку его подавления для шрифтов с размером символов от 8 до 15 пунктов (points) (позаимствовано [отсюда](http://www.wlug.org.nz/AntiAliasedFonts)): 



    <?xml version="1.0"?>
    <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
    <fontconfig>
      <match target="font" >
        <test compare="more" name="size" qual="any">
          <double>8</double>
511
512
513
514
515
516
517
518
519
520
521
522
523
524

        </test>
        <edit mode="assign" name="antialias">
          <bool>false</bool>
        </edit>
      </match>
    </fontconfig>

Для того, чтобы новые настройки вступили в силу, достаточно перезапустить приложения, использующие Xft.

За подробностями по поводу конфигурирования [fontconfig](http://www.fontconfig.org/) обращайтесть
к [его вики](http://fontconfig.org/fontconfig-user.html), а также официальной документации: **fonts.conf(5)**.

Ещё одним хорошим ресурсом по шрифтам и их приложению к Xft
является [официальная документация на Xfree86](http://www.xfree86.org/current/fonts2.html).








|

|
<

|
|
>
412
413
414
415
416
417
418
419
420
421

422
423
424
425
        </test>
        <edit mode="assign" name="antialias">
          <bool>false</bool>
        </edit>
      </match>
    </fontconfig>

Для того, чтобы новые настройки вступили в силу, достаточно перезапустить приложения, использующие Xft. 

За подробностями по поводу конфигурирования [fontconfig](http://www.fontconfig.org/) обращайтесть к [его вики](http://fontconfig.org/fontconfig-user.html), а также официальной документации: **fonts.conf(5)**. 


Ещё одним хорошим ресурсом по шрифтам и их приложению к Xft является [официальная документация на Xfree86](http://www.xfree86.org/current/fonts2.html). 


Changes to wiki/ru/0.9.x/ЧаВо.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212

213

214

215

216

217

218

219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316


[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/0.9.x/ЧаВо/index.html)


# 0.9.x/ЧаВо

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 В старпаке/старките нет звука/поддержки JPEG,PNG/сжатия](#В_старпаке_старките_нет_звука_поддержки_JPEGPNG_сжатия)
* [2 Пропадает содержимое ростера](#Пропадает_содержимое_ростера)
* [3 Не подключаются новые смайлики (звуковые схемы)](#Не_подключаются_новые_смайлики_звуковые_схемы)
* [4 Можно ли смайлики **отключить**?](#Можно_ли_смайлики_отключить)
* [5 Проблема со звуковой схемой](#Проблема_со_звуковой_схемой)
* [6 Выделение текста жирным, курсивом и подчёркиванием](#Выделение_текста_жирным_курсивом_и_подчёркиванием)
* [7 Игнор — великая вещь!](#Игнор_-_великая_вещь)
* [8 Как почитать протокол общения "в привате" с участником групчата, которого больше нет в комнате?](#Как_почитать_протокол_общения_в_привате_с_участником_групчата_которого_больше_нет_в_комнате)
* [9 Проверка орфографии](#Проверка_орфографии)
* [10 Стайлкоды](#Стайлкоды)
* [11 Можно ли добавить в ростер самого себя?](#Можно_ли_добавить_в_ростер_самого_себя)
* [12 Ввод "хитрых" юникодных символов](#Ввод_хитрых_юникодных_символов)
   * [12.1 Очень неудобный способ](#Очень_неудобный_способ)
   * [12.2 Умеренно неудобный способ](#Умеренно_неудобный_способ)
   * [12.3 Наименее неудобный способ](#Наименее_неудобный_способ)

## <a id="В_старпаке_старките_нет_звука_поддержки_JPEGPNG_сжатия"></a>В старпаке/старките нет звука/поддержки JPEG,PNG/сжатия

Без переделки старпака эту проблему не решить. Однако, [**Kostix**](../Участник_Kostix.md) добавил в
официальный старпак под win32 поддержку сжатия и возможность подгружать [img.kit](http://mini.net/sdarchive/img.kit),
содержащий пакет [**TkImg**](../Ткаббер_ЧаВо.md#Не_видны_иконки_фото_и_т.д._в_JPEG_PNG). Подробнее
читайте [**здесь**](../Старпак_и_сжатие.md).

## <a id="Пропадает_содержимое_ростера"></a>Пропадает содержимое ростера

**Вопрос: Если отключить показ в ростере транспортных иконок `show_transport_user_icons 0` и включить показ
активных разговоров `::ifacetk::roster::options(chats_group) 1`, то при попытке открыть хоть
один чат с каким-нибудь JID, содержимое ростера пропадает и до перезапуска Ткаббера не восстанавливается.**

Ответ: Обновитесь с [Tkabber SVN](http://tkabber.jabber.ru/svn) — всё уже исправлено.

## <a id="Не_подключаются_новые_смайлики_звуковые_схемы"></a>Не подключаются новые смайлики (звуковые схемы)

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

Ответ: Для начала ознакомьтесь с уже имеющейся [**информацией**](../Смайлики_и_аватары.md#Смайлики) на
эту тему. Далее убедитесь, что путь ведёт именно туда, где лежат файлы. В файле конфигурации
(например, от badlop) путь к смайликам указан такой: **/usr/share/tkabber/emoticons-tkabber** — в
установочный директорий. При добавлении новых смайл-паков их обычно кладут в домашний каталог,
в **~/.tkabber/emoticons-tkabber**, и если вы только дописали в конец строки название нового
директория, эффекта не будет :-)

Кстати, звуковые схемы как таковые в Ткаббере уже не подключаются. Начиная с версии 0.9.8
можно назначить любой звуковой файл (в формате wav) для каждого из событий отдельно.

## <a id="Можно_ли_смайлики_отключить"></a>Можно ли смайлики **отключить**?

**Вопрос: Сабж. Не хочу никаких смайликов, даже дефолтных.**

Ответ: это легко сделать. Рассказка — [**здесь**](../Смайлики_и_аватары.md#Полное_искоренение_смайликов)

## <a id="Проблема_со_звуковой_схемой"></a>Проблема со звуковой схемой

**Вопрос: Поменял стандартную звуковую схему на Psi, и теперь звуки не работают (или работают
не все). При этом xmms эти файлы проигрывает нормально.**

Ответ: Судя по всему, вы работаете в Linux, а версия Ткаббера у вас — 0.9.7, потому
что в версии 0.9.8 уже можно выбрать для каждого события любой звук. Возможно, проблема
в том, что программа **esdplay**, которая установлена по умолчанию, не может проиграть
некоторые wav-файлы из схемы Psi, потому что у них частота дискретизации слишком
низка — 5000 Hz. Попробуйте прописать другую программу или в звуковом редакторе
вроде Audacity отредактируйте файлы, поменяв частоту дискретизации на 11000 Hz. Не
забудьте, что если вы указываете в настройках звука просто имя звуковой схемы,
то файлы, которые вам нужно редактировать, лежат в **/usr/share/tkabber/sounds/psi**

## <a id="Выделение_текста_жирным_курсивом_и_подчёркиванием"></a>Выделение текста жирным, курсивом и подчёркиванием

**Вопрос: Как выделить слово или фразу одним или несколькими из этих стилей?**

Ответ: Перечитайте статью [**Быстрый старт**](../Начинающим.md#Некоторые_полезные_команды) — там всё подробно расписано, и даны примеры.

В версиях до 0.10.0 выделять фразы, содержащие пробелы, лишь двумя форматирующими символами
по краям _невозможно._ То есть, выделять надо каждое слово. В будущем ситуация, возможно,
изменится. Если да — свистнем ;) А до тех пор \*фраза вот такого типа\* будет выводиться
в окне чата "as is". Кроме того, стартовый и стоповый символы выделения должны граничить с
пробельными символами (пробел, таб, перевод строки) слева и справа, соответственно. То есть, к примеру:

watch \*this\*! → watch \*this\*! (ошибка: "!" сразу после "\*")  
now \*watch\* this! → now **watch** this!

(\*фиг\* вам!) → (\*фиг\* вам!) (ошибка: "(" перед "\*")  
(а вот \*фиг\* вам!) → (а вот **фиг** вам!)

## <a id="Игнор_-_великая_вещь"></a>Игнор — великая вещь!

**Вопрос: А доступен ли пользователям Jabber игнор, который так здорово помогал избегать конфликтов на IRC-каналах?**

Ответ \#1: В Ткаббере 0.10.0 реализовано игнорирование сообщений от участников
конференций на стороне клиента (Ткаббера).

Ответ \#2: В спецификациях MUC (Multi-User Chat) игнорирование не заложено, однако
кое-что можно сделать. Для начала немного теории.

Сообщения из комнат приходят от джида комнаты. Сообщения от присутствующих там — в виде джида
комнаты с ресурсом, который является ником автора сообщения. То есть сообщение от пользователя
`pupkin` из комнаты `rotten-chatter@conference.jabber.ru` приходят от джида
`rotten-chatter@conference.jabber.ru/pupkin`. Это можно использовать для _эмуляции_
игнор-листов: добавлять в список приватности "игнорируемый" вот такие полные джиды.

В Ткаббере защита приватности обеспечивается двумя списками: "невидимый" и "игнорируемый"
(о грамматической корректности этих названий промолчим). Нас интересует второй. Вызываем
список на редактирование (**Tkabber → Обеспечение приватности → Изменить игнорируемый список**)
и добавляем в него JID ненавистного вам человека так, как было описано выше:
`room_name@conference.jabber-server.org/trolls_nick`. После нажатия на кнопку "Отправить"
неведомая сила вышибает вас из комнаты. Перезайдите, и voila! — теперь вы не увидите не
только фраз этого человека, но и его самого в комнате, равно как любые iq-запросы с его стороны.
Само собой, это верно только для одной комнаты и только для одного ника. Для других надо
сделать отдельные записи в списке. Игнор будет работать до тех пор, пока тролль не сменит
ник или пока вы не удалите эту запись из игнорируемого списка (потребуется перезайти в комнату).

**Важное дополнение:** исследования практической стороны показали, что эффективность такого
способа игнорирования очень низка. Надоеда меняет ник и тут же появляется в списке участников
конференции. Вам же приходится заново вносить новый JID в список, при этом вас снова вышибет
из комнаты. Игра не стоит свеч. Впрочем, если надоеде никто не скажет, что его добавили в игнор,
то он может и не догадаться сменить ник. На крайний случай у комнаты есть владелец и администраторы.
Вряд ли им понравится, если кто-то будет издеваться над посетителями.

**Внимание, баг!** Если включать игнор через контекстное меню привата (а тролли часто достают
именно в приватах), то в игнор-список заносится джид комнаты без ресурса, то есть после
вышибания вас из комнаты попасть туда снова вы не сможете. А поскольку править записи в
игнор-листе нельзя (можно только удалять), то вносить правильный полный джид в лист следует
через главное меню Ткаббера, как было описано выше. Баг этот, возможно, будет исправлен в
одной из грядущих svn-версий, но пока этого не случилось, а также для пользователей стабильных
релизов рекомендация будет такой: игнорить ручками, хоть это гораздо более неудобно...

## <a id="Как_почитать_протокол_общения_в_привате_с_участником_групчата_которого_больше_нет_в_комнате"></a>Как почитать протокол общения "в привате" с участником групчата, которого больше нет в комнате?

**Вопрос: Беседовал в привате с человеком из комнаты, потом закрыл окно чата, участник из комнаты ушёл, как посмотреть протокол общения с ним?**

Ответ \#1: Начиная с версии 0.10.0 в Ткаббере реализован браузер истории разговоров.

Ответ \#2: Открыть протокол общения в Ткаббере можно только из контекстного меню на
контакте в одном из ростеров — основном или группового чата. Соответственно, если нужного
вам контакта нет ни в одном из ростеров, а почитать протокол общения нужно, придётся
прибегнуть к обходному манёвру.

Вам потребуется вручную вызвать процедуру Ткаббера, открывающую окно с протоколом чата
для выбранного JID. Для этого в консоли Ткаббера введите:

     logger::show_log room@service.host.dom/nick

где

*  `logger::show_log` — команда Ткаббера, открывающая окно с протоколом чата. Принимает
   один аргумент — JID, протокол общения с которым мы хотим почитать;
*  `room@service.host.dom/nick` — _полный_ JID комнаты. Он состоит из следующих частей
   (слева направо):
 1.  `room` — имя комнаты на соответствующем сервисе сервера;
 1.  `service.host.dom` — имя сервиса, реализующего групповой чат; для `jabber.ru` это
     `conference.jabber.ru`;
 1.  `nick` — участник конференции `room`, протокол общения с которым вас интересует.

Итого, для просмотра истории общения с пользователем "vasya" комнаты "linux-talks"
сервера "jabber.ru" вам нужно написать в комнате:

    logger::show_log vasya@conference.jabber.ru/vasya

После появления диалога консоль можно закрыть.

**Примечание:** естественно, что этот способ работает для любых контактов, то есть параметром для
`logger::show_log` может быть любой JID, с которым вы вели диалог. Это может пригодиться, к примеру,
для чтения протокола общения с контактом, которого вы удалили из своего ростера.

## <a id="Проверка_орфографии"></a>Проверка орфографии

**Вопрос: Можно ли "прикрутить" к Ткабберу какую-нибудь программу, чтобы проверять орфографию на лету?**

Ответ: Да, можно. Для начала надо установить пакет [ispell](http://www.gnu.org/software/ispell/ispell.html)
и настроить его, убедившись, что он работает сам по себе. Установите также необходимые словари.
Затем в конфиг вне всяких хуков надо вписать строчку

    set use_ispell 1

Запустив Ткаббер (или перезапустив, если он был открыт), идите в **Настройки → Плагины → Ispell**
и там проверьте, соответствует ли действительности путь к исполняемому файлу ispell (для \*nix это
обычно **/usr/bin/ispell**). Ещё вам необходимо указать, какой словарь вы собираетесь использовать,
а также его кодировку. В поле настройки `::plugins::ispell::options(dictionary)` пишем russian, а в
следующем — скажем, koi8-r. Вторую опцию лучше не трогать, ибо она сильно загрузит ваш процессор
ненужными проверками недописанных слов на каждой новой букве. Не забудьте сохранить изменённые
настройки для будущих сессий и перезапустите Ткаббер снова. Теперь, когда вы будете писать сообщения,
все слова с орфоргафическими ошибками, а также слова, отсуствующие в словаре, будут выделяться красным
цветом прямо в поле ввода (не подумайте вдруг, что ispell станет проверять орфографию в приходящих
сообщениях). Учтите, что одновременно можно работать лишь с одним словарём.

В Windows процесс настройки точно такой же. Вот вам в
помощь [небольшое руководство](http://ficus-www.cs.ucla.edu/geoff/ispell-winnt.html) по сборке и
настройке самого ispell в виндах (англ.) Не забудьте указать кодировку cp1251. )

К сожалению, с [aspell](http://www.gnu.org/software/aspell/) (бинарники для Win32 можете
найти [тут](http://aspell.net/win32/)) имеются проблемы, и это вполне понятно, потому что
синтаксис у этих программ немного разный. Ткаббер сразу же просекает, что работает не с той
программой, и выдаёт ошибку, предлагая указать правильный путь к ispell. Тем не менее, при
наличии прямых рук и некоторого количества мозгов наверняка можно решить и эту проблему.
Если вам известно, как это сделать, просим поделиться информацией.

## <a id="Стайлкоды"></a>Стайлкоды

В принципе, общение в групповом чате или с глазу на глаз ничем не отличается от общения
в других программах - ICQ, IRC и так далее. Но свои тонкости есть, и лучше сразу с ними познакомиться.

Пишем | Получаем
---|---
/me хочет спать | \* testirovanie хочет спать

\_подчёркнутый\_ \_текст\_ | <u>подчёркнутый</u> <u>текст</u>

\*жирный\* \*текст\* | **жирный текст**

/наклонный/ /текст/ | _наклонный текст_

/\*можно\*/ /\_смешивать\_/ | _**можно** <u>смешивать</u>_

\_\*разные\*\_ \*/\_стили\_/\* | **<u>разные</u> _<u>стили</u>_**

\_/\*но-надо-быть-аккуратным\_/\* | \_\*/но-надо-быть-аккуратным\_/\*

\*и помнить о пробелах\* | \*и помнить о пробелах\*

Как видите, текст можно делать жирным, подчёркнутым и курсивом, но выделять приходится
каждое слово, иначе всё напечатается как есть. Можно смешивать разные стили. Главное,
помнить про вложение символов выделения. Если эта возможность вам мешает, её можно
отключить в Настройках (группа Chat, Включить выделение).

## <a id="Можно_ли_добавить_в_ростер_самого_себя"></a>Можно ли добавить в ростер самого себя?

**Вопрос: У меня запущено два Ткаббера: один дома, другой на работе. Оба запущены от одного
аккаунта, просто ресурсы разные (к примеру, login@jabber.ru/Home и login@jabber.ru/Work).
Безуспешно пытаюсь добавить их в ростер, чтобы, находясь дома, видеть и отправлять сообщения
самому себе на работу, и наоборот.**

Ответ: С марта 2007 года в транке svn-версии (а стало быть, и в стабильной "десятке" — версии 0.10.0)
имеется пункт ростера "Мои ресурсы", где за небольшую плату можно обнаружить все соединения
вашего JID. Если по каким-либо причинам вы вынуждены сидеть на более древней версии, читайте дальше.

Проблема решаема, правда, придётся пойти на небольшую хитрость. Впрочем, всё по порядку.

1.  Убедитесь, что открыт **только** "домашний" Ткаббер, то есть, вы работаете как **login@jabber.ru/Home**.
    Если на работе запущен другой, надо бы его сначала прибить.
1.  Добавьте в ростер (в версиях начиная с 0.9.8 он называется "Контакты") пользователя **login@jabber.ru/Work**.
    Появится запрос для этого пользователя с просьбой авторизации. Отправьте его, и когда откроется окно
    редактирования контакта, добавьте его в нужную группу, если надо, но самое главное, не забудьте отредактировать
    его имя — напишите, к примеру, **login/Work**.
1.  Разлогиньтесь и залогиньтесь снова как **login@jabber.ru**, указав теперь в качестве ресурса **Work**.
    Это важно — "домашний" аккаунт должен быть закрыт! Заметьте, что, залогинившись, мы не получили запрос
    на авторизацию. Так и должно быть.
1.  Проделайте шаг 2), на этот раз отредактировав добавляемый контакт как **login/Home**.
1.  Запустите ещё один Ткаббер и залогиньтесь как **login@jabber.ru**, указав в качестве ресурса **Home**.
    Запрос на авторизацию не пришёл и сейчас. Это хорошо.
1.  Посмотрите в ростеры обоих Ткабберов — теперь "домашний" клиент видит там болтающегося в онлайне **login/Work**,
    а рабочий — **login/Home**. Можно также и слать друг другу сообщения. Если включить показ пользователей,
    находящихся в оффлайне, вы увидите, что в "домашнем" и "рабочем" Ткабберах "свои" контакты показываются
    именно находящимися в оффлайне, да ещё в ожидании авторизации. Ещё раз повторяю: так и должно быть.
1.  В зависимости от того, где вы производили эти манипуляции — на работе или дома — закройте соответствующий
    Ткаббер, с тем чтобы открыть его уже дома/на работе и продолжать пользоваться этим
    дуэтом в соответствии с потребностями.
1.  Если вы пытались авторизовать какой-либо из этих контактов, пока было запущено оба Ткаббера,
    вы несомненно должны были получить запрос на авторизацию от другого клиента. Если так оно и случилось,
    в ростере вы друг друга (сам себя) в онлайне уже не увидите. Придётся удалять их обоих из ростера и начинать сначала.

Учтите, что для того, чтобы заходить обоими этими клиентами в одни и те же конференции, нужно,
чтобы ники для конференций были разные для каждого Ткаббера. Вам придётся либо отредактировать
конфиг на каждой из машин, либо проделывать это вручную. Но это уже отдельный вопрос ;)

**На заметку:** Польский коллега [desnajpa](http://sourceforge.net/users/desnajpa/), в одиночку ковыряющий
бедную чернозёмом землю Ткаббера, добился некоторых результатов в плане развития шизофрении у пользователей
этого клиента. В его вариации программы — [Tkabber-SK](http://sourceforge.net/projects/tkabber-sk/) — уже
имеется self-contact, добавленный в ростер. Тестируйте.

## <a id="Ввод_хитрых_юникодных_символов"></a>Ввод "хитрых" юникодных символов

**Вопрос: У меня стоит русская локаль, следовательно, я не могу вводить в Ткаббере спец-символы вроде
акцентов и прочих хитроумных западноевропейских букв. Как-то можно это наладить?**

Ответ: Можно, и пока есть три способа сделать это, все довольно неудобные.

### <a id="Очень_неудобный_способ"></a>Очень неудобный способ

При помощи встроенного плагина **unisymbols** единичные юникодные символы вводятся в поле
редактирования сообщений в следующем формате:

    &шестнадцатиричный_код_символаCtrl+;

Это напоминает ввод подобных символов в HTML-коде: `&#код_символа;` (обратите внимание,
что в Ткаббере вводить "решётку" **\#** не нужно). Поясним:

*  Сначала идёт значок амперсанда — **&**,
*  затем _шестнадцатеричный_ код нужного вам символа (без \# впереди),
*  и в конце надо нажать одновременно клавишу **Control** и клавишу точки с запятой (не в русской раскладке).

При этом ткаббер заменит вашу конструкцию (включительно, от **&** до последнего введённого
перед нажатием **Ctrl-;** символа) на соответствующий символ юникода.

Например, **&c2;** → **Â**.

**На заметку:** символ ";" находится в основном регистре английской раскладки (то есть
вводится простым нажатием на соответствующую клавишу), но в других раскладках её расположение
может отличаться. Например, в испанской точка с запятой вызывается нажатием **Shift** и
клавиши запятой. То есть, после набора амперсанда и кода символа надо нажать **Ctrl-Shift-,**.

### <a id="Умеренно_неудобный_способ"></a>Умеренно неудобный способ

Вот ещё один способ попроще. Можно открыть рядом текстовый редактор, поддерживающий юникодные
символы (например, **Vim, gedit** или тот же **Word**), вбить туда все нужные вам символы и
копировать их в поле ввода Ткаббера, когда требуется. Тоже не очень красивое решение, но
тем не менее, может пригодиться.

### <a id="Наименее_неудобный_способ"></a>Наименее неудобный способ

Прямиком отправляем вас к [**статье о плагине Tkabber-KHIM**](../Плагины.md#Tkabber-KHIM),
позволяющем вводить любые юникодные символы буквально в три нажатия клавиш. Самые главные
его достоинства — возможность определения произвольных символов и их ввод с помощью
"клавиши композиции" и заданного сочетания двух "обычных" символов.

Ткаббер версии 0.10.0 содержит этот плагин в качестве встроенного средства.



>



















|
|
|



|
<
<
<



|
<
<

|



|
<

|
<
<
<
<
<

|
<



|

|



|
<

|
<
<
<
<
<
<
<



|

|

|
<
<
<
<

|
|
|
|
|



|

|
<

|
<

|
<
<
<
<

|
<
<
<
<
<
<
<
<
<

|
<
<
<
<
<

|
<
<
<
<
<
<



|

|

|
<
<
<

|
<



|

|
<
|
<
|
|
<
|

|
<



|

|
<
<



|

|
<
<



|
<
<
<
<
<
<
<
<
<

|
<
<

|
<
<
<
<
<



|
<

|
|
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|

|
<
<
<



|
<
<
<

|
<
<

|

|
<
|
<
<
<
|
<
<
|
|
<
|
<
<
<
|
<
<
|
<
<

|
<
<

|
<
<
<



|
<

|



|
<

|

|
<

|
|
|

|
<

|

|
<
<
<



|
<
<
<



<
|
<
<

|
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28



29
30
31
32


33
34
35
36
37
38

39
40





41
42

43
44
45
46
47
48
49
50
51
52

53
54







55
56
57
58
59
60
61
62




63
64
65
66
67
68
69
70
71
72
73
74

75
76

77
78




79
80









81
82





83
84






85
86
87
88
89
90
91
92



93
94

95
96
97
98
99
100

101

102
103

104
105
106

107
108
109
110
111
112


113
114
115
116
117
118


119
120
121
122









123
124


125
126





127
128
129
130

131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150



151
152
153
154



155
156


157
158
159
160

161



162


163
164

165



166


167


168
169


170
171



172
173
174
175

176
177
178
179
180
181

182
183
184
185

186
187
188
189
190
191

192
193
194
195



196
197
198
199



200
201
202

203


204
205
206
207
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/0.9.x/ЧаВо/index.html)


# 0.9.x/ЧаВо

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 В старпаке/старките нет звука/поддержки JPEG,PNG/сжатия](#В_старпаке_старките_нет_звука_поддержки_JPEGPNG_сжатия)
* [2 Пропадает содержимое ростера](#Пропадает_содержимое_ростера)
* [3 Не подключаются новые смайлики (звуковые схемы)](#Не_подключаются_новые_смайлики_звуковые_схемы)
* [4 Можно ли смайлики **отключить**?](#Можно_ли_смайлики_отключить)
* [5 Проблема со звуковой схемой](#Проблема_со_звуковой_схемой)
* [6 Выделение текста жирным, курсивом и подчёркиванием](#Выделение_текста_жирным_курсивом_и_подчёркиванием)
* [7 Игнор — великая вещь!](#Игнор_-_великая_вещь)
* [8 Как почитать протокол общения "в привате" с участником групчата, которого больше нет в комнате?](#Как_почитать_протокол_общения_в_привате_с_участником_групчата_которого_больше_нет_в_комнате)
* [9 Проверка орфографии](#Проверка_орфографии)
* [10 Стайлкоды](#Стайлкоды)
* [11 Можно ли добавить в ростер самого себя?](#Можно_ли_добавить_в_ростер_самого_себя)
* [12 Ввод "хитрых" юникодных символов](#Ввод_хитрых_юникодных_символов)
 * [12.1 Очень неудобный способ](#Очень_неудобный_способ)
 * [12.2 Умеренно неудобный способ](#Умеренно_неудобный_способ)
 * [12.3 Наименее неудобный способ](#Наименее_неудобный_способ)

## <a id="В_старпаке_старките_нет_звука_поддержки_JPEGPNG_сжатия"></a>В старпаке/старките нет звука/поддержки JPEG,PNG/сжатия

Без переделки старпака эту проблему не решить. Однако, [Kostix](../Участник_Kostix.md) добавил в официальный старпак под win32 поддержку сжатия и возможность подгружать [img.kit](http://mini.net/sdarchive/img.kit), содержащий пакет [TkImg](../Ткаббер_ЧаВо.md#Не_видны_иконки_фото_и_т.д._в_JPEG_PNG). Подробнее читайте [здесь](../Low_traffic_HOWTO.md#Старпак_Ткаббера_Win32). 




## <a id="Пропадает_содержимое_ростера"></a>Пропадает содержимое ростера

**Вопрос: Если отключить показ в ростере транспортных иконок `show_transport_user_icons 0` и включить показ активных разговоров `::ifacetk::roster::options(chats_group) 1`, то при попытке открыть хоть один чат с каким-нибудь JID, содержимое ростера пропадает и до перезапуска Ткаббера не восстанавливается.** 



Ответ: Обновитесь с [Tkabber SVN](http://tkabber.jabber.ru/svn) — всё уже исправлено. 

## <a id="Не_подключаются_новые_смайлики_звуковые_схемы"></a>Не подключаются новые смайлики (звуковые схемы)

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


Ответ: Для начала ознакомьтесь с уже имеющейся [информацией](../Смайлики_и_аватары.md#Смайлики) на эту тему. Далее убедитесь, что путь ведёт именно туда, где лежат файлы. В файле конфигурации (например, от badlop) путь к смайликам указан такой: **/usr/share/tkabber/emoticons-tkabber** — в установочный директорий. При добавлении новых смайл-паков их обычно кладут в домашний каталог, в **~/.tkabber/emoticons-tkabber**, и если вы только дописали в конец строки название нового директория, эффекта не будет :-) 






Кстати, звуковые схемы как таковые в Ткаббере уже не подключаются. Начиная с версии 0.9.8 можно назначить любой звуковой файл (в формате wav) для каждого из событий отдельно. 


## <a id="Можно_ли_смайлики_отключить"></a>Можно ли смайлики **отключить**?

**Вопрос: Сабж. Не хочу никаких смайликов, даже дефолтных.** 

Ответ: это легко сделать. Рассказка — [здесь](../Смайлики_и_аватары.md#Полное_искоренение_смайликов) 

## <a id="Проблема_со_звуковой_схемой"></a>Проблема со звуковой схемой

**Вопрос: Поменял стандартную звуковую схему на Psi, и теперь звуки не работают (или работают не все). При этом xmms эти файлы проигрывает нормально.** 


Ответ: Судя по всему, вы работаете в Linux, а версия Ткаббера у вас — 0.9.7, потому что в версии 0.9.8 уже можно выбрать для каждого события любой звук. Возможно, проблема в том, что программа esdplay, которая установлена по умолчанию, не может проиграть некоторые wav-файлы из схемы Psi, потому что у них частота дискретизации слишком низка — 5000 Hz. Попробуйте прописать другую программу или в звуковом редакторе вроде Audacity отредактируйте файлы, поменяв частоту дискретизации на 11000 Hz. Не забудьте, что если вы указываете в настройках звука просто имя звуковой схемы, то файлы, которые вам нужно редактировать, лежат в **/usr/share/tkabber/sounds/psi** 








## <a id="Выделение_текста_жирным_курсивом_и_подчёркиванием"></a>Выделение текста жирным, курсивом и подчёркиванием

**Вопрос: Как выделить слово или фразу одним или несколькими из этих стилей?** 

Ответ: Перечитайте статью **[Быстрый старт](../Начинающим.md#Некоторые_полезные_команды)** — там всё подробно расписано, и даны примеры. 

В версиях до 0.10.0 выделять фразы, содержащие пробелы, лишь двумя форматирующими символами по краям _невозможно._ То есть, выделять надо каждое слово. В будущем ситуация, возможно, изменится. Если да — свистнем ;) А до тех пор \*фраза вот такого типа\* будет выводиться в окне чата "as is". Кроме того, стартовый и стоповый символы выделения должны граничить с пробельными символами (пробел, таб, перевод строки) слева и справа, соответственно. То есть, к примеру: 





    watch *this*! → watch *this*! (ошибка: "!" сразу после "*")
    now *watch* this! → now **watch** this!
    
    (*фиг* вам!) → (*фиг* вам!) (ошибка: "(" перед "*")
    (а вот *фиг* вам!) → (а вот **фиг** вам!)

## <a id="Игнор_-_великая_вещь"></a>Игнор — великая вещь!

**Вопрос: А доступен ли пользователям Jabber игнор, который так здорово помогал избегать конфликтов на IRC-каналах?** 

Ответ \#1: В Ткаббере 0.10.0 реализовано игнорирование сообщений от участников конференций на стороне клиента (Ткаббера). 


Ответ \#2: В спецификациях MUC (Multi-User Chat) игнорирование не заложено, однако кое-что можно сделать. Для начала немного теории. 


Сообщения из комнат приходят от джида комнаты. Сообщения от присутствующих там — в виде джида комнаты с ресурсом, который является ником автора сообщения. То есть сообщение от пользователя `pupkin` из комнаты `rotten-chatter@conference.jabber.ru` приходят от джида `rotten-chatter@conference.jabber.ru/pupkin`. Это можно использовать для _эмуляции_ игнор-листов: добавлять в список приватности "игнорируемый" вот такие полные джиды. 





В Ткаббере защита приватности обеспечивается двумя списками: "невидимый" и "игнорируемый" (о грамматической корректности этих названий промолчим). Нас интересует второй. Вызываем список на редактирование (**Tkabber → Обеспечение приватности → Изменить игнорируемый список**) и добавляем в него JID ненавистного вам человека так, как было описано выше: `room_name@conference.jabber-server.org/trolls_nick`. После нажатия на кнопку "Отправить" неведомая сила вышибает вас из комнаты. Перезайдите, и voila! — теперь вы не увидите не только фраз этого человека, но и его самого в комнате, равно как любые iq-запросы с его стороны. Само собой, это верно только для одной комнаты и только для одного ника. Для других надо сделать отдельные записи в списке. Игнор будет работать до тех пор, пока тролль не сменит ник или пока вы не удалите эту запись из игнорируемого списка (потребуется перезайти в комнату). 










**Важное дополнение:** исследования практической стороны показали, что эффективность такого способа игнорирования очень низка. Надоеда меняет ник и тут же появляется в списке участников конференции. Вам же приходится заново вносить новый JID в список, при этом вас снова вышибет из комнаты. Игра не стоит свеч. Впрочем, если надоеде никто не скажет, что его добавили в игнор, то он может и не догадаться сменить ник. На крайний случай у комнаты есть владелец и администраторы. Вряд ли им понравится, если кто-то будет издеваться над посетителями. 






**Внимание, баг!** Если включать игнор через контекстное меню привата (а тролли часто достают именно в приватах), то в игнор-список заносится джид комнаты без ресурса, то есть после вышибания вас из комнаты попасть туда снова вы не сможете. А поскольку править записи в игнор-листе нельзя (можно только удалять), то вносить правильный полный джид в лист следует через главное меню Ткаббера, как было описано выше. Баг этот, возможно, будет исправлен в одной из грядущих svn-версий, но пока этого не случилось, а также для пользователей стабильных релизов рекомендация будет такой: игнорить ручками, хоть это гораздо более неудобно... 







## <a id="Как_почитать_протокол_общения_в_привате_с_участником_групчата_которого_больше_нет_в_комнате"></a>Как почитать протокол общения "в привате" с участником групчата, которого больше нет в комнате?

**Вопрос: Беседовал в привате с человеком из комнаты, потом закрыл окно чата, участник из комнаты ушёл, как посмотреть протокол общения с ним?** 

Ответ \#1: Начиная с версии 0.10.0 в Ткаббере реализован браузер истории разговоров. 

Ответ \#2: Открыть протокол общения в Ткаббере можно только из контекстного меню на контакте в одном из ростеров — основном или группового чата. Соответственно, если нужного вам контакта нет ни в одном из ростеров, а почитать протокол общения нужно, придётся прибегнуть к обходному манёвру. 




Вам потребуется вручную вызвать процедуру Ткаббера, открывающую окно с протоколом чата для выбранного JID. Для этого в консоли Ткаббера введите: 


     logger::show_log room@service.host.dom/nick

где 

*  `logger::show_log` — команда Ткаббера, открывающая окно с протоколом чата. Принимает один аргумент — JID, протокол общения с которым мы хотим почитать; 

*  `room@service.host.dom/nick` — _полный_ JID комнаты. Он состоит из следующих частей (слева направо): 

 1.  `room` — имя комнаты на соответствующем сервисе сервера; 
 1.  `service.host.dom` — имя сервиса, реализующего групповой чат; для `jabber.ru` это `conference.jabber.ru`; 

 1.  `nick` — участник конференции `room`, протокол общения с которым вас интересует. 

Итого, для просмотра истории общения с пользователем "vasya" комнаты "linux-talks" сервера "jabber.ru" вам нужно написать в комнате: 


    logger::show_log vasya@conference.jabber.ru/vasya

После появления диалога консоль можно закрыть. 

**Примечание:** естественно, что этот способ работает для любых контактов, то есть параметром для `logger::show_log` может быть любой JID, с которым вы вели диалог. Это может пригодиться, к примеру, для чтения протокола общения с контактом, которого вы удалили из своего ростера. 



## <a id="Проверка_орфографии"></a>Проверка орфографии

**Вопрос: Можно ли "прикрутить" к Ткабберу какую-нибудь программу, чтобы проверять орфографию на лету?** 

Ответ: Да, можно. Для начала надо установить пакет [ispell](http://www.gnu.org/software/ispell/ispell.html) и настроить его, убедившись, что он работает сам по себе. Установите также необходимые словари. Затем в конфиг вне всяких хуков надо вписать строчку 



    set use_ispell 1

Запустив Ткаббер (или перезапустив, если он был открыт), идите в **Настройки → Плагины → Ispell** и там проверьте, соответствует ли действительности путь к исполняемому файлу ispell (для \*nix это обычно **/usr/bin/ispell**). Ещё вам необходимо указать, какой словарь вы собираетесь использовать, а также его кодировку. В поле настройки `::plugins::ispell::options(dictionary)` пишем russian, а в следующем — скажем, koi8-r. Вторую опцию лучше не трогать, ибо она сильно загрузит ваш процессор ненужными проверками недописанных слов на каждой новой букве. Не забудьте сохранить изменённые настройки для будущих сессий и перезапустите Ткаббер снова. Теперь, когда вы будете писать сообщения, все слова с орфоргафическими ошибками, а также слова, отсуствующие в словаре, будут выделяться красным цветом прямо в поле ввода (не подумайте вдруг, что ispell станет проверять орфографию в приходящих сообщениях). Учтите, что одновременно можно работать лишь с одним словарём. 










В Windows процесс настройки точно такой же. Вот вам в помощь [небольшое руководство](http://ficus-www.cs.ucla.edu/geoff/ispell-winnt.html) по сборке и настройке самого ispell в виндах (англ.) Не забудьте указать кодировку cp1251. ) 



К сожалению, с [aspell](http://www.gnu.org/software/aspell/) (бинарники для Win32 можете найти [тут](http://aspell.net/win32/)) имеются проблемы, и это вполне понятно, потому что синтаксис у этих программ немного разный. Ткаббер сразу же просекает, что работает не с той программой, и выдаёт ошибку, предлагая указать правильный путь к ispell. Тем не менее, при наличии прямых рук и некоторого количества мозгов наверняка можно решить и эту проблему. Если вам известно, как это сделать, просим поделиться информацией. 






## <a id="Стайлкоды"></a>Стайлкоды

В принципе, общение в групповом чате или с глазу на глаз ничем не отличается от общения в других программах - ICQ, IRC и так далее. Но свои тонкости есть, и лучше сразу с ними познакомиться. 


 Пишем: Получаем: 
 
 /me хочет спать \* testirovanie хочет спать 
 
 \_подчёркнутый\_ \_текст\_ <u>подчёркнутый</u> <u>текст</u> 
 
 \*жирный\* \*текст\* **жирный текст** 
 
 /наклонный/ /текст/ _наклонный текст_ 
 
 /\*можно\*/ /\_смешивать\_/ _**можно** <u>смешивать</u>_ 
 
 \_\*разные\*\_ \*/\_стили\_/\* **<u>разные</u> _<u>стили</u>_** 
 
 \_/\*но-надо-быть-аккуратным\_/\* \_\*/но-надо-быть-аккуратным\_/\* 
 
 \*и помнить о пробелах\* \*и помнить о пробелах\* 

Как видите, текст можно делать жирным, подчёркнутым и курсивом, но выделять приходится каждое слово, иначе всё напечатается как есть. Можно смешивать разные стили. Главное, помнить про вложение символов выделения. Если эта возможность вам мешает, её можно отключить в Настройках (группа Chat, Включить выделение). 




## <a id="Можно_ли_добавить_в_ростер_самого_себя"></a>Можно ли добавить в ростер самого себя?

**Вопрос: У меня запущено два Ткаббера: один дома, другой на работе. Оба запущены от одного аккаунта, просто ресурсы разные (к примеру, **login@jabber.ru/Home** и **login@jabber.ru/Work**). Безуспешно пытаюсь добавить их в ростер, чтобы, находясь дома, видеть и отправлять сообщения самому себе на работу, и наоборот.** 




Ответ: С марта 2007 года в транке svn-версии (а стало быть, и в стабильной "десятке" — версии 0.10.0) имеется пункт ростера "Мои ресурсы", где за небольшую плату можно обнаружить все соединения вашего JID. Если по каким-либо причинам вы вынуждены сидеть на более древней версии, читайте дальше.  



Проблема решаема, правда, придётся пойти на небольшую хитрость. Впрочем, всё по порядку. 

1.  Убедитесь, что открыт **только** "домашний" Ткаббер, то есть, вы работаете как **login@jabber.ru/Home**. Если на работе запущен другой, надо бы его сначала прибить. 

1.  Добавьте в ростер (в версиях начиная с 0.9.8 он называется "Контакты") пользователя **login@jabber.ru/Work**. Появится запрос для этого пользователя с просьбой авторизации. Отправьте его, и когда откроется окно редактирования контакта, добавьте его в нужную группу, если надо, но самое главное, не забудьте отредактировать его имя — напишите, к примеру, **login/Work**. 



1.  Разлогиньтесь и залогиньтесь снова как **login@jabber.ru**, указав теперь в качестве ресурса **Work**. Это важно — "домашний" аккаунт должен быть закрыт! Заметьте, что, залогинившись, мы не получили запрос на авторизацию. Так и должно быть. 


1.  Проделайте шаг 2), на этот раз отредактировав добавляемый контакт как **login/Home**. 
1.  Запустите ещё один Ткаббер и залогиньтесь как **login@jabber.ru**, указав в качестве ресурса **Home**. Запрос на авторизацию не пришёл и сейчас. Это хорошо. 

1.  Посмотрите в ростеры обоих Ткабберов — теперь "домашний" клиент видит там болтающегося в онлайне **login/Work**, а рабочий — **login/Home**. Можно также и слать друг другу сообщения. Если включить показ пользователей, находящихся в оффлайне, вы увидите, что в "домашнем" и "рабочем" Ткабберах "свои" контакты показываются именно находящимися в оффлайне, да ещё в ожидании авторизации. Ещё раз повторяю: так и должно быть. 



1.  В зависимости от того, где вы производили эти манипуляции — на работе или дома — закройте соответствующий Ткаббер, с тем чтобы открыть его уже дома/на работе и продолжать пользоваться этим дуэтом в соответствии с потребностями. 


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



Учтите, что для того, чтобы заходить обоими этими клиентами в одни и те же конференции, нужно, чтобы ники для конференций были разные для каждого Ткаббера. Вам придётся либо отредактировать конфиг на каждой из машин, либо проделывать это вручную. Но это уже отдельный вопрос ;) 



**На заметку:** Польский коллега [desnajpa](http://sourceforge.net/users/desnajpa/), в одиночку ковыряющий бедную чернозёмом землю Ткаббера, добился некоторых результатов в плане развития шизофрении у пользователей этого клиента. В его вариации программы — [Tkabber-SK](http://sourceforge.net/projects/tkabber-sk/) — уже имеется self-contact, добавленный в ростер. Тестируйте. 




## <a id="Ввод_хитрых_юникодных_символов"></a>Ввод "хитрых" юникодных символов

**Вопрос: У меня стоит русская локаль, следовательно, я не могу вводить в Ткаббере спец-символы вроде акцентов и прочих хитроумных западноевропейских букв. Как-то можно это наладить?** 


Ответ: Можно, и пока есть три способа сделать это, все довольно неудобные. 

### <a id="Очень_неудобный_способ"></a>Очень неудобный способ

При помощи встроенного плагина **unisymbols** единичные юникодные символы вводятся в поле редактирования сообщений в следующем формате: 


    &шестнадцатиричный_код_символаCtrl;

Это напоминает ввод подобных символов в HTML-коде: `&#код_символа;` (обратите внимание, что в Ткаббере вводить "решётку" **\#** не нужно). Поясним: 


*  Сначала идёт значок амперсанда — **&**, 
*  затем _шестнадцатеричный_ код нужного вам символа (без \# впереди), 
*  и в конце надо нажать одновременно клавишу **Control** и клавишу точки с запятой (не в русской раскладке). 

При этом ткаббер заменит вашу конструкцию (включительно, от **&** до последнего введённого перед нажатием **Ctrl-;** символа) на соответствующий символ юникода. 


Например, **&c2;** → **Â**. 

**На заметку:** символ ";" находится в основном регистре английской раскладки (то есть вводится простым нажатием на соответствующую клавишу), но в других раскладках её расположение может отличаться. Например, в испанской точка с запятой вызывается нажатием **Shift** и клавиши запятой. То есть, после набора амперсанда и кода символа надо нажать **Ctrl-Shift-,**. 




### <a id="Умеренно_неудобный_способ"></a>Умеренно неудобный способ

Вот ещё один способ попроще. Можно открыть рядом текстовый редактор, поддерживающий юникодные символы (например, **Vim, gedit** или тот же **Word**), вбить туда все нужные вам символы и копировать их в поле ввода Ткаббера, когда требуется. Тоже не очень красивое решение, но тем не менее, может пригодиться. 




### <a id="Наименее_неудобный_способ"></a>Наименее неудобный способ


Прямиком отправляем вас к [статье о плагине Tkabber-KHIM](../Плагины.md#Tkabber-KHIM), позволяющем вводить любые юникодные символы буквально в три нажатия клавиш. Самые главные его достоинства — возможность определения произвольных символов и их ввод с помощью "клавиши композиции" и заданного сочетания двух "обычных" символов. 



Ткаббер версии 0.10.0 содержит этот плагин в качестве встроенного средства. 


Changes to wiki/ru/0.9.x/Эмоциконки.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112

113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208

209
210
211
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/0.9.x/Эмоциконки/index.html)


# 0.9.x/Эмоциконки

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Добавление новых (внешних) комплектов](#Добавление_новых_внешних_комплектов)
* [2 Улучшение поддержки анимированных GIF](#Улучшение_поддержки_анимированных_GIF)
* [3 Настройка высоты окна смайликов](#Настройка_высоты_окна_смайликов)
* [4 Полное искоренение смайликов](#Полное_искоренение_смайликов)
   * [4.1 Массовое клонирование эмоциконок](#Массовое_клонирование_эмоциконок)

## <a id="Добавление_новых_внешних_комплектов"></a>Добавление новых (внешних) комплектов

В двух словах расскажем здесь, как добавлять смайл-паки. Скачайте нужный вам архив и распакуйте
его куда-нибудь. Лучше всего — в домашний директорий, где уже лежит файл конфигурации и
должен находиться каталог emoticons-tkabber. Можете распаковать архив прямо в этот каталог,
но лучше создать для него свой собственный, чтобы при желании можно было включать разные наборы смайликов.

Затем отредактируйте файл **~/.tkabber/config.tcl**, подправив следующую строчку:

    emoteicons::load_dir ~/.tkabber/emoticons-tkabber/new_emoticon_set

где new\_emoticon\_set — название каталога нового смайл-пака. Если такой строки в конфиге нет,
то допишите её, причём она должна быть "обрамлена" таким вот хуком (естественно, если этот хук
прописан, надо просто добавить эту строку куда-нибудь между фигурными скобками):

    hook::add finload_hook {
        emoteicons::load_dir ~/.tkabber/emoticons-tkabber/new_emoticon_set
    }

При новом запуске Ткаббер "подцепит" этот набор, и вы сможете им пользоваться.

Ознакомьтесь также с этой [статьёй](http://tkabber.jabber.ru/node/12). Там описано почти
то же самое (правда, по-английски), а также даны ссылки на некоторые смайл-паки.

## <a id="Улучшение_поддержки_анимированных_GIF"></a>Улучшение поддержки анимированных GIF

За отображение анимированных gif в Tkabber отвечает файл **tkabber\\aniemoteicons\\anigif.tcl**.
Если сравнивать реализацию со [спецификацией формата GIF89a](http://www.r-t-f-m.info/_books/15001/index.php)
(это как раз и есть нужные нам анимированные gif-картинки), то обнаруживаем отсутствие поддержки
вывода с возвратом к предыдущему изображению. Чтобы было понятно, чем это грозит, можно провести эксперимент.

В пустой каталог помещаем три файла:

*  файл **tkabber\\aniemoteicons\\anigif.tcl** из состава дистрибутива Ткаббера,
*  вот этот анимированный gif:

![Изображение:36_10_20.gif](../../images/36_10_20.gif)

*  и скрипт **showgif.tcl** следующего содержания:

        source anigif.tcl
        foreach f [glob -nocomplain *.gif] {
            label .[file rootname $f] -image [::anigif::anigif $f]
            pack .[file rootname $f]
        }

При запуске этого скрипта мы увидим вот такую исчезающую улыбку Чеширского кота © Льюис Кэррол.
Кстати, закиньте в эту папку штуки 4 экземпляра приведённой картинки и посмотрите на загрузку
процессора при воспроизведении.

![Изображение:36_10_20_1.gif](../../images/36_10_20_1.gif)

Как оказалось, это лечится лёгким движением руки. В файле **anigif.tcl** ищем строчки:

                   # Restore to previous - not supported
                   # As recommended, since this is not supported, it is set to blank
                   [set ::anigif::${img}(curimage)] blank

и смело комментируем команду

                   # Restore to previous - not supported
                   # As recommended, since this is not supported, it is set to blank
                   # [set ::anigif::${img}(curimage)] blank

Люди, знающие английский язык, сильно нервничают, ломают руки, кусают ногти, но тоже
комментируют эту команду, хоть и не так смело.

Снова запускаем скрипт **showgif.tcl** и наслаждаемся нормальной анимацией.

P.S. В заголовке файла **anigif.tcl** написано, что при формировании изображений используются
опции **-zoom** и **-subsample** для сохранения прозрачности изображений. Практика показала,
что прозрачность сохраняется и без этого трюка. Вероятно, с тех пор, когда писался
код **anigif.tcl**, поддержка прозрачности в Tk была доработана. Поэтому меняем строки в **anigif.tcl**

     [set ::anigif::${img}(curimage)] copy [lindex $list $idx] -subsample 2 2

                 · · ·

              pic$n$img copy xpic$n$img -zoom 2 2

                 · · ·

             [set ::anigif::${img}(curimage)] copy pic0${img} -subsample 2 2

на

     [set ::anigif::${img}(curimage)] copy [lindex $list $idx] ;#-subsample 2 2

                 · · ·

              pic$n$img copy xpic$n$img ;#-zoom 2 2

                 · · ·

             [set ::anigif::${img}(curimage)] copy pic0${img} ;#-subsample 2 2

Такие изменения должны положительно сказаться на производительности. Запустите снова
скрипт **showgif.tcl** и проверьте загрузку процессора.


Пожелания и замечания направляйте по адресу [xmpp:archimed@jabber.ru](xmpp:archimed@jabber.ru).

[**Archimed**](../Участник_Archimed.md)

## <a id="Настройка_высоты_окна_смайликов"></a>Настройка высоты окна смайликов

Для начала отредактируем файл **/usr/lib/tkabber/emoticons.tcl** — вам потребуется
войти рутом по команде **su**.

**Примечание:** _в svn-версии Ткаббера файл этот поменял своё местоположение, теперь он
находится тут:_ **/path/to/your/svn\_tkabber/plugins/richtext/emoticons.tcl** _и вообще весьма
поменялся внутренне, так что предлагаемый патч работает лишь для стабильной версии 0.9.9 и младше._

В самом начале его идёт процедура `namespace eval emoteicons`:

    namespace eval emoteicons {
       array set emoteicons {}

       variable lasttext ""
       variable lastX
       variable lastY
    }

Добавляем в неё две строчки (до закрывающей фигурной скобки!):

    variable lk_iconsrows
    set emoteicons::lk_iconsrows 0

Затем в том же файле ищем процедуру `proc emoteicons::show_menu {iw}` и после строчки

    set rows [expr {floor(sqrt([llength $imgs]))}]

вставляем следующий текст:

    #if user sets up the variable - use it!
       if {$emoteicons::lk_iconsrows > 0} {
           set rows [expr {$emoteicons::lk_iconsrows}]
         }

Правка файла закончена, сохраняем его. Теперь, выйдя из аккаунта суперпользователя,
отредактируйте файл **~/.tkabber/config.tcl**:

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

    set emoteicons::lk_iconsrows 8

При следующей загрузке Ткаббера удостоверьтесь, что всё правильно: при нажатии Alt-E
должно вывестись окно со смайликами высотой в 8 строчек. Если оно вас не устраивает,
попробуйте увеличить или уменьшить число в конфиге. Зная количество смайликов в наборе,
можно легко подобрать нужную высоту окна, чтобы оно целиком помещалось на экране.

Автор патча — [**LKnight**](../Участник_Lknight.md)

## <a id="Полное_искоренение_смайликов"></a>Полное искоренение смайликов

Это не проблема — добавьте в **config.tcl** следующее:

    hook::add finload_hook {
        array unset emoteicons::emoteicons
    }

Если в вашем конфиге уже есть установка этого хука, то можете прописать

     array unset emoteicons::emoteicons

прямо туда.

Убивец смайликов — [**Kostix**](../Участник_Kostix.md)

### <a id="Массовое_клонирование_эмоциконок"></a>Массовое клонирование эмоциконок

В конце-концов, **config.tcl** представляет собой полноценную программу на Tcl,
и ничто серьёзное ему, следовательно, не чуждо.

Для примера реализуем поддержку ROTFL/LOL-смайлов — таких, которые собеседник использует,
когда ему _ну очень_ смешно:

    hook::add finload_hook {
      namespace eval ::emoteicons {
        variable emoteicons
        set orig :-)
        set dest :-)))))))))))
        for {set i [expr [string first ) $dest] + 1]} \
          {$i < [string length $dest]} \
          {incr i} {
            set emoteicons([string range $dest 0 $i]) $emoteicons($orig)
        }
      }
    }

Данное заклинание связывает картинку от `:-)` с со смайликами: `:-)), :-))), :-)))` и так
далее, включая тот, который помещён в переменную `dest`.

Тикль очень "прозрачен" — постарайтесь разобраться в том, как работает это заклинание
самостоятельно. Если после достижения успеха на этом поприще вы всё ещё будете думать,

что Ткаббер это не ваш выбор, — смело стреляйтесь. (Если вы не достигли успеха, — смело учитесь.)

Смайлики клонировал [**Kostix**](../Участник_Kostix.md).

>



|







|



|
<
<
<

|



|
<
<


|
|

|

|
<



|
<
<
<

|

|
|

|

|

|
|
|
|
|

|
<
<

|

|





|





|
<

|

|
<
<
<


|

|

|

|


|


|

|

|

|


|
|
>

<
<
|



|
<

|
<
<

|

|
|
|
|
|
|


|




|



|

|




|
<

|



|
<
<
<

|



|

|
|


|



|

|



|
<

|
<














|
<

|
|
>
|

<
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18



19
20
21
22
23
24


25
26
27
28
29
30
31
32

33
34
35
36



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53


54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

70
71
72
73



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100


101
102
103
104
105

106
107


108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135

136
137
138
139
140
141



142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163

164
165

166
167
168
169
170
171
172
173
174
175
176
177
178
179
180

181
182
183
184
185
186

[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/0.9.x/Эмоциконки/index.html)


# 0.9.x/Эмоциконки

Материал из Tkabber Wiki.

## <a id="toc"></a>Содержание

* [1 Добавление новых (внешних) комплектов](#Добавление_новых_внешних_комплектов)
* [2 Улучшение поддержки анимированных GIF](#Улучшение_поддержки_анимированных_GIF)
* [3 Настройка высоты окна смайликов](#Настройка_высоты_окна_смайликов)
* [4 Полное искоренение смайликов](#Полное_искоренение_смайликов)
 * [4.1 Массовое клонирование эмоциконок](#Массовое_клонирование_эмоциконок)

## <a id="Добавление_новых_внешних_комплектов"></a>Добавление новых (внешних) комплектов

В двух словах расскажем здесь, как добавлять смайл-паки. Скачайте нужный вам архив и распакуйте его куда-нибудь. Лучше всего — в домашний директорий, где уже лежит файл конфигурации и должен находиться каталог emoticons-tkabber. Можете распаковать архив прямо в этот каталог, но лучше создать для него свой собственный, чтобы при желании можно было включать разные наборы смайликов. 




Затем отредактируйте файл **~/.tkabber/config.tcl**, подправив следующую строчку: 

    emoteicons::load_dir ~/.tkabber/emoticons-tkabber/new_emoticon_set

где new\_emoticon\_set — название каталога нового смайл-пака. Если такой строки в конфиге нет, то допишите её, причём она должна быть "обрамлена" таким вот хуком (естественно, если этот хук прописан, надо просто добавить эту строку куда-нибудь между фигурными скобками): 



    hook::add finload_hook {
    emoteicons::load_dir ~/.tkabber/emoticons-tkabber/new_emoticon_set
    } 

При новом запуске Ткаббер "подцепит" этот набор, и вы сможете им пользоваться. 

Ознакомьтесь также с этой [статьёй](http://tkabber.jabber.ru/node/12). Там описано почти то же самое (правда, по-английски), а также даны ссылки на некоторые смайл-паки. 


## <a id="Улучшение_поддержки_анимированных_GIF"></a>Улучшение поддержки анимированных GIF

За отображение анимированных gif в Tkabber отвечает файл **tkabber\\aniemoteicons\\anigif.tcl**. Если сравнивать реализацию со [спецификацией формата GIF89a](http://www.r-t-f-m.info/_books/15001/index.php) (это как раз и есть нужные нам анимированные gif-картинки), то обнаруживаем отсутствие поддержки вывода с возвратом к предыдущему изображению. Чтобы было понятно, чем это грозит, можно провести эксперимент. 




В пустой каталог помещаем три файла: 

*  файл **tkabber\\aniemoteicons\\anigif.tcl** из состава дистрибутива Ткаббера, 
*  вот этот анимированный gif: 

![Изображение:36_10_20.gif](../../images/36_10_20.gif)  

*  и скрипт **showgif.tcl** следующего содержания: 

    source anigif.tcl
    foreach f [glob -nocomplain *.gif] {
       label .[file rootname $f] -image [::anigif::anigif $f]
       pack .[file rootname $f]
    }

При запуске этого скрипта мы увидим вот такую исчезающую улыбку Чеширского кота © Льюис Кэррол. Кстати, закиньте в эту папку штуки 4 экземпляра приведённой картинки и посмотрите на загрузку процессора при воспроизведении. 



![Изображение:36_10_20_1.gif](../../images/36_10_20_1.gif)  

Как оказалось, это лечится лёгким движением руки. В файле **anigif.tcl** ищем строчки: 

                   # Restore to previous - not supported
                   # As recommended, since this is not supported, it is set to blank
                   [set ::anigif::${img}(curimage)] blank

и смело комментируем команду 

                   # Restore to previous - not supported
                   # As recommended, since this is not supported, it is set to blank
                   # [set ::anigif::${img}(curimage)] blank

Люди, знающие английский язык, сильно нервничают, ломают руки, кусают ногти, но тоже комментируют эту команду, хоть и не так смело. 


Снова запускаем скрипт **showgif.tcl** и наслаждаемся нормальной анимацией. 

P.S. В заголовке файла **anigif.tcl** написано, что при формировании изображений используются опции **-zoom** и **-subsample** для сохранения прозрачности изображений. Практика показала, что прозрачность сохраняется и без этого трюка. Вероятно, с тех пор, когда писался код **anigif.tcl**, поддержка прозрачности в Tk была доработана. Поэтому меняем строки в **anigif.tcl** 




     [set ::anigif::${img}(curimage)] copy [lindex $list $idx] -subsample 2 2
    
                 · · ·
    
              pic$n$img copy xpic$n$img -zoom 2 2
    
                 · · ·
    
             [set ::anigif::${img}(curimage)] copy pic0${img} -subsample 2 2

на 

     [set ::anigif::${img}(curimage)] copy [lindex $list $idx] ;#-subsample 2 2
    
                 · · ·
    
              pic$n$img copy xpic$n$img ;#-zoom 2 2
    
                 · · ·
    
             [set ::anigif::${img}(curimage)] copy pic0${img} ;#-subsample 2 2

 Такие изменения должны положительно сказаться на производительности. Запустите снова скрипт **showgif.tcl** и проверьте загрузку процессора. 

Пожелания и замечания направляйте по адресу `[xmpp:archimed@jabber.ru](xmpp:archimed@jabber.ru)` 



[Archimed](../Участник_Archimed.md) 

## <a id="Настройка_высоты_окна_смайликов"></a>Настройка высоты окна смайликов

Для начала отредактируем файл **/usr/lib/tkabber/emoticons.tcl** — вам потребуется войти рутом по команде **su**. 


_Примечание: в svn-версии Ткаббера файл этот поменял своё местоположение, теперь он находится тут: **/path/to/your/svn\_tkabber/plugins/richtext/emoticons.tcl** и вообще весьма поменялся внутренне, так что предлагаемый патч работает лишь для стабильной версии 0.9.9 и младше._ 



В самом начале его идёт процедура _namespace eval emoteicons_: 

    namespace eval emoteicons {                                                         
       array set emoteicons {}                                                         
                                                                                       
       variable lasttext ""                                                            
       variable lastX                                                                  
       variable lastY                                                                  
    }

Добавляем в неё две строчки (до закрывающей фигурной скобки!): 

    variable lk_iconsrows
    set emoteicons::lk_iconsrows 0

Затем в том же файле ищем процедуру _proc emoteicons::show\_menu {iw}_ и после строчки 

    set rows [expr {floor(sqrt([llength $imgs]))}]

вставляем следующий текст: 

    #if user sets up the variable - use it! 
       if {$emoteicons::lk_iconsrows > 0} {
           set rows [expr {$emoteicons::lk_iconsrows}]
         }

Правка файла закончена, сохраняем его. Теперь, выйдя из аккаунта суперпользователя, отредактируйте файл **~/.tkabber/config.tcl**: 


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

    set emoteicons::lk_iconsrows 8

При следующей загрузке Ткаббера удостоверьтесь, что всё правильно: при нажатии Alt-E должно вывестись окно со смайликами высотой в 8 строчек. Если оно вас не устраивает, попробуйте увеличить или уменьшить число в конфиге. Зная количество смайликов в наборе, можно легко подобрать нужную высоту окна, чтобы оно целиком помещалось на экране. 




Автор патча — [Участник:lknight](../Участник_Lknight.md) 

## <a id="Полное_искоренение_смайликов"></a>Полное искоренение смайликов

Это не проблема — добавьте в **config.tcl** следующее: 

    hook::add finload_hook { 
     array unset emoteicons::emoteicons
    }

Если в вашем конфиге уже есть установка этого хука, то можете прописать 

     array unset emoteicons::emoteicons

прямо туда. 

Убивец смайликов — [Участник:kostix](../Участник_Kostix.md) 

### <a id="Массовое_клонирование_эмоциконок"></a>Массовое клонирование эмоциконок

В конце-концов, **config.tcl** представляет собой полноценную программу на Tcl, и ничто серьёзное ему, следовательно, не чуждо. 


Для примера реализуем поддержку ROTFL/LOL-смайлов — таких, которые собеседник использует, когда ему _ну очень_ смешно: 


    hook::add finload_hook {
      namespace eval ::emoteicons {
        variable emoteicons
        set orig :-)
        set dest :-)))))))))))
        for {set i [expr [string first ) $dest] + 1]} \
          {$i < [string length $dest]} \
          {incr i} {
            set emoteicons([string range $dest 0 $i]) $emoteicons($orig)
        }
      }
    }

Данное заклинание связывает картинку от `:-)` с со смайликами: `:-)), :-))), :-)))` и так далее, включая тот, который помещён в переменную `dest`. 


Тикль очень "прозрачен" — постарайтесь разобраться в том, как работает это заклинание самостоятельно. Если после достижения успеха на этом поприще вы всё ещё будете думать, что Ткаббер это не ваш выбор, — смело стреляйтесь. (Если вы не достигли успеха, — смело учитесь.) 

Смайлики клонировал [Kostix](../Участник_Kostix.md). 



Changes to wiki/ru/Config.tcl.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54


55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396


[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Config.tcl)


# Config.tcl

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Общие сведения](#Общие_сведения)
* [2 Немного о синтаксисе тикля](#Немного_о_синтаксисе_тикля)
* [3 Временное исключение кусков кода конфигурации](#Временное_исключение_кусков_кода_конфигурации)
* [4 Хуки](#Хуки)
* [5 Тестирование конфигурации](#Тестирование_конфигурации)
   * [5.1 Как запустить второй Ткаббер, не помешав первому](#Как_запустить_второй_Ткаббер_не_помешав_первому)
      * [5.1.1 Подключение с тем же логином](#Подключение_с_тем_же_логином)
      * [5.1.2 Подключение с другим логином (или к другому серверу)](#Подключение_с_другим_логином_или_к_другому_серверу)
   * [5.2 Тестирование конфигурации "вживую"](#Тестирование_конфигурации_вживую)

## <a id="Общие_сведения"></a>Общие сведения
Прежде чем читать эту статью, подумайте, достаточно ли вы хорошо представляете себе, что такое
файл **config.tcl** (в частности, где Ткаббер ищет его при старте); если нет, начните с
чтения [**этой статьи**](Config.tcl_для_начинающих.md).

Чтобы понять место и роль файла **config.tcl** в процедуре загрузки Ткаббера,
прочитайте [**ещё одну статью**](Загрузка_настроек.md).

А после прочтения данного опуса можно со знанием дела переходить к [**"книге рецептов"**](Нетривиальные_настройки.md).

Файл конфигурации — **config.tcl** — читается на ранней стадии запуска Ткаббера и поэтому
позволяет влиять на большинство аспектов работы этой программы.

Файл конфигурации _выполняется_ интерпретатором тикля, который исполняет код Ткаббера. То есть этот
файл является полноценной программой на тикле. Этот аспект следует хорошо прочувствовать, имея в виду
беспрецедентный динамизм языка Tcl, позволяющий, среди прочего, переопределять процедуры Ткаббера
и "перепаковывать" его окна.

Наиболее важные способы влияния на Ткаббер из его конфига можно условно разделить на три группы:

*  Установка предопределённых (документированных) переменных Ткаббера. Например, переменная `debug_lvls`
   управляет "темами" отладочных сообщений Ткаббера, а `ifacetk::options(use_tabbar)` — стилем интерфейса
   (0 — многооконный, 1 — "с табами"). Эти переменные описаны в официальной документации к Ткабберу.
*  Переопределение процедур Ткаббера. Например, таким образом
   можно [**"деактивировать" IRC-команду чата** `/exec`](Нетривиальные_настройки.md#Запрет_IRC-команды__exec_в_окнах_чата),
   которую некоторые считают опасной, или переделать реакцию Ткаббера на запрос `jabber:iq:last`
   (см. код [**плагина "Last Activity"**](Плагины.md#Last_Activity)).
*  Изменение привязок событий Tk (нажатий комбинаций клавиш, к примеру) к определённым действиям.
*  Просто выполнение некоторого кода, который может, к примеру, менять изначальный "лук и фил" Ткаббера.
*  Установка обработчиков определённых _хуков_ (см. ниже). Внутри этих обработчиков можно делать
   интересные вещи, описанные в предыдущих пунктах.

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

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



Ткаббер читает свой файл конфигурации ровно _один раз за сеанс_ своей работы. Механизма "перечитывания"
файла конфигурации _нет_ (и не будет). Это означает, что после внесения изменений в файл
конфигурации Ткаббер нужно перезапустить (а лучше для начала запустить его вторую копию
"рядом" — см. ниже обсуждение тестирования конфигурации).

Ткаббер прекрасно обходится без **config.tcl** — как он, так и "парный" файл **custom.tcl** не
нужны Ткабберу для запуска и работы. Поэтому, если у Вас нет файла **config.tcl** в условленном
месте, просто создайте его сами.

## <a id="Немного_о_синтаксисе_тикля"></a>Немного о синтаксисе тикля
Вообще, если вы собираетесь заняться "продвинутым" конфигурированием Ткаббера всерьёз
(а не просто применять [**готовые рецепты**](Нетривиальные_настройки.md) не задумываясь),
подумайте о самообразовании. Для начала можно порекомендовать такую последовательность действий:

1.  Изучить [туториал](http://www.tcl.tk/man/tcl8.5/tutorial/tcltutorial.html);
1.  Изучить ["додекалогию"](http://wiki.tcl.tk/10259);
1.  Почитать [классику](http://www.beedub.com/book) (переведённую и
    на [язык родных осин](http://www.ozon.ru/context/detail/id/1820838/)).

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

##### Любые пробельные символы являются разделителем слов 

Это означает, что символы логически цельных строк (они именуются в тикле "словами"), содержащих пробелы, нужно _группировать_.

##### Для группировки используются ограничители {} и "" 

Внутри {} не выполняется никакая интерпретация содержимого, внутри "" тикль выполняет подстановку переменных (нотация `$имя_переменной`), выполняет команды (нотация `[команда аргументы...]`) и раскрывает "escape-последовательности" (нотация `\X`, где "X" — спецсимвол).

##### Путевые имена файлов в Windows могут содержать прямые слэши 

То есть имя "C:/Program files/FrobozzMagic 2000" является вполне допустимым.

##### Строка без пробелов и группирующих символов также интерполируется 

То есть используйте прямые слэши под Windows, если данная строка — путевое имя файла.

Следствия этих правил:

*  Всегда заключайте имена файлов в "" или {}, если эти имена содержат пробелы.
*  Предпочтительно заключайте такие имена в {} чтобы подавить интерпретацию содержимого строки.
*  Если вы всё-таки хотите использовать "", указывайте прямые слэши в путевых именах
   файлов Windows — это убережёт имена от раскрытия "escape-последовательностей", вводимых
   обратными слэшами.
*  Также можно обойтись вообще без группирующих символов, но тогда нужно удваивать все обратные
   слэши и "искейпить" пробелы обратными слэшами.

Примеры:

    # Путь в {} — подавляется любая интерпретация содержимого:
    set somepath {C:\Documents and Settings\Vassily Petrovich}

    # Путь в "" + прямые слэши = тот же эффект:
    set someotherpath "C:/Program files/Новая папка"

    # Группирующие символы не нужны — имя не содержит пробелов;
    # Однако слэши — прямые, ибо такие строки интерполируются:
    set thethirdpath C:/TMP

    # Нет группирующих символов ⇒ танцы с "искейпингом":
    set falsepath C:\\Program\ Files\\Common\ Files\\Woohoo

**Обратный слэш, за которым сразу следует перевод строки, обозначает "продлённую" строку**

То есть запись

    command arg1 \
        arg2 arg3

полностью эквивалентна записи

    command arg1 arg2 arg3

Продление строк используется для улучшения читабельности.

**Ссылки на элементы массивов не должны содержать пробелов**

Имя переменной в такой, к примеру, команде присваивания

    set ifacetk::options(use_tabbar) false
    # ifacetk::options(use_tabbar) — имя переменной

вовсе не означает, что скобки являются какой-то _операцией_, как могли бы предположить программисты на ALGOL-подобных языках. Скобки являются частью имени переменной, хоть и обрабатываются особым образом (запись `foo(bar)` означает переменную с именем "bar" в массиве с именем "foo"), поэтому нельзя писать так:

    set ifacetk::options (use_tabbar) false

или так:

    ifacetk::options( use_tabbar ) false

## <a id="Временное_исключение_кусков_кода_конфигурации"></a>Временное исключение кусков кода конфигурации
Для временного исключения некоторого куска кода длиннее одной строчки удобно использовать стандартную
идиому Tcl — условный оператор **if** с ложным условием, который компенсирует отсутствие в тикле
"блочных" комментариев (в стиле "сишного" /\* ... \*/), например:

Нужно отключить некую настройку, которая введена примерно так:

    hook::add postload_hook {
        do this
        now do that
    }

Запрещаем выполнение этого кода так:

    if 0 {
    hook::add postload_hook {
        do this
        now do that
    }
    }

При следующем старте Ткаббера всё, что находится внутри блоков `if 0 { ... }`, выполнено не будет.

Отдельные строчки удобнее комментировать символом "\#", который вводит однострочный комментарий
(который, впрочем, может быть продлён на следующую строку при помощи "\\", за которым сразу же
следует перевод строки).

Имейте в виду весьма необычное поведение комментариев в тикле: в отличие от "классических" языков,
в тикле _комментарии обрабатываются во время **выполнения** программы,_ а не являются чем-то вроде
директив препроцессора. Невнимание к этому факту может привести как к ошибкам на стадии чтения конфига, например:

    missing close-brace: possible unbalanced brace in comment

так и к ошибкам во время выполнения, например:

    invalid command name "}"

Объясним "на пальцах": есть такой код:

    proc foo {a b} {
        if {some conditional expr} {
            ...
        }
    }

и вы хотите изменить условное выражение, закомментировав старое.

Разумный на первый взгляд способ

    proc foo {a b} {
        # if {some conditional expr} {
        if {some other cond expr} {
            ...
        }
    }

вызовет ошибку интерпретатора на этапе формирования аргументов для
команды [proc](http://www.tcl.tk/man/tcl8.4/TclCmd/proc.htm), так как в комментарии есть
несбалансированный символ "{", но этот комментарий игнорируется до фактического выполнения
точки кода, в которой он находится, и символ "{" в комментарии "уравновешивается" символом "}",
закрывающем тело процедуры, а скобка, открывающая тело процедуры, оказывается без пары.

Правильным решением будет, к примеру, такое решение:

    # if {some conditional expr} { } <-- балансирующая скобка
    if {some other cond expr} {
        ...
    }

или такое:.

    # if {some conditional expr} {
    if {some other cond expr} {
        ...
    }
    # } <-- балансирующая скобка

или такое:

    if {some other cond expr} { # {some conditional expr}
        ...
    }

Хардкорные подробности этих "странностей" описаны [тут](http://wiki.tcl.tk/462).

## <a id="Хуки"></a>Хуки
Большинство полезных настроек использует механизм "хуков" — обработчиков различных событий
Ткаббера; подробнее о них можно прочитать [**тут**](Загрузка_настроек.md). Здесь приведены
некоторые неочевидные особенности работы с ними.

На каждый хук можно "навесить" произвольное количество обработчиков.

С другой стороны, код для _одних и тех же_ хуков можно объединять. К примеру, вы хотите
использовать два рецепта, которые вешают свой код на один и тот же хук:

    hook::add finload_hook {
        do_this
        do_that
    }

    ...

    hook:add finload_hook {
        foo -config bar
    }

ничего не мешает вам написать в конфиг:

    hook::add finload_hook {
        do_this
        do_that
        foo -config bar
    }

То есть по сути это вопрос стиля.

Имейте, однако, в виду, что обработчики хуков могут иметь приоритет, и объединять
код обработчиков, имеющих разный приоритет, естественно, нельзя.

Код обработчиков хуков выполняется интерпретатором тикля при помощи
команды [eval](http://tcl.tk/man/tcl8.4/TclCmd/eval.htm). То есть, если мы имеем, к примеру,

    hook::add finload_hook {
        frobnicate foo
    }

то этот код в соответствующий момент будет выполнен примерно так:

    eval {
        frobnicate foo
    }

что в данном случае приведёт к выполнению команды

    fronbnicate foo

Ситуация усложняется в том случае, когда коду хука передаются  некоторые _параметры_ (аргументы).
Пример такого хука — `open_chat_post_hook`: он принимает параметры **chatid** и **type** (описание
хука см. в официальной документации). Текущие значения параметров хука "присоединяются" (или
"дописываются через пробел", если так мыслить удобнее) к коду хука, после чего полученная
конструкция вычисляется с помощью **eval**. В этом случае выполнение, скажем, такой
реализации обработчика данного хука:

    hook::add open_chat_post_hook {
        frobnicate foo
    }

будет произведено так:

    eval {
        frobnicate foo
    } some_chatid some_type

что "развернётся" командой **eval** в следующий код:

    frobnicate foo some_chatid some_type

В подавляющем случае это не то, чего хотел достичь автор хука.

Решение проблемы обработчиков "параметризованных хуков" — реализация их в виде _процедуры_ тикля. Пример:

    proc tweak_something {chatid type} {
        frobnicate foo
    }
    hook::add open_chat_post_hook tweak_something

будет выполнено как

    eval tweak_something some_chatid some_type

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

## <a id="Тестирование_конфигурации"></a>Тестирование конфигурации
Несмотря на то, что подавляющее большинство настроек Ткаббера "применяются" сразу, без перезагрузок,
некоторые настройки требуют перезапуска Ткаббера. К ним относятся, к примеру, настройки шрифтов
(в версиях Ткаббера ниже 0.11.0 либо у приверженцев Tk 8.4), подключение "цветовых схем",
изменение стиля интерфейса (многооконный/с табами) и другие. Также перезапуска Ткаббера требует
установка/обновление некоторого пакета Tcl, который может использоваться Ткаббером.

Удобнее (и правильнее) всего не перезапускать Ткаббер, а запускать "рядом" его вторую копию.

Достоинства этого способа:

*  Не мешает оставаться на связи, так как основной Ткаббер продолжает работать;
*  Может потребоваться несколько раундов редактирования и перезапуска Ткаббера чтобы "допилить"
   настройку, которую вы делаете, до нужной вам кондиции.

Недостатки:

*  Ткаббер прожорлив и медленно стартует, поэтому на некоторых очень старых машинах запуск второй
   копии Ткаббера нежелателен;
*  При запуске второй копии Ткаббера, если вы собираетесь соединяться из неё с сервером,
   требуется соблюдать некоторые меры предосторожности, о которых рассказано ниже.

### <a id="Как_запустить_второй_Ткаббер_не_помешав_первому"></a>Как запустить второй Ткаббер, не помешав первому

Большинство требуемых мер предосторожности требуется только если вы собираетесь подключаться к
серверу из второй копии Ткаббера.

"Общая" проблема — одна: соревнование при записи настроек. Суть её в том, что все N запущенных
"рядом" Ткабберов будут сохранять настройки в один и тот же файл **custom.tcl** (и некоторые другие).
Ткаббер использует весьма прямолинейный, но разумный метод сохранения настроек: при изменении некоторой
настройки файл **custom.tcl** тут же перезаписывается, отражая новое состояние конфигурации.
Понятно, что после редактировании настроек параллельно в нескольких копиях Ткаббера, сохранённым
останется набор настроек того Ткаббера, в котором он менялся последним по времени.

Имейте в виду, что это относится только к сохранению настроек "для текущей и следующих сессий";
установка настройки "только для текущей сессии" не вызывает перезапись **custom.tcl**.

Теперь перейдём к мерам предосторожности, которые нужно соблюдать при одновременном соединении
с сервером из нескольких копий Ткаббера.

Они чуть отличаются для случев:

*  Подключение к тому же серверу с тем же логином;
*  Подключение к другому серверу, или к тому же, но с другим логином.

#### <a id="Подключение_с_тем_же_логином"></a>Подключение с тем же логином

*  _Обязательно_ в окне логина поставьте [**ресурс**](Ткаббер_ЧаВо.md#Ресурс) отличный от
   ресурса основного Ткаббера — это позволит Вам создать разные _сессии_ (сеансы работы) с сервером;
*  Там же можете выбрать [**приоритет**](Ткаббер_ЧаВо.md#Приоритет), меньший, чем у основной копии.
   Для чего это может пригодиться, читайте в указанной заметке про приоритеты.

Теперь можете подключиться — будет создано второе подключение с тем же логином (к тому же
аккаунту), но одно будет являться другой сессией и не будет "пересекаться" с первой.

Прежде чем продолжить тестирование, усвойте ещё несколько вещей:

*  Подключаясь к тем же конференциям, в которых вы сидите из основной копии Ткаббера, выбирайте
   другой ник — ваш уже занят (вами);
*  При таком подключении поведение сообщений, приходящих от гейтов, зависит
   от [**приоритетов**](Ткаббер_ЧаВо.md#Приоритет) запущенных копий Ткаббера.

#### <a id="Подключение_с_другим_логином_или_к_другому_серверу"></a>Подключение с другим логином (или к другому серверу)

В этом случае единственное, о чём нужно думать, это регистрация на гейтах в другие системы быстрого
обмена сообщениями: к примеру, если как на первом, так и на втором аккаунте вы зарегистрированы на
гейте в ICQ, логин на второй аккаунт также подключит вас к гейту, что вызовет отключение от гейта
первого аккаунта. Причина этого не в гейте, а в самой "вражеской" системе быстрого обмена сообщениями,
которая не позволяет делать одновременные подключения к одному своему аккаунту с разных
IP-адресов (которыми будут выступать IP-адреса гейтов).

Если вы столкнулись с этой проблемой, временно отключитесь ("отлогиньтесь") от гейтов в основном Ткаббере.

### <a id="Тестирование_конфигурации_вживую"></a>Тестирование конфигурации "вживую"

![(!)](../images/Hammer.png) **Сделать:** написать раздел

Пока в качестве примера можно изучить [**это**](Шрифты.md#Быстрый_подбор_шрифтов).



>












|
|
|
|

|
|
<
<

|
<

|

|
<

|
<
<
<

|

|
<
<
|
<
<
<
|
|
|
<

|
<

|
>
>

<
<
<
<
<
|
<
<

|
|
<
<

|
|
|
<

|
<

|

|

|

|

|

|

|

|

|

|
|
|
<
<
|
<

|



|


|



|



|

|


|

|



|

|

|




|



|



|
|
<
<

|


|
|


|



|
|



|

|
<
<

|
<
<



|



|


|
|
|


|

|


|
|
|
|


|
<
<
<
<

|



|


|



|



|


|


|

|
|
<
<

|

|
<


|
|

|

|

|


|


|
|
|


|

|
<

|
<


|


|


|


|



|
<
<
<
<
<


|


|


|


|



|

|


|



|



|

|
|
<
<
<
<

|

|

|
|
<

|

|
<
|
<

|

|
<

|
<
<
<
<
<

|
<

|
<

|

|
|

|

|
<
|
<

|
<

|

|
<
|
<

|

|
<
<
<
<
<

|

|

|

|
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21


22
23

24
25
26
27

28
29



30
31
32
33


34



35
36
37

38
39

40
41
42
43
44





45


46
47
48


49
50
51
52

53
54

55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76


77

78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123


124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143


144
145


146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172




173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198


199
200
201
202

203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225

226
227

228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243





244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275




276
277
278
279
280
281
282

283
284
285
286

287

288
289
290
291

292
293





294
295

296
297

298
299
300
301
302
303
304
305
306

307

308
309

310
311
312
313

314

315
316
317
318





319
320
321
322
323
324
325
326
327
328
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Config.tcl)


# Config.tcl

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Общие сведения](#Общие_сведения)
* [2 Немного о синтаксисе тикля](#Немного_о_синтаксисе_тикля)
* [3 Временное исключение кусков кода конфигурации](#Временное_исключение_кусков_кода_конфигурации)
* [4 Хуки](#Хуки)
* [5 Тестирование конфигурации](#Тестирование_конфигурации)
 * [5.1 Как запустить второй Ткаббер, не помешав первому](#Как_запустить_второй_Ткаббер_не_помешав_первому)
  * [5.1.1 Подключение с тем же логином](#Подключение_с_тем_же_логином)
  * [5.1.2 Подключение с другим логином (или к другому серверу)](#Подключение_с_другим_логином_или_к_другому_серверу)
 * [5.2 Тестирование конфигурации "вживую"](#Тестирование_конфигурации_вживую)

# <a id="Общие_сведения"></a>Общие сведения
Прежде чем читать эту статью, подумайте, достаточно ли вы хорошо представляете себе, что такое файл **config.tcl** (в частности, где Ткаббер ищет его при старте); если нет, начните с чтения [этой статьи](Config.tcl_для_начинающих.md). 



Чтобы понять место и роль файла **config.tcl** в процедуре загрузки Ткаббера, прочитайте [ещё одну статью](Загрузка_настроек.md). 


А после прочтения данного опуса можно со знанием дела переходить к ["книге рецептов"](Нетривиальные_настройки.md). 

Файл конфигурации — **config.tcl** — читается на ранней стадии запуска Ткаббера и поэтому позволяет влиять на большинство аспектов работы этой программы. 


 Файл конфигурации _выполняется_ интерпретатором тикля, который исполняет код Ткаббера. То есть этот файл является полноценной программой на тикле. Этот аспект следует хорошо прочувствовать, имея в виду беспрецедентный динамизм языка Tcl, позволяющий, среди прочего, переопределять процедуры Ткаббера и "перепаковывать" его окна. 




Наиболее важные способы влияния на Ткаббер из его конфига можно условно разделить на три группы: 

*  Установка предопределённых (документированных) переменных Ткаббера. Например, переменная `debug_lvls` управляет "темами" отладочных сообщений Ткаббера, а `ifacetk::options(use_tabbar)` — стилем интерфейса (0 — многооконный, 1 — "с табами"). Эти переменные описаны в официальной документации к Ткабберу. 


*  Переопределение процедур Ткаббера. Например, таким образом можно ["деактивировать" IRC-команду чата `/exec`](Нетривиальные_настройки.md#Запрет_IRC-команды__exec_в_окнах_чата), которую некоторые считают опасной, или переделать реакцию Ткаббера на запрос `jabber:iq:last` (см. код [плагина "Last Activity"](Плагины.md#Last_Activity)). 



*  Изменение привязок событий Tk (нажатий комбинаций клавиш, к примеру) к определённым действиям. 
*  Просто выполнение некоторого кода, который может, к примеру, менять изначальный "лук и фил" Ткаббера. 
*  Установка обработчиков определённых _хуков_ (см. ниже). Внутри этих обработчиков можно делать интересные вещи, описанные в предыдущих пунктах. 


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


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

 Ткаббер читает свой файл конфигурации ровно _один раз за сеанс_ своей работы. Механизма "перечитывания" файла конфигурации _нет_ (и не будет). Это означает, что после внесения изменений в файл конфигурации Ткаббер нужно перезапустить (а лучше для начала запустить его вторую копию "рядом" — см. ниже обсуждение тестирования конфигурации). 






Ткаббер прекрасно обходится без **config.tcl** — как он, так и "парный" файл **custom.tcl** не нужны Ткабберу для запуска и работы. Поэтому, если у Вас нет файла **config.tcl** в условленном месте, просто создайте его сами. 



# <a id="Немного_о_синтаксисе_тикля"></a>Немного о синтаксисе тикля
Вообще, если вы собираетесь заняться "продвинутым" конфигурированием Ткаббера всерьёз (а не просто применять [готовые рецепты](Нетривиальные_настройки.md) не задумываясь), подумайте о самообразовании. Для начала можно порекомендовать такую последовательность действий: 



1.  Изучить [туториал](http://www.tcl.tk/man/tcl8.5/tutorial/tcltutorial.html); 
1.  Изучить ["эндекалогию"](http://wiki.tcl.tk/14940); 
1.  Почитать [классику](http://www.beedub.com/book) (переведённую и на [язык родных осин](http://www.ozon.ru/context/detail/id/1820838/)). 


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


 Любые пробельные символы являются разделителем слов 

 Это означает, что символы логически цельных строк (они именуются в тикле "словами"), содержащих пробелы, нужно _группировать_. 

 Для группировки используются ограничители {} и "" 

 Внутри {} не выполняется никакая интерпретация содержимого, внутри "" тикль выполняет подстановку переменных (нотация `$имя_переменной`), выполняет команды (нотация `[команда аргументы...]`) и раскрывает "escape-последовательности" (нотация `\X`, где "X" — спецсимвол). 

 Путевые имена файлов в Windows могут содержать прямые слэши 

 То есть имя "C:/Program files/FrobozzMagic 2000" является вполне допустимым. 

 Строка без пробелов и группирующих символов также интерполируется 

 То есть используйте прямые слэши под Windows, если данная строка — путевое имя файла. 

Следствия этих правил: 

*  Всегда заключайте имена файлов в "" или {}, если эти имена содержат пробелы. 
*  Предпочтительно заключайте такие имена в {} чтобы подавить интерпретацию содержимого строки. 
*  Если вы всё-таки хотите использовать "", указывайте прямые слэши в путевых именах файлов Windows — это убережёт имена от раскрытия "escape-последовательностей", вводимых обратными слэшами. 


*  Также можно обойтись вообще без группирующих символов, но тогда нужно удваивать все обратные слэши и "искейпить" пробелы обратными слэшами. 


Примеры: 

    # Путь в {} — подавляется любая интерпретация содержимого:
    set somepath {C:\Documents and Settings\Vassily Petrovich}
    
    # Путь в "" + прямые слэши = тот же эффект:
    set someotherpath "C:/Program files/Новая папка"
    
    # Группирующие символы не нужны — имя не содержит пробелов;
    # Однако слэши — прямые, ибо такие строки интерполируются:
    set thethirdpath C:/TMP
    
    # Нет группирующих символов ⇒ танцы с "искейпингом":
    set falsepath C:\\Program\ Files\\Common\ Files\\Woohoo

**Обратный слэш, за которым сразу следует перевод строки, обозначает "продлённую" строку** 

То есть запись 

    command arg1 \
      arg2 arg3

полностью эквивалентна записи 

    command arg1 arg2 arg3

Продление строк используется для улучшения читабельности. 

**Ссылки на элементы массивов не должны содержать пробелов** 

Имя переменной в такой, к примеру, команде присваивания 

    set ifacetk::options(use_tabbar) false
    # ifacetk::options(use_tabbar) — имя переменной

вовсе не означает, что скобки являются какой-то _операцией_, как могли бы предположить программисты на ALGOL-подобных языках. Скобки являются частью имени переменной, хоть и обрабатываются особым образом (запись `foo(bar)` означает переменную с именем "bar" в массиве с именем "foo"), поэтому нельзя писать так: 

    set ifacetk::options (use_tabbar) false

или так: 

    ifacetk::options( use_tabbar ) false

# <a id="Временное_исключение_кусков_кода_конфигурации"></a>Временное исключение кусков кода конфигурации
Для временного исключения некоторого куска кода длиннее одной строчки удобно использовать стандартную идиому Tcl — условный оператор **if** с ложным условием, который компенсирует отсутствие в тикле "блочных" комментариев (в стиле "сишного" /\* ... \*/), например: 



Нужно отключить некую настройку, которая введена примерно так: 

    hook::add postload_hook {
      do this
      now do that
    }

Запрещаем выполнение этого кода так: 

    if 0 {
    hook::add postload_hook {
      do this
      now do that
    }
    }

При следующем старте Ткаббера всё, что находится внутри блоков `if 0 { ... }`, выполнено не будет. 

Отдельные строчки удобнее комментировать символом "\#", который вводит однострочный комментарий (который, впрочем, может быть продлён на следующую строку при помощи "\\", за которым сразу же следует перевод строки). 



Имейте в виду весьма необычное поведение комментариев в тикле: в отличие от "классических" языков, в тикле _комментарии обрабатываются во время **выполнения** программы,_ а не являются чем-то вроде директив препроцессора. Невнимание к этому факту может привести как к ошибкам на стадии чтения конфига, например: 



    missing close-brace: possible unbalanced brace in comment

так и к ошибкам во время выполнения, например: 

    invalid command name "}"

Объясним "на пальцах": есть такой код: 

    proc foo {a b} {
      if {some conditional expr} {
      ...
      }
    }

и вы хотите изменить условное выражение, закомментировав старое. 

Разумный на первый взгляд способ 

    proc foo {a b} {
      # if {some conditional expr} {
      if {some other cond expr} {
      ...
      }
    }

вызовет ошибку интерпретатора на этапе формирования аргументов для команды [proc](http://www.tcl.tk/man/tcl8.4/TclCmd/proc.htm), так как в комментарии есть несбалансированный символ "{", но этот комментарий игнорируется до фактического выполнения точки кода, в которой он находится, и символ "{" в комментарии "уравновешивается" символом "}", закрывающем тело процедуры, а скобка, открывающая тело процедуры, оказывается без пары. 





Правильным решением будет, к примеру, такое решение: 

    # if {some conditional expr} { } <-- балансирующая скобка
    if {some other cond expr} {
    ...
    }

или такое:. 

    # if {some conditional expr} {
    if {some other cond expr} {
    ...
    }
    # } <-- балансирующая скобка

или такое: 

    if {some other cond expr} { # {some conditional expr}
    ...
    }

Хардкорные подробности этих "странностей" описаны [тут](http://wiki.tcl.tk/462). 

# <a id="Хуки"></a>Хуки
Большинство полезных настроек использует механизм "хуков" — обработчиков различных событий Ткаббера; подробнее о них можно прочитать [тут](Загрузка_настроек.md). Здесь приведены некоторые неочевидные особенности работы с ними. 



На каждый хук можно "навесить" произвольное количество обработчиков. 

С другой стороны, код для _одних и тех же_ хуков можно объединять. К примеру, вы хотите использовать два рецепта, которые вешают свой код на один и тот же хук: 


    hook::add finload_hook {
      do_this
      do_that
    }
    
    ...
    
    hook:add finload_hook {
      foo -config bar
    }

ничего не мешает вам написать в конфиг: 

    hook::add finload_hook {
      do_this
      do_that
      foo -config bar
    }

То есть по сути это вопрос стиля. 

Имейте, однако, в виду, что обработчики хуков могут иметь приоритет, и объединять код обработчиков, имеющих разный приоритет, естественно, нельзя. 


Код обработчиков хуков выполняется интерпретатором тикля при помощи команды [eval](http://tcl.tk/man/tcl8.4/TclCmd/eval.htm). То есть, если мы имеем, к примеру, 


    hook::add finload_hook {
      frobnicate foo
    }

то этот код в соответствующий момент будет выполнен примерно так: 

    eval {
      frobnicate foo
    }

что в данном случае приведёт к выполнению команды 

    fronbnicate foo

Ситуация усложняется в том случае, когда коду хука передаются  некоторые _параметры_ (аргументы). Пример такого хука — `open_chat_post_hook`: он принимает параметры **chatid** и **type** (описание хука см. в официальной документации). Текущие значения параметров хука "присоединяются" (или "дописываются через пробел", если так мыслить удобнее) к коду хука, после чего полученная конструкция вычисляется с помощью **eval**. В этом случае выполнение, скажем, такой реализации обработчика данного хука: 






    hook::add open_chat_post_hook {
      frobnicate foo
    }

будет произведено так: 

    eval {
      frobnicate foo
    } some_chatid some_type

что "развернётся" командой **eval** в следующий код: 

    frobnicate foo some_chatid some_type

В подавляющем случае это не то, чего хотел достичь автор хука. 

Решение проблемы обработчиков "параметризованных хуков" — реализация их в виде _процедуры_ тикля. Пример: 

    proc tweak_something {chatid type} {
      frobnicate foo
    }
    hook::add open_chat_post_hook tweak_something

будет выполнено как 

    eval tweak_something some_chatid some_type

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

# <a id="Тестирование_конфигурации"></a>Тестирование конфигурации
Несмотря на то, что подавляющее большинство настроек Ткаббера "применяются" сразу, без перезагрузок, некоторые настройки требуют перезапуска Ткаббера. К ним относятся, к примеру, настройки шрифтов (в версиях Ткаббера ниже 0.11.0 либо у приверженцев Tk 8.4), подключение "цветовых схем", изменение стиля интерфейса (многооконный/с табами) и другие. Также перезапуска Ткаббера требует установка/обновление некоторого пакета Tcl, который может использоваться Ткаббером. 





Удобнее (и правильнее) всего не перезапускать Ткаббер, а запускать "рядом" его вторую копию. 

Достоинства этого способа: 

*  Не мешает оставаться на связи, так как основной Ткаббер продолжает работать; 
*  Может потребоваться несколько раундов редактирования и перезапуска Ткаббера чтобы "допилить" настройку, которую вы делаете, до нужной вам кондиции. 


Недостатки: 

*  Ткаббер прожорлив и медленно стартует, поэтому на некоторых очень старых машинах запуск второй копии Ткаббера нежелателен; 

*  При запуске второй копии Ткаббера, если вы собираетесь соединяться из неё с сервером, требуется соблюдать некоторые меры предосторожности, о которых рассказано ниже. 


## <a id="Как_запустить_второй_Ткаббер_не_помешав_первому"></a>Как запустить второй Ткаббер, не помешав первому

Большинство требуемых мер предосторожности требуется только если вы собираетесь подключаться к серверу из второй копии Ткаббера. 


"Общая" проблема — одна: соревнование при записи настроек. Суть её в том, что все N запущенных "рядом" Ткабберов будут сохранять настройки в один и тот же файл **custom.tcl** (и некоторые другие). Ткаббер использует весьма прямолинейный, но разумный метод сохранения настроек: при изменении некоторой настройки файл **custom.tcl** тут же перезаписывается, отражая новое состояние конфигурации. Понятно, что после редактировании настроек параллельно в нескольких копиях Ткаббера, сохранённым останется набор настроек того Ткаббера, в котором он менялся последним по времени. 






Имейте в виду, что это относится только к сохранению настроек "для текущей и следующих сессий"; установка настройки "только для текущей сессии" не вызывает перезапись **custom.tcl**. 


Теперь перейдём к мерам предосторожности, которые нужно соблюдать при одновременном соединении с сервером из нескольких копий Ткаббера. 


Они чуть отличаются для случев: 

*  Подключение к тому же серверу с тем же логином; 
*  Подключение к другому серверу, или к тому же, но с другим логином. 

### <a id="Подключение_с_тем_же_логином"></a>Подключение с тем же логином

*  _Обязательно_ в окне логина поставьте [ресурс](Ткаббер_ЧаВо.md#Ресурс) отличный от ресурса основного Ткаббера — это позволит Вам создать разные _сессии_ (сеансы работы) с сервером; 

*  Там же можете выбрать [приоритет](Ткаббер_ЧаВо.md#Приоритет), меньший, чем у основной копии. Для чего это может пригодиться, читайте в указанной заметке про приоритеты. 


Теперь можете подключиться — будет создано второе подключение с тем же логином (к тому же аккаунту), но одно будет являться другой сессией и не будет "пересекаться" с первой. 


Прежде чем продолжить тестирование, усвойте ещё несколько вещей: 

*  Подключаясь к тем же конференциям, в которых вы сидите из основной копии Ткаббера, выбирайте другой ник — ваш уже занят (вами); 

*  При таком подключении поведение сообщений, приходящих от гейтов, зависит от [приоритетов](Ткаббер_ЧаВо.md#Приоритет) запущенных копий Ткаббера. 


### <a id="Подключение_с_другим_логином_или_к_другому_серверу"></a>Подключение с другим логином (или к другому серверу)

В этом случае единственное, о чём нужно думать, это регистрация на гейтах в другие системы быстрого обмена сообщениями: к примеру, если как на первом, так и на втором аккаунте вы зарегистрированы на гейте в ICQ, логин на второй аккаунт также подключит вас к гейту, что вызовет отключение от гейта первого аккаунта. Причина этого не в гейте, а в самой "вражеской" системе быстрого обмена сообщениями, которая не позволяет делать одновременные подключения к одному своему аккаунту с разных IP-адресов (которыми будут выступать IP-адреса гейтов). 






Если вы столкнулись с этой проблемой, временно отключитесь ("отлогиньтесь") от гейтов в основном Ткаббере. 

## <a id="Тестирование_конфигурации_вживую"></a>Тестирование конфигурации "вживую"

![(!)](../images/Hammer.png) **Сделать:** написать раздел 

Пока в качестве примера можно изучить [это](Шрифты.md#Быстрый_подбор_шрифтов). 


Changes to wiki/ru/Config.tcl_для_начинающих.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133


[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Config.tcl_для_начинающих)


# Config.tcl для начинающих

Материал из Tkabber Wiki.

## <a id="toc"></a>Содержание

* [1 Введение](#Введение)
* [2 Что?](#Что)
* [3 Зачем?](#Зачем)
* [4 Где?](#Где)
* [5 Как?](#Как)
* [6 Что дальше?](#Что_дальше)

## <a id="Введение"></a>Введение
К сожалению, пользователи по разным причинам часто совершают целый букет довольно странных ошибок,
относящихся к нахождению и правке файла конфигурации Ткаббера.

Поэтому была написана эта статья. Здесь даны самые базовые сведения о файле конфигурации Ткаббера.

## <a id="Что"></a>Что?
Для хранения _нетривиальных_ настроек пользователя в Ткаббере предусмотрен ровно _один_ файл.

Он называется **config.tcl**.

## <a id="Зачем"></a>Зачем?
Обязательно семь раз подумайте: _нужно ли вам **вообще**_ лезть в этот файл, ведь _подавляющее большинство_
аспектов конфигурации Ткаббера настраивается через встроенный интерфейс конфигурации, доступный через пункт
главного меню **Tkabber → Настройки**.

Файл config.tcl предназначен для "ковыряния" умелыми пользователями, которые:

*  понимают, что делают;
*  способны _внимательно и вдумчиво_ читать документацию.

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

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

## <a id="Где"></a>Где?
При запуске Ткаббер ищет файл config.tcl _ровно в одном месте — в каталоге своих **настроек.**_

Это нужно понять совершенно чётко: в самом _коде_ Ткаббера нет и быть не может никаких файлов
конфигурации! Даже если вы обнаружите в каталоге, куда поставлен Ткаббер, тридцать файлов с
названием config.tcl, знайте: _это **не те** файлы!_

Местоположения каталога настроек Ткаббера зависит от операционной системы, хотя
и [**поддаётся настройке пользователем**](Config_dir.md).

В Unix этим каталогом всегда является

    ~/.tkabber

В Windows ситуация сложнее:

*  В версиях Ткаббера начиная с 0.10.0 на системах Windows каталог настроек хранится в области
   файловой системы, известной как "application data":
 *  На Windows 2000 и Windows XP это

            C:\Documents and Settings\USER\Application Data\Tkabber

 *  На Windows Vista и Windows 7 это

            C:\Users\USER\Tkabber

Здесь — **USER** это имя пользователя, зарегистрировавшегося в системе. Также начиная с версии 0.10.0,
Ткаббер "знает" про переменную окружения **TKABBER\_HOME** — если она есть, для хранения настроек
используется путь, указанный в ней. Подробности можно узнать [**в этой статье**](Config.tcl.md) или
в [разделе "Configuration" официальной документации](http://tkabber.jabber.ru/files/doc/tkabber.html#s.configuration).

*  В версиях Ткаббера до 0.9.9 включительно настройки хранятся в каталоге

        ~/.tkabber

а символ "~", означающий "домашний каталог пользователя", зависит от версии Windows. На
Windows XP это обычно

    C:\Documents and Settings\USER\.tkabber

где **USER** это имя пользователя, зарегистрировавшегося в системе. Под Windows 9x "~"
раскрывается в имя системного диска, и каталог оказывается чем-то вроде

    C:\.TKABBER

Подробно о механизме "раскрытия тильды" можно прочитать [**здесь**](Настройка_Ткаббера__азы_и_глубже.md).

## <a id="Как"></a>Как?
Для начала уясните себе, что _файл настроек **не нужен** Ткабберу!_ То есть он вовсе не обязан существовать.

Поэтому, если вы не нашли файл config.tcl в каталоге настроек Ткаббера, но уверены, что
определили этот каталог правильно (если был произведён хотя бы один сеанс работы с Ткаббером,
в этом каталоге будет присутствовать файл custom.tcl, а также могут быть файлы: nick\_colors.tcl,
headlines.tcl, каталог logs и т. д.), не паникуйте и не пытайтесь искать этот файл в "исходниках"
Ткаббера — его там нет. Вам придётся создать файл config.tcl самим. Это несложно.

config.tcl представляет собой простой текстовый файл в системной кодировке. В Windows
это — **Windows-1251**, в Unix она зависит от настроек локали.

Таким образом, как создавать, так и редактировать этот файл в Windows можно простым
"Блокнотом". При этом, однако, следует помнить о некоторых возможных проблемах:

*  Файл config.tcl должен сохраняться в "Кодировке ANSI" (термин "Блокнота"). Эта кодировка
   выбирается по умолчанию при сохранении только что созданного файла, так что беспокоиться особо не о чем.
*  Как "Проводник Windows", так и "Блокнот", пытаются ревностно блюсти тип файла — "текстовый" у
   текстовых файлов; а он в Windows определяется расширением ".txt". Поэтому следите за
   расширением файла! Оно должно быть ".tcl", а не ".txt" или, допустим, ".tcl.txt". Не давайте
   "Блокноту" и "Проводнику" поменять расширение, боритесь за него!

Строго говоря, файл config.tcl представляет собой полноценную программу на
языке [Tcl](http://ru.wikipedia.org/wiki/Tcl), которая _выполняется_ Ткаббером. Однако,
тикль — весьма прост в том плане, что имеет очень простой синтаксис, и его конструкции
читаются "практически по-английски".

Несколько простых правил, формулировка которых не вполне точна технически, но подойдёт для нашей цели:

*  Одна строка — одна _команда._
*  Если первым непробельным символом в строке является "\#", то эта строка является комментарием.
*  Фигурные скобки ("{" и "}") ограничивают _блоки,_ которые в тикле именуются "словами".
   Также слова ограничиваются двойными кавычками.

Помещая в конфиг готовый кусок настроек (например, "подсмотренный" в других статьях этой вики),
помещайте его на "свободное место" — вне всяких блоков. Например, просто дописывайте в конец файла.

## <a id="Что_дальше"></a>Что дальше?
Дальше — больше:

*  [**Полное описание**](Config_dir.md) алгоритма определения расположения каталога настроек в современных версиях Ткаббера.
*  [**Рассказ**](Настройка_Ткаббера__азы_и_глубже.md) о странном символе "~", переменных окружения и прочих захватывающих вещах.
*  [**"Config.tcl для уже начавших"**](Config.tcl.md).
*  [**Нетривиальные настройки**](Нетривиальные_настройки.md).



>














|
|
<

|

|
|

|

|
|
<
<

|

|
|

|
<

|
<

|
|

|
<
<

|
<

|



|

|
<
|
<
|
|
|
<
|

|
<
<
<

|

|

|
<



|
<



|

|
|

|
<
<
<
<

|
<

|
<

|
<
|
<
<
<

|
<
<
<

|

|
|
|
<

|
<

|
|

|
|
|
|
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

19
20
21
22
23
24
25
26
27
28


29
30
31
32
33
34
35

36
37

38
39
40
41
42


43
44

45
46
47
48
49
50
51
52

53

54
55
56

57
58
59



60
61
62
63
64
65

66
67
68
69

70
71
72
73
74
75
76
77
78




79
80

81
82

83
84

85



86
87



88
89
90
91
92
93

94
95

96
97
98
99
100
101
102
103
104
105
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Config.tcl_для_начинающих)


# Config.tcl для начинающих

Материал из Tkabber Wiki.

## <a id="toc"></a>Содержание

* [1 Введение](#Введение)
* [2 Что?](#Что)
* [3 Зачем?](#Зачем)
* [4 Где?](#Где)
* [5 Как?](#Как)
* [6 Что дальше?](#Что_дальше)

# <a id="Введение"></a>Введение
К сожалению, пользователи по разным причинам часто совершают целый букет довольно странных ошибок, относящихся к нахождению и правке файла конфигурации Ткаббера. 


Поэтому была написана эта статья. Здесь даны самые базовые сведения о файле конфигурации Ткаббера. 

# <a id="Что"></a>Что?
Для хранения _нетривиальных_ настроек пользователя в Ткаббере предусмотрен ровно _один_ файл. 

Он называется **config.tcl**. 

# <a id="Зачем"></a>Зачем?
Обязательно семь раз подумайте: _нужно ли вам **вообще**_ лезть в этот файл, ведь _подавляющее большинство_ аспектов конфигурации Ткаббера настраивается через встроенный интерфейс конфигурации, доступный через пункт главного меню **Tkabber → Настройки**. 



Файл config.tcl предназначен для "ковыряния" умелыми пользователями, которые: 

*  понимают, что делают; 
*  способны _внимательно и вдумчиво_ читать документацию. 

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


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


# <a id="Где"></a>Где?
При запуске Ткаббер ищет файл config.tcl _ровно в одном месте — в каталоге своих **настроек.**_ 

Это нужно понять совершенно чётко: в самом _коде_ Ткаббера нет и быть не может никаких файлов конфигурации! Даже если вы обнаружите в каталоге, куда поставлен Ткаббер, тридцать файлов с названием config.tcl, знайте: _это **не те** файлы!_ 



Местоположения каталога настроек Ткаббера зависит от операционной системы, хотя и [поддаётся настройке пользователем](Config_dir.md). 


В Unix этим каталогом всегда является 

    ~/.tkabber

В Windows ситуация сложнее: 

*  В версиях Ткаббера начиная с 0.10.0 на системах Windows каталог настроек хранится в области файловой системы, известной как "application data": 

 *  На Windows 2000 и Windows XP это 

    C:\Documents and Settings\USER\Application Data\Tkabber
 
 *  На Windows Vista и Windows 7 это 

    C:\Users\USER\Tkabber

Здесь — **USER** это имя пользователя, зарегистрировавшегося в системе. Также начиная с версии 0.10.0, Ткаббер "знает" про переменную окружения **TKABBER\_HOME** — если она есть, для хранения настроек используется путь, указанный в ней. Подробности можно узнать [в этой статье](Config.tcl.md) или в [разделе "Configuration" официальной документации](http://tkabber.jabber.ru/files/doc/tkabber.html#s.configuration). 




*  В версиях Ткаббера до 0.9.9 включительно настройки хранятся в каталоге 

    ~/.tkabber

а символ "~", означающий "домашний каталог пользователя", зависит от версии Windows. На Windows XP это обычно 


    C:\Documents and Settings\USER\.tkabber

где **USER** это имя пользователя, зарегистрировавшегося в системе. Под Windows 9x "~" раскрывается в имя системного диска, и каталог оказывается чем-то вроде 


    C:\.TKABBER

Подробно о механизме "раскрытия тильды" можно прочитать [здесь](Настройка_Ткаббера__азы_и_глубже.md). 

# <a id="Как"></a>Как?
Для начала уясните себе, что _файл настроек **не нужен** Ткабберу!_ То есть он вовсе не обязан существовать. 

Поэтому, если вы не нашли файл config.tcl в каталоге настроек Ткаббера, но уверены, что определили этот каталог правильно (если был произведён хотя бы один сеанс работы с Ткаббером, в этом каталоге будет присутствовать файл custom.tcl, а также могут быть файлы: nick\_colors.tcl, headlines.tcl, каталог logs и т. д.), не паникуйте и не пытайтесь искать этот файл в "исходниках" Ткаббера — его там нет. Вам придётся создать файл config.tcl самим. Это несложно. 





config.tcl представляет собой простой текстовый файл в системной кодировке. В Windows это — **Windows-1251**, в Unix она зависит от настроек локали. 


Таким образом, как создавать, так и редактировать этот файл в Windows можно простым "Блокнотом". При этом, однако, следует помнить о некоторых возможных проблемах: 


*  Файл config.tcl должен сохраняться в "Кодировке ANSI" (термин "Блокнота"). Эта кодировка выбирается по умолчанию при сохранении только что созданного файла, так что беспокоиться особо не о чем. 

*  Как "Проводник Windows", так и "Блокнот", пытаются ревностно блюсти тип файла — "текстовый" у текстовых файлов; а он в Windows определяется расширением ".txt". Поэтому следите за расширением файла! Оно должно быть ".tcl", а не ".txt" или, допустим, ".tcl.txt". Не давайте "Блокноту" и "Проводнику" поменять расширение, боритесь за него! 




Строго говоря, файл config.tcl представляет собой полноценную программу на языке [Tcl](http://ru.wikipedia.org/wiki/Tcl), которая _выполняется_ Ткаббером. Однако, тикль — весьма прост в том плане, что имеет очень простой синтаксис, и его конструкции читаются "практически по-английски". 




Несколько простых правил, формулировка которых не вполне точна технически, но подойдёт для нашей цели: 

*  Одна строка — одна _команда._ 
*  Если первым непробельным символом в строке является "\#", то эта строка является комментарием. 
*  Фигурные скобки ("{" и "}") ограничивают _блоки,_ которые в тикле именуются "словами". Также слова ограничиваются двойными кавычками. 


Помещая в конфиг готовый кусок настроек (например, "подсмотренный" в других статьях этой вики), помещайте его на "свободное место" — вне всяких блоков. Например, просто дописывайте в конец файла. 


# <a id="Что_дальше"></a>Что дальше?
Дальше — больше: 

*  [Полное описание](Config_dir.md) алгоритма определения расположения каталога настроек в современных версиях Ткаббера. 
*  [Рассказ](Настройка_Ткаббера__азы_и_глубже.md) о странном символе "~", переменных окружения и прочих захватывающих вещах. 
*  ["Config.tcl для уже начавших"](Config.tcl.md). 
*  [Нетривиальные настройки](Нетривиальные_настройки.md). 


Changes to wiki/ru/Config_dir.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293

[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Config_dir/index.html)


# Config dir

Материал из Tkabber Wiki

**Внимание!** реализация механизмов, обсуждаемых здесь, интегрирована в транк Ткаббера
начиная с ревизии 859 (05 янв 2007). Реализованный механизм изложен [**ниже**](Config_dir.md#Рабочий_вариант).

Также был обновлён раздел \#4 "Configuration" документации Ткаббера — читайте tkabber.html на своей системе.

## <a id="toc"></a>Содержание

* [1 Введение](#Введение)
* [2 Инфа по системам](#Инфа_по_системам)
* [3 Проблемы](#Проблемы)
* [4 Рабочий вариант](#Рабочий_вариант)
* [5 Добавка про SHGetSpecialFolderPath](#Добавка_про_SHGetSpecialFolderPath)
* [6 Тестовая реализация SHGetSpecialFolderPath через Ffidl](#Тестовая_реализация_SHGetSpecialFolderPath_через_Ffidl)
   * [6.1 Скрипт](#Скрипт)
   * [6.2 Замечания](#Замечания)
      * [6.2.1 ANSI (8-bit) vs Unicode (UTF-16)](#ANSI_8-bit_vs_Unicode_UTF-16)
      * [6.2.2 Реализация в Ткаббере](#Реализация_в_Ткаббере)

## <a id="Введение"></a>Введение

Обсуждение новой схемы поддержки каталога конфигурации Ткаббера.

Идея: отказаться от схемы **~/.tkabber** в Windows по причине того, что при существующей
схеме каталог конфигурации на любой Windows-системе оказывается не там, где предполагается
хранить конфигурацию на данной системе.

Конкретно нас интересует т.н. каталог "application data" ("appdata"). Предполагается
хранить настройки Ткаббера в подкаталоге "Tkabber" этого каталога.

Получить путь каталога "appdata" можно тремя способами:

*  Переменная окружения **APPDATA**:
 *  Появилась только в Windows 2000; присутствует во всей последующей линейке, включая Vista.

*  Переменная реестра `HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\AppData`:
 *  Имеет место как минимум в Win98 SE;
 *  Присутутвует во всей последующей линейке, _однако в Vista весь ключ "Shell Folders" помечен как "устаревший",_ однако, он содержит правильные значения.

*  Процедура Win32 API "SHGetSpecialFolderPath":
 *  On MSDN: [http://msdn2.microsoft.com/en-us/library/ms647816.aspx](http://msdn2.microsoft.com/en-us/library/ms647816.aspx)
 *  Since {Win98 (SE?), Win2000} + on {WinNT 4+, Win95+ with IE4 installed}.

## <a id="Инфа_по_системам"></a>Инфа по системам

*  Win98 (SE):
 *  Каталог: `%windir%\Application Data`;
 *  **%APPDATA%** — **нет;**
 *  Ключ "Shell Folders" — есть;
 *  Примечание: уже есть **%windir%**.

*  WinNT 4.0 (русская):
 *  Каталог: `%USERPROFILE%\Данные`;
 *  **%APPDATA%** — **нет;**
 *  Ключ "Shell Folders" — есть;
 *  Примечание: кривое значение %HOMEPATH% (корень загрузочного диска), в правильное место
    показывает %USERPROFILE% (%windir%\\Profiles\\\<USERNAME>).

*  w2k, w2k3, XP:
 *  Каталог: **%APPDATA%**;
 *  Ключ "Shell Folders" — есть, но, откровенно говоря, он всегда был deprecated;

*  Vista:
 *  Каталог: **%APPDATA%**;
 *  Ключ "Shell Folders" — есть, _но deprecated._

**(TODO): 95? ME?**

## <a id="Проблемы"></a>Проблемы

Наиболее разумным представляется вызов SHGetSpecialFolderPath, однако это не самый простой путь:

*  Данную функциональность в готовом виде обеспечивает пакет [TWAPI](http://twapi.sourceforge.net/shell.html#get_shell_folder), однако, он:
 *  Не поставляется вместе с дистром AS;
 *  Весит >600к в архиве, что будет препятствовать его попаданию в старпак и вообще отобьёт охоту у пользователей его устанавливать.

*  Возможно "цеплять" DLL, предоставляющую данный вызов API, например, при помощи [Ffidl](http://wiki.tcl.tk/2?Ffidl), однако:
 *  Этот пакет так же не поставляется с AS;
 *  Прямой вызов функции из DLL выглядит "не очень".

Путь с реестром и окружением не имеет такой "идеологической чистоты", как вызов SHGetSpecialFolderPath.

*  Недостаток: прямое чтение реестра и окружения в условиях огульного изменения своих же
   "стандартов" соответствующей фирмой является "ненадёжным"; кроме того, в ОС, следующей за
   Vista, соотв. раздел реестра может быть изъят полностью.
*  Достоинства:
 *  Работа с переменными окружения доступна непосредственно;
 *  Пакет **registry** для работы с реестром входит в "ядро" виндовой версии тикля,
    то есть очень велика вероятность его доступности даже в старпаке;
 *  Обсуждаемый ключ реестра доступен на всех исследованных системах.

## <a id="Рабочий_вариант"></a>Рабочий вариант

При старте:

*  Ткаббер проверяет наличие переменной окружения **TKABBER\_HOME**, если она есть, Ткаббер использует
   её как путь до каталога своих настроек.
*  Если её нет, то:
 *  В Unix каталог настроек устанавливается в **~/.tkabber**.
 *  В Windows применяются описанные выше эвристики:

 1.  Проверяется переменная окружения **APPDATA**;
 1.  Проверяется ключ реестра "Shell Folders", если доступен пакет **registry**;
 1.  К полученному каталогу добавляется элемент пути "Tkabber", и этот каталог используется как каталог настроек.

Вопросы:

*  Возможно, стоит сначала смотреть в реестр, а потом — в окружение;
*  Нужно предусмотреть разумный Fallback для различных версий Windows; идея **~/.tkabber** для
   этого случая представляется не очень разумной.

[_Juriks_](Участник_Juriks.md), посовещавшись с [**Kostix**](Участник_Kostix.md), предлагает:
Запускать несколько Ткабберов с разными настройками с помощью таких вот скриптов:

    @echo off
    set TKABBER_HOME=c:\home\vasya_pupkin
    start tkabber.exe

То есть искать папку с конфигами в таком порядке:

1.  переменная окружения **TKABBER\_HOME**
1.  реестр
1.  прочие переменные оружения

[Kostix](Участник_Kostix.md) комментирует: реализованный в альфе Ткаббера вариант
сначала ищет переменную окружения **APPDATA**, и только в случае неудачи
смотрит реестр. Причины простые:

*  Пакет **registry**, хоть и входит в "ядро" виндового тикля, технически может
   отсутствовать (в ткаббер-паке или старпаке, к примеру), а вот помешать тиклю работать
   с окружением не может никакая конфигурация его рантайма;
*  Загрузка пакета — это доп. время для старта + доп. расход памяти. А пакет **registry**
   пока что больше нигде в Ткаббере не используется.
*  Реестр ничем не лучше переменной **APPDATA** в плане надёжности: точно так же, как в
   системе может быть кривое значение **APPDATA**, может быть крив ключ **Shell Folders**
   реестра. Только вызов соотв. функции Win32 API из **shell32.dll** даёт гарантии. Но он
   требует "неядерного" (и отсутствующего в дистре от AS) пакета **Ffidl**. Поэтому
   включение соответствующего кода в Ткаббер — вопрос сложный...

## <a id="Добавка_про_SHGetSpecialFolderPath"></a>Добавка про SHGetSpecialFolderPath

[SHGetSpecialFolderPath](http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shgetspecialfolderpath.asp)
«замещена» процедурой
[SHGetFolderPath](http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shgetfolderpath.asp)
начиная с w2k, хотя и доступна на всех системах. Для нас это ничего не значит,
так как нам для совместимости со старыми OS необходимо использовать старую версию.

На современных системах SHGetSpecialFolderPath реализована в **shell32.dll**. Также
эта функция содержится в _redistributable_ library **SHFolder.dll**, которая
может включаться в поставку продукта и худо-бедно работать на любой OS. Starpack это,
пожалуй, не спасёт, а вот Pack и выше может спокойно её использовать.

## <a id="Тестовая_реализация_SHGetSpecialFolderPath_через_Ffidl"></a>Тестовая реализация SHGetSpecialFolderPath через Ffidl

### <a id="Скрипт"></a>Скрипт

Скрипт, печатающий путевое имя каталога "application data" в Windows.

Создаваемая команда Tcl "SHGetSpecialFolderPath" способна возвращать имя
любого стандартного каталога Windows (заданного соотв. ключом "CSIDL\_...").

В случае неуспеха команда возвращает пустую строку.

    #! /usr/bin/tclsh

    package require Ffidl

    ffidl::callout dll_SHGetSpecialFolderPath \
        {int pointer-utf16 int int} int \
        [ffidl::symbol shell32.dll SHGetSpecialFolderPathW]

    proc SHGetSpecialFolderPath {what create} {
        array set CSIDL {
            CSIDL_DESKTOP   0
            CSIDL_INTERNET  1
            CSIDL_PROGRAMS  2
            CSIDL_CONTROLS  3
            CSIDL_PRINTERS  4
            CSIDL_PERSONAL  5
            CSIDL_FAVORITES 6
            CSIDL_STARTUP   7
            CSIDL_RECENT    8
            CSIDL_SENDTO    9
            CSIDL_BITBUCKET 10
            CSIDL_STARTMENU 11
            CSIDL_DESKTOPDIRECTORY  16
            CSIDL_DRIVES    17
            CSIDL_NETWORK   18
            CSIDL_NETHOOD   19
            CSIDL_FONTS     20
            CSIDL_TEMPLATES 21
            CSIDL_COMMON_STARTMENU  22
            CSIDL_COMMON_PROGRAMS   23
            CSIDL_COMMON_STARTUP    24
            CSIDL_COMMON_DESKTOPDIRECTORY   25
            CSIDL_APPDATA   26
            CSIDL_PRINTHOOD 27
            CSIDL_LOCAL_APPDATA 28
            CSIDL_ALTSTARTUP    29
            CSIDL_COMMON_ALTSTARTUP 30
            CSIDL_COMMON_FAVORITES  31
            CSIDL_INTERNET_CACHE    32
            CSIDL_COOKIES   33
            СSIDL_HISTORY   34
            CSIDL_COMMON_APPDATA    35
            CSIDL_WINDOWS   36
            CSIDL_SYSTEM    37
            CSIDL_PROGRAM_FILES 38
            СSIDL_MYPICTURES    39
            CSIDL_PROFILE       40
            СSIDL_SYSTEMX86     41
            CSIDL_PROGRAM_FILESX86      42
            CSIDL_PROGRAM_FILES_COMMON  43
            СSIDL_PROGRAM_FILES_COMMONX86   44
            CSIDL_COMMON_TEMPLATES      45
            CSIDL_COMMON_DOCUMENTS      46
            CSIDL_COMMON_ADMINTOOLS     47
            CSIDL_ADMINTOOLS    48
            CSIDL_CONNECTIONS   49
            CSIDL_COMMON_MUSIC  53
            CSIDL_COMMON_PICTURES   54
            CSIDL_COMMON_VIDEO  55
            CSIDL_RESOURCES     56
            CSIDL_RESOURCES_LOCALIZED   57
            CSIDL_COMMON_OEM_LINKS      58
            CSIDL_CDBURN_AREA   59
            CSIDL_COMPUTERSNEARME   61
            CSIDL_FLAG_DONT_VERIFY  0x4000
            CSIDL_FLAG_CREATE   0x8000
            CSIDL_FLAG_MASK     0xFF00
        }

        set bCreat [expr {$create ? 1 : 0}]

        set path [string repeat \u0000 300] ;# MAX_PATH is actually 260

        set ok [dll_SHGetSpecialFolderPath 0 $path $CSIDL($what) $bCreat]

        if {$ok} {
            set ix [string first \u0000 $path]
            if {$ix > 0} {
                return [string range $path 0 [expr {$ix - 1}]]
            }
        } else {
            return {}
        }
    }

    puts "appdata: [SHGetSpecialFolderPath CSIDL_APPDATA false]"

Запускать следует через **tclsh**, например, так:

    C:\> tclsh sh.tcl

**wish** не имеет открытого канала **stdout** и **puts** там ничего интересного не делает.

Можете так же поменять последнюю строку (с **puts**) на

    tk_messageBox -message [SHGetSpecialFolderPath CSIDL_APPDATA false]

и запускать скрипт "просто", например, двойным щелчком мышью на его файле в Explorer.

### <a id="Замечания"></a>Замечания

Вписал [статью в тиклевое вики](http://wiki.tcl.tk/17492).

#### <a id="ANSI_8-bit_vs_Unicode_UTF-16"></a>ANSI (8-bit) vs Unicode (UTF-16)

*  Не совсем ясно, доступна ли юникодная версия (SHGetSpecialFolderPathW)
   в старых Win9x. Похоже, что доступна.
*  Не совсем ясно поведение Ffild по отношению к строкам в UTF-16: приёмный
   буфер должен быть MAX\_PATH _символов_? Тогда что имеется в виду:
   тиклевые символы UTF-8 или виндовые символы UTF-16?

В любом случае, ANSI версия используется так:

    ffidl::callout dll_SHGetSpecialFolderPath \
        {int pointer-utf8 int int} int \
        [ffidl::symbol shell32.dll SHGetSpecialFolderPathA]

#### <a id="Реализация_в_Ткаббере"></a>Реализация в Ткаббере

Потребует более серьёзного подхода:

*  Пространство имён **config**;
*  "Пустая" реализация SHGetSpecialFolderPath для платформ, отличных от Windows;
*  Отслеживание успешного завершения создания callout'а для SHGetSpecialFolderPath
   с созданием пустой реализации (см. выше) в случае ошибки.


>





|
<

|









|
|
|
|



|

|
<
<

|
<

|

|
|
|
|
|
|
|
|
|
|



|
|
|
|
|
|
|
|
|
|
|
<
|
|
|
|
|
|
|
|

|



|

|
|
|
|
|
|
|

|

|
<
<
|
|
|
<
|



|

|
<
|
|
|
|
|
|
|

|

|
|
<

<
|





|

|
|
|

|
<
<

|
<
<
|
<
|
<
<
<
<



|
<
<
<
<

|
<
<
<





|

|
<

|


|

|

|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|


|



|

|



|



|



|
<
|
<
<

|


|
|



|

|
|
|
|
>
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29


30
31

32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84


85
86
87

88
89
90
91
92
93
94

95
96
97
98
99
100
101
102
103
104
105
106

107

108
109
110
111
112
113
114
115
116
117
118
119
120


121
122


123

124




125
126
127
128




129
130



131
132
133
134
135
136
137
138

139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247

248


249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Config_dir/index.html)


# Config dir

Материал из Tkabber Wiki

**Внимание!** реализация механизмов, обсуждаемых здесь, интегрирована в транк Ткаббера начиная с ревизии 859 (05 янв 2007). Реализованный механизм изложен [ниже](Config_dir.md#Рабочий_вариант). 


Также был обновлён раздел \#4 "Configuration" документации Ткаббера — читайте tkabber.html на своей системе. 

## <a id="toc"></a>Содержание

* [1 Введение](#Введение)
* [2 Инфа по системам](#Инфа_по_системам)
* [3 Проблемы](#Проблемы)
* [4 Рабочий вариант](#Рабочий_вариант)
* [5 Добавка про SHGetSpecialFolderPath](#Добавка_про_SHGetSpecialFolderPath)
* [6 Тестовая реализация SHGetSpecialFolderPath через Ffidl](#Тестовая_реализация_SHGetSpecialFolderPath_через_Ffidl)
 * [6.1 Скрипт](#Скрипт)
 * [6.2 Замечания](#Замечания)
  * [6.2.1 ANSI (8-bit) vs Unicode (UTF-16)](#ANSI_8-bit_vs_Unicode_UTF-16)
  * [6.2.2 Реализация в Ткаббере](#Реализация_в_Ткаббере)

## <a id="Введение"></a>Введение

Обсуждение новой схемы поддержки каталога конфигурации Ткаббера. 

Идея: отказаться от схемы **~/.tkabber** в Windows по причине того, что при существующей схеме каталог конфигурации на любой Windows-системе оказывается не там, где предполагается хранить конфигурацию на данной системе. 



Конкретно нас интересует т.н. каталог "application data" ("appdata"). Предполагается хранить настройки Ткаббера в подкаталоге "Tkabber" этого каталога. 


Получить путь каталога "appdata" можно тремя способами: 

*  Переменная окружения **APPDATA**: 
 *  Появилась только в Windows 2000; присутствует во всей последующей линейке, включая Vista. 
 
*  Переменная реестра ` HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\AppData`: 
 *  Имеет место как минимум в Win98 SE; 
 *  Присутутвует во всей последующей линейке, _однако в Vista весь ключ "Shell Folders" помечен как "устаревший",_ однако, он содержит правильные значения. 
 
*  Процедура Win32 API "SHGetSpecialFolderPath": 
 *  On MSDN: [http://msdn2.microsoft.com/en-us/library/ms647816.aspx](http://msdn2.microsoft.com/en-us/library/ms647816.aspx) 
 *  Since {Win98 (SE?), Win2000} + on {WinNT 4+, Win95+ with IE4 installed}. 

## <a id="Инфа_по_системам"></a>Инфа по системам

*  Win98 (SE): 
 *  Каталог: `%windir%\Application Data`; 
 *  **%APPDATA%** — **нет;** 
 *  Ключ "Shell Folders" — есть; 
 *  Примечание: уже есть **%windir%**. 
 
*  WinNT 4.0 (русская): 
 *  Каталог: `%USERPROFILE%\Данные`; 
 *  **%APPDATA%** — **нет;** 
 *  Ключ "Shell Folders" — есть; 
 *  Примечание: кривое значение %HOMEPATH% (корень загрузочного диска), в правильное место показывает %USERPROFILE% (%windir%\\Profiles\\\<USERNAME>). 

 
*  w2k, w2k3, XP: 
 *  Каталог: **%APPDATA%**; 
 *  Ключ "Shell Folders" — есть, но, откровенно говоря, он всегда был deprecated; 
 
*  Vista: 
 *  Каталог: **%APPDATA%**; 
 *  Ключ "Shell Folders" — есть, _но deprecated._ 

**(TODO): 95? ME?** 

## <a id="Проблемы"></a>Проблемы

Наиболее разумным представляется вызов SHGetSpecialFolderPath, однако это не самый простой путь: 

*  Данную функциональность в готовом виде обеспечивает пакет [TWAPI](http://twapi.sourceforge.net/shell.html#get_shell_folder), однако, он: 
 *  Не поставляется вместе с дистром AS; 
 *  Весит >600к в архиве, что будет препятствовать его попаданию в старпак и вообще отобьёт охоту у пользователей его устанавливать. 
 
*  Возможно "цеплять" DLL, предоставляющую данный вызов API, например, при помощи [Ffidl](http://wiki.tcl.tk/2?Ffidl), однако: 
 *  Этот пакет так же не поставляется с AS; 
 *  Прямой вызов функции из DLL выглядит "не очень". 

Путь с реестром и окружением не имеет такой "идеологической чистоты", как вызов SHGetSpecialFolderPath. 

*  Недостаток: прямое чтение реестра и окружения в условиях огульного изменения своих же "стандартов" соответствующей фирмой является "ненадёжным"; кроме того, в ОС, следующей за Vista, соотв. раздел реестра может быть изъят полностью. 


*  Достоинства: 
 *  Работа с переменными окружения доступна непосредственно; 
 *  Пакет **registry** для работы с реестром входит в "ядро" виндовой версии тикля, то есть очень велика вероятность его доступности даже в старпаке; 

 *  Обсуждаемый ключ реестра доступен на всех исследованных системах. 

## <a id="Рабочий_вариант"></a>Рабочий вариант

При старте: 

*  Ткаббер проверяет наличие переменной окружения **TKABBER\_HOME**, если она есть, Ткаббер использует её как путь до каталога своих настроек. 

*  Если её нет, то: 
 *  В Unix каталог настроек устанавливается в **~/.tkabber**. 
 *  В Windows применяются описанные выше эвристики: 
 
 1.  Проверяется переменная окружения **APPDATA**; 
 1.  Проверяется ключ реестра "Shell Folders", если доступен пакет **registry**; 
 1.  К полученному каталогу добавляется элемент пути "Tkabber", и этот каталог используется как каталог настроек. 

Вопросы: 

*  Возможно, стоит сначала смотреть в реестр, а потом — в окружение; 
*  Нужно предусмотреть разумный Fallback для различных версий Windows; идея **~/.tkabber** для этого случая представляется не очень разумной. 



[Juriks](Участник_Juriks.md), посовещавшись с [kostix](Участник_Kostix.md), предлагает: Запускать несколько Ткабберов с разными настройками с помощью таких вот скриптов: 

    @echo off
    set TKABBER_HOME=c:\home\vasya_pupkin
    start tkabber.exe

То есть искать папку с конфигами в таком порядке: 

1.  переменная окружения **TKABBER\_HOME** 
1.  реестр 
1.  прочие переменные оружения 

[kostix](Участник_Kostix.md) комментирует: реализованный в альфе Ткаббера вариант сначала ищет переменную окружения **APPDATA**, и только в случае неудачи смотрит реестр. Причины простые: 



*  Пакет **registry**, хоть и входит в "ядро" виндового тикля, технически может отсутствовать (в ткаббер-паке или старпаке, к примеру), а вот помешать тиклю работать с окружением не может никакая конфигурация его рантайма; 


*  Загрузка пакета — это доп. время для старта + доп. расход памяти. А пакет **registry** пока что больше нигде в Ткаббере не используется. 

*  Реестр ничем не лучше переменной **APPDATA** в плане надёжности: точно так же, как в системе может быть кривое значение **APPDATA**, может быть крив ключ **Shell Folders** реестра. Только вызов соотв. функции Win32 API из **shell32.dll** даёт гарантии. Но он требует "неядерного" (и отсутствующего в дистре от AS) пакета **Ffidl**. Поэтому включение соответствующего кода в Ткаббер — вопрос сложный... 





## <a id="Добавка_про_SHGetSpecialFolderPath"></a>Добавка про SHGetSpecialFolderPath

[SHGetSpecialFolderPath](http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shgetspecialfolderpath.asp) «замещена» процедурой [SHGetFolderPath](http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shgetfolderpath.asp) начиная с w2k, хотя и доступна на всех системах. Для нас это ничего не значит, так как нам для совместимости со старыми OS необходимо использовать старую версию. 





На современных системах SHGetSpecialFolderPath реализована в **shell32.dll**. Также эта функция содержится в _redistributable_ library **SHFolder.dll**, которая может включаться в поставку продукта и худо-бедно работать на любой OS. Starpack это, пожалуй, не спасёт, а вот Pack и выше может спокойно её использовать. 




## <a id="Тестовая_реализация_SHGetSpecialFolderPath_через_Ffidl"></a>Тестовая реализация SHGetSpecialFolderPath через Ffidl

### <a id="Скрипт"></a>Скрипт

Скрипт, печатающий путевое имя каталога "application data" в Windows. 

Создаваемая команда Tcl "SHGetSpecialFolderPath" способна возвращать имя любого стандартного каталога Windows (заданного соотв. ключом "CSIDL\_..."). 


В случае неуспеха команда возвращает пустую строку. 

    #! /usr/bin/tclsh
    
    package require Ffidl
    
    ffidl::callout dll_SHGetSpecialFolderPath \
      {int pointer-utf16 int int} int \
      [ffidl::symbol shell32.dll SHGetSpecialFolderPathW]
    
    proc SHGetSpecialFolderPath {what create} {
      array set CSIDL {
        CSIDL_DESKTOP	0
        CSIDL_INTERNET  1
        CSIDL_PROGRAMS	2
        CSIDL_CONTROLS	3
        CSIDL_PRINTERS	4
        CSIDL_PERSONAL	5
        CSIDL_FAVORITES	6
        CSIDL_STARTUP	7
        CSIDL_RECENT	8
        CSIDL_SENDTO	9
        CSIDL_BITBUCKET	10
        CSIDL_STARTMENU	11
        CSIDL_DESKTOPDIRECTORY	16
        CSIDL_DRIVES	17
        CSIDL_NETWORK	18
        CSIDL_NETHOOD	19
        CSIDL_FONTS	20
        CSIDL_TEMPLATES	21
        CSIDL_COMMON_STARTMENU	22
        CSIDL_COMMON_PROGRAMS	23
        CSIDL_COMMON_STARTUP	24
        CSIDL_COMMON_DESKTOPDIRECTORY	25
        CSIDL_APPDATA   26
        CSIDL_PRINTHOOD 27
        CSIDL_LOCAL_APPDATA 28
        CSIDL_ALTSTARTUP    29
        CSIDL_COMMON_ALTSTARTUP	30
        CSIDL_COMMON_FAVORITES	31
        CSIDL_INTERNET_CACHE   32
        CSIDL_COOKIES	33
        СSIDL_HISTORY	34
        CSIDL_COMMON_APPDATA	35
        CSIDL_WINDOWS	36
        CSIDL_SYSTEM	37
        CSIDL_PROGRAM_FILES	38
        СSIDL_MYPICTURES	39
        CSIDL_PROFILE	40
        СSIDL_SYSTEMX86	41
        CSIDL_PROGRAM_FILESX86	42
        CSIDL_PROGRAM_FILES_COMMON	43
        СSIDL_PROGRAM_FILES_COMMONX86	44
        CSIDL_COMMON_TEMPLATES	45
        CSIDL_COMMON_DOCUMENTS	46
        CSIDL_COMMON_ADMINTOOLS	47
        CSIDL_ADMINTOOLS	48
        CSIDL_CONNECTIONS	49
        CSIDL_COMMON_MUSIC	53
        CSIDL_COMMON_PICTURES	54
        CSIDL_COMMON_VIDEO	55
        CSIDL_RESOURCES	56
        CSIDL_RESOURCES_LOCALIZED	57
        CSIDL_COMMON_OEM_LINKS	58
        CSIDL_CDBURN_AREA	59
        CSIDL_COMPUTERSNEARME	61
        CSIDL_FLAG_DONT_VERIFY	0x4000
        CSIDL_FLAG_CREATE	0x8000
        CSIDL_FLAG_MASK	0xFF00
      }
    
      set bCreat [expr {$create ? 1 : 0}]
    
      set path [string repeat \u0000 300] ;# MAX_PATH is actually 260
    
      set ok [dll_SHGetSpecialFolderPath 0 $path $CSIDL($what) $bCreat]
    
      if {$ok} {
        set ix [string first \u0000 $path]
        if {$ix > 0} {
          return [string range $path 0 [expr {$ix - 1}]]
        }
      } else {
        return {}
      }
    }
    
    puts "appdata: [SHGetSpecialFolderPath CSIDL_APPDATA false]"

Запускать следует через **tclsh**, например, так: 

    C:\> tclsh sh.tcl

**wish** не имеет открытого канала **stdout** и **puts** там ничего интересного не делает. 

Можете так же поменять последнюю строку (с **puts**) на 

    tk_messageBox -message [SHGetSpecialFolderPath CSIDL_APPDATA false]

и запускать скрипт "просто", например, двойным щелчком мышью на его файле в Explorer. 

### <a id="Замечания"></a>Замечания

Вписал [статью в тиклевое вики](http://wiki.tcl.tk/17492). 

#### <a id="ANSI_8-bit_vs_Unicode_UTF-16"></a>ANSI (8-bit) vs Unicode (UTF-16)

*  Не совсем ясно, доступна ли юникодная версия (SHGetSpecialFolderPathW) в старых Win9x. Похоже, что доступна. 

*  Не совсем ясно поведение Ffild по отношению к строкам в UTF-16: приёмный буфер должен быть MAX\_PATH _символов_? Тогда что имеется в виду: тиклевые символы UTF-8 или виндовые символы UTF-16? 



В любом случае, ANSI версия используется так: 

    ffidl::callout dll_SHGetSpecialFolderPath \
      {int pointer-utf8 int int} int \
      [ffidl::symbol shell32.dll SHGetSpecialFolderPathA]

#### <a id="Реализация_в_Ткаббере"></a>Реализация в Ткаббере

Потребует более серьёзного подхода: 

*  Пространство имён **config**; 
*  "Пустая" реализация SHGetSpecialFolderPath для платформ, отличных от Windows; 
*  Отслеживание успешного завершения создания callout'а для SHGetSpecialFolderPath с созданием пустой реализации (см. выше) в случае ошибки. 


Changes to wiki/ru/Google_Talk.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21


22
23
24
25
26
27
28
29
30
31
32
33
34
35
36


37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243

[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Google_Talk/index.html)


# Google Talk

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Требования к Ткабберу](#Требования_к_Ткабберу)
* [2 Подключение (просто)](#Подключение_просто)
* [3 Подключение (сложно)](#Подключение_сложно)
* [4 Подключение через прокси (вернисаж)](#Подключение_через_прокси_вернисаж)
* [5 Подключение к Google Talk (старый вариант заметки)](#Подключение_к_Google_Talk_старый_вариант_заметки)
   * [5.1 Сюита для бубна и трёх напильников](#Сюита_для_бубна_и_трёх_напильников)
      * [5.1.1 Защита канала/аутентификация](#Защита_канала_аутентификация)
      * [5.1.2 Выяснение имени хоста по имени сервера](#Выяснение_имени_хоста_по_имени_сервера)

## <a id="Требования_к_Ткабберу"></a>Требования к Ткабберу

![](../images/180px-Tkabber-Login-SSL.png)



Прежде всего, для подключения к серверу Google Talk (далее GTalk), в вашем Ткаббере ***обязательно**
должна быть поддержка [**SSL/TLS**](Между_офлайном_и_онлайном.md#SSL_TLS).*

Это необходимо из-за того, что существует, в принципе, два способа подключения,
но оба они так или иначе требуют использования SSL.

Наличие поддержки SSL можно выяснить, посмотрев на окно логина: оно должно содержать закладку,
в названии которой содержится слово "SSL". Если в вашем Ткаббере также есть поддержка
[**сжатия потока**](Low_traffic_HOWTO.md#Stream_Compression_zlib), то на этой закладке
будет надпись "SSL и сжатие".

## <a id="Подключение_просто"></a>Подключение (просто)

![](../images/180px-Tkabber-GTalk-creds.png)



Во-первых, правильно укажите имя сервера и свою учётную запись в окне логина:

##### Пользователь 

> имя аккаунта на `gmail.com`; например, для `vasya@gmail.com` это будет "vasya"

##### Сервер 

> `gmail.com`

##### Пароль 

> пароль от аккаунта на `gmail.com`

Теперь опишем "канонический" вариант настроек для подключения:

##### Вкладка "Соединение" 

> Убедитесь, что флажок "Явно указать адрес и порт для подключения" выключен.

##### Вкладка "Аутентификация" 

> Убедитесь, что включен флажок "Использовать SASL для аутентификации".

##### Вкладка "SSL" 

> Убедитесь, что включена опция "Шифрование (STARTTLS)".

##### Вкладка "HTTP-соедниение" 

> Флажок "Подключиться с использованием HTTP" должен быть выключен.

Жмите "Подключиться" — на современном Ткаббере с обычным подключением к сети всё должно получиться.

Если "всё само" не получилось, придётся осиливать следующий раздел.

## <a id="Подключение_сложно"></a>Подключение (сложно)
Может возникнуть несколько проблем с подключением. И они могут зависеть как
от вашего подключения к сети, так и от версий пакетов Tcl, доступных к Ткабберу.

С сетью могут возникнуть два класса проблем:

1.  Проблемы с DNS при попытке получить SRV-записи для XMPP-сервера, обслуживающего домен "gmail.com".
1.  Проблемы с HTTP/HTTPS-прокси и "хитрой" аутентификацией на серверах Google Talk.

Первая проблема воспета в [**отдельной статье**](Ткаббер_и_DNS.md), и на ней мы останавливаться
не будем: симптомы и решения изложены там, а вот вторая проблема заслуживает развёрнутого рассмотрения.

Серверы GTalk нарушают [букву стандарта](http://www.xmpp.org/rfcs/rfc3920.html#security-mandatory) в том,
что касается использования протокола [SASL](http://en.wikipedia.org/wiki/Simple_Authentication_and_Security_Layer)
для аутентификации клиентов на сервере, предлагая только два механизма аутентификации: **PLAIN** и
[**X-GOOGLE-TOKEN**](http://dystopics.dump.be/2006/02/04/the-mysteries-of-x-google-token-and-why-it-matters/),
который является проприетарным и нестандартным, и этот **X-GOOGLE-TOKEN** портит всю картину.

Дело в том, что хотя свежие версии [пакета SASL](http://tcllib.sourceforge.net/doc/sasl.html)
из **Tcllib**, которым обычно пользуется Ткаббер для поддержки SASL, и умеют **X-GOOGLE-TOKEN**,
этот механизм отличается от обычных (стандартных) механизмов тем, что _для его работы клиенту
требуется устанавливать **HTTPS-соединение** с сервером._ При этом _настройки прокси-сервера,
предлагаемые Ткаббером_ (в окне логина) к этому соединению ***не** относятся.*

Это создаёт главную проблему:

> Если вы соединяетесь с интернетом через прокси-сервер, вы не можете использовать
  аутентификацию при помощи **X-GOOGLE-TOKEN**.

Во всяком случае, это верно для всех версий Ткаббера, включая 0.10.0 и текущую "альфу".

Как (будет) объяснено [**здесь**](Между_офлайном_и_онлайном.md), защита канала при помощи
TLS, если она используется, должна быть установлена раньше, чем будет произведена
аутентификация (например, при помощи SASL). При этом механизмы аутентификации, предлагаемые
сервером в зависимости от того, защищён канал или нет, могут различаться.
Именно это делают серверы GTalk:

*  Если клиент не установил защиту канала при помощи TLS, сервер предложит ровно один
   механизм аутентификации — **X-GOOGLE-TOKEN**; он является нестандартным, но
   обеспечиывает аутентификацию без передачи пароля по линии связи.
*  Если клиент защитил канал при помощи TLS, сервер предложит два механизма: **X-GOOGLE-TOKEN**
   и (стандартный) **PLAIN**, который передаёт пароль в открытом виде
   (именно поэтому он предлагается только при наличии TLS).

Посему имеем два варианта подключения: с использованием **X-GOOGLE-TOKEN** и без него — с использованием **PLAIN**.

> Нелишним будет подчеркнуть, что _оба метода требуют наличия поддержки TLS/SSL в Ткаббере._

О наличии таковой поддержки можно легко узнать, посмотрев в окно логина: если там есть
вкладка "SSL" (или "SSL и сжатие"), то поддержка SSL/TLS Ткабберу доступна. Если её там
нет, ставьте  необходимый [пакет поддержки TLS](http://tls.sourceforge.net).

Два метода подключения таковы:

1. Используем **X-GOOGLE-TOKEN**. Этот метод является "стандартным" для Google Talk, но он _не
   работает через HTTP(S)-прокси._ Требования к системе и настройки таковы:
   * Доступный Ткабберу [модуль SASL](http://tcllib.sourceforge.net/doc/sasl.html) из **Tcllib**
     должен иметь поддержку данного метода аутентификации. Проверить это можно, выполнив
     в [**консоли Ткаббера**](Ткаббер_ЧаВо.md#Консоль_Ткаббера) команду

            package require SASL::XGoogleToken

     Если она выполнилась успешно, вернув версию пакета (например, "1.0.1"), поддержка **X-GOOGLE-TOKEN**
     Ткабберу доступна, иначе — читайте про второй вариант или обновляйте **Tcllib**.
   * На странице "Аутентификация" окна логина включите флажки "Использовать SASL для аутентификации".
   * Если у вас Ткаббер версии 0.10.1 и выше, убедитесь, что включён  флажок
     "Разрешить механизм SASL X-GOOGLE-TOKEN" на той же странице.
1. Не используем **X-GOOGLE-TOKEN**, но подключаемся через STARTTLS или SSL. Этот метод
   несколько менее стандартен с точки зрения Google Talk, зато работает через любые прокси.
   Требования к системе и настройки таковы:
   * Нужно запретить использование **X-GOOGLE-TOKEN**:
      * Если у вас Ткаббер версии ниже 0.10.1, и у вас нет на странице "Аутентификация"
        окна логина флажка "Разрешить механизм SASL X-GOOGLE-TOKEN", то вам нужно отключить
        флажок "Использовать SASL для аутентификации". (При этом аутентификация через SASL
        отключается полностью, но соединению с Google Talk это не помешает.)
      * Если у вас Ткаббер версии 0.10.1 и выше, просто отключите флажок "Разрешить
        механизм SASL X-GOOGLE-TOKEN" на странице "Аутентификация" окна логина.
   * Нужно включить использование TLS. Для этого переключатель на странице "SSL"
     (или "SSL и сжатие") должен находиться либо в положении "Шифрование (STARTTLS)"
     либо — "Шифрование (старый SSL)".
   * Нужно разрешить использовать передачу пароля в виде открытого текста при аутентификации,
     включив флажок "Разрешить механизмы аутентификации, использующие открытый текст" на
     странице "Аутентификация" окна логина. (Пароль это не скомпрометирует, т.к.
     на момент его передачи канал связи будет защищён с помощью TLS.)

**Небольшая подсказка:** приняв указанный вами [**ресурс**](Ткаббер_ЧаВо.md#Ресурс), сервер
Google Talk добавит к нему случайным образом сгенерированную галиматью. Чтобы этого не
происходило, отключите использование SASL для аутентификации, отключив флажок "Использовать
SASL для аутентификации" на странице "Аутентификация" окна логина, а так же переставьте
переключатель на странице "SSL" ("SSL и сжатие") в позицию "Шифрование (старый SSL)".
При этом отключается механизм ["resource binding"](http://www.xmpp.org/rfcs/rfc3920.html#bind)
и сервер примет тот ресурс, который вы указали, без изменений.

Отдельное спасибо [**Teo**](Участник_Teo.md) за разъяснения.

## <a id="Подключение_через_прокси_вернисаж"></a>Подключение через прокси (вернисаж)
![Tkabber-gmail-proxy-creds.png](../images/Tkabber-gmail-proxy-creds.png)

![Tkabber-gmail-proxy-conn.png](../images/Tkabber-gmail-proxy-conn.png)

![Tkabber-gmail-proxy-auth.png](../images/Tkabber-gmail-proxy-auth.png)

![Tkabber-gmail-proxy-SSL.png](../images/Tkabber-gmail-proxy-SSL.png)

![Tkabber-gmail-proxy-http-polling.png](../images/Tkabber-gmail-proxy-http-polling.png)

![Tkabber-gmail-proxy-proxy.png](../images/Tkabber-gmail-proxy-proxy.png)

## <a id="Подключение_к_Google_Talk_старый_вариант_заметки"></a>Подключение к Google Talk (старый вариант заметки)
### <a id="Сюита_для_бубна_и_трёх_напильников"></a>Сюита для бубна и трёх напильников

Некоторые настройки при подключении к gtalk зависят от версии Ткаббера _и_ от
версии пакетов **dns** и **SASL** (они входят в **tcllib**), доступных Ткабберу.

Вот эти настройки:

#### <a id="Защита_канала_аутентификация"></a>Защита канала/аутентификация

Аутентификация в gtalk возможна _только_ при помощи протокола SASL, non-SASL
аутентификация не поддерживается.

Gtalk реализует собственный механизм аутентификации для протокола
SASL: ["X-GOOGLE-TOKEN"](http://dystopics.dump.be/2006/02/04/the-mysteries-of-x-google-token-and-why-it-matters/).
Он является "защищённым", и на открытом канале (до установления слоя TLS) gtalk предлагает _только_
этот механизм. После того, как канал защищён при помощи TLS (если стороны согласились использовать
TLS), gtalk также предлагает использовать второй метод — "PLAIN".

Это означает, что для успешной аутентификации на GTalk вам требуется включённая опция
"Использовать SASL для аутентификации", а также минимум одно из двух:

* Если доступный Ткабберу пакет **SASL** поддерживает механизм "X-GOOGLE-TOKEN", то Вы можете
  не использовать STARTTLS и _не_ включать опцию "Разрешить механизмы аутентификации,
  использующие открытый текст" (то есть механизм SASL "PLAIN");
* В противном случае вам понадобится включить опцию "Шифрование (STARTTLS)" _и_ опцию
  "Разрешить механизмы аутентификации, использующие открытый текст".

SASL в Ткаббере поддерживается при помощи пакета **SASL** из библиотеки **tcllib**. Поддержка
указанного механизма появилась в **tcllib** в апреле 2006 года; стабильная версия **tcllib**
с этой фичей — 1.9, версия **SASL** из неё — 1.1.0.

> Текущий официальный старкит/старпак Ткаббера 0.9.9 содержит **tcllib** версии
  1.7 и **SASL** версии 1.0.0, то есть поддержки "X-GOOGLE-TOKEN" там _нет._
  ![(!)](../images/Hammer.png) **Сделать:** Выяснить и дописать про версию 0.10.x

Проверить доступную Ткабберу версию **SASL** можно, набрав в его консоли:

    package versions SASL

Также для подключения к GTalk требуется наличие пакета **tls**. При отсутствии этого пакета, в окошке логина отсутствует закладка **SSL**. Проверить доступную Ткабберу версию **tls** можно, набрав в его консоли:

    package version tls

#### <a id="Выяснение_имени_хоста_по_имени_сервера"></a>Выяснение имени хоста по имени сервера

Имя хоста (компьютера), к которому должен присоединиться XMPP-клиент, в общем случае
не обязано совпадать с именем XMPP-сервера. Например, если Вася имеет аккаунт на
сервере `lamerz.net` (и имеет JID вроде `vasya@lamerz.net`), то имя реального сервера,
обслуживающего Васю, не обязано быть "lamerz.net".

Для выяснения имени хоста по имени сервера существует стандартный механизм SRV DNS записей.

![(!)](../images/Hammer.png) **Сделать:** Бла-бла-бла...

Про поддержку SRV записей читайте [**здесь**](Между_офлайном_и_онлайном.md).

Если такой поддержки у пакета **dns**, доступной Вашей версии Ткаббера, нет, то Вам
придётся прописать имя хоста "talk.google.com" в настройке "Хост", которая разрешается
включением флажка "Явно указать сервер и порт для соединения". Номер порта должен быть 5222.

Текущие официальные старкиты/старпаки 0.9.9 содержат пакет **dns** версии 1.2.0, поэтому
поддержки SRV DNS записей там _нет._


>












|
|
|

|



>
>
|
<

|
<

|
<
<
<

|



>
>
|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|
|
<

|

|
|

|
<

|
<
<
<
<

|
<
<
<
<

|

|
<

|

|
<
<
<
<

|
<
<
|
<
<

|

|

|
<
<

|

<
|
|
<
<
<
|
<
|
<
|
|
|
|
<
<
|
|
<
<
<
|
|
|
<
<
|
<
<
<

|
<
<
<
<
<
<

|

|
|

|

|

|

|

|

|
|

|
<

|

|

|
<

|
<
<
<
<

|
<

|
<
<
|
<

|
<
<

|
<
<

|



|



|

|
<
<
<

|

|

|

|
<
<

|
|
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

26
27

28
29



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74

75
76
77
78
79
80
81

82
83




84
85




86
87
88
89

90
91
92
93




94
95


96


97
98
99
100
101
102


103
104
105

106
107



108

109

110
111
112
113


114
115



116
117
118


119



120
121






122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141

142
143
144
145
146
147

148
149




150
151

152
153


154

155
156


157
158


159
160
161
162
163
164
165
166
167
168
169
170



171
172
173
174
175
176
177
178


179
180
181
182
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Google_Talk/index.html)


# Google Talk

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Требования к Ткабберу](#Требования_к_Ткабберу)
* [2 Подключение (просто)](#Подключение_просто)
* [3 Подключение (сложно)](#Подключение_сложно)
* [4 Подключение через прокси (вернисаж)](#Подключение_через_прокси_вернисаж)
* [5 Подключение к Google Talk (старый вариант заметки)](#Подключение_к_Google_Talk_старый_вариант_заметки)
 * [5.1 Сюита для бубна и трёх напильников](#Сюита_для_бубна_и_трёх_напильников)
  * [5.1.1 Защита канала/аутентификация](#Защита_канала_аутентификация)
  * [5.1.2 Выяснение имени хоста по имени сервера](#Выяснение_имени_хоста_по_имени_сервера)

# <a id="Требования_к_Ткабберу"></a>Требования к Ткабберу

![](../images/180px-Tkabber-Login-SSL.png)

![](../images/magnify-clip.png)

Прежде всего, для подключения к серверу Google Talk (далее GTalk), в вашем Ткаббере _**обязательно** должна быть поддержка [SSL/TLS](Между_офлайном_и_онлайном.md#SSL_TLS)._ 


Это необходимо из-за того, что существует, в принципе, два способа подключения, но оба они так или иначе требуют использования SSL. 


Наличие поддержки SSL можно выяснить, посмотрев на окно логина: оно должно содержать закладку, в названии которой содержится слово "SSL". Если в вашем Ткаббере также есть поддержка [сжатия потока](Low_traffic_HOWTO.md#Stream_Compression_zlib), то на этой закладке будет надпись "SSL и сжатие". 




# <a id="Подключение_просто"></a>Подключение (просто)

![](../images/180px-Tkabber-GTalk-creds.png)

![](../images/magnify-clip.png)

Во-первых, правильно укажите имя сервера и свою учётную запись в окне логина: 

 Пользователь 

 имя аккаунта на `gmail.com`; например, для `vasya@gmail.com` это будет "vasya" 

 Сервер 

 `gmail.com` 

 Пароль 

 пароль от аккаунта на `gmail.com` 

Теперь опишем "канонический" вариант настроек для подключения: 

 Вкладка "Соедниение" 

 Убедитесь, что флажок "Явно указать адрес и порт для подключения" выключен. 

 Вкладка "Аутентификация" 

 Убедитесь, что включен флажок "Использовать SASL для аутентификации". 

 Вкладка "SSL" 

 Убедитесь, что включена опция "Шифрование (STARTTLS)". 

 Вкладка "HTTP-соедниение" 

 Флажок "Подключиться с использованием HTTP" должен быть выключен. 

Жмите "Подключиться" — на современном Ткаббере с обычным подключением к сети всё должно получиться. 

Если "всё само" не получилось, придётся осиливать следующий раздел. 

# <a id="Подключение_сложно"></a>Подключение (сложно)
Может возникнуть несколько проблем с подключением. И они могут зависеть как от вашего подключения к сети, так и от версий пакетов Tcl, доступных к Ткабберу. 


С сетью могут возникнуть два класса проблем: 

1.  Проблемы с DNS при попытке получить SRV-записи для XMPP-сервера, обслуживающего домен "gmail.com". 
1.  Проблемы с HTTP/HTTPS-прокси и "хитрой" аутентификацией на серверах Google Talk. 

Первая проблема воспета в [отдельной статье](Ткаббер_и_DNS.md), и на ней мы останавливаться не будем: симптомы и решения изложены там, а вот вторая проблема заслуживает развёрнутого рассмотрения. 


Серверы GTalk нарушают [букву стандарта](http://www.xmpp.org/rfcs/rfc3920.html#security-mandatory) в том, что касается использования протокола [SASL](http://en.wikipedia.org/wiki/Simple_Authentication_and_Security_Layer) для аутентификации клиентов на сервере, предлагая только два механизма аутентификации: **PLAIN** и [**X-GOOGLE-TOKEN**](http://dystopics.dump.be/2006/02/04/the-mysteries-of-x-google-token-and-why-it-matters/), который является проприетарным и нестандартным, и этот **X-GOOGLE-TOKEN** портит всю картину. 





Дело в том, что хотя свежие версии [пакета SASL](http://tcllib.sourceforge.net/doc/sasl.html) из **Tcllib**, которым обычно пользуется Ткаббер для поддержки SASL, и умеют **X-GOOGLE-TOKEN**, этот механизм отличается от обычных (стандартных) механизмов тем, что _для его работы клиенту требуется устанавливать **HTTPS-соединение** с сервером._ При этом _настройки прокси-сервера, предлагаемые Ткаббером_ (в окне логина) к этому соединению _**не** относятся._ 





Это создаёт главную проблему: 

 Если вы соединяетесь с интернетом через прокси-сервер, вы не можете использовать аутентификацию при помощи **X-GOOGLE-TOKEN**. 


Во всяком случае, это верно для всех версий Ткаббера, включая 0.10.0 и текущую "альфу". 

Как (будет) объяснено [здесь](Между_офлайном_и_онлайном.md), защита канала при помощи TLS, если она используется, должна быть установлена раньше, чем будет произведена аутентификация (например, при помощи SASL). При этом механизмы аутентификации, предлагаемые сервером в зависимости от того, защищён канал или нет, могут различаться. Именно это делают серверы GTalk: 





*  Если клиент не установил защиту канала при помощи TLS, сервер предложит ровно один механизм аутентификации — **X-GOOGLE-TOKEN**; он является нестандартным, но обеспечиывает аутентификацию без передачи пароля по линии связи. 


*  Если клиент защитил канал при помощи TLS, сервер предложит два механизма: **X-GOOGLE-TOKEN** и (стандартный) **PLAIN**, который передаёт пароль в открытом виде (именно поэтому он предлагается только при наличии TLS). 



Посему имеем два варианта подключения: с использованием **X-GOOGLE-TOKEN** и без него — с использованием **PLAIN**. 

 Нелишним будет подчеркнуть, что _оба метода требуют наличия поддержки TLS/SSL в Ткаббере._ 

О наличии таковой поддержки можно легко узнать, посмотрев в окно логина: если там есть вкладка "SSL" (или "SSL и сжатие"), то поддержка SSL/TLS Ткабберу доступна. Если её там нет, ставьте  необходимый [пакет поддержки TLS](http://tls.sourceforge.net). 



Два метода подключения таковы: 


1.  Используем **X-GOOGLE-TOKEN**. Этот метод является "станартным" для Google Talk, но он _не работает через HTTP(S)-прокси._ Требования к системе и настройки таковы: 
 *  Доступный Ткабберу [модуль SASL](http://tcllib.sourceforge.net/doc/sasl.html) из **Tcllib** должен иметь поддержку данного метода аутентификации. Проверить это можно, выполнив в [консоли Ткаббера](Ткаббер_ЧаВо.md#Консоль_Ткаббера) команду 



    package require SASL::XGoogleToken

 Если она выполнилась успешно, вернув версию пакета (например, "1.0.1"), поддержка **X-GOOGLE-TOKEN** Ткабберу доступна, иначе — читайте про второй вариант или обновляйте **Tcllib**. 

 *  На странице "Аутентификация" окна логина включите флажки "Использовать SASL для аутентификации". 
 *  Если у вас Ткаббер версии 0.10.1 и выше, убедитесь, что включён  флажок "Разрешить механизм SASL X-GOOGLE-TOKEN" на той же странице. 
 
1.  Не используем **X-GOOGLE-TOKEN**, но подключаемся через STARTTLS или SSL. Этот метод несколько менее стандартен с точки зрения Google Talk, зато работает через любые прокси. Требования к системе и настройки таковы: 


 *  Нужно запретить использование **X-GOOGLE-TOKEN**: 
  *  Если у вас Ткаббер версии ниже 0.10.1, и у вас нет на странице "Аутентификация" окна логина флажка "Разрешить механизм SASL X-GOOGLE-TOKEN", то вам нужно отключить флажок "Использовать SASL для аутентификации". (При этом аутентификация через SASL отключается полностью, но соединению с Google Talk это не помешает.) 



  *  Если у вас Ткаббер версии 0.10.1 и выше, просто отключите флажок "Разрешить механизм SASL X-GOOGLE-TOKEN" на странице "Аутентификация" окна логина. 
 
 *  Нужно включить использование TLS. Для этого переключатель на странице "SSL" (или "SSL и сжатие") должен находиться либо в положении "Шифрование (STARTTLS)" либо — "Шифрование (старый SSL)". 


 *  Нужно разрешить использовать передачу пароля в виде открытого текста при аутентификации, включив флажок "Разрешить механизмы аутентификации, использующие открытый текст" на странице "Аутентификация" окна логина. (Пароль это не скомпрометирует, т.к. на момент его передачи канал связи будет защищён с помощью TLS.) 




**Небольшая подсказка:** приняв указанный вами [ресурс](Ткаббер_ЧаВо.md#Ресурс), сервер Google Talk добавит к нему случайным образом сгенерированную галиматью. Чтобы этого не происходило, отключите использование SASL для аутентификации, отключив флажок "Использовать SASL для аутентификации" на странице "Аутентификация" окна логина, а так же переставьте переключатель на странице "SSL" ("SSL и сжатие") в позицию "Шифрование (старый SSL)". При этом отключается механизм ["resource binding"](http://www.xmpp.org/rfcs/rfc3920.html#bind) и сервер примет тот ресурс, который вы указали, без изменений. 







Отдельное спасибо [teo](Участник_Teo.md) за разъяснения. 

# <a id="Подключение_через_прокси_вернисаж"></a>Подключение через прокси (вернисаж)
![Tkabber-gmail-proxy-creds.png](../images/Tkabber-gmail-proxy-creds.png) 

![Tkabber-gmail-proxy-conn.png](../images/Tkabber-gmail-proxy-conn.png) 

![Tkabber-gmail-proxy-auth.png](../images/Tkabber-gmail-proxy-auth.png) 

![Tkabber-gmail-proxy-SSL.png](../images/Tkabber-gmail-proxy-SSL.png) 

![Tkabber-gmail-proxy-http-polling.png](../images/Tkabber-gmail-proxy-http-polling.png) 

![Tkabber-gmail-proxy-proxy.png](../images/Tkabber-gmail-proxy-proxy.png) 

# <a id="Подключение_к_Google_Talk_старый_вариант_заметки"></a>Подключение к Google Talk (старый вариант заметки)
## <a id="Сюита_для_бубна_и_трёх_напильников"></a>Сюита для бубна и трёх напильников

Некоторые настройки при подключении к gtalk зависят от версии Ткаббера _и_ от версии пакетов **dns** и **SASL** (они входят в **tcllib**), доступных Ткабберу. 


Вот эти настройки: 

### <a id="Защита_канала_аутентификация"></a>Защита канала/аутентификация

Аутентификация в gtalk возможна _только_ при помощи протокола SASL, non-SASL аутентификация не поддерживается. 


Gtalk реализует собственный механизм аутентификации для протокола SASL: ["X-GOOGLE-TOKEN"](http://dystopics.dump.be/2006/02/04/the-mysteries-of-x-google-token-and-why-it-matters/). Он является "защищённым", и на открытом канале (до установления слоя TLS) gtalk предлагает _только_ этот механизм. После того, как канал защищён при помощи TLS (если стороны согласились использовать TLS), gtalk также предлагает использовать второй метод — "PLAIN". 





Это означает, что для успешной аутентификации на GTalk вам требуется включённая опция "Использовать SASL для аутентификации", а также минимум одно из двух: 


*  Если доступный Ткабберу пакет **SASL** поддерживает механизм "X-GOOGLE-TOKEN", то Вы можете не использовать STARTTLS и _не_ включать опцию "Разрешить механизмы аутентификации, использующие открытый текст" (то есть механизм SASL "PLAIN"); 


*  В противном случае вам понадобится включить опцию "Шифрование (STARTTLS)" _и_ опцию "Разрешить механизмы аутентификации, использующие открытый текст". 


SASL в Ткаббере поддерживается при помощи пакета **SASL** из библиотеки **tcllib**. Поддержка указанного механизма появилась в **tcllib** в апреле 2006 года; стабильная версия **tcllib** с этой фичей — 1.9, версия **SASL** из неё — 1.1.0. 



 Текущий официальный старкит/старпак Ткаббера 0.9.9 содержит **tcllib** версии 1.7 и **SASL** версии 1.0.0, то есть поддержки "X-GOOGLE-TOKEN" там _нет._ ![(!)](../images/Hammer.png) **Сделать:** Выяснить и дописать про версию 0.10.x 



Проверить доступную Ткабберу версию **SASL** можно, набрав в его консоли: 

    package versions SASL

Также для подключения к GTalk требуется наличие пакета **tls**. При отсутствии этого пакета, в окошке логина отсутствует закладка **SSL**. Проверить доступную Ткабберу версию **tls** можно, набрав в его консоли: 

    package version tls

### <a id="Выяснение_имени_хоста_по_имени_сервера"></a>Выяснение имени хоста по имени сервера

Имя хоста (компьютера), к которому должен присоединиться XMPP-клиент, в общем случае не обязано совпадать с именем XMPP-сервера. Например, если Вася имеет аккаунт на сервере `lamerz.net` (и имеет JID вроде `vasya@lamerz.net`), то имя реального сервера, обслуживающего Васю, не обязано быть "lamerz.net". 




Для выяснения имени хоста по имени сервера существует стандартный механизм SRV DNS записей. 

![(!)](../images/Hammer.png) **Сделать:** Бла-бла-бла... 

Про поддержку SRV записей читайте [здесь](Между_офлайном_и_онлайном.md). 

Если такой поддержки у пакета **dns**, доступной Вашей версии Ткаббера, нет, то Вам придётся прописать имя хоста "talk.google.com" в настройке "Хост", которая разрешается включением флажка "Явно указать сервер и порт для соединения". Номер порта должен быть 5222. 



 Текущие официальные старкиты/старпаки 0.9.9 содержат пакет **dns** версии 1.2.0, поэтому поддержки SRV DNS записей там _нет._ 


Changes to wiki/ru/Low_traffic_HOWTO.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236

237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313




314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412

413
414
415

416
417
418

419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Low_traffic_HOWTO/index.html)


# Low traffic HOWTO

Материал из Tkabber Wiki

Здесь рассказано как уменьшить трафик, "развиваемый" Ткаббером, для пользователей очень дорого интернета.

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

## <a id="toc"></a>Содержание

* [1 Сжатие трафика](#Сжатие_трафика)
   * [1.1 Stream Compression/zlib](#Stream_Compression_zlib)
      * [1.1.1 "Обычный" Ткаббер](#Обычный_Ткаббер)

      * [1.1.2 Ткаббер-пак (Win32)](#Ткаббер-пак_Win32)
      * [1.1.3 Старпаки Ткаббера](#Старпаки_Ткаббера)
   * [1.2 PGP/GnuPG](#PGP_GnuPG)
* [2 Уменьшение XML-трафика](#Уменьшение_XML-трафика)
   * [2.1 Замечание о бинарных данных](#Замечание_о_бинарных_данных)
   * [2.2 Настройки Ткаббера](#Настройки_Ткаббера)
   * [2.3 Настройка пользователя](#Настройка_пользователя)
   * [2.4 Настройка сервера](#Настройка_сервера)
* [3 Средства самоконтроля](#Средства_самоконтроля)
   * [3.1 Плагин Traffic](#Плагин_Traffic)
   * [3.2 Сетевые средства](#Сетевые_средства)
* [4 Невошедшее](#Невошедшее)

## <a id="Сжатие_трафика"></a>Сжатие трафика
Это — единственный по-настоящему действенный способ уменьшить трафик.

Существует, в принципе, три варианта сжатия трафика, из них реальный интерес представляет
только первый — "Stream Compression":

##### [XEP-0138: Stream Compression](http://www.xmpp.org/extensions/xep-0138.html) 

> Использует один из зарегистрированных (и поддерживаемых) в XMPP методов сжатия и
  сжимает _весь_ XML-поток (то есть компрессор находится между XML-потоком и TCP/IP-потоком
  в сетевом стеке). Ткаббер поддерживает метод сжатия **zlib**.

##### Сжатие в протоколе TLS 

> Формально протокол TLS (SSL) поддерживает сжатие, однако, этот вопрос на уровне
  спецификации протокола проработан плохо — процитируем [SSL\_COMP\_add\_compression\_method(3)](http://www.openssl.org/docs/ssl/SSL_COMP_add_compression_method.html)
  из OpenSSL:
> > _The TLS standard (or SSLv3) allows the integration of compression methods into the communication.
   The TLS RFC does however not specify compression methods or their corresponding identifiers,
   so there is currently no compatible way to integrate compression with unknown peers. It is
   therefore currently not recommended to integrate compression into applications. Applications
   for non-public use may agree on certain compression methods. Using different compression
   methods with the same identifier will lead to connection failure._
> Кроме того, в пакете [tcltls](http://tls.sourceforge.net), который служит прослойкой между Ткаббером и OpenSSL, отсутствуют "крутилки" для управления сжатием; статус этой фичи в драйвере TLS, реализованном в [ejabberd](http://ejabberd.jabber.ru), также неизвестен. Одним словом, _сжатие средствами TLS в Ткаббере невозможно._

##### PGP (GnuPG) 

> _PGP сжимает данные перед их шифрованием,_ что, в принципе, способно уменьшить трафик.
  Однако, не надо быть чрезмерно оптимистичными относительно этого способа;
  об этом — читайте [**ниже**](#PGP_GnuPG).

_Важно понимать, что **Stream Compression не может работать вместе с TLS (SSL),** то есть Вам
придётся выбирать между сжатием и защитой канала._ По крайней
мере [в ejabberd они вместе не работают](https://support.process-one.net/browse/EJAB-499),
а потому и Ткаббер не даст включить их одновременно.

О том, что Вы теряете, отказываясь от SSL, можно прочитать [**здесь**](Между_офлайном_и_онлайном.md#Защита_потока).

Стоит добавить, что в контексте XMPP практически невозможно достичь такой же степени
сжатия, которую способны показать алгортимы zlib на "простых файлах", в силу того,
что в Stream Compression они рассматривают отдельно каждую [**станцу**](Терминология.md#Станца_stanza),
а не весь сплошной XML-поток. Это происходит из-за того, что требуется обеспечивать
передачу "почти в реальном времени" и передавать станцы по мере их готовности к передаче;
сжатие же файлов может рассматривать такое количество байт, которое ограничено лишь
размерами внутренних буферов, словаря, и требованиями к вычислительным ресурсам.

### <a id="Stream_Compression_zlib"></a>Stream Compression/zlib

#### <a id="Обычный_Ткаббер"></a>"Обычный" Ткаббер

Для включения сжатия в "обычном" Ткаббере Вам потребуется установить пакет **ztcl**
и пакет **tclmore**, от которого тот зависит (о том, где их взять, — чуть ниже).

Установив пакет, перезапустите Ткаббер. При этом в окне логина закладка **SSL** будет
называться теперь **SSL & Сжатие.** Идите туда и отметьте галочку "Сжатие".

**Где взять:**

* Исходный код:
   * [ztcl](http://sgolovan.nes.ru/jabber/ztcl/ztcl/ztcl_1.0b4_src.tar.gz)
   * [tclmore](http://sgolovan.nes.ru/jabber/ztcl/tclmore/tclmore_0.7b1_src.tar.gz)

(Раньше они хостились в [соответствующих](https://gna.org/projects/ztcl/) [проектах](https://gna.org/projects/tclmore/)
на gna.org, но они были удалены из-за неактивности автора.)

* Неофициальные сборки:
   * Пакеты для Debian sarge авторства Сергея Голованя [**Teo**](Участник_Teo.md) доступны
     в [его репозитории](http://people.debian.org/~sgolovan/debian/) — найдите ниже вопрос
     про этот репозиторий и действуйте в соответствии с инструкциями.
   * [**eXire**](Участник_EXire.md) поддерживает [пакеты для Arch Linux](http://exire.dyndns.org:8081/arch/repo).
   * Mellon собрал эти пакеты для [Gentoo](http://www.gentoo.org) — они доступны в её
     багзилле: [tclmore](http://bugs.gentoo.org/show_bug.cgi?id=205412), [ztcl](http://bugs.gentoo.org/show_bug.cgi?id=205413).
   * Также пакеты должны быть доступны в [портах FreeBSD](http://portsmon.freebsd.org/portoverview.py?category=devel&portname=ztcl).
   * [**kostix**](Участник_Kostix.md) собрал оба пакета под Windows; их установке посвящён следующий раздел.

##### <a id="Установка_ztcl_и_tclmore_в_Windows"></a>Установка ztcl и tclmore в Windows

Во-первых, вам понадобятся сами пакеты **ztcl** и **tclmore**, собранные под Win32.
Они доступны [здесь](http://sgolovan.nes.ru/jabber/ztcl/).

Для установки необходимо распаковать пакеты в каталог модулей тикля (обычно это **C:\\Tcl\\lib**).

Во-вторых, Вам понадобится поставить Win32-версию библиотеки **zlib**, которую следует
взять [здесь](http://gnuwin32.sourceforge.net/packages/zlib.htm).

**Установка библиотеки zlib**

Из скачанного архива вам потребуется файл **zlib1.dll**. Его нужно положить в любой каталог,
содержащийся в переменной окружения **PATH**. Если эта фраза Вам ни о чём не говорит, у Вас есть три варианта:

* [**Обучить**](Настройка_Ткаббера__азы_и_глубже.md) себя локально;
* [Обучить](http://www.ozon.ru/context/detail/id/2988356/) себя глобально;
* Тупо положить **zlib1.dll** в каталог **C:\\Windows\\system32**, если с предыдущими пунктами ничего не вышло.

**Вниманию пользователей Windows XP 64-bit Edition:** поскольку **ztcl** и **tclmore** собраны
под x86, они требуют **zlib**, собранную также под x86 (именно такая и находится по ссылке,
приведённой выше). Однако, имейте в виду две вещи:

* **zlib1.dll** из пакета **zlib** _не должна_ лежать в **%WINDIR%\\system32** из-за того,
  что там ищутся только "родные" (64-битные) библиотеки. Положите её в **%WINDIR%\\system** — она
  как раз предназначена для "старых", 32-битных библиотек.
* [Доступная в Интернет версия **zlib1.dll**, собранная под x64](http://www.winimage.com/zLibDll/),
  с ztcl _не работает._
* На всякий случай: бессмысленно просить авторов собрать библиотеки под x64 — это потребует
  64-битных версий всего Tcl/Tk и всех остальных бинарных пакетов.

#### <a id="Ткаббер-пак_Win32"></a>Ткаббер-пак (Win32)

[**Kostix**](Участник_Kostix.md) собрал [Ткаббер-пак под Windows](http://tkabber.jabber.ru/tkabber-pack/).
Он поддерживает сжатие (как и все возможные расширения Ткаббера и стандартные плагины) "из коробки".

#### <a id="Старпаки_Ткаббера"></a>Старпаки Ткаббера

_Пользователи старпака_ использовать внешние модули, в принципе, могут, но их прикручивание
связано с серьёзными трудностями (особенно в случае с **ztcl**).

Вследствие [**некоторых проблем**](Старпак_и_сжатие.md) поддержка сжатия в старпаке — вещь
нетривиальная и требующая серьёзных "приседаний" для реализации.

Посему официальные старпаки пока что сжатие _не поддерживают_. Про неофициальные
старпаки с поддержкой сжатия нам также неизвестно.

Более подробно о внешних старкитах к "упакованным" дистрибутивам Ткаббера
рассказано [**здесь**](Проблемы_со_звуком.md#В_старпаке_старките_нет_звука).

### <a id="PGP_GnuPG"></a>PGP/GnuPG

У сжатия в PGP есть две проблемы:

* В отличие от Stream Compression, который сжимает каждую [**станцу**](Терминология.md#Станца_stanza)
  перед отправкой, PGP сжимает _текст_ каждого сообщения перед шифрованием. После этого зашифрованный
  текст передаётся "вместо" оригинального сообщения, _будучи закодирован при помощи
  [base64](http://ru.wikipedia.org/wiki/Base64)._ Как известно, этот метод кодирования потока байтов
  с кодами 0..255 в поток символов ASCII способен увеличить размер оригинального сообщения на 30%,
  что может эффективно "сожрать" выгоду от сжатия, особенно на небольших сообщениях.
* Кроме того, PGP подписывает каждое отправляемое сообщение, и эта подпись также
  представляет собой элемент XML, содержащий около 100 символов **base64**.

## <a id="Уменьшение_XML-трафика"></a>Уменьшение XML-трафика
Следовать указаниям этого раздела стоит лишь в том случае, если у вас ничего не вышло с **zlib**,
или вы по каким-то причинам не можете его использовать (хотя единственная _серьёзная_
причина — это необходимость использовать SSL).

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

### <a id="Замечание_о_бинарных_данных"></a>Замечание о бинарных данных

Протокол XMPP является в некотором роде "ASCII-протоколом" — любые бинарные данные
вроде RAR-архивов и картинок передаются им в виде **base64**-представления
оригинальных данных. Поэтому имейте в виду, что картинка размером 5 килобайт
"на линии" будет весить до 6.5 килобайт.

### <a id="Настройки_Ткаббера"></a>Настройки Ткаббера

Ещё раз напомним, что в борьбе с трафиком вы легко можете побороть функциональность
и удобство работы! Поэтому руководствуйтесь принципом:

> _семь раз отмерь, один — отрежь_

и глубоко обдумывайте каждый пункт.

Пункты расположены по _предполагаемой_ (автором) "трафикопрожорливости".

##### Внутриканальная передача файлов 

> весьма неэффективна в плане использования трафика, так как файл фактически передаётся
  в виде шестибитного текста (**base64**).

##### Аватары 

> В отличие от эмоциконок (смайликов) аватары посылаются _и принимаются_ в виде картинок.
  Картинки бывают довольно большими. Поэтому, если Вы не хотите тратить свой трафик на эту
  чушь, убедитесь, что у Вас выключена опция меню **Службы → Расширения → Аватара → Разрешение загрузки**.

##### История комнат 

> При заходе в комнату Ткаббер запрашивает у сервера некоторое количество последних
  сообщений чтобы поместить пользователя в контекст происходящей в комнате дискуссии.
  Возможно настроить несколько параметров, находящихся в **Customize → Chat**:

>     ::muc::options(history_maxstanzas)

> задаёт максимальное количество сообщений, которые Ткаббер попросит у сервера.
  0 означает, что сообщения запрошены не будут.

>     ::muc::options(history_maxchars)

> определяет максимальный объём текста сообщений в символах. 0 означает, что ничего
  принято не будет.

>     ::muc::options(request_only_unseen_history)

> эта опция _полезна при переконнектах к серверу _— если она включена, Ткаббер
  вынимает только те сообщения, которые пользователь ещё не прочитал, _если окно
  с конференцией открыто._ Одним словом, не выгребаются те сообщения, которые уже
  есть в окне комнаты.

##### Модуль Conference Info 

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


>     ::plugins::conferenceinfo::options(autoask)

> в **Customize → Conference Info**. Вместо отключения запросов можно настроить их частоту
  в том же разделе настроек.

##### Уведомления о событиях чата 

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

>     ::plugins::chatstate::options(enable)

> в **Customize → Chat → Chatstate** и

>     ::plugins::events::options(enable)

> в **Customize → Chat → Events**.

##### Ответы на IQ-запросы 

> На некоторые IQ-запросы отвечает Jabber-клиент. Сюда относятся запросы версии клиента,
  времени, запрос jabber:iq:last (время неактивности пользователя) и прочие, на которые
  не может ответить сервер. Посему, если вы хотите сэкономить трафик на ответах, запретите
  все или некоторые опции в **Customize → IQ**, начинающиеся со строк "reply\_" и "report\_";
  наиболее "прожорливой", по-видимому, является опция

>     ::muc::options(report_muc_rooms)

> Имейте, однако, в виду, что на запрещённые в конфигурации IQ-запросы Ткаббер всё же
  посылает IQ-ответы с уведомлениями о неудавшемся запросе; это может "съесть"
  часть выгоды от запрещения нормальных ответов.

Некоторые плагины также могут "втихую" пожирать ваш траффик, например:

##### georoster 

> Для выяснения географических координат пользоватей запрашивает vCard у каждого контакта в вашем ростере.

##### [**Autoretrieve (неофициальный плагин)**](Плагины.md#Autoretrieve)

> автоматически запрашивает vCard у каждого пользователя, входящего в комнату. Собственно,
  в этом и состоит цель его работы, но некоторые пользователи отличаются оголтелым
  стремлением к установке всех плагинов, до которых дотягиваются их руки... Так что глядите в оба.

##### Списки приватности 

> Если какой-то негодяй льёт вам в приват тонны сообщений, пытаясь завесить клиент
  или раскрутить на трафик, вы можете [**внести его в списки приватности**](Блокировка_MRIM-спама.md)
  (войти в меню **Tkabber → Обеспечение приватности** и внести в правила либо реальный джид
  (если флуд идёт напрямую, либо "комнатный" джид вида `room_name@conference.jabber.ru/flooder's_nick`).
  Не путайте списки приватности с игнором, который можно включить, щёлкнув правой кнопкой
  мыши на участнике конференции — игнор не блокирует трафик, он лишь скрывает сообщения от
  глаз. Списки же приватности обрабатываются на сервере, поэтому вы перестанете получать от
  этого джида _всё, что отметите, устанавливая на него правило, включая его запросы и презенс._
  Но помните, что если флудер сменит ник в комнате, правило придётся либо переписывать, либо добавлять новое.

### <a id="Настройка_пользователя"></a>Настройка пользователя

(То есть настройка себя.)

* Ограничьте себя в просмотре чужих vCards — они зачастую содержат фотографии большого размера
  (и, к сожалению, подавляющее большинство из них содержат какую угодно ахинею, но не фотографию владельца).
* Не используйте плагины типа [**Autoretrieve**](Плагины.md#Autoretrieve), которые запрашивают
  vCard у каждого заходящего в комнату пользователя.
* Старайтесь попусту не "ходить" в дискавери на список конференций — к примеру, таковой
  на jabber.ru "весит" примерно 180 килобайт; если вам интересна информация по конкретной
  комнате, наберите её имя в адресной строке окна дискавери в виде `имя_комнаты@conference.jabber.ru` — перейдёте
  прямо к ней, минуя полный список комнат.

![(!)](../images/Hammer.png) **Сделать:** по-видимому, плагин whiteboard неплохо жрёт трафик

### <a id="Настройка_сервера"></a>Настройка сервера

При помощи списков приватности на сервере можно останавливать некоторые виды _входящего_
трафика _прямо на сервере._





![(!)](../images/Hammer.png) **Сделать:** доработать

## <a id="Средства_самоконтроля"></a>Средства самоконтроля
### <a id="Плагин_Traffic"></a>Плагин Traffic

В Ткаббере имеется [**плагин Traffic**](Плагины.md#Официальные_плагины_для_Ткаббера) авторства
[**feez'а**](Участник_Feez.md). Установив его и запустив через **Службы → Расширения → Статистика по трафику**,
вы сможете следить за тем, какие "примочки" Ткаббера поедают драгоценный трафик. Имейте,
однако, в виду, что этот плагин меряет только объём XML-трафика, то есть он не способен
учесть выгоду от применения Stream Compression, которое происходит "ниже" — перед передачей данных стеку TCP/IP.

Расскажем вкратце о том, как пользоваться этим плагином.

Итак, окно плагина открыто, и теперь нам надо выбрать соединение, которое мы хотим мониторить.
Справа вверху есть выпадающий список, в котором видна надпись "0 None". Разверните список
и выберите в нём нужное соединение (если их открыто больше одного). Установите интервал обновления
в поле "Таймер" (5 секунд вполне достаточно) и удостоверьтесь, что кнопка справа от него
стоит в значении "Выкл" (это означает, что автообновление работает, и при нажатии на
кнопку отключится). Если вы не хотите пользоваться автообновлением окна (оно всё-таки
потребляет ресурсы), можете обновлять его вручную с помощью кнопки "Обновить",
расположенной справа от выпадающего списка.

Автоматически ли или вручную, окно рано или поздно заполнится информацией. По горизонтали идут
контакты ростера (в **Настройках → Плагины → Traffic** можно указать, показывать ли их в виде
ника или джида): ваши друзья, а также конференции и фиды RSS. Самой последней строкой идёт суммарный
трафик соединения. По вертикали — типы трафика: **Pres** (Presence, присутствие), **Iq** (Info-query,
информация-запросы), **Msg** (Messages, сообщения), **All** (всего). **IN** — входящий трафик,
**OUT** — исходящий. Нетрудно заметить, что наибольшую проблему создаёт сервис Info-query,
особенно если у каких-либо контактов в vcard вставлены аватары и фотографии — их сразу же
видно по увеличению трафика в несколько раз.

Когда плагин установлен, статистика считается автоматически с момента старта Ткаббера.
Её можно сохранить для последуюего анализа с помощью скриптов или других инструментов
(правда, нельзя загрузить сохранённый файл), а можно и обнулить, чтобы начать считать
заново (к примеру, чтобы промерить отдельно "час пик"). Напоминаем ещё раз, что
меряется **только** XML-трафик.

Проведём интересный опыт (он будет просто потрясающ, если среди ваших контактов есть
пользователи MSN Messenger'а).

1.  Выберите момент затишья, чтобы собеседники не забивали статистику лишними строчками в окне.
1.  Поставьте ручное обновление окна.
1.  Обнулите счётчики.
1.  Отлогиньтесь от MSN-гейта.
1.  Обновите статистику. Если некоторые из контактов были в онлайне, они появятся в
    списке, имея чуть меньше 250 байт трафика Pres IN. Сам транспорт, естественно, тоже
    вышлет свой презенс в 87 байт размером в обмен на ваш ему Pres OUT.
1.  Сбросьте счётчики снова.
1.  Снова залогиньтесь к гейту и снова обновите статистику.
   *  При логине трафик презенса увеличивается: у транспорта в три раза, у контактов — больше,
      чем в четыре!
   *  Но это ещё цветочки: один-единственный запрос Iq порождает трафик в 40-70 килобайт
      (если у контакта в vcard не вставлена фотка размером с wallpaper)!!!
   *  Вход или выход одного человека из конференции увеличивают её входящий презенс-трафик
      на 250-500 байт. На первый взгляд немного, но в час пик, когда входит и выходит
      много народу, набегает...
1.  Померяйте сами трафик, создаваемый плагинами chess, checkers, reversi, whiteboard и так далее.

### <a id="Сетевые_средства"></a>Сетевые средства

Существуют всевозможные мерялки трафика, которые как раз способны вести учёт
того, что оказывается непосредственно "на линии".

Для измерения TCP/IP трафика под виндами можно порекоммендовать бесплатный (для
простых применений) [TMeter](http://www.TMeter.RU).

Если у вас модем, то очень хорошим решением является [ModemSpd](http://www.online.az/modemspdV0.902beta.zip)
с [модулем декодирования Unimodem-диагностики](http://www.rampitec.spb.ru/modem.htm#ud).

К сожалению, измерения такими средствами страдают от невозможности классифицировать
трафик XMPP (так, как это делает плагин **Traffic**, к примеру) — без ухищрений можно
померять только "сколько всего" и "с какой скоростью".

![(?)](../images/Attention.png) **Поправьте меня:** Впрочем, если память мне не изменяет,
файерволл [Agnitum Outpost](http://www.agnitum.com/products/outpost/) даже
в [бесплатной версии](http://www.agnitum.com/download/OutpostInstall.exe) меряет трафик,
который накручивает каждая программа в отдельности.

## <a id="Невошедшее"></a>Невошедшее
В процессе разбирательств с добрым Йоххо-тяном в комнате Ткаббера по поводу сравнительного
меряния трафика с включённым сжатием между Бомбусом и Ткаббером, [**kostix**](Участник_Kostix.md)
02:36, 22 апреля 2008 (MSD) выяснил, что Ткаббер жмёт трафик, используя степерь сжатия,
которую zlib использует по умолчанию ([**Mellon**](Участник_Mellon.md) сообщает, что она равна 6).

Увеличить её до максимального значения можно, изменив в процедуре `transport::zlib::import`,
определённой в файле jabberlib/transports.tcl, строку

    zlib stream $sock RDWR -output compress -input decompress

на

    zlib stream $sock RDWR -output compress -input decompress -level 9

Тестирование на получении ростера (~120 контактов + закладки на конференции + аннотации к
некоторым элементам) и начального присутствия от JID'ов всех его элементов, к которым это относится:

1.  открытый текст, без zlib:
   *  принято:  65 пакетов, 37969 байтов
   *  отправлено: 46 пакетов, 11134 байтов

1.  открытый текст, zlib (уровень сжатия по умолчанию):
   *  принято:  53 пакетов, 8990 байтов
   *  отправлено: 39 пакетов, 3805 байтов

1.  открытый текст, zlib (уровень сжатия на клиенте — 9):
   *  принято:  51 пакетов, 8886 (8941) байтов
   *  отправлено: 38 пакетов, 3754 (3750) байтов

1.  TLS (SSL):
   *  принято:  58 пакетов, 18863 байтов
   *  отправлено: 45 пакетов, 5307 байтов

Комментарий: TLS — наше всё. Он сам уже жмёт всё в два раза, и надо быть <s>завидным
скупердяем</s> очень бедным человеком, чтобы пожертвовать защищённым соединением
ради сжатия ещё в два раза.

Следует также понимать, что изменение коэффициента сжатия на клиенте никак не влияет
на коэффициент сжатия на сервере, который скорее всего установлен в значение по умолчанию
(как минимум, в [ejabberd](http://www.ejabberd.im) нет опций конфигурации для
управления коэффициентом сжатия потока). В итоге, "хакнув" указанный кусок кода в Ткаббере,
можно добиться только практически незаметного уменьшения трафика, идущего "вверх" — от клиента
на сервер; при этом трафик "вниз" (от сервера — клиенту) обычно значительно выше (если
только мы не занимаемся активной посылкой файлов при
помощи [**внутриканальных протоколов передачи**](Пересылка_файлов__теория.md#Внутри_и_снаружи)).

>





|

|
<
<




|
|
>
|
|
|

|
|
|
|

|
|


|
|

|
<

|

|
<
<

|

|
<
<
|
<
<
<
<
<
|

|

|
<
<

|
<
<
<

|

<
|
<
<
<
<
<

|

|

|
<

|
<

|

|
|
|

|
<

|
<
|
<
|
<
|
|
|

|

|
<

|

|
<

|

|
<

|
|
|

|
<
<

|
<
<
|
<
|
<

|

|
<

|

|
<

|
<

|
<

|
<

|

|

<
|
<
<
<
<
|
<

|
|
<
<

|
<

|

|
<
<
<

|

|
<

|

|

|

|

|
<

|

|
<
<

|

|
<
<
<
|
<
|
<
<
|
<
|
<
<
|
<
|
<
<
<

|
<
<
<
<
<
<

>
|
<
|
<

|

|
<
<
<
|
<
|
<
|
<
|

|

|
<
<
<
<
<
|
<
|
<
<

|

|

|

|

|
<
<

|

|
<
<
<
<
<
<
<
<

|

|

|
<
<
|
|
<
<
<

|
<
<
<
<
<

>
>
>
>
|

|
|

|
<
<
<
<

|

|
<
<
<
<
<
<
<

|
<
<
<
<
<
<
<

|
<
<
<
<

|
<

|
|
|
|
|
<
<
|
|
|
<
|
<
|
|
<
|

|

|
<

|
<

|
<

|
<
<

|
<
<
<

|
|
<
<
<

|
<



|



|
<

|
|
|
>
|
|
|
>
|
|
|
>
|
|
|

|
<
<

|
|
|
<
<
<
<
<
1
2
3
4
5
6
7
8
9
10


11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

35
36
37
38


39
40
41
42


43





44
45
46
47
48


49
50



51
52
53

54





55
56
57
58
59
60

61
62

63
64
65
66
67
68
69
70

71
72

73

74

75
76
77
78
79
80
81

82
83
84
85

86
87
88
89

90
91
92
93
94
95


96
97


98

99

100
101
102
103

104
105
106
107

108
109

110
111

112
113

114
115
116
117
118

119




120

121
122
123


124
125

126
127
128
129



130
131
132
133

134
135
136
137
138
139
140
141
142
143

144
145
146
147


148
149
150
151



152

153


154

155


156

157



158
159






160
161
162

163

164
165
166
167



168

169

170

171
172
173
174
175





176

177


178
179
180
181
182
183
184
185
186
187


188
189
190
191








192
193
194
195
196
197


198
199



200
201





202
203
204
205
206
207
208
209
210
211
212




213
214
215
216







217
218







219
220




221
222

223
224
225
226
227
228


229
230
231

232

233
234

235
236
237
238
239

240
241

242
243

244
245


246
247



248
249
250



251
252

253
254
255
256
257
258
259
260

261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278


279
280
281
282





[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Low_traffic_HOWTO/index.html)


# Low traffic HOWTO

Материал из Tkabber Wiki

Здесь рассказано как уменьшить трафик, "развиваемый" Ткаббером, для пользователей очень дорого интернета. 

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



## <a id="toc"></a>Содержание

* [1 Сжатие трафика](#Сжатие_трафика)
 * [1.1 Stream Compression/zlib](#Stream_Compression_zlib)
  * [1.1.1 "Обычный" Ткаббер](#Обычный_Ткаббер)
   * [1.1.1 Установка ztcl и tclmore в Windows](#Установка_ztcl_и_tclmore_в_Windows)
  * [1.1.2 Ткаббер-пак (Win32)](#Ткаббер-пак_Win32)
  * [1.1.3 Старпаки Ткаббера](#Старпаки_Ткаббера)
 * [1.2 PGP/GnuPG](#PGP_GnuPG)
* [2 Уменьшение XML-трафика](#Уменьшение_XML-трафика)
 * [2.1 Замечание о бинарных данных](#Замечание_о_бинарных_данных)
 * [2.2 Настройки Ткаббера](#Настройки_Ткаббера)
 * [2.3 Настройка пользователя](#Настройка_пользователя)
 * [2.4 Настройка сервера](#Настройка_сервера)
* [3 Средства самоконтроля](#Средства_самоконтроля)
 * [3.1 Плагин Traffic](#Плагин_Traffic)
 * [3.2 Сетевые средства](#Сетевые_средства)
* [4 Невошедшее](#Невошедшее)

# <a id="Сжатие_трафика"></a>Сжатие трафика
Это — единственный по-настоящему действенный способ уменьшить трафик. 

Существует, в принципе, три варианта сжатия трафика, из них реальный интерес представляет только первый — "Stream Compression": 


 [XEP-0138: Stream Compression](http://www.xmpp.org/extensions/xep-0138.html) 

 Использует один из зарегистрированных (и поддерживаемых) в XMPP методов сжатия и сжимает _весь_ XML-поток (то есть компрессор находится между XML-потоком и TCP/IP-потоком в сетевом стеке). Ткаббер поддерживает метод сжатия **zlib**. 



 Сжатие в протоколе TLS 

 Формально протокол TLS (SSL) поддерживает сжатие, однако, этот вопрос на уровне спецификации протокола проработан плохо — процитируем **[SSL\_COMP\_add\_compression\_method(3)](http://www.openssl.org/docs/ssl/SSL_COMP_add_compression_method.html)** из OpenSSL: 


_The TLS standard (or SSLv3) allows the integration of compression methods into the communication. The TLS RFC does however not specify compression methods or their corresponding identifiers, so there is currently no compatible way to integrate compression with unknown peers. It is therefore currently not recommended to integrate compression into applications. Applications for non-public use may agree on certain compression methods. Using different compression methods with the same identifier will lead to connection failure._





 Кроме того, в пакете [tcltls](http://tls.sourceforge.net), который служит прослойкой между Ткаббером и OpenSSL, отсутствуют "крутилки" для управления сжатием; статус этой фичи в драйвере TLS, реализованном в [ejabberd](http://ejabberd.jabber.ru), также неизвестен. Одним словом, _сжатие средствами TLS в Ткаббере невозможно._ 

 PGP (GnuPG) 

 _PGP сжимает данные перед их шифрованием,_ что, в принципе, способно уменьшить трафик. Однако, не надо быть чрезмерно оптимистичными относительно этого способа; об этом — читайте [ниже](Low_traffic_HOWTO.md#PGP_GnuPG). 



_Важно понимать, что **Stream Compression не может работать вместе с TLS (SSL),** то есть Вам придётся выбирать между сжатием и защитой канала._ По крайней мере [в ejabberd они вместе не работают](https://support.process-one.net/browse/EJAB-499), а потому и Ткаббер не даст включить их одновременно. 




О том, что Вы теряете, отказываясь от SSL, можно прочитать [здесь](Между_офлайном_и_онлайном.md#Защита_потока). 


Стоит добавить, что в контексте XMPP практически невозможно достичь такой же степени сжатия, которую способны показать алгортимы zlib на "простых файлах", всилу того, что в Stream Compression они рассматривают отдельно каждую [станцу](Терминология.md#Станца_stanza), а не весь сплошной XML-поток. Это происходит из-за того, что требуется обеспечивать передачу "почти в реальном времени" и передавать станцы по мере их готовности к передаче; сжатие же файлов может рассматривать такое количество байт, которое ограничено лишь размерами внутренних буферов, словаря, и требованиями к вычислительным ресурсам. 






## <a id="Stream_Compression_zlib"></a>Stream Compression/zlib

### <a id="Обычный_Ткаббер"></a>"Обычный" Ткаббер

Для включения сжатия в "обычном" Ткаббере Вам потребуется установить пакет **ztcl** и пакет **tclmore**, от которого тот зависит (о том, где их взять, — чуть ниже). 


Установив пакет, перезапустите Ткаббер. При этом в окне логина закладка **SSL** будет называться теперь **SSL & Сжатие.** Идите туда и отметьте галочку "Сжатие". 


**Где взять:** 

*  Исходный код: 
 *  [ztcl](http://sgolovan.nes.ru/jabber/ztcl/ztcl/ztcl_1.0b4_src.tar.gz) 
 *  [tclmore](http://sgolovan.nes.ru/jabber/ztcl/tclmore/tclmore_0.7b1_src.tar.gz) 

(Раньше они хостились в [соответствующих](https://gna.org/projects/ztcl/) [проектах](https://gna.org/projects/tclmore/) на gna.org, но они были удалены из-за неактивности автора.) 


*  Неофициальные сборки: 

 *  Пакеты для Debian sarge авторства Сергея Голованя (`xmpp:sgolovan@nes.ru`) доступны в [его репозитории](http://people.debian.org/~sgolovan/debian/) — найдите ниже вопрос про этот репозиторий и действуйте в соответствии с инструкциями. 

 *  [eXire](Участник_EXire.md) поддерживает [пакеты для Arch Linux](http://exire.dyndns.org:8081/arch/repo). 

 *  Mellon собрал эти пакеты для [Gentoo](http://www.gentoo.org) — они доступны в её багзилле: [tclmore](http://bugs.gentoo.org/show_bug.cgi?id=205412), [ztcl](http://bugs.gentoo.org/show_bug.cgi?id=205413). 
 *  Также пакеты должны быть доступны в [портах FreeBSD](http://portsmon.freebsd.org/portoverview.py?category=devel&portname=ztcl). 
 *  [kostix](Участник_Kostix.md) собрал оба пакета под Windows; их установке посвящён следующий раздел. 

#### <a id="Установка_ztcl_и_tclmore_в_Windows"></a>Установка ztcl и tclmore в Windows

Во-первых, вам понадобятся сами пакеты **ztcl** и **tclmore**, собранные под Win32. Они доступны [здесь](http://sgolovan.nes.ru/jabber/ztcl/). 


Для установки необходимо распаковать пакеты в каталог модулей тикля (обычно это **C:\\Tcl\\lib**). 

Во-вторых, Вам понадобится поставить Win32-версию библиотеки **zlib**, которую следует взять [здесь](http://gnuwin32.sourceforge.net/packages/zlib.htm). 


**Установка библиотеки zlib** 

Из скачанного архива вам потребуется файл **zlib1.dll**. Его нужно положить в любой каталог, содержащийся в переменной окружения **PATH**. Если эта фраза Вам ни о чём не говорит, у Вас есть три варианта: 


*  [Обучить](Настройка_Ткаббера__азы_и_глубже.md) себя локально; 
*  [Обучить](http://www.ozon.ru/context/detail/id/2988356/) себя глобально; 
*  Тупо положить **zlib1.dll** в каталог **C:\\Windows\\system32**, если с предыдущими пунктами ничего не вышло. 

**Вниманию пользователей Windows XP 64-bit Edition:** поскольку **ztcl** и **tclmore** собраны под x86, они требуют **zlib**, собранную также под x86 (именно такая и находится по ссылке, приведённой выше). Однако, имейте в виду две вещи: 



*  **zlib1.dll** из пакета **zlib** _не должна_ лежать в **%WINDIR%\\system32** из-за того, что там ищутся только "родные" (64-битные) библиотеки. Положите её в **%WINDIR%\\system** — она как раз предназначена для "старых", 32-битных библиотек. 


*  [Доступная в Интернет версия **zlib1.dll**, собранная под x64](http://www.winimage.com/zLibDll/), с ztcl _не работает._ 

*  На всякий случай: бессмысленно просить авторов собрать библиотеки под x64 — это потребует 64-битных версий всего Tcl/Tk и всех остальных бинарных пакетов. 


### <a id="Ткаббер-пак_Win32"></a>Ткаббер-пак (Win32)

[Kostix](Участник_Kostix.md) собрал [Ткаббер-пак под Windows](http://tkabber.jabber.ru/tkabber-pack/). Он поддерживает сжатие (как и все возможные расширения Ткаббера и стандартные плагины) "из коробки". 


### <a id="Старпаки_Ткаббера"></a>Старпаки Ткаббера

_Пользователи старпака_ использовать внешние модули, в принципе, могут, но их прикручивание связано с серьёзными трудностями (особенно в случае с **ztcl**). 


Вследствие [некоторых проблем](Старпак_и_сжатие.md) поддержка сжатия в старпаке — вещь нетривиальная и требующая серьёзных "приседаний" для реализации. 


Посему официальные старпаки пока что сжатие _не поддерживают_. Про неофициальные старпаки с поддержкой сжатия нам также неизвестно. 


Более подробно о внешних старкитах к "упакованным" дистрибутивам Ткаббера рассказано [здесь](Проблемы_со_звуком.md#_В_старпаке_старките_нет_звука). 


## <a id="PGP_GnuPG"></a>PGP/GnuPG

У сжатия в PGP есть две проблемы: 


*  В отличие от Stream Compression, который сжимает каждую [станцу](Терминология.md#Станца_stanza) перед отправкой, PGP сжимает _текст_ каждого сообщения перед шифрованием. После этого зашифрованный текст передаётся "вместо" оригинального сообщения, _будучи закодирован при помощи [base64](http://ru.wikipedia.org/wiki/Base64)._ Как известно, этот метод кодирования потока байтов с кодами 0..255 в поток символов ASCII способен увеличить размер оригинального сообщения на 30%, что может эффективно "сожрать" выгоду от сжатия, особенно на небольших сообщениях. 




*  Кроме того, PGP подписывает каждое отправляемое сообщение, и эта подпись также представляет собой элемент XML, содержащий около 100 символов **base64**. 


# <a id="Уменьшение_XML-трафика"></a>Уменьшение XML-трафика
Следовать указаниям этого раздела стоит лишь в том случае, если у вас ничего не вышло с **zlib**, или вы по каким-то причинам не можете его использовать (хотя единственная _серьёзная_ причина — это необходимость использовать SSL). 



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


## <a id="Замечание_о_бинарных_данных"></a>Замечание о бинарных данных

Протокол XMPP является в некотором роде "ASCII-протоколом" — любые бинарные данные вроде RAR-архивов и картинок передаются им в виде **base64**-представления оригинальных данных. Поэтому имейте в виду, что картинка размером 5 килобайт "на линии" будет весить до 6.5 килобайт. 




## <a id="Настройки_Ткаббера"></a>Настройки Ткаббера

Ещё раз напомним, что в борьбе с трафиком вы легко можете побороть функциональность и удобство работы! Поэтому руководствуйтесь принципом: 


 _семь раз отмерь, один — отрежь_ 

и глубоко обдумывайте каждый пункт. 

Пункты расположены по _предполагаемой_ (автором) "трафикопрожорливости". 

 Внутриканальная передача файлов 

 весьма неэффективна в плане использования трафика, так как файл фактически передаётся в виде шестибитного текста (**base64**). 


 Аватары 

 В отличие от эмоциконок (смайликов) аватары посылаются _и принимаются_ в виде картинок. Картинки бывают довольно большими. Поэтому, если Вы не хотите тратить свой трафик на эту чушь, убедитесь, что у Вас выключена опция меню **Службы → Расширения → Аватара → Разрешение загрузки**. 



 История комнат 

 При заходе в комнату Ткаббер запрашивает у сервера некоторое количество последних сообщений чтобы поместить пользователя в контекст происходящей в комнате дискуссии. Возможно настроить несколько параметров, находящихся в **Customize → Chat**: 



    ::muc::options(history_maxstanzas)

 задаёт максимальное количество сообщений, которые Ткаббер попросит у сервера. 0 означает, что сообщения запрошены не будут. 


    ::muc::options(history_maxchars)

 определяет максимальный объём текста сообщений в символах. 0 означает, что ничего принято не будет. 


    ::muc::options(request_only_unseen_history)

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




 Модуль Conference Info 







 Этот модуль, который включен по умолчанию, осуществляет периодические запросы списков участников тех конференций, закладки на которые присутствуют в вашем ростере, но в которых вы не находитесь в данный момент. Делается это для того, чтобы вы могли увидеть список участников конференции во всплывающей подсказке к закладке комнаты в ростере, не входя в комнату и не рассматривая её в дискавери. Чтобы отключить эти запросы, выключите флаг 
    ::plugins::conferenceinfo::options(autoask)

 в **Customize → Conference Info**. Вместо отключения запросов можно настроить их частоту в том же разделе настроек. 


 Уведомления о событиях чата 

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



    ::plugins::chatstate::options(enable)

 в **Customize → Chat → Chatstate** и 

    ::plugins::events::options(enable)

 в **Customize → Chat → Events**. 

 Ответы на IQ-запросы 

 На некоторые IQ-запросы отвечает Jabber-клиент. Сюда относятся запросы версии клиента, времени, запрос jabber:iq:last (время неактивности пользователя) и прочие, на которые не может ответить сервер. Посему, если вы хотите сэкономить трафик на ответах, запретите все или некоторые опции в **Customize → IQ**, начинающиеся со строк "reply\_" и "report\_"; наиболее "прожорливой", по-видимому, является опция 





    ::muc::options(report_muc_rooms)

 Имейте, однако, в виду, что на запрещённые в конфигурации IQ-запросы Ткаббер всё же посылает IQ-ответы с уведомлениями о неудавшемся запросе; это может "съесть" часть выгоды от запрещения нормальных ответов. 



Некоторые плагины также могут "втихую" пожирать ваш траффик, например: 

 georoster 

 Для выяснения географических координат пользоватей запрашивает vCard у каждого контакта в вашем ростере. 

 [Autoretrieve (неофициальный плагин)](Плагины.md#Autoretrieve) 

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



 Списки приватности 

 Если какой-то негодяй льёт вам в приват тонны сообщений, пытаясь завесить клиент или раскрутить на трафик, вы можете [внести его в списки приватности](Блокировка_MRIM-спама.md) (войти в меню **Tkabber → Обеспечение приватности** и внести в правила либо реальный джид (если флуд идёт напрямую, либо "комнатный" джид вида `room_name@conference.jabber.ru/flooder's_nick`). Не путайте списки приватности с игнором, который можно включить, щёлкнув правой кнопкой мыши на участнике конференции — игнор не блокирует трафик, он лишь скрывает сообщения от глаз. Списки же приватности обрабатываются на сервере, поэтому вы перестанете получать от этого джида _всё, что отметите, устанавливая на него правило, включая его запросы и презенс._ Но помните, что если флудер сменит ник в комнате, правило придётся либо переписывать, либо добавлять новое. 









## <a id="Настройка_пользователя"></a>Настройка пользователя

(То есть настройка себя.) 

*  Ограничьте себя в просмотре чужих vCards — они зачастую содержат фотографии большого размера (и, к сожалению, подавляющее большинство из них содержат какую угодно ахинею, но не фотографию владельца). 


*  Не используйте плагины типа [Autoretrieve](Плагины.md#Autoretrieve), которые запрашивают vCard у каждого заходящего в комнату пользователя. 
*  Старайтесь попусту не "ходить" в дискавери на список конференций — к примеру, таковой на jabber.ru "весит" примерно 180 килобайт; если вам интересна информация по конкретной комнате, наберите её имя в адресной строке окна дискавери в виде `имя_комнаты@conference.jabber.ru` — перейдёте прямо к ней, минуя полный список комнат. 




![(!)](../images/Hammer.png) **Сделать:** по-видимому, плагин whiteboard неплохо жрёт трафик 






## <a id="Настройка_сервера"></a>Настройка сервера

При помощи списков приватности на сервере можно останавливать некоторые виды _входящего_ трафика _прямо на сервере._ 

![(!)](../images/Hammer.png) **Сделать:** доработать 

# <a id="Средства_самоконтроля"></a>Средства самоконтроля
## <a id="Плагин_Traffic"></a>Плагин Traffic

В Ткаббере имеется [плагин Traffic](Плагины.md#Официальные_плагины_для_Ткаббера) авторства [feez'а](Участник_Feez.md). Установив его и запустив через **Службы → Расширения → Статистика по трафику**, вы сможете следить за тем, какие "примочки" Ткаббера поедают драгоценный трафик. Имейте, однако, в виду, что этот плагин меряет только объём XML-трафика, то есть он не способен учесть выгоду от применения Stream Compression, которое происходит "ниже" — перед передачей данных стеку TCP/IP. 





Расскажем вкратце о том, как пользоваться этим плагином. 

Итак, окно плагина открыто, и теперь нам надо выбрать соединение, которое мы хотим мониторить. Справа вверху есть выпадающий список, в котором видна надпись "0 None". Разверните список и выберите в нём нужное соединение (если их открыто больше одного). Установите интервал обновления в поле "Таймер" (5 секунд вполне достаточно) и удостоверьтесь, что кнопка справа от него стоит в значении "Выкл" (это означает, что автообновление работает, и при нажатии на кнопку отключится). Если вы не хотите пользоваться автообновлением окна (оно всё-таки потребляет ресурсы), можете обновлять его вручную с помощью кнопки "Обновить", расположенной справа от выпадающего списка. 








Автоматически ли или вручную, окно рано или поздно заполнится информацией. По горизонтали идут контакты ростера (в **Настройках → Плагины → Traffic** можно указать, показывать ли их в виде ника или джида): ваши друзья, а также конференции и фиды RSS. Самой последней строкой идёт суммарный трафик соединения. По вертикали — типы трафика: **Pres** (Presence, присутствие), **Iq** (Info-query, информация-запросы), **Msg** (Messages, сообщения), **All** (всего). **IN** — входящий трафик, **OUT** — исходящий. Нетрудно заметить, что наибольшую проблему создаёт сервис Info-query, особенно если у каких-либо контактов в vcard вставлены аватары и фотографии — их сразу же видно по увеличению трафика в разы. 








Когда плагин установлен, статистика считается автоматически с момента старта Ткаббера. Её можно сохранить для последуюего анализа с помощью скриптов или других инструментов (правда, нельзя загрузить сохранённый файл), а можно и обнулить, чтобы начать считать заново (к примеру, чтобы промерить отдельно "час пик"). Напоминаем ещё раз, что меряется **только** XML-трафик. 





Проведём интересный опыт (он будет просто потрясающ, если среди ваших контактов есть пользователи MSN Messenger'а). 


1.  Выберите момент затишья, чтобы собеседники не забивали статистику лишними строчками в окне. 
1.  Поставьте ручное обновление окна. 
1.  Обнулите счётчики. 
1.  Отлогиньтесь от MSN-гейта. 
1.  Обновите статистику. Если некоторые из контактов были в онлайне, они появятся в списке, имея чуть меньше 250 байт трафика Pres IN. Сам транспорт, естественно, тоже вышлет свой презенс в 87 байт размером в обмен на ваш ему Pres OUT. 


1.  Сбросьте счётчики снова. 
1.  Снова залогиньтесь к гейту и снова обновите статистику. 
 *  При логине трафик презенса увеличивается: у транспорта в три раза, у контактов — больше, чем в четыре! 

 *  Но это ещё цветочки: один-единственный запрос Iq порождает трафик в 40-70 килобайт (если у контакта в vcard не вставлена фотка размером с wallpaper)!!! 

 *  Вход или выход одного человека из конференции увеличивают её входящий презенс-трафик на 250-500 байт. На первый взгляд немного, но в час пик, когда входит и выходит много народу, набегает... 
 

1.  Померяйте сами трафик, создаваемый плагинами chess, checkers, reversi, whiteboard и так далее. 

## <a id="Сетевые_средства"></a>Сетевые средства

Существуют всевозможные мерялки трафика, которые как раз способны вести учёт того, что оказывается непосредственно "на линии". 


Для измерения TCP/IP трафика под виндами можно порекоммендовать бесплатный (для простых применений) [TMeter](http://www.TMeter.RU). 


Если у вас модем, то очень хорошим решением является [ModemSpd](http://www.online.az/modemspdV0.902beta.zip) с [модулем декодирования Unimodem-диагностики](http://www.rampitec.spb.ru/modem.htm#ud). 


К сожалению, измерения такими средствами страдают от невозможности классифицировать трафик XMPP (так, как это делает плагин **Traffic**, к примеру) — без ухищрений можно померять только "сколько всего" и "с какой скоростью". 



![(?)](../images/Attention.png) **Поправьте меня:** Впрочем, если память мне не изменяет, файерволл [Agnitum Outpost](http://www.agnitum.com/products/outpost/) даже в [бесплатной версии](http://www.agnitum.com/download/OutpostInstall.exe) меряет трафик, который накручивает каждая программа в отдельности. 




# <a id="Невошедшее"></a>Невошедшее
В процессе разбирательств с добрым Йоххо-тяном в комнате Ткаббера по поводу сравнительного меряния трафика с включённым сжатием между Бомбусом и Ткаббером, [kostix](Участник_Kostix.md) 02:36, 22 апреля 2008 (MSD) выяснил, что Ткаббер жмёт трафик, используя степерь сжатия, которую zlib использует по умолчанию ([Mellon](Участник_Mellon.md) сообщает, что она равна 6). 




Увеличить её до максимального значения можно, изменив в процедуре `transport::zlib::import`, определённой в файле jabberlib/transports.tcl, строку 


    zlib stream $sock RDWR -output compress -input decompress

на 

    zlib stream $sock RDWR -output compress -input decompress -level 9

Тестирование на получении ростера (~120 контактов + закладки на конференции + аннотации к некоторым элементам) и начального присутствия от JID'ов всех его элементов, к которым это относится: 


1.  открытый текст, без zlib: 
 *  принято:  65 пакетов, 37969 байтов 
 *  отправлено: 46 пакетов, 11134 байтов 
 
1.  открытый текст, zlib (уровень сжатия по умолчанию): 
 *  принято:  53 пакетов, 8990 байтов 
 *  отправлено: 39 пакетов, 3805 байтов 
 
1.  открытый текст, zlib (уровень сжатия на клиенте — 9): 
 *  принято:  51 пакетов, 8886 (8941) байтов 
 *  отправлено: 38 пакетов, 3754 (3750) байтов 
 
1.  TLS (SSL): 
 *  принято:  58 пакетов, 18863 байтов 
 *  отправлено: 45 пакетов, 5307 байтов 

Комментарий: TLS — наше всё. Он сам уже жмёт всё в два раза, и надо быть <s>завидным скупердяем</s> очень бедным человеком, чтобы пожертвовать защищённым соединением ради сжатия ещё в два раза. 



Следует также понимать, что изменение коэффициента сжатия на клиенте никак не влияет на коэффициент сжатия на сервере, который скорее всего установлен в значение по умолчанию (как минимум, в [ejabberd](http://www.ejabberd.im) нет опций конфигурации для управления коэффициентом сжатия потока). В итоге, "хакнув" указанный кусок кода в Ткаббере, можно добиться только практически незаметного уменьшения трафика, идущего "вверх" — от клиента на сервер; при этом трафик "вниз" (от сервера — клиенту) обычно значительно выше (если только мы не занимаемся активной посылкой файлов при помощи [внутриканальных протоколов передачи](Пересылка_файлов__теория.md#Внутри_и_снаружи)). 







Changes to wiki/ru/MUC_Ignore.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/MUC_Ignore/index.html)


# MUC Ignore

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Вступление](#Вступление)
* [2 Минимум теории](#Минимум_теории)
* [3 Реализация](#Реализация)
* [4 Проблемы](#Проблемы)
   * [4.1 Ненадёжность (нестабильность) ников](#Ненадёжность_нестабильность_ников)
      * [4.1.1 "Запачканные" ники](#Запачканные_ники)
   * [4.2 Переконфигурации комнаты](#Переконфигурации_комнаты)

## <a id="Вступление"></a>Вступление
[**Kostix**](Участник_Kostix.md) 03:32, 15 декабря 2006 (MSK)

Это нечто вроде Request For Comments на реализацию "MUC Ignoring" в Ткаббере.

Реализация оказалась не _настолько_ простой, как я изначально предполагал: есть некоторые
проблемы "теоретического" характера, которые и предлагается обсудить желающим. Выдвигайте варианты.

## <a id="Минимум_теории"></a>Минимум теории
Комнаты в XMPP делятся на три группы по "видимости" _реальных JID'ов_ участников для остальных участников:

*  полностью анонимные — реальные джиды не видны никому;
*  полуанонимные — (дефолтный тип комнаты в "ёжике") — все модераторы (role == moderator),
   в том числе и временные, видят джиды всех участников; единственное отличие временных от
   постоянных в том, что они видят джиды лишь тех, кто вошёл в комнату в течение времени, пока они у "руля");
*  неанонимные — все видят реальные джиды всех.

Сообщения в комнату `node@server` от юзера с ником `nick` приходят от джида `node@server/nick`, то есть это полный джид.

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

## <a id="Реализация"></a>Реализация
Идея (в формулировке [**Teo**](Участник_Teo.md)):

*  Раздельный игнор сообщений в комнату и приват:
   *  Сообщения в комнату от игнорируемого участника помещаются, но скрываются; снятие игнора
      "показывает" сообщения, и наоборот;
   *  Сообщения в приват от игнорируемого участника молча удушаются.

Ткаббер умеет прекрасно просекать смену ника участником в комнате, то есть смены ника не
мешают обоим игнорам, т. к.  механизм игноров отслеживает их.

Требуется хранить правила игнора между сеансами работы Ткаббера. Предполагается хранить
правила (логически) в таком виде:

*  SESSION\_JID1
   *  ROOM\_JID1 (комната анонимная)
      *  NICK1
      *  NICK2  
         ...

   *  ROOM\_JID2 (комната анонимная)
      *  NICK1  
         ...
      *  NICKN  
         ...

*  SESSION\_JID2
   *  ROOM\_JID1 (комната неанонимная)
      *  REAL\_JID1  
         ...
      *  REAL\_JIDN  
         ...

! "SESSION\_JID" это "наш" джид подключения.

Идея такая, что для игнорируемого участника хранится реальный джид, если он доступен,
в противном случае -- ник.

> Обоснование: реальный джид намного "стабильнее", чем ник; несмотря на то, что ник
  может быть зарегистрирован, никакого способа узнать об этом факте, по-видимому,
  не существует; как минимум, — в Ткаббере.

## <a id="Проблемы"></a>Проблемы
### <a id="Ненадёжность_нестабильность_ников"></a>Ненадёжность (нестабильность) ников

Засранец легко может генерить ники вида "freak01 ", "freak02", "freak03" и реально игнор
будет полезен только пока засранец не покинул комнату. После этого смысл хранить забаненным
ник "freak03" в такой-то комнате представляется сомнительным — при следующем сеансе
работы этот ник в этой комнате может не иметь никакого смысла.

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

> В Customize есть опция "transient\_rules" — если она включена, правила не сохраняются.

Также: какой ник сохранять в правилах, если недоступен реальный джид, — тот, который
заигнорили, или тот, который засранец имел при выходе из комнаты/нашем от неё отключении?

Если сохранять "первый" ник, то нужно либо сразу флашить правила в базу данных Customize,
либо запоминать этот первый ник, если база сбрасывается в какой-то другой момент (см. ниже про UID).

**Текущая реализация:** запоминаем текущий ник или реальный джид, если доступен;
флашим базу Customize.

#### <a id="Запачканные_ники"></a>"Запачканные" ники

[**Kostix**](Участник_Kostix.md) 03:00, 17 декабря 2006 (MSK) обновление реализации:

"Сокрытие" сообщений от засранца в комнате делается заключением всего сообщения в тэг вида

    IGNORED-$id

с `-elide 1`, где $id -- некий уникальный в пределах сессии идентификатор засранца;
при переименовании засранца его идентификатор не меняется.

Остаётся проблема: если за время пребывания в комнате засранец сменил несколько
ников, то если мы перезайдём в комнату, нам прилетит история, в которой могут быть
сообщения с этих ников; при этом игнорированы будут только сообщения, пришедшие с
текущего ника игнорируемого, если он в данный момент находится в комнате.

Бороться с этим злом, видимо, нельзя, т.к. с сообщениями истории реальные джиды не
передаются, даже если они доступны. Хранить историю смены ников — глупо, т. к. опять
встаёт проблема "запачканных" ников: что если в комнате появится нормальная персона,
взявшая себе один из таких ников?

C'est la vie.

### <a id="Переконфигурации_комнаты"></a>Переконфигурации комнаты

Уровень анонимности комнаты может меняться; текущая версия ёжика не умеет генерить уведомления
об этом, а ткаббер не умеет их просекать, так что проблема "рантайма" нас (пока) не интересует.
Интересует проблема соотношения сохранённых правил и новой конфигурации комнаты.

Интересны 2 случая:

*  "Реальные джиды доступны → Сохранены правила с реальными джидами → Комната переконфигурирована
   и реальные джиды больше недоступны" — в этом случае соответствующие сохранённые правила перестают
   иметь смысл, так как их больше не применить к участникам.
*  "Реальные джиды недоступны → Сохранены правила с джидами комнаты → Комната переконфигурирована
   и реальные джиды доступны" — в этом случае, по идее, следует "продвинуть" джиды комнаты до
   реальных при первой возможности; насколько это правильно? (нет гарантии, что комнатный джид
   в момент сохранения соответствовал человеку, который с ним объявился в комнате в данный момент).
*  Ещё варианты?

Прямолинейный подход — хранить _и_ комнатный, _и_ реальный джиды, если возможно, — страдает от
той же проблемы: связь между этими джидами можно проверить только при наличии доступа к
реальным джидам. Кроме того, это затрудняет хранение правил.

**Текущая реализация:** храним либо реальный джид, либо -- ник; первый имеет преимущество.
На проблемы с переконфигурацией плюём, руководствуясь принципами бритвы "brAun Occam". :)
Кроме того, скорее всего будет приделан диалог формального редактирования правил, при
помощи которого можно будет обороть такие проблемы.

**Вопрос:** не следует ли хранить вместе с джидом комнаты статус её анонимности и каким-либо
образом пердуперждать пользователя, если он изменился с момента последнего сохранения
правил? (Выглядит разумным компромиссом.) Собственно, не мудрствуя лукаво: факт доступности
реального джида во время обработки присутствия от первого же присутствующего позволяет узнать
изменился ли статус анонимности комнаты.

[**Archimed**](Участник_Archimed.md) 17:06, 18 декабря 2006 (MSK)

Хранить статус комнаты вместе с её JID - мне кажется хорошим решением. Может вместо
формального диалога редактирования правил сделать просто ещё одну группу «Игнор», вдобавок
к «Модераторы» и «Участники» в списке участников конференции? И добавить возможность
перетаскивать ники в/из этой группы.

>











|
|
|

|
|

|

|
<

|
|

|
|
<
<
|

|

|
<

|
|

|
|
<
|

|
<

|
<

|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|

|

|
<

|
<
<

|
|

|
<
<
<

|
<

|

|
<

|
<

|
<

|

|

|



|
<

|
<
<
<

|
<
<
<

|

|

|
<
<

|

|
<
<
|
<
<
<
|

|
<
<

|
<
<
<

|
<
<
<
<

|

|
|
|
<
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

24
25
26
27
28
29


30
31
32
33
34

35
36
37
38
39
40

41
42
43

44
45

46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

69
70


71
72
73
74
75



76
77

78
79
80
81

82
83

84
85

86
87
88
89
90
91
92
93
94
95

96
97



98
99



100
101
102
103
104
105


106
107
108
109


110



111
112
113


114
115



116
117




118
119
120
121
122
123

[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/MUC_Ignore/index.html)


# MUC Ignore

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Вступление](#Вступление)
* [2 Минимум теории](#Минимум_теории)
* [3 Реализация](#Реализация)
* [4 Проблемы](#Проблемы)
 * [4.1 Ненадёжность (нестабильность) ников](#Ненадёжность_нестабильность_ников)
  * [4.1.1 "Запачканные" ники](#Запачканные_ники)
 * [4.2 Переконфигурации комнаты](#Переконфигурации_комнаты)

# <a id="Вступление"></a>Вступление
[Kostix](Участник_Kostix.md) 03:32, 15 декабря 2006 (MSK) 

Это нечто вроде Request For Comments на реализацию "MUC Ignoring" в Ткаббере. 

Реализация оказалась не _настолько_ простой, как я изначально предполагал: есть некоторые проблемы "теоретического" характера, которые и предлагается обсудить желающим. Выдвигайте варианты. 


# <a id="Минимум_теории"></a>Минимум теории
Комнаты в XMPP делятся на три группы по "видимости" _реальных JID'ов_ участников для остальных участников: 

*  полностью анонимные — реальные джиды не видны никому; 
*  полуанонимные — (дефолтный тип комнаты в "ёжике") — все модераторы (role == moderator), в том числе и временные, видят джиды всех участников; единственное отличие временных от постоянных в том, что они видят джиды лишь тех, кто вошёл в комнату в течение времени, пока они у "руля"); 


*  неанонимные — все видят реальные джиды всех. 

Сообщения в комнату `node@server` от юзера с ником `nick` приходят от джида `node@server/nick`, то есть это полный джид. 

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


# <a id="Реализация"></a>Реализация
Идея (в формулировке [Teo](Участник_Teo.md)): 

*  Раздельный игнор сообщений в комнату и приват: 
 *  Сообщения в комнату от игнорируемого участника помещаются, но скрываются; снятие игнора "показывает" сообщения, и наоборот; 

 *  Сообщения в приват от игнорируемого участника молча удушаются. 

Ткаббер умеет прекрасно просекать смену ника участником в комнате, то есть смены ника не мешают обоим игнорам, т. к.  механизм игноров отслеживает их. 


Требуется хранить правила игнора между сеансами работы Ткаббера. Предполагается хранить правила (логически) в таком виде: 


*  SESSION\_JID1 
 *  ROOM\_JID1 (комната анонимная) 
  *  NICK1 
  *  NICK2
... 
 
 *  ROOM\_JID2 (комната анонимная) 
  *  NICK1
... 
  *  NICKN
... 

*  SESSION\_JID2 
 *  ROOM\_JID1 (комната неанонимная) 
  *  REAL\_JID1
... 
  *  REAL\_JIDN
... 

! "SESSION\_JID" это "наш" джид подключения. 

Идея такая, что для игнорируемого участника хранится реальный джид, если он доступен, в противном случае -- ник. 


 Обоснование: реальный джид намного "стабильнее", чем ник; несмотря на то, что ник может быть зарегистрирован, никакого способа узнать об этом факте, по-видимому, не существует; как минимум, — в Ткаббере. 



# <a id="Проблемы"></a>Проблемы
## <a id="Ненадёжность_нестабильность_ников"></a>Ненадёжность (нестабильность) ников

Засранец легко может генерить ники вида "freak01 ", "freak02", "freak03" и реально игнор будет полезен только пока засранец не покинул комнату. После этого смысл хранить забаненным ник "freak03" в такой-то комнате представляется сомнительным — при следующем сеансе работы этот ник в этой комнате может не иметь никакого смысла. 




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


 В Customize есть опция "transient\_rules" — если она включена, правила не сохраняются. 

Также: какой ник сохранять в правилах, если недоступен реальный джид, — тот, который заигнорили, или тот, который засранец имел при выходе из комнаты/нашем от неё отключении? 


Если сохранять "первый" ник, то нужно либо сразу флашить правила в базу данных Customize, либо запоминать этот первый ник, если база сбрасывается в какой-то другой момент (см. ниже про UID). 


**Текущая реализация:** запоминаем текущий ник или реальный джид, если доступен; флашим базу Customize. 


### <a id="Запачканные_ники"></a>"Запачканные" ники

[Kostix](Участник_Kostix.md) 03:00, 17 декабря 2006 (MSK) обновление реализации: 

"Сокрытие" сообщений от засранца в комнате делается заключением всего сообщения в тэг вида 

    IGNORED-$id

с `-elide 1`, где $id -- некий уникальный в пределах сессии идентификатор засранца; при переименовании засранца его идентификатор не меняется. 


Остаётся проблема: если за время пребывания в комнате засранец сменил несколько ников, то если мы перезайдём в комнату, нам прилетит история, в которой могут быть сообщения с этих ников; при этом игнорированы будут только сообщения, пришедшие с текущего ника игнорируемого, если он в данный момент находится в комнате. 




Бороться с этим злом, видимо, нельзя, т.к. с сообщениями истории реальные джиды не передаются, даже если они доступны. Хранить историю смены ников — глупо, т. к. опять встаёт проблема "запачканных" ников: что если в комнате появится нормальная персона, взявшая себе один из таких ников? 




C'est la vie. 

## <a id="Переконфигурации_комнаты"></a>Переконфигурации комнаты

Уровень анонимности комнаты может меняться; текущая версия ёжика не умеет генерить уведомления об этом, а ткаббер не умеет их просекать, так что проблема "рантайма" нас (пока) не интересует. Интересует проблема соотношения сохранённых правил и новой конфигурации комнаты. 



Интересны 2 случая: 

*  "Реальные джиды доступны → Сохранены правила с реальными джидами → Комната переконфигурирована и реальные джиды больше недоступны" — в этом случае соответствующие сохранённые правила перестают иметь смысл, так как их больше не применить к участникам. 


*  "Реальные джиды недоступны → Сохранены правила с джидами комнаты → Комната переконфигурирована и реальные джиды доступны" — в этом случае, по идее, следует "продвинуть" джиды комнаты до реальных при первой возможности; насколько это правильно? (нет гарантии, что комнатный джид в момент сохранения соответствовал человеку, который с ним объявился в комнате в данный момент). 



*  Ещё варианты? 

Прямолинейный подход — хранить _и_ комнатный, _и_ реальный джиды, если возможно, — страдает от той же проблемы: связь между этими джидами можно проверить только при наличии доступа к реальным джидам. Кроме того, это затрудняет хранение правил. 



**Текущая реализация:** храним либо реальный джид, либо -- ник; первый имеет преимущество. На проблемы с переконфигурацией плюём, руководствуясь принципами бритвы "brAun Occam". :) Кроме того, скорее всего будет приделан диалог формального редактирования правил, при помощи которого можно будет обороть такие проблемы. 




**Вопрос:** не следует ли хранить вместе с джидом комнаты статус её анонимности и каким-либо образом пердуперждать пользователя, если он изменился с момента последнего сохранения правил? (Выглядит разумным компромиссом.) Собственно, не мудрствуя лукаво: факт доступности реального джида во время обработки присутствия от первого же присутствующего позволяет узнать изменился ли статус анонимности комнаты. 





[Archimed](Участник_Archimed.md) 17:06, 18 декабря 2006 (MSK) 

Хранить статус комнаты вместе с её JID - мне кажется хорошим решением. Может вместо формального диалога редактирования правил сделать просто ещё одну группу «Игнор», вдобавок к «Модераторы» и «Участники» в списке участников конференции? И добавить возможность перетаскивать ники в/из этой группы. 



Changes to wiki/ru/Nick_coloring.md.

1
2

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Nick_coloring/index.html)


# Nick coloring

Материал из Tkabber Wiki

Предлагается переделать систему раскраски ников/сообщений.

В настоящее время схема такая:

*  Если ник неизвестен ткабберу, он выбирает цвет случайным образом из некоторого
   предварительно сформированного пула;
*  Этот цвет закрепляется за ником, соответствия ников и цветов сохраняются;
*  Цвет ника можно менять вручную.

Идея [*hypersw*](Участник_Hypersw.md):

*  Убрать пул и случайность; генерировать цвет из набора ярких цветов на
   основе (некоторого) хэша строки ника;

Идея [**teo**](Участник_Teo.md):

*  Не хранить соответствие цветов никам для "автосгенерированных" цветов;
*  Запоминать только ручные изменения;
*  Не делать даже run-time карту отображения ников в цвета, считать цвет
   для каждого сообщения при помощи упомянутой хэш-функции.

[16:55]\<kostix> teo: насчёт раскраски ников: если ты не хочешь хранить соответствие
цветов никам, то как их вручную редактировать? или мы будем хранить только эти вручную
заданные цвета?

[16:55]\<teo> kostix: да

[16:56]\<teo> там надо просто вынести все обращения к массиву NickColors в
отдельную процедуру. которая проверит массив, и если там нет ника, то
сгенерирует цвет сама.

---

В качестве хэш-функций предполагается использовать что-либо из **tcllib**:

*  [cksum](http://tcllib.sourceforge.net/doc/cksum.html)
*  [sum](http://tcllib.sourceforge.net/doc/sum.html)

Тесты (Tcl 8.4.9, cksum 1.1.0, sum 1.1.0, Linux 2.6.8, 5996.54 bogomips):

    % time { crc::cksum gabbagabbahey! } 10000
    67 microseconds per iteration
    % time { crc::sum gabbagabbahey! } 10000
    41 microseconds per iteration

Использовать, видимо, надо **sum**, т.к. нас интересует наибольшая скорость вычисления.

---

Заморочки с RGB vs HLS от [*hypersw*](Участник_Hypersw.md):

[раз](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2006/12/24.html#01:12:07):

\<hypersw> kostix: Алгоритм примерно такой.

    nickname-string => hash
    hash % 252 => hue
    (hue, default-luminosity, default-saturation) => color

\<hypersw> kostix:

    Color GetNickColor(string sNickName)
    {
      byte hue = unchecked((uint)sNickName.GetHashCode()) % 253;
      return HLS2RGB(hue, 80, 252);
    }

[два](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2006/12/24.html#02:18:45):

\<hypersw> kostix:

    /// <summary>
    /// Converts an HLS color to an RGB color and returns three byte components.
    /// </summary>
    public static void HLStoRGB(UInt16 H, UInt16 L, UInt16 S, out Byte R, out Byte G, out Byte B)
    {
     UInt16 Magic1, Magic2; /* calculated magic numbers (really!) */


>




|

|

|
<
|
|

|

|
<

|

|
|
|
<

|
<
<

|

|
<
<



|

|
|

|






|



|

|

|





|







|
<
<







1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18

19
20
21
22
23
24

25
26


27
28
29
30


31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68


69
70
71
72
73
74
75
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Nick_coloring/index.html)


# Nick coloring

Материал из Tkabber Wiki

Предлагается переделать систему раскраски ников/сообщений. 

В настоящее время схема такая: 

*  Если ник неизвестен ткабберу, он выбирает цвет случайным образом из некоторого предварительно сформированного пула; 

*  Этот цвет закрепляется за ником, соответствия ников и цветов сохраняются; 
*  Цвет ника можно менять вручную. 

Идея [hypersw](Участник_Hypersw.md): 

*  Убрать пул и случайность; генерировать цвет из набора ярких цветов на основе (некоторого) хэша строки ника; 


Идея [teo](Участник_Teo.md): 

*  Не хранить соответствие цветов никам для "автосгенерированных" цветов; 
*  Запоминать только ручные изменения; 
*  Не делать даже run-time карту отображения ников в цвета, считать цвет для каждого сообщения при помощи упомянутой хэш-функции. 


[16:55]\<kostix> teo: насчёт раскраски ников: если ты не хочешь хранить соответствие цветов никам, то как их вручную редактировать? или мы будем хранить только эти вручную заданные цвета? 



[16:55]\<teo> kostix: да 

[16:56]\<teo> там надо просто вынести все обращения к массиву NickColors в отдельную процедуру. которая проверит массив, и если там нет ника, то сгенерирует цвет сама. 



---

В качестве хэш-функций предполагается использовать что-либо из **tcllib**: 

*  [cksum](http://tcllib.sourceforge.net/doc/cksum.html) 
*  [sum](http://tcllib.sourceforge.net/doc/sum.html) 

Тесты (Tcl 8.4.9, cksum 1.1.0, sum 1.1.0, Linux 2.6.8, 5996.54 bogomips): 

    % time { crc::cksum gabbagabbahey! } 10000
    67 microseconds per iteration
    % time { crc::sum gabbagabbahey! } 10000
    41 microseconds per iteration

Использовать, видимо, надо **sum**, т.к. нас интересует наибольшая скорость вычисления. 

---

Заморочки с RGB vs HLS от [hypersw](Участник_Hypersw.md): 

[раз](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2006/12/24.html#01:12:07): 

\<hypersw> kostix: Алгоритм примерно такой. 

    nickname-string => hash
    hash % 252 => hue
    (hue, default-luminosity, default-saturation) => color

\<hypersw> kostix: 

    Color GetNickColor(string sNickName)
    {
      byte hue = unchecked((uint)sNickName.GetHashCode()) % 253;
      return HLS2RGB(hue, 80, 252);
    }

[два](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2006/12/24.html#02:18:45): \<hypersw> kostix: 



    /// <summary>
    /// Converts an HLS color to an RGB color and returns three byte components.
    /// </summary>
    public static void HLStoRGB(UInt16 H, UInt16 L, UInt16 S, out Byte R, out Byte G, out Byte B)
    {
     UInt16 Magic1, Magic2; /* calculated magic numbers (really!) */
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
       /* get RGB, change units from c_nMaxHLS to c_nMaxRGB */
       R = (byte)((HueToRGB(Magic1, Magic2, (ushort)(H + (c_nMaxHLS / 3))) * c_nMaxRGB + (c_nMaxHLS / 2)) / c_nMaxHLS);
       G = (byte)((HueToRGB(Magic1, Magic2, H) * c_nMaxRGB + (c_nMaxHLS / 2)) / c_nMaxHLS);
       B = (byte)((HueToRGB(Magic1, Magic2, (ushort)(H - (c_nMaxHLS / 3))) * c_nMaxRGB + (c_nMaxHLS / 2)) / c_nMaxHLS);
     }
    }

[три](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2006/12/24.html#02:20:02):

\<hypersw> kostix: и ещё

    /// <summary>
    /// Utility routine for HLStoRGB.
    /// </summary>
    public static UInt16 HueToRGB(UInt16 n1, UInt16 n2, UInt16 hue)
    {
     /* range check: note values passed add/subtract thirds of range */







|

|







94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
       /* get RGB, change units from c_nMaxHLS to c_nMaxRGB */
       R = (byte)((HueToRGB(Magic1, Magic2, (ushort)(H + (c_nMaxHLS / 3))) * c_nMaxRGB + (c_nMaxHLS / 2)) / c_nMaxHLS);
       G = (byte)((HueToRGB(Magic1, Magic2, H) * c_nMaxRGB + (c_nMaxHLS / 2)) / c_nMaxHLS);
       B = (byte)((HueToRGB(Magic1, Magic2, (ushort)(H - (c_nMaxHLS / 3))) * c_nMaxRGB + (c_nMaxHLS / 2)) / c_nMaxHLS);
     }
    }

[три](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2006/12/24.html#02:20:02): 

\<hypersw> kostix: и ещё 

    /// <summary>
    /// Utility routine for HLStoRGB.
    /// </summary>
    public static UInt16 HueToRGB(UInt16 n1, UInt16 n2, UInt16 hue)
    {
     /* range check: note values passed add/subtract thirds of range */
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
      return (ushort)(n1 + (((n2 - n1) * (((c_nMaxHLS * 2) / 3) - hue) + (c_nMaxHLS / 12)) / (c_nMaxHLS / 6)));
     else
      return (n1);
    }

---

Теория от [*hypersw*](Участник_Hypersw.md):

\<hypersw> kostix: В системе координат HLS можно сгенерить разные цвета примерно одной
яркости, отличающиеся оттенком. В координатах RGB ты это так просто не сделаешь. Хотя
попробовать можно — задаёшь 3 или 6 базовых цветов (равномерно отстоящих на цветовом круге),
делаешь одномерную координату, по ней определяешь, между какими двумя цветами попала точка,
намешиваешь их пропорционально. По сути получится эмуляция HLS, зачем, если всё уже придумано до нас :)

\<hypersw> kostix: Если рассмотреть пространство RGB, где R, G, B — три перпендикулярные
координатные оси (каждая от 0 до 255), то получится кубик. Цвета с одинаковой яркостью
(примерно…) будут сидеть в плоскости, перпендикулярной большой диагонали (0,0,0) — (255,255,255).
На этой диагонали — серые цвета, чем дальше от неё, тем сочнее. Таким образом, нас
интересует линия, получающаяся при пересечении той плоскостью граней куба.

\<hypersw> kostix: в зависимости от точки на большой диагонали, через которую проходит
плоскость, наша линия будет либо треугольником, либо шестиугольником. Ну или точкой, на
концах :) Пространство HLS делает из этой хрени два конуса, состыкованных основаниями. Ось
(линия между вершинами) — бывшая большая диагональ куба, с серыми цветами. На поверхности
конуса — самые сочные цвета.

---

[**ycbl**](Участник_Bigote.md) предлагает: в случае возможности видеть джиды участников (в
полуанонимных комнатах для админов и в неанонимных — для всех) генерировать цвета не по
никам, а именно по джидам участников. Таким образом, например, некто kostix, любящий
переименовываться в кого ни попадя, зимой и летом будет виден одним цветом. Собственно,
ничто не мешает также отслеживать переименования участников и пристёгивать старые цвета к
новым никам → решение проблемы для анонимных и полуанонимных комнат (для не-админов).
Механизм отслеживания можно взять из плагина игноров.

[**Kostix**](Участник_Kostix.md) 03:29, 27 декабря 2006 (MSK) Идея с джидами интересна.
Возможно, так и стоит сделать. Отслеживание ников требует более сложных заморочек типа
таблицы связей "канонических" ников (на которых считается хэш) с текущими. Это противоречит
идее _не хранить таблицу отображения ников на их цвета в памяти_ (см. выше).

---

[**ycbl**](Участник_Bigote.md) 00:06, 24 марта 2008 (MSK) Ещё одна мысль: если уж переделывать,
то стоит учесть разные цветовые схемы и добавить в настройки возможность выбора цветовой
гаммы ников. Потому что если у человека установлена тёмная схема, чёрные и синие цвета
ников будут практически не видны, как не видны в стандартной схеме разные розовые,
бледно-оранжевые и прочие пастельные цвета.







|

|
<
<
<
<

|
<
<
<
<

|
<
<
<
<



|
<
<
<
<
<
<

<
|
<
<



|
|
|
<
<
121
122
123
124
125
126
127
128
129
130




131
132




133
134




135
136
137
138






139

140


141
142
143
144
145
146


      return (ushort)(n1 + (((n2 - n1) * (((c_nMaxHLS * 2) / 3) - hue) + (c_nMaxHLS / 12)) / (c_nMaxHLS / 6)));
     else
      return (n1);
    }

---

Теория от [hypersw](Участник_Hypersw.md): 

\<hypersw> kostix: В системе координат HLS можно сгенерить разные цвета примерно одной яркости, отличающиеся оттенком. В координатах RGB ты это так просто не сделаешь. Хотя попробовать можно — задаёшь 3 или 6 базовых цветов (равномерно отстоящих на цветовом круге), делаешь одномерную координату, по ней определяешь, между какими двумя цветами попала точка, намешиваешь их пропорционально. По сути получится эмуляция HLS, зачем, если всё уже придумано до нас :) 





\<hypersw> kostix: Если рассмотреть пространство RGB, где R, G, B — три перпендикулярные координатные оси (каждая от 0 до 255), то получится кубик. Цвета с одинаковой яркостью (примерно…) будут сидеть в плоскости, перпендикулярной большой диагонали (0,0,0) — (255,255,255). На этой диагонали — серые цвета, чем дальше от неё, тем сочнее. Таким образом, нас интересует линия, получающаяся при пересечении той плоскостью граней куба. 





\<hypersw> kostix: в зависимости от точки на большой диагонали, через которую проходит плоскость, наша линия будет либо треугольником, либо шестиугольником. Ну или точкой, на концах :) Пространство HLS делает из этой хрени два конуса, состыкованных основаниями. Ось (линия между вершинами) — бывшая большая диагональ куба, с серыми цветами. На поверхности конуса — самые сочные цвета. 





---

[ycbl](Участник_Bigote.md) предлагает: в случае возможности видеть джиды участников (в полуанонимных комнатах для админов и в неанонимных — для всех) генерировать цвета не по никам, а именно по джидам участников. Таким образом, например, некто kostix, любящий переименовываться в кого ни попадя, зимой и летом будет виден одним цветом. Собственно, ничто не мешает также отслеживать переименования участников и пристёгивать старые цвета к новым никам → решение проблемы для анонимных и полуанонимных комнат (для не-админов). Механизм отслеживания можно взять из плагина игноров. 








[Kostix](Участник_Kostix.md) 03:29, 27 декабря 2006 (MSK) Идея с джидами интересна. Возможно, так и стоит сделать. Отслеживание ников требует более сложных заморочек типа таблицы связей "канонических" ников (на которых считается хэш) с текущими. Это противоречит идее _не хранить таблицу отображения ников на их цвета в памяти_ (см. выше). 



---

[ycbl](Участник_Bigote.md) 00:06, 24 марта 2008 (MSK) Ещё одна мысль: если уж переделывать, то стоит учесть разные цветовые схемы и добавить в настройки возможность выбора цветовой гаммы ников. Потому что если у человека установлена тёмная схема, чёрные и синие цвета ников будут практически не видны, как не видны в стандартной схеме разные розовые, бледно-оранжевые и прочие пастельные цвета. 




Deleted wiki/ru/Pages.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Pages/index.html)

# Pages

Материал из Tkabber Wiki

Эта страница была предназначена для перенаправлений с искусственных "коротких"
ссылок, которые ставятся в темы комнат и вообще проще.

Однако в один прекрасный день мы подумали: "А что это мы маемся дурью? У нас же
теперь поддомены есть. Мы можем создавать странички с короткими английскими именами,
которые будут перенаправлять пользователей на страницы с контентом.
И при этом не мешать английским статьям, которые находятся  на другом домене". Так и порешили.

Но страница эта пускай останется тут. Она не повредит и как в качестве удобного
списка "заредирекченных" статей, так и в качестве полигона для создания новых
англоязычных страниц (потому что их проще всего создавать, просто воткнув некое
имя в двойные квадратные скобки на какой-то существующей странице — как раз на этой).

Давать ссылку надо так:

> <s>http://ru.tkabber.jabe.ru/index.php/pages\#РАЗДЕЛ\_ТУТ</s>
  http://ru.tkabber.jabe.ru/index.php/РАЗДЕЛ_ТУТ

к примеру (регистр первой буквы имени статьи в данном случае неважен):

> <s>http://ru.tkabber.jabe.ru/index.php/pages\#fonts</s>
  http://ru.tkabber.jabe.ru/index.php/Fonts

#### <a id="beginners"></a>  beginners

[**Начинающим**](Начинающим.md)

#### <a id="color-pics"></a>  color-pics

[**Цветовые темы и пиктограммы**](Цветовые_темы_и_пиктограммы.md)

#### <a id="dist"></a>  dist

[**Дистрибутивы, которые мы выбираем**](Дистрибутивы__которые_мы_выбираем.md)

#### <a id="emoticons"></a>  emoticons

[**Смайлики и аватары**](Смайлики_и_аватары.md)

#### <a id="FAQ"></a>  FAQ

[**Ткаббер ЧаВо**](Ткаббер_ЧаВо.md)

#### <a id="FAQ-appearance-sound"></a>  FAQ-appearance-sound

[**Ткаббер ЧаВо/Внешний вид и звук**](Ткаббер_ЧаВо/Внешний_вид_и_звук.md)

#### <a id="FAQ-glitches"></a>  FAQ-glitches

[**Ткаббер ЧаВо/Глюки**](Ткаббер_ЧаВо/Глюки.md)

#### <a id="FAQ-howto"></a>  FAQ-howto

[**Ткаббер ЧаВо/Как мне...?**](Ткаббер_ЧаВо/Как_мне..._.md)

#### <a id="FAQ-miscellanea"></a>  FAQ-miscellanea

[**Ткаббер ЧаВо/Разное**](Ткаббер_ЧаВо/Разное.md)

#### <a id="filetransfer"></a>  filetransfer

[**Пересылка файлов: теория**](Пересылка_файлов__теория.md)

#### <a id="fonts"></a>  fonts

[**Пуско-наладка шрифтов в Ткаббере**](Шрифты.md)

#### <a id="gates"></a>  gates

[**Гейты во вражеские сети**](Гейты_во_вражеские_сети.md)

#### <a id="gtalk"></a>  gtalk

[**Google Talk**](Google_Talk.md)

#### <a id="login"></a>  login

[**Между офлайном и онлайном**](Между_офлайном_и_онлайном.md)

#### <a id="mrim-spam"></a>  mrim-spam

[**Блокировка MRIM-спама**](Блокировка_MRIM-спама.md)

#### <a id="plugins"></a>  plugins

[**Плагины**](Плагины.md)

#### <a id="patches"></a>  patches

[**Патчи**](Патчи.md)

#### <a id="remote-control"></a>  remote-control

[**Удалённое управление с помощью send**](Удалённое_управление_с_помощью_send.md)

#### <a id="sound"></a>  sound

[**Проблемы со звуком**](Проблемы_со_звуком.md)

#### <a id="sound_themes"></a>  sound themes

[**Звуковые схемы**](Звуковые_схемы.md)

#### <a id="todo"></a>  todo

[**Планы на будущее**](Планы_на_будущее.md)

#### <a id="topic"></a>  topic

[**Ну очень развёрнутый топик конференции** `tkabber@conference.jabber.ru`](Остров_посланных_на....md)

#### <a id="traffic"></a>  traffic

[**Low traffic HOWTO**](Low_traffic_HOWTO.md)

#### <a id="tuning"></a>  tuning

[**Настройка Ткаббера: азы и глубже**](Настройка_Ткаббера__азы_и_глубже.md)

#### <a id="tweaks"></a>  tweaks

[**Нетривиальные настройки**](Нетривиальные_настройки.md)

#### <a id="win-howto"></a>  win-howto

[**Tkabber Windows Mini HOWTO**](Tkabber_Windows_Mini_HOWTO.md)

#### <a id="x-ttf"></a>  x-ttf

[**Проблемы X Window и TTF**](Проблемы_X_Window_и_TTF.md)
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
















































































































































































































































































Changes to wiki/ru/Plugins/Alarm/Changelog.md.

1
2

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30


[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Plugins/Alarm/Changelog/index.html)


# Plugins/Alarm/Changelog

Материал из Tkabber Wiki

### <a id="version_0.3"></a> version 0.3

*  Better errors handling
*  Support for incoming \<ding> keyword. [JAJC plugin buzz](http://www.remiq.net/jajc/#buzz)
   and yahoo uses it for their alarms.
*  Smart sending: plugin sends inbound alarms only to clients which supports them and
   keyword \<ding> to others. It is disabled by default.
*  Now "alarm!" is not hardcoded keyword and you can change it as you wish.

### <a id="version_0.2"></a> version 0.2

*  Fix: Alarm sound now plays under windows too
*  Now it's possible to receive alarm with keyword "alarm!" instead of
   using iq stanza (inbound alarm) (for other clients)
*  Resort default rule list for better usability

### <a id="version_0.1"></a> version 0.1

*  Protocol  description
*  Base GUI support: menuitem to menus, button to toolbar in the chat
*  Analyse responds
*  Disco item and handler
*  Plugin options
*  Base types of alarm: sound, messagebox, message in the chat




>


|

|

|
|
<
|
<
|

|

|
|
<
|

|

|
|
|
|
|
|
>
>
1
2
3
4
5
6
7
8
9
10
11

12

13
14
15
16
17
18

19
20
21
22
23
24
25
26
27
28
29
30
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Plugins/Alarm/Changelog/index.html)


# Plugins/Alarm/Changelog

Материал из Tkabber Wiki.

### <a id="version_0.3"></a> version 0.3 

*  Better errors handling 
*  Support for incoming \<ding> keyword. [JAJC plugin buzz](http://www.remiq.net/jajc/#buzz) and yahoo uses it for their alarms. 

*  Smart sending: plugin sends inbound alarms only to clients which supports them and keyword \<ding> to others. It is disabled by default.  

*  Now "alarm!" is not hardcoded keyword and you can change it as you wish.  

### <a id="version_0.2"></a> version 0.2 

*  Fix: Alarm sound now plays under windows too 
*  Now it's possible to receive alarm with keyword "alarm!" instead of using iq stanza (inbound alarm) (for other clients) 

*  Resort default rule list for better usability 

### <a id="version_0.1"></a> version 0.1 

*  Protocol  description 
*  Base GUI support: menuitem to menus, button to toolbar in the chat 
*  Analyse responds 
*  Disco item and handler 
*  Plugin options 
*  Base types of alarm: sound, messagebox, message in the chat 


Changes to wiki/ru/Plugins/Traffic/Changelog.md.

1
2

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28


[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Plugins/Traffic/Changelog/index.html)


# Plugins/Traffic/Changelog

Материал из Tkabber Wiki

### <a id="version_0.3"></a> version 0.3

*  Save stats into a file
*  Human-readable counters
*  Capability to reset counters
*  Show nicks instead of JIDs
*  Select new connection for current if "0 None" was selected.
*  Refresh table on combobox changes
*  Count bytes instead of UTF-8 symbols (you need repatch tkabber again with new patch)
*  Timer for autorefresh
*  Translations to Russian.
*  Some bugfixes

### <a id="version_0.2"></a> version 0.2

*  remove autoopen on the start
*  add some documents (TODO, Changelog)

### <a id="version_0.1"></a> version 0.1

*  Patch for tkabber
*  Base features: grab statistics, GUI, sorting, multiconnection support




>


|

|

|
|
|
|
|
|
|
|
|
|

|

|
|

|

|
|
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Plugins/Traffic/Changelog/index.html)


# Plugins/Traffic/Changelog

Материал из Tkabber Wiki.

### <a id="version_0.3"></a> version 0.3 

*  Save stats into a file 
*  Human-readable counters 
*  Capability to reset counters 
*  Show nicks instead of JIDs 
*  Select new connection for current if "0 None" was selected. 
*  Refresh table on combobox changes 
*  Count bytes instead of UTF-8 symbols (you need repatch tkabber again with new patch) 
*  Timer for autorefresh 
*  Translations to Russian. 
*  Some bugfixes 

### <a id="version_0.2"></a> version 0.2 

*  remove autoopen on the start 
*  add some documents (TODO, Changelog) 

### <a id="version_0.1"></a> version 0.1 

*  Patch for tkabber 
*  Base features: grab statistics, GUI, sorting, multiconnection support 


Added wiki/ru/Redirects.md.













































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Pages/index.html)


# Redirects

Материал из Tkabber Wiki

[Pages](Pages.md)

 Эта страница была предназначена для перенаправлений с искусственных "коротких" ссылок, которые ставятся в темы комнат и вообще проще. 

Однако в один прекрасный день мы подумали: "А что это мы маемся дурью? У нас же теперь поддомены есть. Мы можем создавать странички с короткими английскими именами,  которые будут перенаправлять пользователей на страницы с контентом.  И при этом не мешать английским статьям, которые находятся  на другом домене". Так и порешили. 

Но страница эта пускай останется тут. Она не повредит и как в качестве удобного списка "заредирекченных" статей, так и в качестве полигона для создания новых англоязычных страниц (потому что их проще всего создавать, просто воткнув некое имя в двойные квадратные скобки на какой-то существующей странице — как раз на этой). 

Давать ссылку надо так: 

    <s>http://ru.tkabber.jabe.ru/index.php/pages\#РАЗДЕЛ\_ТУТ</s>
    http://ru.tkabber.jabe.ru/index.php/РАЗДЕЛ_ТУТ

к примеру (регистр первой буквы имени статьи в данном случае неважен): 

    <s>http://ru.tkabber.jabe.ru/index.php/pages\#fonts</s>
    http://ru.tkabber.jabe.ru/index.php/Fonts

#### <a id="beginners"></a>  beginners 

[beginners](Beginners.md) \#beginners → [Начинающим](Начинающим.md) 

#### <a id="color-pics"></a>  color-pics 

[color-pics](Color-pics.md) \#color-pics → [Цветовые темы и пиктограммы](Цветовые_темы_и_пиктограммы.md) 

#### <a id="dist"></a>  dist 

[dist](Dist.md) \#dist → [Дистрибутивы, которые мы выбираем](Дистрибутивы__которые_мы_выбираем.md) 

#### <a id="emoticons"></a>  emoticons 

[emoticons](Emoticons.md) \#emoticons → [Смайлики и аватары](Смайлики_и_аватары.md) 

#### <a id="FAQ"></a>  FAQ 

[faq](Faq.md) \#FAQ → [Ткаббер ЧаВо](Ткаббер_ЧаВо.md) 

#### <a id="FAQ-appearance-sound"></a>  FAQ-appearance-sound 

[faq-appearance-sound](Faq-appearance-sound.md) \#FAQ-appearance-sound → [Ткаббер ЧаВо/Внешний вид и звук](Ткаббер_ЧаВо/Внешний_вид_и_звук.md) 

#### <a id="FAQ-glitches"></a>  FAQ-glitches 

[faq-glitches](Faq-glitches.md) \#FAQ-glitches → [Ткаббер ЧаВо/Глюки](Ткаббер_ЧаВо/Глюки.md) 

#### <a id="FAQ-howto"></a>  FAQ-howto 

[faq-howto](Faq-howto.md) \#FAQ-howto → [Ткаббер ЧаВо/Как мне...?](Ткаббер_ЧаВо/Как_мне..._.md) 

#### <a id="FAQ-miscellanea"></a>  FAQ-miscellanea 

[faq-misc](Faq-misc.md) \#FAQ-misc → [Ткаббер ЧаВо/Разное](Ткаббер_ЧаВо/Разное.md) 

#### <a id="filetransfer"></a>  filetransfer 

[filetransfer](Filetransfer.md) \#filetransfer → [Пересылка файлов: теория](Пересылка_файлов__теория.md) 

#### <a id="fonts"></a>  fonts 

[fonts](Fonts.md) \#fonts → [Пуско-наладка шрифтов в Ткаббере](Шрифты.md) 

#### <a id="gates"></a>  gates 

[gates](Gates.md) \#gates → [Гейты во вражеские сети](Гейты_во_вражеские_сети.md) 

#### <a id="gtalk"></a>  gtalk 

[gtalk](Gtalk.md) \#gtalk → [Google Talk](Google_Talk.md) 

#### <a id="login"></a>  login 

[login](Login.md) \#login → [Между офлайном и онлайном](Между_офлайном_и_онлайном.md) 

#### <a id="mrim-spam"></a>  mrim-spam 

[mrim-spam](Mrim-spam.md) \#mrim-spam → [Блокировка MRIM-спама](Блокировка_MRIM-спама.md) 

#### <a id="plugins"></a>  plugins 

[plugins](Plugins.md) \#plugins → [Плагины](Плагины.md) 

#### <a id="patches"></a>  patches 

[patches](Patches.md) \#patches → [Патчи](Патчи.md) 

#### <a id="remote-control"></a>  remote-control 

[remote-control](Remote-control.md) \#remote-control → [Удалённое управление с помощью send](Удалённое_управление_с_помощью_send.md) 

#### <a id="sound"></a>  sound 

[sound](Sound.md) \#sound → [Проблемы со звуком](Проблемы_со_звуком.md) 

#### <a id="sound_themes"></a>  sound themes 

[sound-themes](Sound-themes.md) \#sound → [Звуковые схемы](Звуковые_схемы.md) 

#### <a id="todo"></a>  todo 

[todo](Todo.md) \#todo → [Планы на будущее](Планы_на_будущее.md) 

#### <a id="topic"></a>  topic 

[topic](Topic.md) \#topic → [Ну очень развёрнутый топик конференции `tkabber@conference.jabber.ru`](Остров_посланных_на....md) 

#### <a id="traffic"></a>  traffic 

[traffic](Traffic.md) \#traffic → [Low traffic HOWTO](Low_traffic_HOWTO.md) 

#### <a id="tuning"></a>  tuning 

[tuning](Tuning.md) \#tuning → [Настройка Ткаббера: азы и глубже](Настройка_Ткаббера__азы_и_глубже.md) 

#### <a id="tweaks"></a>  tweaks 

[tweaks](Tweaks.md) \#tweaks → [Нетривиальные настройки](Нетривиальные_настройки.md) 

#### <a id="win-howto"></a>  win-howto 

[win-howto](Win-howto.md) \#win-howto → [Tkabber Windows Mini HOWTO](Tkabber_Windows_Mini_HOWTO.md) 

#### <a id="x-ttf"></a>  x-ttf 

[x-ttf](X-ttf.md) \#x-ttf → [Проблемы X Window и TTF](Проблемы_X_Window_и_TTF.md) 


Changes to wiki/ru/SVN_disclaimer.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

64


65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138

139

140
141
142
143
144
145
146

147
148
149
150
151
152

153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180

181
182
183
184
185
186
187
188
189
190
191
192

193
194
195
196
197
198
199
200
201
202
203
204
205
206

207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/SVN_disclaimer/index.html)


# SVN disclaimer

Материал из Tkabber Wiki.

[башорг](http://bash.org.ru/quote/392575)

## <a id="toc"></a>Содержание

* [1 Введение](#Введение)
* [2 "На переднем крае"](#На_переднем_крае)
* [3 Пререлизы](#Пререлизы)
* [4 В помощь начинающему тестеру](#В_помощь_начинающему_тестеру)
   * [4.1 Установка](#Установка)
      * [4.1.1 В Линукс](#В_Линукс)
      * [4.1.2 В Виндовс](#В_Виндовс)
   * [4.2 Первые шаги](#Первые_шаги)
   * [4.3 Как параллельно работать с обычной и альфа-версией Ткаббера](#Как_параллельно_работать_с_обычной_и_альфа-версией_Ткаббера)
   * [4.4 Как сообщать о баге](#Как_сообщать_о_баге)

## <a id="Введение"></a>Введение
Увы, но у подавляющего большинства начинающих пользователей, пожелавших по какой-либо причине
"попробовать" "версию из репозитория" (а то и "пересесть" на неё), есть серьёзное непонимание
того, что такое "альфа версия" применительно к разработке программного обеспечения и под чем вы
"подписываетесь", начиная использовать версию, находящуюся в разработке. Сюда же относятся
вопросы в стиле "как мне получить версию из SVN???", которые обычно остаются неотвеченными
в комнате Ткаббера.

Итак, в начале — основа-основ: "зрелое" программное обеспечение обычно разрабатывается циклически,
путём повторения трёх этапов:

1. _Добавление новой функциональности_ (новых "фич"), улучшение старой. Самый главный и самый
   длинный период. Обычно про ПО, находящееся на этом этапе разработки, говорят, что оно "в альфа
   версии". Код в данном состоянии предназначен для "обкатки" только разработчиками и _очень_
   опытными пользователями.
1. _"Заморозка"_ следует после того, как ведущий ("мейнтейнер") проекта принял решение выпустить
   следующую _стабильную_ версию. На этом этапе новая функциональность не добавляется (за
   исключением тривиальных вещей), только исправляются найденные ошибки. Обычно в этот период
   выпускается несколько "бета" версий, предназначенных для тестирования широкой публикой.
1. _Выпуск._ После того, как ведущий проекта считает, что все очевидные ошибки найдены и
исправлены, следует выпуск ("релиз") новой стабильной версии ПО.

Применительно к Ткабберу, эти три стадии определяют три варианта "доступности" Ткаббера для
использования:

##### Разработка 

> Код официально доступен только через [репозиторий](http://tkabber.jabber.ru/svn).

##### "Заморозка" и широкое тестирование 
> Код доступен в виде стандартных архивов с "бета версиями"; они содержат то, что обычно
  (не совсем верно) называется "исходниками Ткаббера".

##### Релиз 
> Код доступен в виде "архива с исходниками"; он является единственной "референсной"
  формой распространения Ткаббера. Однако разработчики Ткаббера обычно выпускают Ткаббер
  в виде специальных дистрибутивов, предназначенных для удобного использования Ткаббера
  на конкретных системах и пригодных даже для совершенно неопытных пользователей,
  например, [**старпаков и инсталляторов**](Дистрибутивы__которые_мы_выбираем.md#Прилавок).

## <a id="На_переднем_крае"></a>"На переднем крае"
Настало время поподробнее остановиться на "нестабильной версии", которая "живёт" в репозитории
[системы управления версиями](http://ru.wikipedia.org/wiki/Система управления версиями)

[Subversion](http://ru.wikipedia.org/wiki/Subversion).



Существует несколько мифов и непониманий, связанных с нестабильной версией Ткаббера.

Во-первых, несмотря на то, что Ткаббер разрабатывается таким способом, что "голова"
репозитория обычно вполне работоспособна, иногда туда вносятся баги. Иногда это весьма
серьёзные баги, которые вполне могут приводить к частичной потери трудоспособности
Ткаббером до тех пор, пока баг не будет исправлен. Непонимание того, что "нестабильная"
версия в любой момент "вдруг" может оказаться неработающей — одна из главных проблем
начинающих. Причем проблемы могуть быть самыми разными. Например, в одночасье может быть
изменена система хранения протоколов чата, а код для автоматической конвертации старого
формата в новый ещё не будет написан.

Посему совершенно неправильным является отношение к репозиторию просто как к неудобному
(или, наоборот, удобному) способу получать новую функциональность в Ткаббере. Если что-то
ломается, вы оказываетесь предоставлены сами себе.

Во-вторых, если вы не разработчик, и если вы, прочитав первый пункт, согласны быть
"подопытным кроликом" (а наличие таких пользователей на самом деле весьма важно для
разработчиков), вы принимаете на себя ответственность<sup>1</sup> действовать по
определённой схеме. Самое главное: вы _обязательно_ должны читать логи коммитов в
репозиторий или файл **ChangeLog** — без этого вы становитесь мишенью для несуществующих багов:
изменившуюся функциональность или её конфликт со старыми настройками, плагинами и чем угодно
ещё вы воспринимаете как баг и тратите время разработчиков на ковыряния с вашей проблемой.

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

1. _Знать матчасть._ В нашем случае это означает:
   1. Понимание принципа работы систем управления версиями и принципа работы Subversion;
      в частности, вы должны совершенно чётко представлять себе, что происходит, когда
      вы делаете **svn update** и что означают сообщения клиента в ходе выполнения этой операции.
   1. Умение "откатывать" версию вашего рабочего каталога назад, если вы наткнулись на баг
      в свежем коммите, который препятствует вашей нормальной работе с Ткаббером.
1. Читать логи изменений в обязательном порядке. Сопоставлять наблюдаемые вами
   изменения в работе, проблемы Ткаббера с этой информацией.
1. Уметь сообщать о багах так, чтобы разработчикам было понятно, о чём идёт речь.

Изучить матчасть поможет свободно доступная [книга по Subversion](http://svnbook.red-bean.com/)
(переведённая, между прочим, на русский). Если же всё изложенное — не для вас, не мешайте
разработчикам разрабатывать и "вкладывайтесь" в тестирование на другой стадии — на стадии
"пререлиза", о которой рассказано ниже.

![(!)](../images/Hammer.png) **Сделать:** Объяснить отсутствие "ночных билдов"

![(!)](../images/Hammer.png) **Сделать:** Объяснить почему Subversion, а не...

## <a id="Пререлизы"></a>Пререлизы
Таковые бывают и у самого Ткаббера (обычно они называются "беты" и информация о них
помещается как в новостях на [официальном сайте](http://tkabber.jabber.ru), так и
в [списках рассылки](http://lists.jabber.ru/mailman/listinfo/tkabber-dev)), и у его
дистрибутивов, которые собираются сразу после выхода релиза Ткаббера и затем обычно
проходят стадию тестирования перед выпуском окончательных версий.

Беты, как правило, не содержат очевидных проблем, и их использование относительно
безопасно для ваших нервов.

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

![(!)](../images/Hammer.png) **Сделать:** написать про необходимость иметь "каноническую"
инсталляцию для тестирования "исходников"

---

<sup>1</sup> Понятно, что в мире free software (и в мире проприетарного ПО, кстати, тоже)
никто никому ничего "по настоящему" не обязан и ничего не должен. Здесь мы имеем в виду
чисто "социальные" и моральные обязательства, которые влечёт за собой участие в программном проекте.

## <a id="В_помощь_начинающему_тестеру"></a>В помощь начинающему тестеру
### <a id="Установка"></a>Установка

#### <a id="В_Линукс"></a>В Линукс

Установка в линуксе проблем вызвать не должна. В Дебиане это вообще проще простого:

    sudo apt-get install subversion subversion-tools

По желанию можно установить какой-нибудь графический front-end.

#### <a id="В_Виндовс"></a>В Виндовс

Одним из самых популярных клиентов Subversion под Виндовс можно смело назвать
[TortoiseSVN](http://tortoisesvn.tigris.org/). На странице скачивания можно найти как
последнюю версию программы (32 и 64 бит), так и языковые пакеты. Русский пакет тоже
присутствует, есть и мануал, пересказывать который здесь особого смысла нет.

### <a id="Первые_шаги"></a>Первые шаги

Самый первый шаг, который нужно предпринять, чтобы начать тестирование альфа-версии,
[описан на официальном сайте Ткаббера](http://tkabber.jabber.ru/svn). Он сводится к
скачиванию при помощи клиента SVN исходного кода Ткаббера куда-нибудь на жёсткий диск:

    svn co http://svn.xmpp.ru/repos/tkabber/trunk/tkabber tkabber-svn

Эта команда скачает весь транк Ткаббера в каталог **tkabber-svn**, _который создастся в том
месте, откуда вы её (команду) запускаете._ Если вам нужны плагины, можете скачать и их:

    svn co http://svn.xmpp.ru/repos/tkabber/trunk/tkabber-plugins tkabber-plugins-svn

Можно скачать и их, и Ткаббер одной командой:

    svn co http://svn.xmpp.ru/repos/tkabber/trunk tkabber-svn

В этом случае внутри каталога **tkabber-svn** вы найдёте два других: **tkabber** и **tkabber-plugins**.
Если вам нужны неофициальные плагины, содержащиеся в соответствующем репозитории
(там можно найти далеко не все плагины, описанные на этой вики), качайте их отсюда:

    svn co https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins tkabber-3rd

Запуск тоже прост (предположим, Ткаббер установлен в **~/bin/tkabber-svn**):

    cd ~/bin/tkabber-svn
    ./tkabber.tcl

Ещё одна полезная команда — **update** 


> После скачивания Ткаббера нет нужды проделывать процедуру checkout (co) каждый раз.
  Достаточно зайти в каталог Ткаббера или его плагинов и набрать

    svn update

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

    svn update -r 1000

Для автоматизации обновления в Windows (при использовании TortoiseSVN) можно создать батник с таким содержанием:

    "C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe"/path:"c:\Program Files\TkabberSVN\" /command:update /closeonend:2

    "C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe"/path:"c:\Documents and Settings\User\Application Data\Tkabber\plugins\" /command:update /closeonend:2

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

    svn help co
    svn help up

Первые шаги при использовании альфа-версии Ткаббера под виндами почти ничем не отличаются от
линуксовых, разве что вместо набора (а то и копи-пейста) одной строчки вам придётся самостоятельно
продираться сквозь дебри графического интерфейса или штудировать довольно объёмный мануал.

![(!)](../images/Hammer.png) **Сделать:** Впрочем, если какой-нибудь доброволец разовьёт тему виндовс, возражений не будет.

### <a id="Как_параллельно_работать_с_обычной_и_альфа-версией_Ткаббера"></a>Как параллельно работать с обычной и альфа-версией Ткаббера

Удобно иметь в системе установленную из репозиториев ОС стабильную версию Ткаббера, а каталог
с альфой забросить куда-нибудь к себе в домашний каталог (например, в **~/tkabber-svn** — меньше
геморроя с правами на запись в файлы, если потребуется или захочется что-нибудь допилить.
Однако следует помнить, что в любом случае будут читаться рабочие конфигурационные файлы,
лежащие в вашем домашнем каталоге: **~/.tkabber/config.tcl** и **~/.tkabber/custom.tcl**,
а у разных версий Ткаббера могут быть разные идеи о доступных настройках, и потому совместно
использовать одни и те же конфигурационные файлы сильно разными версиями Ткаббера может
и не получиться.

Для решения этой проблемы рекомендуется заставить Ткаббер использовать другой каталог для
хранения настроек при помощи установки переменной окружения `TKABBER_HOME`: создайте
отдельный каталог для настроек альфа-версии Ткаббера, например, **~/.tkabber-svn** а скрипт
запуска (например, **~/bin/tkabber-svn**) сделайте таким:

    #!/bin/sh
    export TKABBER_HOME=~/.tkabber-svn
    exec wish ~/tkabber-svn/tkabber/tkabber.tcl "$@"

Теперь можно скопировать файлы конфигурации из **~/.tkabber** в **~/.tkabber-svn** и запускать
альфа-версию как **~/bin/tkabber-svn** (или просто **tkabber-svn**, если **~/bin** находится
у вас в переменной окружения `PATH`).

Возможно, вы захотите, чтобы логи обе версии вели совместно (формат хранения логов меняется
куда реже настроек). Для этого убедитесь, что переменные `::logger::options(logdir)` (группа
настроек "Customize" → "Chat" → "Logging") показывают на один и тот же каталог. Ну, или можно
создать симлинк **~/.tkabber-svn/logs** → **~/.tkabber/logs**.

### <a id="Как_сообщать_о_баге"></a>Как сообщать о баге

*  Перво-наперво, как уже было посоветовано выше, внимательно прочитайте **ChangeLog**: возможно,
   ваш баг — на самом деле фича :)
*  Обновитесь — вдруг проблему уже разрешили?
*  Сохраните лог ошибки, чтобы потом было чего предъявлять разработчикам (иначе в лучшем
   случае не поверят).
*  Иногда бывает нелишним сделать скриншот эпицентра. Вывесьте его на каком-нибудь
   публичном фотохостинге (например, [imageshack](http://imageshack.us) (обязательно копируйте
   самую последнюю ссылку на закачанную картинку из предложенных — она без рекламы)
   или [keep4u](http://www.keep4u.ru)), и не надо предлагать скинуть скрин в приват или закинуть на почту.
*  Однако перед тем как бежать жаловаться, попробуйте повторить ошибку. Если она повторяется
   из запуска в запуск, постарайтесь проанализировать обстоятельства, которые могли её
   вызвать: какие программы запущены параллельно, какие сопутствующие Ткабберу пакеты
   установлены, ну и прочее.
*  Попробуйте проблему локализовать (не перевести на русский, а сузить поиск, отрезав
   варианты, в которых ошибка не наблюдается).
*  Сообщая об ошибке, без напоминаний укажите версию операционки (в случае с Линуксом не
   помешает и версия оконного менеджера), тикля и самого Ткаббера.

...и ещё немного о социальном аспекте:

*  Обязательно имейте под рукой то, что у вас глючит, когда просите о помощи! Бессмысленно
   "заходить с бомбуса", находясь на работе, и рассказывать о проблемах подключения Ткаббера,
   оставшегося дома.
*  Если проблема происходит не у вас, а у вашего друга/свата/брата, будет намного лучше,
   если эта персона сама зайдёт в комнату Ткаббера и задаст свой вопрос — не стоит играть
   в испорченный телефон.
*  Никогда не спрашивайте — "есть ли кто живой" и готов ли кто-нибудь помочь вам. В Интернете
   принцип **"NATAJA**" (**N**ever **A**sk **T**o **A**sk, **J**ust **A**sk) должен
   исповедоваться неукоснительно: посетители конфы не сидят всё своё время перед
   компьютерами, а также живут в разных часовых поясах. Посему просто чётко и максимально
   подробно сформулируйте свой вопрос и ждите. Если ждать нет возможности, через некоторое
   время проверьте [логи конференции](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru)
   — возможно, кто-то уже прочитал и ответил на ваш вопрос (те, кто в состоянии ответить,
   обычно читают логи и увидят его). Если ответа на вопрос не было, вежливо спросите,
   не появилось ли у кого идей по поводу вопроса такого-то.

![(!)](../images/Hammer.png) **Сделать:** дописать, если чего не хватает

![(!)](../images/Hammer.png) **Сделать:** вообще-то этот раздел нужно слить с соответствующим
куском "Острова посланных на..." и оформить в виде отдельной статейки с тупым названием
"Как правильно задавать вопросы" Согласен.

>













|
|
|
|
|
|

|
|
<
<
<
<
<

|
<

|
<
<
<
|
<
<
<
|
<

|
<

|
>
|

|
|
|

|
<
<
<
<
<

<
<
<
>
|
>
>

|

|
<
<
<
<
<
<
<

|
<
<

|
<
<
<
<
<
<

|
<

|
|
<
<
|
|
|
<
|

|
<
<
<

|

|

|
|
<
<
<
<

|
<

|
<
<
<
<
<

|
<



|
<
<

|
|
>
|
>
|



|

|
>
|
<
<
<

|
>
|
<
<



|
<



|



<
|
<



|




|

>
|
|



|



|


>
|

|




|
<
<

|

|
>
|
<
<
<
<
<
<
<

|
<
<
<





|
<
<

|
<
<
<

|

|
<
|
|
<
|
<
<
<
|
<
<
<
|
<
|
<

|

|
<
<
|
<
<
|
<
<
<
<
<
<
<
<

|

|
|
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24





25
26

27
28



29



30

31
32

33
34
35
36
37
38
39
40
41
42





43



44
45
46
47
48
49
50
51







52
53


54
55






56
57

58
59
60


61
62
63

64
65
66



67
68
69
70
71
72
73




74
75

76
77





78
79

80
81
82
83


84
85
86
87
88
89
90
91
92
93
94
95
96
97
98



99
100
101
102


103
104
105
106

107
108
109
110
111
112
113

114

115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146


147
148
149
150
151
152







153
154



155
156
157
158
159
160


161
162



163
164
165
166

167
168

169



170



171

172

173
174
175
176


177


178








179
180
181
182
183
184
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/SVN_disclaimer/index.html)


# SVN disclaimer

Материал из Tkabber Wiki.

[башорг](http://bash.org.ru/quote/392575)

## <a id="toc"></a>Содержание

* [1 Введение](#Введение)
* [2 "На переднем крае"](#На_переднем_крае)
* [3 Пререлизы](#Пререлизы)
* [4 В помощь начинающему тестеру](#В_помощь_начинающему_тестеру)
 * [4.1 Установка](#Установка)
  * [4.1.1 В Линукс](#В_Линукс)
  * [4.1.2 В Виндовс](#В_Виндовс)
 * [4.2 Первые шаги](#Первые_шаги)
 * [4.3 Как параллельно работать с обычной и альфа-версией Ткаббера](#Как_параллельно_работать_с_обычной_и_альфа-версией_Ткаббера)
 * [4.4 Как сообщать о баге](#Как_сообщать_о_баге)

# <a id="Введение"></a>Введение
Увы, но у подавляющего большинства начинающих пользователей, пожелавших по какой-либо причине "попробовать" "версию из репозитория" (а то и "пересесть" на неё), есть серьёзное непонимание того, что такое "альфа версия" применительно к разработке программного обеспечения и под чем вы "подписываетесь", начиная использовать версию, находящуюся в разработке. Сюда же относятся вопросы в стиле "как мне получить версию из SVN???", которые обычно остаются неотвеченными в комнате Ткаббера. 






Итак, в начале — основа-основ: "зрелое" программное обеспечение обычно разрабатывается циклически, путём повторения трёх этапов: 


1.  _Добавление новой функциональности_ (новых "фич"), улучшение старой. Самый главный и самый длинный период. Обычно про ПО, находящееся на этом этапе разработки, говорят, что оно "в альфа версии". Код в данном состоянии предназначен для "обкатки" только разработчиками и _очень_ опытными пользователями. 



1.  _"Заморозка"_ следует после того, как ведущий ("мейнтейнер") проекта принял решение выпустить следующую _стабильную_ версию. На этом этапе новая функциональность не добавляется (за исключением тривиальных вещей), только исправляются найденные ошибки. Обычно в этот период выпускается несколько "бета" версий, предназначенных для тестирования широкой публикой. 



1.  _Выпуск._ После того, как ведущий проекта считает, что все очевидные ошибки найдены и исправлены, следует выпуск ("релиз") новой стабильной версии ПО. 


Применительно к Ткабберу, эти три стадии определяют три варианта "доступности" Ткаббера для использования: 


 Разработка 

 Код официально доступен только через [репозиторий](http://tkabber.jabber.ru/svn). 

 "Заморозка" и широкое тестирование 

 Код доступен в виде стандартных архивов с "бета версиями"; они содержат то, что обычно (не совсем верно) называется "исходниками Ткаббера". 

 Релиз 









 Код доступен в виде "архива с исходниками"; он является единственной "референсной" формой распространения Ткаббера. Однако разработчики Ткаббера обычно выпускают Ткаббер в виде специальных дистрибутивов, предназначенных для удобного использования Ткаббера на конкретных системах и пригодных даже для совершенно неопытных пользователей, например, [старпаков и инсталляторов](Дистрибутивы__которые_мы_выбираем.md#Прилавок). 

# <a id="На_переднем_крае"></a>"На переднем крае"
Настало время поподробнее остановиться на "нестабильной версии", которая "живёт" в репозитории [системы управления версиями](http://ru.wikipedia.org/wiki/!8AB5<0 C?@02;5=8O 25@A8O<8) [Subversion](http://ru.wikipedia.org/wiki/Subversion). 

Существует несколько мифов и непониманий, связанных с нестабильной версией Ткаббера. 

Во-первых, несмотря на то, что Ткаббер разрабатывается таким способом, что "голова" репозитория обычно вполне работоспособна, иногда туда вносятся баги. Иногда это весьма серьёзные баги, которые вполне могут приводить к частичной потери трудоспособности Ткаббером до тех пор, пока баг не будет исправлен. Непонимание того, что "нестабильная" версия в любой момент "вдруг" может оказаться неработающей — одна из главных проблем начинающих. Причем проблемы могуть быть самыми разными. Например, в одночасье может быть изменена система хранения протоколов чата, а код для автоматической конвертации старого формата в новый ещё не будет написан. 








Посему совершенно неправильным является отношение к репозиторию просто как к неудобному (или, наоборот, удобному) способу получать новую функциональность в Ткаббере. Если что-то ломается, вы оказываетесь предоставлены сами себе. 



Во-вторых, если вы не разработчик, и если вы, прочитав первый пункт, согласны быть "подопытным кроликом" (а наличие таких пользователей на самом деле весьма важно для разработчиков), вы принимаете на себя ответственность<sup>1</sup> действовать по определённой схеме. Самое главное: вы _обязательно_ должны читать логи коммитов в репозиторий или файл ChangeLog — без этого вы становитесь мишенью для несуществующих багов: изменившуюся функциональность или её конфликт со старыми настройками, плагинами и чем угодно ещё вы воспринимаете как баг и тратите время разработчиков на ковыряния с вашей проблемой. 







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


1.  _Знать матчасть._ В нашем случае это означает: 
 1.  Понимание принципа работы систем управления версиями и принципа работы Subversion; в частности, вы должны совершенно чётко представлять себе, что происходит, когда вы делаете svn update и что означают сообщения клиента в ходе выполнения этой операции. 


 1.  Умение "откатывать" версию вашего рабочего каталога назад, если вы наткнулись на баг в свежем коммите, который препятствует вашей нормальной работе с Ткаббером. 
 
1.  Читать логи изменений в обязательном порядке. Сопоставлять наблюдаемые вами изменения в работе, проблемы Ткаббера с этой информацией. 

1.  Уметь сообщать о багах так, чтобы разработчикам было понятно, о чём идёт речь. 

Изучить матчасть поможет свободно доступная [книга по Subversion](http://svnbook.red-bean.com/) (переведённая, между прочим, на русский). Если же всё изложенное — не для вас, не мешайте разработчикам разрабатывать и "вкладывайтесь" в тестирование на другой стадии — на стадии "пререлиза", о которой рассказано ниже. 




![(!)](../images/Hammer.png) **Сделать:** Объяснить отсутствие "ночных билдов" 

![(!)](../images/Hammer.png) **Сделать:** Объяснить почему Subversion, а не... 

# <a id="Пререлизы"></a>Пререлизы
Таковые бывают и у самого Ткаббера (обычно они называются "беты" и информация о них помещается как в новостях на [официальном сайте](http://tkabber.jabber.ru), так и в [списках рассылки](http://lists.jabber.ru/mailman/listinfo/tkabber-dev)), и у его дистрибутивов, которые собираются сразу после выхода релиза Ткаббера и затем обычно проходят стадию тестирования перед выпуском окончательных версий. 





Беты, как правило, не содержат очевидных проблем, и их использование относительно безопасно для ваших нервов. 


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






![(!)](../images/Hammer.png) **Сделать:** написать про необходимость иметь "каноническую" инсталляцию для тестирования "исходников" 


---

<sup>1</sup> Понятно, что в мире free software (и в мире проприетарного ПО, кстати, тоже) никто никому ничего "по настоящему" не обязан и ничего не должен. Здесь мы имеем в виду чисто "социальные" и моральные обязательства, которые влечёт за собой участие в программном проекте. 



# <a id="В_помощь_начинающему_тестеру"></a>В помощь начинающему тестеру
## <a id="Установка"></a>Установка

### <a id="В_Линукс"></a>В Линукс

Установка в линуксе проблем вызвать не должна. В Дебиане это вообще проще простого: 

    sudo apt-get install subversion subversion-tools

По желанию можно установить какой-нибудь графический front-end. 

### <a id="В_Виндовс"></a>В Виндовс

Одним из самых популярных клиентов Subversion под Виндовс можно смело назвать [TortoiseSVN](http://tortoisesvn.tigris.org/). На странице скачивания можно найти как последнюю версию программы (32 и 64 бит), так и языковые пакеты. Русский пакет тоже присутствует, есть и мануал, пересказывать который здесь особого смысла нет. 




## <a id="Первые_шаги"></a>Первые шаги

Самый первый шаг, который нужно предпринять, чтобы начать тестирование альфа-версии, [описан на официальном сайте Ткаббера](http://tkabber.jabber.ru/svn). Он сводится к скачиванию при помощи клиента SVN исходного кода Ткаббера куда-нибудь на жёсткий диск: 



    svn co http://svn.xmpp.ru/repos/tkabber/trunk/tkabber tkabber-svn

Эта команда скачает весь транк Ткаббера в каталог tkabber-svn, _который создастся в том месте, откуда вы её (команду) запускаете._ Если вам нужны плагины, можете скачать и их: 


    svn co http://svn.xmpp.ru/repos/tkabber/trunk/tkabber-plugins tkabber-plugins-svn

Можно скачать и их, и Ткаббер одной командой: 

    svn co http://svn.xmpp.ru/repos/tkabber/trunk tkabber-svn


В этом случае внутри каталога tkabber-svn вы найдёте два других: tkabber и tkabber-plugins. Если вам нужны неофициальные плагины, содержащиеся в соответствующем репозитории (там можно найти далеко не все плагины, описанные на этой вики), качайте их отсюда: 


    svn co https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins tkabber-3rd

Запуск тоже прост (предположим, Ткаббер установлен в ~/bin/tkabber-svn): 

    cd ~/bin/tkabber-svn
    ./tkabber.tcl

Ещё одна полезная команда — 

 update 

 После скачивания Ткаббера нет нужды проделывать процедуру checkout (co) каждый раз. Достаточно зайти в каталог Ткаббера или его плагинов и набрать 

    svn update

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

    svn update -r 1000

Для автоматизации обновления в Windows (при использовании TortoiseSVN) можно создать батник с таким содержанием: 

    "C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe"/path:"c:\Program Files\TkabberSVN\" /command:update /closeonend:2
    
    "C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe"/path:"c:\Documents and Settings\User\Application Data\Tkabber\plugins\" /command:update /closeonend:2 

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

    svn help co
    svn help up

Первые шаги при использовании альфа-версии Ткаббера под виндами почти ничем не отличаются от линуксовых, разве что вместо набора (а то и копи-пейста) одной строчки вам придётся самостоятельно продираться сквозь дебри графического интерфейса или штудировать довольно объёмный мануал. 



![(!)](../images/Hammer.png) **Сделать:** Впрочем, если какой-нибудь доброволец разовьёт тему виндовс, возражений не будет. 

## <a id="Как_параллельно_работать_с_обычной_и_альфа-версией_Ткаббера"></a>Как параллельно работать с обычной и альфа-версией Ткаббера

Удобно иметь в системе установленную из репозиториев ОС стабильную версию Ткаббера, а каталог с альфой забросить куда-нибудь к себе в домашний каталог (например, в ~/tkabber-svn — меньше геморроя с правами на запись в файлы, если потребуется или захочется что-нибудь допилить. Однако следует помнить, что в любом случае будут читаться рабочие конфигурационные файлы, лежащие в вашем домашнем каталоге: ~/.tkabber/config.tcl и ~/.tkabber/custom.tcl, а у разных версий Ткаббера могут быть разные идеи о доступных настройках, и потому совместно использовать одни и те же конфигурационные файлы сильно разными версиями Ткаббера может и не получиться. 








Для решения этой проблемы рекомендуется заставить Ткаббер использовать другой каталог для хранения настроек при помощи установки переменной окружения `TKABBER_HOME`: создайте отдельный каталог для настроек альфа-версии Ткаббера, например, ~/.tkabber-svn а скрипт запуска (например, ~/bin/tkabber-svn) сделайте таким: 




    #!/bin/sh
    export TKABBER_HOME=~/.tkabber-svn
    exec wish ~/tkabber-svn/tkabber/tkabber.tcl "$@"

Теперь можно скопировать файлы конфигурации из ~/.tkabber в ~/.tkabber-svn и запускать альфа-версию как ~/bin/tkabber-svn (или просто tkabber-svn, если ~/bin находится у вас в переменной окружения `PATH`). 



Возможно, вы захотите, чтобы логи обе версии вели совместно (формат хранения логов меняется куда реже настроек). Для этого убедитесь, что переменные `::logger::options(logdir)` (группа настроек "Customize" → "Chat" → "Logging") показывают на один и тот же каталог. Ну, или можно создать симлинк ~/.tkabber-svn/logs → ~/.tkabber/logs. 




## <a id="Как_сообщать_о_баге"></a>Как сообщать о баге

*  Перво-наперво, как уже было посоветовано выше, внимательно прочитайте ChangeLog: возможно, ваш баг — на самом деле фича :) 

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

*  Иногда бывает нелишним сделать скриншот эпицентра. Вывесьте его на каком-нибудь публичном фотохостинге (например, [imageshack](http://imageshack.us) (обязательно копируйте самую последнюю ссылку на закачанную картинку из предложенных — она без рекламы) или [keep4u](http://www.keep4u.ru)), и не надо предлагать скинуть скрин в приват или закинуть на почту. 



*  Однако перед тем как бежать жаловаться, попробуйте повторить ошибку. Если она повторяется из запуска в запуск, постарайтесь проанализировать обстоятельства, которые могли её вызвать: какие программы запущены параллельно, какие сопутствующие Ткабберу пакеты установлены, ну и прочее. 



*  Попробуйте проблему локализовать (не перевести на русский, а сузить поиск, отрезав варианты, в которых ошибка не наблюдается). 

*  Сообщая об ошибке, без напоминаний укажите версию операционки (в случае с Линуксом не помешает и версия оконного менеджера), тикля и самого Ткаббера. 


...и ещё немного о социальном аспекте: 

*  Обязательно имейте под рукой то, что у вас глючит, когда просите о помощи! Бессмысленно "заходить с бомбуса", находясь на работе, и рассказывать о проблемах подключения Ткаббера, оставшегося дома. 


*  Если проблема происходит не у вас, а у вашего друга/свата/брата, будет намного лучше, если эта персона сама зайдёт в комнату Ткаббера и задаст свой вопрос — не стоит играть в испорченный телефон. 


*  Никогда не спрашивайте — "есть ли кто живой" и готов ли кто-нибудь помочь вам. В Интернете принцип **"NATAJA**" (**N**ever **A**sk **T**o **A**sk, **J**ust **A**sk) должен исповедоваться неукоснительно: посетители конфы не сидят всё своё время перед компьютерами, а также живут в разных часовых поясах. Посему просто чётко и максимально подробно сформулируйте свой вопрос и ждите. Если ждать нет возможности, через некоторое время проверьте [логи конференции](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru) — возможно, кто-то уже прочитал и ответил на ваш вопрос (те, кто в состоянии ответить, обычно читают логи и увидят его). Если ответа на вопрос не было, вежливо спросите, не появилось ли у кого идей по поводу вопроса такого-то. 









![(!)](../images/Hammer.png) **Сделать:** дописать, если чего не хватает 

![(!)](../images/Hammer.png) **Сделать:** вообще-то этот раздел нужно слить с соответствующим куском "Острова посланных на..." и оформить в виде отдельной статейки с тупым названием "Как правильно задавать вопросы" Согласен. 


Changes to wiki/ru/Sandbox.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Sandbox/index.html)


# Sandbox

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Перевод recentstatus](#Перевод_recentstatus)
   * [1.1 Ответ Gebb'а Чемберлену](#Ответ_Gebbа_Чемберлену)
* [2 Разная хрень](#Разная_хрень)
* [3 Для bigote](#Для_bigote)
   * [3.1 Батоны](#Батоны)
* [4 Для kostix](#Для_kostix)
* [5 HREFs](#HREFs)
* [6 быки](#быки)
* [7 Комментарии в коде страницы](#Комментарии_в_коде_страницы)
* [8 Шаблоны решают!](#Шаблоны_решают)
* [9 Тестовый кусок](#Тестовый_кусок)


>



|




|


|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Sandbox/index.html)


# Sandbox

Материал из Tkabber Wiki.

## <a id="toc"></a>Содержание

* [1 Перевод recentstatus](#Перевод_recentstatus)
 * [1.1 Ответ Gebb'а Чемберлену](#Ответ_Gebbа_Чемберлену)
* [2 Разная хрень](#Разная_хрень)
* [3 Для bigote](#Для_bigote)
 * [3.1 Батоны](#Батоны)
* [4 Для kostix](#Для_kostix)
* [5 HREFs](#HREFs)
* [6 быки](#быки)
* [7 Комментарии в коде страницы](#Комментарии_в_коде_страницы)
* [8 Шаблоны решают!](#Шаблоны_решают)
* [9 Тестовый кусок](#Тестовый_кусок)

29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186


    Maximum number of status messages to keep.
    If the history size reaches this threshold,\
    the oldest message will be deleted automatically\
    when a new one is recorded.

    Clear history

Перевод:

### <a id="Ответ_Gebbа_Чемберлену"></a>Ответ Gebb'а Чемберлену

Описание плагина на английском я бы сделал такое.

This plugin keeps the history of avalability status messages entered manually in the
status combobox and allows to select them from a drop-down list. The history is
preserved across restarts.

**Перевод.**

Настройки расширения Recent Status.

Это расширение хранит историю статусных сообщений (описаний статуса), вручную
установленных пользователем, и позволяет выбирать их из выпадающего списка.
История сохраняется при перезапуске Ткаббера.

Максимальное число хранимых сообщений.

Если размер истории достигает этого лимита, наиболее старое сообщение удаляется
при добавлении нового.

Очистить историю.

## <a id="Разная_хрень"></a>Разная хрень

Текст с `vasya@jabber.org/Tkabber` тэгом **tt**.

Опция

    ::options(suxx) rulez

конфигурации.

## <a id="Для_bigote"></a>Для bigote

Тут — Ваша правка!

Правим-поправим, выправить не можем...

### <a id="Батоны"></a>Батоны

\<span class="button">Ctrl-q\</span> → Ctrl-q

Дружат с пробелами и идущими следом знаками препинания.

*  хри-хри, хрю-хрю хря-хря и хрё-хрё.
*  хры-хры

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

*  хри-хри

*  хрюк-хрюк

Не фонтан, но всё же...

## <a id="Для_kostix"></a>Для kostix

Тут — Ваша правка!

    Control;

    Control+;

    Ctrl + ;

    Enter

Кнопка с `padding-left` и `padding-right`:

    Ctrl-q + верх/низ: Ctrl-q

## <a id="HREFs"></a>HREFs

\<a href="[mailto:some.user@nowhere.land](mailto:some.user@nowhere.land)">mail me\</a> \<a href="[xmpp:some.user@nowhere.land](xmpp:some.user@nowhere.land)">bug me\</a>

[mailto:vasya@gde.to](mailto:vasya@gde.to)

[news:dejagnu.com](news:dejagnu.com)

gopher:somebody.still.use.it

[xmpp:petya@tam.zhe](xmpp:petya@tam.zhe)

\<html> \<A HREF="[mailto:liam@htmlhelp.com](mailto:liam@htmlhelp.com)" TITLE="Feedback on HTML 4.0 Reference">liam@htmlhelp.com\</A> \</html>

[shurik](xmpp:vasya@cool.de)

## <a id="быки"></a>быки

    proc a b {
      puts ouch!
      • • •
      puts {some code}
      puts heh

      · · · · ·

      puts suxx
      puts text
      . . . . . .
      puts yo!
    }

## <a id="Комментарии_в_коде_страницы"></a>Комментарии в коде страницы

Начало

Конец

## <a id="Шаблоны_решают"></a>Шаблоны решают!

Цитата обработана шаблоном ["quote"](Шаблон_Quote.md). Обратите внимание, что для корректного переноса строк необходимо втыкать тег \<br> без отбивки пустой строкой.

[Шаблон:Fixme](Шаблон_Fixme.md)

foo ![(?)](../images/Attention.png) **Поправьте меня:** это надо проверить! bar

[Шаблон:Todo](Шаблон_Todo.md)

![(!)](../images/Hammer.png) **Сделать:** Внедрить эту фигню повсеместно.

[Шаблон:todo2](Шаблон_Todo2.md) — с Psi Wiki:

**TODO: ** И эта фигня должна быть везде!

["Клавиши клавиатуры"](Шаблон_Button.md)

Ctrl-c will kill that boring task

[Предупреждающие таблички](Шаблон_Warn.md)

 ** Внимание! **

  Обязательно пользуйтесь шаблонами!

[Пути к файлам](Шаблон_File.md)

/dev/null

C:\\Windows\\sralnik

[Названия программ (\<b>\<tt>name\</tt>\</b>)](Шаблон_Program.md)

**`wish`**

![(!)](../images/Hammer.png) **Сделать:** Это бы тоже не помешало повсеместно внедрить...

## <a id="Тестовый_кусок"></a>Тестовый кусок









|




<
|
<
<


<
|
<
|
<
<


<
|
<

|



|

|



|



|

|



|

|

|
|

|

|

|

|



|









|





|

|

|

|

|

|

|








|
|
|








|

|



|

|

|

|

|

|

|

|

|

|


|
|

|

|

|

|

|

|


>
>
30
31
32
33
34
35
36
37
38
39
40
41

42


43
44

45

46


47
48

49

50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
    Maximum number of status messages to keep.
    If the history size reaches this threshold,\
    the oldest message will be deleted automatically\
    when a new one is recorded.

    Clear history

Перевод: 

### <a id="Ответ_Gebbа_Чемберлену"></a>Ответ Gebb'а Чемберлену

Описание плагина на английском я бы сделал такое.

 This plugin keeps the history of avalability status messages entered manually in the status combobox and allows to select them from a drop-down list. The history is preserved across restarts. 



**Перевод.**

 Настройки расширения Recent Status.

 Это расширение хранит историю статусных сообщений (описаний статуса), вручную установленных пользователем, и позволяет выбирать их из выпадающего списка. История сохраняется при перезапуске Ткаббера. 



Максимальное число хранимых сообщений.

 Если размер истории достигает этого лимита, наиболее старое сообщение удаляется при добавлении нового. 


Очистить историю. 

## <a id="Разная_хрень"></a>Разная хрень

Текст с `vasya@jabber.org/Tkabber` тэгом **tt**. 

Опция 

    ::options(suxx) rulez

конфигурации. 

## <a id="Для_bigote"></a>Для bigote

Тут — Ваша правка! 

Правим-поправим, выправить не можем... 

### <a id="Батоны"></a>Батоны

\<span class="button">Ctrl-q\</span> → Ctrl-q 

Дружат с пробелами и идущими следом знаками препинания.  

*  хри-хри, хрю-хрю хря-хря и хрё-хрё. 
*  хры-хры 

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

*  хри-хри 

*  хрюк-хрюк 

Не фонтан, но всё же... 

## <a id="Для_kostix"></a>Для kostix

Тут — Ваша правка! 

    Control;

    Control+;

    Ctrl + ;

    Enter

Кнопка с `padding-left` и `padding-right`: 

    Ctrl-q + верх/низ: Ctrl-q

## <a id="HREFs"></a>HREFs

\<a href="[mailto:some.user@nowhere.land](mailto:some.user@nowhere.land)">mail me\</a> \<a href="[xmpp:some.user@nowhere.land](xmpp:some.user@nowhere.land)">bug me\</a> 

[mailto:vasya@gde.to](mailto:vasya@gde.to) 

[news:dejagnu.com](news:dejagnu.com) 

gopher:somebody.still.use.it 

[xmpp:petya@tam.zhe](xmpp:petya@tam.zhe) 

\<html> \<A HREF="[mailto:liam@htmlhelp.com](mailto:liam@htmlhelp.com)" TITLE="Feedback on HTML 4.0 Reference">liam@htmlhelp.com\</A> \</html> 

[shurik](xmpp:vasya@cool.de) 

## <a id="быки"></a>быки

    proc a b {
      puts ouch!
      • • •
      puts {some code}
      puts heh
      
      · · · · · 
      
      puts suxx
      puts text
      . . . . . .
      puts yo!
    }

## <a id="Комментарии_в_коде_страницы"></a>Комментарии в коде страницы

Начало 

 Конец 

## <a id="Шаблоны_решают"></a>Шаблоны решают!

Цитата обработана шаблоном ["quote"](Шаблон_Quote.md). Обратите внимание, что для корректного переноса строк необходимо втыкать тег \<br> без отбивки пустой строкой. 

[Шаблон:Fixme](Шаблон_Fixme.md) 

foo ![(?)](../images/Attention.png) **Поправьте меня:** это надо проверить! bar 

[Шаблон:Todo](Шаблон_Todo.md) 

![(!)](../images/Hammer.png) **Сделать:** Внедрить эту фигню повсеместно. 

[Шаблон:todo2](Шаблон_Todo2.md) — с Psi Wiki: 

**TODO: ** И эта фигня должна быть везде! 

["Клавиши клавиатуры"](Шаблон_Button.md) 

Ctrl-c will kill that boring task 

[Предупреждающие таблички](Шаблон_Warn.md) 

 ** Внимание! **
 
  Обязательно пользуйтесь шаблонами! 

[Пути к файлам](Шаблон_File.md) 

/dev/null 

C:\\Windows\\sralnik 

[Названия программ (\<b>\<tt>name\</tt>\</b>)](Шаблон_Program.md) 

`wish` 

![(!)](../images/Hammer.png) **Сделать:** Это бы тоже не помешало повсеместно внедрить... 

## <a id="Тестовый_кусок"></a>Тестовый кусок


Changes to wiki/ru/Symlinks.md.

1
2

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Symlinks/index.html)


# Symlinks

Материал из Tkabber Wiki

![(!)](../images/Hammer.png) **Сделать:** написать что-нибудь про Unix

В Windows, _только_ на файловой системе [NTFS](http://en.wikipedia.org/wiki/NTFS) версии 3
и выше (то есть начиная с Windows NT 5.0 и выше, что означает: "Windows 2000 и выше")
можно делать аналог символических ссылок, но только на каталоги. Там они называются
"directory junctions" и являются частным случаем механизма "reparse points".

Для создания "симлинков" на каталоги в Windows можно использовать:

*  Утилиту [junction](http://www.microsoft.com/technet/sysinternals/Utilities/Junction.mspx)
   от Марка Руссиновича.
*  Знаменитый [FAR](http://www.farmanager.com/) file manager умеет делать ссылки на NTFS;
   соответствующая команда прибита на комбинацию клавиш **Alt-F6** и работает аналогично
   копированию каталога: то есть на одной панели вы переходите в каталог назначения
   (который будет содержать ссылку), на другой — ставите курсор на "линкуемый" каталог
   и "используете" на нём упомянутую команду.
*  Ворох других внешних утилит и средств, которые (вместе с теорией) описаны,
   например, [тут](http://shell-shocked.org/article.php?id=284).



>


|

|

|
<
<
<

|

|
<
|
<
<
<
<
|
|
>
1
2
3
4
5
6
7
8
9
10



11
12
13
14

15




16
17
18
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Symlinks/index.html)


# Symlinks

Материал из Tkabber Wiki.

![(!)](../images/Hammer.png) **Сделать:** написать что-нибудь про Unix 

В Windows, _только_ на файловой системе [NTFS](http://en.wikipedia.org/wiki/NTFS) версии 3 и выше (то есть начиная с Windows NT 5.0 и выше, что означает: "Windows 2000 и выше") можно делать аналог символических ссылок, но только на каталоги. Там они называются "directory junctions" и являются частным случаем механизма "reparse points". 




Для создания "симлинков" на каталоги в Windows можно использовать: 

*  Утилиту [junction](http://www.microsoft.com/technet/sysinternals/Utilities/Junction.mspx) от Марка Руссиновича. 

*  Знаменитый [FAR](http://www.farmanager.com/) file manager умеет делать ссылки на NTFS; соответствующая команда прибита на комбинацию клавиш Alt-F6 и работает аналогично копированию каталога: то есть на одной панели вы переходите в каталог назначения (который будет содержать ссылку), на другой — ставите курсор на "линкуемый" каталог и "используете" на нём упомянутую команду. 




*  Ворох других внешних утилит и средств, которые (вместе с теорией) описаны, например, [тут](http://shell-shocked.org/article.php?id=284). 


Changes to wiki/ru/Testimonials__Antimonials__And_Eternal_Questions.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50


[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Testimonials,_Antimonials,_And_Eternal_Questions/index.html)


# Testimonials, Antimonials, And Eternal Questions

Материал из Tkabber Wiki

Во-первых, с Новым 2010-м годом! :-)

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

## <a id="Testimonials"></a>Testimonials
Тут идут положительные отзывы. Если вам есть что сказать хорошего про Ткаббер, про то, чем
он облегчил вашу жизнь, когда вы перешли на него с другого клиента, а может, чем он привлёк
вас до такой степени, что вы и другие не стали пробовать, не стесняйтесь — либо зарегистрируйтесь
и оставьте свой отзыв, либо зайдите к нам в конференцию и выскажите его там. Не бойтесь
приводить сравнения с другими клиентами. У нас не пиар-агентство ;-) Мы стремимся к объективности
через субъективные взгляды.

1. \<tihvin> ...настройки интуитивно понятны и на русском.
1. \<kapsh> Вот формат логов в ткабере мне понравился очень. plain text - самое Ъ, надоели
   везде всякие sqlite и прочие говны.

## <a id="Antimonials"></a>Antimonials
Это хитрое слово можно перевести с английского как "рвотное". Думаю, понятно, что здесь
будут собираться менее лестные отзывы о Ткаббере. Наверняка есть какие-то мелочи, которые
затрудняют работу, сложны для понимания, а то и просто бесят. Если вы думаете, что какие-то
фичи других клиентов очень бы пригодились Ткабберу, тоже можете писать здесь, но лучше
сделать это в статье [**Планы на будущее**](Планы_на_будущее.md) (а здесь оставить ссылку
на вопрос). Ну или опять же, можете зайти в конференцию и высказаться там.

1. \<kapsh> tk - как оно выглядит, это ещё фигня, но другое дело что он себя ведёт не так,
   как другие тулкиты. Даже при вводе текста - скажем, я привык в гуе пользоваться ctrl-backspace,
   в tk оно не работает. И скорость ввода текста, как мне показалось, какая-то "другая".
   Как-то так %)

## <a id="Eternal_Questions"></a>Eternal Questions
А здесь мы попросим пользователей Ткаббера ответить на вековечный вопрос, мучающий умы
аналитиков ЛОРа: почему же Ткаббер такой страшный? А если точнее, _считаете ли его страшным вы?_
Если да, то _почему продолжаете использовать его?_

1. \<SoulThreads> успешно пользовался когда-то, и даже нравилось (очень), только те,
   кто подходили к монитору, спрашивали - что это за бяка такая?
1. \<natalie> под виндой не страшный..не знаю, чо страшного в нём..я к нему тольк и
   привыкла..больш никакой и не нравится с компа клиент
1. \<LOR/Methane> под вендой - няшка, под линаксом - немного хуже (виджеты олдскульные)



>





|

|
<
<
<
<
<

|
|
<
<
<
<
<

|
|
<

|
|
<
<
<
<
<

|
<
<
<

|
|
<
<

|
<
|
<
|
>
>
1
2
3
4
5
6
7
8
9
10





11
12
13





14
15
16

17
18
19





20
21



22
23
24


25
26

27

28
29
30
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Testimonials,_Antimonials,_And_Eternal_Questions/index.html)


# Testimonials, Antimonials, And Eternal Questions

Материал из Tkabber Wiki

Во-первых, с Новым 2010-м годом! :-) 

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






# <a id="Testimonials"></a>Testimonials
Тут идут положительные отзывы. Если вам есть что сказать хорошего про Ткаббер, про то, чем он облегчил вашу жизнь, когда вы перешли на него с другого клиента, а может, чем он привлёк вас до такой степени, что вы и другие не стали пробовать, не стесняйтесь — либо зарегистрируйтесь и оставьте свой отзыв, либо зайдите к нам в конференцию и выскажите его там. Не бойтесь приводить сравнения с другими клиентами. У нас не пиар-агентство ;-) Мы стремимся к объективности через субъективные взгляды. 






1.  \<tihvin> ...настройки интуитивно понятны и на русском. 
1.  \<kapsh> Вот формат логов в ткабере мне понравился очень. plain text - самое Ъ, надоели везде всякие sqlite и прочие говны. 


# <a id="Antimonials"></a>Antimonials
Это хитрое слово можно перевести с английского как "рвотное". Думаю, понятно, что здесь будут собираться менее лестные отзывы о Ткаббере. Наверняка есть какие-то мелочи, которые затрудняют работу, сложны для понимания, а то и просто бесят. Если вы думаете, что какие-то фичи других клиентов очень бы пригодились Ткабберу, тоже можете писать здесь, но лучше сделать это в статье [Планы на будущее](Планы_на_будущее.md) (а здесь оставить ссылку на вопрос). Ну или опять же, можете зайти в конференцию и высказаться там. 






1.  \<kapsh> tk - как оно выглядит, это ещё фигня, но другое дело что он себя ведёт не так, как другие тулкиты. Даже при вводе текста - скажем, я привык в гуе пользоваться ctrl-backspace, в tk оно не работает. И скорость ввода текста, как мне показалось, какая-то "другая". Как-то так %) 




# <a id="Eternal_Questions"></a>Eternal Questions
А здесь мы попросим пользователей Ткаббера ответить на вековечный вопрос, мучающий умы аналитиков ЛОРа: почему же Ткаббер такой страшный? А если точнее, _считаете ли его страшным вы?_ Если да, то _почему продолжаете использовать его?_ 



1.  \<SoulThreads> успешно пользовался когда-то, и даже нравилось (очень), только те, кто подходили к монитору, спрашивали - что это за бяка такая? 

1.  \<natalie> под виндой не страшный..не знаю, чо страшного в нём..я к нему тольк и привыкла..больш никакой и не нравится с компа клиент 

1.  \<LOR/Methane> под вендой - няшка, под линаксом - немного хуже (виджеты олдскульные) 


Changes to wiki/ru/Tk_Windows_keysyms_bug_explained.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Tk_Windows_keysyms_bug_explained/index.html)


# Tk Windows keysyms bug explained

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Multiple keymaps](#Multiple_keymaps)
* [2 A small testbed](#A_small_testbed)
* [3 The problem](#The_problem)
* [4 The explanation](#The_explanation)
* [5 Two ways to fix the problem](#Two_ways_to_fix_the_problem)

## <a id="Multiple_keymaps"></a>Multiple keymaps
Russian (and, in fact, most "non-Latin-1") users use several "keymaps" when typing.
"Keymap" stands for a mapping that the system uses when it translates the user's
keypresses into characters, which, for example, are inserted into a text editor in
which window the user is typing.

Usually one of these keymaps is the standard "en\_US" and another (or other) are for
some "incompatible" language, say, "ru\_RU" for Russian Cyrillic.

Just to recap for those who aren't familiar with the idea of keymaps: the keyboard
always generates the same "scancodes" for each physical key, but when it comes to
translation of the scancodes to the corresponding characters the _currenlty active_
keymap is taken into account.

For example, on my system I have English and Russian keymaps, so if I start a text
editor (or take any widget accepting textual input and type "qwerty" on both keymaps
(separating the sentencies by a newline), I will get:

    qwerty
    йцукен

because on my "Russian Windows keyboard" I have "й" depicted on the "q" key and so
on, which corresponds to the appropriate keymap. You can look at this picture of
such keyboard to get the idea: [[1]](http://ourworld.compuserve.com/homepages/PaulGor/std_ru.gif).

## <a id="A_small_testbed"></a>A small testbed
Now let's create a small testbed that will serve as a demonstration tool for the
further explanations. In the freshly started **wish** I type:

    bind . <Key> { puts "%K - %A" }

i.e. when I press a key on the Tk root window I will get the keysym and the
corresponding character for that key printed in the console window.

## <a id="The_problem"></a>The problem
Let's start with the example which demonstrates why translation of keypresses
to keysyms is broken in Windows Tk.

At first I ensure I'm on the English keymap and type the standard
encantation — "qwerty". So I get

    q - q
    w - w
    e - e
    r - r
    t - t
    y - y

printed at the console. This is perfectly OK.

Then I switch to the Russian keymap.

Now take a break and guess what scenarios should a user expect when typing our
"qwerty" sequence on the Russian keymap? It's pretty understandable that %A is
expected to be substituted by the relevant Cyrillic characters. When it comes
to keysyms, naturally, there are only two sane scenarios:

*  They will be the same as on the English keymap (q, w, etc):

        q - й
        w - ц
        e - у
        r - к
        t - е
        y - н

*  They will correspond to the characters, so they will be (as per the [keysyms] man page):

        Cyrillic_shorti - й
        Cyrillic_tse - ц
        Cyrillic_u - у
        Cyrillic_ka - к
        Cyrillic_e - е
        Cyrillic_en - н

Now let's see at the actual output. It will be:

    eacute - й
    odiaeresis - ц
    oacute - у
    ecircumflex - к
    aring - е
    iacute - н

So we have neither of the expected scenarios. Instead we have keysyms corresponding
to some Latin-1 characters of code points >= 0x80 from any appropriate charset
(ISO8859-1 for instance or the 1st BMP from Unicode).

## <a id="The_explanation"></a>The explanation
Windows Tk uses two functions from the win\\tkWinKey.c file to translate the "virtual-key
codes" delivered by the system via the **WM\_CHAR** messages to the window: **TkpGetString()**
and **TkpGetKeySym()**. The first is used to get the character corresponding to the keyboard
event(s) (that is what is substituted in place of %A placeholder in the bound scripts),
the second is to get the relevant keysym (what is substituted in place of the %K placeholder).

Both functions use the **ToAscii()** Win32 API call to get the data they want. And while
for the **TkpGetString()** this does the Right Thing (it's used, for instance, to convert
keypresses into the characters being inserted into a widget providing for a text input),
for the case of keysyms it breaks the expectations of the developers.

The problem is that, as it seems, the usage of **ToAscii()** is based on the fact that
it's expected to return codes of _Latin-1_ characters and the relevant X keysyms are
happliy assigned the codes which map perfectly to Latin-1, i.e. an X keysym for the
physical key labeled "q" has the same code as **ToAscii()** returns for the scancode
of this physical key on Windows.

Unfortunately this doesn't take into account the fact that **ToAscii()** _uses the currently
active keymap_ when processing. Each keymap is implicitly associated with some "code page"
(Windows idea for 8-bit charsets), so when I have a Russian keymap active **ToAscii()**
will use the Windows-1251 code-page to map the keyboard scancodes to characters.

Now look at the Windows-1251 table: [[2]](http://czyborra.com/charsets/cp1251.gif)
You will see that our "йцукен" characters corresponding to the "qwerty" series of
physical keys are assigned the codes 0xE9, 0xF6, 0xF3, 0xEA, 0xE5 and 0xED, respectively.

These codes are returned from **TkpGetKeySym()** and they have nothing to do neither
with the codes of "q", "w", etc nor with the codes of X keysyms Cyrillic\_shorti (0x06ca),
etc. Instead, they appear to the caller as keysyms corresponding to Latin-1 characters.
That's what we have seen in our testbed. Look at the ISO8859-1 chart
[[3]](http://czyborra.com/charsets/iso8859-1.gif) and see what characters
correspond to the codes listed above. You'll notice a perfect match with our sample output.

Since Windows uses Windows-1252 (WinLatin-1) [[4]](http://czyborra.com/charsets/cp1252.gif)
for the English (and not only English) keymaps and this code-page matches pretty closely
to the "canonical" Latin-1 assignment of code points, **ToAscii()** does the Right
Thing in the context of **TkpGetKeySym()** if and only if the currently active keymap
is linked to the cp1252. For any other code-page which "upper part" is incompatible
with cp1252 this behaviour is broken.

## <a id="Two_ways_to_fix_the_problem"></a>Two ways to fix the problem
Unfortunately, it appears that there's no one clean solution that would "just fix"
the current behaviour while keeping absolute backwards compatibility. Also the
outlined problem reveals somthing that I would qualify as a "blind spot" of Tk's
handling of keyboard events.

![(!)](../images/Hammer.png) **Сделать:** write up

---

A chat with Kevin Kenny (2008-04-10).

![(!)](../images/Hammer.png) **Сделать:** prettyfy

[01:46]\<kostix> if I ever write a patch for Tk this will be fixes for how keysyms are implemented
in Windows. looks like only cyrillic speakers/writers care about these problems, so our happiness is in our hands :)

[01:47]\<dkf\_> it's not so much that only you care, as the rest of us find it hard to reproduce :/

[01:47]\<dkf\_> (I don't have cyrillic keyboard support, or a cyrillic keyboard either)

[01:47]\<hat0> kostix, i've had no end of difficulty using cyrillic text in a tk application in windows

[01:47]\<hat0> i'll be happy to test that out or help if i can

[01:49]\<kostix> ok, "don't care" is not the right wording, I do understand this

[01:51]\<kostix> also I think Tk on X also has some problems. for instance, you can't have
russian locale and write accented Latin-5 letters in Tk even if you have all necessary
keymaps installed and they work for, say, GTK2+ apps. I heard two reports of this problem

[01:57]\<kbk> kostix - "you can't have russian locale and write accented Latin-5 letters in Tk" ...
Do you mean accented Cyrillic characters that appear in Latin-5, like ё or ѓ ?  (Tk, internally,
knows nothing about Latin-5, everything is converted to Unicode on input.

[01:57]\<kbk> )

[01:58]\* kbk just entered those letters, but isn't running in a Russian locale...

[02:00]\<kostix> kbk: to put it simple: I have a russian friend who lives in spain. so he
has russian and spain keyboard layouts installed. since he's russian, he has russian
system locale. this way, he can only enter cyrillic (in tkabber and plain wish), but
not "special" spanish letters, just ascii part. and at some point he changed locale
to spanish and realized in this mode it works.

[02:00]\<kostix> I can request from him some more strict description, if needed

[02:01]\<kbk> Oh.  Ok.  I remember discussing this problem with you before.

[02:01]\<kostix> "it works" means he can write those funky characters with tildas, acute sign, etc ;)

[02:01]\<kbk> Is there any application in which it works?

[02:01]\<kostix> uh, any non Tk app (such as GTK), as I understand ;)

[02:02]\* dkf\_ wonders wtf is going on in that situation

[02:02]\<kbk> Really?  And he doesn't need to swap keyboard maps to do it?

[02:03]\<kostix> dkf\_: I can say that on windows it's "just fundamentally wrong", so may be
X code also has some issues.

[02:03]\<kostix> kbk: I think I should stop now, ask that guy for exhaustive explanations and
file a bug report ;)

[02:04]\* kbk routinely switches between US and US-International keyboards, and \*that\* much works, at least.

[02:05]\<kostix> [http://ru.tkabber.jabe.ru/index.php/Tk\_Windows\_keysyms\_bug\_explained](../ru/Tk_Windows_keysyms_bug_explained.md) --
here's an unfinished article on the subject. I intend to eventually complete it and initiate some discussion here or on c.l.t

[02:06]\<kostix> unfortunately, the most interesting part isn't written :}

[02:07]\<stu> How does one enable keyboard layouts & foreign chars in X? There seems
to be more than one way ... this is all rather unclear to me.

[02:07]\<kostix> stu: indeed, there are about 4 or 5 ways to configure Xkb

[02:08]\* stu isn't even sure if it's Xkb that requires configuring .. or something else.

[02:08]\<kostix> stu: [http://paste.tclers.tk/868](http://paste.tclers.tk/868) -- here's a typical us+ru combo used by 99.9% of russian X users

[02:10]\<kbk> kostix - OK, so...

[02:10]\<kostix> stu: I beleive you can have up to four active groups in Xkb + "modifier
keys" in each which allow to temporatily switch from one group to another

[02:10]\<stu> thanks. what if I don't have an xorg.conf? it there a command-line utility to switch layouts?

[02:11]\<stu> I don't have to use xkbcomp, do I?

[02:11]\<kbk> kostix - So %A is correct all the time, but the keysym is not?

[02:11]\<kostix> kbk: yes, and this breaks bindings

[02:12]\<kostix> kbk: but in fact I beleive the problem is more fundamental and want to write even more text on it

[02:13]\<kbk> And what you'd loke to see is that if someone presses Alt+й, the bindings will
see \<Alt-Cyrillic\_shorti> and not \<Alt-q>?

[02:13]\<kbk> like to see... sheesh, I can't type.

[02:15]\<kostix> kbk: no, I would expect that alt-й will be the same as alt-q, i.e. it should
not depend on active keymap. and this is the second part of the problem since what I've
just said is questionnable

[02:16]\<kbk> I'm not convinced that what you're asking for (make it \<Alt-q>) is either
desirable or possible.  (But I concede that making it Alt-eacute is Just Plain Wrong...)

[02:17]\<kostix> kbk: for instance, when you have an "active" keys for menu entries
(those which are introduced using & in win32 api), they trigger depending on the keymap.
i.e. if I have a menu entry "з&апуск", it could be accelerated (activated) only by
russian "а", not latin and not "f" which is on the same key

[02:17]\<kostix> kbk: sure

[02:17]\<kostix> that's why it's complicated

[02:17]\<kostix> I have a thought that it would be cool to provide both ways

[02:17]\<kostix> may be by having somethin like \<Key-U+0463>

[02:18]\<kostix> in bindings

[02:18]\<kbk> kostix - But... Consider switching to a German keymap...

[02:18]\<kostix> I've used it for about a year some time ago :)

[02:18]\<kbk> In that case, I press the key marked 'Q' on my keyboard, and %A gives me 'a'...

[02:19]\<kbk> Firing the 'Q' binding for the key that types 'a' would be, uhm, peculiar.

[02:19]\<kostix> kbk: my (first) idea is simple: bindings are mostly for firing something up

[02:20]\<kostix> for instance, in tkabber we have a "smiley palette" bound to alt-e
(in english keymap) and a hack to make work on the same \*physical key\* on
russian -- the idea is that the user routinely depresses the same \*key\*

[02:20]\<kostix> she doesn't care what symbol it would provide if used for entering text

[02:21]\<kostix> so when I use event add \<\<EmoticonsPalette>> \<Alt-e> it should just
work on any keymap

[02:21]\<kbk> So for that case, you have a binding on \<Alt-Cyillic\_u>, another on \<Alt-e>
and probably (as a workaround for the bug) \<Alt-oacute> as well?

[02:21]\<kostix> but with menu accelerators the situation is reversed, as I've pointed
out earlier :\\

[02:22]\<kostix> kbk: yes, except for cyrillic binding, they're nonexistent in Windows.
and in X too

[02:22]\<kostix> you just can't manage to type anything which would hit that binding

[02:22]\<kostix> so we have alt-q + alt-oacute

[02:23]\<kbk> If Windows were to change so that you \*could\* bind to Cyrillic\_u (and
we've already agreed that oacute is Just Plain Wrong!), would that help?

[02:23]\<kostix> in fact we have some special remapping for some keys ;)

[02:23]\<kostix> kbk: no, because that would require me to insert one special
binding for every conceivable keymap in existence

[02:24]\<kostix> i.e. it would be no better than currently

[02:24]\<kostix> but just for such bindings like firing something up, like posting a menu
or opening some window

[02:25]\<kostix> which is bound to a physical key (I stress the word "physical" here)

[02:25]\<kbk> It's not clear to me that there \*is\* a better way that doesn't totally
break AZERTY keyboards.

[02:25]\<kostix> kbk: i.e. in such case I would prefer to bind to scancode

[02:25]\<kostix> for such bindings keymaps just get in the way

[02:29]\<kostix> kbk: just to clear up a bit: in X pressing alt-q works the
same way irrelevant to the currently active keymap.

[02:30]\<kbk> It's not obvious to me how binding to scancode helps.  Let's say
that there's a menu entry '&Annuler' in a French application.

[02:31]\<kbk> A French user wants that to be invoked by \<Alt-a> - and a Canadian
user wants that to be invoked by \<Alt-a>.

[02:31]\<kostix> I said this about binding that just do something, menu accelerators
are \*completely\* different story, I mentioned this and agree on it

[02:31]\<kostix> that's why I said the problem is more fundamental than it
appears on the first glance

[02:32]\<kbk> OK... instead of a menu entry, make it a button label, that's
more likely anyway, that there will be two buttons in a dialog marked &OK and &Annuler.

[02:33]\<kostix> yes, exactly

[02:33]\<kostix> so there are two distinct cases about this problem

[02:33]\<kbk> Both the French and Canadian users want \<Alt-a> to be &Annuler -- but
the French user has the A key on the key that to the Canadian user is Q

[02:35]\<kostix> kbk: what that article is about is more of a "invisible" bindings
if you like. say, I press Ctrl-L in tkabber to invoke it's login dialog.
it doesn't correspond to any button -- it's just a binding on the root window.
and it must work for the physical key

[02:35]\<kostix> no matter whether I'm French or Africaans ;)

[02:36]\<kbk> How do you document \*that\*?  You can't say, "Press Control-L",
because the physical key might not have an L on it.

[02:37]\<kostix> kbk: I dunno. it appears that 99% users have L where it usually
is on a "typical US QWERTY keyboard"

[02:37]\<kostix> deviations like dworak or germans with their z and y swapped
are inescapable but you can't deal with all this hell anyway

[02:38]\<kbk> OK, but what if the function were Control-Z instead?  Amreicans
have Z at the left of the lower row, the French have the Z where the Americans
have the W, and the Germans have the Z where the Americans have the Y.

[02:38]\<kostix> hm, really? I didn't know about this French feature

[02:38]\<kostix> it appears more idiotic I thought it is :(

[02:39]\<kbk> kostix - That's why I'd say, you \*don't\* deal with all of it;
you bind according to the character that the key generates, and you document
according to the character that the key generates.

[02:40]\<kbk> If (as you apparently do) you have a large enough user base that
swaps keyboard maps for a single keyboard, then you perhaps add extra bindings
so tat someone can hit Control-Cyrillic\_ka and still get the Control-r functionality.

[02:40]\<kostix> kbk: so how we then implement posting an emoticon palette?
it's bound to alt-e in tkabber for the obvious reason: "e" stands for
"emoticon", so how do we deal with russian? this keymap doesn't have \*any\*
ascii letter

[02:41]\<kostix> kbk: so, for any non-ascii keymap I have to add yet another
binding, you say?

[02:41]\<kostix> or may be provide "national keyboard plugins"?

[02:41]\<kbk> Either that, or localize bindings...

[02:41]\<kbk> they're likely to be more mnemonic that way, anyway.

[02:42]\<kbk> If an English speaker wants to have Control-C == "Close",
then a French one might well want to have Control-F = "Fermer"

[02:42]\<kostix> if we go this route this also means the same part is broken
in X, just in some other way

[02:44]\<kbk> In any case, generating a keysym of "aring" for "Cyrillic-ye" is crazy.

[02:45]\<kostix> I've nailed it so it's easy to fix. in fact I have a working patch
somewhere. but it did what you consider to be wrong ;)

[02:46]\<kostix> and anyway it would be better for this problem to be discussed in
more detail with more people, I think

[02:46]\<kostix> before really implementing any fixes

[02:47]\<kostix> kbk: one another point prevented me from submitting my patch
somewhere is what will happen to people who use composing key? say, japanese?

[02:47]\<kbk> Sure.  But I don't think there is any good solution other than
"bind to the symbol that's called out on the key".

[02:48]\<kostix> when I have seen some code related to this, which I was likely
about to break, I started to scratch my head

[02:48]\<kostix> so I would like to talk to a CJK person on this (if the
community has one)

[02:48]\<kbk> Well... in Windows, when someone hits a dead-key sequence, generally
the app doesn't see any keystroke except the last.

[02:48]\<kostix> dead != compose, I think

[02:49]\<kostix> on Japanese keyboards it switches alphabets, as I understand this

[02:49]\<kostix> may be pickhq could help here -- he appears to know Japanese and is
able to enter it

[02:50]\<kbk> Right - but the 'compose' key is itself dead, AFAIK, or at the very least ignorable.

[02:51]\<kbk> suchenwi is a fluent Chinese speaker and may very well know how Chinese keyboards work.

[02:51]\<kostix> kbk: I think he just has another hack like "ruslish" in his sleeve :P

[02:53]\<kbk> Well, yes, he does.  But he's lived in China and may well have insight into
how real Chinese input methods work.

[02:53]\<kbk> There are a lot of them...

[02:53]\<kbk> [http://zsigri.tripod.com/fontboard/cjk/input.html](http://zsigri.tripod.com/fontboard/cjk/input.html)

[03:02]\<kbk> In any case, though, it appears to me that binding to scancode will only make a bad situation worse.
[http://www.win.tue.nl/~aeb/linux/kbd/scancodes.html](http://www.win.tue.nl/~aeb/linux/kbd/scancodes.html)
shows just what a mess you get into \*there\*.

>



|









|
|
<
<
<

|
<

|
<
<
<

|
<
<




|
<
<

|
|
<



|
<

|
|
<

|
<








|

|

|
<
<
<

|

|
|
|
|
|
|

|

|
|
|
|
|
|

|








|
<
<

|
|
<
<
<
<

|
<
<
<

|
<
<
<
<

|
<
<
<

|
<
<

|
<
<
<
<
<

|
<
<
<
<
<

|
|
<
<
<

|



|

|

|
<

|

|

|

|

|

|
<
<

|
<
<

|

|

|
<
<
<
<

|

|

|

|

|

|

|

|
<

|
<

|

|
<

|

|
<

|

|

|

|

|
<

|

|

|

|

|

|
<

<

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17



18
19

20
21



22
23


24
25
26
27
28


29
30
31

32
33
34
35

36
37
38

39
40

41
42
43
44
45
46
47
48
49
50
51
52
53



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82


83
84
85




86
87



88
89




90
91



92
93


94
95





96
97





98
99
100



101
102
103
104
105
106
107
108
109
110

111
112
113
114
115
116
117
118
119
120
121
122


123
124


125
126
127
128
129
130




131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146

147
148

149
150
151
152

153
154
155
156

157
158
159
160
161
162
163
164
165
166

167
168
169
170
171
172
173
174
175
176
177
178

179

180









































































































































































































[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Tk_Windows_keysyms_bug_explained/index.html)


# Tk Windows keysyms bug explained

Материал из Tkabber Wiki.

## <a id="toc"></a>Содержание

* [1 Multiple keymaps](#Multiple_keymaps)
* [2 A small testbed](#A_small_testbed)
* [3 The problem](#The_problem)
* [4 The explanation](#The_explanation)
* [5 Two ways to fix the problem](#Two_ways_to_fix_the_problem)

# <a id="Multiple_keymaps"></a>Multiple keymaps
Russian (and, in fact, most "non-Latin-1") users use several "keymaps" when typing. "Keymap" stands for a mapping that the system uses when it translates the user's keypresses into characters, which, for example, are inserted into a text editor in which window the user is typing. 




Usually one of these keymaps is the standard "en\_US" and another (or other) are for some "incompatible" language, say, "ru\_RU" for Russian Cyrillic. 


Just to recap for those who aren't familiar with the idea of keymaps: the keyboard always generates the same "scancodes" for each physical key, but when it comes to translation of the scancodes to the corresponding characters the _currenlty active_ keymap is taken into account. 




For example, on my system I have English and Russian keymaps, so if I start a text editor (or take any widget accepting textual input and type "qwerty" on both keymaps (separating the sentencies by a newline), I will get: 



    qwerty
    йцукен

because on my "Russian Windows keyboard" I have "й" depicted on the "q" key and so on, which corresponds to the appropriate keymap. You can look at this picture of such keyboard to get the idea: [[1]](http://ourworld.compuserve.com/homepages/PaulGor/std_ru.gif) 



# <a id="A_small_testbed"></a>A small testbed
Now let's create a small testbed that will serve as a demonstration tool for the further explanations. In the freshly started **wish** I type: 


    bind . <Key> { puts "%K - %A" }

i.e. when I press a key on the Tk root window I will get the keysym and the corresponding character for that key printed in the console window. 


# <a id="The_problem"></a>The problem
Let's start with the example which demonstrates why translation of keypresses to keysyms is broken in Windows Tk. 


At first I ensure I'm on the English keymap and type the standard encantation — "qwerty". So I get 


    q - q
    w - w
    e - e
    r - r
    t - t
    y - y

printed at the console. This is perfectly OK. 

Then I switch to the Russian keymap. 

Now take a break and guess what scenarios should a user expect when typing our "qwerty" sequence on the Russian keymap? It's pretty understandable that %A is expected to be substituted by the relevant Cyrillic characters. When it comes to keysyms, naturally, there are only two sane scenarios: 




*  They will be the same as on the English keymap (q, w, etc): 

    q - й
    w - ц
    e - у
    r - к
    t - е
    y - н 

*  They will correspond to the characters, so they will be (as per the [keysyms] man page): 

    Cyrillic_shorti - й
    Cyrillic_tse - ц
    Cyrillic_u - у
    Cyrillic_ka - к
    Cyrillic_e - е
    Cyrillic_en - н

Now let's see at the actual output. It will be: 

    eacute - й
    odiaeresis - ц
    oacute - у
    ecircumflex - к
    aring - е
    iacute - н

So we have neither of the expected scenarios. Instead we have keysyms corresponding to some Latin-1 characters of code points >= 0x80 from any appropriate charset (ISO8859-1 for instance or the 1st BMP from Unicode). 



# <a id="The_explanation"></a>The explanation
Windows Tk uses two functions from the win\\tkWinKey.c file to translate the "virtual-key codes" delivered by the system via the **WM\_CHAR** messages to the window: **TkpGetString()** and **TkpGetKeySym()**. The first is used to get the character corresponding to the keyboard event(s) (that is what is substituted in place of %A placeholder in the bound scripts), the second is to get the relevant keysym (what is substituted in place of the %K placeholder). 





Both functions use the **ToAscii()** Win32 API call to get the data they want. And while for the **TkpGetString()** this does the Right Thing (it's used, for instance, to convert keypresses into the characters being inserted into a widget providing for a text input), for the case of keysyms it breaks the expectations of the developers. 




The problem is that, as it seems, the usage of **ToAscii()** is based on the fact that it's expected to return codes of _Latin-1_ characters and the relevant X keysyms are happliy assigned the codes which map perfectly to Latin-1, i.e. an X keysym for the physical key labeled "q" has the same code as **ToAscii()** returns for the scancode of this physical key on Windows. 





Unfortunately this doesn't take into account the fact that **ToAscii()** _uses the currently active keymap_ when processing. Each keymap is implicitly associated with some "code page" (Windows idea for 8-bit charsets), so when I have a Russian keymap active **ToAscii()** will use the Windows-1251 code-page to map the keyboard scancodes to characters. 




Now look at the Windows-1251 table: [[2]](http://czyborra.com/charsets/cp1251.gif) You will see that our "йцукен" characters corresponding to the "qwerty" series of physical keys are assigned the codes 0xE9, 0xF6, 0xF3, 0xEA, 0xE5 and 0xED, respectively. 



These codes are returned from **TkpGetKeySym()** and they have nothing to do neither with the codes of "q", "w", etc nor with the codes of X keysyms Cyrillic\_shorti (0x06ca), etc. Instead, they appear to the caller as keysyms corresponding to Latin-1 characters. That's what we have seen in our testbed. Look at the ISO8859-1 chart [[3]](http://czyborra.com/charsets/iso8859-1.gif) and see what characters correspond to the codes listed above. You'll notice a perfect match with our sample output. 






Since Windows uses Windows-1252 (WinLatin-1) [[4]](http://czyborra.com/charsets/cp1252.gif) for the English (and not only English) keymaps and this code-page matches pretty closely to the "canonical" Latin-1 assignment of code points, **ToAscii()** does the Right Thing in the context of **TkpGetKeySym()** if and only if the currently active keymap is linked to the cp1252. For any other code-page which "upper part" is incompatible with cp1252 this behaviour is broken. 






# <a id="Two_ways_to_fix_the_problem"></a>Two ways to fix the problem
Unfortunately, it appears that there's no one clean solution that would "just fix" the current behaviour while keeping absolute backwards compatibility. Also the outlined problem reveals somthing that I would qualify as a "blind spot" of Tk's handling of keyboard events. 




![(!)](../images/Hammer.png) **Сделать:** write up 

---

A chat with Kevin Kenny (2008-04-10). 

![(!)](../images/Hammer.png) **Сделать:** prettyfy 

[01:46]\<kostix> if I ever write a patch for Tk this will be fixes for how keysyms are implemented in Windows. looks like only cyrillic speakers/writers care about these problems, so our happiness is in our hands :) 


[01:47]\<dkf\_> it's not so much that only you care, as the rest of us find it hard to reproduce :/ 

[01:47]\<dkf\_> (I don't have cyrillic keyboard support, or a cyrillic keyboard either) 

[01:47]\<hat0> kostix, i've had no end of difficulty using cyrillic text in a tk application in windows 

[01:47]\<hat0> i'll be happy to test that out or help if i can 

[01:49]\<kostix> ok, "don't care" is not the right wording, I do understand this 

[01:51]\<kostix> also I think Tk on X also has some problems. for instance, you can't have russian locale and write accented Latin-5 letters in Tk even if you have all necessary keymaps installed and they work for, say, GTK2+ apps. I heard two reports of this problem 



[01:57]\<kbk> kostix - "you can't have russian locale and write accented Latin-5 letters in Tk" ... Do you mean accented Cyrillic characters that appear in Latin-5, like ё or ѓ ?  (Tk, internally, knows nothing about Latin-5, everything is converted to Unicode on input. 



[01:57]\<kbk> ) 

[01:58]\* kbk just entered those letters, but isn't running in a Russian locale... 

[02:00]\<kostix> kbk: to put it simple: I have a russian friend who lives in spain. so he has russian and spain keyboard layouts installed. since he's russian, he has russian system locale. this way, he can only enter cyrillic (in tkabber and plain wish), but not "special" spanish letters, just ascii part. and at some point he changed locale to spanish and realized in this mode it works. 





[02:00]\<kostix> I can request from him some more strict description, if needed 

[02:01]\<kbk> Oh.  Ok.  I remember discussing this problem with you before. 

[02:01]\<kostix> "it works" means he can write those funky characters with tildas, acute sign, etc ;) 

[02:01]\<kbk> Is there any application in which it works? 

[02:01]\<kostix> uh, any non Tk app (such as GTK), as I understand ;) 

[02:02]\* dkf\_ wonders wtf is going on in that situation 

[02:02]\<kbk> Really?  And he doesn't need to swap keyboard maps to do it? 

[02:03]\<kostix> dkf\_: I can say that on windows it's "just fundamentally wrong", so may be X code also has some issues. 


[02:03]\<kostix> kbk: I think I should stop now, ask that guy for exhaustive explanations and file a bug report ;) 


[02:04]\* kbk routinely switches between US and US-International keyboards, and \*that\* much works, at least. 

[02:05]\<kostix> [http://ru.tkabber.jabe.ru/index.php/Tk\_Windows\_keysyms\_bug\_explained](../ru/Tk_Windows_keysyms_bug_explained.md) -- here's an unfinished article on the subject. I intend to eventually complete it and initiate some discussion here or on c.l.t 


[02:06]\<kostix> unfortunately, the most interesting part isn't written :} 

[02:07]\<stu> How does one enable keyboard layouts & foreign chars in X? There seems to be more than one way ... this is all rather unclear to me. 


[02:07]\<kostix> stu: indeed, there are about 4 or 5 ways to configure Xkb 

[02:08]\* stu isn't even sure if it's Xkb that requires configuring .. or something else. 

[02:08]\<kostix> stu: [http://paste.tclers.tk/868](http://paste.tclers.tk/868) -- here's a typical us+ru combo used by 99.9% of russian X users 

[02:10]\<kbk> kostix - OK, so... 

[02:10]\<kostix> stu: I beleive you can have up to four active groups in Xkb + "modifier keys" in each which allow to temporatily switch from one group to another 


[02:10]\<stu> thanks. what if I don't have an xorg.conf? it there a command-line utility to switch layouts? 

[02:11]\<stu> I don't have to use xkbcomp, do I? 

[02:11]\<kbk> kostix - So %A is correct all the time, but the keysym is not? 

[02:11]\<kostix> kbk: yes, and this breaks bindings 

[02:12]\<kostix> kbk: but in fact I beleive the problem is more fundamental and want to write even more text on it 

[02:13]\<kbk> And what you'd loke to see is that if someone presses Alt+й, the bindings will see \<Alt-Cyrillic\_shorti> and not \<Alt-q>? [02:13]\<kbk> like to see... sheesh, I can't type. [02:15]\<kostix> kbk: no, I would expect that alt-й will be the same as alt-q, i.e. it should not depend on active keymap. and this is the second part of the problem since what I've just said is questionnable [02:16]\<kbk> I'm not convinced that what you're asking for (make it \<Alt-q>) is either desirable or possible.  (But I concede that making it Alt-eacute is Just Plain Wrong...) [02:17]\<kostix> kbk: for instance, when you have an "active" keys for menu entries (those which are introduced using & in win32 api), they trigger depending on the keymap. i.e. if I have a menu entry "з&апуск", it could be accelerated (activated) only by russian "а", not latin and not "f" which is on the same key [02:17]\<kostix> kbk: sure [02:17]\<kostix> that's why it's complicated [02:17]\<kostix> I have a thought that it would be cool to provide both ways [02:17]\<kostix> may be by having somethin like \<Key-U+0463> [02:18]\<kostix> in bindings [02:18]\<kbk> kostix - But... Consider switching to a German keymap... [02:18]\<kostix> I've used it for about a year some time ago :) [02:18]\<kbk> In that case, I press the key marked 'Q' on my keyboard, and %A gives me 'a'... [02:19]\<kbk> Firing the 'Q' binding for the key that types 'a' would be, uhm, peculiar. [02:19]\<kostix> kbk: my (first) idea is simple: bindings are mostly for firing something up [02:20]\<kostix> for instance, in tkabber we have a "smiley palette" bound to alt-e (in english keymap) and a hack to make work on the same \*physical key\* on russian -- the idea is that the user routinely depresses the same \*key\* [02:20]\<kostix> she doesn't care what symbol it would provide if used for entering text [02:21]\<kostix> so when I use event add \<\<EmoticonsPalette>> \<Alt-e> it should just work on any keymap [02:21]\<kbk> So for that case, you have a binding on \<Alt-Cyillic\_u>, another on \<Alt-e> and probably (as a workaround for the bug) \<Alt-oacute> as well? [02:21]\<kostix> but with menu accelerators the situation is reversed, as I've pointed out earlier :\\ [02:22]\<kostix> kbk: yes, except for cyrillic binding, they're nonexistent in Windows. and in X too [02:22]\<kostix> you just can't manage to type anything which would hit that binding [02:22]\<kostix> so we have alt-q + alt-oacute [02:23]\<kbk> If Windows were to change so that you \*could\* bind to Cyrillic\_u (and we've already agreed that oacute is Just Plain Wrong!), would that help? [02:23]\<kostix> in fact we have some special remapping for some keys ;) [02:23]\<kostix> kbk: no, because that would require me to insert one special binding for every conceivable keymap in existence [02:24]\<kostix> i.e. it would be no better than currently [02:24]\<kostix> but just for such bindings like firing something up, like posting a menu or opening some window [02:25]\<kostix> which is bound to a physical key (I stress the word "physical" here) [02:25]\<kbk> It's not clear to me that there \*is\* a better way that doesn't totally break AZERTY keyboards. [02:25]\<kostix> kbk: i.e. in such case I would prefer to bind to scancode [02:25]\<kostix> for such bindings keymaps just get in the way [02:29]\<kostix> kbk: just to clear up a bit: in X pressing alt-q works the same way irrelevant to the currently active keymap. [02:30]\<kbk> It's not obvious to me how binding to scancode helps.  Let's say that there's a menu entry '&Annuler' in a French application. [02:31]\<kbk> A French user wants that to be invoked by \<Alt-a> - and a Canadian user wants that to be invoked by \<Alt-a>. [02:31]\<kostix> I said this about binding that just do something, menu accelerators are \*completely\* different story, I mentioned this and agree on it [02:31]\<kostix> that's why I said the problem is more fundamental than it appears on the first glance [02:32]\<kbk> OK... instead of a menu entry, make it a button label, that's more likely anyway, that there will be two buttons in a dialog marked &OK and &Annuler. [02:33]\<kostix> yes, exactly [02:33]\<kostix> so there are two distinct cases about this problem [02:33]\<kbk> Both the French and Canadian users want \<Alt-a> to be &Annuler -- but the French user has the A key on the key that to the Canadian user is Q [02:35]\<kostix> kbk: what that article is about is more of a "invisible" bindings if you like. say, I press Ctrl-L in tkabber to invoke it's login dialog. it doesn't correspond to any button -- it's just a binding on the root window. and it must work for the physical key [02:35]\<kostix> no matter whether I'm French or Africaans ;) [02:36]\<kbk> How do you document \*that\*?  You can't say, "Press Control-L", because the physical key might not have an L on it. [02:37]\<kostix> kbk: I dunno. it appears that 99% users have L where it usually is on a "typical US QWERTY keyboard" [02:37]\<kostix> deviations like dworak or germans with their z and y swapped are inescapable but you can't deal with all this hell anyway [02:38]\<kbk> OK, but what if the function were Control-Z instead?  Amreicans have Z at the left of the lower row, the French have the Z where the Americans have the W, and the Germans have the Z where the Americans have the Y. [02:38]\<kostix> hm, really? I didn't know about this French feature [02:38]\<kostix> it appears more idiotic I thought it is :( [02:39]\<kbk> kostix - That's why I'd say, you \*don't\* deal with all of it; you bind according to the character that the key generates, and you document according to the character that the key generates. [02:40]\<kbk> If (as you apparently do) you have a large enough user base that swaps keyboard maps for a single keyboard, then you perhaps add extra bindings so tat someone can hit Control-Cyrillic\_ka and still get the Control-r functionality. [02:40]\<kostix> kbk: so how we then implement posting an emoticon palette? it's bound to alt-e in tkabber for the obvious reason: "e" stands for "emoticon", so how do we deal with russian? this keymap doesn't have \*any\* ascii letter [02:41]\<kostix> kbk: so, for any non-ascii keymap I have to add yet another binding, you say? [02:41]\<kostix> or may be provide "national keyboard plugins"? [02:41]\<kbk> Either that, or localize bindings... [02:41]\<kbk> they're likely to be more mnemonic that way, anyway. [02:42]\<kbk> If an English speaker wants to have Control-C == "Close", then a French one might well want to have Control-F = "Fermer" [02:42]\<kostix> if we go this route this also means the same part is broken in X, just in some other way [02:44]\<kbk> In any case, generating a keysym of "aring" for "Cyrillic-ye" is crazy. [02:45]\<kostix> I've nailed it so it's easy to fix. in fact I have a working patch somewhere. but it did what you consider to be wrong ;) [02:46]\<kostix> and anyway it would be better for this problem to be discussed in more detail with more people, I think [02:46]\<kostix> before really implementing any fixes [02:47]\<kostix> kbk: one another point prevented me from submitting my patch somewhere is what will happen to people who use composing key? say, japanese? [02:47]\<kbk> Sure.  But I don't think there is any good solution other than "bind to the symbol that's called out on the key". [02:48]\<kostix> when I have seen some code related to this, which I was likely about to break, I started to scratch my head [02:48]\<kostix> so I would like to talk to a CJK person on this (if the community has one) [02:48]\<kbk> Well... in Windows, when someone hits a dead-key sequence, generally the app doesn't see any keystroke except the last. [02:48]\<kostix> dead != compose, I think [02:49]\<kostix> on Japanese keyboards it switches alphabets, as I understand this [02:49]\<kostix> may be pickhq could help here -- he appears to know Japanese and is able to enter it [02:50]\<kbk> Right - but the 'compose' key is itself dead, AFAIK, or at the very least ignorable. [02:51]\<kbk> suchenwi is a fluent Chinese speaker and may very well know how Chinese keyboards work. [02:51]\<kostix> kbk: I think he just has another hack like "ruslish" in his sleeve :P [02:53]\<kbk> Well, yes, he does.  But he's lived in China and may well have insight into how real Chinese input methods work. [02:53]\<kbk> There are a lot of them... [02:53]\<kbk> [http://zsigri.tripod.com/fontboard/cjk/input.html](http://zsigri.tripod.com/fontboard/cjk/input.html) [03:02]\<kbk> In any case, though, it appears to me that binding to scancode will only make a bad situation worse.   [http://www.win.tue.nl/~aeb/linux/kbd/scancodes.html](http://www.win.tue.nl/~aeb/linux/kbd/scancodes.html)  shows just what a mess you get into \*there\*. 













































































































































































































Changes to wiki/ru/Tkabber.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262

263
264

265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311


[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Tkabber/index.html)


# Tkabber

Материал из Tkabber Wiki.

## <a id="toc"></a>Содержание

* [1 Может](#Может)
   * [1.1 Соединение с сервером и логин](#Соединение_с_сервером_и_логин)
      * [1.1.1 Типы соединений с сервером](#Типы_соединений_с_сервером)
      * [1.1.2 Прокси](#Прокси)
      * [1.1.3 (Авто)определение параметров соединения](#Автоопределение_параметров_соединения)
      * [1.1.4 Логин/автологин](#Логин_автологин)
      * [1.1.5 Мультилогин](#Мультилогин)
   * [1.2 Browse/Discovery](#Browse_Discovery)
   * [1.3 Обмен сообщениями (messaging)](#Обмен_сообщениями_messaging)
      * [1.3.1 Чат](#Чат)
      * [1.3.2 Групповой чат и MUC](#Групповой_чат_и_MUC)
   * [1.4 Присутствие (presence)](#Присутствие_presence)
   * [1.5 Info/Query (IQ)](#Info_Query_IQ)
   * [1.6 Privacy](#Privacy)
   * [1.7 Передача файлов](#Передача_файлов)
   * [1.8 Publish/Subscribe (pubsub)](#Publish_Subscribe_pubsub)
   * [1.9 Интерфейс](#Интерфейс)
   * [1.10 Список контактов (ростер)](#Список_контактов_ростер)
   * [1.11 Смайлики AKA emoticons](#Смайлики_AKA_emoticons)
   * [1.12 История](#История)
   * [1.13 Стандартные плагины](#Стандартные_плагины)
   * [1.14 Расширяемость](#Расширяемость)
   * [1.15 Управляемость](#Управляемость)
* [2 Не может](#Не_может)
   * [2.1 SO\_KEEPALIVE на сокете](#SO_KEEPALIVE_на_сокете)
   * [2.2 Сжатие потока при использовании SSL](#Сжатие_потока_при_использовании_SSL)
   * [2.3 "Лёгкий в использовании" мультилогин](#Лёгкий_в_использовании_мультилогин)
   * [2.4 Voice IP](#Voice_IP)
   * [2.5 Хистори на сервере / сжатие логов](#Хистори_на_сервере___сжатие_логов)
   * [2.6 Поддержка PGP под Windows](#Поддержка_PGP_под_Windows)
* [3 "Слабые места"](#Слабые_места)
   * [3.1 Ресурсоёмкость и скорость работы](#Ресурсоёмкость_и_скорость_работы)
   * [3.2 Поддержка PGP](#Поддержка_PGP)
   * [3.3 Доступность требуемых модулей Tcl/Tk](#Доступность_требуемых_модулей_Tcl_Tk)
   * [3.4 ОС-зависимые баги](#ОС-зависимые_баги)
   * [3.5 Поддержка ОС-зависимых особенностей](#Поддержка_ОС-зависимых_особенностей)

## <a id="Может"></a>Может
### <a id="Соединение_с_сервером_и_логин"></a>Соединение с сервером и логин

#### <a id="Типы_соединений_с_сервером"></a>Типы соединений с сервером

Поддерживаются следующие типы соединений:

*  plaintext (на порт 5222).
*  SSL (на порт 5223, "Старый SSL").
*  STARTTLS (на порт 5222).
*  HTTP poll (на порт 5280).

Возможны два вида аутентификации пользователя:

*  обычный (plaintext)
*  SASL

Поддерживается сжатие потока (stream compression) только для plaintext соединений
через пакет **ztcl**. Сжатие потока на SSL-соединениях не поддерживается (см. секцию "Не может").

#### <a id="Прокси"></a>Прокси

Любое соединение может "ходить" через HTTP-прокси; любые соединения, кроме HTTP
poll, требуют от прокси поддержки метода CONNECT на соответствующий порт. HTTP
poll использует HTTP, то есть от прокси требуется только разрешение
HTTP-запросов на соответствующий порт.

На прокси поддерживаются типы авторизации basic и NTLM.

Имеется возможность поддерживать соединение через прокси путём периодической
посылки в выходной поток байта 0x20.

HTTPS и SOCKSx прокси в настоящее время не поддерживаются.

#### <a id="Автоопределение_параметров_соединения"></a>(Авто)определение параметров соединения

Возможно ручное указание хоста и порта для соединения. Также Ткаббер умеет
запрашивать необходимые SRV или TXT записи в DNS для выяснения точных
параметров подключения по доменной части JID'а пользователя.

Корректная работа с DNS требует достаточно свежей **tcllib**, а также — в
большинстве случаев — пакета **tcludp** для возможности выполнения DNS-запросов
по протоколу UDP.

#### <a id="Логин_автологин"></a>Логин/автологин

Имеется удобная форма для изменения параметров логина. Все настройки логина
можно изменить через механизм Customize.

Поддерживаются три варианта логина:

*  Показ формы логина при старте и ожидание действий пользователя.
*  Старт без показа формы логина и ожидание действий пользователя.
*  Автологин.

Имеется поддержка "профилей" (или "профайлов", если угодно) логинов: в конфиге
Ткаббера можно ввести произвольное количество независимых групп настроек логина
и затем выбирать их в форме логина хоткеями Control+1 (первый профиль) и т.д.

#### <a id="Мультилогин"></a>Мультилогин

"Мультилогин" (одновременная регистрация и работа с несколькими аккаунтами)
_официально_ считается нереализованным.

На деле бо&#769;льшая часть кода ткаббера поддерживает одновременную  работу с
несколькими аккаунтами, и добиться такой работы в Ткаббере _можно,_ причём без
особых усилий.

(Так же по этой теме см. ниже.)

### <a id="Browse_Discovery"></a>Browse/Discovery

### <a id="Обмен_сообщениями_messaging"></a>Обмен сообщениями (messaging)

Поддерживается:

*  Обычные (normal) сообщения и чат.
*  Рендеринг XHTML-сообщений.
*  Обычные сообщения архивируются и доступны для просмотра через интерфейс, напоминающий читалку e-mail.
*  Хэдлайны (headlines) (и, в частности, поддержка RSS-сервисов). Возможно кэширование хэдлайнов.
*  Обработка урлов, смайлов и стайлкодов в тексте сообщений.
*  Обработка /me-сообщений.
*  Поддержка некоторых атрибутов сообщений, передаваемых в опциональном элементе \<x>.
*  Поддержка "хайлайтов" (цветовыделения заданных пользователем ключевых слов).
*  Подписывание любых сообщений (включая групчат) при помощи PGP.
*  Возможность выбора типа сообщения по умолчанию для исходящих сообщений (normal/chat).

Для окон чата и групчата поддерживается:

*  Поиск (по Ctrl-S).
*  Закладки и перемещение по ним.
*  "Команды в стиле IRC" (/ban /kick /time /vcard /leave и т.д.) с автозавершением (completion) по Tab.
*  "Умная" обработка кликов мышкой в окне лога чата (клик на нике помещает его в поле ввода
   чата, клик на URL'е запускает на нём браузер).
*  Поддержка неограниченного undo/redo в поле ввода чата:
 *  Control-z (и Control-underscore в Unix, если включена опция `tk_strictMotif`)
    отменяет последнее действие редактирования текста.
 *  Control-Z (или Control-y в Windows) перевыполняет последнюю отменённую операцию редактирования.

Недоработки/баги:

*  Достаточно дубовый интерфейс обработки стандартных сообщений и элементов \<x>.
*  То же самое касается архива сообщений.
*  Невозможно удалять закладки.
*  Нет ограничения на максимальное число сообщений в окне чата/групчата.

(Работы по улучшению положения в этой области ведутся).

#### <a id="Чат"></a>Чат

Поддерживаются уведомления о состоянии хода беседы (chat state notifications).

#### <a id="Групповой_чат_и_MUC"></a>Групповой чат и MUC

Поддерживается:

*  Автозавершение (completion) ников в комнате (по Tab).
*  Подробное меню с возможностью полного управления конфигурацией комнаты (кнопка
вызова меню замаскирована под метку "Тема").

### <a id="Присутствие_presence"></a>Присутствие (presence)

### <a id="Info_Query_IQ"></a>Info/Query (IQ)

### <a id="Privacy"></a>Privacy

### <a id="Передача_файлов"></a>Передача файлов

### <a id="Publish_Subscribe_pubsub"></a>Publish/Subscribe (pubsub)

### <a id="Интерфейс"></a>Интерфейс

### <a id="Список_контактов_ростер"></a>Список контактов (ростер)

В ростер могут быть помещены:

*  Обычные контакты (с людьми).
*  Закладки на комнаты (groupchat, MUC).
*  Сервисы (АКА транспорты АКА гейты).

Поддерживается:

*  Возможность произвольного переименования контактов.
*  Иконки транспортов для сервисов и обычных контактов с этих сервисах;
   тип сервисов узнаётся при помощи IQ-запросов.
*  Автовход в выбранные конференции из ростера.
*  Автологин на выбранные сервисы.
*  Drag'n'drop комнат из дискавери в ростер.
*  Приглашение контакта из ростера в комнату при помощи drag'n'drop (invitation).
*  Вложенные группы.
*  Перетаскивание мышкой контактов по ростеру.
*  "Склеивание" нескольких ресурсов одного контакта, находящихся в онлайне, в один.
*  Аннотации контактов (с показам в окне просмотра vCard'ов).
*  Экспорт ростера в текстовый файл и импорт оттуда.
*  Возможность послать список контактов из ростера другому контакту (send users).
*  Переключение между видимостью всех контактов или только находящихся в онлайне.
*  Возможность убрать/показать ростер (при работе в "tabbed" режиме) по хоткею Ctrl-R.
*  Тултипы (tooltips, balloon hints, всплывающие подсказки) с информацией о контакте.

### <a id="Смайлики_AKA_emoticons"></a>Смайлики AKA emoticons

### <a id="История"></a>История

Поддерживается:

*  Запись всех сообщений чатов и комнат в текстовые файлы; файлы истории именуются по JID'ам контактов/комнат.
*  Окно для просмотра истории общения в комнате/с контактом. Доступно в соответствующих контекстных меню.
*  В окне просмотра лога поддерживается поиск (по Ctrl-S).
*  Архивация лога при его открытии (перенос записей старше одного месяца в спец. подкаталог).

Не поддерживается/баги:

*  Пока что отсутствует возможность лёгкого навешивания собственных обработчиков на событие
   "архивация лога" (далее читайте ниже в разделе "Не может").
*  Ошибки времени выполнения при общении с идиотскими никами, содержащими символы, запрещённые
   для использования в именах файлов текущей ОС. Это — ошибки попытки открыть файл с именем,
   образованным из такого ника при общении с подобным ником в привате комнаты (в этом случае
   лог имеет имя `ROOMNAME_SERVERNAME_NICK`). Лечится временным отключением логов групчата.

### <a id="Стандартные_плагины"></a>Стандартные плагины

### <a id="Расширяемость"></a>Расширяемость

### <a id="Управляемость"></a>Управляемость

## <a id="Не_может"></a>Не может
### <a id="SO_KEEPALIVE_на_сокете"></a>SO\_KEEPALIVE на сокете

"Низкоуровневое" API сокетов в настоящий момент не "экспортировано" на уровень
скриптов в тикле; также не известно ни одного расширения тикля, позволяющего
это делать. Поэтому поддержка "настоящего keep alive" (каковое реализовано в
программах, написанных на C/C++, вроде Psi или Gaim), в настоящий момент
невозможно.

Разработчики Ткаббера наметили два пути решения этой проблемы:

*  Написание простого компонента на Си для тикля, экспортирующего socket API на уровень
   скриптов. Это сложный, но полезный путь.
*  Реализация высокоуровнего "forced keep-alive" (как это назвал автор идеи — teo) или —
   точнее — "keep-alive с обратной связью". Суть идеи: после неактивности входного потока
   более N единиц времени посылать серверу произвольный IQ-запрос (например, IQ version)
   и ждать ответа некоторое (настраиваемое) число секунд. Если ответ не появляется за
   отведённое время, считать соединение физически потерянным и закрывать его на стороне Ткаббера.

### <a id="Сжатие_потока_при_использовании_SSL"></a>Сжатие потока при использовании SSL

Stream Compression в XMPP не может работать внутри SSL-соединения физически. Однако,
SSL позволяет использовать собственные механизмы сжатия данных в потоке.

Использованию их в Ткаббере мешает два фактора:

*  Пакет **tcltls**, предоставляющий обвязку вокруг OpenSSL для Tcl, не содержит
   "крутилок" для управления сжатием данных в потоке, то есть, чтобы эта фича
   появилась в Ткаббере, кто-то должен сделать соответствующий патч на
   **tcltls**.
*  Возможности для синхронизации SSL-сокетов относительно используемых методов
   сжатия достаточно плохо продуманы в стандарте SSLv3. Более того, в (нём?)

   даже не определены стандартные методы сжатия. OpenSSL поддерживает RLE и
   Zlib.


### <a id="Лёгкий_в_использовании_мультилогин"></a>"Лёгкий в использовании" мультилогин

Основная причина того, что эта фича не принимает статус официально
поддерживаемой, состоит в том, что в настоящий момент в Ткаббере нет способов
логичной/удачной/удобной поддержки этой концепции в интерфейсе пользователя.
Особенно это касается механизма Customize.

Если у вас есть _продуманный_ вариант решения этой проблемы, не потребующий
переписывать тонны кода, обратитесь к разработчикам.

Одновременно хотелось бы заметить, что поддержка мультилогина, в сущности,
противоестественна, поскольку "невозможность" ("неудобство" и т.д.)
одновременной работы с несколькими копиями Ткаббера — достаточно надуманная
проблема.

### <a id="Voice_IP"></a>Voice IP

Таковая поддержка требует очень трудоёмкого прикручивания как минимум
библиотеки libmediastream (которую использует gtalk'овская libjingle). В
настоящий момент эта фича никому не нужна настолько, чтобы заняться её
реализацией.

Если вы не можете без неё жить, посмотрите на Coccinella или Linphone.

### <a id="Хистори_на_сервере___сжатие_логов"></a>Хистори на сервере / сжатие логов

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

### <a id="Поддержка_PGP_под_Windows"></a>Поддержка PGP под Windows

По всей видимости, это нереально. Неутешительные подробности читать [**тут**](Шифрование_в_Ткаббере.md).

## <a id="Слабые_места"></a>"Слабые места"
### <a id="Ресурсоёмкость_и_скорость_работы"></a>Ресурсоёмкость и скорость работы

### <a id="Поддержка_PGP"></a>Поддержка PGP

### <a id="Доступность_требуемых_модулей_Tcl_Tk"></a>Доступность требуемых модулей Tcl/Tk

### <a id="ОС-зависимые_баги"></a>ОС-зависимые баги

### <a id="Поддержка_ОС-зависимых_особенностей"></a>Поддержка ОС-зависимых особенностей



>








|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|

|
|
|
|
|

|
|

|

|

|
|
|
|

|

|
|

|
<

|

|
<
<
<

|

|
<

|

|

|
<
<

|
<
<

|

|
<

|

|
|
|

|
<
<

|

|
<

|
<
<

|

|

|

|

|
|
|
|
|
|
|
|
|
|

|

|
|
|
|
<
|
|
<
|

|

|
|
|
|

|

|

|

|

|

|
|
<

|

|

|

|

|

|

|

|

|
|
|

|

|
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|

|

|

|

|
|
|
|

|

|
<
|
<
<
<

|

|

|

|
|

|
<
<
<
<

|

|
<
|
<
<
<
<

|

|
<

|

|
<
<
<
|
|
>
|
<
>

<
<
<
<
<
<
<
|
<

|
<
<
<

|

|
<
<
<

|

|

|
<
<
<
<

|

|

|
|

|

|

|

|
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64

65
66
67
68



69
70
71
72

73
74
75
76
77
78


79
80


81
82
83
84

85
86
87
88
89
90
91
92


93
94
95
96

97
98


99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124

125
126

127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147

148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172

173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200

201



202
203
204
205
206
207
208
209
210
211
212




213
214
215
216

217




218
219
220
221

222
223
224
225



226
227
228
229

230
231







232

233
234



235
236
237
238



239
240
241
242
243
244




245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Tkabber/index.html)


# Tkabber

Материал из Tkabber Wiki.

## <a id="toc"></a>Содержание

* [1 Может](#Может)
 * [1.1 Соединение с сервером и логин](#Соединение_с_сервером_и_логин)
  * [1.1.1 Типы соединений с сервером](#Типы_соединений_с_сервером)
  * [1.1.2 Прокси](#Прокси)
  * [1.1.3 (Авто)определение параметров соединения](#Автоопределение_параметров_соединения)
  * [1.1.4 Логин/автологин](#Логин_автологин)
  * [1.1.5 Мультилогин](#Мультилогин)
 * [1.2 Browse/Discovery](#Browse_Discovery)
 * [1.3 Обмен сообщениями (messaging)](#Обмен_сообщениями_messaging)
  * [1.3.1 Чат](#Чат)
  * [1.3.2 Групповой чат и MUC](#Групповой_чат_и_MUC)
 * [1.4 Присутствие (presence)](#Присутствие_presence)
 * [1.5 Info/Query (IQ)](#Info_Query_IQ)
 * [1.6 Privacy](#Privacy)
 * [1.7 Передача файлов](#Передача_файлов)
 * [1.8 Publish/Subscribe (pubsub)](#Publish_Subscribe_pubsub)
 * [1.9 Интерфейс](#Интерфейс)
 * [1.10 Список контактов (ростер)](#Список_контактов_ростер)
 * [1.11 Смайлики AKA emoticons](#Смайлики_AKA_emoticons)
 * [1.12 История](#История)
 * [1.13 Стандартные плагины](#Стандартные_плагины)
 * [1.14 Расширяемость](#Расширяемость)
 * [1.15 Управляемость](#Управляемость)
* [2 Не может](#Не_может)
 * [2.1 SO\_KEEPALIVE на сокете](#SO_KEEPALIVE_на_сокете)
 * [2.2 Сжатие потока при использовании SSL](#Сжатие_потока_при_использовании_SSL)
 * [2.3 "Лёгкий в использовании" мультилогин](#Лёгкий_в_использовании_мультилогин)
 * [2.4 Voice IP](#Voice_IP)
 * [2.5 Хистори на сервере / сжатие логов](#Хистори_на_сервере___сжатие_логов)
 * [2.6 Поддержка PGP под Windows](#Поддержка_PGP_под_Windows)
* [3 "Слабые места"](#Слабые_места)
 * [3.1 Ресурсоёмкость и скорость работы](#Ресурсоёмкость_и_скорость_работы)
 * [3.2 Поддержка PGP](#Поддержка_PGP)
 * [3.3 Доступность требуемых модулей Tcl/Tk](#Доступность_требуемых_модулей_Tcl_Tk)
 * [3.4 ОС-зависимые баги](#ОС-зависимые_баги)
 * [3.5 Поддержка ОС-зависимых особенностей](#Поддержка_ОС-зависимых_особенностей)

# <a id="Может"></a>Может
## <a id="Соединение_с_сервером_и_логин"></a>Соединение с сервером и логин

### <a id="Типы_соединений_с_сервером"></a>Типы соединений с сервером

Поддерживаются следующие типы соединений: 

*  plaintext (на порт 5222). 
*  SSL (на порт 5223, "Старый SSL"). 
*  STARTTLS (на порт 5222). 
*  HTTP poll (на порт 5280). 

Возможны два вида аутентификации пользователя: 

*  обычный (plaintext) 
*  SASL 

Поддерживается сжатие потока (stream compression) только для plaintext соединений через пакет **ztcl**. Сжатие потока на SSL-соединениях не поддерживается (см. секцию "Не может"). 


### <a id="Прокси"></a>Прокси

Любое соединение может "ходить" через HTTP-прокси; любые соединения, кроме HTTP poll, требуют от прокси поддержки метода CONNECT на соответствующий порт. HTTP poll использует HTTP, то есть от прокси требуется только разрешение HTTP-запросов на соответствующий порт. 




На прокси поддерживаются типы авторизации basic и NTLM. 

Имеется возможность поддерживать соединение через прокси путём периодической посылки в выходной поток байта 0x20. 


HTTPS и SOCKSx прокси в настоящее время не поддерживаются. 

### <a id="Автоопределение_параметров_соединения"></a>(Авто)определение параметров соединения

Возможно ручное указание хоста и порта для соединения. Также Ткаббер умеет запрашивать необходимые SRV или TXT записи в DNS для выяснения точных параметров подключения по доменной части JID'а пользователя. 



Корректная работа с DNS требует достаточно свежей **tcllib**, а также — в большинстве случаев — пакета **tcludp** для возможности выполнения DNS-запросов по протоколу UDP. 



### <a id="Логин_автологин"></a>Логин/автологин

Имеется удобная форма для изменения параметров логина. Все настройки логина можно изменить через механизм Customize. 


Поддерживаются три варианта логина: 

*  Показ формы логина при старте и ожидание действий пользователя. 
*  Старт без показа формы логина и ожидание действий пользователя. 
*  Автологин. 

Имеется поддержка "профилей" (или "профайлов", если угодно) логинов: в конфиге Ткаббера можно ввести произвольное количество независимых групп настроек логина и затем выбирать их в форме логина хоткеями Control+1 (первый профиль) и т.д. 



### <a id="Мультилогин"></a>Мультилогин

"Мультилогин" (одновременная регистрация и работа с несколькими аккаунтами) _официально_ считается нереализованным. 


На деле бОльшая часть кода ткаббера поддерживает одновременную  работу с несколькими аккаунтами, и добиться такой работы в Ткаббере _можно,_ причём без особых усилий. 



(Так же по этой теме см. ниже.) 

## <a id="Browse_Discovery"></a>Browse/Discovery

## <a id="Обмен_сообщениями_messaging"></a>Обмен сообщениями (messaging)

Поддерживается: 

*  Обычные (normal) сообщения и чат. 
*  Рендеринг XHTML-сообщений. 
*  Обычные сообщения архивируются и доступны для просмотра через интерфейс, напоминающий читалку e-mail. 
*  Хэдлайны (headlines) (и, в частности, поддержка RSS-сервисов). Возможно кэширование хэдлайнов. 
*  Обработка урлов, смайлов и стайлкодов в тексте сообщений. 
*  Обработка /me-сообщений. 
*  Поддержка некоторых атрибутов сообщений, передаваемых в опциональном элементе \<x>. 
*  Поддержка "хайлайтов" (цветовыделения заданных пользователем ключевых слов). 
*  Подписывание любых сообщений (включая групчат) при помощи PGP. 
*  Возможность выбора типа сообщения по умолчанию для исходящих сообщений (normal/chat). 

Для окон чата и групчата поддерживается: 

*  Поиск (по Ctrl-S). 
*  Закладки и перемещение по ним. 
*  "Команды в стиле IRC" (/ban /kick /time /vcard /leave и т.д.) с автозавершением (completion) по Tab. 
*  "Умная" обработка кликов мышкой в окне лога чата (клик на нике помещает его в поле ввода чата, клик на URL'е запускает на нём браузер). 

*  Поддержка неограниченного undo/redo в поле ввода чата: 
 *  Control-z (и Control-underscore в Unix, если включена опция `tk_strictMotif`) отменяет последнее действие редактирования текста. 

 *  Control-Z (или Control-y в Windows) перевыполняет последнюю отменённую операцию редактирования. 

Недоработки/баги: 

*  Достаточно дубовый интерфейс обработки стандартных сообщений и элементов \<x>. 
*  То же самое касается архива сообщений. 
*  Невозможно удалять закладки. 
*  Нет ограничения на максимальное число сообщений в окне чата/групчата. 

(Работы по улучшению положения в этой области ведутся). 

### <a id="Чат"></a>Чат

Поддерживаются уведомления о состоянии хода беседы (chat state notifications). 

### <a id="Групповой_чат_и_MUC"></a>Групповой чат и MUC

Поддерживается: 

*  Автозавершение (completion) ников в комнате (по Tab). 
*  Подробное меню с возможностью полного управления конфигурацией комнаты (кнопка вызова меню замаскирована под метку "Тема"). 


## <a id="Присутствие_presence"></a>Присутствие (presence)

## <a id="Info_Query_IQ"></a>Info/Query (IQ)

## <a id="Privacy"></a>Privacy

## <a id="Передача_файлов"></a>Передача файлов

## <a id="Publish_Subscribe_pubsub"></a>Publish/Subscribe (pubsub)

## <a id="Интерфейс"></a>Интерфейс

## <a id="Список_контактов_ростер"></a>Список контактов (ростер)

В ростер могут быть помещены: 

*  Обычные контакты (с людьми). 
*  Закладки на комнаты (groupchat, MUC). 
*  Сервисы (АКА транспорты АКА гейты). 

Поддерживается: 

*  Возможность произвольного переименования контактов. 
*  Иконки транспортов для сервисов и обычных контактов с этих сервисах; тип сервисов узнаётся при помощи IQ-запросов. 

*  Автовход в выбранные конференции из ростера. 
*  Автологин на выбранные сервисы. 
*  Drag'n'drop комнат из дискавери в ростер. 
*  Приглашение контакта из ростера в комнату при помощи drag'n'drop (invitation). 
*  Вложенные группы. 
*  Перетаскивание мышкой контактов по ростеру. 
*  "Склеивание" нескольких ресурсов одного контакта, находящихся в онлайне, в один. 
*  Аннотации контактов (с показам в окне просмотра vCard'ов). 
*  Экспорт ростера в текстовый файл и импорт оттуда. 
*  Возможность послать список контактов из ростера другому контакту (send users). 
*  Переключение между видимостью всех контактов или только находящихся в онлайне. 
*  Возможность убрать/показать ростер (при работе в "tabbed" режиме) по хоткею Ctrl-R. 
*  Тултипы (tooltips, balloon hints, всплывающие подсказки) с информацией о контакте. 

## <a id="Смайлики_AKA_emoticons"></a>Смайлики AKA emoticons

## <a id="История"></a>История

Поддерживается: 

*  Запись всех сообщений чатов и комнат в текстовые файлы; файлы истории именуются по JID'ам контактов/комнат. 
*  Окно для просмотра истории общения в комнате/с контактом. Доступно в соответствующих контекстных меню. 
*  В окне просмотра лога поддерживается поиск (по Ctrl-S). 
*  Архивация лога при его открытии (перенос записей старше одного месяца в спец. подкаталог). 

Не поддерживается/баги: 

*  Пока что отсутствует возможность лёгкого навешивания собственных обработчиков на событие "архивация лога" (далее читайте ниже в разделе "Не может"). 

*  Ошибки времени выполнения при общении с идиотскими никами, содержащими символы, запрещённые для использования в именах файлов текущей ОС. Это — ошибки попытки открыть файл с именем, образованным из такого ника при общении с подобным ником в привате комнаты (в этом случае лог имеет имя `ROOMNAME_SERVERNAME_NICK`). Лечится временным отключением логов групчата. 




## <a id="Стандартные_плагины"></a>Стандартные плагины

## <a id="Расширяемость"></a>Расширяемость

## <a id="Управляемость"></a>Управляемость

# <a id="Не_может"></a>Не может
## <a id="SO_KEEPALIVE_на_сокете"></a>SO\_KEEPALIVE на сокете

"Низкоуровневое" API сокетов в настоящий момент не "экспортировано" на уровень скриптов в тикле; также не известно ни одного расширения тикля, позволяющего это делать. Поэтому поддержка "настоящего keep alive" (каковое реализовано в программах, написанных на C/C++, вроде Psi или Gaim), в настоящий момент невозможно. 





Разработчики Ткаббера наметили два пути решения этой проблемы: 

*  Написание простого компонента на Си для тикля, экспортирующего socket API на уровень скриптов. Это сложный, но полезный путь. 

*  Реализация высокоуровнего "forced keep-alive" (как это назвал автор идеи — teo) или — точнее — "keep-alive с обратной связью". Суть идеи: после неактивности входного потока более N единиц времени посылать серверу произвольный IQ-запрос (например, IQ version) и ждать ответа некоторое (настраиваемое) число секунд. Если ответ не появляется за отведённое время, считать соединение физически потерянным и закрывать его на стороне Ткаббера. 





## <a id="Сжатие_потока_при_использовании_SSL"></a>Сжатие потока при использовании SSL

Stream Compression в XMPP не может работать внутри SSL-соединения физически. Однако, SSL позволяет использовать собственные механизмы сжатия данных в потоке. 


Использованию их в Ткаббере мешает два фактора: 

*  Пакет **tcltls**, предоставляющий обвязку вокруг OpenSSL для Tcl, не содержит "крутилок" для управления сжатием данных в потоке, то есть, чтобы эта фича появилась в Ткаббере, кто-то должен сделать соответствующий патч на **tcltls**. 



*  Возможности для синхронизации SSL-сокетов относительно используемых методов сжатия достаточно плохо продуманы в стандарте SSLv3. Более того, в (нём?) даже не определены стандартные методы сжатия. OpenSSL поддерживает RLE и Zlib. 

## <a id="Лёгкий_в_использовании_мультилогин"></a>"Лёгкий в использовании" мультилогин


Основная причина того, что эта фича не принимает статус официально поддерживаемой, состоит в том, что в настоящий момент в Ткаббере нет способов логичной/удачной/удобной поддержки этой концепции в интерфейсе пользователя. Особенно это касается механизма Customize. 








Если у вас есть _продуманный_ вариант решения этой проблемы, не потребующий переписывать тонны кода, обратитесь к разработчикам. 


Одновременно хотелось бы заметить, что поддержка мультилогина, в сущности, противоестественна, поскольку "невозможность" ("неудобство" и т.д.) одновременной работы с несколькими копиями Ткаббера — достаточно надуманная проблема. 




## <a id="Voice_IP"></a>Voice IP

Таковая поддержка требует очень трудоёмкого прикручивания как минимум библиотеки libmediastream (которую использует gtalk'овская libjingle). В настоящий момент эта фича никому не нужна настолько, чтобы заняться её реализацией. 




Если вы не можете без неё жить, посмотрите на Coccinella или Linphone. 

## <a id="Хистори_на_сервере___сжатие_логов"></a>Хистори на сервере / сжатие логов

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





## <a id="Поддержка_PGP_под_Windows"></a>Поддержка PGP под Windows

По всей видимости, это нереально. Неутешительные подробности читать [тут](Шифрование_в_Ткаббере.md). 

# <a id="Слабые_места"></a>"Слабые места"
## <a id="Ресурсоёмкость_и_скорость_работы"></a>Ресурсоёмкость и скорость работы

## <a id="Поддержка_PGP"></a>Поддержка PGP

## <a id="Доступность_требуемых_модулей_Tcl_Tk"></a>Доступность требуемых модулей Tcl/Tk

## <a id="ОС-зависимые_баги"></a>ОС-зависимые баги

## <a id="Поддержка_ОС-зависимых_особенностей"></a>Поддержка ОС-зависимых особенностей


Changes to wiki/ru/Tkabber_Wiki_Справка.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Tkabber_Wiki:Справка/index.html)


# Tkabber Wiki:Справка

Материал из Tkabber Wiki

Эта страница предназначена для тех, кто пожелал принять участие в проекте
Tkabber Wiki в качестве автора статей или переводчика. Главное назначение
нижеследующего — определить стиль оформления, принятый на вики, чтобы все
статьи смотрелись более-менее одинаково, не слишком пестрели жирным и наклонным
шрифтом и были ясными для понимания. (Просьба учесть, что в настоящий момент не
всё на вики оформлено в соответствии с этими правилами, но исправления ведутся,
и в конце концов всё будет приведено к единому стилю.)

Если у вас есть какие-то предложения по оформлению, пожалуйста, свяжитесь либо
с [**Bigote**](Участник_Bigote.md), либо с [**kostix**](Участник_Kostix.md),
либо с [**lknight**](Участник_Lknight.md).

Для обсуждения работ на вики создана отдельная конференция
`xmpp:tkabber-wiki@confernce.jabber.ru`. Вход на неё — по приглашению, то есть
вам сначала надо выловить кого-нибудь из нас.

Итак, приступим.

## <a id="toc"></a>Содержание

* [1 Если вы не работали с вики раньше](#Если_вы_не_работали_с_вики_раньше)
* [2 Теперь об оформлении](#Теперь_об_оформлении)
   * [2.1 Для авторов новых статей](#Для_авторов_новых_статей)
      * [2.1.1 Применение отбоя пробелом](#Применение_отбоя_пробелом)
      * [2.1.2 Применение HTML](#Применение_HTML)
      * [2.1.3 Применение тэга **\<tt>**](#Применение_тэга_tt)
      * [2.1.4 Применение жирного шрифта](#Применение_жирного_шрифта)
      * [2.1.5 Применение наклонного шрифта](#Применение_наклонного_шрифта)
      * [2.1.6 Применение CSS](#Применение_CSS)
      * [2.1.7 Употребление смайликов в тексте](#Употребление_смайликов_в_тексте)
      * [2.1.8 Употребление буквы "Ё"](#Употребление_буквы_Ё)
      * [2.1.9 Прочие элементы оформления](#Прочие_элементы_оформления)
      * [2.1.10 Песочница](#Песочница)
   * [2.2 Переводчикам](#Переводчикам)
      * [2.2.1 OmegaT](#OmegaT)
      * [2.2.2 Рекомендуемый порядок действий при переводе на новый язык с нуля](#Рекомендуемый_порядок_действий_при_переводе_на_новый_язык_с_нуля)
      * [2.2.3 Перевод на родной язык](#Перевод_на_родной_язык)
      * [2.2.4 Перевод на чужой язык](#Перевод_на_чужой_язык)
      * [2.2.5 Перевод меню](#Перевод_меню)
      * [2.2.6 Локализация Ткаббера](#Локализация_Ткаббера)




# <a id="Если_вы_не_работали_с_вики_раньше"></a>Если вы не работали с вики раньше
*  Подробная и очень приличная [справка](http://ru.wikipedia.org/wiki/Википедия:Как_править_статьи)
   по разметке WikiPedia. На той странице есть ссылки на более конкретные темы:
   "изображения", "как начать новую статью" и прочее. В качестве теоретической
   базы — идеальное место.
*  Для создания галерей, однако, удобнее воспользоваться
   [ссылкой на соответствующий раздел MediaWiki](http://www.mediawiki.org/w/index.php?title=Sites_using_MediaWiki/gallery&action=submit),
   которая сразу показывает правильный пример кода (на wikipedia.org почему-то
   о галереях сказано вскользь, и работающий код не продемонстрирован, а чтобы
   вычислить его самому, надо или долго пробовать, или быть семи пядей во
   лбу ;))
*  Смотрите также [документацию по настройке интерфейса](http://meta.wikipedia.org/wiki/MediaWiki_i18n)
   и [Мануал пользователя](http://meta.wikipedia.org/wiki/MediaWiki_User's_Guide)
   по использованию и настройке справочной системы.

# <a id="Теперь_об_оформлении"></a>Теперь об оформлении
Во первых строках просим помнить, что структура вики может меняться (в том
числе и вами), но делать это нужно очень осторожно, предварительно обсудив
изменения с администраторами проекта (см. ссылки выше). Если у статьи, которую
вы хотите передвинуть по вики, есть "двойники" на других языках, то же самое
надо сделать и с ними. Потому мы и просим уведомлять о желаемых изменениях.

## <a id="Для_авторов_новых_статей"></a>Для авторов новых статей

Перед тем как писать новую статью, посмотрите, нет ли уже другой статьи, более
или менее полно раскрывающей эту тему. Если такая статья есть, возможно, вам
стоит просто дополнить её. Если же это не так, то для начала определитесь, в
какой раздел поместить ссылку на неё, и... поместите эту ссылку :) А затем
можно уже приступать к написанию. Не пожалейте пяти минут и ознакомьтесь с
правилами оформления статей. Может оказаться полезным и просмотр исходного кода
(по команде "править" в верхнем меню) какой-нибудь существующей статьи, где
есть элементы, которые вы собираетесь использовать в своей статье. И конечно,
мы не хотим загонять всех в жёсткие рамки — в конце концов, содержание важнее
формы. Оформление статьи — дело вкуса автора, но постарайтесь понять и
читателей — ведь это им будет тяжело разбираться в каше из стилей, если автор
об этом не позаботится. Не забывайте, что перед сохранением страницы её можно
предварительно просмотреть (есть кнопка "Предварительный просмотр"). Да, и
постарайтесь писать без ошибок ;)

Теперь о стилях.

### <a id="Применение_отбоя_пробелом"></a>Применение отбоя пробелом

Один из встроенных стилей разметки вики — отбой пробелом, то есть выделяемая
строка начинается с пробела. В результате применения этого стиля выделенный
текст помещается в красивую рамочку с розовым фоном. У нас этот стиль будет
применяться для:

*  выделения кусков кода:

    namespace eval emoteicons {
        array set emoteicons {}

        variable lasttext ""
        variable lastX
        variable lastY
    }

*  выделения опций настроек, когда они встречаются в тексте статьи в первый раз:

    ::jidlink::transport(allowed,dtcp-active)

*  выделения пути к файлам, когда этот путь:

1. довольно длинный,
1. вводится в тексте статьи впервые,
1. хочется обратить на него особое внимание.

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

### <a id="Применение_HTML"></a>Применение HTML

Основные стили разметки уже встроены в вики, так что особой нужды в
использовании тэгов HTML нет. Больше того: злоупотребление ими загрязняет
исходный текст статей, затрудняет перевод и правку. Тем не менее, в некоторых
случаях применение HTML вполне оправдано. Пример **—** это вот длинное тире
(\&mdash;), которое и должно по идее использоваться вместо популярного нынче
дефиса **-**. Ещё один пример — стрелки → и ← (\&rarr; и \&larr;), угловые скобки
\< и > (\&lt; и \&gt;), значок акцента **&\#769;**, ставящийся следом за буквой,
над которой хотим поставить ударение.

Если вам нужно оформить пропуск куска кода в примере, используйте спец-символ
\&middot; — "·" Например:

    proc a b {
        puts ouch!

        · · · · ·

        puts text
    }

При использовании ссылок знаки препинания, "касающиеся" последнего слова в
ссылке, из неё исключаются. Пример: _В случае сомнений не забывайте о
предварительном просмотре и о **'''[[Sandbox\|Песочнице]].'''** → В случае
сомнений не забывайте о предварительном просмотре и о
**[Песочнице](Sandbox.md).**_

### <a id="Применение_тэга_tt"></a>Применение тэга **\<tt>**

*  JID авторов патчей, статей и просто хороших людей, а также конференций и прочих
   ресурсов выделяются с помощью тэга **\<tt>**: `xmpp:loginname@jabberserver.org`,
   `xmpp:conferencename@conference.jabberserver.org`, `rss@jabberserver.org`.
   Если непосредственно после JID или ресурса идёт знак препинания, ставить его
   следует **после** закрывающего тэга **\</tt>**.
*  Выделение опций настроек (например, `::jidlink::transport(allowed,dtcp-active)`),
   когда они встречаются в тексте статьи во второй и более раз.

### <a id="Применение_жирного_шрифта"></a>Применение жирного шрифта

В этой вики жирный шрифт используется для:

*  выделения путей до файлов, о которых идёт речь (например, **~/.tkabber/avatar.gif**),
   когда не стоит нарушать текучесть предложения. При этом постарайтесь построить
   предложение так, чтобы к этому пути не примешивалась естественная пунктуация.
   Если же это невозможно, выключайте знаки препинания из выделения.
*  обозначения пути к какому-либо пункту Настроек Ткаббера или для ориентации в его
   меню (например, **Настройки → File Transfer → Jidlink** или **Службы → Расширения → Шпионить за присутствием**);
*  выделения ссылок на статьи данной вики (например, "О плагинах читайте [**эту статью**](Плагины.md).");
*  чтобы обратить внимание на какое-либо **важное слово;**
 *  обратите внимание, что в случае с выделенным "просто текстом", в отличие от
    кода или путей, знаки препинания включаются в выделение.
*  вопросы в [**ЧаВо**](Ткаббер_ЧаВо.md) — выделяются целиком, вместе со словом "Вопрос".

### <a id="Применение_наклонного_шрифта"></a>Применение наклонного шрифта

Наклонный шрифт в нашей вики применяется для выделения довольно длинных кусков
текста в общем повествовании (одно предложение или часть сложносочинённого или
сложноподчинённого предложения как минимум), то есть в случаях, когда жирный
шрифт слишком обращает на себя внимание. В этом случае знаки пунктуации,
завершающие выделенный текст, включаются в выделение. _Если вам понадобилось
акцентировать какое-либо слово в наклонном тексте, допустимо воспользоваться
для этого жирным шрифтом. При этом знаки пунктуации, вплотную прилегающие к
жирному слову, из выделения жирным **включаются,** если это обычное слово, и
исключается, если это кусок кода или путь до файла: **~/.tkabber/config.tcl**._
(Понимаю, что на словах это выглядит запутанно — просмотрите код этой страницы,
и вы всё поймёте. Или же просто присмотритесь к финальной точке предыдущего
предложения — она обычная :)) Постарайтесь не злоупотреблять смешением стилей
или близким соседством жирного и наклонного текста.

Если вам требуется выделить курсивом целый абзац или несколько предложений,
лучше воспользоваться тэгом \<cite>.

### <a id="Применение_CSS"></a>Применение CSS

На вики имеется возможность использовать в коде статей
[стили CSS](http://www.w3.org/Style/CSS/). Имеющиеся стили можете посмотреть
на специальной странице [*MediaWiki:Monobook.css*](MediaWiki_Monobook.css.md).
Редактировать её могут только админы вики, так что если у вас есть идеи по части
оформления текста, для реализации которых нужно править стили, ловите [**Bigote**](Участник_Bigote.md).

### <a id="Употребление_смайликов_в_тексте"></a>Употребление смайликов в тексте

Если вам нравятся смайлики, пользуйтесь на здоровье, но, как говорит один мой
знакомый, без остервенения ;) То есть, постарайтесь свести их употребление к
минимуму. Я долго размышлял, как быть со знаками препинания в конце
предложения, после которого вставляется смайлик, и мне кажется, что смайлик
вполне заменяет точку ;) После знака препинания он как-то не смотрится. В
середине предложения употреблять с осторожностью, лучше разделить предложение
на два более простых, как я только что продемонстрировал (_...заменяет точку,
**потому что** после знака препинания..._). Но вообще помните, что хорошая
шутка должна хорошо смотреться и без смайликов :-)))))

### <a id="Употребление_буквы_Ё"></a>Употребление буквы "Ё"

Несмотря на мнения многих весьма известных людей, что буква "ё" в наше время
должна использоваться лишь в случае смысловых неясностей (это рекомендует также
и сайт [gramota.ru](http://gramota.ru)), авторы подавляющего большинства статей
этой вики считают, что эта буква незаслуженно обижена, и стараются
реабилитировать её всеми доступными средствами, в том числе и с помощью этой
вики. Если Вы в силу привычки пишете "е" вместо "ё", ничего страшного — мы
потом всё поправим ;) Если же Вы непримиримый противник использования этой
буквы в общедоступных для чтения и редактирования текстах, большая просьба
сообщить об этом либо в Вашем профиле (Участник:Ваш\_ник), либо в странице
обсуждения написанной Вами статьи или в комментарии к ней (поле "краткое
описание изменений"). Мы люди мирные, и ссориться по этому поводу не собираемся
— в конце концов, информация превыше всего. Однако в этом случае просим и Вас
не исправлять уже написанные буквы "ё" на "е" в статьях, написанных другими.

Ребята, давайте жить дружно. © Кот Леопольд ;)

### <a id="Прочие_элементы_оформления"></a>Прочие элементы оформления

*  Вот такие вот "пули" очень удобно отбивают пункты списков.

1.  Нумерованные списки, тоже могут пригодиться (обратите внимание, они
    могут быть и вложенными, как сейчас).

Подробнее о них читайте в [статье о разметке Википедии](http://ru.wikipedia.org/wiki/Wiki-разметка).

Если нужно поставить ударение над гласной в русском слове, не используйте
"эрзац-ударения" — акцентированные западноевропейские гласные (повторюсь, речь
не идёт о "законных" случаях, когда употребляется иностранное слово). Для знака
ударения в Unicode существует [специальный символ U+0301](http://www.fileformat.info/info/unicode/char/0301/index.htm). В коде
HTML он записывается как **&\#769;** и ставится **после** "ударяемой" гласной:
**Тка&\#769;ббер → Тка́ббер**. Очень подробно о различных символах, которые
могут пригодиться при оформлении статей, [написано в Википедии](http://ru.wikipedia.org/wiki/Википедия:Специальные_символы).

Если вам требуется вставить "подпись", например, как автора патча, введите
в любом месте строки:

*  ~~~ (заменится на [[Участник:Пупкин|Пупкин]])
*  ~~~~ (заменится на [[Участник:Пупкин|Пупкин]] ЧЧ:ММ, число месяц год (MSD))

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

### <a id="Песочница"></a>Песочница

Порезвиться с разметкой можно в [**Песочнице**](Sandbox.md).

## <a id="Переводчикам"></a>Переводчикам

### <a id="OmegaT"></a>OmegaT

Крайне рекомендую при переводе пользоваться какой-нибудь системой
автоматизированного перевода типа
[OmegaT](http://www.omegat.org/ru/omegat.html). Я сам пользуюсь этой
программой, и могу сказать, что она очень облегчает работу переводчика (не
путать с печально известным Промтом!) Системы CAT (Computer-Assisted
Translation) не переводят текст автоматически, они лишь запоминают все
переведённые фразы и затем, при полном или частичном совпадении какой-либо
фразы оригинала предлагают запомненный перевод, который можно вставить и
отредактировать. По-быстрому освоить OmegaT можно за пару вечеров — на сайте, а
также в помощи к программе имеется быстрый старт. Да и вообще помощь довольно
неплохая. Чтобы не изобретать велосипед, то есть, не создавать всем и каждому
свою память перевода (это называется TM — Translation Memory), я буду
выкладывать здесь на вики свой архив с TM, который у меня потихоньку
накапливается в процессе перевода. В этом архиве, помимо файлов Омеги, имеется
ещё скрытый каталог .git, где хранятся старые версии TM (на случай <s>ядерной
войны</s> зависаний особо крупных статей). Вы можете воспользоваться неслабыми
возможностями [git](http://git.org) по бэкапу текстовых данных, если установите
его себе на компьютер. Теперь пара советов по использованию Омеги.

*  Я для перевода исходные файлы создаю в текстовом формате в кодировке utf-8,
   предлагаю так же поступать и вам. В качестве расширения я выбрал .utf8 (если
   не ошибаюсь, у Омеги уже есть настроенные фильтры для этого расширения, но
   на всякий случай я сейчас расскажу, как там чего настраивать).
*  Идите в меню Options → File filters..., выделите элемент Text Files и загляните
   сначала в Options. Там надо поставить (если не установлено) End Of Lines
   (могу соврать, у меня интерфейс испанский), тогда Омега будет делить текст
   на сегменты по предложениям, а не по пустым строчкам.
*  Нажав ОК, идите теперь в Edit. Там среди фильтров должен иметься один, отвечающий
   за utf-8. Если его нет, создайте новый по аналогии с имеющимися, только в
   качестве шаблона напишите \*.utf8, ну и обе кодировки поставьте такими же.
   Можно работать и с Unicode. Тогда создайте новый фильтр с нужным вам
   расширением, в качестве кодировки укажите utf-16, ну и не забывайте исходным
   файлам ставить это расширение.
*  Ещё одна тонкость. При загрузке файлов проекта в окошке можно увидеть кнопку
   "Import Files From MediaWiki". Это очень удобная кнопка, но, к сожалению, с
   русскими названиями страниц это не сработает. Вы вводите в поле для URL
   ссылку на страницу, жмёте ОК, но в список файлов ничего не добавляется, хотя
   в каталоге source появляется пустой файл с русским именем. Поэтому лучше
   всего самому создать в sources нужный файл (для гарантии с английским именем
   и расширением utf8, не забыли?), открыть его в редакторе, открыть в нашей
   вики нужную статью на редактирование, скопировать весь исходный текст со
   всем форматированием и вставить его в файл. Теперь, если обновить проект,
   нажав F5, у вас появится новый файл, и вы можете начать работу.
*  Не забывайте периодически сохраняться (Ctrl-S) и создавать финальные документы
   (Ctrl-D) — мало ли что... У меня один раз гаркнулось часа 4 работы (именно
   работы, и дедлайн поджимал), и с тех пор я умный :) Для того и поставил git
   и настроил автокоммит в нём с помощью cron каждые 15 минут ;)

Если будут дополнительные вопросы по Омеге, их лучше задать в конфе
\<xmpp:translate@conference.jabber.ru>.

Для вышеописанных целей создан [репозиторий](http://github.com/bigote/Tkabber-Wiki-Translation)
на [http://github.com](http://github.com), где и будет храниться весь перевод этой вики.

### <a id="Рекомендуемый_порядок_действий_при_переводе_на_новый_язык_с_нуля"></a>Рекомендуемый порядок действий при переводе на новый язык с нуля

1.  Если вашего языка нет в [**списке наличествующих**](../index.md), обращайтесь к
    самому главному админу вики [**LKnight'у**](Участник_Lknight.md) или, если
    он не вылавливается, к [**Bigote**](Участник_Bigote.md). Bigote новый субдомен
    сам сделать не может, но может попробовать выловить LKnight'а ;) Кроме
    того, нужно будет помочь администраторам проекта отредактировать
    навигационное меню новой вики, а также поставить ссылку на свою вики на
    [**Самой Главной Странице**](../index.md) и подправить и её навигационное меню.
1.  Субдомен создан. Зарегистрируйтесь на вновь созданной версии вики, а также на
    остальных версиях (потому что иначе вы не получите доступа к коду
    статей-источников, и кроме того, вам ведь придётся добавлять ссылки на ваши
    статьи во все иноязычные их версии).
1.  С какой статьи лучше всего начать перевод? Конечно же, с этой вот самой справки!
    Так вы и сами вникнете в стиль оформления статей, и другим авторам,
    говорящим на языке назначения, поможете.
1.  Набирайте в браузере http://код\_вашего\_языка.tkabber.jabe.ru, и вашему взору
    откроется заглавная страница новой версии вики (пустая, естественно). В
    левой части страницы, под логотипом, расположено навигационное меню. Жмите
    там на ссылку, ведущую на локальную страницу помощи. В отдельном окне или
    табе браузера откройте оригинальную статью Помощи, с которой вы делаете
    перевод, откройте обе на редактирование и скопируйте исходный код
    статьи-источника в пустое окно редактирования вашей статьи. Сохраните вашу
    статью и нажмите "Отменить" в статье-источнике. Затем снова откройте на
    редактирование вашу статью, и можете переводить.
1.  Не забудьте, что теперь надо обеспечить перекрёстность ссылок на другие
    языковые версии этой статьи. Для этого в каком-нибудь месте кода вашей
    статьи (лучше всего в самом начале) включите строчку такого вида:
    **[[en:Main Page]]**, где префикс "en" означает язык другой версии, а "Main
    Page" — это её название на этом языке. Двоеточие, идущее между префиксом и
    названием статьи, пробелами не отделяется, а пишется слитно и с префиксом,
    и с первым словом названия. Сохраняйте статью, и теперь вы увидите в нижней
    части навигационного меню новый раздел: ссылки на иноязычные версии данной
    статьи. Необходимо добавить столько ссылок, сколько имеется других версий
    статьи. Естественно, необходимо также отредактировать также все эти версии,
    внеся в них ссылку на новый перевод.
1.  Какие ещё статьи имеют приоритет? Следующей по важности является, конечно,
    **Заглавная страница** — та, что появляется, когда вы просто набираете в
    адресной строке "голый" адрес вики. За ней идёт статья **Ткаббер ЧаВо** —
    коллекция ответов на самые распространённые вопросы, которые могут помочь
    многим читателям новой версии вики. Затем мы рекомендуем перевести статьи,
    на которые есть ссылки из ЧаВо, и если есть дальнейшие отсылки — то и их
    тоже. Ну а дальше выбор за вами :) Не забудьте, что на вики есть
    специальная служебная статья [**Служебная/Все страницы**](Служебная/Все_страницы.md),
    где вы можете окинуть взором предстоящий фронт работ и быть в курсе, что
    ещё ждёт своей очереди на перевод.
1.  Пара советов по переводу таких понятий как [[Участник:bigote]], [[Служебная:Recentchanges]] и так далее.
 *  Вы уже отредактировали и сохранили страницу помощи, теперь идите на
    [*страницу последних правок*](Служебная_RecentChanges.md) (на вашем языке
    она будет называться чуть по-другому), и там вы увидите ссылку на только
    что созданную статью, а рядом будет красоваться ваш ник. Щёлкните по нему
    мышью, и в открывшейся на редактирование вашей персональной странице
    (которую, кстати, не помешает заполнить, сообщив хотя бы ваш JID для связи
    с вами) посмотрите на её название. Должно фигурировать что-то вроде
    "Редагування Користувач:Bigote" (это на украинском, но можно привести
    пример и на другом языке). То есть, если вам потребуется вставить ссылку на
    персональную страницу участника, зарегистрированного на вашей версии вики,
    используйте шаблон [[Користувач:bigote]]. Если же у этого участника нету
    персональной страницы на вашем языке, но есть, к примеру, русская или
    английская страничка, то можете дать интервики-ссылку на неё таким образом:
    [[:ru:Участник:bigote|Bigote]] — она будет выглядеть как локальная ссылка,
    но вести будет на персональную статью другой версии. Код языка,
    естественно, будет зависеть от того, на какую версию вики вы ссылаетесь.
 *  Таким же образом узнаются названия остальных специальных статей. (Можно
    просто навести на интересующую вас ссылку мышью, и тогда в статус-баре
    браузера вы увидите полную ссылку, из которой надо вычленить название
    статьи для вставки в ссылку в исходном коде статьи.)

### <a id="Перевод_на_родной_язык"></a>Перевод на родной язык

Когда вы переводите на родной язык, часто возникает проблема в использовании
специфических терминов, относящихся к миру IT. С одной стороны, в русском языке
уже давным-давно прижились транслитерации некоторых терминов, такие как "файл",
"биндинг", а также адаптированные иностранные слова: "винт", "аська". С другой
стороны, для некоторых вещей имеет смысл дать адекватный русский перевод,
например, "список контактов" вместо "ростер" (хотя в этом конкретном случае
можно поспорить). Какой вариант выбрать — решать вам, но в любом случае
пострайтесь не ударяться в крайности. Глупо переводить "binding" как "привязка"
— подавляющее большинство читателей вас попросту не поймёт. Но так же глупо
транслитерировать какой-то термин только потому, что он иностранный. Часто
вполне можно писать в статье по-русски, в самом начале дав исходный термин и
расшифровав его. На нашей вики есть специальный раздел —
[**Терминология**](Терминология.md), где вы можете проконсультироваться
относительно непонятных слов, а также дополнить его, если считаете нужным.

Ещё одна проблема перевода на русский язык (в общем случае, между языками
разных языковых групп) — кальки. Постарайтесь избегать дословных переводов.
Если какая-то фраза вам не очень понятна, дословный перевод её не спасёт, а
наоборот — искалечит. В большинстве случаев при затруднениях подобного рода
вполне можно добиться хорошего перевода, упростив смысл фразы или разбив
длинное предложение на два простых. В крайнем случае, оставьте рядом в скобках
исходную фразу — вики тем и хороша, что всё можно поправить и подредактировать
не один раз. Что-то не можете сделать вы — сделают другие. Кстати говоря, если
при чтении статьи, переведённой кем-нибудь другим, вы видите очевидную кальку,
которая режет слух, не поленитесь посмотреть это место в статье-исходнике и
поправьте перевод. Если вы не знаете языка-исходника, но какое-то место в
переводе вам всё же не нравится, не стесняйтесь воспользоваться Обсуждением
(ссылку можно найти в верхнем служебном меню, расположенном над каждой
статьёй).

### <a id="Перевод_на_чужой_язык"></a>Перевод на чужой язык

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

*  Не переводите каламбуры и шутливые фразы, которые мы тут иногда вкрапляем,
   если вы не уверены, что это прозвучит хорошо и адекватно на другом языке
   (попробуйте-ка перевести, скажем, на английский связку "Глоссарик —
   Словарий" ;)). Лучше просто передайте основную идею фразы (в нашем примере
   не заморачивайтесь и напишите Glossary). В конце концов, народ сюда приходит
   не за приколами, а в поисках информации. Вот и постарайтесь наиболее точно
   перевести **информационную** составляющую статьи. Но конечно же, если вы
   способны писать с юмором на другом языке (не обязательно переводить
   существующие шутки, можно придумывать свои), мы будем только "за" :)
*  Если есть возможность привлечь к вычитке готового перевода носителя языка,
   не упускайте её, даже если ваш знакомый слабо разбирается в Jabber и вообще
   далёк от компьютерной темы. В конце концов, код интернационален, но вот в
   обычном тексте можно наделать ошибок, не только грамматических, что может
   быть простительно, но и логических — а это хуже.
*  Вообще не пренебрегайте спелл-чекерами. Это справедливо даже в случае перевода
   на родной язык ;)
*  При переводе статей вики также следует помнить о правилах синтаксиса языка
   назначения. Например, во французском языке все знаки препинания, состоящие
   из двух элементов (двоеточие, точка с запятой, восклицательный и
   вопросительный знаки) отделяются от идущего перед ними слова пробелом.
   Вследствие этого отпадают вопросы по включению этих знаков в выделение
   жирным шрифтом.
*  Как следствие из предыдущего пункта, рекомендуем **не** придерживаться
   изложенных выше правил оформления, если они идут вразрез со стилистикой
   другого языка. Привести конкретный пример сложно, но если, допустим, вам
   кажется, что выделение курсивом смотрится на другом языке плохо (я вот
   понятия не имею, можно ли выделять курсивом японские иероглифы), придумайте
   другой способ акцентировать нужный фрагмент текста.

### <a id="Перевод_меню"></a>Перевод меню

В нашей вики редактировать меню можно лишь администраторам проекта. Свяжитесь
либо с [**Bigote**](Участник_Bigote.md), либо с [**Lknight**](Участник_Lknight.md).

### <a id="Локализация_Ткаббера"></a>Локализация Ткаббера

В установочном каталоге Ткаббера есть директорий под названием **msgs**, внутри
которого лежат файлы сообщений на разных языках. Если вы видите, что вашего
языка среди них нет, и вам хотелось бы Ткаббер локализовать, можете заняться
переводом самостоятельно. Также может иметь смысл обновить существующий
перевод, потому что процесс разработки не стоит на месте. В Ткаббере есть
встроенное средство, облегчающее жизнь переводчику, но лучше опишем весь
процесс по порядку. (Кстати, на официальном сайте появилась более подробная
[статья о локализации Ткаббера (на английском)](http://tkabber.jabber.ru/translate/how-to-start-new).

![(!)](../images/Hammer.png) **Сделать:** Перевести бы её на русский да здесь
выложить...)

#### <a id="Обновляем_существующие_сообщения"></a>Обновляем существующие сообщения

1.  Сначала надо установить самую последнюю версию Ткаббера с svn-репозитория.
 *  Установите, если у вас нет, клиент [subversion](http://subversion.tigris.org/);
 *  создайте рабочий каталог, например, **~/tkabber-svn**, и перейдите в него **cd tkabber-svn**;
 *  затем в терминале наберите

            svn co https://svn.xmpp.ru/repos/tkabber/trunk .

    (Сие означает: "получить содержимое [транка](Терминология.md#Транк_trunk) проекта Ткаббер в текущий каталог".)
 *  Если у вас выскочила ошибка "svn: SSL is not supported", наберите ту же команду,
    только вместо **https** напишите **http**.
 *  В результате описанных заклинаний у вас в рабочем каталоге появится два
    подкаталога: **tkabber** и **tkabber-plugins** — собственно программа и её плагины.

1.  Начинаем работу (в примере даётся итальянский язык, вам надо ставить свой).
 *
    cd tkabber

 *
    tclsh ./contrib/extract-translations/extract.tcl . msgs/it.msg >../it.msg

 *
    tclsh ./contrib/extract-translations/extract.tcl . -v msgs/it.msg >../it.msg.1

 *  Файл it.msg содержит непереведённые строки,
 *  файл it.msg.1 — лишние (которые были переведены ранее, но потом были исключены
    из оригинальной английской версии).

1.  Переводим.
 *  Редактор годится любой, лишь бы он корректно работал с UTF-8.
 *  Сначала ознакомьтесь с существующим текстом перевода **msgs/it.msg**,
    чтобы знать, как устроен файл, как выглядят строки сообщений.
 *  Вот пример такой строки:
  *  ::msgcat::mcset it "Select" "Seleziona"
  *  ::msgcat::mcset — по этому началу вы распознаете сообщение;
  *  it — язык;
  *  "Select" — английская версия сообщения;
  *  "Seleziona" — итальянский перевод.

 *  Что трогать не надо:
  *  %s — Ткаббер превращает этот дуэт символов в ник собеседника или название
     комнаты ("Send file to %s" "Invia il file a %s");
  *  \\n — символ перевода строки, \\t — табуляции ("\\n\\tClient: %s" "\\n\\tProgramma: %s");
  *  Если строка содержит знак $, удалите или закоменнтируйте её — последовательности
     вида `$foo` означают раскрытие переменной _в время выполнения программы_ и
     их перевод бессмыслен, так как реально переводятся те строки, которые эта
     переменная будет содержать, и они скорее всего содержатся где-то в других
     местах файла сообщений.

 *  В начале файла добавьте в комментарии ваше имя и контактную информацию на случай
    того, если кто-то найдёт в переводе ошибки и захочет вас о них известить.
 *  Завершив перевод, потестируйте его хотя бы на предмет того, запустится ли Ткаббер
    с этим файлом. Пропишите в конфиге строчку **::msgcat::mclocale it** и
    запустите Ткаббер. Если на старте выскочила ошибка, просмотрите её
    внимательно, и если она относится к файлу, который вы только что перевели,
    то скорее всего, вы чего-то там либо не дописали, либо написали лишнего,
    например, воткнули или стёрли символ кавычек. В сообщении об ошибке обычно
    говорится, в какой строке файла следует её искать.
 *  Если всё работает нормально, сообщите о проделанной работе авторам программы,
    лучше всего teo (`xmpp:sgolovan@nes.ru`) и вышлите ему готовый файл, чтобы
    проверил всё перед включением обновлённого перевода в транк. Вообще неплохо
    было бы прежде чем садиться за перевод, проконсультироваться с ним: вдруг
    уже кто-то этим языком занимается?

#### <a id="Создание_новой_версии"></a>Создание новой версии

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

#### <a id="Что_ещё_переводить"></a>Что ещё переводить?

1.  Кроме файла сообщений **ваш\_язык.msg** неплохо бы создать файл ресурсов
    BWidget — **ваш\_язык.rc**, если его ещё нет. Говоря простыми словами, в
    этом файле лежат названия кнопок и прочих элементов интерфейса Ткаббера. В
    каталоге **msgs** уже имеются русская и польская версии, которые могут
    служить в качестве образца для оформления.
1.  Разнообразные плагины тоже имеют свои сообщения. Скачайте с svn-репозитория
    свежие плагины: **svn co
    http://svn.xmpp.ru/repos/tkabber/trunk/tkabber-plugins tkabber-plugins** и
    посмотрите — в каждом плагине имеется свой каталог **msgs**. Вперёд и с
    песней! ;)
1.  В установочном директории Ткаббера есть каталог **trans**, где находятся
    сообщения, используемые новым плагином "Remote Control" ("Удалённое
    управление"). На данный момент является основной (и единственной) русская
    версия, но надеемся, что в ближайшем будущем файл будет переведён на
    английский и таким образом станет доступен для перевода на многие другие
    языки. Формат файла похожий, за исключением начала строки
    сообщения: ::trans::trset ru

>





|
<
<
<
<
<
<

|
<
<

|
<
<

|





|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
>


|
<
<
<
|
<
<
<
<
<
|
<
<


|
<
<
<
<



|
<
<
<
<
<
<
<
<
<
<
<
<
<

|



|
<
<
<

|


|
|
|
|
|


|



|

|
|
|

|
<



|
<
<
<
<
<
<
<

|
<


|
|
|
|
|


|
<
<
<
<



|
<
<
<
<
|
<



|

|
<
<
<
|
<
|
|
|
|
|



|
<
<
<
<
<
<
<
<
<
<
<
<

|
<



|
<
<
<
<



|
<
<
<
<
<
<
<
<



|
<
<
<
<
<
<
<
<
<
<
<
<

|



|

|
<

|

|
<
<
<
<
<
<

|
<

|
|

|
<
<
<
<
<



|





|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<

|
<
<
<
|
<
<
<
|
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
|
<
<
<

|
<

|
<



<
|
<
<
<
<
<
|
<
<
<
|
<
<
|
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
|
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<



|
<
<
<
<
<
<
<
<
<
<
<
<
<

|
<
<
<
<
<
<
<
<
<
<
<
<
<



|
<
<
<

|
<
<
<
<
<
<
<
<
|
<
<
<
<
|
<
|
<
<
<
<
<
|
<
<
<
<
<



|
<



|
<
<
<
<
<
<
<

<
<
<


|
|
|
|
<
|
<
|
|
<
|
<
|
|
|

|
|

|
|

|
|
|
<
|
|
|
|
<
|
|
|
|
|
|
|
|
|
<
|
|
<
<
<
<
|
|
<
|
<
<
<
<
<
<
|
<
<
<
<



|
<
<
<
<



|
<
<
<
<
|
<
<
<
<
|
|
|
<
<
<
<
1
2
3
4
5
6
7
8






9
10


11
12


13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43



44





45


46
47
48




49
50
51
52













53
54
55
56
57
58



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80

81
82
83
84







85
86

87
88
89
90
91
92
93
94
95
96




97
98
99
100




101

102
103
104
105
106
107



108

109
110
111
112
113
114
115
116
117












118
119

120
121
122
123




124
125
126
127








128
129
130
131












132
133
134
135
136
137
138
139

140
141
142
143






144
145

146
147
148
149
150





151
152
153
154
155
156
157
158
159
160

















161
162



163



164





165









166



167
168

169
170

171
172
173

174





175



176


177








178










179









180
181















182



183
184
185
186













187
188













189
190
191
192



193
194








195




196

197





198





199
200
201
202

203
204
205
206







207



208
209
210
211
212
213

214

215
216

217

218
219
220
221
222
223
224
225
226
227
228
229
230

231
232
233
234

235
236
237
238
239
240
241
242
243

244
245




246
247

248






249




250
251
252
253




254
255
256
257




258




259
260
261




[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Tkabber_Wiki:Справка/index.html)


# Tkabber Wiki:Справка

Материал из Tkabber Wiki

 Эта страница предназначена для тех, кто пожелал принять участие в проекте Tkabber Wiki в качестве автора статей или переводчика. Главное назначение нижеследующего — определить стиль оформления, принятый на вики, чтобы все статьи смотрелись более-менее одинаково, не слишком пестрели жирным и наклонным шрифтом и были ясными для понимания. (Просьба учесть, что в настоящий момент не всё на вики оформлено в соответствии с этими правилами, но исправления ведутся, и в конце концов всё будет приведено к единому стилю.) 







Если у вас есть какие-то предложения по оформлению, пожалуйста, свяжитесь либо с [Участник:bigote](Участник_Bigote.md), либо с [Участник:kostix](Участник_Kostix.md), либо с [Участник:lknight](Участник_Lknight.md). 



Для обсуждения работ на вики создана отдельная конференция `xmpp:tkabber-wiki@confernce.jabber.ru`. Вход на неё — по приглашению, то есть вам сначала надо выловить кого-нибудь из нас. 



Итак, приступим. 

## <a id="toc"></a>Содержание

* [1 Если вы не работали с вики раньше](#Если_вы_не_работали_с_вики_раньше)
* [2 Теперь об оформлении](#Теперь_об_оформлении)
 * [2.1 Для авторов новых статей](#Для_авторов_новых_статей)
  * [2.1.1 Применение отбоя пробелом](#Применение_отбоя_пробелом)
  * [2.1.2 Применение HTML](#Применение_HTML)
  * [2.1.3 Применение тэга **\<tt>**](#Применение_тэга_tt)
  * [2.1.4 Применение жирного шрифта](#Применение_жирного_шрифта)
  * [2.1.5 Применение наклонного шрифта](#Применение_наклонного_шрифта)
  * [2.1.6 Применение CSS](#Применение_CSS)
  * [2.1.7 Употребление смайликов в тексте](#Употребление_смайликов_в_тексте)
  * [2.1.8 Употребление буквы "Ё"](#Употребление_буквы_Ё)
  * [2.1.9 Прочие элементы оформления](#Прочие_элементы_оформления)
  * [2.1.10 Песочница](#Песочница)
 * [2.2 Переводчикам](#Переводчикам)
  * [2.2.1 OmegaT](#OmegaT)
  * [2.2.2 Рекомендуемый порядок действий при переводе на новый язык с нуля](#Рекомендуемый_порядок_действий_при_переводе_на_новый_язык_с_нуля)
  * [2.2.3 Перевод на родной язык](#Перевод_на_родной_язык)
  * [2.2.4 Перевод на чужой язык](#Перевод_на_чужой_язык)
  * [2.2.5 Перевод меню](#Перевод_меню)
  * [2.2.6 Локализация Ткаббера](#Локализация_Ткаббера)
   * [2.2.6 Обновляем существующие сообщения](#Обновляем_существующие_сообщения)
   * [2.2.6 Создание новой версии](#Создание_новой_версии)
   * [2.2.6 Что ещё переводить?](#Что_ещё_переводить)

# <a id="Если_вы_не_работали_с_вики_раньше"></a>Если вы не работали с вики раньше
*  Подробная и очень приличная [справка](http://ru.wikipedia.org/wiki/Википедия:Как_править_статьи) по разметке WikiPedia. На той странице есть ссылки на более конкретные темы: "изображения", "как начать новую статью" и прочее. В качестве теоретической базы — идеальное место. 



*  Для создания галерей, однако, удобнее воспользоваться [ссылкой на соответствующий раздел MediaWiki](http://www.mediawiki.org/w/index.php?title=Sites_using_MediaWiki/gallery&action=submit), которая сразу показывает правильный пример кода (на wikipedia.org почему-то о галереях сказано вскользь, и работающий код не продемонстрирован, а чтобы вычислить его самому, надо или долго пробовать, или быть семи пядей во лбу ;)) 





*  Смотрите также [документацию по настройке интерфейса](http://meta.wikipedia.org/wiki/MediaWiki_i18n) и [Мануал пользователя](http://meta.wikipedia.org/wiki/MediaWiki_User's_Guide) по использованию и настройке справочной системы. 



# <a id="Теперь_об_оформлении"></a>Теперь об оформлении
Во первых строках просим помнить, что структура вики может меняться (в том числе и вами), но делать это нужно очень осторожно, предварительно обсудив изменения с администраторами проекта (см. ссылки выше). Если у статьи, которую вы хотите передвинуть по вики, есть "двойники" на других языках, то же самое надо сделать и с ними. Потому мы и просим уведомлять о желаемых изменениях. 





## <a id="Для_авторов_новых_статей"></a>Для авторов новых статей

Перед тем как писать новую статью, посмотрите, нет ли уже другой статьи, более или менее полно раскрывающей эту тему. Если такая статья есть, возможно, вам стоит просто дополнить её. Если же это не так, то для начала определитесь, в какой раздел поместить ссылку на неё, и... поместите эту ссылку :) А затем можно уже приступать к написанию. Не пожалейте пяти минут и ознакомьтесь с правилами оформления статей. Может оказаться полезным и просмотр исходного кода (по команде "править" в верхнем меню) какой-нибудь существующей статьи, где есть элементы, которые вы собираетесь использовать в своей статье. И конечно, мы не хотим загонять всех в жёсткие рамки — в конце концов, содержание важнее формы. Оформление статьи — дело вкуса автора, но постарайтесь понять и читателей — ведь это им будет тяжело разбираться в каше из стилей, если автор об этом не позаботится. Не забывайте, что перед сохранением страницы её можно предварительно просмотреть (есть кнопка "Предварительный просмотр"). Да, и постарайтесь писать без ошибок ;) 














Теперь о стилях. 

### <a id="Применение_отбоя_пробелом"></a>Применение отбоя пробелом

Один из встроенных стилей разметки вики — отбой пробелом, то есть выделяемая строка начинается с пробела. В результате применения этого стиля выделенный текст помещается в красивую рамочку с розовым фоном. У нас этот стиль будет применяться для: 




*  выделения кусков кода: 

    namespace eval emoteicons {
      array set emoteicons {}
    
      variable lasttext ""
      variable lastX
      variable lastY
    }

*  выделения опций настроек, когда они встречаются в тексте статьи в первый раз: 

    ::jidlink::transport(allowed,dtcp-active)

*  выделения пути к файлам, когда этот путь: 

1.  довольно длинный, 
1.  вводится в тексте статьи впервые, 
1.  хочется обратить на него особое внимание. 

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


### <a id="Применение_HTML"></a>Применение HTML

Основные стили разметки уже встроены в вики, так что особой нужды в использовании тэгов HTML нет. Больше того: злоупотребление ими загрязняет исходный текст статей, затрудняет перевод и правку. Тем не менее, в некоторых случаях применение HTML вполне оправдано. Пример **—** это вот длинное тире (&mdash;), которое и должно по идее использоваться вместо популярного нынче дефиса **-**. Ещё один пример — стрелки → и ← (&rarr; и &larr;), угловые скобки \< и > (&lt; и &gt;), значок акцента **&\#769;**, ставящийся следом за буквой, над которой хотим поставить ударение. 








Если вам нужно оформить пропуск куска кода в примере, используйте спец-символ &middot; — "·" Например: 


    proc a b {
      puts ouch!
      
      · · · · · 
      
      puts text
    }

При использовании ссылок знаки препинания, "касающиеся" последнего слова в ссылке, из неё исключаются. Пример: _В случае сомнений не забывайте о предварительном просмотре и о **'''[[Sandbox|Песочнице]].'''** → В случае сомнений не забывайте о предварительном просмотре и о **[Песочнице](Sandbox.md).**_ 





### <a id="Применение_тэга_tt"></a>Применение тэга **\<tt>**

*  JID авторов патчей, статей и просто хороших людей, а также конференций и прочих ресурсов выделяются с помощью тэга **\<tt>**: `xmpp:loginname@jabberserver.org`, `xmpp:conferencename@conference.jabberserver.org`, `rss@jabberserver.org`. Если непосредственно после JID или ресурса идёт знак препинания, ставить его следует **после** закрывающего тэга **\</tt>**. 




*  Выделение опций настроек (например, `::jidlink::transport(allowed,dtcp-active)`), когда они встречаются в тексте статьи во второй и более раз. 


### <a id="Применение_жирного_шрифта"></a>Применение жирного шрифта

В этой вики жирный шрифт используется для: 

*  выделения путей до файлов, о которых идёт речь (например, **~/.tkabber/avatar.gif**), когда не стоит нарушать текучесть предложения. При этом постарайтесь построить предложение так, чтобы к этому пути не примешивалась естественная пунктуация. Если же это невозможно, выключайте знаки препинания из выделения. 



*  обозначения пути к какому-либо пункту Настроек Ткаббера или для ориентации в его меню (например, **Настройки → File Transfer → Jidlink** или **Службы → Расширения → Шпионить за присутствием**); 

*  выделения ссылок на статьи данной вики (например, "О плагинах читайте **[эту статью](Плагины.md).**"); 
*  чтобы обратить внимание на какое-либо **важное слово;** 
 *  обратите внимание, что в случае с выделенным "просто текстом", в отличие от кода или путей, знаки препинания включаются в выделение. 
 
*  вопросы в **[ЧаВо](Ткаббер_ЧаВо.md)** — выделяются целиком, вместе со словом "Вопрос". 

### <a id="Применение_наклонного_шрифта"></a>Применение наклонного шрифта

Наклонный шрифт в нашей вики применяется для выделения довольно длинных кусков текста в общем повествовании (одно предложение или часть сложносочинённого или сложноподчинённого предложения как минимум), то есть в случаях, когда жирный шрифт слишком обращает на себя внимание. В этом случае знаки пунктуации, завершающие выделенный текст, включаются в выделение. _Если вам понадобилось акцентировать какое-либо слово в наклонном тексте, допустимо воспользоваться для этого жирным шрифтом. При этом знаки пунктуации, вплотную прилегающие к жирному слову, из выделения жирным **включаются,** если это обычное слово, и исключается, если это кусок кода или путь до файла: **~/.tkabber/config.tcl**._ (Понимаю, что на словах это выглядит запутанно — просмотрите код этой страницы, и вы всё поймёте. Или же просто присмотритесь к финальной точке предыдущего предложения — она обычная :)) Постарайтесь не злоупотреблять смешением стилей или близким соседством жирного и наклонного текста. 













Если вам требуется выделить курсивом целый абзац или несколько предложений, лучше воспользоваться тэгом \<cite>. 


### <a id="Применение_CSS"></a>Применение CSS

На вики имеется возможность использовать в коде статей [стили CSS](http://www.w3.org/Style/CSS/). Имеющиеся стили можете посмотреть на специальной странице [MediaWiki:Monobook.css](MediaWiki_Monobook.css.md). Редактировать её могут только админы вики, так что если у вас есть идеи по части оформления текста, для реализации которых нужно править стили, ловите [Bigote](Участник_Bigote.md). 





### <a id="Употребление_смайликов_в_тексте"></a>Употребление смайликов в тексте

Если вам нравятся смайлики, пользуйтесь на здоровье, но, как говорит один мой знакомый, без остервенения ;) То есть, постарайтесь свести их употребление к минимуму. Я долго размышлял, как быть со знаками препинания в конце предложения, после которого вставляется смайлик, и мне кажется, что смайлик вполне заменяет точку ;) После знака препинания он как-то не смотрится. В середине предложения употреблять с осторожностью, лучше разделить предложение на два более простых, как я только что продемонстрировал (_...заменяет точку, **потому что** после знака препинания..._). Но вообще помните, что хорошая шутка должна хорошо смотреться и без смайликов :-))))) 









### <a id="Употребление_буквы_Ё"></a>Употребление буквы "Ё"

Несмотря на мнения многих весьма известных людей, что буква "ё" в наше время должна использоваться лишь в случае смысловых неясностей (это рекомендует также и сайт [gramota.ru](http://gramota.ru)), авторы подавляющего большинства статей этой вики считают, что эта буква незаслуженно обижена, и стараются реабилитировать её всеми доступными средствами, в том числе и с помощью этой вики. Если Вы в силу привычки пишете "е" вместо "ё", ничего страшного — мы потом всё поправим ;) Если же Вы непримиримый противник использования этой буквы в общедоступных для чтения и редактирования текстах, большая просьба сообщить об этом либо в Вашем профиле (Участник:Ваш\_ник), либо в странице обсуждения написанной Вами статьи или в комментарии к ней (поле "краткое описание изменений"). Мы люди мирные, и ссориться по этому поводу не собираемся — в конце концов, информация превыше всего. Однако в этом случае просим и Вас не исправлять уже написанные буквы "ё" на "е" в статьях, написанных другими. 













Ребята, давайте жить дружно. © Кот Леопольд ;) 

### <a id="Прочие_элементы_оформления"></a>Прочие элементы оформления

*  Вот такие вот "пули" очень удобно отбивают пункты списков. 

1.  Нумерованные списки, тоже могут пригодиться (обратите внимание, они могут быть и вложенными, как сейчас). 


Подробнее о них читайте в [статье о разметке Википедии](http://ru.wikipedia.org/wiki/Wiki-разметка). 

Если нужно поставить ударение над гласной в русском слове, не используйте "эрзац-ударения" — акцентированные западноевропейские гласные (повторюсь, речь не идёт о "законных" случаях, когда употребляется иностранное слово). Для знака ударения в Unicode существует [специальный символ U+0301](http://www.fileformat.info/info/unicode/char/0301/index.htm). В коде HTML он записывается как **&\#769;** и ставится **после** "ударяемой" гласной: **Тка&\#769;ббер → Тка́ббер**. Очень подробно о различных символах, которые могут пригодиться при оформлении статей, [написано в Википедии](http://ru.wikipedia.org/wiki/Википедия:Специальные_символы). 







Если вам требуется вставить "подпись", например, как автора патча, введите в любом месте строки: 


*  ~~~ (заменится на [[Участник:Пупкин|Пупкин]]) 
*  ~~~~ (заменится на [[Участник:Пупкин|Пупкин]] ЧЧ:ММ, число месяц год (MSD)) 

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






### <a id="Песочница"></a>Песочница

Порезвиться с разметкой можно в **[Песочнице](Sandbox.md).** 

## <a id="Переводчикам"></a>Переводчикам

### <a id="OmegaT"></a>OmegaT

Крайне рекомендую при переводе пользоваться какой-нибудь системой автоматизированного перевода типа [OmegaT](http://www.omegat.org/ru/omegat.html). Я сам пользуюсь этой программой, и могу сказать, что она очень облегчает работу переводчика (не путать с печально известным Промтом!) Системы CAT (Computer-Assisted Translation) не переводят текст автоматически, они лишь запоминают все переведённые фразы и затем, при полном или частичном совпадении какой-либо фразы оригинала предлагают запомненный перевод, который можно вставить и отредактировать. По-быстрому освоить OmegaT можно за пару вечеров — на сайте, а также в помощи к программе имеется быстрый старт. Да и вообще помощь довольно неплохая. Чтобы не изобретать велосипед, то есть, не создавать всем и каждому свою память перевода (это называется TM — Translation Memory), я буду выкладывать здесь на вики свой архив с TM, который у меня потихоньку накапливается в процессе перевода. В этом архиве, помимо файлов Омеги, имеется ещё скрытый каталог .git, где хранятся старые версии TM (на случай <s>ядерной войны</s> зависаний особо крупных статей). Вы можете воспользоваться неслабыми возможностями [git](http://git.org) по бэкапу текстовых данных, если установите его себе на компьютер. Теперь пара советов по использованию Омеги. 


















*  Я для перевода исходные файлы создаю в текстовом формате в кодировке utf-8, предлагаю так же поступать и вам. В качестве расширения я выбрал .utf8 (если не ошибаюсь, у Омеги уже есть настроенные фильтры для этого расширения, но на всякий случай я сейчас расскажу, как там чего настраивать). 



*  Идите в меню Options → File filters..., выделите элемент Text Files и загляните сначала в Options. Там надо поставить (если не установлено) End Of Lines (могу соврать, у меня интерфейс испанский), тогда Омега будет делить текст на сегменты по предложениям, а не по пустым строчкам. 



*  Нажав ОК, идите теперь в Edit. Там среди фильтров должен иметься один, отвечающий за utf-8. Если его нет, создайте новый по аналогии с имеющимися, только в качестве шаблона напишите \*.utf8, ну и обе кодировки поставьте такими же. Можно работать и с Unicode. Тогда создайте новый фильтр с нужным вам расширением, в качестве кодировки укажите utf-16, ну и не забывайте исходным файлам ставить это расширение. 





*  Ещё одна тонкость. При загрузке файлов проекта в окошке можно увидеть кнопку "Import Files From MediaWiki". Это очень удобная кнопка, но, к сожалению, с русскими названиями страниц это не сработает. Вы вводите в поле для URL ссылку на страницу, жмёте ОК, но в список файлов ничего не добавляется, хотя в каталоге source появляется пустой файл с русским именем. Поэтому лучше всего самому создать в sources нужный файл (для гарантии с английским именем и расширением utf8, не забыли?), открыть его в редакторе, открыть в нашей вики нужную статью на редактирование, скопировать весь исходный текст со всем форматированием и вставить его в файл. Теперь, если обновить проект, нажав F5, у вас появится новый файл, и вы можете начать работу. 









*  Не забывайте периодически сохраняться (Ctrl-S) и создавать финальные документы (Ctrl-D) — мало ли что... У меня один раз гаркнулось часа 4 работы (именно работы, и дедлайн поджимал), и с тех пор я умный :) Для того и поставил git и настроил автокоммит в нём с помощью cron каждые 15 минут ;) 




Если будут дополнительные вопросы по Омеге, их лучше задать в конфе \<xmpp:translate@conference.jabber.ru>. 


Для вышеописанных целей создан [репозиторий](http://github.com/bigote/Tkabber-Wiki-Translation) на [http://github.com](http://github.com), где и будет храниться весь перевод этой вики. 


### <a id="Рекомендуемый_порядок_действий_при_переводе_на_новый_язык_с_нуля"></a>Рекомендуемый порядок действий при переводе на новый язык с нуля


1.  Если вашего языка нет в [списке наличествующих](http://tkabber.jabe.ru), обращайтесь к самому главному админу вики [LKnight'у](Участник_Lknight.md) или, если он не вылавливается, к [Bigote](Участник_Bigote.md). Bigote новый субдомен сам сделать не может, но может попробовать выловить LKnight'а ;) Кроме того, нужно будет помочь администраторам проекта отредактировать навигационное меню новой вики, а также поставить ссылку на свою вики на Самой Главной Странице [http://tkabber.jabe.ru](http://tkabber.jabe.ru) и подправить и её навигационное меню. 





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



1.  С какой статьи лучше всего начать перевод? Конечно же, с этой вот самой справки! Так вы и сами вникнете в стиль оформления статей, и другим авторам, говорящим на языке назначения, поможете. 


1.  Набирайте в браузере http://код\_вашего\_языка.tkabber.jabe.ru, и вашему взору откроется заглавная страница новой версии вики (пустая, естественно). В левой части страницы, под логотипом, расположено навигационное меню. Жмите там на ссылку, ведущую на локальную страницу помощи. В отдельном окне или табе браузера откройте оригинальную статью Помощи, с которой вы делаете перевод, откройте обе на редактирование и скопируйте исходный код статьи-источника в пустое окно редактирования вашей статьи. Сохраните вашу статью и нажмите "Отменить" в статье-источнике. Затем снова откройте на редактирование вашу статью, и можете переводить. 








1.  Не забудьте, что теперь надо обеспечить перекрёстность ссылок на другие языковые версии этой статьи. Для этого в каком-нибудь месте кода вашей статьи (лучше всего в самом начале) включите строчку такого вида: **[[en:Main Page]]**, где префикс "en" означает язык другой версии, а "Main Page" — это её название на этом языке. Двоеточие, идущее между префиксом и названием статьи, пробелами не отделяется, а пишется слитно и с префиксом, и с первым словом названия. Сохраняйте статью, и теперь вы увидите в нижней части навигационного меню новый раздел: ссылки на иноязычные версии данной статьи. Необходимо добавить столько ссылок, сколько имеется других версий статьи. Естественно, необходимо также отредактировать также все эти версии, внеся в них ссылку на новый перевод. 










1.  Какие ещё статьи имеют приоритет? Следующей по важности является, конечно, **Заглавная страница** — та, что появляется, когда вы просто набираете в адресной строке "голый" адрес вики. За ней идёт статья **Ткаббер ЧаВо** — коллекция ответов на самые распространённые вопросы, которые могут помочь многим читателям новой версии вики. Затем мы рекомендуем перевести статьи, на которые есть ссылки из ЧаВо, и если есть дальнейшие отсылки — то и их тоже. Ну а дальше выбор за вами :) Не забудьте, что на вики есть специальная служебная статья [Служебная:Allpages](Служебная_AllPages.md), где вы можете окинуть взором предстоящий фронт работ и быть в курсе, что ещё ждёт своей очереди на перевод. 









1.  Пара советов по переводу таких понятий как [[Участник:bigote]], [[Служебная:Recentchanges]] и так далее. 
 *  Вы уже отредактировали и сохранили страницу помощи, теперь идите на [страницу последних правок](Служебная_RecentChanges.md) (на вашем языке она будет называться чуть по-другому), и там вы увидите ссылку на только что созданную статью, а рядом будет красоваться ваш ник. Щёлкните по нему мышью, и в открывшейся на редактирование вашей персональной странице (которую, кстати, не помешает заполнить, сообщив хотя бы ваш JID для связи с вами) посмотрите на её название. Должно фигурировать что-то вроде "Редагування Користувач:Bigote" (это на украинском, но можно привести пример и на другом языке). То есть, если вам потребуется вставить ссылку на персональную страницу участника, зарегистрированного на вашей версии вики, используйте шаблон [[Користувач:bigote]]. Если же у этого участника нету персональной страницы на вашем языке, но есть, к примеру, русская или английская страничка, то можете дать интервики-ссылку на неё таким образом: [[:ru:Участник:bigote|Bigote]] — она будет выглядеть как локальная ссылка, но вести будет на персональную статью другой версии. Код языка, естественно, будет зависеть от того, на какую версию вики вы ссылаетесь. 















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




### <a id="Перевод_на_родной_язык"></a>Перевод на родной язык

Когда вы переводите на родной язык, часто возникает проблема в использовании специфических терминов, относящихся к миру IT. С одной стороны, в русском языке уже давным-давно прижились транслитерации некоторых терминов, такие как "файл", "биндинг", а также адаптированные иностранные слова: "винт", "аська". С другой стороны, для некоторых вещей имеет смысл дать адекватный русский перевод, например, "список контактов" вместо "ростер" (хотя в этом конкретном случае можно поспорить). Какой вариант выбрать — решать вам, но в любом случае пострайтесь не ударяться в крайности. Глупо переводить "binding" как "привязка" — подавляющее большинство читателей вас попросту не поймёт. Но так же глупо транслитерировать какой-то термин только потому, что он иностранный. Часто вполне можно писать в статье по-русски, в самом начале дав исходный термин и расшифровав его. На нашей вики есть специальный раздел — **[Терминология](Терминология.md),** где вы можете проконсультироваться относительно непонятных слов, а также дополнить его, если считаете нужным. 














Ещё одна проблема перевода на русский язык (в общем случае, между языками разных языковых групп) — кальки. Постарайтесь избегать дословных переводов. Если какая-то фраза вам не очень понятна, дословный перевод её не спасёт, а наоборот — искалечит. В большинстве случаев при затруднениях подобного рода вполне можно добиться хорошего перевода, упростив смысл фразы или разбив длинное предложение на два простых. В крайнем случае, оставьте рядом в скобках исходную фразу — вики тем и хороша, что всё можно поправить и подредактировать не один раз. Что-то не можете сделать вы — сделают другие. Кстати говоря, если при чтении статьи, переведённой кем-нибудь другим, вы видите очевидную кальку, которая режет слух, не поленитесь посмотреть это место в статье-исходнике и поправьте перевод. Если вы не знаете языка-исходника, но какое-то место в переводе вам всё же не нравится, не стесняйтесь воспользоваться Обсуждением (ссылку можно найти в верхнем служебном меню, расположенном над каждой статьёй). 














### <a id="Перевод_на_чужой_язык"></a>Перевод на чужой язык

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




*  Не переводите каламбуры и шутливые фразы, которые мы тут иногда вкрапляем, если вы не уверены, что это прозвучит хорошо и адекватно на другом языке (попробуйте-ка перевести, скажем, на английский связку "Глоссарик — Словарий" ;)). Лучше просто передайте основную идею фразы (в нашем примере не заморачивайтесь и напишите Glossary). В конце концов, народ сюда приходит не за приколами, а в поисках информации. Вот и постарайтесь наиболее точно перевести **информационную** составляющую статьи. Но конечно же, если вы способны писать с юмором на другом языке (не обязательно переводить существующие шутки, можно придумывать свои), мы будем только "за" :) 








*  Если есть возможность привлечь к вычитке готового перевода носителя языка, не упускайте её, даже если ваш знакомый слабо разбирается в Jabber и вообще далёк от компьютерной темы. В конце концов, код интернационален, но вот в обычном тексте можно наделать ошибок, не только грамматических, что может быть простительно, но и логических — а это хуже. 




*  Вообще не пренебрегайте спелл-чекерами. Это справедливо даже в случае перевода на родной язык ;) 

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





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






### <a id="Перевод_меню"></a>Перевод меню

В нашей вики редактировать меню можно лишь администраторам проекта. Свяжитесь либо с [Участник:Bigote](Участник_Bigote.md), либо с [Участник:Lknight](Участник_Lknight.md). 


### <a id="Локализация_Ткаббера"></a>Локализация Ткаббера

В установочном каталоге Ткаббера есть директорий под названием **msgs**, внутри которого лежат файлы сообщений на разных языках. Если вы видите, что вашего языка среди них нет, и вам хотелось бы Ткаббер локализовать, можете заняться переводом самостоятельно. Также может иметь смысл обновить существующий перевод, потому что процесс разработки не стоит на месте. В Ткаббере есть встроенное средство, облегчающее жизнь переводчику, но лучше опишем весь процесс по порядку. (Кстати, на официальном сайте появилась более подробная [статья о локализации Ткаббера (на английском)](http://tkabber.jabber.ru/translate/how-to-start-new). ![(!)](../images/Hammer.png) **Сделать:** Перевести бы её на русский да здесь выложить...) 











#### <a id="Обновляем_существующие_сообщения"></a>Обновляем существующие сообщения

1.  Сначала надо установить самую последнюю версию Ткаббера с svn-репозитория. 
 *  Установите, если у вас нет, клиент [subversion](http://subversion.tigris.org/); 
 *  создайте рабочий каталог, например, **~/tkabber-svn**, и перейдите в него **cd tkabber-svn**; 
 *  затем в терминале наберите 

    svn co https://svn.xmpp.ru/repos/tkabber/trunk .

 (Сие означает: "получить содержимое [транка](Терминология.md#транк) проекта Ткаббер в текущий каталог".) 
 *  Если у вас выскочила ошибка "svn: SSL is not supported", наберите ту же команду, только вместо **https** напишите **http**. 

 *  В результате описанных заклинаний у вас в рабочем каталоге появится два подкаталога: **tkabber** и **tkabber-plugins** — собственно программа и её плагины. 

 
1.  Начинаем работу (в примере даётся итальянский язык, вам надо ставить свой). 
 *  
    cd tkabber
 
 *  
    tclsh ./contrib/extract-translations/extract.tcl . msgs/it.msg >../it.msg
 
 *  
    tclsh ./contrib/extract-translations/extract.tcl . -v msgs/it.msg >../it.msg.1
 
 *  Файл it.msg содержит непереведённые строки, 
 *  файл it.msg.1 — лишние (которые были переведены ранее, но потом были исключены из оригинальной английской версии). 

 
1.  Переводим. 
 *  Редактор годится любой, лишь бы он корректно работал с UTF-8. 
 *  Сначала ознакомьтесь с существующим текстом перевода **msgs/it.msg**, чтобы знать, как устроен файл, как выглядят строки сообщений. 

 *  Вот пример такой строки: 
  *  ::msgcat::mcset it "Select" "Seleziona" 
  *  ::msgcat::mcset — по этому началу вы распознаете сообщение; 
  *  it — язык; 
  *  "Select" — английская версия сообщения; 
  *  "Seleziona" — итальянский перевод. 
 
 *  Что трогать не надо: 
  *  %s — Ткаббер превращает этот дуэт символов в ник собеседника или название комнаты ("Send file to %s" "Invia il file a %s"); 

  *  \\n — символ перевода строки, \\t — табуляции ("\\n\\tClient: %s" "\\n\\tProgramma: %s"); 
  *  Если строка содержит знак $, удалите или закоменнтируйте её — последовательности вида `$foo` означают раскрытие переменной _в время выполнения программы_ и их перевод бессмыслен, так как реально переводятся те строки, которые эта переменная будет содержать, и они скорее всего содержатся где-то в других местах файла сообщений. 




 
 *  В начале файла добавьте в комментарии ваше имя и контактную информацию на случай того, если кто-то найдёт в переводе ошибки и захочет вас о них известить. 

 *  Завершив перевод, потестируйте его хотя бы на предмет того, запустится ли Ткаббер с этим файлом. Пропишите в конфиге строчку **::msgcat::mclocale it** и запустите Ткаббер. Если на старте выскочила ошибка, просмотрите её внимательно, и если она относится к файлу, который вы только что перевели, то скорее всего, вы чего-то там либо не дописали, либо написали лишнего, например, воткнули или стёрли символ кавычек. В сообщении об ошибке обычно говорится, в какой строке файла следует её искать. 






 *  Если всё работает нормально, сообщите о проделанной работе авторам программы, лучше всего teo (`xmpp:sgolovan@nes.ru`) и вышлите ему готовый файл, чтобы проверил всё перед включением обновлённого перевода в транк. Вообще неплохо было бы прежде чем садиться за перевод, проконсультироваться с ним: вдруг уже кто-то этим языком занимается? 





#### <a id="Создание_новой_версии"></a>Создание новой версии

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





#### <a id="Что_ещё_переводить"></a>Что ещё переводить?

1.  Кроме файла сообщений **ваш\_язык.msg** неплохо бы создать файл ресурсов BWidget — **ваш\_язык.rc**, если его ещё нет. Говоря простыми словами, в этом файле лежат названия кнопок и прочих элементов интерфейса Ткаббера. В каталоге **msgs** уже имеются русская и польская версии, которые могут служить в качестве образца для оформления. 




1.  Разнообразные плагины тоже имеют свои сообщения. Скачайте с svn-репозитория свежие плагины: **svn co http://svn.xmpp.ru/repos/tkabber/trunk/tkabber-plugins tkabber-plugins** и посмотрите — в каждом плагине имеется свой каталог **msgs**. Вперёд и с песней! ;) 




1.  В установочном директории Ткаббера есть каталог **trans**, где находятся сообщения, используемые новым плагином "Remote Control" ("Удалённое управление"). На данный момент является основной (и единственной) русская версия, но надеемся, что в ближайшем будущем файл будет переведён на английский и таким образом станет доступен для перевода на многие другие языки. Формат файла похожий, за исключением начала строки сообщения: ::trans::trset ru 






Changes to wiki/ru/Tkabber_Windows_Mini_HOWTO.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

42
43
44

45
46
47
48
49

50
51
52

53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298

[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Tkabber_Windows_Mini_HOWTO/index.html)


# Tkabber Windows Mini HOWTO

Материал из Tkabber Wiki.

## <a id="toc"></a>Содержание

* [1 Предисловие с объяснением](#Предисловие_с_объяснением)
* [2 Авторы](#Авторы)
* [3 Введение](#Введение)
* [4 Что нам нужно](#Что_нам_нужно)
* [5 Установка](#Установка)
   * [5.1 ActiveState Tcl](#ActiveState_Tcl)
   * [5.2 Winico](#Winico)
   * [5.3 TLS](#TLS)
   * [5.4 WinIdle](#WinIdle)
   * [5.5 Ispell](#Ispell)
   * [5.6 Tkabber](#Tkabber)
* [6 Настройка](#Настройка)
   * [6.1 Конфигурационный файл config.tcl](#Конфигурационный_файл_config.tcl)
   * [6.2 Плагины](#Плагины)
   * [6.3 Шрифты](#Шрифты)
* [7 Благодарности](#Благодарности)

## <a id="Предисловие_с_объяснением"></a>Предисловие с объяснением

Это — _временная_ копия статьи "Tkabber Windows Mini HOWTO" с сайта Сергея
Голованя. Этот сайт не работает, так что информация на время помещена в этом
вики.

[**Kostix**](Участник_Kostix.md) 15:24, 19 октября 2006 (MSD) Сайт давно
доступен, но статью оставим.

Оригинал документа доступен [здесь](http://sgolovan.nes.ru/jabber/Tkabber-Windows-Mini-Howto.html).

## <a id="Авторы"></a>Авторы

© Александр Куприн (aka ru\_classic), 31 января 2003 г.

##### e-mail

`ru_classic at mail ru`

##### JID

`ru_classic at jabber ru`

© Сергей Головань (aka teo), 29 ноября 2005 г. (обновления)

##### e-mail

 `sgolovan at nes ru`

##### JID

 `sgolovan at nes ru`

## <a id="Введение"></a>Введение

_90% всего — это вода. Закон Старджона._

(в стиле разговоров, ведущихся в `talks@conference.jabber.ru`)

_`ru_classic` смотрит на эпиграф и полностью с ним согласен. Поэтому не будем
лить воду красноречия на мельницу вашего внимания, а перейдём к делу. Хочу
сразу заметить, что этот документ не претендует на полноту изложения — его
целью было описать шаги, позволяющие настроить Tkabber в среде Windows, а не
пересказывать оригинальное руководство по настройке Tkabber._

## <a id="Что_нам_нужно"></a>Что нам нужно

Для того, чтобы Tkabber заработал в Windows, вам понадобятся следующие пакеты:

*  [Tkabber](http://tkabber.jabber.ru/) — без комментариев.
*  [ActiveState Tcl](http://www.activestate.com/Products/ActiveTcl) — собственно «тикль» под Windows.
*  [Winico](http://sourceforge.net/projects/tktable/) — пакет позволяющий работать с системным треем.
*  **TLS** — поддержка SSL.
*  [TclWinIdle](http://sgolovan.nes.ru/jabber/tclWinidle/) — поддержка auto-away.
*  [Ispell](ftp://ftp.kiarchive.ru/pub/.3/djgpp/v2gnu/isp3206b.zip) — программа проверки
   орфографии и совмещенный
   [русский/английский](ftp://ftp.vsu.ru/mirrors/scon155.phys.msu.su/pub/russian/ispell/ruseng/ruseng.tar.gz)
   словарь к ней.

**Примечание** (написанное по просьбе автора Tkabber): Вообще-то, для того
чтобы Tkabber заработал, достаточно только двух пакетов — Active State Tcl и
Tkabber, но остальные пакеты «рекомендованы» к использованию. Посудите сами,
неужели вам захочется, чтобы ваш трафик мог читать любой, кто в состоянии
запустить сетевой сниффер. А это не так уж и трудно. Поэтому вам просто
необходим TLS. Всегда удобно прятать в трее работающую программу, чтобы она не
захламляла рабочий стол. Вот и Winico пригодился. Ну, а WinIdle — это мелочь,
которая приятна. :) Вы надолго отошли от компьютера, а ваш собеседник уверен,
что вы слышите его и продолжает общаться с вами. А вас на самом деле нет. Вот и
пригодился пакет WinIdle — он будет отслеживать простой системы и автоматически
выставлять статус клиента (away или ext-away). Ну, и если вы с орфографией на
«вы», то вам совсем не помешает костыль в виде Ispell.

## <a id="Установка"></a>Установка

### <a id="ActiveState_Tcl"></a>ActiveState Tcl

На момент написания обновлений к статье рекомендуется устанавливать последнюю
стабильную версию ActiveTcl (из ветки 8.4).

Установка не вызывает особых проблем. Оставляйте настройки по-умолчанию. За
исключением одной — укажите, что Tcl устанавливается для всех пользователей
компьютера. Обратите внимание, что имена каталогов содержат в качестве
разделителей обратный слеш «/». Так, как это принято в среде \*nix. Пусть вас
это не смущает. И последнее — после установки не забудьте добавить в переменную
среды `PATH` путь к **C:\\Tcl\\bin** или к тому каталогу, в который вы установили
«тикль» (здесь и далее я буду ссылаться на каталог **C:\\Tcl**).

Если при пробном пуске Tkabber вы видите ошибку, аналогичную “`Error in startup
script: can't find package sha1`”, значит, ваш свежий ActiveState ActiveTcl
(например, 8.5.x) не содержит предустановленных пакетов, необходимых для
запуска Tkabber. Взамен он содержит инсталлятор пакетов, с помощью которого
можно восполнить недостачу: **teacup.exe**.

Запустите

    C:\Tcl\bin\teacup.exe install tcllib

затем

    C:\Tcl\bin\teacup.exe install udp

После того, как Teacup скачает с
[http://teapot.activestate.com](http://teapot.activestate.com) и установит
изрядное количество пакетов, проблема будет устранена.

### <a id="Winico"></a>Winico

Если вы устанавливаете Tkabber версии 0.9.8 или более раннюю, то устанавливайте
Winico версии 0.5. Для версии Tkabber'а из CVS лучше установить Winico 0.6.

Для установки Winico просто распакуйте загруженный архив в каталог
**c:\\tcl\\lib**. Запустите демонстрационный скрипт demo.tcl, чтобы убедиться в
работоспособности пакета Winico (скрипт включен только в Winico 0.6).

### <a id="TLS"></a>TLS

Пакет TLS используется для создания шифрованного соединения с сервером.

Этого пакета не было в составе дистрибутивов Tcl/Tk от
[ActiveState](http://www.activestate.com/) вплоть до версии 8.4.15.

Поэтому, если у вас Tcl/Tk \<= 8.4.14, скачайте **tls**
[отсюда](http://sourceforge.net/projects/tls/) и распакуйте содержимое этого
архива в каталог с модулями Tcl (обычно это **C:\\Tcl\\lib**); больше ничего делать
не нужно.

Вошедший же в состав 8.4.15 пакет **tls** содержит ошибку в загрузчике этого
пакета, в результате чего на большинстве систем этот пакет загрузить
невозможно. Существует два решения этой проблемы:

*  Либо скопируйте файлы **libeay32.dll** и **ssleay32.dll** из каталога с пакетом
   **tls** (в стандартно установленном дистрибутиве 8.4.15 это
   **C:\\Tcl\\lib\\tls1.5.1**) в **C:\\WINDOWS\\system32** (или любой другой каталог,
   содержащийся в списке каталогов переменной окружения **PATH**);
*  Либо замените содержимое файла **pkgIndex.tcl** в каталоге пакета
   **tls** (см. выше) на такое:

    package ifneeded tls 1.5.1 "namespace eval tls {
        variable cd \[pwd\]
      };
      cd [list $dir];
      [list load [file join $dir tls151.dll]];
      [list source [file join $dir tls.tcl]];
      namespace eval tls {
        cd \[set cd\]
        unset cd
      }"

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

После этого модуль **tls** будет успешно загружаться.

### <a id="WinIdle"></a>WinIdle

Для того чтобы включить в Tkabber возможность функции auto-away, вам необходимо
установить пакет **TclWinIdle**. Распакуйте его в подкаталог **c:\\tcl\\lib**.
В архиве есть тестовый скрипт **test.tcl**. Запустите его, чтобы проверить
работает пакет WinIdle или нет.

### <a id="Ispell"></a>Ispell

Программа проверки орфографии (на сленге — спеллер). Вещь удобная и незаменимая
в тех случаях, если вы не в ладах с правописанием.

Итак. Я расположил Ispell на диске **C:**. Поэтому все пути, которые тут будут
указаны, даны в привязке к моей машине. Куда вы установите Ispell — дело ваше.

Создайте подкаталог c:\\ispell. Скопируйте в него содержимое архива
**isp3206b.zip** (для поиска файла можете воспользоваться ссылкой, которая дана
выше или, что будет правильней, поискать файл с таким именем через поисковую
машину FileSearch). Кроме этого настройте следующие переменные окружения:

    ISPELL_DICTDIR=c:\ispell\lib
    ISPELL_HOME=c:\ispell

А к переменной **PATH** добавьте путь **c:\\ispell\\bin**. Перегрузите
компьютер, чтобы изменения вступили в силу.

Теперь распакуйте файл **ruseng.tar.gz** во временный каталог и выполните команды

    buildhash ruseng.dict ruseng.aff c:\ispell\lib\ruseng.hash
    del c:\ispell\lib\ruseng.cnt
    del c:\ispell\lib\ruseng.stat
    copy ruseng.aff c:\ispell\lib\ruseng.aff

В результате этого в подкаталоге **c:\\ispell\\lib** появится два файла —
**ruseng.hash** и **ruseng.aff**.

Всё. Ispell готов к «употреблению». Что вам ещё осталось сделать, так это
(после того как установите Tkabber) скопировать скрипт **ispell.tcl** из
каталога **tkabber/plugins/unix** в **~/.tkabber/plugins/ispell** (подробнее
про каталог **~/.tkabber** см. ниже) и настроить плагин, указав словарь ruseng
и кодировку словаря koi8-r.

### <a id="Tkabber"></a>Tkabber

А вот и «виновник» происходящего. :) Скачать последнюю версию Tkabber вы можете
отсюда. Распакуйте архив там, где вам удобно (я расположил Tkabber в
**D:\\Tkabber**) и создайте на рабочем столе ярлык для файла **tkabber.tcl**.
**tkabber.tcl** — это основной скрипт пакета. Он занимает настройкой
переменных, загрузкой дополнительных модулей и «прочая, прочая». :)

Теперь перейдём к настройке.

## <a id="Настройка"></a>Настройка

### <a id="Конфигурационный_файл_config.tcl"></a>Конфигурационный файл config.tcl

Конфигурационный файл Tkabber (config.tcl) располагается в подкаталоге **~/.tkabber**.

Если вы не работали в среде \*nix, то такое имя каталога для вас немного
необычно. Для тех, кто не в курсе — символ тильды в имени файла (каталога) «~»
обозначает домашний каталог пользователя.

Точка «.» в начале имени файла или каталога указывает, что каталог «скрытый»
(используется в \*nix).

В случае с ОС Windows ситуация следующая — если вы работаете с Windows'95/98/2K
(и возможно ME — не могу однозначно сказать — не проверял), то каталог
**.tkabber** должен располагаться в корневом каталоге того логического диска,
на котором установлена Windows. В моём случае это диск **D:**
(**D:\\.tkabber\\**).

Если вы работатете в среде Windows NT, то подкаталог **.tkabber** будет
располагаться в **$WINDIR\\Profiles\\имя\_пользователя** (где **$WINDIR** —
переменная среды окружения, содержащая путь к установленной системе).

Для WIndows XP — это **$SYSTEMDRIVE\\Documents and
Settings\\имя\_пользователя** (**$SYSTEMDRIVE** — диск, на котором установлена
Windows).

Надеюсь, не слишком запутано?

### <a id="Плагины"></a>Плагины

Интересные возможности предоставляют плагины для Tkabber. Где их взять?
Последние версии доступны на CVS. Версии, выпущенные с релизами Tkabber'а,
находятся на JabberStudio в разделе «Download». Из всего набора наибольший
интерес представляют несколько модулей:

*  chess — игра в шахматы по Сети с пользователем Tkabber'а (наведите курсор
   мыши на пользователя и нажмите правую кнопку — выберите пункт меню «Шахматы»
   — надеюсь, вы понимаете, что у вашего оппонента тоже должен стоять Tkabber и
   настроен соответствующий плагин)
*  checkers — игра в шашки.
*  reversi — игра в реверси.
*  cyrillize — удобная возможность перевода русского текста, случайно
   набранного в латинице, в нормальную форму (горячая клавиша — Ctrl+'). Очень
   полезный плагин!
*  socials — использование в чатах стандартного набора «социальных» фраз —
   типа /dance, /scream и т.д. (смотрите файл socials.ru)
*  whiteboard — доска для рисования в конференциях; инструментарий рисования
   небольшой, но идея интересна и перспективна.

Для использования плагинов создайте в **~/.tkabber** подкаталог plugins и
скопируйте каталоги с плагинами туда.

### <a id="Шрифты"></a>Шрифты

Ну, и чтобы Tkabber выглядел совсем как конфетка, советую поменять шрифты,
используемые в нём. Для это вам достаточно добавить две строки в
конфигурационный файл **~/.tkabber/config.tcl** (впишите их в самое начало
конфигурационного файла, не помещайте внутрь какой-либо процедуры):

    set font "-monotype-tahoma-medium-r-normal-*-11-*-*-*-*-*-iso10646-1"
    option add *font "-monotype-tahoma-medium-r-normal-*-11-*-*-*-*-*-iso10646-1" userDefault

Число 11 — это размер шрифта. Если вы не поклонник шрифта Tahoma, укажите любой
другой установленный в системе.

Всё. Вот теперь можно запускать Tkabber.

## <a id="Благодарности"></a>Благодарности

Спасибо ermine, aleksey и thunder за то, что нашли время и силы выслушать и
ответить на глупые вопросы. :)


>












|
|
|
|
|
|

|
|
|




|
<
<

|
<

|



|

|
>
|

|
>
|

|

|
>
|

|
>
|



|

|

|
<
<
<
<



|

|
|
|
|
|
|
<
<
<

|
<
<
<
<
<
<
<
<
<
<
<





|
<

|
<
<
<
<
<
<

|
<
<
<
<

|



|



<
<
|



|
<

|
<
<



|

|
<

|
<
<
<

|
<
<

<
|
<
<
|
<












|
<

|



|
<
<
<



|
<

|
<

|
<
<
<




|
<

|






|
<

|
<
<
<
<



|
<
<
<
<

|





|

|
<
<

|
<

|
<
<
<
<

|
<
<

<
|
<

|



|
<
<
<

|
<
<
<
|
|
|
<
<
|
<
|
<

|
<



|
<
<
<




|
<

|



|
|
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29


30
31

32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63




64
65
66
67
68
69
70
71
72
73
74



75
76











77
78
79
80
81
82

83
84






85
86




87
88
89
90
91
92
93
94
95


96
97
98
99
100

101
102


103
104
105
106
107
108

109
110



111
112


113

114


115

116
117
118
119
120
121
122
123
124
125
126
127
128

129
130
131
132
133
134



135
136
137
138

139
140

141
142



143
144
145
146
147

148
149
150
151
152
153
154
155
156

157
158




159
160
161
162




163
164
165
166
167
168
169
170
171
172


173
174

175
176




177
178


179

180

181
182
183
184
185
186



187
188



189
190
191


192

193

194
195

196
197
198
199



200
201
202
203
204

205
206
207
208
209
210
211
212
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Tkabber_Windows_Mini_HOWTO/index.html)


# Tkabber Windows Mini HOWTO

Материал из Tkabber Wiki.

## <a id="toc"></a>Содержание

* [1 Предисловие с объяснением](#Предисловие_с_объяснением)
* [2 Авторы](#Авторы)
* [3 Введение](#Введение)
* [4 Что нам нужно](#Что_нам_нужно)
* [5 Установка](#Установка)
 * [5.1 ActiveState Tcl](#ActiveState_Tcl)
 * [5.2 Winico](#Winico)
 * [5.3 TLS](#TLS)
 * [5.4 WinIdle](#WinIdle)
 * [5.5 Ispell](#Ispell)
 * [5.6 Tkabber](#Tkabber)
* [6 Настройка](#Настройка)
 * [6.1 Конфигурационный файл config.tcl](#Конфигурационный_файл_config.tcl)
 * [6.2 Плагины](#Плагины)
 * [6.3 Шрифты](#Шрифты)
* [7 Благодарности](#Благодарности)

## <a id="Предисловие_с_объяснением"></a>Предисловие с объяснением

Это — _временная_ копия статьи "Tkabber Windows Mini HOWTO" с сайта Сергея Голованя. Этот сайт не работает, так что информация на время помещена в этом вики. 



[Kostix](Участник_Kostix.md) 15:24, 19 октября 2006 (MSD) Сайт давно доступен, но статью оставим. 


Оригинал документа доступен [здесь](http://sgolovan.nes.ru/jabber/Tkabber-Windows-Mini-Howto.html). 

## <a id="Авторы"></a>Авторы

© Александр Куприн (aka ru\_classic), 31 января 2003 г. 

 e-mail 

 `ru_classic at mail ru` 

 JID 

 `ru_classic at jabber ru` 

© Сергей Головань (aka teo), 29 ноября 2005 г. (обновления) 

 e-mail 

 `sgolovan at nes ru` 

 JID 

 `sgolovan at nes ru` 

## <a id="Введение"></a>Введение

_90% всего — это вода. Закон Старджона._ 

(в стиле разговоров, ведущихся в `talks@conference.jabber.ru`) 

_ `ru_classic` смотрит на эпиграф и полностью с ним согласен. Поэтому не будем лить воду красноречия на мельницу вашего внимания, а перейдём к делу. Хочу сразу заметить, что этот документ не претендует на полноту изложения — его целью было описать шаги, позволяющие настроить Tkabber в среде Windows, а не пересказывать оригинальное руководство по настройке Tkabber. _ 





## <a id="Что_нам_нужно"></a>Что нам нужно

Для того, чтобы Tkabber заработал в Windows, вам понадобятся следующие пакеты: 

*  [Tkabber](http://tkabber.jabber.ru/) — без комментариев. 
*  [ActiveState Tcl](http://www.activestate.com/Products/ActiveTcl) — собственно «тикль» под Windows. 
*  [Winico](http://sourceforge.net/projects/tktable/) — пакет позволяющий работать с системным треем. 
*  **TLS** — поддержка SSL. 
*  [TclWinIdle](http://sgolovan.nes.ru/jabber/tclWinidle/) — поддержка auto-away. 
*  [Ispell](ftp://ftp.kiarchive.ru/pub/.3/djgpp/v2gnu/isp3206b.zip) — программа проверки орфографии и совмещенный [русский/английский](ftp://ftp.vsu.ru/mirrors/scon155.phys.msu.su/pub/russian/ispell/ruseng/ruseng.tar.gz) словарь к ней. 




**Примечание** (написанное по просьбе автора Tkabber): Вообще-то, для того чтобы Tkabber заработал, достаточно только двух пакетов — Active State Tcl и Tkabber, но остальные пакеты «рекомендованы» к использованию. Посудите сами, неужели вам захочется, чтобы ваш трафик мог читать любой, кто в состоянии запустить сетевой сниффер. А это не так уж и трудно. Поэтому вам просто необходим TLS. Всегда удобно прятать в трее работающую программу, чтобы она не захламляла рабочий стол. Вот и Winico пригодился. Ну, а WinIdle — это мелочь, которая приятна. :) Вы надолго отошли от компьютера, а ваш собеседник уверен, что вы слышите его и продолжает общаться с вами. А вас на самом деле нет. Вот и пригодился пакет WinIdle — он будет отслеживать простой системы и автоматически выставлять статус клиента (away или ext-away). Ну, и если вы с орфографией на «вы», то вам совсем не помешает костыль в виде Ispell. 












## <a id="Установка"></a>Установка

### <a id="ActiveState_Tcl"></a>ActiveState Tcl

На момент написания обновлений к статье рекомендуется устанавливать последнюю стабильную версию ActiveTcl (из ветки 8.4). 


Установка не вызывает особых проблем. Оставляйте настройки по-умолчанию. За исключением одной — укажите, что Tcl устанавливается для всех пользователей компьютера. Обратите внимание, что имена каталогов содержат в качестве разделителей обратный слеш «/». Так, как это принято в среде \*nix. Пусть вас это не смущает. И последнее — после установки не забудьте добавить в переменную среды `PATH` путь к C:\\Tcl\\bin или к тому каталогу, в который вы установили «тикль» (здесь и далее я буду ссылаться на каталог C:\\Tcl). 







Если при пробном пуске Tkabber вы видите ошибку, аналогичную “`Error in startup script: can't find package sha1`”, значит, ваш свежий ActiveState ActiveTcl (например, 8.5.x) не содержит предустановленных пакетов, необходимых для запуска Tkabber. Взамен он содержит инсталлятор пакетов, с помощью которого можно восполнить недостачу: teacup.exe. 





Запустите 

    C:\Tcl\bin\teacup.exe install tcllib

затем 

    C:\Tcl\bin\teacup.exe install udp



После того, как Teacup скачает с [http://teapot.activestate.com](http://teapot.activestate.com) и установит изрядное количество пакетов, проблема будет устранена. 

### <a id="Winico"></a>Winico

Если вы устанавливаете Tkabber версии 0.9.8 или более раннюю, то устанавливайте Winico версии 0.5. Для версии Tkabber'а из CVS лучше установить Winico 0.6. 


Для установки Winico просто распакуйте загруженный архив в каталог **c:\\tcl\\lib**. Запустите демонстрационный скрипт demo.tcl, чтобы убедиться в работоспособности пакета Winico (скрипт включен только в Winico 0.6). 



### <a id="TLS"></a>TLS

Пакет TLS используется для создания шифрованного соединения с сервером. 

Этого пакета не было в составе дистрибутивов Tcl/Tk от [ActiveState](http://www.activestate.com/) вплоть до версии 8.4.15. 


Поэтому, если у вас Tcl/Tk \<= 8.4.14, скачайте **tls** [отсюда](http://sourceforge.net/projects/tls/) и распакуйте содержимое этого архива в каталог с модулями Tcl (обычно это C:\\Tcl\\lib); больше ничего делать не нужно. 




Вошедший же в состав 8.4.15 пакет **tls** содержит ошибку в загрузчике этого пакета, в результате чего на большинстве систем этот пакет загрузить невозможно. Существует два решения этой проблемы: 




*  Либо скопируйте файлы libeay32.dll и ssleay32.dll из каталога с пакетом **tls** (в стандартно установленном дистрибутиве 8.4.15 это C:\\Tcl\\lib\\tls1.5.1) в C:\\WINDOWS\\system32 (или любой другой каталог, содержащийся в списке каталогов переменной окружения **PATH**); 


*  Либо замените содержимое файла pkgIndex.tcl в каталоге пакета **tls** (см. выше) на такое: 


    package ifneeded tls 1.5.1 "namespace eval tls {
        variable cd \[pwd\]
      };
      cd [list $dir];
      [list load [file join $dir tls151.dll]];
      [list source [file join $dir tls.tcl]];
      namespace eval tls {
        cd \[set cd\]
        unset cd
      }"

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


После этого модуль **tls** будет успешно загружаться. 

### <a id="WinIdle"></a>WinIdle

Для того чтобы включить в Tkabber возможность функции auto-away, вам необходимо установить пакет **TclWinIdle**. Распакуйте его в подкаталог **c:\\tcl\\lib**. В архиве есть тестовый скрипт **test.tcl**. Запустите его, чтобы проверить работает пакет WinIdle или нет. 




### <a id="Ispell"></a>Ispell

Программа проверки орфографии (на сленге — спеллер). Вещь удобная и незаменимая в тех случаях, если вы не в ладах с правописанием. 


Итак. Я расположил Ispell на диске **C:**. Поэтому все пути, которые тут будут указаны, даны в привязке к моей машине. Куда вы установите Ispell — дело ваше. 


Создайте подкаталог c:\\ispell. Скопируйте в него содержимое архива **isp3206b.zip** (для поиска файла можете воспользоваться ссылкой, которая дана выше или, что будет правильней, поискать файл с таким именем через поисковую машину FileSearch). Кроме этого настройте следующие переменные окружения: 




    ISPELL_DICTDIR=c:\ispell\lib
    ISPELL_HOME=c:\ispell

А к переменной **PATH** добавьте путь **c:\\ispell\\bin**. Перегрузите компьютер, чтобы изменения вступили в силу. 


Теперь распакуйте файл **ruseng.tar.gz** во временный каталог и выполните команды 

    buildhash ruseng.dict ruseng.aff c:\ispell\lib\ruseng.hash
    del c:\ispell\lib\ruseng.cnt
    del c:\ispell\lib\ruseng.stat
    copy ruseng.aff c:\ispell\lib\ruseng.aff

В результате этого в подкаталоге **c:\\ispell\\lib** появится два файла — **ruseng.hash** и **ruseng.aff**. 


Всё. Ispell готов к «употреблению». Что вам ещё осталось сделать, так это (после того как установите Tkabber) скопировать скрипт **ispell.tcl** из каталога **tkabber/plugins/unix** в **~/.tkabber/plugins/ispell** (подробнее про каталог **~/.tkabber** см. ниже) и настроить плагин, указав словарь ruseng и кодировку словаря koi8-r. 





### <a id="Tkabber"></a>Tkabber

А вот и «виновник» происходящего. :) Скачать последнюю версию Tkabber вы можете отсюда. Распакуйте архив там, где вам удобно (я расположил Tkabber в **D:\\Tkabber**) и создайте на рабочем столе ярлык для файла **tkabber.tcl**. **tkabber.tcl** — это основной скрипт пакета. Он занимает настройкой переменных, загрузкой дополнительных модулей и «прочая, прочая». :) 





Теперь перейдём к настройке. 

## <a id="Настройка"></a>Настройка

### <a id="Конфигурационный_файл_config.tcl"></a>Конфигурационный файл config.tcl

Конфигурационный файл Tkabber (config.tcl) располагается в подкаталоге **~/.tkabber**. 

Если вы не работали в среде \*nix, то такое имя каталога для вас немного необычно. Для тех, кто не в курсе — символ тильды в имени файла (каталога) «~» обозначает домашний каталог пользователя. 



Точка «.» в начале имени файла или каталога указывает, что каталог «скрытый» (используется в \*nix). 


В случае с ОС Windows ситуация следующая — если вы работаете с Windows'95/98/2K (и возможно ME — не могу однозначно сказать — не проверял), то каталог **.tkabber** должен располагаться в корневом каталоге того логического диска, на котором установлена Windows. В моём случае это диск **D:** (**D:\\.tkabber\\**). 





Если вы работатете в среде Windows NT, то подкаталог **.tkabber** будет располагаться в **$WINDIR\\Profiles\\имя\_пользователя** (где **$WINDIR** — переменная среды окружения, содержащая путь к установленной системе). 




Для WIndows XP — это **$SYSTEMDRIVE\\Documents and Settings\\имя\_пользователя** (**$SYSTEMDRIVE** — диск, на котором установлена Windows). 


Надеюсь, не слишком запутано? 

### <a id="Плагины"></a>Плагины

Интересные возможности предоставляют плагины для Tkabber. Где их взять? Последние версии доступны на CVS. Версии, выпущенные с релизами Tkabber'а, находятся на JabberStudio в разделе «Download». Из всего набора наибольший интерес представляют несколько модулей: 




*  chess — игра в шахматы по Сети с пользователем Tkabber'а (наведите курсор мыши на пользователя и нажмите правую кнопку — выберите пункт меню «Шахматы» — надеюсь, вы понимаете, что у вашего оппонента тоже должен стоять Tkabber и настроен соответствующий плагин) 



*  checkers — игра в шашки. 
*  reversi — игра в реверси. 
*  cyrillize — удобная возможность перевода русского текста, случайно набранного в латинице, в нормальную форму (горячая клавиша — Ctrl+'). Очень полезный плагин! 


*  socials — использование в чатах стандартного набора «социальных» фраз — типа /dance, /scream и т.д. (смотрите файл socials.ru) 

*  whiteboard — доска для рисования в конференциях; инструментарий рисования небольшой, но идея интересна и перспективна. 


Для использования плагинов создайте в **~/.tkabber** подкаталог plugins и скопируйте каталоги с плагинами туда. 


### <a id="Шрифты"></a>Шрифты

Ну, и чтобы Tkabber выглядел совсем как конфетка, советую поменять шрифты, используемые в нём. Для это вам достаточно добавить две строки в конфигурационный файл **~/.tkabber/config.tcl** (впишите их в самое начало конфигурационного файла, не помещайте внутрь какой-либо процедуры): 




    set font "-monotype-tahoma-medium-r-normal-*-11-*-*-*-*-*-iso10646-1"
    option add *font "-monotype-tahoma-medium-r-normal-*-11-*-*-*-*-*-iso10646-1" userDefault

Число 11 — это размер шрифта. Если вы не поклонник шрифта Tahoma, укажите любой другой установленный в системе. 


Всё. Вот теперь можно запускать Tkabber. 

## <a id="Благодарности"></a>Благодарности

Спасибо ermine, aleksey и thunder за то, что нашли время и силы выслушать и ответить на глупые вопросы. :) 


Changes to wiki/ru/Tkabber_starpack.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108

109
110
111
112
113

114

115

116

117

118

119

120

121
122
123

124

125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161


[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Tkabber_starpack/index.html)


# Tkabber starpack

Материал из Tkabber Wiki

Статья посвящена сборке дистрибутива Tkabber Starpack для операционной системы MS Windows.

## <a id="toc"></a>Содержание

* [1 Как это работает](#Как_это_работает)
* [2 Инструмент «Сделай-Tkabber-Starpack-сам»](#Инструмент_«Сделай-Tkabber-Starpack-сам»)
* [3 Убираем "лишнее" в Ткаббере](#Убираем_лишнее_в_Ткаббере)
   * [3.1 Библиотеки Tcl/Tk, необходимые для нормальной работы Ткаббера](#Библиотеки_Tcl_Tk_необходимые_для_нормальной_работы_Ткаббера)
   * [3.2 Опциональные библиотеки Tcl/Tk](#Опциональные_библиотеки_Tcl_Tk)
   * [3.3 Компоненты Ткаббера](#Компоненты_Ткаббера)
* [4 Как скачать последнюю SVN-версию Ткаббера](#Как_скачать_последнюю_SVN-версию_Ткаббера)

## <a id="Как_это_работает"></a>Как это работает

По сути, Tkabber Starpack представляет собой
[cамораспаковывающийся архив](http://ru.wikipedia.org/wiki/Самораспаковывающийся_архив). Но в отличие
от последнего, Старпак распаковывается в оперативную память компьютера и
имитирует структуру файлов и каталогов Ткаббера на диске.

Для уменьшения размеров файл Старпака
[сжимается](http://ru.wikipedia.org/wiki/Упаковка_исполняемых_файлов)
упаковщиком [UPX](http://ru.wikipedia.org/wiki/UPX). Именно поэтому запуск
Старпака происходит с некоторой, довольно ощутимой на многих системах,
задержкой.

После запуска Старпака происходит следующее:

1. распаковывается сам Старпак (восстанавливается [исполняемый файл](http://ru.wikipedia.org/wiki/Исполнимый_модуль)
   Старпака из архива, полученного с помощью упаковщика [UPX](http://ru.wikipedia.org/wiki/UPX));
1. в оперативной памяти создаётся структура каталогов и файлов Ткаббера (точнее
   сказать, имитируется таким образом, чтобы интерпретатор
   [Tcl/Tk](http://tcl.tk), "поверил" в то, что он имеет дело со структурой
   каталогов и файлов на диске);
1. собственно Ткаббер и запускается (происходит передача управления интерпретатору
   Тикля, последнему передаётся в качестве параметра файл tkabber.tcl. с
   запуска оного и начинается запуск ткаббера).

## <a id="Инструмент_«Сделай-Tkabber-Starpack-сам»"></a>Инструмент «Сделай-Tkabber-Starpack-сам»

Инструмент позволит в несколько кликов мыши собрать собственный Starpack.

Для этого вам понадобится:

1.  Сам инструмент. Можно взять [*здесь*](../files/Tkabber_win32_starpack_template.rar) (2.59 Мб);
1.  Ткаббер. Версия должна быть не ниже 0.9.9-SVN-20070317 (ревизия 1051 от 17 Марта 2007).

Для особо ленивых [**ниже**](#Как_скачать_последнюю_SVN-версию_Ткаббера) описано, как скачать и использовать версию SVN.

Собираем Starpack:

1.  Распаковываем инструмент и получаем каталог **tkabber\_win32\_starpack\_template**;
1.  Копируем файлы Ткаббера в каталог **tkabber\_win32\_starpack\_template\\tkabber\_win32\_starpack.vfs\\tkabber**;
1.  Запускаем `build.cmd` из каталога **tkabber\_win32\_starpack\_template**.

Всё! Tkabber Starpack готов.

**Ваша** свеженькая сборка находится в каталоге **tkabber\_win32\_starpack\_template\\tkabber\_starpack**.

Вы можете использовать `tkabber_win32_starpack.exe` сам по себе или запускать
его через `mobile_tkabber.cmd`. В последнем случае вы получаете мобильную
версию Ткаббера, который использует каталог **tkabberhome**, находящийся рядом
с ним, в качестве каталога с настройками.

Ткаббер поставляется с базовым набором плагинов. Если вас интересуют игры,
измеритель траффика, доска для рисования и т.д. — вы можете скачать эти плагины
отдельно и поместить в **tkabberhome\\plugins**.

## <a id="Убираем_лишнее_в_Ткаббере"></a>Убираем "лишнее" в Ткаббере

Когда я был маленьким, то очень любил разбирать механические часы. В те редкие
случаи, когда я их собирал обратно, у меня оставалось много "лишних" деталей.
Часы, естественно, после этого переставали работать. В этом разделе попробуем
разобраться, какие компоненты Ткаббера и библиотеки Tcl/Tk необязательны для
работы нашего Starpack.

### <a id="Библиотеки_Tcl_Tk_необходимые_для_нормальной_работы_Ткаббера"></a>Библиотеки Tcl/Tk, необходимые для нормальной работы Ткаббера

*  base64
*  BWidget
*  dns
*  itcl
*  log
*  md5
*  sha1
*  tcl8.4
*  textutil
*  tk8.4
*  uri
*  vfs

Примечание: если Ткаббер не запустился, попробуйте установить более новые бибиотеки.

### <a id="Опциональные_библиотеки_Tcl_Tk"></a>Опциональные библиотеки Tcl/Tk

*  **TclWinIdle**  — поддержка auto-away. Если вы трудоголик, от компьютера
   вас относят в бессознательном состоянии, то эта функция вам точно не нужна.
   Примечание: если старпак собирался на tcl/tk 8.4, то для работы autoaway
   необходим tclWinidle-0.2.
*  **Winico** — пакет добавляет в Ткаббер возможность работать с областью
   системных уведомлений ("systray", "трей"). Позволяет
   сворачивать/разворачивать программу в systray.
*  **tls** — поддержка SSL.

*  **sasl** — поддержка SASL авторизации.

### <a id="Компоненты_Ткаббера"></a>Компоненты Ткаббера

*  **authors** — мы их уважаем, а потому оставим этот файл.

*  **ChangeLog** — прочитали, удалили...

*  **copying** — лицензия  — это святое!

*  **install** — файл-заглушка. Удаляем.

*  **Makefile** — уже собрали :) Удаляем.

*  **readme** — не думаю, что этот файл пригодится нам в запакованном виде. Удаляем.

*  **DOC** — документация. Так же как и readme — бесполезна в starpack. Удаляем.

*  **EMOTICONS** — смайлики. Можете свободно удалять, добавлять свои...

*  **EXAMPLES** — здесь собраны примеры конфигурационных файлов, цветовых
   схем, утилит... Если вам не нужна конфигурация от Teo или Badlop, то смело можете удалять.
*  **MSGS** — переводы сообщений Ткаббера на разные языки. Можете оставить только нужные вам.

*  **PIXMAPS** — наборы иконок ростера. Удаляйте, добавляйте на ваше усмотрение.

*  **SOUNDS** — звуки без пакета [snack](http://www.speech.kth.se/snack/) всё
   равно не воспроизводятся. Но можно [**дополнительно подключить**](Проблемы_со_звуком.md)
   **snack.kit**. Тогда пригодятся.
*  **TRANS** — аналогично MSGS.
*  **tkabber-plugins** — встроенные плагины-игры для ткаббера, их можно
   удалить; в случае необходимости — легко подключаются через конфиг.

## <a id="Как_скачать_последнюю_SVN-версию_Ткаббера"></a>Как скачать последнюю SVN-версию Ткаббера

Прежде всего нам понадобится программа-клиент для доступа к репозиториям
[системы контроля версий](http://ru.wikipedia.org/wiki/Система_управления_версиями)
[Subversion](http://subversion.tigris.org/). Версия для Windows находится
[здесь](http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91&expandFolder=91&folderID=74).

После установки svn создаём в удобном для вас месте каталог **tkabber**, делаем его текущим в консоли и пишем сначала:

    svn co http://svn.xmpp.ru/repos/tkabber/trunk/tkabber tkabber-svn

а затем

    svn co http://svn.xmpp.ru/repos/tkabber/trunk/tkabber-plugins tkabber-plugins-svn

В каталоге **tkabber-svn** находится сам Ткаббер, а в **tkabber-plugins-svn** —
дополнительные плагины к нему.

Если вы собираете Starpack из версии svn, то не забудьте после выполнения
пункта 2 сборки удалить из каталога **tkabber** служебную информацию svn. Проще
это сделать через поиск системы MS Windows. В качестве имени файла вводим
".svn", в поле "Поиск в:" выбираем каталог с Ткаббером, в дополнительных
настройках отмечаем пункт "Поиск в скрытых файлах и папках". Все найденные
файлы удаляем.

**Важно!** Если вы хотите собирать старпак из SVN-версии, вам следует помнить о
её _нестабильности и теоретическом наличии неприятных багов,_ поэтому
почитайте-ка для общего развития [**эту статью**](SVN_disclaimer.md).

[**Archimed**](Участник_Archimed.md)



>





|






|
|
|




<
|
<
<

|
<
<
<
<

|

|
<
|
<
<
<
|
<
<



|

|

|
|

|

|

|
|
|

|

|

|
<
<
<

|
<
<



|
<
<
<
<



|
|
|
|
|
|
|
|
|
|
|
|

|



|
|
<
<
|
|
<
|
>
|



|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
|
|
>
|
>
|
|
<
|
|
|



|
<
<
<

|



|



|
<

|
<
<
<
<
<

|
<
<

|
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

22


23
24




25
26
27
28

29



30


31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53



54
55


56
57
58
59




60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81


82
83

84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113

114
115
116
117
118
119
120



121
122
123
124
125
126
127
128
129
130

131
132





133
134


135
136
137
138
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Tkabber_starpack/index.html)


# Tkabber starpack

Материал из Tkabber Wiki

Статья посвящена сборке дистрибутива Tkabber Starpack для операционной системы MS Windows. 

## <a id="toc"></a>Содержание

* [1 Как это работает](#Как_это_работает)
* [2 Инструмент «Сделай-Tkabber-Starpack-сам»](#Инструмент_«Сделай-Tkabber-Starpack-сам»)
* [3 Убираем "лишнее" в Ткаббере](#Убираем_лишнее_в_Ткаббере)
 * [3.1 Библиотеки Tcl/Tk, необходимые для нормальной работы Ткаббера](#Библиотеки_Tcl_Tk_необходимые_для_нормальной_работы_Ткаббера)
 * [3.2 Опциональные библиотеки Tcl/Tk](#Опциональные_библиотеки_Tcl_Tk)
 * [3.3 Компоненты Ткаббера](#Компоненты_Ткаббера)
* [4 Как скачать последнюю SVN-версию Ткаббера](#Как_скачать_последнюю_SVN-версию_Ткаббера)

## <a id="Как_это_работает"></a>Как это работает


По сути, Tkabber Starpack представляет собой [cамораспаковывающийся архив](http://ru.wikipedia.org/wiki/Самораспаковывающийся_архив). Но в отличие от последнего, Старпак распаковывается в оперативную память компьютера и имитирует структуру файлов и каталогов Ткаббера на диске. 



Для уменьшения размеров файл Старпака [сжимается](http://ru.wikipedia.org/wiki/Упаковка_исполняемых_файлов) упаковщиком [UPX](http://ru.wikipedia.org/wiki/UPX). Именно поэтому запуск Старпака происходит с некоторой, довольно ощутимой на многих системах, задержкой.  





После запуска Старпака происходит следующее: 

1.  распаковывается сам Старпак (восстанавливается [исполняемый файл](http://ru.wikipedia.org/wiki/Исполнимый_модуль) Старпака из архива, полученного с помощью упаковщика [UPX](http://ru.wikipedia.org/wiki/UPX)); 

1.  в оперативной памяти создаётся структура каталогов и файлов Ткаббера (точнее сказать, имитируется таким образом, чтобы интерпретатор [Tcl/Tk](http://tcl.tk), "поверил" в то, что он имеет дело со структурой каталогов и файлов на диске); 



1.  собственно Ткаббер и запускается (происходит передача управления интерпретатору Тикля, последнему передаётся в качестве параметра файл tkabber.tcl. с запуска оного и начинается запуск ткаббера). 



## <a id="Инструмент_«Сделай-Tkabber-Starpack-сам»"></a>Инструмент «Сделай-Tkabber-Starpack-сам»

Инструмент позволит в несколько кликов мыши собрать собственный Starpack. 

Для этого вам понадобится: 

1.  Сам инструмент. Можно взять [здесь](../files/Tkabber_win32_starpack_template.rar) (2.59 Мб); 
1.  Ткаббер. Версия должна быть не ниже 0.9.9-SVN-20070317 (ревизия 1051 от 17 Марта 2007). 

Для особо ленивых [ниже](Tkabber_starpack.md#Как_скачать_последнюю_SVN-версию_Tkabber) описано, как скачать и использовать версию SVN. 

Собираем Starpack: 

1.  Распаковываем инструмент и получаем каталог **tkabber\_win32\_starpack\_template**; 
1.  Копируем файлы Ткаббера в каталог **tkabber\_win32\_starpack\_template\\tkabber\_win32\_starpack.vfs\\tkabber**; 
1.  Запускаем `build.cmd` из каталога **tkabber\_win32\_starpack\_template**. 

Всё! Tkabber Starpack готов. 

**Ваша** свеженькая сборка находится в каталоге **tkabber\_win32\_starpack\_template\\tkabber\_starpack**. 

Вы можете использовать `tkabber_win32_starpack.exe` сам по себе или запускать его через `mobile_tkabber.cmd`. В последнем случае вы получаете мобильную версию Ткаббера, который использует каталог **tkabberhome**, находящийся рядом с ним, в качестве каталога с настройками. 




Ткаббер поставляется с базовым набором плагинов. Если вас интересуют игры, измеритель траффика, доска для рисования и т.д. — вы можете скачать эти плагины отдельно и поместить в **tkabberhome\\plugins**. 



## <a id="Убираем_лишнее_в_Ткаббере"></a>Убираем "лишнее" в Ткаббере

Когда я был маленьким, то очень любил разбирать механические часы. В те редкие случаи, когда я их собирал обратно, у меня оставалось много "лишних" деталей. Часы, естественно, после этого переставали работать. В этом разделе попробуем разобраться, какие компоненты Ткаббера и библиотеки Tcl/Tk необязательны для работы нашего Starpack. 





### <a id="Библиотеки_Tcl_Tk_необходимые_для_нормальной_работы_Ткаббера"></a>Библиотеки Tcl/Tk, необходимые для нормальной работы Ткаббера

*  base64 
*  BWidget 
*  dns 
*  itcl 
*  log 
*  md5 
*  sha1 
*  tcl8.4 
*  textutil 
*  tk8.4 
*  uri 
*  vfs 

Примечание: если Ткаббер не запустился, попробуйте установить более новые бибиотеки. 

### <a id="Опциональные_библиотеки_Tcl_Tk"></a>Опциональные библиотеки Tcl/Tk

*  **TclWinIdle**  — поддержка auto-away. Если вы трудоголик, от компьютера вас относят в бессознательном состоянии, то эта функция вам точно не нужна. Примечание: если старпак собирался на tcl/tk 8.4, то для работы autoaway необходим tclWinidle-0.2. 



*  **Winico** — пакет добавляет в Ткаббер возможность работать с областью системных уведомлений ("systray", "трей"). Позволяет сворачивать/разворачивать программу в systray. 


*  **tls** — поддержка SSL. 

*  **sasl** — поддержка SASL авторизации. 

### <a id="Компоненты_Ткаббера"></a>Компоненты Ткаббера

*  **authors** — мы их уважаем, а потому оставим этот файл. 

*  **ChangeLog** — прочитали, удалили... 

*  **copying** — лицензия  — это святое! 

*  **install** — файл-заглушка. Удаляем. 

*  **Makefile** — уже собрали :) Удаляем. 

*  **readme** — не думаю, что этот файл пригодится нам в запакованном виде. Удаляем. 

*  **DOC** — документация. Так же как и readme — бесполезна в starpack. Удаляем. 

*  **EMOTICONS** — смайлики. Можете свободно удалять, добавлять свои... 

*  **EXAMPLES** — здесь собраны примеры конфигурационных файлов, цветовых схем, утилит... Если вам не нужна конфигурация от Teo или Badlop, то смело можете удалять. 

*  **MSGS** — переводы сообщений Ткаббера на разные языки. Можете оставить только нужные вам. 

*  **PIXMAPS** — наборы иконок ростера. Удаляйте, добавляйте на ваше усмотрение. 

*  **SOUNDS** — звуки без пакета [snack](http://www.speech.kth.se/snack/) всё равно не воспроизводятся. Но можно [дополнительно подключить](Проблемы_со_звуком.md) **snack.kit**. Тогда пригодятся. 


*  **TRANS** — аналогично MSGS. 

*  **tkabber-plugins** — встроенные плагины-игры для ткаббера, их можно удалить; в случае необходимости — легко подключаются через конфиг. 

## <a id="Как_скачать_последнюю_SVN-версию_Ткаббера"></a>Как скачать последнюю SVN-версию Ткаббера

Прежде всего нам понадобится программа-клиент для доступа к репозиториям [системы контроля версий](http://ru.wikipedia.org/wiki/!8AB5<0 :>=B@>;O 25@A89) [Subversion](http://subversion.tigris.org/). Версия для Windows находится [здесь](http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91&expandFolder=91&folderID=74). 




После установки svn создаём в удобном для вас месте каталог **tkabber**, делаем его текущим в консоли и пишем сначала: 

    svn co http://svn.xmpp.ru/repos/tkabber/trunk/tkabber tkabber-svn

а затем 

    svn co http://svn.xmpp.ru/repos/tkabber/trunk/tkabber-plugins tkabber-plugins-svn

В каталоге **tkabber-svn** находится сам Ткаббер, а в **tkabber-plugins-svn** — дополнительные плагины к нему. 


Если вы собираете Starpack из версии svn, то не забудьте после выполнения пункта 2 сборки удалить из каталога **tkabber** служебную информацию svn. Проще это сделать через поиск системы MS Windows. В качестве имени файла вводим ".svn", в поле "Поиск в:" выбираем каталог с Ткаббером, в дополнительных настройках отмечаем пункт "Поиск в скрытых файлах и папках". Все найденные файлы удаляем. 






**Важно!** Если вы хотите собирать старпак из SVN-версии, вам следует помнить о её _нестабильности и теоретическом наличии неприятных багов,_ поэтому почитайте-ка для общего развития [эту статью](SVN_disclaimer.md). 



[Archimed](Участник_Archimed.md) 


Changes to wiki/ru/Tkinactive.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

33

34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60


[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Tkinactive/index.html)


# Tkinactive

Материал из Tkabber Wiki.

Как известно, подсистема AutoAway у Ткаббера в Windows вначале зависела от
расширения тикля [tclWinidle](http://sgolovan.nes.ru/jabber/tclWinidle/).

Начиная с версии 0.10.0 Ткаббер умеет пользоваться _встроенным_ средством Tk —
командой [tk inactive](http://www.tcl.tk/cgi-bin/tct/tip/245.html), которая,
однако, появилась только в Tcl/Tk 8.5.

Расширение **tclWinidle**, к сожалению, имеет некоторые поблемы: при некоторых
обстоятельствах (которые не удаётся пока чётко отследить) оно начинает "врать"
относительно периода неактивности пользователя. Выглядит это как внезапный
самостоятельный переход Ткаббера в состояние "extended away", из которого его
нельзя вывести никаким образом, кроме запрещения механизма AutoAway (установкой
обоих периодов неактивности в 0 минут) или перезагрузкой. Ещё одна проблема с
**tclWinidle** не видна пользователю и заключается в том, что это расширение
использует для работы приём, известный как
["DLL injection"](http://en.wikipedia.org/wiki/DLL_Injection).

Эта страница посвящена "внедрению в Ткаббер" нового (для него) расширения Tk:
[tkinactive](http://wiki.tcl.tk/14765). Данное расширение интересно тем, что
представляет собой код, реализующий упомянутую команду Tk 8.5 **tk inactive**,
только в виде самостоятельного пакета, _который может работть с Tcl/Tk 8.4_ (а
возможно и 8.3). Использование **tkinactive** вместо **tclWinidle** призвано
решить указанные выше проблемы.

Единственная новая "проблема", известная у **tkinactive**, состоит в том, что
это расширение не работает под Win9x, однако поскольку ОС этого класса не

поддерживаются даже фирмой, их создавших, это ограничение не выглядит

существенным.

[**Kostix**](Участник_Kostix.md) портировал **tkinactive** под современное
состояние [TEA](http://www.tcl.tk/doc/tea/), чтобы пакет нормально собирался
как под Unix, так и под Win32, а [**teo**](Участник_Teo.md)
[выложил](http://sgolovan.nes.ru/jabber/tkinactive/) виндовую сборку на своём
сайте. Параллельно с этим код подсистемы AuwoAway Ткаббера был изменён так,
чтобы грузить пакет **tkinactive** _вместо_ **tclWinidle**, если он доступен.

Таким образом, открыто тестирование комбинации этого расширения с Ткаббером под
Windows. Широкие массы убедительно призываются к тестированию.

Что потребуется:

1. Ткаббер из репозитория, не старее ревизии 1125;
1. [Виндовая сборка](http://sgolovan.nes.ru/jabber/tkinactive/)
   расширения **tkinactive**.

Распакуйте каталог с расширением в каталог с остальными расширениями  тикля
(обычно это `C:\Tcl\lib`), обновите Ткаббер из репозитория и перезапустите его.

Обо всех глюках докладывайте в комнате
[`xmpp:tkabber@conference.jabber.ru`](xmpp:tkabber@conference.jabber.ru), на
[багзилле Ткаббера](http://www.jabber.ru/bugzilla/) или сообщайте напрямую
[**kostix**](Участник_Kostix.md).

Да, о стабильной работе тоже сообщайте. Только не в багзиллу :)



>





|
<

|
<
<

|
<
<
<
<
<
<
<
<

|
<
<
<
<
<

|
|
>
|
>
<

<
<
<
<
<
<
<
<
<
<
|

|
|
<

|
<

|
<
<
<

|
>
>
1
2
3
4
5
6
7
8

9
10


11
12








13
14





15
16
17
18
19
20

21










22
23
24
25

26
27

28
29



30
31
32
33
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Tkinactive/index.html)


# Tkinactive

Материал из Tkabber Wiki.

Как известно, подсистема AutoAway у Ткаббера в Windows вначале зависела от расширения тикля [tclWinidle](http://sgolovan.nes.ru/jabber/tclWinidle/). 


Начиная с версии 0.10.0 Ткаббер умеет пользоваться _встроенным_ средством Tk — командой [tk inactive](http://www.tcl.tk/cgi-bin/tct/tip/245.html), которая, однако, появилась только в Tcl/Tk 8.5. 



Расширение **tclWinidle**, к сожалению, имеет некоторые поблемы: при некоторых обстоятельствах (которые не удаётся пока чётко отследить) оно начинает "врать" относительно периода неактивности пользователя. Выглядит это как внезапный самостоятельный переход Ткаббера в состояние "extended away", из которого его нельзя вывести никаким образом, кроме запрещения механизма AutoAway (установкой обоих периодов неактивности в 0 минут) или перезагрузкой. Ещё одна проблема с **tclWinidle** не видна пользователю и заключается в том, что это расширение использует для работы приём, известный как ["DLL injection"](http://en.wikipedia.org/wiki/DLL_Injection). 









Эта страница посвящена "внедрению в Ткаббер" нового (для него) расширения Tk: [tkinactive](http://wiki.tcl.tk/14765). Данное расширение интересно тем, что представляет собой код, реализующий упомянутую команду Tk 8.5 **tk inactive**, только в виде самостоятельного пакета, _который может работть с Tcl/Tk 8.4_ (а возможно и 8.3). Использование **tkinactive** вместо **tclWinidle** призвано решить указанные выше проблемы. 






Единственная новая "проблема", известная у **tkinactive**, состоит в том, что это расширение не работает под Win9x, однако поскольку ОС этого класса не поддерживаются даже фирмой, их создавших, это ограничение не выглядит существенным. 

[Kostix](Участник_Kostix.md) портировал **tkinactive** под современное состояние [TEA](http://www.tcl.tk/doc/tea/), чтобы пакет нормально собирался как под Unix, так и под Win32, а [teo](Участник_Teo.md) [выложил](http://sgolovan.nes.ru/jabber/tkinactive/) виндовую сборку на своём сайте. Параллельно с этим код подсистемы AuwoAway Ткаббера был изменён так, чтобы грузить пакет **tkinactive** _вместо_ **tclWinidle**, если он доступен. 

Таким образом, открыто тестирование комбинации этого расширения с Ткаббером под Windows. Широкие массы убедительно призываются к тестированию. 












Что потребуется: 

1.  Ткаббер из репозитория, не старее ревизии 1125; 
1.  [Виндовая сборка](http://sgolovan.nes.ru/jabber/tkinactive/) расширения **tkinactive**. 


Распакуйте каталог с расширением в каталог с остальными расширениями  тикля (обычно это `C:\Tcl\lib`), обновите Ткаббер из репозитория и перезапустите его. 


Обо всех глюках докладывайте в комнате `[xmpp:tkabber@conference.jabber.ru](xmpp:tkabber@conference.jabber.ru)`, на [багзилле Ткаббера](http://www.jabber.ru/bugzilla/) или сообщайте напрямую [kostix](Участник_Kostix.md). 




Да, о стабильной работе тоже сообщайте. Только не в багзиллу :) 


Changes to wiki/ru/Wish_и_русская_раскладка_в_Windows.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43


44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126

127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Wish_и_русская_раскладка_в_Windows/index.html)


# Wish и русская раскладка в Windows

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Проблема](#Проблема)
* [2 Решение](#Решение)
   * [2.1 Ткаббер](#Ткаббер)
   * [2.2 Как узнать альтернативный keysym](#Как_узнать_альтернативный_keysym)
   * [2.3 Как применить полученные знания](#Как_применить_полученные_знания)
   * [2.4 Полезные советы](#Полезные_советы)
      * [2.4.1 Привязки](#Привязки)
      * [2.4.2 Обработчики](#Обработчики)
   * [2.5 Дополнительная информация](#Дополнительная_информация)
   * [2.6 Примечания](#Примечания)

## <a id="Проблема"></a>Проблема
Windows-версия библиотеки Tk имеет неприятный баг: нажатия одних и тех же
клавиш на разных языках ввода клавиатуры (например, английской и русской)
генирируют разные ["символы клавиш" ("keysyms")](http://www.tcl.tk/man/tcl8.4/TkCmd/keysyms.htm), которые Tk
использует при сопоставлении нажатия клавиши со списком клавиатурных
акселераторов (они же "хоткеи", они же "горячие клавиши").

На самом деле в Windows-версии Tk имеет место "двойной" баг:

*  keysyms зависят от языка ввода (это не так в [X Window System](http://www.xfree86.org/current/X.7.html));
*  от кода keysym'а берутся почему-то только младшие 8 бит из-за чего эти
   коды "отображаются" в нижние 256 байт таблицы
   [Unicode](http://www.unicode.org), которые фактически представляют собой
   набор символов, известный как
   ["Latin-1"](http://czyborra.com/charsets/iso8859.html#ISO-8859-1)<sup>1</sup>.

К примеру, нажатие клавиши a на английской раскладке возвращает keysym "a", а
на русской — "ocircumflex".

В X (с [xkb](http://pascal.tsu.ru/en/xkb/)) keysym для клавиши a всегда — "a"
независимо от текущего языка ввода.

Описанная проблема приводит к тому, что хоткеи в Ткаббере, запущенном под
Windows, без дополнительных усилий работают только на оригинальной английской


раскладке<sup>2</sup>.

## <a id="Решение"></a>Решение
### <a id="Ткаббер"></a>Ткаббер

Этот баг _частично_ обойдён разработчиками Ткаббера путём создания
альтернативных привязок клавиш для описанных "странных" keysym'ов, парных
соответствующим "нормальным". Например, такая привязка есть для палитры
эмоциконок — Alt-e.

К сожалению, остаются две проблемы:

*  Не все стандартные хоткеи имеют в Ткаббере привязки для обхода описанного
   бага<sup>3</sup>.
*  Когда вы определяете собственный хоткей, вы встречаетесь с этим же багом.

О том, как решать эти проблемы, написано ниже.

### <a id="Как_узнать_альтернативный_keysym"></a>Как узнать альтернативный keysym

Придётся написать микроскопическую программу на Tcl/Tk. Набить её можно прямо в
консоли Ткаббера, хотя, конечно же, подойдёт и просто **wish** или **tkcon** (в
нём понадобится вначале выполнить команду `package require Tk`).

Вот эта программка:

    toplevel .keytest
    label .keytest.l -text {Нажимайте клавиши}
    pack .keytest.l -fill both -expand true
    bind .keytest <KeyPress> [list puts %K]

После выполнения этой программы вы увидите новое окно верхнего уровня с текстом
"Нажимайте клавиши" внутри. Сделайте это окно активным, смените раскладку и
нажимайте там интересующие вас клавиши. При этом вы увидите, что в вашу консоль
(туда, где вы набрали программу) пишутся названия клавиш — те самые
keysyms<sup>4</sup>.

### <a id="Как_применить_полученные_знания"></a>Как применить полученные знания

Возьмём практический пример: предположим, вы хотите "русифицировать" хоткеи
Ctrl-L и Ctrl-J (действия: "Подключиться" и "Отключиться", соответственно).

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

Узнав, что клавише "l" на русской раскладке соответствует keysym "adiaresis", а
клавише "j" — "icircumflex", мы можем написать в конфиг Ткаббера "русификацию":

    hook::add finload_hook {
      bind . <Control-KeyPress-adiaeresis> [bind . <Control-KeyPress-l>]
      bind . <Control-KeyPress-icircumflex> [bind . <Control-KeyPress-j>]
    }

Смысл этого куска кода состоит в следующем:

1. Наш код "вешается" на хук "finload\_hook", который выполняется по наступлению
   события "инициализация Ткаббера окончена, главное окно сконфигурировано и показано";
1. Команда
        bind . <Control-KeyPress-КЛАВИША>
 возвращяет код Tcl, являющийся текущим обработчиком указанной комбинации клавиш;
1. Этот код связывается с нашей новой комбинацией клавиш.
1. Данная операция повторяется для каждой интересующей нас комбинации клавиш
   и окна, к которому она привязана.

### <a id="Полезные_советы"></a>Полезные советы

![(!)](../images/Hammer.png) **Сделать:** вообще-то напрашивается
самостоятельный раздел "Собственные хоткеи в Ткаббере" где должно быть написано
о привязке клавиш "вообще"; после чего бОльшая часть нижеприведённых советов
должна уйти в этот раздел

#### <a id="Привязки"></a>Привязки

* Имейте в виду, что хоткей не привязывается "вообще" к Ткабберу, — он
  привязывается к _конкретному окну._ В нашем примере это ".", то есть главное
  окно программы, то это не обязано выполняться для всех хоткеев.
* Некоторые хоткеи привязаны не к окнам, а к
  [виртуальным событиям Tk](http://www.tcl.tk/man/tcl8.4/TkCmd/event.htm). К
  примеру, так устроена работа палитры смайликов или панели поиска<sup>5</sup>.

Всё это означает, что в некоторых (если не во всех) случаях не обойтись без
ковыряния в исходиках Ткаббера с целью выяснения как и к чему привязан
интересующий Вас хоткей.


Иногда соответствующие виртуальные события описаны в документации (Ткаббера,
или, например, плагина к нему)<sup>6</sup>.

#### <a id="Обработчики"></a>Обработчики

Если у вас плохо со знанием Tcl и вам трудно разбираться с исходниками
Ткаббера, то самый простой способ повесить свой хоткей на действие, за которым
некий хоткей уже закреплён, это "клонировать" существующий хоткей. Именно этим
мы и занимались в нашем примере: брали обработчик существующего хоткея и
связывали его с новым, собственным, хоткеем. Однако, иногда удобнее (и
концептуально чище) указывать обработчик при создании привязки.

> _При "клонировании" хоткеев, привязанных к окнам (а не виртуальным событиям
  Тк), имейте в виду, что такое клонирование можно производить только в
  `finload_hook`, т.к. окно, к которому привязан интересующий нас хоткей должно
  существовать к моменту клонирования._ Привязывать хоткеи к виртуальным
  событиям Tk можно в любой момент времени (и, соответственно, помещать код
  привязок в любое место конфига).

### <a id="Дополнительная_информация"></a>Дополнительная информация

... находится на [Tclers' Wiki](http://wiki.tcl.tk):

*  [Keysyms на платформах, отличных от X11](http://wiki.tcl.tk/6182).
*  [Keysyms в "акве"](http://wiki.tcl.tk/14529).

### <a id="Примечания"></a>Примечания

<sup>1</sup> Можете проверить сами:

*  Открываете [список keysyms](http://www.tcl.tk/man/tcl8.4/TkCmd/keysyms.htm);
*  Ищете там, к примеру, keysym "Cyrillic\_a"; замечаете, что он имеет шестнадцатеричный код 0x06C1;
*  Мысленно накладываете на него маску 0xFF и получаете код 0xC1;
*  Теперь ищете этот код в таблице — получаете "Aacute".

Маску можно накладывать и не мысленно, например, напишите в консоли Ткаббера:

    format 0x%X [expr {0x06C1 & 0xFF}]

<sup>2</sup> Она является "оригинальной" потому, что в Ткаббере привязки клавиш
деляются через их "английское" именование, например, `<Ctrl-KeyPress-r>`,
поскольку это позволяет им без всяких пинков работать в X.

<sup>3</sup> Строго говоря, наличие специальных "хаков" для поддержки русского
языка прямо в программе "попахивает" не очень хорошо, ведь подобные проблемы
имеют место с любым языком, у которого коды клавиш ≥ 256, а таких языков много.
По этой причине обход этого бага неплохо бы вынести во внешние плагины (по
одному для каждого языка). Для этого было бы _очень_ удобно иметь виртуальные
события Тк для всех действий, для которых определены хоткеи.

<sup>4</sup> Учтите, что вывод будет попадать в консоль только в том случае,
если вы не
[**перенаправили стандартный поток вывода интерпретатора Tcl в файл**](Нетривиальные_настройки.md#Отладочный_лог_под_Windows);
в этом случае либо ищите их там, либо поменяйте последнюю команду на такую:

    bind .keytest <KeyPress> [list .keytest.l config -text %K]

в этом случае названия клавиш будут рисоваться прямо в окне, в котором вы эти
клавиши нажимаете.

<sup>5</sup> Существует идея постепенно перевести все клавиатурные привязки,
существующие в Ткаббере, на виртуальные события Tk. Это сильно упростит
создание пользовательских привязок.

<sup>6</sup> Разработчикам плагинов настоятельно рекоммендуется использовать
виртуальные события Тк, если требуется поддержка управления хоткеями или
определёнными событиями мыши, а так же _**обязательно** документировать_ эти
события — пользователь не должен ковыряться в коде плагина для того, чтобы
поменять настройку хоткея. В качестве примера может выступить документация от
[**плагина "Postpone Text"**](Плагины.md#Postpone_Text_добавлен_в_транк).

>









|
|
|
|
|
|
|
|

|
|
<
<
<
<

|

|
|
<
<
<
<

|
<

|
<

|
|
>
>
<

<
<
<
|
<
<
<

|

|
<
|

|

|

|
<
<

|






|
<
<
<
<

|

|
<

|
<

|
<






|

|
<
|
|
|
|
|
<

|

|
<
<
<

|

|
<
<
<
|
<
<
<
<
|
>

|
<

|

|
<
<
<
<
<

|
<
<
<
<
<

|

|

|
|

|

|

|
|
|
|

|



|
<
<

|
<
<
<
<
<

|
<
<
<



|
<

|
<
<

|
|
|
<
<
<
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22




23
24
25
26
27




28
29

30
31

32
33
34
35
36

37



38



39
40
41
42

43
44
45
46
47
48
49


50
51
52
53
54
55
56
57
58




59
60
61
62

63
64

65
66

67
68
69
70
71
72
73
74
75

76
77
78
79
80

81
82
83
84



85
86
87
88



89




90
91
92
93

94
95
96
97





98
99





100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121


122
123





124
125



126
127
128
129

130
131


132
133
134
135



[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Wish_и_русская_раскладка_в_Windows/index.html)


# Wish и русская раскладка в Windows

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Проблема](#Проблема)
* [2 Решение](#Решение)
 * [2.1 Ткаббер](#Ткаббер)
 * [2.2 Как узнать альтернативный keysym](#Как_узнать_альтернативный_keysym)
 * [2.3 Как применить полученные знания](#Как_применить_полученные_знания)
 * [2.4 Полезные советы](#Полезные_советы)
  * [2.4.1 Привязки](#Привязки)
  * [2.4.2 Обработчики](#Обработчики)
 * [2.5 Дополнительная информация](#Дополнительная_информация)
 * [2.6 Примечания](#Примечания)

# <a id="Проблема"></a>Проблема
Windows-версия библиотеки Tk имеет неприятный баг: нажатия одних и тех же клавиш на разных языках ввода клавиатуры (например, английской и русской) генирируют разные ["символы клавиш" ("keysyms")](http://www.tcl.tk/man/tcl8.4/TkCmd/keysyms.htm), которые Tk использует при сопоставлении нажатия клавиши со списком клавиатурных акселераторов (они же "хоткеи", они же "горячие клавиши"). 





На самом деле в Windows-версии Tk имеет место "двойной" баг: 

*  keysyms зависят от языка ввода (это не так в [X Window System](http://www.xfree86.org/current/X.7.html)); 
*  от кода keysym'а берутся почему-то только младшие 8 бит из-за чего эти коды "отображаются" в нижние 256 байт таблицы [Unicode](http://www.unicode.org), которые фактически представляют собой набор символов, известный как ["Latin-1"](http://czyborra.com/charsets/iso8859.html#ISO-8859-1)<sup>1</sup>. 





К примеру, нажатие клавиши a на английской раскладке возвращает keysym "a", а на русской — "ocircumflex". 


В X (с [xkb](http://pascal.tsu.ru/en/xkb/)) keysym для клавиши a всегда — "a" независимо от текущего языка ввода. 


Описанная проблема приводит к тому, что хоткеи в Ткаббере, запущенном под Windows, без дополнительных усилий работают только на оригинальной английской раскладке<sup>2</sup>. 

# <a id="Решение"></a>Решение
## <a id="Ткаббер"></a>Ткаббер





Этот баг _частично_ обойдён разработчиками Ткаббера путём создания альтернативных привязок клавиш для описанных "странных" keysym'ов, парных соответствующим "нормальным". Например, такая привязка есть для палитры эмоциконок — Alt-e. 




К сожалению, остаются две проблемы: 

*  Не все стандартные хоткеи имеют в Ткаббере привязки для обхода описанного бага<sup>3</sup>. 

*  Когда вы определяете собственный хоткей, вы встречаетесь с этим же багом. 

О том, как решать эти проблемы, написано ниже. 

## <a id="Как_узнать_альтернативный_keysym"></a>Как узнать альтернативный keysym

Придётся написать микроскопическую программу на Tcl/Tk. Набить её можно прямо в консоли Ткаббера, хотя, конечно же, подойдёт и просто **wish** или **tkcon** (в нём понадобится вначале выполнить команду `package require Tk`). 



Вот эта программка: 

    toplevel .keytest
    label .keytest.l -text {Нажимайте клавиши}
    pack .keytest.l -fill both -expand true
    bind .keytest <KeyPress> [list puts %K]

После выполнения этой программы вы увидите новое окно верхнего уровня с текстом "Нажимайте клавиши" внутри. Сделайте это окно активным, смените раскладку и нажимайте там интересующие вас клавиши. При этом вы увидите, что в вашу консоль (туда, где вы набрали программу) пишутся названия клавиш — те самые keysyms<sup>4</sup>. 





## <a id="Как_применить_полученные_знания"></a>Как применить полученные знания

Возьмём практический пример: предположим, вы хотите "русифицировать" хоткеи Ctrl-L и Ctrl-J (действия: "Подключиться" и "Отключиться", соответственно). 


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


Узнав, что клавише "l" на русской раскладке соответствует keysym "adiaresis", а клавише "j" — "icircumflex", мы можем написать в конфиг Ткаббера "русификацию": 


    hook::add finload_hook {
      bind . <Control-KeyPress-adiaeresis> [bind . <Control-KeyPress-l>]
      bind . <Control-KeyPress-icircumflex> [bind . <Control-KeyPress-j>]
    }

Смысл этого куска кода состоит в следующем: 

1.  Наш код "вешается" на хук "finload\_hook", который выполняется по наступлению события "инициализация Ткаббера окончена, главное окно сконфигурировано и показано"; 

1.  Команда 
    bind . <Control-KeyPress-КЛАВИША>
 возвращяет код Tcl, являющийся текущим обработчиком указанной комбинации клавиш; 
1.  Этот код связывается с нашей новой комбинацией клавиш. 
1.  Данная операция повторяется для каждой интересующей нас комбинации клавиш и окна, к которому она привязана. 


## <a id="Полезные_советы"></a>Полезные советы

![(!)](../images/Hammer.png) **Сделать:** вообще-то напрашивается самостоятельный раздел "Собственные хоткеи в Ткаббере" где должно быть написано о привязке клавиш "вообще"; после чего бОльшая часть нижеприведённых советов должна уйти в этот раздел 




### <a id="Привязки"></a>Привязки

*  Имейте в виду, что хоткей не привязывается "вообще" к Ткабберу, — он привязывается к _конкретному окну._ В нашем примере это ".", то есть главное окно программы, то это не обязано выполняться для всех хоткеев. 



*  Некоторые хоткеи привязаны не к окнам, а к [виртуальным событиям Tk](http://www.tcl.tk/man/tcl8.4/TkCmd/event.htm). К примеру, так устроена работа палитры смайликов или панели поиска<sup>5</sup>. 





Всё это означает, что в некоторых (если не во всех) случаях не обойтись без ковыряния в исходиках Ткаббера с целью выяснения как и к чему привязан интересующий Вас хоткей. 

Иногда соответствующие виртуальные события описаны в документации (Ткаббера, или, например, плагина к нему)<sup>6</sup>. 


### <a id="Обработчики"></a>Обработчики

Если у вас плохо со знанием Tcl и вам трудно разбираться с исходниками Ткаббера, то самый простой способ повесить свой хоткей на действие, за которым некий хоткей уже закреплён, это "клонировать" существующий хоткей. Именно этим мы и занимались в нашем примере: брали обработчик существующего хоткея и связывали его с новым, собственным, хоткеем. Однако, иногда удобнее (и концептуально чище) указывать обработчик при создании привязки. 






 _При "клонировании" хоткеев, привязанных к окнам (а не виртуальным событиям Тк), имейте в виду, что такое клонирование можно производить только в `finload_hook`, т.к. окно, к которому привязан интересующий нас хоткей должно существовать к моменту клонирования._ Привязывать хоткеи к виртуальным событиям Tk можно в любой момент времени (и, соответственно, помещать код привязок в любое место конфига). 






## <a id="Дополнительная_информация"></a>Дополнительная информация

...находится на [Tclers' Wiki](http://wiki.tcl.tk): 

*  [Keysyms на платформах, отличных от X11](http://wiki.tcl.tk/6182). 
*  [Keysyms в "акве"](http://wiki.tcl.tk/14529). 

## <a id="Примечания"></a>Примечания

<sup>1</sup> Можете проверить сами: 

*  Открываете [список keysyms](http://www.tcl.tk/man/tcl8.4/TkCmd/keysyms.htm); 
*  Ищете там, к примеру, keysym "Cyrillic\_a"; замечаете, что он имеет шестнадцатеричный код 0x06C1; 
*  Мысленно накладываете на него маску 0xFF и получаете код 0xC1; 
*  Теперь ищете этот код в таблице — получаете "Aacute". 

Маску можно накладывать и не мысленно, например, напишите в консоли Ткаббера: 

    format 0x%X [expr {0x06C1 & 0xFF}]

<sup>2</sup> Она является "оригинальной" потому, что в Ткаббере привязки клавиш деляются через их "английское" именование, например, `<Ctrl-KeyPress-r>`, поскольку это позволяет им без всяких пинков работать в X. 



<sup>3</sup> Строго говоря, наличие специальных "хаков" для поддержки русского языка прямо в программе "попахивает" не очень хорошо, ведь подобные проблемы имеют место с любым языком, у которого коды клавиш ≥ 256, а таких языков много. По этой причине обход этого бага неплохо бы вынести во внешние плагины (по одному для каждого языка). Для этого было бы _очень_ удобно иметь виртуальные события Тк для всех действий, для которых определены хоткеи. 






<sup>4</sup> Учтите, что вывод будет попадать в консоль только в том случае, если вы не [перенаправили стандартный поток вывода интерпретатора Tcl в файл](Нетривиальные_настройки.md#Отладочный_лог_под_Windows); в этом случае либо ищите их там, либо поменяйте последнюю команду на такую: 




    bind .keytest <KeyPress> [list .keytest.l config -text %K]

в этом случае названия клавиш будут рисоваться прямо в окне, в котором вы эти клавиши нажимаете. 


<sup>5</sup> Существует идея постепенно перевести все клавиатурные привязки, существующие в Ткаббере, на виртуальные события Tk. Это сильно упростит создание пользовательских привязок. 



<sup>6</sup> Разработчикам плагинов настоятельно рекоммендуется использовать виртуальные события Тк, если требуется поддержка управления хоткеями или определёнными событиями мыши, а так же _**обязательно** документировать_ эти события — пользователь не должен ковыряться в коде плагина для того, чтобы поменять настройку хоткея. В качестве примера может выступить документация от [плагина "Postpone Text"](Плагины.md#Postpone_text). 





Changes to wiki/ru/XRDB.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17


[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/XRDB/index.html)


# XRDB

Материал из Tkabber Wiki

![(!)](../images/Hammer.png) **Сделать:** Написать про Tk option database, его
отношении к XRDB; место и роль xrdb-файлов во всём этом

[**База данных опций Tk**](База_данных_опций_Tk.md)

[Краткая рассказка про основы XRDB (англ.)](http://www.tau.ac.il/cc/internal/X-terminals/5-6-1.html)

Команда Tk для управления базой данных настроек:
[option](http://www.tcl.tk/man/tcl8.4/TkCmd/option.htm)

[[1]](http://www.cit.gu.edu.au/~anthony/info/X/Resources.hints)



>





|
<

|

|

|
<

|
>
>
1
2
3
4
5
6
7
8

9
10
11
12
13
14

15
16
17
18
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/XRDB/index.html)


# XRDB

Материал из Tkabber Wiki

![(!)](../images/Hammer.png) **Сделать:** Написать про Tk option database, его отношении к XRDB; место и роль xrdb-файлов во всём этом 


[База данных опций Tk](База_данных_опций_Tk.md) 

[Краткая рассказка про основы XRDB (англ.)](http://www.tau.ac.il/cc/internal/X-terminals/5-6-1.html) 

Команда Tk для управления базой данных настроек: [option](http://www.tcl.tk/man/tcl8.4/TkCmd/option.htm) 


[[1]](http://www.cit.gu.edu.au/~anthony/info/X/Resources.hints) 


Changes to wiki/ru/База_данных_опций_Tk.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119

120
121

122

123

124

125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/База_данных_опций_Tk/index.html)


# База данных опций Tk

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Введение](#Введение)
* [2 Глоссарик (словарий)](#Глоссарик_словарий)
   * [2.1 Виджеты](#Виджеты)
   * [2.2 Классы виджетов](#Классы_виджетов)
   * [2.3 Опции виджетов](#Опции_виджетов)
      * [2.3.1 Откуда виджеты берут значения своих опций?](#Откуда_виджеты_берут_значения_своих_опций)
   * [2.4 Классы опций виджетов](#Классы_опций_виджетов)
* [3 Структура](#Структура)
* [4 Подводные камни](#Подводные_камни)
   * [4.1 Имя приложения](#Имя_приложения)
* [5 Примечания](#Примечания)

# <a id="Введение"></a>Введение
База данных опций Tk ("Tk option database") это набор пар строк
`ключ/значение`, присутствующих в любом интерпретаторе Tcl, загрузившем
библиотеку Tk, независимо от платформы, позволяющая весьма гибко задавать
настройки для различных виджетов, составляющих графический интерфейс
пользователя программы.

База данных опций Tk имеет прямое отношение к [**XRDB**](XRDB.md) (и
инициализируется из неё на тех платформах, на которых та доступна), работает
очень похожим образом, однако имеет некоторые тонкие отличия.

# <a id="Глоссарик_словарий"></a>Глоссарик (словарий)
Начнём с определения необходимых терминов.

## <a id="Виджеты"></a>Виджеты

Слово "ви́джет" является калькой с английского "widget", которое является хитрым
объединением слов "window" (окно) и "gadget" (штуковина, хреновина, прибор,
девайс и т.п.). Появилось в X Window и обозначает элемент графического
пользовательского интерфейса, представленный окном и обладающий определённым
набором свойств и поведением. Виндовые программисты обычно назвают виджеты
"контро́лами" ("control", "windowed control").

Говоря проще, виджетами являются все чётко выделяемые пользователем элементы
интерфейса: кнопки, поля ввода, скроллбары и т.п. Мнение википедии по этому
вопросу изложено [тут](http://ru.wikipedia.org/wiki/Виджет).

Для нас важнее всего понять два свойства виджетов Tk:

* Виджеты Tk организованы иерархически. То есть некоторые виджеты могут
  содержать дочерние виджеты и сами, в свою очередь, могут являться чьими-то
  дочерними виджетами. Строго говоря, все виджеты графического интерфейса
  пользователя организованы в виде однонаправленного ациклического графа —
  дерева. Корневым узлом этого графа является _главное окно Tk_.
* Каждый виджет в Tk имеет _имя,_ которое однозначно определяет положение
  виджета в иерархии виджетов. Оно аналогично _полному_ путевому имени файла в
  операционных системах. Имя виджета состоит из имён всех его родительских
  виджетов, разделённых точками ("."). Именем главного окна является точка
  (".")<sup>[**1**](#Примечания)</sup>.

Примеры имён виджетов:

* `.` — главное окно приложения;
* `.roster` — окно списка контактов;
* `.mainframe.topf.tb0.bbox` — контейнер с кнопками главного (и единственного) тулбара.

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

* Имена виджетов должны быть полными (так как в отличие, к примеру, от командных
  оболочек операционных систем, в программах, использующих Tk, нет концепции
  "текущий виджет", аналогичной концепции "текущего каталога"), — то есть они
  должны начинаться с точки;
* Имя каждого виджета в цепочке, составляющей полное имя, обязано начинаться
  со строчной буквы или цифры<sup>[**2**](#Примечания)</sup> — заглавные буквы
  зарезервированы за _классами виджетов._

## <a id="Классы_виджетов"></a>Классы виджетов

Каждый виджет принадлежит к определённому _классу._ Так же, как в некоторых
объектно-ориентированных языках программирования класс реализует (обозначает)
_тип_ объекта, класс виджета определяет тип этого виджета — поведение и набор
характеристик, общих для всех виджетов данного класса.

Примеры классов:

* `Button` — кнопка;
* `Entry` — однострочное поле ввода;
* `Menu` — меню;
* `Frame` — "фрейм" (окно, чьей единственной задачей обычно является хранение
  дочерних окон и управление их взаимным расположением (их _"геометрией"_)).

Имена классов стандартных для Tk виджетов просто и однозначно связаны с
_командами Tcl,_ предоставляемыми Tk для создания этих виджетов: команды
назваются так же, как классы, но отличаются от них строчной "капитализацией",
например:

* `Button` → `button`
* `Labelframe` → `labelframe`

и т.д.

Имена классов виджетов в Tk всегда начинаются с заглавной буквы. Это нужно для
того, чтобы можно было отличать их от имён конкретных виджетов в спецификациях
запросов к базе данных опций Tk, которые будут объяснены ниже.

Нетрудно видеть, что можно взять имя любого виджета и заменить имя каждого
(родительского) виджета в цепочке его классом. Например, для первой (слева)
кнопки на нашем тулбаре, которая имеет имя

    .mainframe.topf.tb0.bbox.b0

это будет:

    Tkabber.Frame.Frame.Frame.ButtonBox.Button

что соответствует такой таблице:

Виджет                     |Класс
---------------------------|---------

.                          |Tkabber
.mainframe                 |Frame

.mainframe.topf            |Frame

.mainframe.topf.tb0        |Frame

.mainframe.topf.tb0.bbox   |ButtonBox

.mainframe.topf.tb0.bbox.b0|Button

Обратите внимание на класс основного окна (".") — он имеет значение "Tkabber" и
вообще говоря совпадает с _именем приложения,_ о котором подробно рассказано
[**ниже**](#Имя_приложения).

**Примечание:** класс виджета можно узнать при помощи команды
[winfo](http://tcl.tk/man/tcl8.4/TkCmd/winfo.htm):

    winfo class .path.to.the.widget

## <a id="Опции_виджетов"></a>Опции виджетов

Внешний вид и поведение виджетов контролируется их _опциями._ Свои опции
виджеты получают от своих классов, например, все кнопки (виджеты класса Button)
имеют совершенно одинаковый набор опций. _Значения_ же этих опций обычно
разные, что и делает разные виджеты одного класса выглядящими и ведущими себя
по-разному (сравните, к примеру, кнопку на тулбаре с кнопкой, закрывающей окно
"О программе").

Опции виджетов тоже имеют имена. Эти имена как бы продолжают иерархию виджетов
ещё на один уровень, например, имя опции, определяющей шрифт текста на нашей
многострадальной кнопке тулбара таково:

    .mainframe.topf.tb0.bbox.b0.font

### <a id="Откуда_виджеты_берут_значения_своих_опций"></a>Откуда виджеты берут значения своих опций?

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

1.  Значения по умолчанию, "прибитые гвоздями" в библиотеку Tk;
1.  Значения из базы данных опций Tk;
1.  Значения, динамически присваемые опциям в ходе выполнения программы.

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

Важно понимать, что первые два источника являются "статичными" в том смысле,
что Tk пользуется ими _только при создании_ виджета.

## <a id="Классы_опций_виджетов"></a>Классы опций виджетов

Да, опции виджетов тоже имеют классы.

![(!)](../images/Hammer.png) **Сделать:** развить

# <a id="Структура"></a>Структура
База данных опций Tk отображает...

![(!)](../images/Hammer.png) **Сделать:** развить

# <a id="Подводные_камни"></a>Подводные камни
## <a id="Имя_приложения"></a>Имя приложения

![(!)](../images/Hammer.png) **Сделать:** написать

# <a id="Примечания"></a>Примечания
<sup>1</sup> В именовании виджетов Tk используется тот же "трюк" (или "то же
несоответствие", если угодно), которое присутствует в файловых системах Unix: в
последних именем корневого каталога является "/", и этот же символ является
разделителем имён в пути, однако в путевых именах файлов именем корневого
каталога является пустая строка, а путевое имя начинается с разделителя:

    / — корневой каталог
    /foo/bar.txt — путевое имя файла bar.txt в каталоге /foo
    ^разделитель

Нетрудно видеть, что в именах виджетов Tk то же самое происходит с символом
".": он одновременно является именем главного окна и разделителем частей имени
виджета, поэтому в именах виджетов именем главного окна является пустая строка,
а имя начинается с разделителя:

    . — главное окно
    .mywindow.mybutton — виджет mybutton в окне .mywindow
    ^разделитель

<sup>2</sup> Строго говоря, в имени виджета можно использовать _любой
допустимый символ [Unicode](http://www.unicode.org),_ кроме заглавных символов
и точки. Например, вполне допустим код:

    label .метко
    pack .метко
    .метко config -text {Медведы идут на udaff.com}

Более того, имена виджетов могут содержать пробелы:

    label ". " ;# метка с именем, состоящим из одного пробела

Понятно, что как по причинам читабельности, так и удобства
программирования/поддержки кода, так делать не стоит. Кроме того, в
руководствах по Tk этот вопрос практически не освещён, а значит, ничего особо
не гарантируется. Также совершенно непонятен вопрос взамодействия таких имён
виджетов с базой данных опций Tk и — главное — взаимодействие последней с
[**XRDB**](XRDB.md).

>









|
|
|
|
|


|



|
<
<
<
<

|
<
<


|



|
<
<
<
<
<

|
<
<

|

|
<
<
<
<
|
<
<
<
<

|

|
|
|

|

|
<
<
<
|
<
<



|
<
<
<

|

|
|
|
|
<

|
<
<
<

|
|

|

|
<
<

|
<
<



|



|

|
|
>
|
|
>
|
>
|
>
|
>
|

|
<
<

|
<





|
<
<
<
<
<

|
<
<





|
<

|
|
|

|
<
<

|
<



|

|


|

|




|


|
<
<
<
<





|
<
<
<





|
<
<





|



|
|
|
<
<
<
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23




24
25


26
27
28
29
30
31
32





33
34


35
36
37
38




39




40
41
42
43
44
45
46
47
48
49



50


51
52
53
54



55
56
57
58
59
60
61

62
63



64
65
66
67
68
69
70


71
72


73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96


97
98

99
100
101
102
103
104





105
106


107
108
109
110
111
112

113
114
115
116
117
118


119
120

121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139




140
141
142
143
144
145



146
147
148
149
150
151


152
153
154
155
156
157
158
159
160
161
162
163



[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/База_данных_опций_Tk/index.html)


# База данных опций Tk

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Введение](#Введение)
* [2 Глоссарик (словарий)](#Глоссарик_словарий)
 * [2.1 Виджеты](#Виджеты)
 * [2.2 Классы виджетов](#Классы_виджетов)
 * [2.3 Опции виджетов](#Опции_виджетов)
  * [2.3.1 Откуда виджеты берут значения своих опций?](#Откуда_виджеты_берут_значения_своих_опций)
 * [2.4 Классы опций виджетов](#Классы_опций_виджетов)
* [3 Структура](#Структура)
* [4 Подводные камни](#Подводные_камни)
 * [4.1 Имя приложения](#Имя_приложения)
* [5 Примечания](#Примечания)

# <a id="Введение"></a>Введение
База данных опций Tk ("Tk option database") это набор пар строк `ключ/значение`, присутствующих в любом интерпретаторе Tcl, загрузившем библиотеку Tk, независимо от платформы, позволяющая весьма гибко задавать настройки для различных виджетов, составляющих графический интерфейс пользователя программы. 





База данных опций Tk имеет прямое отношение к [XRDB](XRDB.md) (и инициализируется из неё на тех платформах, на которых та доступна), работает очень похожим образом, однако имеет некоторые тонкие отличия. 



# <a id="Глоссарик_словарий"></a>Глоссарик (словарий)
Начнём с определения необходимых терминов. 

## <a id="Виджеты"></a>Виджеты

Слово "ви́джет" является калькой с английского "widget", которое является хитрым объединением слов "window" (окно) и "gadget" (штуковина, хреновина, прибор, девайс и т.п.). Появилось в X Window и обозначает элемент графического пользовательского интерфейса, представленный окном и обладающий определённым набором свойств и поведением. Виндовые программисты обычно назвают виджеты "контро́лами" ("control", "windowed control"). 






Говоря проще, виджетами являются все чётко выделяемые пользователем элементы интерфейса: кнопки, поля ввода, скроллбары и т.п. Мнение википедии по этому вопросу изложено [тут](http://ru.wikipedia.org/wiki/Виджет). 



Для нас важнее всего понять два свойства виджетов Tk: 

*  Виджеты Tk организованы иерархически. То есть некоторые виджеты могут содержать дочерние виджеты и сами, в свою очередь, могут являться чьими-то дочерними виджетами. Строго говоря, все виджеты графического интерфейса пользователя организованы в виде однонаправленного ациклического графа — дерева. Корневым узлом этого графа является _главное окно Tk_. 




*  Каждый виджет в Tk имеет _имя,_ которое однозначно определяет положение виджета в иерархии виджетов. Оно аналогично _полному_ путевому имени файла в операционных системах. Имя виджета состоит из имён всех его родительских виджетов, разделённых точками ("."). Именем главного окна является точка (".")<sup>[1](База_данных_опций_Tk.md#Примечания)</sup>. 





Примеры имён виджетов: 

*  `.` — главное окно приложения; 
*  `.roster` — окно списка контактов; 
*  `.mainframe.topf.tb0.bbox` — контейнер с кнопками главного (и единственного) тулбара. 

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

*  Имена виджетов должны быть полными (так как в отличие, к примеру, от командных оболочек операционных систем, в программах, использующих Tk, нет концепции "текущий виджет", аналогичной концепции "текущего каталога"), — то есть они должны начинаться с точки; 



*  Имя каждого виджета в цепочке, составляющей полное имя, обязано начинаться со строчной буквы или цифры<sup>[2](База_данных_опций_Tk.md#Примечания)</sup> — заглавные буквы зарезервированы за _классами виджетов._ 



## <a id="Классы_виджетов"></a>Классы виджетов

Каждый виджет принадлежит к определённому _классу._ Так же, как в некоторых объектно-ориентированных языках программирования класс реализует (обозначает) _тип_ объекта, класс виджета определяет тип этого виджета — поведение и набор характеристик, общих для всех виджетов данного класса. 




Примеры классов: 

*  `Button` — кнопка; 
*  `Entry` — однострочное поле ввода; 
*  `Menu` — меню; 
*  `Frame` — "фрейм" (окно, чьей единственной задачей обычно является хранение дочерних окон и управление их взаимным расположением (их _"геометрией"_)). 


Имена классов стандартных для Tk виджетов просто и однозначно связаны с _командами Tcl,_ предоставляемыми Tk для создания этих виджетов: команды назваются так же, как классы, но отличаются от них строчной "капитализацией", например: 




*  `Button` → `button` 
*  `Labelframe` → `labelframe` 

и т.д. 

Имена классов виджетов в Tk всегда начинаются с заглавной буквы. Это нужно для того, чтобы можно было отличать их от имён конкретных виджетов в спецификациях запросов к базе данных опций Tk, которые будут объяснены ниже. 



Нетрудно видеть, что можно взять имя любого виджета и заменить имя каждого (родительского) виджета в цепочке его классом. Например, для первой (слева) кнопки на нашем тулбаре, которая имеет имя 



    .mainframe.topf.tb0.bbox.b0

это будет: 

    Tkabber.Frame.Frame.Frame.ButtonBox.Button

что соответствует такой таблице: 

 ** Виджет **** Класс **
 
  .  Tkabber 
 
  .mainframe  Frame 
 
  .mainframe.topf  Frame 
 
  .mainframe.topf.tb0  Frame 
 
  .mainframe.topf.tb0.bbox  ButtonBox 
 
  .mainframe.topf.tb0.bbox.b0  Button 

Обратите внимание на класс основного окна (".") — он имеет значение "Tkabber" и вообще говоря совпадает с _именем приложения,_ о котором подробно рассказано [ниже](База_данных_опций_Tk.md#Имя_приложения). 



**Примечание:** класс виджета можно узнать при помощи команды [winfo](http://tcl.tk/man/tcl8.4/TkCmd/winfo.htm): 


    winfo class .path.to.the.widget

## <a id="Опции_виджетов"></a>Опции виджетов

Внешний вид и поведение виджетов контролируется их _опциями._ Свои опции виджеты получают от своих классов, например, все кнопки (виджеты класса Button) имеют совершенно одинаковый набор опций. _Значения_ же этих опций обычно разные, что и делает разные виджеты одного класса выглядящими и ведущими себя по-разному (сравните, к примеру, кнопку на тулбаре с кнопкой, закрывающей окно "О программе"). 






Опции виджетов тоже имеют имена. Эти имена как бы продолжают иерархию виджетов ещё на один уровень, например, имя опции, определяющей шрифт текста на нашей многострадальной кнопке тулбара таково: 



    .mainframe.topf.tb0.bbox.b0.font

### <a id="Откуда_виджеты_берут_значения_своих_опций"></a>Откуда виджеты берут значения своих опций?

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


1.  Значения по умолчанию, "прибитые гвоздями" в библиотеку Tk; 
1.  Значения из базы данных опций Tk; 
1.  Значения, динамически присваемые опциям в ходе выполнения программы. 

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



Важно понимать, что первые два источника являются "статичными" в том смысле, что Tk пользуется ими _только при создании_ виджета. 


## <a id="Классы_опций_виджетов"></a>Классы опций виджетов

Да, опции виджетов тоже имеют классы. 

![(!)](../images/Hammer.png) **Сделать:** развить 

# <a id="Структура"></a>Структура
База данных опций Tk отображает... 

![(!)](../images/Hammer.png) **Сделать:** развить 

# <a id="Подводные_камни"></a>Подводные камни
## <a id="Имя_приложения"></a>Имя приложения

![(!)](../images/Hammer.png) **Сделать:** написать 

# <a id="Примечания"></a>Примечания
<sup>1</sup> В именовании виджетов Tk используется тот же "трюк" (или "то же несоответствие", если угодно), которое присутствует в файловых системах Unix: в последних именем корневого каталога является "/", и этот же символ является разделителем имён в пути, однако в путевых именах файлов именем корневого каталога является пустая строка, а путевое имя начинается с разделителя: 





    / — корневой каталог
    /foo/bar.txt — путевое имя файла bar.txt в каталоге /foo
    ^разделитель

Нетрудно видеть, что в именах виджетов Tk то же самое происходит с символом ".": он одновременно является именем главного окна и разделителем частей имени виджета, поэтому в именах виджетов именем главного окна является пустая строка, а имя начинается с разделителя: 




    . — главное окно
    .mywindow.mybutton — виджет mybutton в окне .mywindow
    ^разделитель

<sup>2</sup> Строго говоря, в имени виджета можно использовать _любой допустимый символ [Unicode](http://www.unicode.org),_ кроме заглавных символов и точки. Например, вполне допустим код: 



    label .метко
    pack .метко
    .метко config -text {Медведы идут на udaff.com}

Более того, имена виджетов могут содержать пробелы: 

    label ". " ;# метка с именем, состоящим из одного пробела

Понятно, что как по причинам читабельности, так и удобства программирования/поддержки кода, так делать не стоит. Кроме того, в руководствах по Tk этот вопрос практически не освещён, а значит, ничего особо не гарантируется. Также совершенно непонятен вопрос взамодействия таких имён виджетов с базой данных опций Tk и — главное — взаимодействие последней с [XRDB](XRDB.md). 





Changes to wiki/ru/Блокировка_MRIM-спама.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79

80
81
82
83
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Блокировка_MRIM-спама/index.html)


# Блокировка MRIM-спама

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Пролог](#Пролог)
* [2 Экспозиция — опции главного меню](#Экспозиция_-_опции_главного_меню)
* [3 Завязка — добавление нового списка приватности](#Завязка_-_добавление_нового_списка_приватности)
* [4 Кульминация — редактирование созданного списка](#Кульминация_-_редактирование_созданного_списка)
* [5 Эпилог — предупреждения](#Эпилог_-_предупреждения)

# <a id="Пролог"></a>Пролог
Здесь по-простому (в картинках) рассказано, как настроить блокирование спама с
[MRIM](http://agent.mail.ru)-гейта средствами списков приватности на стороне
сервера, поддержка которых реализована в Ткаббере.

Блокировка основана на простых правилах:

1. Пропускать только сообщения от контактов "из ростера", а именно:
 * тех, на чьё присутствие мы подписаны;
 * контактов с взаимной подпиской на присутствие.

1. Блокировать _все_ сообщения с MRIM-гейта, не попавшие под предыдущий критерий.

Перед тем как продолжить чтение, нелишним будет совершить небольшой экскурс в
теорию (она очень доходчиво и в то же время кратко
[изложена](http://bombus-im.org/wiki/jabber/privacy_lists) на сайте Бомбуса;
единственное, что можно пропустить — это последнюю главу, где дан практический
пример).

# <a id="Экспозиция_-_опции_главного_меню"></a>Экспозиция — опции главного меню
Вначале следует убедиться, что интересующие нас опции главного меню,
относящиеся к обеспечению приватности, выглядят так, как показано на скриншоте:

![Опции главного меню](../images/Mrim-opts.png)

А именно: опция **Активировать списки при подключении** _выключена_. Это нужно
для того, чтобы Ткаббер не использовал свои встроенные списки приватности
вместо нашего, который мы добавим прямо сейчас.

# <a id="Завязка_-_добавление_нового_списка_приватности"></a>Завязка — добавление нового списка приватности
Для настройки требуется создать новый список приватности, активизировав пункт
основного меню: **Tkabber → Обеспечение приватности → Изменить правила
вручную**; в нашем примере новый список называется "mrim-allow-only-contacts":

![Окно со списками приватности](../images/Mrim-lists.png)

Этот список в том же диалоге должен быть сделан списком _по умолчанию_ и
_активным_ списком.

# <a id="Кульминация_-_редактирование_созданного_списка"></a>Кульминация — редактирование созданного списка
Далее переходим к редактированию списка. Вводим правила так, как указано на
скриншоте. Единственное, на что вам нужно обратить особое внимание, это
последнее правило, в котором фигурирует JID `mrim.007spb.ru` — у вас там должен
быть JID вашего MRIM-гейта, например, `mrim.jabber.ru`.

![Окно с активным списком приватности](../images/Mrim-allow-only-contacts.png)

Важно, чтобы правила следовали именно в таком порядке, как указано на
скриншоте, а именно, правило для JID MRIM-гейта должно идти после правил,
проверяющих состояние подписки на присутствие.

# <a id="Эпилог_-_предупреждения"></a>Эпилог — предупреждения
* Встроенные списки приватности Ткаббера перестают работать; в частности, это
  означает, что помещение контакта в **Невидимый** или **Игнорируемый** списки
  штатными средствами Ткаббера никакого реального эффекта иметь не будет. Если
  вам понадобилось кого-то заигнорить, придётся лезть в список Mrim'а и
  добавлять нужные правила туда.
* Спам в виде запросов на подписку _не_ блокируется этим способом; к сожалению,
  в текущей версии [ejabberd](http://ejabberd.jabber.ru), под управлением
  которого работают `jabber.ru` и `jabber.org` это
  [**невозможно по техническим причинам**](Спамодавка_списками_приватности.md).
  **Примечание:** этот вид спама успешно отсекается плагином
  [**Antispam**](Плагины.md#Antispam).
* Редактирование списков приватности вручную аналогично ручной настройке
  файрвола на компьютере — вы должны понимать возможные последствия. Поэтому

  очень рекомендуется ознакомиться с
  [теорией](http://www.xmpp.org/rfcs/rfc3921.html#privacy).

Спам давил [**kostix**](Участник_Kostix.md).

>














|
<
<

|

|
|
|
|
|

|
<
<
<
<


|
<

|

|
<
<


|
<
<

|

|
<


|
<
<
<

|

|
<
<


|
<
<
<
<
|
<
<
<
<
<
|
|
>
|
<

<
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17


18
19
20
21
22
23
24
25
26
27




28
29
30

31
32
33
34


35
36
37


38
39
40
41

42
43
44



45
46
47
48


49
50
51




52





53
54
55
56

57

[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Блокировка_MRIM-спама/index.html)


# Блокировка MRIM-спама

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Пролог](#Пролог)
* [2 Экспозиция — опции главного меню](#Экспозиция_-_опции_главного_меню)
* [3 Завязка — добавление нового списка приватности](#Завязка_-_добавление_нового_списка_приватности)
* [4 Кульминация — редактирование созданного списка](#Кульминация_-_редактирование_созданного_списка)
* [5 Эпилог — предупреждения](#Эпилог_-_предупреждения)

# <a id="Пролог"></a>Пролог
Здесь по-простому (в картинках) рассказано, как настроить блокирование спама с [MRIM](http://agent.mail.ru)-гейта средствами списков приватности на стороне сервера, поддержка которых реализована в Ткаббере. 



Блокировка основана на простых правилах: 

1.  Пропускать только сообщения от контактов "из ростера", а именно: 
 *  тех, на чьё присутствие мы подписаны; 
 *  контактов с взаимной подпиской на присутствие. 
 
1.  Блокировать _все_ сообщения с MRIM-гейта, не попавшие под предыдущий критерий. 

Перед тем как продолжить чтение, нелишним будет совершить небольшой экскурс в теорию (она очень доходчиво и в то же время кратко [изложена](http://bombus-im.org/wiki/jabber/privacy_lists) на сайте Бомбуса; единственное, что можно пропустить — это последнюю главу, где дан практический пример). 





# <a id="Экспозиция_-_опции_главного_меню"></a>Экспозиция — опции главного меню
Вначале следует убедиться, что интересующие нас опции главного меню, относящиеся к обеспечению приватности, выглядят так, как показано на скриншоте: 


![Опции главного меню](../images/Mrim-opts.png) 

А именно: опция **Активировать списки при подключении** _выключена_. Это нужно для того, чтобы Ткаббер не использовал свои встроенные списки приватности вместо нашего, который мы добавим прямо сейчас. 



# <a id="Завязка_-_добавление_нового_списка_приватности"></a>Завязка — добавление нового списка приватности
Для настройки требуется создать новый список приватности, активизировав пункт основного меню: **Tkabber → Обеспечение приватности → Изменить правила вручную**; в нашем примере новый список называется "mrim-allow-only-contacts": 



![Окно со списками приватности](../images/Mrim-lists.png) 

Этот список в том же диалоге должен быть сделан списком _по умолчанию_ и _активным_ списком. 


# <a id="Кульминация_-_редактирование_созданного_списка"></a>Кульминация — редактирование созданного списка
Далее переходим к редактированию списка. Вводим правила так, как указано на скриншоте. Единственное, на что вам нужно обратить особое внимание, это последнее правило, в котором фигурирует JID `mrim.007spb.ru` — у вас там должен быть JID вашего MRIM-гейта, например, `mrim.jabber.ru`. 




![Окно с активным списком приватности](../images/Mrim-allow-only-contacts.png) 

Важно, чтобы правила следовали именно в таком порядке, как указано на скриншоте, а именно, правило для JID MRIM-гейта должно идти после правил, проверяющих состояние подписки на присутствие. 



# <a id="Эпилог_-_предупреждения"></a>Эпилог — предупреждения
*  Встроенные списки приватности Ткаббера перестают работать; в частности, это означает, что помещение контакта в **Невидимый** или **Игнорируемый** списки штатными средствами Ткаббера никакого реального эффекта иметь не будет. Если вам понадобилось кого-то заигнорить, придётся лезть в список Mrim'а и добавлять нужные правила туда. 




*  Спам в виде запросов на подписку _не_ блокируется этим способом; к сожалению, в текущей версии [ejabberd](http://ejabberd.jabber.ru), под управлением которого работают `jabber.ru` и `jabber.org` это [невозможно по техническим причинам](Спамодавка_списками_приватности.md). **Примечание:** этот вид спама успешно отсекается плагином [Antispam](Плагины.md#Antispam). 





*  Редактирование списков приватности вручную аналогично ручной настройке файрвола на компьютере — вы должны понимать возможные последствия. Поэтому очень рекомендуется ознакомиться с [теорией](http://www.xmpp.org/rfcs/rfc3921.html#privacy). 

Спам давил [kostix](Участник_Kostix.md). 




Added wiki/ru/Быстрая_настройка_шрифтов.md.























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Установка_и_настройка_в_Ubuntu/index.html)


# Быстрая настройка шрифтов

Материал из Tkabber Wiki

[Установка и настройка в Ubuntu](Установка_и_настройка_в_Ubuntu.md)

    echo 'deb     http://people.debian.org/~sgolovan/debian/ lenny main'  |  sudo tee -a /etc/apt/sources.list
    echo 'deb-src http://people.debian.org/~sgolovan/debian/ lenny main'  |  sudo tee -a /etc/apt/sources.list && sudo apt-get update

введите пароль и продолжайте 

    sudo apt-get install tkabber tkabber-plugins tk8.5 libsnack2 tktray msttcorefonts

и это 

    sudo update-alternatives --config wish

нажмите цифорку соответствующую пункту "/usr/bin/wish8.5" а потом на Enter и используем. 

теперь ваш tkabber установлен и в убунте у него нормальные шрифты. и вам почти не пришлось ничего  читать :) 

Если вам не помогло это руководство, или у вас возникли вопросы, то смело нажимайте на "Обсуждение" вверху страницы. и опишите в чём именно у вас возникли трудности. 


Changes to wiki/ru/Гейты_во_вражеские_сети.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88


89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202

203

204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Гейты_во_вражеские_сети/index.html)


# Гейты во вражеские сети

Материал из Tkabber Wiki

> _Тятя, тятя, наши сети  
> Притащили мертвеца._

> _© А. С. Пушкин ["Утопленник"](http://www.lib.ru/LITRA/PUSHKIN/p2.txt)_

## <a id="toc"></a>Содержание

* [1 Введение](#Введение)
* [2 Регистрация на транспорте](#Регистрация_на_транспорте)
* [3 Некоторые гейты в другие сети](#Некоторые_гейты_в_другие_сети)
   * [3.1 ICQ](#ICQ)
      * [3.1.1 icq.jabber.ru](#icq.jabber.ru)
      * [3.1.2 Переезд на другой транспорт с минимумом головной боли](#Переезд_на_другой_транспорт_с_минимумом_головной_боли)
      * [3.1.3 Общедоступные транспорты в ICQ](#Общедоступные_транспорты_в_ICQ)
   * [3.2 MRIM](#MRIM)
   * [3.3 MSN](#MSN)
   * [3.4 Yahoo](#Yahoo)
   * [3.5 AIM](#AIM)
   * [3.6 IRC](#IRC)
   * [3.7 XMPP (свой среди чужих ;))](#XMPP_свой_среди_чужих_)
* [4 Проблемы при работе с гейтами](#Проблемы_при_работе_с_гейтами)
   * [4.1 Unavailable](#Unavailable)
   * [4.2 Low Level Network Error](#Low_Level_Network_Error)
   * [4.3 Unrecoverable Error (Remote Server Not Found)](#Unrecoverable_Error_Remote_Server_Not_Found)
   * [4.4 Disconnected by unknown reason](#Disconnected_by_unknown_reason)
   * [4.5 Temporary Error (Component 'msnlinker' is not connected to server)](#Temporary_Error_Component_msnlinker_is_not_connected_to_server)
   * [4.6 "Намерзание" участников в ростере](#Намерзание_участников_в_ростере)

# <a id="Введение"></a>Введение
Один из часто задаваемых на конференции вопросов: может ли Ткаббер "общаться" с
пользователями других сетей, например, ICQ, Yahoo, MSN и прочих. Строго говоря,
Ткаббер тут совершенно ни при чём, и вопрос не по адресу. Но поскольку мы люди
добрые, вопрос сей проясним :) К тому же неплохо иметь под рукой базу
работающих гейтов ;)

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

# <a id="Регистрация_на_транспорте"></a>Регистрация на транспорте
Начнём с того, что напомним о необходимости иметь зарегистрированный аккаунт в
той сети, с которой вы хотите "дружить". Если аккаунта нет, гейт за вас его
создать не сможет. Ставьте родной клиент и регистрируйтесь. Также имейте в
виду, что у большого количества IM-сетей работает регистрация на главном
Web-сайте.

На практике же аккаунт уже имеется, задача лишь — "подрубиться" к сети, чтобы
общаться с друзьями, упорно не хотящими переходить на джаббер (или понятия о
нём не имеющими). Процесс регистрации на гейте может варьироваться в некоторых
пределах, но основные шаги, которые нам надо предпринять, следующие:

1. Открыть Дискавери: вторая слева кнопка "Обзор служб" либо пункт меню
   **Службы → Обзор служб**;
1. Найти в списке доступных служб нужный вам гейт (например, icq.jabber.ru) и
   открыть его двойным кликом;
1. Сделать двойной клик на элементе "Register";
1. В появившемся окошке ввести информацию о вашем аккаунте в сети, к которой вы
   коннектитесь:
   * Для ICQ это будет UIN и пароль,
   * для AIM — его логин и пароль или UIN вашей "аськи" и её пароль,
   * Для MSN — ваш Windows Live ID (в девичестве Microsoft Passport, он же .NET
     Passport, в общем, ваше мыло, на которое вы зарегистрированы в любых
     службах микрософта), ник, под которым вас будут видеть собеседники, и,
     само собой, пароль,
   * Для Yahoo — ваш ID (то, что расположено до "собачки") и пароль,
   * Для IRC — читайте [**ниже**](#IRC) (регистрация там
     опциональна).
1. Если всё введено правильно, и не возникло никаких ошибок, появляется окошко,
   извещающее нас об успешной регистрации. Жмём Ok.
1. Появится запрос подписки от имени выбранного Вами гейта, соответственно даем
   ему подписку и он повляется в ростере. Делаем правый клик на нём и выбираем
   в меню "Log in".
1. В этот момент гейт подключается от Вашего имени к "вражеской сети" и
   получает список ваших контактов, после чего отправляет их список вам.
   * Классический вариант(старые гейты): в ростере появляется куча ваших
     контактов из этой сети в виде 1234567@icq.jabber.ru, которую надо теперь
     как-то упорядочить и вообще выяснить, "ху из ху". Вытягивание ников
     асикушников — больное место Ткаббера, но некоторую помощь может оказать
     такой трюк: делаем правый клик на контакте и выбираем "Показать инфо".
     Появляется окошко vcard пользователя, и если подождать немного, то в


     подавляющем большинстве случаев "вытянется" как минимум ник. Закрываем
     инфо, и теперь можно редактировать контакт: правый клик → **Редактировать
     элемент**. Ник юзверя автоматически появится в соответствующем поле.
     Назначаем нужную группу (для разделения вложенных групп пользуйтесь двумя
     двоеточиями: "Друзья::Институт") и жмём Ок.
   * Современный вариант(Spectrum Transport): для того, чтобы практически
     прозрачно получить свои контакты и не терять время на выяснение их ников и
     групп, необходимы следующие условия:
      * Tkabber из [SVN](SVN_disclaimer.md) ревизии 1975 и выше.
      * Плагин autosubscribe из
        [репозитория 3rd-party](http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/autosubscribe/)
1. При использовании современного варианта - сразу после регистрации гейт
   вышлет список контактов и их групп посредством специального
   [расширения](http://xmpp.org/extensions/xep-0144.html) XMPP-протокола, а
   Ткаббер отобразит форму со списком их(контактов) имен и галочек, которые
   необходимо соответственно выставить и подтвердить добавление контактов. Если
   включен плагин autosubscribe, то в этот же момент все эти контакты окажутся
   в нашем ростере, строго под теми никами и в тех же группах, по которым они
   были отсортированы Вами при использовании "официальных" клиентов "вражеских
   сетей". ![(!)](../images/Hammer.png) **Сделать:**  Исправить недочеты
   плагина autosubscribe В случае если плагин не установлен, как и в
   "классическом" варианте посыпятся запросы подписки, но после подтверждения
   их ники и группы все равно будут правильными сразу.
1. Помимо "Register" в дереве транспорта есть и такие полезные опции как Uptime
   (время работы) и Version (выдаёт версию программы-гейта; при проблемах с
   транспортами может помочь вам разобраться в их причинах: например,
   устаревшая версия гейта).

Диско позволяет лазить и регистрироваться на любом общедоступном сервере. Вам
нужно только ввести в адресную строку имя сервера или сервиса, например:
`jabber.anywise.com`, `icq.jabbe.net.ru`. Дальнейшие телодвижения ничем не
отличаются от описанных выше.

# <a id="Некоторые_гейты_в_другие_сети"></a>Некоторые гейты в другие сети
## <a id="ICQ"></a>ICQ

На данный момент (зима 2010) известно несколько разных icq-транспортов. Каждый
обладает своими достоинствами и недостатками, например, в плане поддерживаемых
возможностей icq-протокола. Соответственно, и "глюками" они обладают своими
уникальными, и желательно разбираться, что icq-транспорт - это такая же
программа, как и Tkabber, только запущена у кого-то на сервере, и так же как и
Tkabber, в ней могут быть ошибки, а разработчики, если им грамотно сообщать об
ошибках - могут их устранить.

* [JIT](http://sourceforge.net/projects/jit/) - самый старый из "живых"
  icq-транспорт. Если на запрос версии ваш транспорт отвечает нечто типа
  `Jabber ICQ Transport by Lukas Jabber: Jabberd 1.1.1 stable / with real
  threads / by Lukas Karwacki ICQ: 1.1.6 (Linux 2.6.16.13-4-smp)` - значит у
  вас именно он. Имел массу модификаций от разных авторов, наиболее годная к
  употреблению была версия 1.2 от администраторов mytlt.ru. В настоящее время
  известных "живых" модификаций нету, пользоваться этим транспортом крайне не
  рекомендуется.

    Ключевая возможность - поиск ICQ-пользователей. В версии от mytlt - частично
    поддерживаются ICQ X-Statuses(прием); не поддерживаются message typing
    notifications, аватары, передача файлов.

* [PyICQ-t](http://groups.google.com/group/py-transports) - более молодой,
  более требовательный к ресурсам сервера транспорт, однако и обладающий
  бОльшими возможностями - в последнем релизе 0.8.1.5 имеется полная поддержка
  ICQ X-Statuses(и прием и передача, гибкая настройка), typing notifications,
  delivery confirmations, аватары, синхронизация vcard и много чего еще.
  Последний релиз значительно повысил стабильность транспорта - патчи от
  коммерческой конторы сделали его очень стабильным - поэтому даже если у вас
  0.8.1.4, то желательно обновиться на 0.8.1.5. В настоящее время не
  развивается, но собственно серьезных багов за последней версией не замечено и
  это наиболее рекомендуемый транспорт, если надо чтоб "поставил и забыл".

* [Spectrum](http://spectrum.im) - новейший транспорт на базе libpurple,
  библиотеки, являющейся основой Pidgin - мультипротокольного клиента.
  Разрабатывается в настоящий момент, в том числе авторами PyICQ-t и pidgin.
  Основное преимущество - умеет транспорты во многие сети "в одном флаконе" -
  aim, facebook, gg, icq, irc, msn, myspace, qq, simple, xmpp, yahoo, twitter,
  и еще куда-то. Умеет импортировать контакты с никами и даже группами одним
  нажатием. Пока нет <s>поддержки x-статусов и</s> подтверждения доставки, но
  вполне возможно в ближайшее время будет. Рекомендуется использовать всем, кто
  хочет помогать развивать транспорты, так как этот транспорт разрабатывается в
  данный момент, автор охотно отвечает на вопросы, исправляет ошибки.

* менее популярные виды - встроенный в
  [Openfire](http://www.igniterealtime.org/projects/openfire/) транспорт и
  встроенный в коммерческую версию
  [ejabberd](http://www.process-one.net/en/solutions/imgateways/). Имеют не так
  много пользователей и отзывов, потому ни плохого, ни хорошего о них писать
  здесь не будем.

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

### <a id="icq.jabber.ru"></a>icq.jabber.ru

"Впереди планеты всей" раньше шёл гейт `icq.jabber.ru`, однако,

> *этот гейт прекратил работу с 1 июля 2007 года.* Подробности — [здесь](http://www.jabber.ru/node/379).

### <a id="Переезд_на_другой_транспорт_с_минимумом_головной_боли"></a>Переезд на другой транспорт с минимумом головной боли

Компания AOL здорово позаботилась о пользователях, запретив хранить список
контактов самостоятельно, потому требовавшиеся на старых версиях JIT танцы с
бубном по сохранению и переименованию контактов более не нужны. Достаточно:

* отрегистрироваться на старом транспорте и удалить его из контактов.
* убедившись, что транспорт неактивен, можно выделить всех icq-контактов в
  группу по маске \*@icq.bla-bla.ru (Tkabber → Контакты → Добавить группу по
  регулярному выражению JID... → ".\*@icq\\.bla-bla\\.ru") и удалить их все
  разом ("Удалить все контакты в группе..." на заголовке группы)
* зарегистрироваться на новом транспорте, и повторить процедуры, описанные
  выше, необходимые для регистрации.

### <a id="Общедоступные_транспорты_в_ICQ"></a>Общедоступные транспорты в ICQ

(частично взято [отсюда](http://lists.jabber.ru/pipermail/jabber-users/2007-February/003062.html)):


*  `jit.mytlt.ru` (JIT 1.2 - теоретически, наиболее надежный)

*  `icq.jabber.sib.ru` (JIT)
*  `icq.jabber.org.ru` (PyICQt)
*  `icq.jabbe.net.ru` (PyICQt)
*  `icq.udaff.com` (JIT)
*  `picq.udaff.com` (PyICQt)
*  `pyicq.jabber.te.ua` (PyICQt)
*  `icq.sudouser.ru` (PyICQt)

Большой список ICQ-гейтов поддерживается [на wiki Bombus'а](http://bombus-im.org/wiki/howto/howto_icq).

Существуют гейты в ICQ и на "буржуйских" серверах. Для российских пользователей
они, как водится, не подходят по той простой причине, что не поддерживают наших
кодировок.

## <a id="MRIM"></a>MRIM

На данный момент (апрель 2007 года) в мире насчитывается по крайней мере два
гейта, позволяющих получать спам от пользователей Mail.Ru Instant Messenger,
кратко — MRIM. Зарегистрироваться на них можно по следующим адресам:

* `mrim.jabber.ru`
* `mrim.udaff.com`

Нелишним будет сразу же порекомендовать
[**дополнительную литературу**](Блокировка_MRIM-спама.md) по теме.

## <a id="MSN"></a>MSN

Можем предложить

* `msn.jabber.anywise.com` (тоже иногда глючит, но не так откровенно).
* `msn.jabber.kiev.ua`
* `msn.jaim.at`

## <a id="Yahoo"></a>Yahoo

* `yahoo.draugr.de` отлично работает, хотя и забугорный. Гейт логинится в сеть
  яху сам, с кодировками проблем нет, кроме того, что в пользователи в родном
  Yahoo! Messenger видят статусное сообщение кракозяблами.

Приветствуются адреса работающих транспортов.

## <a id="AIM"></a>AIM

## <a id="IRC"></a>IRC

При регистрации на IRC-транспорте у вас есть возможность задать кодировки для
разных IRC-серверов, к которым вы обычно коннектитесь. Читайте помощь,
выводящуюся при двойном клике на "Register". Однако заходить на конференции вы
можете и без регистрации. Для этого щёлкните на "Join conference" и в поле
"Группа" введите имя комнаты и имя IRC-сервера в таком формате:
**mycoolroom%irc.server.org**, а в поле "Сервер" — имя гейта, через который вы
собираетесь общаться в "ирке". ![(!)](../images/Hammer.png) **Сделать:**
Выяснить, работает ли тут поле "Пароль", и если да, то для чего служит. По
идее, для комнаты, потому что для ника пароль отдаётся Никсерву, см. ниже.

Некоторые гейти в IRC:

* <s>`irc.e.jabber.ru` — хитро спрятанный IRC-гейт сервера jabber.ru. Его не
  видно в Диско, но он существует и очень даже работает.</s> Мир его праху. В
  эпоху массового отстрела транспортов на jabber.ru ему не помогла даже хитрая
  спрятанность (уж админы-то не могли про него не знать :)).
* `irc.jabber.kiev.ua` — гейт на украинском джаббер-сервере.
* `irc.jabe.ru` — гейт компании, которая хостит нашу вики.

В силу разных обстоятельств случается, что тот или иной гейт не работает. Это
сразу видно по абсолютно пустому окну канала, на который вы якобы вошли. В этом
случае просто попробуйте другой гейт. Учитывайте также нетсплиты — временные
разъединения серверов, формирующих IRC-сеть. Если вы и собеседник, нужный вам,
подключены к разным серверам, то при нетсплите вы не сможете общаться. Чтобы
избежать этого, укажите нужный IRC-сервер при заполнении поля "Группа".

Бывает, что NickServ спрашивает ваш пароль (если, конечно, ваш ник
зарегистрирован). Его запрос появляется в отдельном окне или табе. Попытка
отослать ему стандартную команду **/identify password** ни к чему не приводит.
Однако всё получается, если просто убрать слэш и оправить Никсерву только
**identify password**. Это происходит, например, в сети
[WeNet](http://www.wenet.ru) (irc.wenet.ru). Но как показывает практика, не
везде такой подход срабатывает. Например, если проделать то же самое при
идентификации в сети [RusNet](http://www.rus-net.org/) (irc.rusnet.ru), Никсерв
изругается и скажет в ответ на команду что-то вроде следующего:

> [Вск Ноя 11 19:50]\<nickserv!irc.rusnet.ru> NOTICE: Use /chanserv, not /MSG chanserv

Оно и верно: написав в приват Никсерву запрос об аутентификации, мы просто
послали ему сообщение (как бы командой **/msg identify password**). Как видно,
некоторые сервера требуют прямой команды. В этом случае следует "завернуть" её
в "бумажку" quote, которая поможет команде дойти до сервера в неизменном виде:
**/quote nickserv identify your\_password**.

Вот ещё пара полезных команд:

* **/quote mode \#channel +o nick** — дать "опа" участнику nick. Ровно таким же
  образом должны работать и остальные аналогичные команды: -o, +v, -v, +h, -h,
  +b, -b. Обратите внимание, что раздача привилегий посредством меню MUC,
  вызываемого правым кликом на нике участника, ничего не даст, потому что IRC
  просто не поймёт, что вы ему толкуете.
* **/quote chanserv help**, **/quote nickserv help** и **/quote memoserv help**
  выведут в привате список команд, которые можно данному серву отсылать.
  Собственно, объединив ваши собственные знания об IRC и только что описанный
  трюк с quote, вы могли бы и сами об этом догадаться, но уж пусть эта
  подсказка будет.
* Если набрать просто **/quote help**, то irc-сервер, к которому вы
  присоединены, выдаст список команд для этого сервера.

Дадим ещё один совет на тему общения с сервами. Обычно их имя в интерпретации
джаббер-протокола выглядит примерно таким образом:
**chanserv!irc.rusnet.ru@irc.jabberserver.ru**. Изменяя необходимые параметры
при открытии чата с интересующим сервом, можно общаться с любым из них, даже не
коннектясь к irc-серверу — гейт сам всё отошлёт куда надо и доставит вам ответ.
Это полезно, если вы хотите узнать, какие команды поддерживает интересующий вас
Ник- или Чансерв. Все эти сервы довольно полезны, однако не все из них скромны.
Например, wenet!irc.wenet.ru довёл вашего покорного слугу своими постоянными
сообщениями до того, что тот занёс его JID в виде
wenet!irc.wenet.ru@irc.e.jabber.ru в игнор (это типа намёк, что нужно делать в
подобных ситуациях ;)).

Работы по исследованию irc-гейтов будут продолжаться; тем не менее, если у вас
есть что добавить в эту статью, никто этого не запрещает.

## <a id="XMPP_свой_среди_чужих_"></a>XMPP (свой среди чужих ;))

Позволяет подключить XMPP учётную запись на другом сервере. Можно использовать
как альтернативу мультилогина. Общедоступные транспорты замечены на:

* `xmpp.jrudevels.org`
* `gtalk.jrudevels.org` — для подключения учётной записи GTalk
* `j2j.udaff.com`

**Будьте осторожны!** Не регистрируйте активную учётную запись гостевой в самой
себе. После этого не сможете зайти в неё. Не создавайте циклов из учётных
записей, например, user1@server1.org является гостевым для user2@server2.org, и
одновременно user2@server2.org является гостевым для user1@server1.org. Вы
можете придумать более сложные циклические схемы, воздержитесь и от них.

# <a id="Проблемы_при_работе_с_гейтами"></a>Проблемы при работе с гейтами
Поскольку работа других сетей чаще всего основана на закрытых протоколах, не
следует удивляться и огорчаться, если транспорты подглючивают, падают и просто
не работают. Отнюдь не помогает их работе и отношение админов Jabber-серверов к
"иноземцам" именно как к иноземцам: даже в самых доброжелательных ответах
админов (если их удаётся получить) сквозит презрение к "асикушникам" и прочему
плебсу. Чаще всего разруливать ситуацию приходится самостоятельно, причём
радикальным способом — сменой гейта. Как и на что их менять, рассказано выше, а
здесь мы попробуем дать список ошибок, которые могут возникнуть, и их
расшифровку. Ошибку можно прочитать в тултипе, появляющемся, если навести мышь
на транспорт, находящийся у вас в ростере.

## <a id="Unavailable"></a>Unavailable

Строго говоря, это не ошибка, а состояние сервиса: "Недоступен". Однако если вы
видите, что кроме этого ничего больше в той же строке не написано, скорее
всего, вы либо забыли залогиниться на гейт, либо он сам как-то отвалился.
Решение проблемы простое: правый клик, и выбрать Log in.

## <a id="Low_Level_Network_Error"></a>Low Level Network Error

Эта надпись иногда появляется в качестве комментария к вышеупомянутому
состоянию Unavailable. Перевод: "низкоуровневая ошибка сети". Замечена при
работе со старыми версиями JIT, имевшими ограничение в 1024 одновременных
соединения. В настоящее время наверняка является сигналом к тому, что вам пора
сменить свой ICQ-транспорт на что-то более свежее и стабильное.

## <a id="Unrecoverable_Error_Remote_Server_Not_Found"></a>Unrecoverable Error (Remote Server Not Found)

Как видно из названия, эта ошибка сообщает нам о том, что удалённый сервер не
найден. Причины могут быть разными: начиная с очень паршивой связи гейта с
сервером вражеской сети и заканчивая обычным падением этого самого сервера.
Если вы обнаружили эту ошибку, вернувшись к компьютеру после долгого
отсутствия, попробуйте перелогиниться на транспорте — вдруг связь уже
наладилась. Если ничего не получается, ждите — <s>за вами придут</s>
когда-нибудь она наладится. Попингуйте сервер: станет ясно, жив он или нет.

## <a id="Disconnected_by_unknown_reason"></a>Disconnected by unknown reason

Серия ошибок py-transports (pyicq-t, pymsn-t, и т.д.) - большинство их глюков
содержит эти слова ![(!)](../images/Hammer.png) **Сделать:**  дописать
подробные примеры. Обычно достаточно перелогиниться на транспорте.

## <a id="Temporary_Error_Component_msnlinker_is_not_connected_to_server"></a>Temporary Error (Component 'msnlinker' is not connected to server)

Судя по всему, некий компонент транспорта MSN, необходимый для полноценной
работы, не подключён к серверу. Результат плачевен: при попытке коннекта к
серверу от транспорта приходит ответ такого типа: "Sorry. You do not appear to
be registered with this transport. Please register and try again. If you are
having trouble registering please contact your Jabber administrator". Иными
словами, транспорт в упор вас не знает. Прежде чем внять этой просьбе
зарегистрироваться, имеет смысл подождать, ведь мы знаем, что это глюк сервера,
а не отсутствие регистрации. Обычно через некоторое время всё само собой
налаживается. Если ничего не налаживается, просьба жаловаться не нам, а
хозяевам транспорта.

## <a id="Намерзание_участников_в_ростере"></a>"Намерзание" участников в ростере

Такая проблема часто возникает при работе с гейтами ICQ, когда Ткаббер не
выключается долгое время, и за это время происходили дисконнекты. Вы общаетесь
себе, общаетесь; мама зовёт вас обедать, вы отходите от компа, потом снова
садитесь за него; вечером вы идёте в гости, по возвращении снова лезете в
Ткаббер; часв в четыре утра ложитесь спать, на следующий день общаетесь снова,
и всё это время он вроде бы нормально работает. Но где-нибудь на третий день вы
вдруг обращаете внимание на то, что некоторые ваши друзья из аськи против
обыкновения тоже сидят в интернете круглосуточно, причём не наблюдается никаких
автоэвеев. Может случиться и так, что вы обнаруживаете транспорт упавшим,
однако эти товарищи несмотря ни на что упорно не желают исчезать из ростера.
Разлогинивание от гейта не помогает, а ситуацию разруливает лишь полный
перелогин Ткаббера. Что же при этом происходит?
![(!)](../images/Hammer.png) **Сделать:** Расспросить авторов гейта либо
авторов Ткаббера либо просто очень умных людей либо волшебников и написать тут.

>





<
|
<
|






|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|


|
<
<
<
<

|
<
<
<
<


|
<
<
<
<

|
<
<
<

|
<
|
<
|
|
<
|
|
<
|
<
<
|
|
<
<
<
<
<
<
<
<
<
<
|
<
<
|
>
>
|
<
<
<
<
<
|
<
|
<
|
|
|
<
<
<
<
<
<
<
<
<
<
|
<
<
<

|
<
<
<




|
<
<
<
<
<
<

<
|
<
<
<
<
<
<

|
<
<

<
|
<
<
<
<
<
<
<
<

<
|
<
<
<
<
<
<
<
<

<
|
<
<
<
<

|
<
<



|

|



|
<
<

|
|
<
<
<
|
<



|

>
|
>
|
|
|
|
|
|
|

|

|
<
<



|
<
<

|
|

|
<



|

|
|
|



|
<
<

|





|
<
<
<
<
<
<
<
<

|

<
|
<
<
|
|

|
<
<
<
<
<

|
<
<
<
<
<
<
<
<

|

|
<
<
<
<

|

<
|
<
<
<
<
|
<
<
<
|
<

|
<
<
<
<
<
<
<
<
<
<

|
<



|
<

|
|
|

|
<
<
<
<


|
<
<
<
<
<
<
<
<
<



|
<
<
<



|
<
<
<
<



|
<
<
<
<
<
<



|
<
<



|
<
<
<
<
<
<
<
<
<



|
|
|
<
<
<
<
<
<
<
<
<
<
<
1
2
3
4
5
6
7

8

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35




36
37




38
39
40




41
42



43
44

45

46
47

48
49

50


51
52










53


54
55
56
57





58

59

60
61
62










63



64
65



66
67
68
69
70






71

72






73
74


75

76








77

78








79

80




81
82


83
84
85
86
87
88
89
90
91
92


93
94
95



96

97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115


116
117
118
119


120
121
122
123
124

125
126
127
128
129
130
131
132
133
134
135
136


137
138
139
140
141
142
143
144








145
146
147

148


149
150
151
152





153
154








155
156
157
158




159
160
161

162




163



164

165
166










167
168

169
170
171
172

173
174
175
176
177
178




179
180
181









182
183
184
185



186
187
188
189




190
191
192
193






194
195
196
197


198
199
200
201









202
203
204
205
206
207











[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Гейты_во_вражеские_сети/index.html)


# Гейты во вражеские сети

Материал из Tkabber Wiki


Притащили мертвеца. 

["Утопленник"](http://www.lib.ru/LITRA/PUSHKIN/p2.txt)

## <a id="toc"></a>Содержание

* [1 Введение](#Введение)
* [2 Регистрация на транспорте](#Регистрация_на_транспорте)
* [3 Некоторые гейты в другие сети](#Некоторые_гейты_в_другие_сети)
 * [3.1 ICQ](#ICQ)
  * [3.1.1 icq.jabber.ru](#icq.jabber.ru)
  * [3.1.2 Переезд на другой транспорт с минимумом головной боли](#Переезд_на_другой_транспорт_с_минимумом_головной_боли)
  * [3.1.3 Общедоступные транспорты в ICQ](#Общедоступные_транспорты_в_ICQ)
 * [3.2 MRIM](#MRIM)
 * [3.3 MSN](#MSN)
 * [3.4 Yahoo](#Yahoo)
 * [3.5 AIM](#AIM)
 * [3.6 IRC](#IRC)
 * [3.7 XMPP (свой среди чужих ;))](#XMPP_свой_среди_чужих_)
* [4 Проблемы при работе с гейтами](#Проблемы_при_работе_с_гейтами)
 * [4.1 Unavailable](#Unavailable)
 * [4.2 Low Level Network Error](#Low_Level_Network_Error)
 * [4.3 Unrecoverable Error (Remote Server Not Found)](#Unrecoverable_Error_Remote_Server_Not_Found)
 * [4.4 Disconnected by unknown reason](#Disconnected_by_unknown_reason)
 * [4.5 Temporary Error (Component 'msnlinker' is not connected to server)](#Temporary_Error_Component_msnlinker_is_not_connected_to_server)
 * [4.6 "Намерзание" участников в ростере](#Намерзание_участников_в_ростере)

# <a id="Введение"></a>Введение
Один из часто задаваемых на конференции вопросов: может ли Ткаббер "общаться" с пользователями других сетей, например, ICQ, Yahoo, MSN и прочих. Строго говоря, Ткаббер тут совершенно ни при чём, и вопрос не по адресу. Но поскольку мы люди добрые, вопрос сей проясним :) К тому же неплохо иметь под рукой базу работающих гейтов ;) 





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





# <a id="Регистрация_на_транспорте"></a>Регистрация на транспорте
Начнём с того, что напомним о необходимости иметь зарегистрированный аккаунт в той сети, с которой вы хотите "дружить". Если аккаунта нет, гейт за вас его создать не сможет. Ставьте родной клиент и регистрируйтесь. Также имейте в виду, что у большого количества IM-сетей работает регистрация на главном Web-сайте. 





На практике же аккаунт уже имеется, задача лишь — "подрубиться" к сети, чтобы общаться с друзьями, упорно не хотящими переходить на джаббер (или понятия о нём не имеющими). Процесс регистрации на гейте может варьироваться в некоторых пределах, но основные шаги, которые нам надо предпринять, следующие: 




1.  Открыть Дискавери: вторая слева кнопка "Обзор служб" либо пункт меню **Службы → Обзор служб**; 

1.  Найти в списке доступных служб нужный вам гейт (например, icq.jabber.ru) и открыть его двойным кликом; 

1.  Сделать двойной клик на элементе "Register"; 
1.  В появившемся окошке ввести информацию о вашем аккаунте в сети, к которой вы коннектитесь: 

 *  Для ICQ это будет UIN и пароль, 
 *  для AIM — его логин и пароль или UIN вашей "аськи" и её пароль, 

 *  Для MSN — ваш Windows Live ID (в девичестве Microsoft Passport, он же .NET Passport, в общем, ваше мыло, на которое вы зарегистрированы в любых службах микрософта), ник, под которым вас будут видеть собеседники, и, само собой, пароль, 


 *  Для Yahoo — ваш ID (то, что расположено до "собачки") и пароль, 
 *  Для IRC — читайте [ниже](Гейты_во_вражеские_сети.md#IRC) (регистрация там опциональна). 










 


1.  Если всё введено правильно, и не возникло никаких ошибок, появляется окошко, извещающее нас об успешной регистрации. Жмём Ok. 
1.  Появится запрос подписки от имени выбранного Вами гейта, соответственно даем ему подписку и он повляется в ростере. Делаем правый клик на нём и выбираем в меню "Log in". 
1.  В этот момент гейт подключается от Вашего имени к "вражеской сети" и получает список ваших контактов, после чего отправляет их список вам. 
 *  Классический вариант(старые гейты): в ростере появляется куча ваших контактов из этой сети в виде 1234567@icq.jabber.ru, которую надо теперь как-то упорядочить и вообще выяснить, "ху из ху". Вытягивание ников асикушников — больное место Ткаббера, но некоторую помощь может оказать такой трюк: делаем правый клик на контакте и выбираем "Показать инфо". Появляется окошко vcard пользователя, и если подождать немного, то в подавляющем большинстве случаев "вытянется" как минимум ник. Закрываем инфо, и теперь можно редактировать контакт: правый клик → **Редактировать элемент**. Ник юзверя автоматически появится в соответствующем поле. Назначаем нужную группу (для разделения вложенных групп пользуйтесь двумя двоеточиями: "Друзья::Институт") и жмём Ок. 





 *  Современный вариант(Spectrum Transport): для того, чтобы практически прозрачно получить свои контакты и не терять время на выяснение их ников и групп, необходимы следующие условия: 

  *  Tkabber из [SVN](SVN_disclaimer.md) ревизии 1975 и выше. 

  *  Плагин autosubscribe из [репозитория 3rd-party](http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/autosubscribe/) 

1.  При использовании современного варианта - сразу после регистрации гейт вышлет список контактов и их групп посредством специального [расширения](http://xmpp.org/extensions/xep-0144.html|) XMPP-протокола, а Ткаббер отобразит форму со списком их(контактов) имен и галочек, которые необходимо соответственно выставить и подтвердить добавление контактов. Если включен плагин autosubscribe, то в этот же момент все эти контакты окажутся в нашем ростере, строго под теми никами и в тех же группах, по которым они были отсортированы Вами при использовании "официальных" клиентов "вражеских сетей". ![(!)](../images/Hammer.png) **Сделать:**  Исправить недочеты плагина autosubscribe В случае если плагин не установлен, как и в "классическом" варианте посыпятся запросы подписки, но после подтверждения их ники и группы все равно будут правильными сразу. 










1.  Помимо "Register" в дереве транспорта есть и такие полезные опции как Uptime (время работы) и Version (выдаёт версию программы-гейта; при проблемах с транспортами может помочь вам разобраться в их причинах: например, устаревшая версия гейта). 




Диско позволяет лазить и регистрироваться на любом общедоступном сервере. Вам нужно только ввести в адресную строку имя сервера или сервиса, например: `jabber.anywise.com`, `icq.jabbe.net.ru`. Дальнейшие телодвижения ничем не отличаются от описанных выше. 




# <a id="Некоторые_гейты_в_другие_сети"></a>Некоторые гейты в другие сети
## <a id="ICQ"></a>ICQ

На данный момент (зима 2010) известно несколько разных icq-транспортов. Каждый обладает своими достоинствами и недостатками, например, в плане поддерживаемых возможностей icq-протокола. Соответственно, и "глюками" они обладают своими уникальными, и желательно разбираться, что icq-транспорт - это такая же программа, как и Tkabber, только запущена у кого-то на сервере, и так же как и Tkabber, в ней могут быть ошибки, а разработчики, если им грамотно сообщать об ошибках - могут их устранить. 








*  [JIT](http://sourceforge.net/projects/jit/) - самый старый из "живых" icq-транспорт. Если на запрос версии ваш транспорт отвечает нечто типа `Jabber ICQ Transport by Lukas Jabber: Jabberd 1.1.1 stable / with real threads / by Lukas Karwacki ICQ: 1.1.6 (Linux 2.6.16.13-4-smp)` - значит у вас именно он. Имел массу модификаций от разных авторов, наиболее годная к употреблению была версия 1.2 от администраторов mytlt.ru. В настоящее время известных "живых" модификаций нету, пользоваться этим транспортом крайне не рекомендуется. 







Ключевая возможность - поиск ICQ-пользователей. В версии от mytlt - частично поддерживаются ICQ X-Statuses(прием); не поддерживаются message typing notifications, аватары, передача файлов. 




*  [PyICQ-t](http://groups.google.com/group/py-transports) - более молодой, более требовательный к ресурсам сервера транспорт, однако и обладающий бОльшими возможностями - в последнем релизе 0.8.1.5 имеется полная поддержка ICQ X-Statuses(и прием и передача, гибкая настройка), typing notifications, delivery confirmations, аватары, синхронизация vcard и много чего еще. Последний релиз значительно повысил стабильность транспорта - патчи от коммерческой конторы сделали его очень стабильным - поэтому даже если у вас 0.8.1.4, то желательно обновиться на 0.8.1.5. В настоящее время не развивается, но собственно серьезных багов за последней версией не замечено и это наиболее рекомендуемый транспорт, если надо чтоб "поставил и забыл". 










*  [Spectrum](http://spectrum.im) - новейший транспорт на базе libpurple, библиотеки, являющейся основой Pidgin - мультипротокольного клиента. Разрабатывается в настоящий момент, в том числе авторами PyICQ-t и pidgin. Основное преимущество - умеет транспорты во многие сети "в одном флаконе" - aim, facebook, gg, icq, irc, msn, myspace, qq, simple, xmpp, yahoo, twitter, и еще куда-то. Умеет импортировать контакты с никами и даже группами одним нажатием. Пока нет <s>поддержки x-статусов и</s> подтверждения доставки, но вполне возможно в ближайшее время будет. Рекомендуется использовать всем, кто хочет помогать развивать транспорты, так как этот транспорт разрабатывается в данный момент, автор охотно отвечает на вопросы, исправляет ошибки. 










*  менее популярные виды - встроенный в [Openfire](http://www.igniterealtime.org/projects/openfire/) транспорт и встроенный в коммерческую версию [ejabberd](http://www.process-one.net/en/solutions/imgateways/). Имеют не так много пользователей и отзывов, потому ни плохого, ни хорошего о них писать здесь не будем. 





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



### <a id="icq.jabber.ru"></a>icq.jabber.ru

"Впереди планеты всей" раньше шёл гейт `icq.jabber.ru`, однако, 

_этот гейт прекратил работу с 1 июля 2007 года. _ Подробности — [здесь](http://www.jabber.ru/node/379). 

### <a id="Переезд_на_другой_транспорт_с_минимумом_головной_боли"></a>Переезд на другой транспорт с минимумом головной боли

Компания AOL здорово позаботилась о пользователях, запретив хранить список контактов самостоятельно, потому требовавшиеся на старых версиях JIT танцы с бубном по сохранению и переименованию контактов более не нужны. Достаточно: 



*  отрегистрироваться на старом транспорте и удалить его из контактов. 
*  убедившись, что транспорт неактивен, можно выделить всех icq-контактов в группу по маске \*@icq.bla-bla.ru (Tkabber → Контакты → Добавить группу по регулярному выражению JID... → ".\*@icq\\.bla-bla\\.ru") и удалить их все разом ("Удалить все контакты в группе..." на заголовке группы) 



*  зарегистрироваться на новом транспорте, и повторить процедуры, описанные выше, необходимые для регистрации. 


### <a id="Общедоступные_транспорты_в_ICQ"></a>Общедоступные транспорты в ICQ

(частично взято [отсюда](http://lists.jabber.ru/pipermail/jabber-users/2007-February/003062.html)): 

* 
 *  `jit.mytlt.ru` (JIT 1.2 - теоретически, наиболее надежный) 
 
*  `icq.jabber.sib.ru` (JIT) 
*  `icq.jabber.org.ru` (PyICQt) 
*  `icq.jabbe.net.ru` (PyICQt) 
*  `icq.udaff.com` (JIT) 
*  `picq.udaff.com` (PyICQt) 
*  `pyicq.jabber.te.ua` (PyICQt) 
*  `icq.sudouser.ru` (PyICQt) 

Большой список ICQ-гейтов поддерживается [на wiki Bombus'а](http://bombus-im.org/wiki/howto/howto_icq). 

Существуют гейты в ICQ и на "буржуйских" серверах. Для российских пользователей они, как водится, не подходят по той простой причине, что не поддерживают наших кодировок. 



## <a id="MRIM"></a>MRIM

На данный момент (апрель 2007 года) в мире насчитывается по крайней мере два гейта, позволяющих получать спам от пользователей Mail.Ru Instant Messenger, кратко — MRIM. Зарегистрироваться на них можно по следующим адресам: 



*  `mrim.jabber.ru` 
*  `mrim.udaff.com` 

Нелишним будет сразу же порекомендовать [дополнительную литературу](Блокировка_MRIM-спама.md) по теме. 


## <a id="MSN"></a>MSN

Можем предложить 

*  `msn.jabber.anywise.com` (тоже иногда глючит, но не так откровенно). 
*  `msn.jabber.kiev.ua` 
*  `msn.jaim.at` 

## <a id="Yahoo"></a>Yahoo

*  `yahoo.draugr.de` отлично работает, хотя и забугорный. Гейт логинится в сеть яху сам, с кодировками проблем нет, кроме того, что в пользователи в родном Yahoo! Messenger видят статусное сообщение кракозяблами. 



Приветствуются адреса работающих транспортов. 

## <a id="AIM"></a>AIM

## <a id="IRC"></a>IRC

При регистрации на IRC-транспорте у вас есть возможность задать кодировки для разных IRC-серверов, к которым вы обычно коннектитесь. Читайте помощь, выводящуюся при двойном клике на "Register". Однако заходить на конференции вы можете и без регистрации. Для этого щёлкните на "Join conference" и в поле "Группа" введите имя комнаты и имя IRC-сервера в таком формате: **mycoolroom%irc.server.org**, а в поле "Сервер" — имя гейта, через который вы собираетесь общаться в "ирке". ![(!)](../images/Hammer.png) **Сделать:** Выяснить, работает ли тут поле "Пароль", и если да, то для чего служит. По идее, для комнаты, потому что для ника пароль отдаётся Никсерву, см. ниже. 









Некоторые гейти в IRC: 


*  <s>`irc.e.jabber.ru` — хитро спрятанный IRC-гейт сервера jabber.ru. Его не видно в Диско, но он существует и очень даже работает.</s> Мир его праху. В эпоху массового отстрела транспортов на jabber.ru ему не помогла даже хитрая спрятанность (уж админы-то не могли про него не знать :)). 


*  `irc.jabber.kiev.ua` — гейт на украинском джаббер-сервере. 
*  `irc.jabe.ru` — гейт компании, которая хостит нашу вики. 

В силу разных обстоятельств случается, что тот или иной гейт не работает. Это сразу видно по абсолютно пустому окну канала, на который вы якобы вошли. В этом случае просто попробуйте другой гейт. Учитывайте также нетсплиты — временные разъединения серверов, формирующих IRC-сеть. Если вы и собеседник, нужный вам, подключены к разным серверам, то при нетсплите вы не сможете общаться. Чтобы избежать этого, укажите нужный IRC-сервер при заполнении поля "Группа". 






Бывает, что NickServ спрашивает ваш пароль (если, конечно, ваш ник зарегистрирован). Его запрос появляется в отдельном окне или табе. Попытка отослать ему стандартную команду **/identify password** ни к чему не приводит. Однако всё получается, если просто убрать слэш и оправить Никсерву только **identify password**. Это происходит, например, в сети [WeNet](http://www.wenet.ru) (irc.wenet.ru). Но как показывает практика, не везде такой подход срабатывает. Например, если проделать то же самое при идентификации в сети [RusNet](http://www.rus-net.org/) (irc.rusnet.ru), Никсерв изругается и скажет в ответ на команду что-то вроде следующего: 









 [Вск Ноя 11 19:50]\<nickserv!irc.rusnet.ru> NOTICE: Use /chanserv, not /MSG chanserv 

Оно и верно: написав в приват Никсерву запрос об аутентификации, мы просто послали ему сообщение (как бы командой **/msg identify password**). Как видно, некоторые сервера требуют прямой команды. В этом случае следует "завернуть" её в "бумажку" quote, которая поможет команде дойти до сервера в неизменном виде: **/quote nickserv identify your\_password**. 





Вот ещё пара полезных команд: 


*  **/quote mode \#channel +o nick** — дать "опа" участнику nick. Ровно таким же образом должны работать и остальные аналогичные команды: -o, +v, -v, +h, -h, +b, -b. Обратите внимание, что раздача привилегий посредством меню MUC, вызываемого правым кликом на нике участника, ничего не даст, потому что IRC просто не поймёт, что вы ему толкуете. 




*  **/quote chanserv help**, **/quote nickserv help** и **/quote memoserv help** выведут в привате список команд, которые можно данному серву отсылать. Собственно, объединив ваши собственные знания об IRC и только что описанный трюк с quote, вы могли бы и сами об этом догадаться, но уж пусть эта подсказка будет. 



*  Если набрать просто **/quote help**, то irc-сервер, к которому вы присоединены, выдаст список команд для этого сервера. 


Дадим ещё один совет на тему общения с сервами. Обычно их имя в интерпретации джаббер-протокола выглядит примерно таким образом: **chanserv!irc.rusnet.ru@irc.jabberserver.ru**. Изменяя необходимые параметры при открытии чата с интересующим сервом, можно общаться с любым из них, даже не коннектясь к irc-серверу — гейт сам всё отошлёт куда надо и доставит вам ответ. Это полезно, если вы хотите узнать, какие команды поддерживает интересующий вас Ник- или Чансерв. Все эти сервы довольно полезны, однако не все из них скромны. Например, wenet!irc.wenet.ru довёл вашего покорного слугу своими постоянными сообщениями до того, что тот занёс его JID в виде wenet!irc.wenet.ru@irc.e.jabber.ru в игнор (это типа намёк, что нужно делать в подобных ситуациях ;)). 











Работы по исследованию irc-гейтов будут продолжаться; тем не менее, если у вас есть что добавить в эту статью, никто этого не запрещает. 


## <a id="XMPP_свой_среди_чужих_"></a>XMPP (свой среди чужих ;))

Позволяет подключить XMPP учётную запись на другом сервере. Можно использовать как альтернативу мультилогина. Общедоступные транспорты замечены на: 


*  `xmpp.jrudevels.org` 
*  `gtalk.jrudevels.org` — для подключения учётной записи GTalk 
*  `j2j.udaff.com` 

**Будьте осторожны!** Не регистрируйте активную учётную запись гостевой в самой себе. После этого не сможете зайти в неё. Не создавайте циклов из учётных записей, например, user1@server1.org является гостевым для user2@server2.org, и одновременно user2@server2.org является гостевым для user1@server1.org. Вы можете придумать более сложные циклические схемы, воздержитесь и от них. 





# <a id="Проблемы_при_работе_с_гейтами"></a>Проблемы при работе с гейтами
Поскольку работа других сетей чаще всего основана на закрытых протоколах, не следует удивляться и огорчаться, если транспорты подглючивают, падают и просто не работают. Отнюдь не помогает их работе и отношение админов Jabber-серверов к "иноземцам" именно как к иноземцам: даже в самых доброжелательных ответах админов (если их удаётся получить) сквозит презрение к "асикушникам" и прочему плебсу. Чаще всего разруливать ситуацию приходится самостоятельно, причём радикальным способом — сменой гейта. Как и на что их менять, рассказано выше, а здесь мы попробуем дать список ошибок, которые могут возникнуть, и их расшифровку. Ошибку можно прочитать в тултипе, появляющемся, если навести мышь на транспорт, находящийся у вас в ростере. 










## <a id="Unavailable"></a>Unavailable

Строго говоря, это не ошибка, а состояние сервиса: "Недоступен". Однако если вы видите, что кроме этого ничего больше в той же строке не написано, скорее всего, вы либо забыли залогиниться на гейт, либо он сам как-то отвалился. Решение проблемы простое: правый клик, и выбрать Log in. 




## <a id="Low_Level_Network_Error"></a>Low Level Network Error

Эта надпись иногда появляется в качестве комментария к вышеупомянутому состоянию Unavailable. Перевод: "низкоуровневая ошибка сети". Замечена при работе со старыми версиями JIT, имевшими ограничение в 1024 одновременных соединения. В настоящее время наверняка является сигналом к тому, что вам пора сменить свой ICQ-транспорт на что-то более свежее и стабильное. 





## <a id="Unrecoverable_Error_Remote_Server_Not_Found"></a>Unrecoverable Error (Remote Server Not Found)

Как видно из названия, эта ошибка сообщает нам о том, что удалённый сервер не найден. Причины могут быть разными: начиная с очень паршивой связи гейта с сервером вражеской сети и заканчивая обычным падением этого самого сервера. Если вы обнаружили эту ошибку, вернувшись к компьютеру после долгого отсутствия, попробуйте перелогиниться на транспорте — вдруг связь уже наладилась. Если ничего не получается, ждите — <s>за вами придут</s> когда-нибудь она наладится. Попингуйте сервер: станет ясно, жив он или нет. 







## <a id="Disconnected_by_unknown_reason"></a>Disconnected by unknown reason

Серия ошибок py-transports (pyicq-t, pymsn-t, и т.д.) - большинство их глюков содержит эти слова ![(!)](../images/Hammer.png) **Сделать:**  дописать подробные примеры. Обычно достаточно перелогиниться на транспорте. 



## <a id="Temporary_Error_Component_msnlinker_is_not_connected_to_server"></a>Temporary Error (Component 'msnlinker' is not connected to server)

Судя по всему, некий компонент транспорта MSN, необходимый для полноценной работы, не подключён к серверу. Результат плачевен: при попытке коннекта к серверу от транспорта приходит ответ такого типа: "Sorry. You do not appear to be registered with this transport. Please register and try again. If you are having trouble registering please contact your Jabber administrator". Иными словами, транспорт в упор вас не знает. Прежде чем внять этой просьбе зарегистрироваться, имеет смысл подождать, ведь мы знаем, что это глюк сервера, а не отсутствие регистрации. Обычно через некоторое время всё само собой налаживается. Если ничего не налаживается, просьба жаловаться не нам, а хозяевам транспорта. 










## <a id="Намерзание_участников_в_ростере"></a>"Намерзание" участников в ростере

Такая проблема часто возникает при работе с гейтами ICQ, когда Ткаббер не выключается долгое время, и за это время происходили дисконнекты. Вы общаетесь себе, общаетесь; мама зовёт вас обедать, вы отходите от компа, потом снова садитесь за него; вечером вы идёте в гости, по возвращении снова лезете в Ткаббер; часв в четыре утра ложитесь спать, на следующий день общаетесь снова, и всё это время он вроде бы нормально работает. Но где-нибудь на третий день вы вдруг обращаете внимание на то, что некоторые ваши друзья из аськи против обыкновения тоже сидят в интернете круглосуточно, причём не наблюдается никаких автоэвеев. Может случиться и так, что вы обнаруживаете транспорт упавшим, однако эти товарищи несмотря ни на что упорно не желают исчезать из ростера. Разлогинивание от гейта не помогает, а ситуацию разруливает лишь полный перелогин Ткаббера. Что же при этом происходит? ![(!)](../images/Hammer.png) **Сделать:** Расспросить авторов гейта либо авторов Ткаббера либо просто очень умных людей либо волшебников и написать тут. 













Changes to wiki/ru/Дистрибутивы__которые_мы_выбираем.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190

191
192
193

194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262

263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304

305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498

499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Дистрибутивы,_которые_мы_выбираем/index.html)


# Дистрибутивы, которые мы выбираем

Материал из Tkabber Wiki

> *– Скажите, пожалуйста, куда мне отсюда идти?  
> – А куда ты хочешь попасть? – ответил Кот.  
> – Мне все равно… – сказала Алиса.  
> – Тогда все равно, куда и идти, – заметил Кот.  
> – … только бы попасть куда-нибудь, – пояснила Алиса.  
> – Куда-нибудь ты обязательно попадешь, – сказал Кот.  
> – Нужно только достаточно долго идти.*

> *© [Льюис Кэрролл "Алиса в стране чудес", пер. Демуровой](http://fictionbook.ru/author/kyerroll_lyuis/priklyucheniya_alisiy_v_strane_chudes_pe/kyerroll_priklyucheniya_alisiy_v_strane_chudes_pe.html#TOC_id3507814)*

## <a id="toc"></a>Содержание

* [1 Начните работу с нажатия этой кнопки (c) Windows](#Начните_работу_с_нажатия_этой_кнопки_c_Windows)
* [2 "Самодостаточные" дистрибутивы Ткаббера](#Самодостаточные_дистрибутивы_Ткаббера)
   * [2.1 Tclkit, starkits и starpacks: немного теории](#Tclkit_starkits_и_starpacks_немного_теории)
      * [2.1.1 Тиклькит](#Тиклькит)
      * [2.1.2 Старкиты](#Старкиты)
      * [2.1.3 Старпаки](#Старпаки)
   * [2.2 Назад, к Ткабберу!](#Назад_к_Ткабберу)
      * [2.2.1 Tkabber-pack — особая песня](#Tkabber-pack_-_особая_песня)
* [3 Быстрее! Выше! Сильнее!](#Быстрее_Выше_Сильнее)
* [4 Прилавок](#Прилавок)
   * [4.1 Рукоделие](#Рукоделие)
* [5 Кто сильнее: кит или пак? (Что выбрать?)](#Кто_сильнее_кит_или_пак_Что_выбрать)
   * [5.1 "Каноническая" установка: Tcl/Tk + Ткаббер](#Каноническая_установка_Tcl_Tk_+_Ткаббер)
      * [5.1.1 Осевой вариант](#Осевой_вариант)
      * [5.1.2 Windows: не бейсиком единым...](#Windows_не_бейсиком_единым...)
      * [5.1.3 Дистрибутив Tcl/Tk в системе: pros et contras](#Дистрибутив_Tcl_Tk_в_системе_pros_et_contras)
   * [5.2 Всё своё ношу с собой](#Всё_своё_ношу_с_собой)
      * [5.2.1 Ткаббер-пак опять идёт не в ногу](#Ткаббер-пак_опять_идёт_не_в_ногу)

# <a id="Начните_работу_с_нажатия_этой_кнопки_c_Windows"></a>Начните работу с нажатия этой кнопки (c) Windows

> *Куда ставить-то?!*

> *© х/ф "Посторонним вход воспрещается"*

Итак, вы решили установить Ткаббер и в настоящий момент чешете голову,
рассматривая [эту страницу](http://tkabber.jabber.ru/download). Не унывайте!
Во-первых, разбегающиеся глаза красят человека, во-вторых, не вы первый, не вы
— последний: почти все "практикующие ткабберисты" были  в своё время мучимы
выбором, подобным вашему. Для того, чтобы помочь вам с выбором, написана эта
статья.

В этой статье рассказывается о различных ипостасях Ткаббера — его
дистрибутивах, — и производится их сравнительное препарирование.

Здесь достаточно много теории, так как цель статьи — предоставить вам
возможность сделать _осмысленный выбор._ Если же вы ленивы или (думаете что)
всё знаете, можете перейти [**прямо сюда**](#Прилавок).

Приступим.

Первое, что вам следует заучить как "Отче наш":

> _Ткаббер написан на **интерпретируемом языке программирования,** и это
  означает, что для работы ему нужен "движок", выполняющий программы этого
  самого языка — Tcl/Tk, а также необходимые библиотеки._

То есть, несмотря на некоторую техническую неточность, можно утверждать, что
Ткаббер состоит из двух частей:

*  Интерпретатора языка Tcl, а также библиотек (Tk, Tcllib и BWidget —
   минимально необходимый набор);
*  Самого кода Ткаббера.

Этот самый "код Ткаббера", в принципе, самодостаточен в том смысле, что не
зависит от операционный системы и является общим для всех систем, на которых
работает Tcl/Tk. То есть, если на вашей системе уже установлен дистрибутив
Tcl/Tk, вы можете произвольно менять сам код Ткаббера: к примеру, вытягивать
его еженощно из [репозитория](http://tkabber.jabber.ru/svn). Или вы, скажем,
можете просто перенести каталог с Ткаббером с Windows-машины на Linux-машину, и
он будет там прекрасно работать.

И именно "этот самый код..." и является основным дистрибутивом Ткаббера.

К сожалению, Tcl/Tk поставляется в комплекте только с такими серьёзными
операционными системами, как Linux или FreeBSD; пользователи Windows вынуждены
скачивать дистрибутив Tcl/Tk из интернета или использовать альтернативные
дистрибутивы Ткаббера, о которых рассказано ниже.

Однако, многие (и не только в Windows) по разным причинам не хотят иметь дело с
установкой этого "рантайма". Наиболее часто встречающаяся причина — вопрос
трафика: дистрибутив Tcl/Tk под Windows "весит" примерно 20 мегабайт в архиве.
Многие пользователи, обрадовавшись, что основной дистрибутив Ткаббера "весит"
около 700 килобайт, бывают разочарованы, узнав, что "это ещё не всё".

Вторая по частоте появления причина — желание использовать "Ткаббер на флэшке":
обычно на "чужих" компьютерах (на работе, в университете и т.д.) нет
возможности установить дистрибутив Tcl/Tk, и, следовательно, его нужно как-то
"носить с собой".

Итак, подведём первый промежуточный итог. У вас есть два варианта для работы с
Ткаббером:

1.  Установить себе дистрибутив Tcl/Tk + необходимые библиотеки.
1.  Скачать специальный дистрибутив Ткаббера, который "содержит в себе"
    микро-дистрибутив Tcl/Tk.

Сравнение их отложим до поры, а пока окинем взглядом

# <a id="Самодостаточные_дистрибутивы_Ткаббера"></a>"Самодостаточные" дистрибутивы Ткаббера
Есть, в общем, два подхода к созданию "вещи в себе" из программы, написанной на
Tcl:

*  Сделать инсталлятор, который устанавливает в систему как минимальный, (но
   "настоящий") дистрибутив Tcl/Tk с необходимыми библиотеками, так и саму
   программу;
*  Использовать специальное средство под названием _tclkit (тиклькит),_
   позволяющее "завернуть" и программу, и Tcl/Tk, и необходимые библиотеки в
   один  файл — _старкит (starkit),_ который может быть исполняемым, и тогда
   становится _старпаком (starpack)._

Ткаббер доступен в каждом из этих обличий. И если первое из них (надеемся)
вполне понятно, то второе, скорее всего, требует разъяснений.

## <a id="Tclkit_starkits_и_starpacks_немного_теории"></a>Tclkit, starkits и starpacks: немного теории

### <a id="Тиклькит"></a>Тиклькит

Tclkit был изобретён для решения проблемы быстрого и удобного размещения
программы, написанной на Tcl/Tk, на компьютере пользователя. Автор идеи, первой
реализации и лидер проекта — [Jean-Claude Wippler](http://wiki.tcl.tk/jcw),
официальный сайт тиклькита — [здесь](http://www.equi4.com/tclkit/).

Тиклькит — это _один_ исполняемый файл небольшого размера (версия 8.4.13 для
Linux x86 "весит" примерно 1.5M), содержащий в себе:

*  интерпретатор языка Tcl;
*  графическую библиотеку Tk;
*  объектное расширение для тикля [incr Tcl];
*  библиотеку поддержки виртуальной файловой системы TclVFS;
*  встроенную систему управления базами данных _Metakit._

Тиклькит не требует инсталляции и исполняет файлы специального формата —
старкиты.

Скачать тиклькит для своей платформы можно
[отсюда](http://www.equi4.com/pub/tk/downloads.html), выбрав нужный пакет из
доступной матрицы.

Итак, тиклькит это "движок". Посмотрим теперь на то, что он "приводит в
движение".

### <a id="Старкиты"></a>Старкиты

Старкит — это _один_ файл, представляющий собой базу данных (!) в формате
Metakit. Собственно данными этой базы являются файлы исходной программы, из
которой изготавливается тиклькит, файлы необходимых библиотек и произвольные
файлы данных. TclVFS из тиклькита делает так, что интерпретатор тикля (из этого
же тиклькита) считает, что работает с обычной файловой системой, а не базой
данных.

Название "starkit" — это (довольно неуклюжий) акроним от "**St**and**A**lone
**R**untime, called Tcl**kit**" ("Самодостаточный исполняемый модуль, который
называется тиклькит").

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

Для запуска старкита Ткаббера на другой операционной системе вам понадобится
скачать тиклькит для неё.

### <a id="Старпаки"></a>Старпаки

Старпак — это просто комбинация тиклькита для одной конкретной операционной
системы и старкита.

Старпак обладает одним чудным свойством: он представляет собой _один
исполняемый файл, не требующий инсталляции._

К сожалению, при этом теряется одно из достоинств старкитов — независимость от
целевой платформы.

Подробнее про [**Tkabber starpack**](Tkabber_starpack.md).

## <a id="Назад_к_Ткабберу"></a>Назад, к Ткабберу!

Выше мы сказали, что Ткаббер доступен в виде каждой из разновидностей
"самодостаточных" дистрибутивов.

Итак, настало время поприветствовать наших красавиц!

##### [Tkabber-Starkit](http://tkabber.jabber.ru/node/73) 

> Старкит. Требует наличия тиклькита для вашей ОС.

##### [Tkabber-Starpack](http://tkabber.jabber.ru/node/160) 

> Старпак. Для запуска не требует ничего.

### <a id="Tkabber-pack_-_особая_песня"></a>Tkabber-pack — особая песня

Если помните, одним из вариантов дистрибутива "всё в одном" был инсталлятор,
устанавливающий в систему минимальный дистрибутив Tcl/Tk, необходимые
библиотеки и саму программу.

Когда-то это задачу решал Ткаббер-пак.

Однако, начиная с версии 0.9.9, _официальный_ Ткаббер-пак больше не содержит в
себе микродистрибутива Tcl/Tk; автор предлагает использовать его вместе с
"полным" дистрибутивом этого языка.

С другой стороны, существует _неофициальная_ модификация Ткаббер-пака,
содержащая Tcl/Tk. О ней будет рассказано ниже.

# <a id="Быстрее_Выше_Сильнее"></a>Быстрее! Выше! Сильнее!
Ткаббер написан таким образом, что может использовать различные _модули_ для
Tcl/Tk (которые мы называем "расширениями"), если они доступны (установлены).

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

Важно понимать, что эти модули не являются частью Ткаббера; их необходимо
устанавливать отдельно. Они могут поставляться вместе с вашей ОС или вашим
дистрибутивом Tcl/Tk, а возможно, устанавливать их вам придётся "руками".
Посему, не исключено, что вопрос наличия тех или иных модулей в "готовом" виде,
или тот факт, что они поставляются "внутри" некоторого дистрибутива Ткаббера,
может сыграть решающую роль в вашем выборе.

Здесь мы рассмотрим доступные модули Tcl/Tk, которые может использовать
Ткаббер, чтобы учитывать это при сравнении дистрибутивов Ткаббера.

![(!)](../images/Hammer.png) **Сделать:** рассказать про модули + доступность
каждого модуля). Возможно, просто отослать к соотв. таблице на офсайте

# <a id="Прилавок"></a>Прилавок
Пробежимся по  доступным дистрибутивам Ткаббера, имеющим статус официальных,
давая краткие пояснения:

##### Ткаббер из состава ОС 
> Проверьте, возможно, что Ткаббер входит в состав вашей ОС! К примеру, он
  входит в состав [Debian GNU/Linux](http://www.debian.org),
  [Gentoo](http://www.gentoo.org), [Mandrake](http://www.mandrakelinux.com/),
  [FreeBSD](http://www.freebsd.org). Возможно, есть и в других POSIX-системах.

##### ["Просто Ткаббер"](http://www.jabberstudio.org/projects/tkabber/releases/) 
> Официальный _стабильный_ дистрибутив ткаббера. На [официальном
  сайте](http://tkabber.jabber.ru/download) он называется "Source Package". Для
  работы требует наличия в системе дистрибутива Tcl/Tk и необходимых библиотек
  (Tcllib и BWidget). Не содержит опциональных расширений. Поствляется в виде
  двух архивов: собственно Ткаббер и плагины к нему.

##### [Ткаббер с SVN](http://tkabber.jabber.ru/node/55)
> Это — для любителей "быть на переднем крае" и разработчиков. Эта версия
  _нестабильна,_ то есть вообще не обязана работать.

##### [Tkabber-pack](http://tkabber.jabber.ru/tkabber-pack)
> Это — инсталлятор для Windows, содержащий Ткаббер, плагины к нему, а так же
  наиболее полезные расширения. _**Внимание, будьте бдительны:** этот
  дистрибутив **не** включает в себя Tcl/Tk!_ Точнее говоря, он включал Tcl/Tk,
  но только до версии Ткаббера 0.9.8. Начиная с 0.9.9 — уже не включает. (Если
  вам нужен Ткаббер-пак с тиклем внутри, обратите внимание на "TkabberOTC",
  который описан ниже, в разделе
  [**"Рукоделие"**](#Рукоделие).

##### [Tkabber-Starkit](http://tkabber.jabber.ru/node/73)

> Это — старкит Ткаббера. Требует для работы [тиклькит под вашу ОС](http://www.equi4.com/pub/tk/downloads.html).
  _**Внимание!** имеющийся старкит сильно устарел (версия 0.9.7) и не рекомендуется к использованию._

##### [Tkabber-Starpack](http://tkabber.jabber.ru/node/160) 
> Это — старпак Ткаббера. Имеются версии под Linux x86 и Windows. Включает
  наиболее полезные расширения Ткаббера. Для работы не требует абсолютно ничего.

## <a id="Рукоделие"></a>Рукоделие

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

##### [Старпак с поддержкой сжатия](ftp://netbsd.rusc.ru/tkabber/tkabber-starpack_0.9.9-win32+zlib+img.exe) 
>  Официальный стапак под Win32, в который [**Kostix**](Участник_Kostix.md) добавил
  поддержку сжатия, а также возможность подгружать
  [старкит пакета Img](http://mini.net/sdarchive/img.kit), позволяющий работать с картинками в
  формате JPEG, PNG и другими. Подробности —
  [**здесь**](Low_traffic_HOWTO.md#Старпаки_Ткаббера).

##### [Tkabber-pack toon'а](http://lfor.narod.ru/) 
> Ткаббер-пак под Windows. Содержит некие изменения, о которых автор ленится
  написать. Основная идея: минимизировать трафик, требуемый для получения
  обновлений. С этой целью всё пожато архиватором 7zip, а новые версии Ткаббера
  распространяются в виде апдейтов.

##### [TkabberOTC](http://wiki.omsktele.com/index.php/TkabberOTC) 
> Ткаббер-пак от админов провайдера "Омские Телекоммуникации". Допилен на
  предмет более глубокой русификации + другие изменения. Читайте официальную
  страницу. _Включает минимальный дистрибутив Tcl/Tk._

##### [Tkabber-SK](http://sourceforge.net/projects/tkabber-sk/) 
> Этакий "форк" от SVN-версии Ткаббера за конец декабря 2006 года. Автор —
  `xmpp:tomasz@mastahizm.mooo.com`. В эту версию добавлены разные интересные и
  не очень штуки (подробности читайте в чейнджлогах на странице проекта). Мы
  пригласили автора к сотрудничеству с разработчиками, так как некоторые из его
  фич могут запросто попасть в транк. Да и вообще незачем распылять силы. Фичи,
  которые в транк не попадут, он вроде обещал выложить в виде патчей на
  английской версии соответствующего раздела.

##### [Страница Ткаббера на Tcl Wiki](http://wiki.tcl.tk/11080) 

> Содержит ссылки на как минимум два старкита. За подробностями идите по ссылке.

# <a id="Кто_сильнее_кит_или_пак_Что_выбрать"></a>Кто сильнее: кит или пак? (Что выбрать?)

> _Какой же я могу, сеньора,
> Подать совет там, где решает
> Единственно ваш личный вкус?_

> _[Лопе Де Вега. "Собака на сене"](http://www.lib.ru/DEVEGA/vega2.txt)_

Изложенное здесь есть частное мнение авторов статьи, которое не обязано
совпадать с вашим, так что имейте в виду известный девиз: _"на наше мнение
можно положить(ся)"_ © [AG.ru](http://www.ag.ru). Включайте голову, изучайте и
делайте свой выбор.

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

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

Следует иметь в виду, сравнивая дистрибутивы:

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

## <a id="Каноническая_установка_Tcl_Tk_+_Ткаббер"></a>"Каноническая" установка: Tcl/Tk + Ткаббер

Вначале рассмотрим вариант с наличием полноценного дистрибутива Tcl/Tk в
системе.

### <a id="Осевой_вариант"></a>Осевой вариант

Выбор авторов статьи (при этих словах вы должны представлять себе везде седых и
лысых везде, где не седы, старцев с хитрым прищуром мудрых глаз) — "дистрибутив
из вашей ОС". Действительно ли вам нужна Самая Последняя Версия? Признайтесь
себе: вы знаете чем она отличается от предыдущей? Есть ли в версии из вашего
дистрибутива Ужасные Баги, С Которыми Вы Не Можете Жить? Имейте в виду мудрый
принцип: "не сломалось — не чини".

Кроме того, данный подход имеет другие достоинства:

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

Безусловно, если в вашей системе есть Ткаббер, то в ней, как минимум, есть
дистрибутив Tcl/Tk и набор необходимых Ткабберу компонентов.

Имейте, однако, в виду, что "Ткаббер из ОС" это, в основном, роскошь
линуксоидов и эээ... пользователей FreeBSD. Адептам Windows предлагается
изучить альтернативы.

Больше всех, пожалуй, повезло пользователям [Debian GNU/Linux](http://www.debian.org):
один из разработчиков Ткаббера (`xmpp:sgolovan@nes.ru`) является пользователем этой ОС
и поддерживает [собственный репозиторий пакетов](http://sgolovan.nes.ru/jabber/),
содержащий, помимо прочего, готовые пакеты с наиболее полезными расширениями
для Ткаббера. Так что любителям Дебиана достаточно вписать себе в **sources.list**
дополнительный репозиторий и наслаждаться.

В любом случае, почти со стопроцентной уверенностью можно сказать, что
дистрибутив Tcl и Tk есть в любой "десктопной" POSIX-системе. О том, что
делать, когда его нет, читайте ниже.

Если ваша система не имеет дистрибутива Ткаббера, но имеет дистрибутив Tcl/Tk,
возможно, следует просто скачать стандартный дистрибутив Ткаббера ("исходники")
и развернуть его куда-нибудь под **/usr/local/share**.

### <a id="Windows_не_бейсиком_единым..."></a>Windows: не бейсиком единым...

Сотрудники Майкрософт обладают достаточно извращённым вкусом в области языков
программирования. Поэтому в вашей Windows-системе есть минимум два бейсика и,
возможно, минимум одна джава. И ни одного тикля. Не исключено, что недостаток
внимания этой фирмы к данному языку сыграл последнему на пользу, избавив его от
смертельного дыхания
[одного известного принципа](http://en.wikipedia.org/wiki/Embrace_and_extend).
В любом случае, вас касается одна проблема: дистрибутива Tcl/Tk с Windows не
поставляется.

Стандартом де-факто в области Tcl/Tk под Windows является дистрибутив от фирмы
[ActiveState](http://www.activestate.com), скачать который можно
[здесь](http://www.activestate.com/Products/ActiveTcl/). Как уверяют авторы, в
этом тикле "включены все батарейки", однако они лукавят: далеко не все
батарейки там есть. Выкачав 21 мег дистра, вы не получите, например, такой
элементарной вещи как [tcllib](http://tcllib.sourceforge.net/). Этот
дистрибутив имеет удобную справочную систему, программу **tkcon** и массу
других вещей, которая _может_ вам понадобиться (а может — и нет), например, в
windows-версиях включает в себя средства интеграции с
[Windows Script Host](http://ru.wikipedia.org/wiki/Windows_Script_Host). Какие-либо
инструментальные средства, облегчающие жизнь программиста, отсутствуют. Фирма
продаёт пакет TclDevKit, содержащий средства отладки и создания автономных
программ (последнее на базе технологии StarKit), и Komodo — универсальное IDE
для скриптовых языков, включающее средства визуального программирования
Tk-форм.

[WinTclTk](http://sourceforge.net/projects/wintcltk) — более компактный,
активно развивающийся дистрибутив для Windows. В этот дистрибутив входят Tloona
IDE — среда разработки традиционного типа и ХOTclIde — среда
объектно-ориентированного программирования в стиле Smalltalk, обе — с
отладчиками. Также на сайте разработчиков свободно доступен пакет для создания
единого запускаемого файла TkWrapper основанный на FreeWrap — технологии,
альтернативной StarKit, основанной на простом ZIP-сжатии.

> _Внимание!_ Если вы решили установить дистрибутив от
  [ActiveState](http://www.activestate.com), настоятельно рекомендуется принять
  к сведению два совета:

*  Ставьте стабильную версию (8.4.x и 8.5.x в настоящий момент).
*  _**Не** ставьте_ версию 8.4.15 — она содержит пару неприятных проблем,
   затрагивающих Ткаббер.

Настало время поговорить по поводу "может".

### <a id="Дистрибутив_Tcl_Tk_в_системе_pros_et_contras"></a>Дистрибутив Tcl/Tk в системе: pros et contras

Два основных "за" наличие дистрибутива в системе:

*  _Расширение возможностей системы_ — вам становится доступен мощный и в то же
   время лёгкий  в изучении язык программирования. Возможно, вы захотите
   использовать его. Кроме того, _на Ткаббере свет клином не сошёлся_ — в мире
   хватает хороших программ, написанных на тикле; устанавливая дистрибутив
   Tcl/Tk, вы даёте себе возможность использовать их без дополнительного
   "геморроя".
*  _Работа с кодом Ткаббера._ По разным причинам у вас может возникнуть
   желание/необходимость работать непосредственно с кодом Ткаббера. Вот эти
   причины:
 *  Вы хотите быть "на переднем крае" разработки и иметь версию, отражающую
    текущее состояние репозитория SVN.
 *  Вы хотите накладывать на Ткаббер неофициальные и экспериментальные патчи,
    или патчи, которые не принимают в основную ветку разработки.
 *  Вы хотите ковыряться с кодом Ткаббера (пусть даже и в режиме "только
    чтение", например, изучения ради), а то и участвовать в разработке.

Несмотря на то, что всё это технически можно делать и со старкитом/старпаком,
при наличии дистрибутива Tcl/Tk это делать значительно проще.

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

Ради сохранения баланса Силы, скрепя сердце, приведём и два основных "против":

*  _Интернет-трафик._ Под Windows скачивание 20-мегабайтного архива из Интернет
   — единственная возможность получить полноценный дистрибутив Tcl/Tk. На
   POSIX-системах, возможно, также потребуется качать нужные пакеты.
*  _Борьба за "чистоту рядов"._ Некоторые пользователи (чрезмерно) ревниво
   относятся к "чистоте" своей системы и противятся установке любого "ах, ещё
   одного языка программирования!".

Иногда, впрочем, установка дистрибутива Tcl/Tk не только нежелательна, но и
невозможна. Если это — ваш случай <s>или, читая предыдущие строчки, вы решили
встать на тёмную сторону Силы</s>, следующий раздел — для вас.

## <a id="Всё_своё_ношу_с_собой"></a>Всё своё ношу с собой

Собственно, преимущества и недостатки использования "завёрнутых" версий
Ткаббера примерно обратны использованию "канонической" установки.

Плюсы:

*  _"Всё в одном"_ — Ткаббер-старпак представляет собой один выполняемый файл,
   который нужно просто запустить. Ткаббер-старкит — два файла, которые тоже не
   нужно не только куда-то ставить, но и даже распаковывать.
*  При некотором (несложном) "допиливании" Ткаббер-старпак прекрасно умеет
   работать с носимого устройства хранения данных, например, с флэш-драйва. То
   же самое относится и к старкиту, только таскать нужно опять же два файла.
*  Официальные старпаки содержат большинство самых полезных модулей Tcl/Tk,
   расширяющих возможности Ткаббера — _отсутствие необходимости в
   дополнительной установке расширений._

Минусы проистекают из всё той же "упакованности":

*  Любое изменение "внутренностей" старпака/старкита требует его
   _"разворачивания" (unwrap)_ и последующего _"заворачивания" (wrap)_
   (подробнее эти процедуры обсуждаются [**здесь**](Tkabber_starpack.md)). Это вам
   понадобится делать, если вы хотите:
 *  добавить модуль Tcl/Tk, расширяющий возможности Ткаббера, которого нет в
    стандартной поставке старпака/старкита;
 *  наложить какой-либо патч.

*  Официальные дистрибутивы Ткаббера — это стабильные релизы. Если вы хотите
   быть "на переднем крае" разработки, но при этом использовать
   старпак/старкит, то фактически вам придётся поддерживать свою версию такого
   дистрибутива.

![(!)](../images/Hammer.png) **Сделать:** Вообще-то, конечно, нужна обобщённая
статейка про старкиты и старпаки, со ссылкой на систему сборки бадлопа и
утилиту архимеда...

### <a id="Ткаббер-пак_опять_идёт_не_в_ногу"></a>Ткаббер-пак опять идёт не в ногу

Нелишним будет снова повторить, что последний _официальный_ Ткаббер-пак больше
не содержит Tcl/Tk, поэтому фактически нам нужно рассматривать два воплощения
Ткаббер-пака: оснащённое Tcl/Tk и обделённое им.

Преимущество Ткаббер-пака по сравнению со старпаками/старкитами Ткаббера
заключается в том, что его значительно легче _изменять_ — Ткаббер включён в
этот дистрибутив "как есть": не нужно ничего "разворачивать" и потом
"сворачивать" обратно для того, чтобы потестировать патч или почитать код.

К недостаткам в сравнении со старпаками/старкитами, пожалуй, можно причислить
только то, что он занимает больше места (но зато и стартует быстрее).

Ткаббер-пак, _оснащённый дистрибутивом Tcl/Tk,_ обладает таким же уровнем
мобильности как и старпак/старкит (например, умеет работать с флэш-драйва), и
привязан к конкретной ОС так же, как и старпак (нам известно только о
Windows-версиях Ткаббер-пака). Несмотря на то, что в подобном дистрибутиве есть
"настоящий" Tcl/Tk, относитесь к этому с определённым скепсисом: это достаточно
урезанная версия, содержащая только то, без чего не может обойтись Ткаббер.

Может возникнуть вопрос: а в чём смысл Ткаббер-пака _без_ микро-дистрибутива
Tcl/Tk внутри? Ответ прост: Ткаббер-пак включает в себя наиболее полезные
пакеты Tcl/Tk, которые делают доступными дополнительные возможности Ткаббера.
Можете думать о нём как о "Ткаббере на стероидах". Естественно, можно скачать и
поставить дополнительные пакеты "руками", но зачем вам лишний труд?

>





|
|
|
|
|
|
|

|





|
|
|
|
|
|


|

|
|
|
|
|
|



|

|

|
<
<
<
<
<

|
<

|
<
<

|

|

|
<
<

|
<

|
<
|

|
<
<
<
<
<
<

|

|
<
<
<

|
<
<
<
<

|
<
<
<

|
<

|
|
<

|


|
<

|
<
<
|
<
<
<

|
<





|
<
<
<

|
<

|
|
|
|
|

|
<

|
<
<

|
<



|
<
<
<
<
<

|
<
<

|
<

|
<



|
<

|
<

|
<

|



|
<

|

|
>
|

|
>
|



|
<
<

|

|
<
<

|
<


|
<

|
<
<

|
<
<
<
<
<

|
<

|
<


|
<

|
|
|
<
<

|
|
|
<
<
<

|
|
|

|
|
|
<
<
<
<
<

|
>
|
<

|
|
|



|
<
<
<

|
|
|
<
<
<

|
|
|
<
<

|
|
|
<

|
|
|
<
<
<
<
<

|
>
|



|
|
|

|

|
<
<
<

|
<
<
<

|
<
<
<
<
<
<

|

|
<
<



|
<



|
<
<
<
<
<

|

|
<
<
|
<
<

|
<

|
<
<

|
<
<
<
<
<

|
<
<

|
<
<



|
<
<
<
<
<
<
<

|
<
<
<
<
<
<
<
<
<
<
<
<
<
<

|
<
<
<
<
<
<

<
|
<

|
|
<

|



|

|
<
<
<
<
<
|
<
<
|
<
|
<
|
<

|
<

|
<
<
<
<
<
<

|

|
<
<
|
<
<

|
<
<



|
<

|

|
<
<
|
<
<
|
<
<

|

|
<
<
<
|
<
|
>
|
<
<
<

|
<
<



|
<
<

|
<
<
<

|
<

|
<
<
<
<
<

|
|
|
<
<
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45





46
47

48
49


50
51
52
53
54
55


56
57

58
59

60
61
62






63
64
65
66



67
68




69
70



71
72

73
74
75

76
77
78
79
80

81
82


83



84
85

86
87
88
89
90
91



92
93

94
95
96
97
98
99
100
101

102
103


104
105

106
107
108
109





110
111


112
113

114
115

116
117
118
119

120
121

122
123

124
125
126
127
128
129

130
131
132
133
134
135
136
137
138
139
140
141
142
143


144
145
146
147


148
149

150
151
152

153
154


155
156





157
158

159
160

161
162
163

164
165
166
167


168
169
170
171



172
173
174
175
176
177
178
179





180
181
182
183

184
185
186
187
188
189
190
191



192
193
194
195



196
197
198
199


200
201
202
203

204
205
206
207





208
209
210
211
212
213
214
215
216
217
218
219
220
221



222
223



224
225






226
227
228
229


230
231
232
233

234
235
236
237





238
239
240
241


242


243
244

245
246


247
248





249
250


251
252


253
254
255
256







257
258














259
260






261

262

263
264
265

266
267
268
269
270
271
272
273





274


275

276

277

278
279

280
281






282
283
284
285


286


287
288


289
290
291
292

293
294
295
296


297


298


299
300
301
302



303

304
305
306



307
308


309
310
311
312


313
314



315
316

317
318





319
320
321
322


[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Дистрибутивы,_которые_мы_выбираем/index.html)


# Дистрибутивы, которые мы выбираем

Материал из Tkabber Wiki

– Скажите, пожалуйста, куда мне отсюда идти?
 – А куда ты хочешь попасть? – ответил Кот.
 – Мне все равно… – сказала Алиса.
 – Тогда все равно, куда и идти, – заметил Кот.
 – … только бы попасть куда-нибудь, – пояснила Алиса.
 – Куда-нибудь ты обязательно попадешь, – сказал Кот.
 – Нужно только достаточно долго идти. 

© [Льюис Кэрролл "Алиса в стране чудес", пер. Демуровой](http://fictionbook.ru/author/kyerroll_lyuis/priklyucheniya_alisiy_v_strane_chudes_pe/kyerroll_priklyucheniya_alisiy_v_strane_chudes_pe.html#TOC_id3507814) 

## <a id="toc"></a>Содержание

* [1 Начните работу с нажатия этой кнопки (c) Windows](#Начните_работу_с_нажатия_этой_кнопки_c_Windows)
* [2 "Самодостаточные" дистрибутивы Ткаббера](#Самодостаточные_дистрибутивы_Ткаббера)
 * [2.1 Tclkit, starkits и starpacks: немного теории](#Tclkit_starkits_и_starpacks_немного_теории)
  * [2.1.1 Тиклькит](#Тиклькит)
  * [2.1.2 Старкиты](#Старкиты)
  * [2.1.3 Старпаки](#Старпаки)
 * [2.2 Назад, к Ткабберу!](#Назад_к_Ткабберу)
  * [2.2.1 Tkabber-pack — особая песня](#Tkabber-pack_-_особая_песня)
* [3 Быстрее! Выше! Сильнее!](#Быстрее_Выше_Сильнее)
* [4 Прилавок](#Прилавок)
 * [4.1 Рукоделие](#Рукоделие)
* [5 Кто сильнее: кит или пак? (Что выбрать?)](#Кто_сильнее_кит_или_пак_Что_выбрать)
 * [5.1 "Каноническая" установка: Tcl/Tk + Ткаббер](#Каноническая_установка_Tcl_Tk_+_Ткаббер)
  * [5.1.1 Осевой вариант](#Осевой_вариант)
  * [5.1.2 Windows: не бейсиком единым...](#Windows_не_бейсиком_единым...)
  * [5.1.3 Дистрибутив Tcl/Tk в системе: pros et contras](#Дистрибутив_Tcl_Tk_в_системе_pros_et_contras)
 * [5.2 Всё своё ношу с собой](#Всё_своё_ношу_с_собой)
  * [5.2.1 Ткаббер-пак опять идёт не в ногу](#Ткаббер-пак_опять_идёт_не_в_ногу)

# <a id="Начните_работу_с_нажатия_этой_кнопки_c_Windows"></a>Начните работу с нажатия этой кнопки (c) Windows

Куда ставить-то?! 

© х/ф "Посторонним вход воспрещается" 

Итак, вы решили установить Ткаббер и в настоящий момент чешете голову, рассматривая [эту страницу](http://tkabber.jabber.ru/download). Не унывайте! Во-первых, разбегающиеся глаза красят человека, во-вторых, не вы первый, не вы — последний: почти все "практикующие ткабберисты" были  в своё время мучимы выбором, подобным вашему. Для того, чтобы помочь вам с выбором, написана эта статья. 






В этой статье рассказывается о различных ипостасях Ткаббера — его дистрибутивах, — и производится их сравнительное препарирование.  


Здесь достаточно много теории, так как цель статьи — предоставить вам возможность сделать _осмысленный выбор._ Если же вы ленивы или (думаете что) всё знаете, можете перейти [прямо сюда](Дистрибутивы__которые_мы_выбираем.md#Прилавок). 



Приступим. 

Первое, что вам следует заучить как "Отче наш": 

 _Ткаббер написан на **интерпретируемом языке программирования,** и это означает, что для работы ему нужен "движок", выполняющий программы этого самого языка — Tcl/Tk, а также необходимые библиотеки._ 



То есть, несмотря на некоторую техническую неточность, можно утверждать, что Ткаббер состоит из двух частей: 


*  Интерпретатора языка Tcl, а также библиотек (Tk, Tcllib и BWidget — минимально необходимый набор); 

*  Самого кода Ткаббера. 

Этот самый "код Ткаббера", в принципе, самодостаточен в том смысле, что не зависит от операционный системы и является общим для всех систем, на которых работает Tcl/Tk. То есть, если на вашей системе уже установлен дистрибутив Tcl/Tk, вы можете произвольно менять сам код Ткаббера: к примеру, вытягивать его еженощно из [репозитория](http://tkabber.jabber.ru/svn). Или вы, скажем, можете просто перенести каталог с Ткаббером с Windows-машины на Linux-машину, и он будет там прекрасно работать. 







И именно "этот самый код..." и является основным дистрибутивом Ткаббера. 

К сожалению, Tcl/Tk поставляется в комплекте только с такими серьёзными операционными системами, как Linux или FreeBSD; пользователи Windows вынуждены скачивать дистрибутив Tcl/Tk из интернета или использовать альтернативные дистрибутивы Ткаббера, о которых рассказано ниже. 




Однако, многие (и не только в Windows) по разным причинам не хотят иметь дело с установкой этого "рантайма". Наиболее часто встречающаяся причина — вопрос трафика: дистрибутив Tcl/Tk под Windows "весит" примерно 20 мегабайт в архиве. Многие пользователи, обрадовавшись, что основной дистрибутив Ткаббера "весит" около 700 килобайт, бывают разочарованы, узнав, что "это ещё не всё". 





Вторая по частоте появления причина — желание использовать "Ткаббер на флэшке": обычно на "чужих" компьютерах (на работе, в университете и т.д.) нет возможности установить дистрибутив Tcl/Tk, и, следовательно, его нужно как-то "носить с собой". 




Итак, подведём первый промежуточный итог. У вас есть два варианта для работы с Ткаббером: 


1.  Установить себе дистрибутив Tcl/Tk + необходимые библиотеки. 
1.  Скачать специальный дистрибутив Ткаббера, который "содержит в себе" микро-дистрибутив Tcl/Tk. 


Сравнение их отложим до поры, а пока окинем взглядом 

# <a id="Самодостаточные_дистрибутивы_Ткаббера"></a>"Самодостаточные" дистрибутивы Ткаббера
Есть, в общем, два подхода к созданию "вещи в себе" из программы, написанной на Tcl: 


*  Сделать инсталлятор, который устанавливает в систему как минимальный, (но "настоящий") дистрибутив Tcl/Tk с необходимыми библиотеками, так и саму программу; 


*  Использовать специальное средство под названием _tclkit (тиклькит),_ позволяющее "завернуть" и программу, и Tcl/Tk, и необходимые библиотеки в один  файл — _старкит (starkit),_ который может быть исполняемым, и тогда становится _старпаком (starpack)._ 




Ткаббер доступен в каждом из этих обличий. И если первое из них (надеемся) вполне понятно, то второе, скорее всего, требует разъяснений. 


## <a id="Tclkit_starkits_и_starpacks_немного_теории"></a>Tclkit, starkits и starpacks: немного теории

### <a id="Тиклькит"></a>Тиклькит

Tclkit был изобретён для решения проблемы быстрого и удобного размещения программы, написанной на Tcl/Tk, на компьютере пользователя. Автор идеи, первой реализации и лидер проекта — [Jean-Claude Wippler](http://wiki.tcl.tk/jcw), официальный сайт тиклькита — [здесь](http://www.equi4.com/tclkit/). 




Тиклькит — это _один_ исполняемый файл небольшого размера (версия 8.4.13 для Linux x86 "весит" примерно 1.5M), содержащий в себе: 


*  интерпретатор языка Tcl; 
*  графическую библиотеку Tk; 
*  объектное расширение для тикля [incr Tcl]; 
*  библиотеку поддержки виртуальной файловой системы TclVFS; 
*  встроенную систему управления базами данных _Metakit._ 

Тиклькит не требует инсталляции и исполняет файлы специального формата — старкиты. 


Скачать тиклькит для своей платформы можно [отсюда](http://www.equi4.com/pub/tk/downloads.html), выбрав нужный пакет из доступной матрицы. 



Итак, тиклькит это "движок". Посмотрим теперь на то, что он "приводит в движение". 


### <a id="Старкиты"></a>Старкиты

Старкит — это _один_ файл, представляющий собой базу данных (!) в формате Metakit. Собственно данными этой базы являются файлы исходной программы, из которой изготавливается тиклькит, файлы необходимых библиотек и произвольные файлы данных. TclVFS из тиклькита делает так, что интерпретатор тикля (из этого же тиклькита) считает, что работает с обычной файловой системой, а не базой данных. 






Название "starkit" — это (довольно неуклюжий) акроним от "**St**and**A**lone **R**untime, called Tcl**kit**" ("Самодостаточный исполняемый модуль, который называется тиклькит"). 



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


Для запуска старкита Ткаббера на другой операционной системе вам понадобится скачать тиклькит для неё. 


### <a id="Старпаки"></a>Старпаки

Старпак — это просто комбинация тиклькита для одной конкретной операционной системы и старкита. 


Старпак обладает одним чудным свойством: он представляет собой _один исполняемый файл, не требующий инсталляции._ 


К сожалению, при этом теряется одно из достоинств старкитов — независимость от целевой платформы. 


Подробнее про [Tkabber starpack](Tkabber_starpack.md). 

## <a id="Назад_к_Ткабберу"></a>Назад, к Ткабберу!

Выше мы сказали, что Ткаббер доступен в виде каждой из разновидностей "самодостаточных" дистрибутивов. 


Итак, настало время поприветствовать наших красавиц! 

 [Tkabber-Starkit](http://tkabber.jabber.ru/node/73) 

 Старкит. Требует наличия тиклькита для вашей ОС. 

 [Tkabber-Starpack](http://tkabber.jabber.ru/node/160) 

 Старпак. Для запуска не требует ничего. 

### <a id="Tkabber-pack_-_особая_песня"></a>Tkabber-pack — особая песня

Если помните, одним из вариантов дистрибутива "всё в одном" был инсталлятор, устанавливающий в систему минимальный дистрибутив Tcl/Tk, необходимые библиотеки и саму программу. 



Когда-то это задачу решал Ткаббер-пак. 

Однако, начиная с версии 0.9.9, _официальный_ Ткаббер-пак больше не содержит в себе микродистрибутива Tcl/Tk; автор предлагает использовать его вместе с "полным" дистрибутивом этого языка. 



С другой стороны, существует _неофициальная_ модификация Ткаббер-пака, содержащая Tcl/Tk. О ней будет рассказано ниже. 


# <a id="Быстрее_Выше_Сильнее"></a>Быстрее! Выше! Сильнее!
Ткаббер написан таким образом, что может использовать различные _модули_ для Tcl/Tk (которые мы называем "расширениями"), если они доступны (установлены). 


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



Важно понимать, что эти модули не являются частью Ткаббера; их необходимо устанавливать отдельно. Они могут поставляться вместе с вашей ОС или вашим дистрибутивом Tcl/Tk, а возможно, устанавливать их вам придётся "руками". Посему, не исключено, что вопрос наличия тех или иных модулей в "готовом" виде, или тот факт, что они поставляются "внутри" некоторого дистрибутива Ткаббера, может сыграть решающую роль в вашем выборе. 






Здесь мы рассмотрим доступные модули Tcl/Tk, которые может использовать Ткаббер, чтобы учитывать это при сравнении дистрибутивов Ткаббера. 


![(!)](../images/Hammer.png) **Сделать:** рассказать про модули + доступность каждого модуля). Возможно, просто отослать к соотв. таблице на офсайте 


# <a id="Прилавок"></a>Прилавок
Пробежимся по  доступным дистрибутивам Ткаббера, имеющим статус официальных, давая краткие пояснения: 


 Ткаббер из состава ОС 

 Проверьте, возможно, что Ткаббер входит в состав вашей ОС! К примеру, он входит в состав [Debian GNU/Linux](http://www.debian.org), [Gentoo](http://www.gentoo.org), [Mandrake](http://www.mandrakelinux.com/), [FreeBSD](http://www.freebsd.org). Возможно, есть и в других POSIX-системах. 



 ["Просто Ткаббер"](http://www.jabberstudio.org/projects/tkabber/releases/) 

 Официальный _стабильный_ дистрибутив ткаббера. На [официальном сайте](http://tkabber.jabber.ru/download) он называется "Source Package". Для работы требует наличия в системе дистрибутива Tcl/Tk и необходимых библиотек (Tcllib и BWidget). Не содержит опциональных расширений. Поствляется в виде двух архивов: собственно Ткаббер и плагины к нему. 




 [Ткаббер с SVN](http://tkabber.jabber.ru/node/55) 

 Это — для любителей "быть на переднем крае" и разработчиков. Эта версия _нестабильна,_ то есть вообще не обязана работать. 

 [Tkabber-pack](http://tkabber.jabber.ru/tkabber-pack) 

 Это — инсталлятор для Windows, содержащий Ткаббер, плагины к нему, а так же наиболее полезные расширения. _**Внимание, будьте бдительны:** этот дистрибутив **не** включает в себя Tcl/Tk!_ Точнее говоря, он включал Tcl/Tk, но только до версии Ткаббера 0.9.8. Начиная с 0.9.9 — уже не включает. (Если вам нужен Ткаббер-пак с тиклем внутри, обратите внимание на "TkabberOTC", который описан ниже, в разделе ["Рукоделие"](Дистрибутивы__которые_мы_выбираем.md#Рукоделие). 






 [Tkabber-Starkit](http://tkabber.jabber.ru/node/73) 

 Это — старкит Ткаббера. Требует для работы [тиклькит под вашу ОС](http://www.equi4.com/pub/tk/downloads.html). _**Внимание!** имеющийся старкит сильно устарел (версия 0.9.7) и не рекомендуется к использованию._ 


 [Tkabber-Starpack](http://tkabber.jabber.ru/node/160) 

 Это — старпак Ткаббера. Имеются версии под Linux x86 и Windows. Включает наиболее полезные расширения Ткаббера. Для работы не требует абсолютно ничего. 

## <a id="Рукоделие"></a>Рукоделие

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




 [Старпак с поддержкой сжатия](ftp://netbsd.rusc.ru/tkabber/tkabber-starpack_0.9.9-win32+zlib+img.exe) 

 Официальный стапак под Win32, в который [Kostix](Участник_Kostix.md) добавил поддержку сжатия, а также возможность подгружать [старкит пакета Img](http://mini.net/sdarchive/img.kit), позволяющий работать с картинками в формате JPEG, PNG и другими. Подробности — [здесь](Low_traffic_HOWTO.md#Старпак_Ткаббера_Win32). 




 [Tkabber-pack toon'а](http://lfor.narod.ru/) 

 Ткаббер-пак под Windows. Содержит некие изменения, о которых автор ленится написать. Основная идея: минимизировать трафик, требуемый для получения обновлений. С этой целью всё пожато архиватором 7zip, а новые версии Ткаббера распространяются в виде апдейтов. 



 [TkabberOTC](http://wiki.omsktele.com/index.php/TkabberOTC) 

 Ткаббер-пак от админов провайдера "Омские Телекоммуникации". Допилен на предмет более глубокой русификации + другие изменения. Читайте официальную страницу. _Включает минимальный дистрибутив Tcl/Tk._ 


 [Tkabber-SK](http://sourceforge.net/projects/tkabber-sk/) 

 Этакий "форк" от SVN-версии Ткаббера за конец декабря 2006 года. Автор — `xmpp:tomasz@mastahizm.mooo.com`. В эту версию добавлены разные интересные и не очень штуки (подробности читайте в чейнджлогах на странице проекта). Мы пригласили автора к сотрудничеству с разработчиками, так как некоторые из его фич могут запросто попасть в транк. Да и вообще незачем распылять силы. Фичи, которые в транк не попадут, он вроде обещал выложить в виде патчей на английской версии соответствующего раздела. 






 [Страница Ткаббера на Tcl Wiki](http://wiki.tcl.tk/11080) 

 Содержит ссылки на как минимум два старкита. За подробностями идите по ссылке. 

# <a id="Кто_сильнее_кит_или_пак_Что_выбрать"></a>Кто сильнее: кит или пак? (Что выбрать?)

Какой же я могу, сеньора,
 Подать совет там, где решает
 Единственно ваш личный вкус?

[Лопе Де Вега. "Собака на сене"](http://www.lib.ru/DEVEGA/vega2.txt) 

Изложенное здесь есть частное мнение авторов статьи, которое не обязано совпадать с вашим, так что имейте в виду известный девиз: _"на наше мнение можно положить(ся)"_ © [AG.ru](http://www.ag.ru). Включайте голову, изучайте и делайте свой выбор. 




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




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







Следует иметь в виду, сравнивая дистрибутивы: 

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



## <a id="Каноническая_установка_Tcl_Tk_+_Ткаббер"></a>"Каноническая" установка: Tcl/Tk + Ткаббер

Вначале рассмотрим вариант с наличием полноценного дистрибутива Tcl/Tk в системе. 


### <a id="Осевой_вариант"></a>Осевой вариант

Выбор авторов статьи (при этих словах вы должны представлять себе везде седых и лысых везде, где не седы, старцев с хитрым прищуром мудрых глаз) — "дистрибутив из вашей ОС". Действительно ли вам нужна Самая Последняя Версия? Признайтесь себе: вы знаете чем она отличается от предыдущей? Есть ли в версии из вашего дистрибутива Ужасные Баги, С Которыми Вы Не Можете Жить? Имейте в виду мудрый принцип: "не сломалось — не чини". 






Кроме того, данный подход имеет другие достоинства: 

*  Стандартный пакет означает стандартный подход к управлению ПО. Вы всегда знаете, "чей это файл", можете удалить пакет, а ещё он обновится вместе с дистрибутивом в ходе очередного апгрейда. 


*  Если вам повезло с мейнтейнером пакета, ваша пакетная система не только поставит вам всё, от чего зависит Ткаббер, но и предложит поставить то, с чем он любит работать. 



Безусловно, если в вашей системе есть Ткаббер, то в ней, как минимум, есть дистрибутив Tcl/Tk и набор необходимых Ткабберу компонентов. 


Имейте, однако, в виду, что "Ткаббер из ОС" это, в основном, роскошь линуксоидов и эээ... пользователей FreeBSD. Адептам Windows предлагается изучить альтернативы. 



Больше всех, пожалуй, повезло пользователям [Debian GNU/Linux](http://www.debian.org): один из разработчиков Ткаббера (`xmpp:sgolovan@nes.ru`) является пользователем этой ОС и поддерживает [собственный репозиторий пакетов](http://sgolovan.nes.ru/jabber/), содержащий, помимо прочего, готовые пакеты с наиболее полезными расширениями для Ткаббера. Так что любителям Дебиана достаточно вписать себе в **sources.list** дополнительный репозиторий и наслаждаться. 






В любом случае, почти со стопроцентной уверенностью можно сказать, что дистрибутив Tcl и Tk есть в любой "десктопной" POSIX-системе. О том, что делать, когда его нет, читайте ниже. 



Если ваша система не имеет дистрибутива Ткаббера, но имеет дистрибутив Tcl/Tk, возможно, следует просто скачать стандартный дистрибутив Ткаббера ("исходники") и развернуть его куда-нибудь под **/usr/local/share**. 



### <a id="Windows_не_бейсиком_единым..."></a>Windows: не бейсиком единым...

Сотрудники Майкрософт обладают достаточно извращённым вкусом в области языков программирования. Поэтому в вашей Windows-системе есть минимум два бейсика и, возможно, минимум одна джава. И ни одного тикля. Не исключено, что недостаток внимания этой фирмы к данному языку сыграл последнему на пользу, избавив его от  смертельного дыхания [одного известного принципа](http://en.wikipedia.org/wiki/Embrace_and_extend). В любом случае, вас касается одна проблема: дистрибутива Tcl/Tk с Windows не поставляется. 








Стандартом де-факто в области Tcl/Tk под Windows является дистрибутив от фирмы [ActiveState](http://www.activestate.com), скачать который можно [здесь](http://www.activestate.com/Products/ActiveTcl/). Как уверяют авторы, в этом тикле "включены все батарейки", однако они лукавят: далеко не все батарейки там есть. Выкачав 21 мег дистра, вы не получите, например, такой элементарной вещи как [tcllib](http://tcllib.sourceforge.net/). Этот дистрибутив имеет удобную справочную систему, программу **tkcon** и массу других вещей, которая _может_ вам понадобиться (а может — и нет), например, в windows-версиях включает в себя средства интеграции с [Windows Script Host](http://ru.wikipedia.org/wiki/Windows_Script_Host). Какие-либо инструментальные средства, облегчающие жизнь программиста, отсутствуют. Фирма продаёт пакет TclDevKit, содержащий средства отладки и создания автономных программ (последнее на базе технологии StarKit), и Komodo — универсальное IDE для скриптовых языков, включающее средства визуального программирования Tk-форм. 















[WinTclTk](http://sourceforge.net/projects/wintcltk) — более компактный, активно развивающийся дистрибутив для Windows. В этот дистрибутив входят Tloona IDE — среда разработки традиционного типа и ХOTclIde — среда объектно-ориентированного программирования в стиле Smalltalk, обе — с отладчиками. Также на сайте разработчиков свободно доступен пакет для создания единого запускаемого файла TkWrapper основанный на FreeWrap — технологии, альтернативной StarKit, основанной на простом ZIP-сжатии. 








 _Внимание!_ Если вы решили установить дистрибутив от [ActiveState](http://www.activestate.com), настоятельно рекомендуется принять к сведению два совета: 


*  Ставьте стабильную версию (8.4.x и 8.5.x в настоящий момент). 
*  _**Не** ставьте_ версию 8.4.15 — она содержит пару неприятных проблем, затрагивающих Ткаббер. 


Настало время поговорить по поводу "может". 

### <a id="Дистрибутив_Tcl_Tk_в_системе_pros_et_contras"></a>Дистрибутив Tcl/Tk в системе: pros et contras

Два основных "за" наличие дистрибутива в системе: 

*  _Расширение возможностей системы_ — вам становится доступен мощный и в то же время лёгкий  в изучении язык программирования. Возможно, вы захотите использовать его. Кроме того, _на Ткаббере свет клином не сошёлся_ — в мире хватает хороших программ, написанных на тикле; устанавливая дистрибутив Tcl/Tk, вы даёте себе возможность использовать их без дополнительного "геморроя". 





*  _Работа с кодом Ткаббера._ По разным причинам у вас может возникнуть желание/необходимость работать непосредственно с кодом Ткаббера. Вот эти причины: 


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

 *  Вы хотите накладывать на Ткаббер неофициальные и экспериментальные патчи, или патчи, которые не принимают в основную ветку разработки. 

 *  Вы хотите ковыряться с кодом Ткаббера (пусть даже и в режиме "только чтение", например, изучения ради), а то и участвовать в разработке. 


Несмотря на то, что всё это технически можно делать и со старкитом/старпаком, при наличии дистрибутива Tcl/Tk это делать значительно проще. 


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







Ради сохранения баланса Силы, скрепя сердце, приведём и два основных "против": 

*  _Интернет-трафик._ Под Windows скачивание 20-мегабайтного архива из Интернет — единственная возможность получить полноценный дистрибутив Tcl/Tk. На POSIX-системах, возможно, также потребуется качать нужные пакеты. 


*  _Борьба за "чистоту рядов"._ Некоторые пользователи (чрезмерно) ревниво относятся к "чистоте" своей системы и противятся установке любого "ах, ещё одного языка программирования!". 



 Иногда, впрочем, установка дистрибутива Tcl/Tk не только нежелательна, но и невозможна. Если это — ваш случай <s>или, читая предыдущие строчки, вы решили встать на тёмную сторону Силы</s>, следующий раздел — для вас. 



## <a id="Всё_своё_ношу_с_собой"></a>Всё своё ношу с собой

Собственно, преимущества и недостатки использования "завёрнутых" версий Ткаббера примерно обратны использованию "канонической" установки. 


Плюсы: 

*  _"Всё в одном"_ — Ткаббер-старпак представляет собой один выполняемый файл, который нужно просто запустить. Ткаббер-старкит — два файла, которые тоже не нужно не только куда-то ставить, но и даже распаковывать. 


*  При некотором (несложном) "допиливании" Ткаббер-старпак прекрасно умеет работать с носимого устройства хранения данных, например, с флэш-драйва. То же самое относится и к старкиту, только таскать нужно опять же два файла. 


*  Официальные старпаки содержат большинство самых полезных модулей Tcl/Tk, расширяющих возможности Ткаббера — _отсутствие необходимости в дополнительной установке расширений._ 



Минусы проистекают из всё той же "упакованности": 

*  Любое изменение "внутренностей" старпака/старкита требует его _"разворачивания" (unwrap)_ и последующего _"заворачивания" (wrap)_ (подробнее эти процедуры обсуждаются [здесь](Tkabber_starpack.md)). Это вам понадобится делать, если вы хотите: 



 *  добавить модуль Tcl/Tk, расширяющий возможности Ткаббера, которого нет в стандартной поставке старпака/старкита; 

 *  наложить какой-либо патч. 
 
*  Официальные дистрибутивы Ткаббера — это стабильные релизы. Если вы хотите быть "на переднем крае" разработки, но при этом использовать старпак/старкит, то фактически вам придётся поддерживать свою версию такого дистрибутива. 




![(!)](../images/Hammer.png) **Сделать:** Вообще-то, конечно, нужна обобщённая статейка про старкиты и старпаки, со ссылкой на систему сборки бадлопа и утилиту архимеда... 



### <a id="Ткаббер-пак_опять_идёт_не_в_ногу"></a>Ткаббер-пак опять идёт не в ногу

Нелишним будет снова повторить, что последний _официальный_ Ткаббер-пак больше не содержит Tcl/Tk, поэтому фактически нам нужно рассматривать два воплощения Ткаббер-пака: оснащённое Tcl/Tk и обделённое им. 



Преимущество Ткаббер-пака по сравнению со старпаками/старкитами Ткаббера заключается в том, что его значительно легче _изменять_ — Ткаббер включён в этот дистрибутив "как есть": не нужно ничего "разворачивать" и потом "сворачивать" обратно для того, чтобы потестировать патч или почитать код. 




К недостаткам в сравнении со старпаками/старкитами, пожалуй, можно причислить только то, что он занимает больше места (но зато и стартует быстрее). 


Ткаббер-пак, _оснащённый дистрибутивом Tcl/Tk,_ обладает таким же уровнем мобильности как и старпак/старкит (например, умеет работать с флэш-драйва), и привязан к конкретной ОС так же, как и старпак (нам известно только о Windows-версиях Ткаббер-пака). Несмотря на то, что в подобном дистрибутиве есть "настоящий" Tcl/Tk, относитесь к этому с определённым скепсисом: это достаточно урезанная версия, содержащая только то, без чего не может обойтись Ткаббер. 






Может возникнуть вопрос: а в чём смысл Ткаббер-пака _без_ микро-дистрибутива Tcl/Tk внутри? Ответ прост: Ткаббер-пак включает в себя наиболее полезные пакеты Tcl/Tk, которые делают доступными дополнительные возможности Ткаббера. Можете думать о нём как о "Ткаббере на стероидах". Естественно, можно скачать и поставить дополнительные пакеты "руками", но зачем вам лишний труд? 




Changes to wiki/ru/Заглавная_страница.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103

104
105

106
107
108


109


110
111
112
113
114
115

116
117
118
119


120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php?title=Заглавная_страница&printable=yes)


# Заглавная страница

Материал из Tkabber Wiki

> _<Существо> Клиент делался не для юзеров.  
> А для тех, кто ценит функциональность и не боится руками работать._

> _(из xmpp:tkabber@conference.jabber.ru)_

Добро пожаловать на официальную страницу документации одного из самых продвинутых клиентов
протокола [Jabber (XMPP)](http://jabber.org) — [Tkabber](http://tkabber.jabber.ru).

Давайте сразу договоримся, что в этом руководстве (по крайней мере в русской версии) писать
название программы будем русскими буквами: в конце концов, это отечественный продукт, да и
склонять по правилам русского языка проще ;)

## <a id="toc"></a>Содержание

* [1 Содержание вики](#Содержание_вики)
   * [1.1 Теория](#Теория)
   * [1.2 Статьи](#Статьи)
   * [1.3 Разработка](#Разработка)
   * [1.4 Практика](#Практика)
   * [1.5 Запчасти](#Запчасти)
   * [1.6 Обсуждения](#Обсуждения)
   * [1.7 Cлужебные](#Cлужебные)
* [2 Краткое описание некоторых статей](#Краткое_описание_некоторых_статей)
* [3 О вики](#О_вики)

## <a id="Содержание_вики"></a>Содержание вики
Для быстрого тематического поиска. Не забудьте, что полный список страниц можно
посмотреть [**тут**](Служебная/Все_страницы.md).

### <a id="Теория"></a>[Теория](Теория.md)

*  [**Терминология**](Терминология.md)
*  [**О Ткаббере**](Ткаббер_-_чемпион_.md)
*  [**Config.tcl для начинающих**](Config.tcl_для_начинающих.md)
*  [**Начинающим**](Начинающим.md)
*  [**Настройка Ткаббера: азы и глубже**](Настройка_Ткаббера__азы_и_глубже.md)
*  [**Testimonials, Antimonials, And Eternal Questions**](Testimonials__Antimonials__And_Eternal_Questions.md)

### <a id="Статьи"></a>[Статьи](Теория.md#Продвинутым_пользователям)

*  [**Пересылка файлов: теория**](Пересылка_файлов__теория.md)
*  [**Удалённое управление с помощью send**](Удалённое_управление_с_помощью_send.md)
*  [**Шифрование в Ткаббере**](Шифрование_в_Ткаббере.md)
*  [**Ткаббер наизнанку**](Ткаббер_наизнанку.md)
*  [**Сравнение XMPP-клиентов**](Сравнение_XMPP-клиентов.md)

### <a id="Разработка"></a>[Разработка](Разработка.md)

*  [**Старпак своими руками**](Tkabber_starpack.md)
*  [**Wish и русская раскладка в Windows**](Wish_и_русская_раскладка_в_Windows.md)
*  [**MUC Ignore**](MUC_Ignore.md)
*  [**Nick coloring**](Nick_coloring.md)
*  [**Config dir**](Config_dir.md)
*  [**Спамодавка списками приватности**](Спамодавка_списками_приватности.md)
*  [**Новый вид Tk в 8.5**](Новый_вид_Tk_в_8.5.md)

### <a id="Практика"></a>[Практика](Практика.md)

*  [**Ткаббер ЧаВо**](Ткаббер_ЧаВо.md)
*  [**Шрифты**](Шрифты.md)
*  [**Смайлики и аватары**](Смайлики_и_аватары.md)
*  [**Цветовые темы и пиктограммы**](Цветовые_темы_и_пиктограммы.md)
*  [**Проблемы со звуком**](Проблемы_со_звуком.md)
*  [**Звуковые схемы**](Звуковые_схемы.md)
*  [**Нетривиальные настройки**](Нетривиальные_настройки.md)

### <a id="Запчасти"></a>Запчасти

*  [**Плагины**](Плагины.md)
*  [**Патчи**](Патчи.md)

### <a id="Обсуждения"></a>Обсуждения

*  [**Планы на будущее**](Планы_на_будущее.md)
*  [**Плагины/AntiSPIM**](Плагины/AntiSPIM.md)
*  [**Чебуратор**](Чебуратор.md)

### <a id="Cлужебные"></a>Cлужебные

[*Статистика*](Служебная/Статистика.md) :: [*Участники*](Служебная/Участники.md) :: [*Требуется*](Служебная/Требуется.md)

## <a id="Краткое_описание_некоторых_статей"></a>Краткое описание некоторых статей
*  В статье [**"О Ткаббере"**](Ткаббер_-_чемпион_.md) мы пытаемся рассказать потенциальному
   пользователю об основных плюсах и минусах (да-да, они тоже есть ;)) этого клиента.
*  В разделе [**"Теория"**](Теория.md) вашему вниманию предложен ряд статей разного
   уровня сложности, посвящённых различным аспектам работы с Ткаббером, начиная с
   "Быстрого старта" и заканчивая попытками простым языком рассказать о довольно-таки
   сложных вещах. Очень рекомендуется потихоньку ознакомиться со всеми статьями этого раздела.
*  В разделе [**"Практика"**](Практика.md) вы найдёте полезные советы по "укрощению"
   Ткаббера, а также описания различных патчей и плагинов, расширяющих его функциональность.
   В общем, это для тех, кто любит ручной труд.
*  [**"Ткаббер ЧаВо"**](Ткаббер_ЧаВо.md) — **Ча**сто задаваемые **Во**просы по Ткабберу
   (или F.A.Q., если так будет привычнее). Здесь потихоньку собираются решения самых
   распространённых проблем.
*  Страница [**"Ссылки"**](Ссылки.md) — коллекция линков на внешние ресурсы, посвящённые
   как самому Ткабберу, так и протоколу Jabber, языку, на котором Ткаббер
   написан — [Tcl/Tk](http://tcl.tk) и прочим вещам, имеющим ко всему этому отношение.


Ещё несколько ссылок на крупные разделы вики:


*  [**"Терминология"**](Терминология.md) — небольшой глоссарий, цель которого — облегчить
   новичкам понимание некоторых терминов из сфер, сопряжённых с IM, Jabber, Tcl/Tk, программированием.


*  [**"Плагины"**](Плагины.md) — раздел, посвящённый официальным и неофициальным


   (самописным) плагинам к Ткабберу.
*  [**"Патчи"**](Патчи.md) — тут речь идёт о правках кода Ткаббера, позволяющих расширить
   его функциональность.
*  [**"Pages"**](Pages.md) — этакий реестр статей этой вики (неполный). Создана для того,
   чтобы можно было давать ссылки на статьи в конференциях и других местах, где не поддерживаются
   тэги HTML. Например, вместо того, чтобы давать ссылку вида

   **https://chiselapp.com/user/sgolovan/repository/tkabber-wiki/doc/tip/wiki/ru/%D0%9F%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD%D1%8B.md**
   (далеко не самый жуткий вариант) можно добавить линк на неё на странице pages и дать уже эту ссылку:
   **https://chiselapp.com/user/sgolovan/repository/tkabber-wiki/doc/tip/wiki/ru/Pages#plugins**.
   Лишний клик окупается более внятным и коротким написанием.



## <a id="О_вики"></a>О вики
По вопросам организации этой вики обращайтесь к [**Bigote**](Участник_Bigote.md) (русский,
английский, испанский, каталанский), [**Kostix**](Участник_Kostix.md) (русский,
английский) или [**LKnight**](Участник_Lknight.md) (русский, английский) — нас можно
найти также на вышеупомянутой конференции `xmpp:tkabber@conference.jabber.ru`.

Работа над вики доступна для всех — регистрация свободна. Проект многоязычный, в настоящий
момент существует четыре языковые версии: русский, английский, испанский и украинский.
Если вы хотите перевести статьи вики на какой-либо другой язык, пожалуйста, свяжитесь с нами.
При работе над переводом вам поможет наша [**Справка**](Tkabber_Wiki_Справка.md).

Если вы настроены серьёзно в плане помочь этой вики и Ткабберу мозгами и руками, просьба
ознакомиться с нашими [**планами на будущее**](Планы_на_будущее.md), чтобы не изобретать
велосипед. Если у вас есть свои идеи по части новшеств, которые вы хотите воплотить,
просьба добавлять их на той странице, чтобы они были видны остальным участникам проекта.
Если у вас нету опыта работы с вики, на странице [**Справки**](Tkabber_Wiki_Справка.md)
есть очень полезные ссылки на тему оформления тегов, ссылок и прочего.

В последнее время нас спрашивают, who is who в конференции и на вики. Старожил конференции
и один из основателей вики [**Bigote**](Участник_Bigote.md) готов рассказать
вам [**историю их создания**](История_вики.md), если вы не пожалеете для старика пинты
пива — промочить глотку ;-D

>





<
<
<
<
<
|
<

|
<
<



|
|
|
|
|
|
|
|



|
|
<

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
|
|
|
|
|
|
|
|
|
<
<
<
|
|
<
<
>
|
<
>

<
<
>
>
|
>
>
|
<
<
<
<
|
>
|
<
|
|
>
>

|
|
<
<
<

|
<
<
<

|
<
<
<
<
<

|
|
|
<
1
2
3
4
5
6
7





8

9
10


11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63















64
65
66
67
68
69
70
71
72
73



74
75


76
77

78
79


80
81
82
83
84
85




86
87
88

89
90
91
92
93
94
95



96
97



98
99





100
101
102
103

[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php?title=Заглавная_страница&printable=yes)


# Заглавная страница

Материал из Tkabber Wiki






Добро пожаловать на официальную страницу документации одного из самых продвинутых клиентов протокола [Jabber (XMPP)](http://jabber.org) — [Tkabber](http://tkabber.jabber.ru). 


Давайте сразу договоримся, что в этом руководстве (по крайней мере в русской версии) писать название программы будем русскими буквами: в конце концов, это отечественный продукт, да и склонять по правилам русского языка проще ;) 



## <a id="toc"></a>Содержание

* [1 Содержание](#Содержание)
 * [1.1 [Теория](Теория.md)](#ТеорияТеория.md)
 * [1.2 [Статьи](Теория.md#Продвинутым_пользователям)](#СтатьиТеория.mdNПродвинутым_пользователям)
 * [1.3 [Разработка](Разработка.md)](#РазработкаРазработка.md)
 * [1.4 [Практика](Практика.md)](#ПрактикаПрактика.md)
 * [1.5 Запчасти](#Запчасти)
 * [1.6 Обсуждения](#Обсуждения)
 * [1.7 Cлужебные](#Cлужебные)
* [2 Краткое описание некоторых статей](#Краткое_описание_некоторых_статей)
* [3 О вики](#О_вики)

# <a id="Содержание"></a>Содержание
Для быстрого тематического поиска. Не забудьте, что полный список страниц можно посмотреть [тут.](Служебная_AllPages.md) 


## <a id="ТеорияТеория.md"></a>[Теория](Теория.md)
 
*  [Терминология](Терминология.md) 
*  [о Ткаббере](Ткаббер_-_чемпион_.md) 
*  [Config.tcl для начинающих](Config.tcl_для_начинающих.md) 
*  [Начинающим](Начинающим.md) 
*  [Настройка Ткаббера: азы и глубже](Настройка_Ткаббера__азы_и_глубже.md) 
*  [Testimonials, Antimonials, And Eternal Questions](Testimonials__Antimonials__And_Eternal_Questions.md) 
  
## <a id="СтатьиТеория.mdNПродвинутым_пользователям"></a>[Статьи](Теория.md#Продвинутым_пользователям)
 
*  [Пересылка файлов: теория](Пересылка_файлов__теория.md) 
*  [Удалённое управление с помощью send](Удалённое_управление_с_помощью_send.md) 
*  [Шифрование в Ткаббере](Шифрование_в_Ткаббере.md) 
*  [Ткаббер наизнанку](Ткаббер_наизнанку.md) 
*  [Сравнение XMPP-клиентов](Сравнение_XMPP-клиентов.md) 
  
## <a id="РазработкаРазработка.md"></a>[Разработка](Разработка.md)
 
*  [Старпак своими руками](Tkabber_starpack.md) 
*  [Wish и русская раскладка в Windows](Wish_и_русская_раскладка_в_Windows.md) 
*  [MUC Ignore](MUC_Ignore.md) 
*  [Nick coloring](Nick_coloring.md) 
*  [Config dir](Config_dir.md) 
*  [Спамодавка списками приватности](Спамодавка_списками_приватности.md) 
*  [Новый вид Tk в 8.5](Новый_вид_Tk_в_8.5.md) 

## <a id="ПрактикаПрактика.md"></a>[Практика](Практика.md)
 
*  [Ткаббер ЧаВо](Ткаббер_ЧаВо.md) 
*  [Шрифты](Шрифты.md) 
*  [Смайлики и аватары](Смайлики_и_аватары.md) 
*  [Цветовые темы и пиктограммы](Цветовые_темы_и_пиктограммы.md) 
*  [Проблемы со звуком](Проблемы_со_звуком.md) 
*  [Звуковые схемы](Звуковые_схемы.md) 
*  [Нетривиальные настройки](Нетривиальные_настройки.md) 















  
## <a id="Запчасти"></a>Запчасти
 
*  лагины](Плагины.md) 
*  атчи](Патчи.md) 
  
## <a id="Обсуждения"></a>Обсуждения
 
*  [Планы на будущее](Планы_на_будущее.md) 
*  лагины/AntiSPIM](Плагины/AntiSPIM.md) 



*  [Чебуратор](Чебуратор.md) 



## <a id="Cлужебные"></a>Cлужебные
 

[Статистика](Служебная_Statistics.md) :: [Участники](Служебная_ListUsers.md) :: [Требуется](Служебная_WantedPages.md) 



# <a id="Краткое_описание_некоторых_статей"></a>Краткое описание некоторых статей
*  В статье **["О Ткаббере"](Ткаббер_-_чемпион_.md)** мы пытаемся рассказать потенциальному пользователю об основных плюсах и минусах (да-да, они тоже есть ;)) этого клиента. 
*  В разделе **["Теория"](Теория.md)** вашему вниманию предложен ряд статей разного уровня сложности, посвящённых различным аспектам работы с Ткаббером, начиная с "Быстрого старта" и заканчивая попытками простым языком рассказать о довольно-таки сложных вещах. Очень рекомендуется потихоньку ознакомиться со всеми статьями этого раздела. 
*  В разделе **["Практика"](Практика.md)** вы найдёте полезные советы по "укрощению" Ткаббера, а также описания различных патчей и плагинов, расширяющих его функциональность. В общем, это для тех, кто любит ручной труд. 
*  **["Ткаббер ЧаВо"](Ткаббер_ЧаВо.md)** — **Ча**сто задаваемые **Во**просы по Ткабберу (или F.A.Q., если так будет привычнее). Здесь потихоньку собираются решения самых распространённых проблем. 
*  Страница **["Ссылки"](Ссылки.md)** — коллекция линков на внешние ресурсы, посвящённые как самому Ткабберу, так и протоколу Jabber, языку, на котором Ткаббер написан — [Tcl/Tk](http://tcl.tk) и прочим вещам, имеющим ко всему этому отношение. 





Ещё несколько ссылок на крупные разделы вики: 


*  **["Терминология"](Терминология.md)** — небольшой глоссарий, цель которого — облегчить новичкам понимание некоторых терминов из сфер, сопряжённых с IM, Jabber, Tcl/Tk, программированием. 
*  **["Плагины"](Плагины.md)** — раздел, посвящённый официальным и неофициальным (самописным) плагинам к Ткабберу. 
*  **["Патчи"](Патчи.md)** — тут речь идёт о правках кода Ткаббера, позволяющих расширить его функциональность. 
*  **["Pages"](Pages.md)** — этакий реестр статей этой вики (неполный). Создана для того, чтобы можно было давать ссылки на статьи в конференциях и других местах, где не поддерживаются тэги HTML. Например, вместо того, чтобы давать ссылку вида http://ru.tkabber.jabe.ru/index.php/%D0%9F%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD%D1%8B (далеко не самый жуткий вариант) можно добавить линк на неё на странице pages и дать уже эту ссылку: **http://tkabber.jabe.ru/index.php/pages\#plugins**. Лишний клик окупается более внятным и коротким написанием. 

# <a id="О_вики"></a>О вики
По вопросам организации этой вики обращайтесь к [Участник:bigote](Участник_Bigote.md) (русский, английский, испанский, каталанский), [Участник:kostix](Участник_Kostix.md) (русский, английский) или [Участник:lknight](Участник_Lknight.md) (русский, английский) — нас можно найти также на вышеупомянутой конференции `xmpp:tkabber@conference.jabber.ru`. 




Работа над вики доступна для всех — регистрация свободна. Проект многоязычный, в настоящий момент существует четыре языковые версии: русский, английский, испанский и украинский. Если вы хотите перевести статьи вики на какой-либо другой язык, пожалуйста, свяжитесь с нами. При работе над переводом вам поможет наша **[Справка](Tkabber_Wiki_Справка.md).** 




Если вы настроены серьёзно в плане помочь этой вики и Ткабберу мозгами и руками, просьба ознакомиться с нашими **[планами на будущее](Планы_на_будущее.md)**, чтобы не изобретать велосипед. Если у вас есть свои идеи по части новшеств, которые вы хотите воплотить, просьба добавлять их на той странице, чтобы они были видны остальным участникам проекта. Если у вас нету опыта работы с вики, на странице **[Справки](Tkabber_Wiki_Справка.md)** есть очень полезные ссылки на тему оформления тегов, ссылок и прочего. 






В последнее время нас спрашивают, who is who в конференции и на вики. Старожил конференции и один из основателей вики [Bigote](Участник_Bigote.md) готов рассказать вам [историю их создания](История_вики.md), если вы не пожалеете для старика пинты пива — промочить глотку ;-D 



Changes to wiki/ru/Загрузка_настроек.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Загрузка_настроек/index.html)


# Загрузка настроек

Материал из Tkabber Wiki

## <a id="Хуки"></a>  Хуки

"Хуком" в Ткаббере называется некоторое _событие_ (условия наступления которого
строго оговорены и обычно отражены в названии хука), с которым связаны
_обработчики_ данного события. Некоторые события происходят лишь однократно в
ходе работы Ткаббера (например, "выход из программы"), другие — многократно
(например, "обработка нового входящего сообщения").

Механизм хуков предоставляет интерфейс для закрепления обработчиков за
соответствующими хуками. В качестве обработчиков выступают
_скрипты_<sup>1</sup>.

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

Приоритет обработчика задаётся в виде целого числа. Меньшее число означает
более высокий приоритет; обработчики вызываются в порядке уменьшения приоритета
(увеличения соответствующих чисел).

Если приоритет не указан явно, обработчик получает _приоритет по умолчанию,_
который равен 50<sup>2</sup>.

![(!)](../images/Hammer.png) **Сделать:** написать про "return stop"

## <a id="Ход_загрузки_Ткаббера"></a>  Ход загрузки Ткаббера

Процесс **wish**:

1. Читает стартовый (главный) модуль Ткаббера, который:
   1. Грузит модуль, реализующий механизм работы с хуками.
   1. Определяет хуки **postload\_hook** и **finload\_hook**; вешает на каждый
      хук по обработчику: процедуру **postload** на **postload\_hook** и
      **finload** — на **finload\_hook**.
   1. Если определена переменная окружения **TKABBER\_SITE\_CONFIG**, читает
      файл с названием, хранящимся в этой переменной окружения.
   1. Читает _конфиг пользователя_ — **~/.tkabber/config.tcl**.
   1. Грузит модуль, реализующий механизм работы с базой данных настроек (customize).
      1. Этот модуль регистрирует обработчик хука **postload\_hook** с
	 приоритетом **60**. Задача обработчика — прочитать настройки Ткаббера
	 из файла **~/.tkabber/custom.tcl**.
   1. Загружает [**плагины сайта**](Плагины.md#Плагинология).
   1. Загружает [**плагины пользователя**](Плагины.md#Плагинология).
   1. Выполняет зарегистрированные на данный момент обработчики хука
      **postload\_hook** (при этом читается содержимое базы данных настроек).
   1. Загружает модуль **iface.tcl**, который
      ![(!)](../images/Hammer.png) **Сделать:**  написать
   1. Выполняет обработчики хука **finload\_hook**.

1.  Переходит к выполнению главного цикла событий Tk, то есть начиная с этого
    момента загрузка Ткаббера завершена.

## <a id="Следствия"></a>  Следствия

---

<sup>1</sup> Чтобы не забивать голову, достаточно считать, что скрипт это
самостоятельный "кусок кода", то есть нечто такое, что интерпретатор тикля
может "выполнить". Главное условие, которе должно соблюдаться при написании
скрипта: он должен представлять собой
[_одно слово (word)_ в терминах тикля](http://wiki.tcl.tk/14940); поэтому
многострочный скрипт обычно заключают в фигурные скобки `{ }`, т.к. они как раз
выполняют группировку текста в слово.

<sup>2</sup> Приоритет, равный 100, обычно назначается "обработчику по
умолчанию" ("fall-through handler"). ![(!)](../images/Hammer.png) **Сделать:**
написать -- зачем

>





|

|
<
<
<
<

|
<
<

|
<
<
<

|
<
<

|
<

|

|

|

|
|
|
<
<
|
<
|
|
<
|
|
|
|
|
<
<
|
|
>
|
<

|



|
<
<
<
<
<
<

|
|
|
1
2
3
4
5
6
7
8
9
10




11
12


13
14



15
16


17
18

19
20
21
22
23
24
25
26
27
28


29

30
31

32
33
34
35
36


37
38
39
40

41
42
43
44
45
46






47
48
49
50
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Загрузка_настроек/index.html)


# Загрузка настроек

Материал из Tkabber Wiki

## <a id="Хуки"></a>  Хуки 

"Хуком" в Ткаббере называется некоторое _событие_ (условия наступления которого строго оговорены и обычно отражены в названии хука), с которым связаны _обработчики_ данного события. Некоторые события происходят лишь однократно в ходе работы Ткаббера (например, "выход из программы"), другие — многократно (например, "обработка нового входящего сообщения"). 





Механизм хуков предоставляет интерфейс для закрепления обработчиков за соответствующими хуками. В качестве обработчиков выступают _скрипты_<sup>1</sup>. 



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




Приоритет обработчика задаётся в виде целого числа. Меньшее число означает более высокий приоритет; обработчики вызываются в порядке уменьшения приоритета (увеличения соответствующих чисел). 



Если приоритет не указан явно, обработчик получает _приоритет по умолчанию,_ который равен 50<sup>2</sup>. 


![(!)](../images/Hammer.png) **Сделать:** написать про "return stop" 

## <a id="Ход_загрузки_Ткаббера"></a>  Ход загрузки Ткаббера 

Процесс **wish**: 

1.  Читает стартовый (главный) модуль Ткаббера, который: 
 1.  Грузит модуль, реализующий механизм работы с хуками. 
 1.  Определяет хуки **postload\_hook** и **finload\_hook**; вешает на каждый хук по обработчику: процедуру **postload** на **postload\_hook** и **finload** — на **finload\_hook**. 


 1.  Если определена переменная окружения **TKABBER\_SITE\_CONFIG**, читает файл с названием, хранящимся в этой переменной окружения. 

 1.  Читает _конфиг пользователя_ — **~/.tkabber/config.tcl**. 
 1.  Грузит модуль, реализующий механизм работы с базой данных настроек (customize). 

  1.  Этот модуль регистрирует обработчик хука **postload\_hook** с приоритетом **60**. Задача обработчика — прочитать настройки Ткаббера из файла **~/.tkabber/custom.tcl**. 
 
 1.  Загружает [плагины сайта](Плагины.md#Плагинология). 
 1.  Загружает [плагины пользователя](Плагины.md#Плагинология). 
 1.  Выполняет зарегистрированные на данный момент обработчики хука **postload\_hook** (при этом читается содержимое базы данных настроек). 


 1.  Загружает модуль **iface.tcl**, который ![(!)](../images/Hammer.png) **Сделать:**  написать 
 1.  Выполняет обработчики хука **finload\_hook**. 
 
1.  Переходит к выполнению главного цикла событий Tk, то есть начиная с этого момента загрузка Ткаббера завершена. 


## <a id="Следствия"></a>  Следствия 

---

<sup>1</sup> Чтобы не забивать голову, достаточно считать, что скрипт это самостоятельный "кусок кода", то есть нечто такое, что интерпретатор тикля может "выполнить". Главное условие, которе должно соблюдаться при написании скрипта: он должен представлять собой [_одно слово (word)_ в терминах тикля](http://wiki.tcl.tk/14940); поэтому многострочный скрипт обычно заключают в фигурные скобки `{ }`, т.к. они как раз выполняют группировку текста в слово. 







<sup>2</sup> Приоритет, равный 99, обычно назначается "обработчику по умолчанию" ("fall-through handler"). ![(!)](../images/Hammer.png) **Сделать:**  написать -- зачем 


Changes to wiki/ru/Звуковые_схемы.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24


25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94


[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Звуковые_схемы/index.html)


# Звуковые схемы

Материал из Tkabber Wiki

На этой странице когда-нибудь появится огромное количество новых звуковых схем
для Ткаббера.

## <a id="toc"></a>Содержание

* [1 Схема "Акустика" (она же будущая дефолтная)](#Схема_Акустика_она_же_будущая_дефолтная)
   * [1.1 1-я версия](#1-я_версия)
   * [1.2 2-я версия](#2-я_версия)
   * [1.3 3-я версия](#3-я_версия)
   * [1.4 4-я версия, вошедшая в транк](#4-я_версия_вошедшая_в_транк)
      * [1.4.1 Та же версия, но уже в стерео](#Та_же_версия_но_уже_в_стерео)
      * [1.4.2 Та же версия, но уже в Hi-Fi качестве](#Та_же_версия_но_уже_в_Hi-Fi_качестве)
   * [1.5 Creative Common License](#Creative_Common_License)

# <a id="Схема_Акустика_она_же_будущая_дефолтная"></a>Схема "Акустика" (она же будущая дефолтная)

![](../images/180px-Acoustic_sound_scheme_instruments.jpg)



Пока что выкладываю первый блин — схему, претендующую на то, чтобы стать новой
дефолтной схемой. Буду признателен за отзывы, пожелания, замечания и
конструктивную критику. Направлять их либо прямиком мне, либо высказывать в
конференции, либо оставлять тут в обсуждении статьи.

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

## <a id="1-я_версия"></a>1-я версия

*  **Файл:** [*New\_default\_tkabber\_sound\_theme.zip*](../files/New_default_tkabber_sound_theme.zip) (1218 Кб)

[**ycbl**](Участник_Bigote.md) 03:31, 14 сентября 2008 (MSD)

## <a id="2-я_версия"></a>2-я версия

Я воткнул сюда несколько разных вариантов звука disconnect. Большая просьба
выбрать наилучший. Лично мне нравится disconnect4. Ещё одно пояснение:
chat\_my\_message и groupchat\_my\_message по идее было решено сделать
одинаковыми, потому что и так ясно, что этот звук сопровождает отправку
собственного сообщения. Но всё же я решил сделать один (для групчата) покороче,
подрезав более длинный. На то две причины: во-первых, кому-то эта разница на
слух может оказаться полезной, и он решит использовать оба звука; во-вторых,
даже если захочется оставить лишь один звук, есть возможность выбрать, какой
именно взять.

*  **Файл:** [*Acoustic.theme\_2nd.version.zip*](../files/Acoustic.theme_2nd.version.zip) (1540 Кб)

[**ycbl**](Участник_Bigote.md) 23:32, 16 сентября 2008 (MSD)

## <a id="3-я_версия"></a>3-я версия

Звуки выверены, громкости отлажены. Предлагается к усиленному тестированию,
чтобы устранить все возможно оставшиеся изъяны. Если поправок не будет, можно
использовать этот файл как Hi-Fi (ну, почти Hi-Fi) версию схемы, потому что в
состав Ткаббера она попадёт уже не в 44100-качестве.

*  **Файл:** [*3rd-version\_final.zip*](../files/3rd-version_final.zip) (547 Кб)

[**ycbl**](Участник_Bigote.md) 08:46, 22 сентября 2008 (MSD)

## <a id="4-я_версия_вошедшая_в_транк"></a>4-я версия, вошедшая в транк

Практически идентична 3-й версии, буквально пара мелких поправок. В транк
попала моно-версия звуков, сконвертированных в 11025 Hz (тем не менее, два-три
звука пришлось сконвертировать в 22050, потому что в 11025 у них сильно
терялось качество). Здесь эта версия не выкладывается, скачать её можно через
[**SVN**](SVN_disclaimer.md).

### <a id="Та_же_версия_но_уже_в_стерео"></a>Та же версия, но уже в стерео

Те же 11025 Hz, но уже стерео — для тех, кто хочет дёшево и сердито
наслаждаться объёмным звучанием :) Правда, два звука всё равно остались в моно,
потому что так были записаны.

*  **Файл:** [*New\_default\_theme\_11k-22k\_stereo.zip*](../files/New_default_theme_11k-22k_stereo.zip) (173 Кб)

### <a id="Та_же_версия_но_уже_в_Hi-Fi_качестве"></a>Та же версия, но уже в Hi-Fi качестве

44100 Hz, 32 bit. Для тех, кому процессор не помеха :)

*  **Файл:** [*New\_default\_theme\_44100.zip*](../files/New_default_theme_44100.zip) (544 Кб)

## <a id="Creative_Common_License"></a>Creative Common License

Эта звуковая схема (все версии, начиная с самой первой) распространяется под
лицензией [Creative Common License](http://creativecommons.org/licenses/by-nc-sa/3.0/).

[**ycbl**](Участник_Bigote.md) 00:55, 27 сентября 2008 (MSD)



>





|
<




|
|
|
|
|
|
|





>
>
|
<
<
<

|
<
<



|

|



|
<
<
<
<
<
<
<
<

|

|



|
<
<
<

|

|



|
<
<
<
<



|
<
<

|



|

|



|
<

|
>
>
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27



28
29


30
31
32
33
34
35
36
37
38
39








40
41
42
43
44
45
46
47



48
49
50
51
52
53
54
55




56
57
58
59


60
61
62
63
64
65
66
67
68
69
70
71

72
73
74
75
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Звуковые_схемы/index.html)


# Звуковые схемы

Материал из Tkabber Wiki

На этой странице когда-нибудь появится огромное количество новых звуковых схем для Ткаббера. 


## <a id="toc"></a>Содержание

* [1 Схема "Акустика" (она же будущая дефолтная)](#Схема_Акустика_она_же_будущая_дефолтная)
 * [1.1 1-я версия](#1-я_версия)
 * [1.2 2-я версия](#2-я_версия)
 * [1.3 3-я версия](#3-я_версия)
 * [1.4 4-я версия, вошедшая в транк](#4-я_версия_вошедшая_в_транк)
  * [1.4.1 Та же версия, но уже в стерео](#Та_же_версия_но_уже_в_стерео)
  * [1.4.2 Та же версия, но уже в Hi-Fi качестве](#Та_же_версия_но_уже_в_Hi-Fi_качестве)
 * [1.5 Creative Common License](#Creative_Common_License)

# <a id="Схема_Акустика_она_же_будущая_дефолтная"></a>Схема "Акустика" (она же будущая дефолтная)

![](../images/180px-Acoustic_sound_scheme_instruments.jpg)

![](../images/magnify-clip.png)

Пока что выкладываю первый блин — схему, претендующую на то, чтобы стать новой дефолтной схемой. Буду признателен за отзывы, пожелания, замечания и конструктивную критику. Направлять их либо прямиком мне, либо высказывать в конференции, либо оставлять тут в обсуждении статьи. 




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



## <a id="1-я_версия"></a>1-я версия

*  **Файл:** [Media:New\_default\_tkabber\_sound\_theme.zip](../files/New_default_tkabber_sound_theme.zip) (1218 Кб) 

[ycbl](Участник_Bigote.md) 03:31, 14 сентября 2008 (MSD) 

## <a id="2-я_версия"></a>2-я версия

Я воткнул сюда несколько разных вариантов звука disconnect. Большая просьба выбрать наилучший. Лично мне нравится disconnect4. Ещё одно пояснение: chat\_my\_message и groupchat\_my\_message по идее было решено сделать одинаковыми, потому что и так ясно, что этот звук сопровождает отправку собственного сообщения. Но всё же я решил сделать один (для групчата) покороче, подрезав более длинный. На то две причины: во-первых, кому-то эта разница на слух может оказаться полезной, и он решит использовать оба звука; во-вторых, даже если захочется оставить лишь один звук, есть возможность выбрать, какой именно взять. 









*  **Файл:** [Media:Acoustic.theme\_2nd.version.zip](../files/Acoustic.theme_2nd.version.zip) (1540 Кб) 

[ycbl](Участник_Bigote.md) 23:32, 16 сентября 2008 (MSD) 

## <a id="3-я_версия"></a>3-я версия

Звуки выверены, громкости отлажены. Предлагается к усиленному тестированию, чтобы устранить все возможно оставшиеся изъяны. Если поправок не будет, можно использовать этот файл как Hi-Fi (ну, почти Hi-Fi) версию схемы, потому что в состав Ткаббера она попадёт уже не в 44100-качестве. 




*  **Файл:** [Media:3rd-version\_final.zip](../files/3rd-version_final.zip) (547 Кб) 

[ycbl](Участник_Bigote.md) 08:46, 22 сентября 2008 (MSD) 

## <a id="4-я_версия_вошедшая_в_транк"></a>4-я версия, вошедшая в транк

Практически идентична 3-й версии, буквально пара мелких поправок. В транк попала моно-версия звуков, сконвертированных в 11025 Hz (тем не менее, два-три звука пришлось сконвертировать в 22050, потому что в 11025 у них сильно терялось качество). Здесь эта версия не выкладывается, скачать её можно через [SVN](SVN_disclaimer.md). 





### <a id="Та_же_версия_но_уже_в_стерео"></a>Та же версия, но уже в стерео

Те же 11025 Hz, но уже стерео — для тех, кто хочет дёшево и сердито наслаждаться объёмным звучанием :) Правда, два звука всё равно остались в моно, потому что так были записаны. 



*  **Файл:** [Media:New\_default\_theme\_11k-22k\_stereo.zip](../files/New_default_theme_11k-22k_stereo.zip) (173 Кб) 

### <a id="Та_же_версия_но_уже_в_Hi-Fi_качестве"></a>Та же версия, но уже в Hi-Fi качестве

44100 Hz, 32 bit. Для тех, кому процессор не помеха :) 

*  **Файл:** [Media:New\_default\_theme\_44100.zip](../files/New_default_theme_44100.zip) (544 Кб) 

## <a id="Creative_Common_License"></a>Creative Common License

Эта звуковая схема (все версии, начиная с самой первой) распространяется под лицензией [Creative Common License](http://creativecommons.org/licenses/by-nc-sa/3.0/). 


[ycbl](Участник_Bigote.md) 00:55, 27 сентября 2008 (MSD) 


Changes to wiki/ru/История_вики.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/История_вики/index.html)


# История вики

Материал из Tkabber Wiki

> *— Подымите мне вики: не вижу! — сказал подземным голосом Вий,  
> — и все сонмище кинулось подымать ему вики.*

> *почти © ["Вий"](http://www.fictionbook.ru/en/author/gogol_nikolayi_vasilevich/mirgorod_3_viyi/),
  [Н. В. Гоголь](http://www.fictionbook.ru/en/author/gogol_nikolayi_vasilevich/)*

Возьму на себя смелость осветить историю конференции и вики. Начнём, как водится, с самого начала.

(Следует отметить, что изложение ведётся от лица трилобита [**Bigote**](Участник_Bigote.md).)

## <a id="toc"></a>Содержание

* [1 Палеолит](#Палеолит)
* [2 Мезолит](#Мезолит)
* [3 Неолит](#Неолит)
* [4 Бронзовый век](#Бронзовый_век)
* [5 Железный век](#Железный_век)

## <a id="Палеолит"></a>Палеолит
Когда я осваивал Jabber и выбирал себе программу-клиент, после нескольких проб
остановился на Ткаббере. Клиент мне понравился своей мощью, но как водится,
много чего я не понимал и не умел. Когда я добрался до Дискавери и обнаружил в
списке конференций название Tkabber, радости моей не было предела — наконец-то
авторы Ткаббера или по крайней мере компетентные пользователи разъяснят мне
волнующие вопросы. Зайдя внутрь, я обнаружил несколько строчек вида "Есть тут
кто?" — всё, что осталось от предыдущих посетителей. Я понял, что авторы и
опытные пользователи просто редко сюда заглядывают, и решил их подождать, благо
условия интернета позволяли. Ожидая, я отпустил длинные усы и сам стал немного
более опытным пользователем, чем был вначале. Время от времени заходили
посетители, и если набирались терпения и дожидались меня, мы иногда обсуждали
проблемы, возникающие при работе с Ткаббером. Но потом они уходили, и я снова
оставался один.

## <a id="Мезолит"></a>Мезолит
И вот в один прекрасный день в комнату зашёл [**Lknight**](Участник_Lknight.md). Он
не ушёл, как другие, а остался и стал активно помогать другим пользователям
(которые, видя в списке конференций в Дискавери больше одного человека напротив
слова Tkabber, стали заходить почаще). Я к тому времени пришёл к мысли, что
неплохо бы написать что-то вроде мануала по Ткабберу "для чайников", потому что
большинство заходивших посетителей не интересовали тонкие нюансы протокола
XMPP, но более приземлённые вопросы: "Почему у меня видны такие корявые
шрифты?" Опыт в написании документации у меня
[был](http://netroad.ru/~bigote/articles.htm), но после совещания с Lknight'ом
я понял, что обычные мануалы — это прошлый век. Сейчас такие вещи надо делать в
виде базы знаний на движках wiki. Кроме того, мы подумали, что не помешало бы
включить ведение логов конференции, чтобы решения некоторых задач можно было
найти поисковиками. Окрылённый, я понёсся на `xmpp:devel@conference.jabber.ru`
— просить админов включить логи и "поднять" вики на сервере jabber.ru. Мне было
предложено вести логи путём установки на моём сервере собственного бота,
который бы на этот сервер логи и складывал. Относительно вики помощь была тоже
в виде совета: заняться этим самостоятельно, а "через полгодика посмотрим".

## <a id="Неолит"></a>Неолит
Опять выручил Lknight, подняв вики на своём сервере. На пару с ним мы придумали
основную структуру сайта и начали писать статьи. Между тем на конференции в
один прекрасный день появился и остался один из авторов Ткаббера —
[**Teo**](Участник_Teo.md), а затем в другой не менее прекрасный день пришла ermine
и привела за собой бота sulci. Конференцию, кстати, я уже давно зарегистрировал
на себя, потому что хозяина у неё не было, хоть она и была найдена мной в
списке комнат на Диско. А логи, оказывается, на jabber.ru вообще включаются на
стороне сервера, так что бот у нас просто прохлаждался, оказывая мелкие услуги
и треплясь за жизнь. Мы обучили его некоторым полезным знаниям, которые могут
помочь посетителям (читайте об этом в топике конференции). В общем, так прошло
ещё какое-то время, пока в комнате не появился [**Kostix**](Участник_Kostix.md).
Этот Kostix оказался опытным бойцом и рьяно принялся за дело: на пару с ним мы
практически полностью переделали структуру вики и дописали и переделали многие
статьи. Он и сам написал изрядное их количество — познавательных и интересных.
На конференцию стало заходить ещё больше народу; благодаря общению с этими
людьми улучшилась вики, а в какой-то мере оно повлияло и на новшества,
введённые в версию 0.9.9 Ткаббера.

## <a id="Бронзовый_век"></a>Бронзовый век
В завершение этого краткого экскурса в историю вики следует отметить
[**Feez**](Участник_Feez.md), написавшего ряд плагинов для Ткаббера и очень
интересную статью. Ещё один старатель, добывающий золото плагинов из словесной
руды команд тикля: [**eXire**](Участник_EXire.md). Кстати, некоторые из этих
самодельных плагинов вошли в альфа-версию Ткаббера. Надеемся, список участников
проекта на этом не завершится. Например, камрад [**ART**](Участник_ART.md) вот уже
который месяц рисует новый набор иконок, который, судя по всему, станет
дефолтным в грядущем релизе (если, конечно, будет когда-нибудь дорисован ;)).
Тебе нужен Ткаббер — Ты нужен Ткабберу! ;)

## <a id="Железный_век"></a>Железный век
Начинается новая эра для Ткаббера, ибо недавно вышла свежая его версия 0.10.0.
Точнее, даже не вышла, а выехала на новенькой железной колеснице. Разработчики
навнедряли в неё (в версию) кучи различных железных приспособ,
[**ART**](Участник_ART.md) изукрасил её, а тестеры поубивали всех тараканов. Следом
вышли новый Старпак и Ткаббер-пак. Пора приниматься и за вики: надо новыми
железными мотыгами прополоть её статьи от устаревшей инфы и с помощью новых
железных лопат пересадить хотя бы часть этой инфы на иностранные грядки.

>





|
|

|
<

|

|









|
|
<
<
<
<
<
<
<
<
<
<
<
<

|
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<

|
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<

|
|
<
<
<
<
<
<
<
<

|
|
|
|
<
<
<
<
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
19
20
21
22
23
24
25
26












27
28
29
















30
31
32
















33
34
35








36
37
38
39
40




[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/История_вики/index.html)


# История вики

Материал из Tkabber Wiki

— Подымите мне вики: не вижу! — сказал подземным голосом Вий,
 — и все сонмище кинулось подымать ему вики. 

почти © ["Вий"](http://www.fictionbook.ru/en/author/gogol_nikolayi_vasilevich/mirgorod_3_viyi/), [Н. В. Гоголь](http://www.fictionbook.ru/en/author/gogol_nikolayi_vasilevich/) 


Возьму на себя смелость осветить историю конференции и вики. Начнём, как водится, с самого начала. 

(Следует отметить, что изложение ведётся от лица трилобита [Bigote](Участник_Bigote.md).) 

## <a id="toc"></a>Содержание

* [1 Палеолит](#Палеолит)
* [2 Мезолит](#Мезолит)
* [3 Неолит](#Неолит)
* [4 Бронзовый век](#Бронзовый_век)
* [5 Железный век](#Железный_век)

# <a id="Палеолит"></a>Палеолит
Когда я осваивал Jabber и выбирал себе программу-клиент, после нескольких проб остановился на Ткаббере. Клиент мне понравился своей мощью, но как водится, много чего я не понимал и не умел. Когда я добрался до Дискавери и обнаружил в списке конференций название Tkabber, радости моей не было предела — наконец-то авторы Ткаббера или по крайней мере компетентные пользователи разъяснят мне волнующие вопросы. Зайдя внутрь, я обнаружил несколько строчек вида "Есть тут кто?" — всё, что осталось от предыдущих посетителей. Я понял, что авторы и опытные пользователи просто редко сюда заглядывают, и решил их подождать, благо условия интернета позволяли. Ожидая, я отпустил длинные усы и сам стал немного более опытным пользователем, чем был вначале. Время от времени заходили посетители, и если набирались терпения и дожидались меня, мы иногда обсуждали проблемы, возникающие при работе с Ткаббером. Но потом они уходили, и я снова оставался один. 













# <a id="Мезолит"></a>Мезолит
И вот в один прекрасный день в комнату зашёл [Lknight](Участник_Lknight.md). Он не ушёл, как другие, а остался и стал активно помогать другим пользователям (которые, видя в списке конференций в Дискавери больше одного человека напротив слова Tkabber, стали заходить почаще). Я к тому времени пришёл к мысли, что неплохо бы написать что-то вроде мануала по Ткабберу "для чайников", потому что большинство заходивших посетителей не интересовали тонкие нюансы протокола XMPP, но более приземлённые вопросы: "Почему у меня видны такие корявые шрифты?" Опыт в написании документации у меня [был](http://netroad.ru/~bigote/articles.htm), но после совещания с Lknight'ом я понял, что обычные мануалы — это прошлый век. Сейчас такие вещи надо делать в виде базы знаний на движках wiki. Кроме того, мы подумали, что не помешало бы включить ведение логов конференции, чтобы решения некоторых задач можно было найти поисковиками. Окрылённый, я понёсся на `xmpp:devel@conference.jabber.ru` — просить админов включить логи и "поднять" вики на сервере jabber.ru. Мне было предложено вести логи путём установки на моём сервере собственного бота, который бы на этот сервер логи и складывал. Относительно вики помощь была тоже в виде совета: заняться этим самостоятельно, а "через полгодика посмотрим". 

















# <a id="Неолит"></a>Неолит
Опять выручил Lknight, подняв вики на своём сервере. На пару с ним мы придумали основную структуру сайта и начали писать статьи. Между тем на конференции в один прекрасный день появился и остался один из авторов Ткаббера — [Teo](Участник_Teo.md), а затем в другой не менее прекрасный день пришла ermine и привела за собой бота sulci. Конференцию, кстати, я уже давно зарегистрировал на себя, потому что хозяина у неё не было, хоть она и была найдена мной в списке комнат на Диско. А логи, оказывается, на jabber.ru вообще включаются на стороне сервера, так что бот у нас просто прохлаждался, оказывая мелкие услуги и треплясь за жизнь. Мы обучили его некоторым полезным знаниям, которые могут помочь посетителям (читайте об этом в топике конференции). В общем, так прошло ещё какое-то время, пока в комнате не появился [Kostix](Участник_Kostix.md). Этот Kostix оказался опытным бойцом и рьяно принялся за дело: на пару с ним мы практически полностью переделали структуру вики и дописали и переделали многие статьи. Он и сам написал изрядное их количество — познавательных и интересных. На конференцию стало заходить ещё больше народу; благодаря общению с этими людьми улучшилась вики, а в какой-то мере оно повлияло и на новшества, введённые в версию 0.9.9 Ткаббера. 

















# <a id="Бронзовый_век"></a>Бронзовый век
В завершение этого краткого экскурса в историю вики следует отметить [Feez](Участник_Feez.md), написавшего ряд плагинов для Ткаббера и очень интересную статью. Ещё один старатель, добывающий золото плагинов из словесной руды команд тикля: [eXire](Участник_EXire.md). Кстати, некоторые из этих самодельных плагинов вошли в альфа-версию Ткаббера. Надеемся, список участников проекта на этом не завершится. Например, камрад [ART](Участник_ART.md) вот уже который месяц рисует новый набор иконок, который, судя по всему, станет дефолтным в грядущем релизе (если, конечно, будет когда-нибудь дорисован ;)). Тебе нужен Ткаббер — Ты нужен Ткабберу! ;) 









# <a id="Железный_век"></a>Железный век
Начинается новая эра для Ткаббера, ибо недавно вышла свежая его версия 0.10.0. Точнее, даже не вышла, а выехала на новенькой железной колеснице. Разработчики навнедряли в неё (в версию) кучи различных железных приспособ, [ART](Участник_ART.md) изукрасил её, а тестеры поубивали всех тараканов. Следом вышли новый Старпак и Ткаббер-пак. Пора приниматься и за вики: надо новыми железными мотыгами прополоть её статьи от устаревшей инфы и с помощью новых железных лопат пересадить хотя бы часть этой инфы на иностранные грядки. 






Changes to wiki/ru/История_разговоров.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/История_разговоров/index.html)


# История разговоров

Материал из Tkabber Wiki.

В Ткаббере реализован браузер истории разговоров. Он доступен через главное
меню: **Службы → Разговоры**.

## <a id="toc"></a>Содержание

* [1 Окна браузера](#Окна_браузера)
   * [1.1 Список всех JID'ов](#Список_всех_JIDов)
   * [1.2 Дерево истории разговоров](#Дерево_истории_разговоров)
   * [1.3 Полнотекстовый поиск](#Полнотекстовый_поиск)

## <a id="Окна_браузера"></a>Окна браузера

Браузер предоставляет три "вида" доступа к соответствующей информации:

### <a id="Список_всех_JIDов"></a>Список всех JID'ов

Список всех JID'ов, с которыми вы вели беседы. Сюда входят JID'ы пользователей,
JID'ы комнат и JID'ы участников комнат (именно с ними ведутся бесды "в привате"
комнаты).

Нажатие Enter или двойной клик левой кнопкой мышки на элементе списка открывает
стандартное окно с протоколом разговора для данного JID'а.

Поиск по списку можно произвести, открыв стандартную панель поиска, которая
вызывается нажатием Ctrl-s.

### <a id="Дерево_истории_разговоров"></a>Дерево истории разговоров

Дерево истории разговоров соответствует структуре каталогов с файлами истории,
поддерживаемой Ткаббером. В нём JID'ы сгруппированы по месяцам, которые, в свою
очередь, сгруппированы по годам.

Открытие стандартного окна с протоколом для выбранного JID'а осуществляется так
же, как и в списке всех JID'ов.

Поиск по дереву можно произвести, открыв стандартную панель поиска, которая
вызывается нажатием Ctrl-s.

### <a id="Полнотекстовый_поиск"></a>Полнотекстовый поиск

Полнотекстовый поиск позволяет произвести поиск подстроки/шаблона по _всем_
имеющимся файлам протоколов. Используются выбранный в настройках Ткаббера метод
поиска (группа настроек **Plugins → Search**).

Поиск не блокирует интерфейс. Результаты помещаются в соответствующее окно по
мере их поступления.

Двойной клик левой кнопкой мышки на тексте с результатом поиска или его
заголовке открывает стандартное окно с протоколом для соответствующего JID'а;
оно будет "перемотано" чтобы показать нужное (найденное) сообщение.

Дополнительный поиск (аналог функции "искать в найденном" некоторых поисковых
служб) доступен в виде стандартной панели поиска, которую можно активизировать
нажатием Ctrl-s. Искать в найденном можно и до окончания "основного" поиска.

Поиск называется "полнотекстовым", поскольку в качестве информации для поиска
он использует не только сообщения, но и JID'ы их источников. Название
"позаимствовано" у систем управления базами данных.

>





|
<




|
|
|

|
<
|

|

|
<
<

|
<

|
<

|

|
<
<

|
<

|
<

|

|
<
<

|
<

|
<
<

|
<
<

|
|
|
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
16
17

18
19
20
21
22


23
24

25
26

27
28
29
30


31
32

33
34

35
36
37
38


39
40

41
42


43
44


45
46
47
48
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/История_разговоров/index.html)


# История разговоров

Материал из Tkabber Wiki.

В Ткаббере реализован браузер истории разговоров. Он доступен через главное меню: **Службы → Разговоры**. 


## <a id="toc"></a>Содержание

* [1 Окна браузера](#Окна_браузера)
 * [1.1 Список всех JID'ов](#Список_всех_JIDов)
 * [1.2 Дерево истории разговоров](#Дерево_истории_разговоров)
 * [1.3 Полнотекстовый поиск](#Полнотекстовый_поиск)

# <a id="Окна_браузера"></a>Окна браузера

Браузер предоставляет три "вида" доступа к соответствующей информации: 

## <a id="Список_всех_JIDов"></a>Список всех JID'ов

Список всех JID'ов, с которыми вы вели беседы. Сюда входят JID'ы пользователей, JID'ы комнат и JID'ы участников комнат (именно с ними ведутся бесды "в привате" комнаты). 



Нажатие Enter или двойной клик левой кнопкой мышки на элементе списка открывает стандартное окно с протоколом разговора для данного JID'а. 


Поиск по списку можно произвести, открыв стандартную панель поиска, которая вызывается нажатием Ctrl-s. 


## <a id="Дерево_истории_разговоров"></a>Дерево истории разговоров

Дерево истории разговоров соответствует структуре каталогов с файлами истории, поддерживаемой Ткаббером. В нём JID'ы сгруппированы по месяцам, которые, в свою очередь, сгруппированы по годам. 



Открытие стандартного окна с протоколом для выбранного JID'а осуществляется так же, как и в списке всех JID'ов. 


Поиск по дереву можно произвести, открыв стандартную панель поиска, которая вызывается нажатием Ctrl-s. 


## <a id="Полнотекстовый_поиск"></a>Полнотекстовый поиск

Полнотекстовый поиск позволяет произвести поиск подстроки/шаблона по _всем_ имеющимся файлам протоколов. Используются выбранный в настройках Ткаббера метод поиска (группа настроек **Plugins → Search**). 



Поиск не блокирует интерфейс. Результаты помещаются в соответствующее окно по мере их поступления. 


Двойной клик левой кнопкой мышки на тексте с результатом поиска или его заголовке открывает стандартное окно с протоколом для соответствующего JID'а; оно будет "перемотано" чтобы показать нужное (найденное) сообщение. 



Дополнительный поиск (аналог функции "искать в найденном" некоторых поисковых служб) доступен в виде стандартной панели поиска, которую можно активизировать нажатием Ctrl-s. Искать в найденном можно и до окончания "основного" поиска. 



Поиск называется "полнотекстовым", поскольку в качестве информации для поиска он использует не только сообщения, но и JID'ы их источников. Название "позаимствовано" у систем управления базами данных. 


Changes to wiki/ru/Команды.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Команды/index.html)


# Команды

Материал из Tkabber Wiki

Статья ещё не дописана, см. [**TODO: дописать статью**](#TODO_дописать_статью).

## <a id="toc"></a>Содержание

* [1 Общая информация](#Общая_информация)
* [2 Встроенные команды](#Встроенные_команды)
   * [2.1 /admin nickname ['\\n' reason]](#_admin_nickname_n_reason)
   * [2.2 /ban nickname ['\\n' reason]](#_ban_nickname_n_reason)
   * [2.3 /banjid jid ['\\n' reason]](#_banjid_jid_n_reason)
   * [2.4 /deadmin nickname ['\\n' reason]](#_deadmin_nickname_n_reason)
   * [2.5 /demember nickname ['\\n' reason]](#_demember_nickname_n_reason)
   * [2.6 /demoderator nickname ['\\n' reason]](#_demoderator_nickname_n_reason)
   * [2.7 /devoice nickname ['\\n' reason]](#_devoice_nickname_n_reason)
   * [2.8 /disco [jid]](#_disco_jid)
   * [2.9 /exec command](#_exec_command)
   * [2.10 /invite jid ['\\n' reason]](#_invite_jid_n_reason)
   * [2.11 /join [room [password]]](#_join_room_password)
   * [2.12 /kick nickname ['\\n' reason]](#_kick_nickname_n_reason)
   * [2.13 /last [user]](#_last_user)
      * [2.13.1 Раскрытие аргумента [user]](#Раскрытие_аргумента_user)
   * [2.14 /leave [status]](#_leave_status)
   * [2.15 /me text](#_me_text)
   * [2.16 /member nickname ['\\n' reason]](#_member_nickname_n_reason)
   * [2.17 /moderator nickname ['\\n' reason]](#_moderator_nickname_n_reason)
   * [2.18 /msg nickname '\\n' body](#_msg_nickname_n_body)
   * [2.19 /nick nickname](#_nick_nickname)
   * [2.20 /open user\_a](#_open_user_a)
   * [2.21 /part [status]](#_part_status)
   * [2.22 /ping [user]](#_ping_user)
   * [2.23 /rejoin](#_rejoin)
   * [2.24 /subject [text]](#_subject_text)
   * [2.25 /time [user]](#_time_user)
   * [2.26 /topic [text]](#_topic_text)
   * [2.27 /unban jid](#_unban_jid)
   * [2.28 /vcard [user\_b]](#_vcard_user_b)
      * [2.28.1 Раскрытие аргумента [user\_b]](#Раскрытие_аргумента_user_b)
   * [2.29 /version [user]](#_version_user)
   * [2.30 /voice nickname ['\\n' reason]](#_voice_nickname_n_reason)
   * [2.31 /whois nickname](#_whois_nickname)
* [3 Ссылки](#Ссылки)
* [4 TODO: дописать статью](#TODO_дописать_статью)
* [5 Немного мыслей о развитии механизма команд](#Немного_мыслей_о_развитии_механизма_команд)

# <a id="Общая_информация"></a>Общая информация
Не все команды имеют «защиту от дурака». В данном списке указаны только
разумные наборы параметров. В случае использования другого набора параметров
команда может быть отправлена собеседнику (как обычное сообщение), может
возникнуть исключение (на уровне интерпретатора tcl), может быть выведено
сообщение об ошибке под сообщениями активного окна, может не случиться ничего.
Эти ситуации никак не оговариваются в данном списке, поскольку недостатки лучше
исправлять, а не документировать.

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

Аргументы команд, записанные в квадратных скобках, являются необязательными (т.
е. могут присутствовать или не присутствовать в записи команды). Иногда наличие
или отсутствие аргумента влияет на семантику команды, например на то,
отображается некоторое свойство командой или изменяется.

В окне чата работает автодополнение по клавише Tab. Его можно использовать для
дополнения псевдонима участника конференции, команды, аргумента команды и,
иногда, чего-нибудь другого (см., например, [**плагин Juick**](Плагины/Juick.md)).

Для формалистов. Текст команд можно воспринимать как запись шаблона команды в
форме [расширенной БНФ](http://ru.wikipedia.org/wiki/Расширенная_форма_Бэкуса_—_Наура), причём
слова, начинающиеся с символа '/', а также '\\n' являются терминалами,
остальные — нетерминалами, формат нетерминалов определяется типом нетерминала
как аргумента. Разделителем между командой и аргументом, а также между
аргументами-словами является пробел. Если между идентификаторами (терминалами
или нетерминалами) присутствует терминал '\\n', то других разделитей не
подразумевается.

# <a id="Встроенные_команды"></a>Встроенные команды
## <a id="_admin_nickname_n_reason"></a>/admin nickname ['\\n' reason]

*  Активное окно — окно конференции. Сменить [**тип членства**](#Ссылки)
   участника активной конференции с псевдонимом `nickname` на “Admin” (если у
   него менее привилегированный тип членства). Обычно это также подразумевает
   назначение [**роли**](#Ссылки) “Moderator”. В запрос включается, если
   указан, текст `reason`.
*  `nickname` — текст без символов перевода строки, `reason` — произвольный текст.
*  [plugins/chat/muc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/muc_commands.tcl)

## <a id="_ban_nickname_n_reason"></a>/ban nickname ['\\n' reason]

*  Активное окно — окно конференции. Сменить [**тип членства**](#Ссылки)
   участника активной конференции с псевдонимом `nickname` на “Outcast”, т. е.
   забанить его (выгнать без возможности вернуться). Бан осуществляется по real
   JID пользователя, значит последний должен быть известен осуществляющему бан.
   Участник должен присутствовать в конференции. В запрос включается, если
   указан, текст `reason`. Согласно
   [XEP-0045](http://xmpp.org/extensions/xep-0045.html), передача забаненному
   участнику и остальным участникам информации о псевдониме или bare JID
   осуществляющего бан, а также причины `reason` является опциональной.
*  `nickname` — текст без символов перевода строки, `reason` — произвольный текст.
*  [plugins/chat/muc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/muc_commands.tcl)

## <a id="_banjid_jid_n_reason"></a>/banjid jid ['\\n' reason]

*  Активное окно — окно конференции. Сменить [**тип членства**](#Ссылки)
   пользователя с bare JID `jid` на “Outcast”, т. е. внести его в список
   забаненных и, если он присутствует в конференции, выгнать. В запрос
   включается, если указан, текст `reason`. Согласно
   [XEP-0045](http://xmpp.org/extensions/xep-0045.html), передача забаненному
   участнику и остальным участникам информации о псевдониме или bare JID
   осущестляющего бан, а также причины `reason` является опциональной.
*  `jid` — текст без символов перевода строки, `reason` — произвольный текст.
*  [plugins/chat/muc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/muc_commands.tcl)

## <a id="_deadmin_nickname_n_reason"></a>/deadmin nickname ['\\n' reason]

*  Активное окно — окно конференции. Сменить [**тип членства**](#Ссылки)
   участника активной конференции с псевдонимом `nickname` на “Member” (если у
   него более привилегированный тип членства). Обычно это также подразумевает
   назначение [**роли**](#Ссылки) “Participant”. В запрос включается,
   если указан, текст `reason`.
*  `nickname` — текст без символов перевода строки, `reason` — произвольный текст.
*  [plugins/chat/muc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/muc_commands.tcl)

## <a id="_demember_nickname_n_reason"></a>/demember nickname ['\\n' reason]

*  Активное окно — окно конференции. Сменить [**тип членства**](#Ссылки)
   участника активной конференции с псевдонимом `nickname` на “None” (если у
   него более привилегированный тип членства). В запрос включается, если
   указан, текст `reason`.
*  `nickname` — текст без символов перевода строки, `reason` — произвольный текст.
*  [plugins/chat/muc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/muc_commands.tcl)

## <a id="_demoderator_nickname_n_reason"></a>/demoderator nickname ['\\n' reason]

*  Активное окно — окно конференции. Сменить [**роль**](#Ссылки) участника
   активной конференции с псевдонимом `nickname` на “Participant” (если у него
   более привилегированная роль). В запрос включается, если указан, текст
   `reason`.
*  `nickname` — текст без символов перевода строки, `reason` — произвольный текст.

## <a id="_devoice_nickname_n_reason"></a>/devoice nickname ['\\n' reason]

*  Активное окно — окно конференции. Сменить [**роль**](#Ссылки) участника
   активной конференции с псевдонимом `nickname` на “Visitor” (если у него
   более привилегированная роль). В запрос включается, если указан, текст
   `reason`.
*  `nickname` — текст без символов перевода строки, `reason` — произвольный текст.

## <a id="_disco_jid"></a>/disco [jid]

*  Открывает окно обзора сервисов для `jid` или, если `jid` не указан, для
   собеседника из активного окна.
*  `jid` — произвольный текст, справа удаляются пробельные символы.
*  [plugins/chat/disco.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/disco.tcl)

## <a id="_exec_command"></a>/exec command

*  Выполнить команду `command` и подставить её вывод или сообщение об ошибке в
   поле ввода в форме:

    $ `command`
    output/error message

Синтаксис, вообще говоря, отличается от привычного по совместимым с Bourne
Shell командным интерпретаторам. Например, несколько слов, разделённых
пробелами или символами перевода строки, объединяются в один аргумент с помощью
фигурных скобок, а не кавычек. Подробнее см. в “man n exec”. Можно использовать
синтаксис системного командного интерпретатора с помощью такого приёма: “/exec
sh -c {some command}”

*  `command` — произвольный текст.
*  [plugins/chat/exec\_command.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/exec_command.tcl)

## <a id="_invite_jid_n_reason"></a>/invite jid ['\\n' reason]

*  Пригласить пользователя в конференцию. Текст `reason`, если указан, будет
   передан вместе с приглашением.
*  В окне конференции `jid` — это JID приглашаемого.
*  В окне 1-vs-1 разговора (в том числе приватного разговора через конференцию)
   `jid` — это JID комнаты, с него приходит приглашение.
*  `jid` — произвольный текст, не содержащий символов перевода строки, `reason`
   — произвольный текст, справа удаляются пробельные символы.
*  [plugins/chat/irc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/irc_commands.tcl)

## <a id="_join_room_password"></a>/join [room [password]]

*  Присоединиться к конференции `room` с паролем `password` или без пароля,
   если он не указан.
*  Если активное окно не является окном конференции, то аргумент `room`
   трактуется как JID конференции.
*  В случае когда активное окно является окном конференции (на некотором
   сервере server), действуют следующие правила. Если аргумент `room`
   отсутствует, то производится попытка присоединиться к конференции в активном
   окне. Если аргумент `room` присутствует, но не является JID'ом, то
   производится попытка присоединиться к конференции `room`@server. В противном
   случае производится попытка присоединиться к конференции с JID'ом `room`.
*  `room` — слово, `password` — произвольный текст, справа удаляются пробельные
   символы.
*  [plugins/chat/irc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/irc_commands.tcl)

## <a id="_kick_nickname_n_reason"></a>/kick nickname ['\\n' reason]

*  Активное окно — окно конференции. Сменить [**роль**](#Ссылки)
   участника активной конференции с псевдонимом `nickname` на “None”, т. е.
   выгнать из конференции (участник может вернуться). Участник должен
   присутствовать в конференции. В запрос включается, если указан, текст
   `reason`. Согласно [XEP-0045](http://xmpp.org/extensions/xep-0045.html),
   передача выгнанному участнику и остальным участникам информации о псевдониме
   или bare JID выгоняющего, а также причины `reason` является опциональной.
*  `nickname` — текст без символов перевода строки, `reason` — произвольный текст.
*  [plugins/chat/muc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/muc_commands.tcl)

## <a id="_last_user"></a>/last [user]

*  Запросить информацию о времени с момента последнего подключения, времени
   бездействия или времени с последнего рестарта сервиса (uptime) в
   соответствии с [XEP-0012](http://www.xmpp.org/extensions/xep-0012.html).
   Согласно этому стандарту, если запрос адресован bare JID
   (localpart@domain.tld), то возвращённый интервал — это время с момента
   последнего подключения. Если запрос адресован full JID
   (localpart@domain.tld/resource), то интервал означает время бездействия
   пользователя. Если запрос адресован серверу или сервису с JID'ом вида
   domain.tld, то возвращается время с последнего рестарта сервера или сервиса
   (uptime). Ответ выводится под последним сообщением активного на момент
   отправки запроса окна.
*  Ракрытие аргумента — см. далее.
*  Поскольку закладки на конференции в Ткаббере с точки зрения интерфейса
   пользователя относятся к ростеру, псевдоним или JID конференции
   обрабатывается так же, как ростерный псевдоним или JID пользователя. При
   этом конференция, участником которой мы не являемся, обрабатывается как
   отключённый пользователь. А если мы являемся участником конференции,
   пользователи конференции обрабатываются как подключённые ресурсы.
*  `user` — произвольный текст.
*  [plugins/chat/info\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/info_commands.tcl)

### <a id="Раскрытие_аргумента_user"></a>Раскрытие аргумента [user]

Для краткости изложения будем указывать bare JID и full JID собеседника (или
конференции) как chat\_jid и chat\_jid/resource соответственно.

Команда `/last` в конференции:

*  запрос к chat\_jid.

Команда `/last user` в конференции:

*  запрос к chat\_jid/user.

Команда `/last` в обычном чате:

*  chat\_jid/resource подключён => запрос к нему (т. е. к chat\_jid/resource);
*  не подключён, но подключены другие ресурсы => запрос к ним (т. е. к chat\_jid/\*);
*  нет подключённых ресурсов => запрос к chat\_jid/resource.

Команда `/last user` в обычном чате:

*  Есть контакты с псевдонимом `user`; для каждого контакта: запрос ко всем
   подключённым full JID или если таких нет, то запрос по bare JID.
*  Если таких контактов нет, то запрос к `user` (подразумевается, что `user`
   должен быть валидным JID'ом).

![(!)](../images/Hammer.png) **Сделать:** Было бы неплохо проверять, совпадает
ли `user` с псевдонимом одного из участников конференции и, если нет, то
попытаться отождествить `user` с псевдонимом пользователя из ростера или, если
и это не удалось, делать запрос по JID'у `user`. Да и команду было бы неплохо
разбить на две или три более осмысленных, при этом для каждой команды
осуществлять приведению JID'а к необходимому виду, а для uptime — принимать
только обращения по JID'ам вида domain.tld.

## <a id="_leave_status"></a>/leave [status]

*  Закрыть активное окно разговора, если это окно конференции — покинуть её.
   Если активным окном является окно конференции, то в информацию об изменении
   характера присутствия в конференции в качестве статуса добавляется текст
   `status`.
*  `status` — произвольный текст.
*  [plugins/chat/irc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/irc_commands.tcl)

## <a id="_me_text"></a>/me text

*  Не является командой в смысле Ткаббера, т. е. не обрабатывается специальным
   образом при отправке. Но в соответствии с
   [XEP-0245](http://www.xmpp.org/extensions/xep-0245.html) обрабатывается
   особым образом при получении. Сообщение, начинающееся с "/me " отобразится в
   клиентах, соответствующих данному стандарту, будет включать ник отправителя
   и выглядеть, например, так:

    * your_nickname `text`

*  `text` — произвольный текст.

## <a id="_member_nickname_n_reason"></a>/member nickname ['\\n' reason]

*  Активное окно — окно конференции. Сменить [**тип членства**](#Ссылки)
   участника активной конференции с псевдонимом `nickname` на “Member” (если у
   него менее привилегированный тип членства). В запрос включается, если
   указан, текст `reason`.
*  `nickname` — текст без символов перевода строки, `reason` — произвольный текст.
*  [plugins/chat/muc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/muc_commands.tcl)

## <a id="_moderator_nickname_n_reason"></a>/moderator nickname ['\\n' reason]

*  Активное окно — окно конференции. Сменить [**роль**](#Ссылки) участника
   активной конференции с псевдонимом `nickname` на “Moderator” (если у него
   менее привилегированная роль). В запрос включается, если указан, текст
   `reason`.
*  `nickname` — текст без символов перевода строки, `reason` — произвольный текст.

## <a id="_msg_nickname_n_body"></a>/msg nickname '\\n' body

*  Активное окно — окно конференции. Отправить посетителю данной конференции с
   псевдонимом `nickname` сообщение `body`.
*  `nickname` — текст без символов перевода строки, `body` — произвольный
   текст.
*  [plugins/chat/irc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/irc_commands.tcl)

## <a id="_nick_nickname"></a>/nick nickname

*  Если активное окно является окном конференции, то сменить псевдоним в данной
   конференции на `nickname`.
*  `nickname` — произвольный текст.
*  [plugins/chat/irc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/irc_commands.tcl)

## <a id="_open_user_a"></a>/open user\_a

*  Если аргумент содержит символ '@', то открывается окно разговора с JID'ом
   `user_a`.
*  Иначе предпологается, что активное окно является окном конференции, и
   открывается окно разговора с участником `user_a` этой конференции.
*  ![(!)](../images/Hammer.png) **Сделать:** Комментарий "What if conference
   nickname contains "@"?", кто-нибудь хочет исправить? Думаю, нужно сделать
   проверку [string equal $type groupchat] как в некоторый командах в
   irc\_commands.tcl.
*  `user_a` — произвольный текст.
*  [plugins/chat/open\_chat.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/open_chat.tcl)

## <a id="_part_status"></a>/part [status]

*  Полный синоним [**/leave [status]**](#_leave_status).
*  `status` — произвольный текст.
*  [plugins/chat/irc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/irc_commands.tcl)

## <a id="_ping_user"></a>/ping [user]

*  Пинг-запрос на прикладном уровне ISO OSI в соответствии с
   [XEP-0199](http://www.xmpp.org/extensions/xep-0199.html). Запрос
   адресованный по full JID направляется к клиенту, на запрос по bare JID или
   по JID'у вида server.tld отвечает соответствующий сервер или сервис. Ответ
   выводится под последним сообщением активного на момент отправки запроса
   окна.
*  Семантика `user` или его отсутствия — см. [**/last [user]**](#_last_user).
*  `user` — произвольный текст.
*  [plugins/chat/info\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/info_commands.tcl)

## <a id="_rejoin"></a>/rejoin

*  Если активное окно является окном конференции, то покинуть конференцию и
   присоединиться к ней снова (похоже, что без пароля).
*  [plugins/chat/irc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/irc_commands.tcl)

## <a id="_subject_text"></a>/subject [text]

*  Активное окно — окно конференции. Установить в качестве темы конференции
   текст `text`. Если аргумент `text` не указан — отобразить тему конференции
   под последним сообщением.
*  `text` — произвольный текст.
*  [plugins/chat/irc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/irc_commands.tcl)

## <a id="_time_user"></a>/time [user]

*  Запросить информацию о локальном времени и часовом поясе пользователя (см.
   [XEP-0090](http://www.xmpp.org/extensions/xep-0090.html)). В соответствии со
   стандартом, ответ должен содержать время по UTC, может содержать часовой
   пояс и время в читаемом формате (видимо, подразумевается локальное время).
   Ответ выводится под последним сообщением активного на момент отправки
   запроса окна.
*  Семантика `user` или его отсутствия — см. [**/last [user]**](#_last_user).
*  `user` — произвольный текст.
*  [plugins/chat/info\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/info_commands.tcl)

## <a id="_topic_text"></a>/topic [text]

*  Полный синоним [**/subject [text]**](#_subject_text).
*  `text` — произвольный текст.
*  [plugins/chat/irc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/irc_commands.tcl)

## <a id="_unban_jid"></a>/unban jid

*  Активное окно — окно конференции. Если пользователь с bare JID `jid`
   присутствует в списке забаненных (т. е. пользователей с [**типом членства**](#Ссылки)
   “Outcast”), то сменить тип членства
   пользователя на “None”. Иначе говоря, разбанить пользователя с bare JID
   `jid`.
*  `jid` — текст без символов перевода строки.
*  [plugins/chat/muc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/muc_commands.tcl)

## <a id="_vcard_user_b"></a>/vcard [user\_b]

*  Запросить VCard пользователя, см.
   [XEP-0054](http://www.xmpp.org/extensions/xep-0054.html). Ответ выводится
   под последним сообщением активного на момент отправки запроса окна.
*  Раскрытие аргумента — см. далее.
*  `user_b` — произвольный текст.
*  [plugins/chat/info\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/info_commands.tcl)

### <a id="Раскрытие_аргумента_user_b"></a>Раскрытие аргумента [user\_b]

Порядок раскрытия аргумента `user_b` (буква b от bare JID) и интерпретации его
отсутствия несколько отличнен от подобного для команды [**/last [user]**](#_last_user).

Команда `/vcard [user_b]` в конференции: отличий от [user] нет, т. е. запрос к
chat\_jid или chat\_jid/user\_b.

Команда `/vcard` в обычном чате:

*  запрос к chat\_jid.

Команда `/vcard user_b`:

*  Если `user_b` является псевдонимом одного или нескольких
   пользователей/конференций из ростера, то запрос будет адресован каждому из
   них по bare JID.
*  Если это отождествление не удалось, то запрос будет адресован JID'у `user_b`
   (даже если это full JID, каким должен быть ответ на такого рода запрос не
   определяется [XEP-0054](http://www.xmpp.org/extensions/xep-0054.html)).

## <a id="_version_user"></a>/version [user]

*  Запросить информацию о названии и версии клиента пользователя, а также
   информацию об операционной системе (см.
   [XEP-0092](http://www.xmpp.org/extensions/xep-0092.html)). Согласно этому
   стандарту, ответ должен содержать название и версию клиента и может
   содержать информацию об ОС. Ответ выводится под последним сообщением
   активного на момент отправки запроса окна.
*  Семантика `user` или его отсутствия — см. [**/last [user]**](#_last_user).
*  `user` — произвольный текст.
*  [plugins/chat/info\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/info_commands.tcl)

## <a id="_voice_nickname_n_reason"></a>/voice nickname ['\\n' reason]

*  Активное окно — окно конференции. Сменить [**роль**](#Ссылки) участника
   активной конференции с псевдонимом `nickname` на “Participant” (если у него
   менее привилегированная роль). В запрос включается, если указан, текст
   `reason`.
*  `nickname` — текст без символов перевода строки, `reason` — произвольный текст.

## <a id="_whois_nickname"></a>/whois nickname

*  Активное окно — окно конференции. Вывести информацию о real JID пользователя
   или сообщение об отсутствии информации о real JID.
*  `nickname` — текст без символов перевода строки.
*  [plugins/chat/muc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/muc_commands.tcl)

# <a id="Ссылки"></a>Ссылки
*  Про роли и типы членства можно почитать [тут](http://www.jabber.ru/node/118)
   (по-русски) или [XEP-0045](http://xmpp.org/extensions/xep-0045.html) (с
   понятными простым смертным таблицами).

# <a id="TODO_дописать_статью"></a>TODO: дописать статью
    $ ls -1
    3rd-party-plugins
    tkabber
    tkabber-plugins


>





|





|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|





|
<
<
<
<
<
<

|
<
<
<

|
<
<
<

|
<
<

|
<
<
<
<
<
<
<




|
<
<
<
<
|
|



|
<
<
<
<
<
<
<
<
|
|



|
<
<
<
<
<
<
|
|



|
<
<
<
<
|
|



|
<
<
<
|
|



|
<
<
<
|



|
<
<
<
|



|
<
|
|



|
<




|
<
<
<
<
<

|
|



|
<
|
|
<
|
<
|



|
<
|
<
|
<
<
<
<
<
|
<
|



|
<
<
<
<
<
<
|
|



|
<
<
<
<
<
<
<
<
<
<
|
|
<
<
<
<
<
|
|



|
<

|

|

|

|

|

|
|
|

|

|
<
|
<

|
<
<
<
<
<
<



|
<
<
<
|
|



|
<
<
<
<
<



|



|
<
<
<
|
|



|
<
<
<
|



|
<
|
<
|



|
<
|
|



|
<
|
<
|
<
<
<
|
|



|
|
|



|
<
<
<
<
<
|
|
|



|
<
|



|
<
<
|
|



|
<
<
<
<
<
|
|
|



|
|
|



|
<
<
<
<
|
|



|
<
<
|
|
|



|
<

|
<

|

|

|

|
<
<
|
<
<



|
<
<
<
<
<
|
|
|



|
<
<
<
|



|
<
|
|


|
<
<







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52






53
54



55
56



57
58


59
60







61
62
63
64
65




66
67
68
69
70
71








72
73
74
75
76
77






78
79
80
81
82
83




84
85
86
87
88
89



90
91
92
93
94
95



96
97
98
99
100



101
102
103
104
105

106
107
108
109
110
111

112
113
114
115
116





117
118
119
120
121
122
123

124
125

126

127
128
129
130
131

132

133





134

135
136
137
138
139






140
141
142
143
144
145










146
147





148
149
150
151
152
153

154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171

172

173
174






175
176
177
178



179
180
181
182
183
184





185
186
187
188
189
190
191
192



193
194
195
196
197
198



199
200
201
202
203

204

205
206
207
208
209

210
211
212
213
214
215

216

217



218
219
220
221
222
223
224
225
226
227
228
229





230
231
232
233
234
235
236

237
238
239
240
241


242
243
244
245
246
247





248
249
250
251
252
253
254
255
256
257
258
259
260




261
262
263
264
265
266


267
268
269
270
271
272
273

274
275

276
277
278
279
280
281
282
283


284


285
286
287
288





289
290
291
292
293
294
295



296
297
298
299
300

301
302
303
304
305


306
307
308
309
310
311
312
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Команды/index.html)


# Команды

Материал из Tkabber Wiki

Статья ещё не дописана, см. [TODO: дописать статью](Команды.md#TODO_дописать_статью). 

## <a id="toc"></a>Содержание

* [1 Общая информация](#Общая_информация)
* [2 Встроенные команды](#Встроенные_команды)
 * [2.1 /admin nickname ['\\n' reason]](#_admin_nickname_n_reason)
 * [2.2 /ban nickname ['\\n' reason]](#_ban_nickname_n_reason)
 * [2.3 /banjid jid ['\\n' reason]](#_banjid_jid_n_reason)
 * [2.4 /deadmin nickname ['\\n' reason]](#_deadmin_nickname_n_reason)
 * [2.5 /demember nickname ['\\n' reason]](#_demember_nickname_n_reason)
 * [2.6 /demoderator nickname ['\\n' reason]](#_demoderator_nickname_n_reason)
 * [2.7 /devoice nickname ['\\n' reason]](#_devoice_nickname_n_reason)
 * [2.8 /disco [jid]](#_disco_jid)
 * [2.9 /exec command](#_exec_command)
 * [2.10 /invite jid ['\\n' reason]](#_invite_jid_n_reason)
 * [2.11 /join [room [password]]](#_join_room_password)
 * [2.12 /kick nickname ['\\n' reason]](#_kick_nickname_n_reason)
 * [2.13 /last [user]](#_last_user)
  * [2.13.1 Раскрытие аргумента [user]](#Раскрытие_аргумента_user)
 * [2.14 /leave [status]](#_leave_status)
 * [2.15 /me text](#_me_text)
 * [2.16 /member nickname ['\\n' reason]](#_member_nickname_n_reason)
 * [2.17 /moderator nickname ['\\n' reason]](#_moderator_nickname_n_reason)
 * [2.18 /msg nickname '\\n' body](#_msg_nickname_n_body)
 * [2.19 /nick nickname](#_nick_nickname)
 * [2.20 /open user\_a](#_open_user_a)
 * [2.21 /part [status]](#_part_status)
 * [2.22 /ping [user]](#_ping_user)
 * [2.23 /rejoin](#_rejoin)
 * [2.24 /subject [text]](#_subject_text)
 * [2.25 /time [user]](#_time_user)
 * [2.26 /topic [text]](#_topic_text)
 * [2.27 /unban jid](#_unban_jid)
 * [2.28 /vcard [user\_b]](#_vcard_user_b)
  * [2.28.1 Раскрытие аргумента [user\_b]](#Раскрытие_аргумента_user_b)
 * [2.29 /version [user]](#_version_user)
 * [2.30 /voice nickname ['\\n' reason]](#_voice_nickname_n_reason)
 * [2.31 /whois nickname](#_whois_nickname)
* [3 Ссылки](#Ссылки)
* [4 TODO: дописать статью](#TODO_дописать_статью)
* [5 Немного мыслей о развитии механизма команд](#Немного_мыслей_о_развитии_механизма_команд)

# <a id="Общая_информация"></a>Общая информация
Не все команды имеют «защиту от дурака». В данном списке указаны только разумные наборы параметров. В случае использования другого набора параметров команда может быть отправлена собеседнику (как обычное сообщение), может возникнуть исключение (на уровне интерпретатора tcl), может быть выведено сообщение об ошибке под сообщениями активного окна, может не случиться ничего. Эти ситуации никак не оговариваются в данном списке, поскольку недостатки лучше исправлять, а не документировать. 







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




Аргументы команд, записанные в квадратных скобках, являются необязательными (т. е. могут присутствовать или не присутствовать в записи команды). Иногда наличие или отсутствие аргумента влияет на семантику команды, например на то, отображается некоторое свойство командой или изменяется. 




В окне чата работает автодополнение по клавише Tab. Его можно использовать для дополнения псевдонима участника конференции, команды, аргумента команды и, иногда, чего-нибудь другого (см., например, [плагин Juick](Плагины/Juick.md)). 



Для формалистов. Текст команд можно воспринимать как запись шаблона команды в форме [расширенной БНФ](http://ru.wikipedia.org/wiki/Расширенная_форма_Бэкуса_—_Наура), причём слова, начинающиеся с символа '/', а также '\\n' являются терминалами, остальные — нетерминалами, формат нетерминалов определяется типом нетерминала как аргумента. Разделителем между командой и аргументом, а также между аргументами-словами является пробел. Если между идентификаторами (терминалами или нетерминалами) присутствует терминал '\\n', то других разделитей не подразумевается. 








# <a id="Встроенные_команды"></a>Встроенные команды
## <a id="_admin_nickname_n_reason"></a>/admin nickname ['\\n' reason]

*  Активное окно — окно конференции. Сменить [тип членства](Команды.md#Ссылки) участника активной конференции с псевдонимом `nickname` на “Admin” (если у него менее привилегированный тип членства). Обычно это также подразумевает назначение [роли](Команды.md#Ссылки) “Moderator”. В запрос включается, если указан, текст `reason`. 




*  `nickname` — текст без символов перевода строки, `reason` — произвольный текст. 
*  [plugins/chat/muc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/muc_commands.tcl) 

## <a id="_ban_nickname_n_reason"></a>/ban nickname ['\\n' reason]

*  Активное окно — окно конференции. Сменить [тип членства](Команды.md#Ссылки) участника активной конференции с псевдонимом `nickname` на “Outcast”, т. е. забанить его (выгнать без возможности вернуться). Бан осуществляется по real JID пользователя, значит последний должен быть известен осуществляющему бан. Участник должен присутствовать в конференции. В запрос включается, если указан, текст `reason`. Согласно [XEP-0045](http://xmpp.org/extensions/xep-0045.html), передача забаненному участнику и остальным участникам информации о псевдониме или bare JID осуществляющего бан, а также причины `reason` является опциональной. 








*  `nickname` — текст без символов перевода строки, `reason` — произвольный текст. 
*  [plugins/chat/muc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/muc_commands.tcl) 

## <a id="_banjid_jid_n_reason"></a>/banjid jid ['\\n' reason]

*  Активное окно — окно конференции. Сменить [тип членства](Команды.md#Ссылки) пользователя с bare JID `jid` на “Outcast”, т. е. внести его в список забаненных и, если он присутствует в конференции, выгнать. В запрос включается, если указан, текст `reason`. Согласно [XEP-0045](http://xmpp.org/extensions/xep-0045.html), передача забаненному участнику и остальным участникам информации о псевдониме или bare JID осущестляющего бан, а также причины `reason` является опциональной. 






*  `jid` — текст без символов перевода строки, `reason` — произвольный текст. 
*  [plugins/chat/muc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/muc_commands.tcl) 

## <a id="_deadmin_nickname_n_reason"></a>/deadmin nickname ['\\n' reason]

*  Активное окно — окно конференции. Сменить [тип членства](Команды.md#Ссылки) участника активной конференции с псевдонимом `nickname` на “Member” (если у него более привилегированный тип членства). Обычно это также подразумевает назначение [роли](Команды.md#Ссылки) “Participant”. В запрос включается, если указан, текст `reason`. 




*  `nickname` — текст без символов перевода строки, `reason` — произвольный текст. 
*  [plugins/chat/muc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/muc_commands.tcl) 

## <a id="_demember_nickname_n_reason"></a>/demember nickname ['\\n' reason]

*  Активное окно — окно конференции. Сменить [тип членства](Команды.md#Ссылки) участника активной конференции с псевдонимом `nickname` на “None” (если у него более привилегированный тип членства). В запрос включается, если указан, текст `reason`. 



*  `nickname` — текст без символов перевода строки, `reason` — произвольный текст. 
*  [plugins/chat/muc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/muc_commands.tcl) 

## <a id="_demoderator_nickname_n_reason"></a>/demoderator nickname ['\\n' reason]

*  Активное окно — окно конференции. Сменить [роль](Команды.md#Ссылки) участника активной конференции с псевдонимом `nickname` на “Participant” (если у него более привилегированная роль). В запрос включается, если указан, текст `reason`. 



*  `nickname` — текст без символов перевода строки, `reason` — произвольный текст. 

## <a id="_devoice_nickname_n_reason"></a>/devoice nickname ['\\n' reason]

*  Активное окно — окно конференции. Сменить [роль](Команды.md#Ссылки) участника активной конференции с псевдонимом `nickname` на “Visitor” (если у него более привилегированная роль). В запрос включается, если указан, текст `reason`. 



*  `nickname` — текст без символов перевода строки, `reason` — произвольный текст. 

## <a id="_disco_jid"></a>/disco [jid]

*  Открывает окно обзора сервисов для `jid` или, если `jid` не указан, для собеседника из активного окна. 

*  `jid` — произвольный текст, справа удаляются пробельные символы. 
*  [plugins/chat/disco.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/disco.tcl) 

## <a id="_exec_command"></a>/exec command

*  Выполнить команду `command` и подставить её вывод или сообщение об ошибке в поле ввода в форме: 


    $ `command`
    output/error message

Синтаксис, вообще говоря, отличается от привычного по совместимым с Bourne Shell командным интерпретаторам. Например, несколько слов, разделённых пробелами или символами перевода строки, объединяются в один аргумент с помощью фигурных скобок, а не кавычек. Подробнее см. в “man n exec”. Можно использовать синтаксис системного командного интерпретатора с помощью такого приёма: “/exec sh -c {some command}” 






*  `command` — произвольный текст. 
*  [plugins/chat/exec\_command.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/exec_command.tcl) 

## <a id="_invite_jid_n_reason"></a>/invite jid ['\\n' reason]

*  Пригласить пользователя в конференцию. Текст `reason`, если указан, будет передан вместе с приглашением. 

*  В окне конференции `jid` — это JID приглашаемого. 
*  В окне 1-vs-1 разговора (в том числе приватного разговора через конференцию) `jid` — это JID комнаты, с него приходит приглашение. 

*  `jid` — произвольный текст, не содержащий символов перевода строки, `reason` — произвольный текст, справа удаляются пробельные символы. 

*  [plugins/chat/irc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/irc_commands.tcl) 

## <a id="_join_room_password"></a>/join [room [password]]

*  Присоединиться к конференции `room` с паролем `password` или без пароля, если он не указан. 

*  Если активное окно не является окном конференции, то аргумент `room` трактуется как JID конференции. 

*  В случае когда активное окно является окном конференции (на некотором сервере server), действуют следующие правила. Если аргумент `room` отсутствует, то производится попытка присоединиться к конференции в активном окне. Если аргумент `room` присутствует, но не является JID'ом, то производится попытка присоединиться к конференции `room`@server. В противном случае производится попытка присоединиться к конференции с JID'ом `room`. 





*  `room` — слово, `password` — произвольный текст, справа удаляются пробельные символы. 

*  [plugins/chat/irc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/irc_commands.tcl) 

## <a id="_kick_nickname_n_reason"></a>/kick nickname ['\\n' reason]

*  Активное окно — окно конференции. Сменить [роль](Команды.md#Ссылки) участника активной конференции с псевдонимом `nickname` на “None”, т. е. выгнать из конференции (участник может вернуться). Участник должен присутствовать в конференции. В запрос включается, если указан, текст `reason`. Согласно [XEP-0045](http://xmpp.org/extensions/xep-0045.html), передача выгнанному участнику и остальным участникам информации о псевдониме или bare JID выгоняющего, а также причины `reason` является опциональной. 






*  `nickname` — текст без символов перевода строки, `reason` — произвольный текст. 
*  [plugins/chat/muc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/muc_commands.tcl) 

## <a id="_last_user"></a>/last [user]

*  Запросить информацию о времени с момента последнего подключения, времени бездействия или времени с последнего рестарта сервиса (uptime) в соответствии с [XEP-0012](http://www.xmpp.org/extensions/xep-0012.html). Согласно этому стандарту, если запрос адресован bare JID (localpart@domain.tld), то возвращённый интервал — это время с момента последнего подключения. Если запрос адресован full JID (localpart@domain.tld/resource), то интервал означает время бездействия пользователя. Если запрос адресован серверу или сервису с JID'ом вида domain.tld, то возвращается время с последнего рестарта сервера или сервиса (uptime). Ответ выводится под последним сообщением активного на момент отправки запроса окна. 










*  Ракрытие аргумента — см. далее. 
*  Поскольку закладки на конференции в Ткаббере с точки зрения интерфейса пользователя относятся к ростеру, псевдоним или JID конференции обрабатывается так же, как ростерный псевдоним или JID пользователя. При этом конференция, участником которой мы не являемся, обрабатывается как отключённый пользователь. А если мы являемся участником конференции, пользователи конференции обрабатываются как подключённые ресурсы. 





*  `user` — произвольный текст. 
*  [plugins/chat/info\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/info_commands.tcl) 

### <a id="Раскрытие_аргумента_user"></a>Раскрытие аргумента [user]

Для кратности изложения будем указывать bare JID и full JID собеседника (или конференции) как chat\_jid и chat\_jid/resource соответственно. 


Команда `/last` в конференции: 

*  запрос к chat\_jid. 

Команда `/last user` в конференции: 

*  запрос к chat\_jid/user. 

Команда `/last` в обычном чате: 

*  chat\_jid/resource подключён => запрос к нему (т. е. к chat\_jid/resource); 
*  не подключён, но подключены другие ресурсы => запрос к ним (т. е. к chat\_jid/\*); 
*  нет подключённых ресурсов => запрос к chat\_jid/resource. 

Команда `/last user` в обычном чате: 

*  Есть контакты с псевдонимом `user`; для каждого контакта: запрос ко всем подключённым full JID или если таких нет, то запрос по bare JID. 

*  Если таких контактов нет, то запрос к `user` (подразумевается, что `user` должен быть валидным JID'ом). 


![(!)](../images/Hammer.png) **Сделать:** Было бы неплохо проверять, совпадает ли `user` с псевдонимом одного из участников конференции и, если нет, то попытаться отождествить `user` с псевдонимом пользователя из ростера или, если и это не удалось, делать запрос по JID'у `user`. Да и команду было бы неплохо разбить на две или три более осмысленных, при этом для каждой команды осуществлять приведению JID'а к необходимому виду, а для uptime — принимать только обращения по JID'ам вида domain.tld. 







## <a id="_leave_status"></a>/leave [status]

*  Закрыть активное окно разговора, если это окно конференции — покинуть её. Если активным окном является окно конференции, то в информацию об изменении характера присутствия в конференции в качестве статуса добавляется текст `status`. 



*  `status` — произвольный текст. 
*  [plugins/chat/irc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/irc_commands.tcl) 

## <a id="_me_text"></a>/me text

*  Не является командой в смысле Ткаббера, т. е. не обрабатывается специальным образом при отправке. Но в соответствии с [XEP-0245](http://www.xmpp.org/extensions/xep-0245.html) обрабатывается особым образом при получении. Сообщение, начинающееся с "/me " отобразится в клиентах, соответствующих данному стандарту, будет включать ник отправителя и выглядеть, например, так: 






    * your_nickname `text`

*  `text` — произвольный текст. 

## <a id="_member_nickname_n_reason"></a>/member nickname ['\\n' reason]

*  Активное окно — окно конференции. Сменить [тип членства](Команды.md#Ссылки) участника активной конференции с псевдонимом `nickname` на “Member” (если у него менее привилегированный тип членства). В запрос включается, если указан, текст `reason`. 



*  `nickname` — текст без символов перевода строки, `reason` — произвольный текст. 
*  [plugins/chat/muc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/muc_commands.tcl) 

## <a id="_moderator_nickname_n_reason"></a>/moderator nickname ['\\n' reason]

*  Активное окно — окно конференции. Сменить [роль](Команды.md#Ссылки) участника активной конференции с псевдонимом `nickname` на “Moderator” (если у него менее привилегированная роль). В запрос включается, если указан, текст `reason`. 



*  `nickname` — текст без символов перевода строки, `reason` — произвольный текст. 

## <a id="_msg_nickname_n_body"></a>/msg nickname '\\n' body

*  Активное окно — окно конференции. Отправить посетителю данной конференции с псевдонимом `nickname` сообщение `body`. 

*  `nickname` — текст без символов перевода строки, `body` — произвольный текст. 

*  [plugins/chat/irc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/irc_commands.tcl) 

## <a id="_nick_nickname"></a>/nick nickname

*  Если активное окно является окном конференции, то сменить псевдоним в данной конференции на `nickname`. 

*  `nickname` — произвольный текст. 
*  [plugins/chat/irc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/irc_commands.tcl) 

## <a id="_open_user_a"></a>/open user\_a

*  Если аргумент содержит символ '@', то открывается окно разговора с JID'ом `user_a`. 

*  Иначе предпологается, что активное окно является окном конференции, и открывается окно разговора с участником `user_a` этой конференции. 

*  ![(!)](../images/Hammer.png) **Сделать:** Комментарий "What if conference nickname contains "@"?", кто-нибудь хочет исправить? Думаю, нужно сделать проверку [string equal $type groupchat] как в некоторый командах в irc\_commands.tcl. 



*  `user_a` — произвольный текст. 
*  [plugins/chat/open\_chat.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/open_chat.tcl) 

## <a id="_part_status"></a>/part [status]

*  Полный синоним [/leave [status]](Команды.md#_leave_status). 
*  `status` — произвольный текст. 
*  [plugins/chat/irc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/irc_commands.tcl) 

## <a id="_ping_user"></a>/ping [user]

*  Пинг-запрос на прикладном уровне ISO OSI в соответствии с [XEP-0199](http://www.xmpp.org/extensions/xep-0199.html). Запрос адресованный по full JID направляется к клиенту, на запрос по bare JID или по JID'у вида server.tld отвечает соответствующий сервер или сервис. Ответ выводится под последним сообщением активного на момент отправки запроса окна. 





*  Семантика `user` или его отсутствия — см. [/last [user]](Команды.md#_last_user). 
*  `user` — произвольный текст. 
*  [plugins/chat/info\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/info_commands.tcl) 

## <a id="_rejoin"></a>/rejoin

*  Если активное окно является окном конференции, то покинуть конференцию и присоединиться к ней снова (похоже, что без пароля). 

*  [plugins/chat/irc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/irc_commands.tcl) 

## <a id="_subject_text"></a>/subject [text]

*  Активное окно — окно конференции. Установить в качестве темы конференции текст `text`. Если аргумент `text` не указан — отобразить тему конференции под последним сообщением. 


*  `text` — произвольный текст. 
*  [plugins/chat/irc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/irc_commands.tcl) 

## <a id="_time_user"></a>/time [user]

*  Запросить информацию о локальном времени и часовом поясе пользователя (см. [XEP-0090](http://www.xmpp.org/extensions/xep-0090.html)). В соответствии со стандартом, ответ должен содержать время по UTC, может содержать часовой пояс и время в читаемом формате (видимо, подразумевается локальное время). Ответ выводится под последним сообщением активного на момент отправки запроса окна. 





*  Семантика `user` или его отсутствия — см. [/last [user]](Команды.md#_last_user). 
*  `user` — произвольный текст. 
*  [plugins/chat/info\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/info_commands.tcl) 

## <a id="_topic_text"></a>/topic [text]

*  Полный синоним [/subject [text]](Команды.md#_subject_text). 
*  `text` — произвольный текст. 
*  [plugins/chat/irc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/irc_commands.tcl) 

## <a id="_unban_jid"></a>/unban jid

*  Активное окно — окно конференции. Если пользователь с bare JID `jid` присутствует в списке забаненных (т. е. пользователей с [типом членства](Команды.md#Ссылки) “Outcast”), то сменить тип членства пользователя на “None”. Иначе говоря, разбанить пользователя с bare JID `jid`. 




*  `jid` — текст без символов перевода строки. 
*  [plugins/chat/muc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/muc_commands.tcl) 

## <a id="_vcard_user_b"></a>/vcard [user\_b]

*  Запросить VCard пользователя, см. [XEP-0054](http://www.xmpp.org/extensions/xep-0054.html). Ответ выводится под последним сообщением активного на момент отправки запроса окна. 


*  Раскрытие аргумента — см. далее. 
*  `user_b` — произвольный текст. 
*  [plugins/chat/info\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/info_commands.tcl) 

### <a id="Раскрытие_аргумента_user_b"></a>Раскрытие аргумента [user\_b]

Порядок раскрытия аргумента `user_b` (буква b от bare JID) и интерпретации его отсутствия несколько отличнен от подобного для команды [/last [user]](Команды.md#_last_user). 


Команда `/vcard [user_b]` в конференции: отличий от [user] нет, т. е. запрос к chat\_jid или chat\_jid/user\_b. 


Команда `/vcard` в обычном чате: 

*  запрос к chat\_jid. 

Команда `/vcard user_b`: 

*  Если `user_b` является псевдонимом одного или нескольких пользователей/конференций из ростера, то запрос будет адресован каждому из них по bare JID. 


*  Если это отождествление не удалось, то запрос будет адресован JID'у `user_b` (даже если это full JID, каким должен быть ответ на такого рода запрос не определяется [XEP-0054](http://www.xmpp.org/extensions/xep-0054.html)). 



## <a id="_version_user"></a>/version [user]

*  Запросить информацию о названии и версии клиента пользователя, а также информацию об операционной системе (см. [XEP-0092](http://www.xmpp.org/extensions/xep-0092.html)). Согласно этому стандарту, ответ должен содержать название и версию клиента и может содержать информацию об ОС. Ответ выводится под последним сообщением активного на момент отправки запроса окна. 





*  Семантика `user` или его отсутствия — см. [/last [user]](Команды.md#_last_user). 
*  `user` — произвольный текст. 
*  [plugins/chat/info\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/info_commands.tcl) 

## <a id="_voice_nickname_n_reason"></a>/voice nickname ['\\n' reason]

*  Активное окно — окно конференции. Сменить [роль](Команды.md#Ссылки) участника активной конференции с псевдонимом `nickname` на “Participant” (если у него менее привилегированная роль). В запрос включается, если указан, текст `reason`. 



*  `nickname` — текст без символов перевода строки, `reason` — произвольный текст. 

## <a id="_whois_nickname"></a>/whois nickname

*  Активное окно — окно конференции. Вывести информацию о real JID пользователя или сообщение об отсутствии информации о real JID. 

*  `nickname` — текст без символов перевода строки. 
*  [plugins/chat/muc\_commands.tcl](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber/plugins/chat/muc_commands.tcl) 

# <a id="Ссылки"></a>Ссылки
*  Про роли и типы членства можно почитать [тут](http://www.jabber.ru/node/118) (по-русски) или [XEP-0045](http://xmpp.org/extensions/xep-0045.html) (с понятными простым смертным таблицами). 



# <a id="TODO_дописать_статью"></a>TODO: дописать статью
    $ ls -1
    3rd-party-plugins
    tkabber
    tkabber-plugins

494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
    tkabber/doc/tkabber.xml:2135:chat_send_message_hook $chatid $user $body $type
    tkabber/chats.tcl:893:    hook::run chat_send_message_hook $chatid $user $body $type
    tkabber/chats.tcl:997:	hook::run chat_send_message_hook $chatid [connection_user $xlib] \
    tkabber/README:2426:   chat_send_message_hook $chatid $user $body $type
    3rd-party-plugins/juick/juick.tcl:76:    hook::add chat_send_message_hook   \
    3rd-party-plugins/juick/juick.tcl:113:    hook::remove chat_send_message_hook   \
    3rd-party-plugins/openhistory/openhistory.tcl:8:    hook::add chat_send_message_hook [namespace current]::handle_command 15
    3rd-party-plugins/tastebin/tastebin.tcl:48:	hook::add chat_send_message_hook ${NS}::handle_command
    3rd-party-plugins/ibuddy/ibuddy.tcl:35:hook::add chat_send_message_hook [list [namespace current]::ibuddy::udp_puts "MACRO_GREEN"]
    3rd-party-plugins/reminder/reminder.tcl:71:    hook::add chat_send_message_hook \
    3rd-party-plugins/reminder/reminder.tcl:85:    hook::remove chat_send_message_hook \
    3rd-party-plugins/urlcmd/urlcmd.tcl:25:	hook::add chat_send_message_hook \
    3rd-party-plugins/bldjid2/bldjid2.tcl:186:    hook::add chat_send_message_hook \
    3rd-party-plugins/bldjid2/bldjid2.tcl:208:    hook::remove chat_send_message_hook \
    3rd-party-plugins/autoanswer/autoanswer.tcl:232:	hook::add chat_send_message_hook  \







|







337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
    tkabber/doc/tkabber.xml:2135:chat_send_message_hook $chatid $user $body $type
    tkabber/chats.tcl:893:    hook::run chat_send_message_hook $chatid $user $body $type
    tkabber/chats.tcl:997:	hook::run chat_send_message_hook $chatid [connection_user $xlib] \
    tkabber/README:2426:   chat_send_message_hook $chatid $user $body $type
    3rd-party-plugins/juick/juick.tcl:76:    hook::add chat_send_message_hook   \
    3rd-party-plugins/juick/juick.tcl:113:    hook::remove chat_send_message_hook   \
    3rd-party-plugins/openhistory/openhistory.tcl:8:    hook::add chat_send_message_hook [namespace current]::handle_command 15
    3rd-party-plugins/tastebin/tastebin.tcl:48:	hook::add chat_send_message_hook ${NS}::handle_command	
    3rd-party-plugins/ibuddy/ibuddy.tcl:35:hook::add chat_send_message_hook [list [namespace current]::ibuddy::udp_puts "MACRO_GREEN"]
    3rd-party-plugins/reminder/reminder.tcl:71:    hook::add chat_send_message_hook \
    3rd-party-plugins/reminder/reminder.tcl:85:    hook::remove chat_send_message_hook \
    3rd-party-plugins/urlcmd/urlcmd.tcl:25:	hook::add chat_send_message_hook \
    3rd-party-plugins/bldjid2/bldjid2.tcl:186:    hook::add chat_send_message_hook \
    3rd-party-plugins/bldjid2/bldjid2.tcl:208:    hook::remove chat_send_message_hook \
    3rd-party-plugins/autoanswer/autoanswer.tcl:232:	hook::add chat_send_message_hook  \
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
    tkabber-plugins/tclchat/tclchat_commands.tcl:16:    hook::remove chat_send_message_hook \
    tkabber-plugins/bc/bc.tcl:57:    hook::add chat_send_message_hook \
    tkabber-plugins/bc/bc.tcl:72:    hook::remove chat_send_message_hook \
    tkabber-plugins/presencecmd/presencecmd.tcl:27:    hook::add chat_send_message_hook [namespace current]::handle_command 15
    tkabber-plugins/presencecmd/presencecmd.tcl:32:    hook::remove chat_send_message_hook [namespace current]::handle_command 15

# <a id="Немного_мыслей_о_развитии_механизма_команд"></a>Немного мыслей о развитии механизма команд
Проверку синтаксиса, лучше делать не для каждой команды индивидуально, а
централизованно. Регистрируем набор команд со специфицированным форматом
аргументов. При отправке сообщения проверяем ввод на соответствие данному
формату, осуществляя в сущности ту же работу, которую делает парсер команд
shell'а. Остаётся вопрос, что делать, если пользователем набрана существующая
команда с неправильным форматом аргументов или несуществующая команда. Я думаю,
все сообщения, начинающиеся с символа '/', нужно либо обрабатывать как команды,
либо выдавать сообщение о невозможности выполнить команду. А для возможности
отправки сообщения с первым символом '/' предусмотреть специальный хак,
например команду //.

Ещё в тему единого парсера команд: тип аргумента `user`, раскрывается как в
команде [**/last [user]**](#_last_user), и тип `user_b`, раскрывается как
в команде [**/vcard [user\_b]**](#_vcard_user_b).







|
<
<
<
<
<
<
<
<
<

|
|
|
360
361
362
363
364
365
366
367









368
369
370
371
    tkabber-plugins/tclchat/tclchat_commands.tcl:16:    hook::remove chat_send_message_hook \
    tkabber-plugins/bc/bc.tcl:57:    hook::add chat_send_message_hook \
    tkabber-plugins/bc/bc.tcl:72:    hook::remove chat_send_message_hook \
    tkabber-plugins/presencecmd/presencecmd.tcl:27:    hook::add chat_send_message_hook [namespace current]::handle_command 15
    tkabber-plugins/presencecmd/presencecmd.tcl:32:    hook::remove chat_send_message_hook [namespace current]::handle_command 15

# <a id="Немного_мыслей_о_развитии_механизма_команд"></a>Немного мыслей о развитии механизма команд
Проверку синтаксиса, лучше делать не для каждой команды индивидуально, а централизованно. Регистрируем набор команд со специфицированным форматом аргументов. При отправке сообщения проверяем ввод на соответствие данному формату, осуществляя в сущности ту же работу, которую делает парсер команд shell'а. Остаётся вопрос, что делать, если пользователем набрана существующая команда с неправильным форматом аргументов или несуществующая команда. Я думаю, все сообщения, начинающиеся с символа '/', нужно либо обрабатывать как команды, либо выдавать сообщение о невозможности выполнить команду. А для возможности отправки сообщения с первым символом '/' предусмотреть специальный хак, например команду //. 










Ещё в тему единого парсера команд: тип аргумента `user`, раскрывается как в команде [/last [user]](Команды.md#_last_user), и тип `user_b`, раскрывается как в команде [/vcard [user\_b]](Команды.md#_vcard_user_b). 


Changes to wiki/ru/Культ_личности_Ткаббера.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59





60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193


194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229

230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260

261

262
263
264
265
266

267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303




[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Культ_личности_Ткаббера/index.html)


# Культ личности Ткаббера

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Рождение легенды](#Рождение_легенды)
* [2 Трансцендентная сущность](#Трансцендентная_сущность)
* [3 Пророческий сон](#Пророческий_сон)
* [4 Святая равноапостольская церковь](#Святая_равноапостольская_церковь)
* [5 Ткаббер правит миром](#Ткаббер_правит_миром)
* [6 Игра "Задай вопрос про Ткаббер и выиграй приз!"](#Игра_Задай_вопрос_про_Ткаббер_и_выиграй_приз)
   * [6.1 Список Славы](#Список_Славы)
      * [6.1.1 Октябрь 2007 (Compiz, meet Tkabber. Tkabber, meet Compiz)](#Октябрь_2007_Compiz_meet_Tkabber._Tkabber_meet_Compiz)
      * [6.1.2 Ноябрь 2007 (не.жужжи.насекомое)](#Ноябрь_2007_не.жужжи.насекомое)
      * [6.1.3 Февраль 2008 (ткаббер версия 4.0 финал)](#Февраль_2008_ткаббер_версия_4.0_финал)
      * [6.1.4 Май 2008 (скрытие версии клиента)](#Май_2008_скрытие_версии_клиента)
* [7 Как правильно троллить в конференции tkabber@c.j.r.](#Как_правильно_троллить_в_конференции_tkabberc.j.r.)
   * [7.1 Толстый троллинг](#Толстый_троллинг)
   * [7.2 Тонкий троллинг](#Тонкий_троллинг)
   * [7.3 Очень тонкий троллинг](#Очень_тонкий_троллинг)
   * [7.4 Резюмируя](#Резюмируя)
* [8 TODO](#TODO)

## <a id="Рождение_легенды"></a>Рождение легенды
Ткаббер трёх дней от роду (найдено в архивах НКВД):
![картинка с трёхдневным Ткаббером](../images/0day-tkabber.png)

## <a id="Трансцендентная_сущность"></a>Трансцендентная сущность

![Альтер эго Ткаббера](../images/180px-Sneg_01.jpg)


Культисту [*hypersw*](Участник_Hypersw.md), медитировавшему однажды в холодном
январском сугробе, внезапно открылась трансцендентная сущность Ткаббера —
самого "фичастого" XMPP-клиента, и Провидние указало ему
[Тот Самый URL](http://www.deposviblovo.ru/photo/vagon/sneg/sneg_01.jpg) (уже недоступен).

## <a id="Пророческий_сон"></a>Пророческий сон

![Bigote видит индюка с квазипериодическим пульсом](../images/Psycho.jpg)

[12:32]\* [**bigote**](Участник_Bigote.md) приснился сон, что [**teo**](Участник_Teo.md)
велел ему посчитать пульс какого-то не то индюка, не то петуха. но что-то шло
не так в этом мире, и секундная стрелка часов носилась как бешеная, и
[**bigote**](Участник_Bigote.md) не успевал за ней даже следить, не то что считать
пульс. тогда [**teo**](Участник_Teo.md) сказал: "сейчас настрою" и
[сделал как-то так](http://ru.wikipedia.org/wiki/Специальная_теория_относительности#.D0.A1.D1.83.D1.89.D0.BD.D0.BE.D1.81.D1.82.D1.8C_.D0.A1.D0.A2.D0.9E),
что движение стрелки замедлилось, а размер [**шрифта в чате**](Шрифты.md)
уменьшился (именно так я и понял, что время замедлилось).

Оригинал — [здесь](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2007/10/13.html#12:32:48).

Дополнительные материалы — <s>[здесь](http://ru.wikipedia.org/wiki/Бред)</s>
[здесь](http://ru.wikipedia.org/wiki/Сновидение).

## <a id="Святая_равноапостольская_церковь"></a>Святая равноапостольская церковь
[Первые апостолы](http://www.jabber.ru/node/223#comment-228)






Примечание: к [синдрому ПГМ](http://lurkmore.ru/wiki/ПГМ) отношения не имеет.

## <a id="Ткаббер_правит_миром"></a>Ткаббер правит миром
Сертификат порабощения Мира предоставлен [[1]](http://thepr.ru).

![Сертификат порабощения мира](../images/180px-Tkabber-master.jpg)

[Ссылка на сам сертификат (осторожно, трафик!).](http://thepr.ru/index.php?cert=tkabber243821)

## <a id="Игра_Задай_вопрос_про_Ткаббер_и_выиграй_приз"></a>Игра "Задай вопрос про Ткаббер и выиграй приз!"
Правила несложные:

*  Задай вопрос, относящийся к Ткабберу, ответа на который нет на вики и в
   интернете (см. раздел [Ссылки](Ссылки.md)).
*  Если и вправду на него нет ответа, мы постараемся ответ найти, а человек,
   вопрос задавший, автоматически становится победителем.
*  Подведение итогов — последний день каждого месяца.
*  Победителю разрешается в день подведения итогов в течение получаса нарушать
   правила, изложенные в топике, а админы конфы в этот день будут говорить ему
   два раза "ку".
*  Имя победителя появится в Списке Славы, который будет публиковаться тут же,
   чуть ниже.
*  Победитель снискает почёт и уважение на просторах конференции, и ему
   пожизненно присвоится ранг "член-корреспондент".

### <a id="Список_Славы"></a>Список Славы

#### <a id="Октябрь_2007_Compiz_meet_Tkabber._Tkabber_meet_Compiz"></a>Октябрь 2007 (Compiz, meet Tkabber. Tkabber, meet Compiz)

Победил вопрос Vit@liy (а также ответ teo):

\<Vit@liy> У меня в окне настроек при перемотке смазывается содержимое окна. Не
подскажите из-за чего это может быть?

\<teo> ничего нового. ткаббер так же глючит в компизе

\<teo> или компиз так же глючит на ткаббере

[Читать весь лог.](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2007/10/01.html#22:07:10)

#### <a id="Ноябрь_2007_не.жужжи.насекомое"></a>Ноябрь 2007 (не.жужжи.насекомое)

Досрочно победил вопрос astja (над решением бились всей конфой всё утро, так
что лучше читать [весь чатлог](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2007/11/20.html#11:10:31)):

[11:35:11](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2007/11/20.html#11:35:11)
\<astja> Спасибо за понимание. [http://slil.ru/25125380](http://slil.ru/25125380) Здесь
скриншот _(в формате BMP, 3Mb. Лёгкая версия в 132 Kb (хоть и тоже с
расширением BMP) — [тут](http://slil.ru/25125415). Прим. ред.)._ Сегодня когда
я вошла в программу, открыла свою конференцию (на скриншоте она называется
svoiludi...) и общалась в ней - все было вполне обычно, все мои сообщения были
под моим ником. Но когда мне написал кто-то из контактов - вкладка открылась не
под ником контакта а под ником "не.жужжи.насекомое", а мои сообщения ему
уходили под этим же ником. У меня ранее в контактах была сохранена одноименная
конференция, в которой я бывала пару раз. Теперь когда я нахожу в списке эту
конференцию и просматриваю ее информацию - там отображается моя личная
информация. Удалить эту конференция нельзя. К тому же, если я сама первая пишу
кому-то из своего контакт-листа - на примере - Vitaliys, то снова видно какой у
меня ник...Но вкладка называется нормально. И ваша конференция тоже называется
"не.жужжи.насекомое" на снимке она же...открыта крайняя правая.

_Прим. ред.: Ссылки уже не работают, так как подобные сервисы долго файлы не
хранят. Надо было нам  файлик скачать к себе, конечно, но... поздно пить
боржоми, когда почки в унитазе :) Можем подтвердить, что на скриншоте всё было
именно так, как описывает astja._

#### <a id="Февраль_2008_ткаббер_версия_4.0_финал"></a>Февраль 2008 (ткаббер версия 4.0 финал)

Похоже, этот вопрос тоже победит досрочно, уж больно хорош ;)

    [13:51:24] <alengina > привет всем :) где можно скачать
    ткабер версию 4.0 финал?
    [13:51:46] <alengina > version
    [13:51:46] <sulci> alengina : у тебя клиент Tkabber 0.10.1-beta2
    (Tcl/Tk 8.4.16 (pack rev.2)) - Windows XP
    [13:52:06] <sceptik> alengina : если найдешь скажи..
    а то мы на старой 0.10.1 сидим..
    [13:53:14] <alengina > vlf e;
    [13:53:20] <alengina > мда уж
    [13:54:15] <alengina > ну ладно пока ...

© [http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2008/02/03.html\#13:51:24](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2008/02/03.html#13:51:24)

#### <a id="Май_2008_скрытие_версии_клиента"></a>Май 2008 (скрытие версии клиента)

На сей раз побеждает (тоже досрочно) не вопрос, а ответ камрада [Gebb](Участник_Gebb.md):

    [07:25:56] <ackerman1994> утра
    [07:26:28] <ackerman1994> не подскажете как поменять Client ID
    или как там в tkabber? а то палят что я под виндой сижу
    [07:50:57] <Gebb> Если бы господь считал винду отстойной осью,
    допустил бы он существование Ткаббера под ней?
    Так им и скажи. И не стесняйся винды.
    [08:13:24] <_vt_> в фортунки %)

© [http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2008/05/21.html\#07:25:56](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2008/05/21.html#07:25:56)

## <a id="Как_правильно_троллить_в_конференции_tkabberc.j.r."></a>Как правильно троллить в конференции tkabber@c.j.r.
В связи с недавними гонениями AOL на пасынков ICQ всё больше и больше народу
переходит на Jabber. Бродя по Discovery сервера jabber.ru, многие новички,
случается, заходят и в нашу конференцию, совершенно не зная, как себя при этом
вести (топик комнаты освещает этот момент, но его мало кто читает). Часто люди
пробуют в конфе разнообразные фичи свежепоставленного джаббер-клиента,
разглядывают собственные смайлики или просто спамят или троллят. Причём в 90%
случаев делают это из рук вон плохо. В нижеследующем коротком мануальчике мы
постараемся рассказать об основных аспектах труЪ-тролленья, дающего невероятное
количество лулзов при минимальных затратах сил.

### <a id="Толстый_троллинг"></a>Толстый троллинг

К сожалению, толстый троллинг (налёты, спам и злоупотребление олбанским) очень
неэффективен в этой конференции, потому что пресекается админами жестоко и на
корню: им ничего не стоит забанить на полгода целый сервер или поставить
комнату в read-only mode. Поэтому сосредоточимся на тонком и _очень тонком_
троллинге. Он, как и сам Ткаббер, — не для средних умов, но зато (как и сам
Ткаббер) невероятно эффективен.

### <a id="Тонкий_троллинг"></a>Тонкий троллинг

*  Перво-наперво, надо поставить Ткаббер и научиться в нём работать. После
   этого надо с месяцок потусоваться в конференции, втираясь в доверие. Пока вы
   этим занимаетесь, можете прочитать [**Ткаббер ЧаВо**](Ткаббер_ЧаВо.md), а лучше
   всю вики, чтобы быть осведомлённее самих разработчиков и при случае затыкать
   им рот цитатами оттуда. Не спешите в первые же дни задавать вопросы, иначе
   вы можете чего-нибудь не того ляпнуть, и вас примут за толстого тролля и
   сразу выгонят, а то и забанят. Но даже если и не выгонят, на вас ляжет пятно
   подозрения, и втереться в доверие станет на порядок сложнее.

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



*  Плохого тролля сразу выдаёт плохой русский язык. Пишите грамотно, если
   хотите сойти в конференции за своего. Половина пользователей конфы и все её
   админы — настоящие граммар-наци. Если у вас в школе по русскому языку была
   тройка с длинным минусом, вам тут нечего делать. Вместо того чтобы получить
   удовольствие самому, вы доставите удовольствие этим глумливым грамотеям. И
   никакого олбанского! Вы же не хотите одной фразой испортить игру,
   рассчитанную на целые годы удовольствия? Хинт: если вам посоветовали
   спросить у бота в привате "wtf русский\_язык", это значит, что ваша
   фальшивая борода грамотного человека отклеилась. Бегите перечитывать
   [Розенталя.](http://www.spelling.spb.ru/rosenthal/alpha/)

*  Та же история с так называемыми "слепыми смайлами с двойными подбородками",
   вот такими — )))))) Чего им взбрендило за них банить??????? Весь интернет
   так смеётся!!!!1111 Не может же быть, что весь интернет — идиоты, и лишь
   одни разработчики Ткаббера — умные. Что же они тогда строем не ходят? Тем не
   менее, чтобы не проколоться, пишите смайлики с глазками, вот так — :) А ещё
   лучше — даже не заикайтесь в конференции ни про них, ни про аватары.

*  Можно, прикидываясь нубом, попросить написать какой-нибудь плагин и потом
   долго ухохатываться, читая их советы выучить тикль, который проще пареной
   репы, и написать плагин самому и потом поделиться с общественностью (на
   самом деле плагин давно написал ты сам и даже собираешься выложить его на
   вики, но потроллить — это же святое!)

*  Очень весело бывает спросить, почему Ткаббер такой страшный, хотя на самом
   деле ты давно приделал к нему tile, просто не хочешь делиться тайной. То же
   самое относится к jingle.

*  Самый писк тонкого тролленья — это сидеть в конфе через сам Ткаббер,
   допиленный таким образом, чтобы при выходе из конфы он выдавал что-нибудь
   вроде "QIP Infium: Спокойное общение" (ну и версию клиента и OS показывал
   соответствующую). Задаёшь свой глупый вопрос, ловишь лулзы, а потом выходишь
   из конференции и идёшь читать её логи, потому что самое интересное
   начинается, когда они видят твоё выходное сообщение. Естественно, допиливать
   Ткаббер надо самостоятельно, не прося помощи у разработчиков. Они не такие
   дураки, чтобы не связать эти два события в логическую цепочку.


### <a id="Очень_тонкий_троллинг"></a>Очень тонкий троллинг

*  Теоретическая подготовка очень продвинутого тролля должна быть сравнимой с
   подготовкой разработчиков. Поэтому очень не помешает выучить тикль, благо он
   учится за три дня. В коде Ткаббера разбираться необязательно — там чёрт ногу
   сломит, но самые основные модули стоит выучить близко к тексту.

*  Если вы выбрали амплуа нуба, можете попробовать тонко поиграть на доброте
   админов к тем, кто стремится к знаниям, а не идёт по лёгкому пути, донимая
   разрабов вопросами, давно разжёванными на вики. Поэтому перед тем как идти в
   конфу с каким-то вопросом, освежите в памяти официальную документацию и
   [**Ткаббер ЧаВо**](Ткаббер_ЧаВо.md). Погуглите, наконец. Подучив матчасть, можно
   не бояться сморозить какую-нибудь глупость, которая сразу выдаст вас с
   головой. Вопрос стоит задать [**так**](Остров_посланных_на....md), чтобы казалось, что вы мало
   чего понимаете, но из кожи вон лезете, чтобы разобраться. Разработчики таких
   любят :) Они сразу бросят все свои дела и наперебой кинутся помогать вам.
   Классно же, а? У вас-то ведь на самом деле всё работает! Ну или чинится
   двумя щёлканьями пальцев.

*  Однако _очень тонкий троллинг_ теряет много остроты, если вы сидите на
   стабильной версии и прикидываетесь новичком. Научитесь пользоваться
   subversion, поставьте себе свежую версию из репозитория (ради смеха
   предварительно ознакомившись с [**этой статьёй**](SVN_disclaimer.md)). Так вы
   убьёте двух зайцев: во-первых, получите самые свежие фичи и исправления
   багов Ткаббера, а во-вторых, — это же круто, вы типа "сидите на голове
   репа"! Сейчас мы расскажем, как можно с выгодой использовать svn-версию для
   продвинутого тролленья.

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

   свежие баги). Обязательно сделайте это по всей форме: залив текст ошибки на

   paste.org.ru, а скриншот — на tinypic.com. Расскажите, какие условия вызвали
   этот баг, как вы пытались с ним бороться, ну и так далее. Вот прикол —
   наивные ткабберовцы начнут уважать вас и считаться с вашим мнением, и
   невдомёк им, что на самом-то деле вы просто корчитесь от смеха! Троллить в
   этом стиле очень трудно, потому что можно, самому того не замечая, втянуться

   в разработку и полюбить эту кривую прогу и тупой тикль
   ([по словам одного из их гуру](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2009/02/04.html#14:49:23.893658),
   у него нету даже синтаксиса), который надо было выбросить на свалку ещё в
   прошлом тысячелетии и переписать Ткаббер на сишарпе, питоне или каком-нибудь
   другом [православном языке.](http://okante.narod.ru/D/)

*  Ещё один путь "примкнуть" к разработке — сделать свою цветовую схему, свой
   набор смайликов, иконок или звуков, написать свой плагин, как это делают
   некоторые олухи, которым не жаль своего времени. Да, вы тоже потратите на
   это время, но разница в том, что они это сделали за свою опенсорсную идею, а
   вы сделаете, чтобы потом втайне простебаться над всеми пользователями,
   которые вам поверили ;) Сколько ни рисуй к Ткабберу красивых иконок и
   цветовых схем — он так и останется, к удовольствию анонимусов с ЛОРа,
   **самым страшным клиентом.**

*  Чуть не забыл добавить: обладая Ткаббером, вы получаете в нагрузку ещё одну
   конференцию, где можно оттянуться: xmpp:tkabber-games@conference.jabber.ru.
   Поставьте себе игровые плагины, заходите и прикидывайтесь шахматистом или
   любителем шашек/рэндзю/реверси. Если не потроллите, то хоть развлечётесь в
   поддавки :) Кстати, можно ещё написать плагины для го, преферанса и морского
   боя — представляете, сколько славы и лулзов вы оторвёте за один такой
   плагин?! ;)

### <a id="Резюмируя"></a>Резюмируя

Эти две конференции — непаханое поле для умных, тонких ценителей настоящих
лулзов. Было бы кому и чем пахать... Мы ждём вас, дорогие тролли!

## <a id="TODO"></a>TODO
*  Устроить первый Вселенский Собор.
*  Заказать у Церетели чугунное изваяние Ткаббера в виде официального логотипа
   — "Лампочки-Земли" в масштабе 1:1; измерения доступны
   [здесь](http://ru.wikipedia.org/wiki/Земля).
*  Сочинить гимн и девиз Ткаббера; разработать флаг и герб.
*  Таки сделать что-нибудь из этого! Или догнать хотя бы пиджин.

![Что ты сделал, чтобы догнать пиджин?](../images/180px-Tkabber_jingle.jpg)





>













|
|
|
|
|
|
|
|
|
|


|
|
<

|

|

>
|
|
<
<

|

|

<
<
<
<
<
<
<
<
<
|

|
<

|
|
>
>
>
>
>

<
|
<
<

|

|

|
|

|
<
|
<
|
|
<
<
|
<
|
<

|

|

|

|
<

|

|

|

|

|
<

|
<
<
<
<
<
<
<
<
<
<
<
<
<
<

|
<
<
<

|

|

|


|

|





|

|

|


|

|




|

|
|
<
<
<
<
<
<
<
<

|

|
<
<
<
<
<

|

|
<
<
<
<
<
<
<
<
<
<
<
<

>
>
|
<
<
<
<
<
<
<
<
<

|
<
<
<
<
<

|
<
<
<
<

|
<
<

|
|
<
<
<
<
<
<
>

<
<
|
<
<
<

|
<
<
<
<
<
<
<
<
<
<

|
<
<
<
<
<
<
<

|
|
>
|
>
|
<
<
<
<
>
<
<
<
<
<

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<

|
|
|
<
<
|
|

|
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

30
31
32
33
34
35
36
37


38
39
40
41
42









43
44
45

46
47
48
49
50
51
52
53
54

55


56
57
58
59
60
61
62
63
64

65

66
67


68

69

70
71
72
73
74
75
76
77

78
79
80
81
82
83
84
85
86
87

88
89














90
91



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125








126
127
128
129





130
131
132
133












134
135
136
137









138
139





140
141




142
143


144
145
146






147
148


149



150
151










152
153







154
155
156
157
158
159
160




161





162



















163

164
165
166
167


168
169
170
171
172
173
174
175
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Культ_личности_Ткаббера/index.html)


# Культ личности Ткаббера

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Рождение легенды](#Рождение_легенды)
* [2 Трансцендентная сущность](#Трансцендентная_сущность)
* [3 Пророческий сон](#Пророческий_сон)
* [4 Святая равноапостольская церковь](#Святая_равноапостольская_церковь)
* [5 Ткаббер правит миром](#Ткаббер_правит_миром)
* [6 Игра "Задай вопрос про Ткаббер и выиграй приз!"](#Игра_Задай_вопрос_про_Ткаббер_и_выиграй_приз)
 * [6.1 Список Славы](#Список_Славы)
  * [6.1.1 Октябрь 2007 (Compiz, meet Tkabber. Tkabber, meet Compiz)](#Октябрь_2007_Compiz_meet_Tkabber._Tkabber_meet_Compiz)
  * [6.1.2 Ноябрь 2007 (не.жужжи.насекомое)](#Ноябрь_2007_не.жужжи.насекомое)
  * [6.1.3 Февраль 2008 (ткаббер версия 4.0 финал)](#Февраль_2008_ткаббер_версия_4.0_финал)
  * [6.1.4 Май 2008 (скрытие версии клиента)](#Май_2008_скрытие_версии_клиента)
* [7 Как правильно троллить в конференции tkabber@c.j.r.](#Как_правильно_троллить_в_конференции_tkabber@c.j.r.)
 * [7.1 Толстый троллинг](#Толстый_троллинг)
 * [7.2 Тонкий троллинг](#Тонкий_троллинг)
 * [7.3 Очень тонкий троллинг](#Очень_тонкий_троллинг)
 * [7.4 Резюмируя](#Резюмируя)
* [8 TODO](#TODO)

# <a id="Рождение_легенды"></a>Рождение легенды
Ткаббер трёх дней от роду (найдено в архивах НКВД): ![картинка с трёхдневным Ткаббером](../images/0day-tkabber.png) 


# <a id="Трансцендентная_сущность"></a>Трансцендентная сущность

![](../images/180px-Sneg_01.jpg)

![](../images/magnify-clip.png)

Культисту [hypersw](Участник_Hypersw.md), медитировавшему однажды в холодном январском сугробе, внезапно открылась трансцендентная сущность Ткаббера — самого "фичастого" XMPP-клиента, и Провидние указало ему [Тот Самый URL](http://www.deposviblovo.ru/photo/vagon/sneg/sneg_01.jpg) (уже недоступен). 



# <a id="Пророческий_сон"></a>Пророческий сон

![Bigote видит индюка с квазипериодическим пульсом](../images/Psycho.jpg) [12:32]\* [bigote](Участник_Bigote.md) приснился сон, что [teo](Участник_Teo.md) велел ему посчитать пульс какого-то не то индюка, не то петуха. но что-то шло не так в этом мире, и секундная стрелка часов носилась как бешеная, и [bigote](Участник_Bigote.md) не успевал за ней даже следить, не то что считать пульс. тогда [teo](Участник_Teo.md) сказал: "сейчас настрою" и [сделал как-то так](http://ru.wikipedia.org/wiki/Специальная_теория_относительности#.D0.A1.D1.83.D1.89.D0.BD.D0.BE.D1.81.D1.82.D1.8C_.D0.A1.D0.A2.D0.9E), что движение стрелки замедлилось, а размер [шрифта в чате](Шрифты.md) уменьшился (именно так я и понял, что время замедлилось). 










Оригинал — [здесь](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2007/10/13.html#12:32:48). 

Дополнительные материалы — <s>[здесь](http://ru.wikipedia.org/wiki/Бред)</s> [здесь](http://ru.wikipedia.org/wiki/Сновидение). 


# <a id="Святая_равноапостольская_церковь"></a>Святая равноапостольская церковь
[Первые апостолы](http://www.jabber.ru/node/223#comment-228) 

Примечание: к [синдрому ПГМ](http://lurkmore.ru/wiki/ПГМ) отношения не имеет. 

# <a id="Ткаббер_правит_миром"></a>Ткаббер правит миром
Сертификат порабощения Мира предоставлен [[1]](http://thepr.ru)]. 


![](../images/180px-Tkabber-master.jpg)



![](../images/magnify-clip.png)

[Ссылка на сам сертификат (осторожно, трафик!).](http://thepr.ru/index.php?cert=tkabber243821) 

# <a id="Игра_Задай_вопрос_про_Ткаббер_и_выиграй_приз"></a>Игра "Задай вопрос про Ткаббер и выиграй приз!"
Правила несложные: 

*  Задай вопрос, относящийся к Ткабберу, ответа на который нет на вики и в интернете (см. раздел [Ссылки](Ссылки.md)). 

*  Если и вправду на него нет ответа, мы постараемся ответ найти, а человек, вопрос задавший, автоматически становится победителем. 

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


*  Имя победителя появится в Списке Славы, который будет публиковаться тут же, чуть ниже. 

*  Победитель снискает почёт и уважение на просторах конференции, и ему пожизненно присвоится ранг "член-корреспондент". 


## <a id="Список_Славы"></a>Список Славы

### <a id="Октябрь_2007_Compiz_meet_Tkabber._Tkabber_meet_Compiz"></a>Октябрь 2007 (Compiz, meet Tkabber. Tkabber, meet Compiz)

Победил вопрос Vit@liy (а также ответ teo): 

\<Vit@liy> У меня в окне настроек при перемотке смазывается содержимое окна. Не подскажите из-за чего это может быть? 


\<teo> ничего нового. ткаббер так же глючит в компизе 

\<teo> или компиз так же глючит на ткаббере 

[Читать весь лог.](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2007/10/01.html#22:07:10) 

### <a id="Ноябрь_2007_не.жужжи.насекомое"></a>Ноябрь 2007 (не.жужжи.насекомое)

Досрочно победил вопрос astja (над решением бились всей конфой всё утро, так что лучше читать [весь чатлог](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2007/11/20.html#11:10:31)): 


[11:35:11](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2007/11/20.html#11:35:11) \<astja> Спасибо за понимание. [http://slil.ru/25125380](http://slil.ru/25125380) Здесь скриншот _(в формате BMP, 3Mb. Лёгкая версия в 132 Kb (хоть и тоже с расширением BMP) — [тут](http://slil.ru/25125415). Прим. ред.)._ Сегодня когда я вошла в программу, открыла свою конференцию (на скриншоте она называется svoiludi...) и общалась в ней - все было вполне обычно, все мои сообщения были под моим ником. Но когда мне написал кто-то из контактов - вкладка открылась не под ником контакта а под ником "не.жужжи.насекомое", а мои сообщения ему уходили под этим же ником. У меня ранее в контактах была сохранена одноименная конференция, в которой я бывала пару раз. Теперь когда я нахожу в списке эту конференцию и просматриваю ее информацию - там отображается моя личная информация. Удалить эту конференция нельзя. К тому же, если я сама первая пишу кому-то из своего контакт-листа - на примере - Vitaliys, то снова видно какой у меня ник...Но вкладка называется нормально. И ваша конференция тоже называется "не.жужжи.насекомое" на снимке она же...открыта крайняя правая. 















_Прим. ред.: Ссылки уже не работают, так как подобные сервисы долго файлы не хранят. Надо было нам  файлик скачать к себе, конечно, но... поздно пить боржоми, когда почки в унитазе :) Можем подтвердить, что на скриншоте всё было именно так, как описывает astja._ 




### <a id="Февраль_2008_ткаббер_версия_4.0_финал"></a>Февраль 2008 (ткаббер версия 4.0 финал)

Похоже, этот вопрос тоже победит досрочно, уж больно хорош ;) 

    [13:51:24] <alengina > привет всем :) где можно скачать 
    ткабер версию 4.0 финал?
    [13:51:46] <alengina > version
    [13:51:46] <sulci> alengina : у тебя клиент Tkabber 0.10.1-beta2 
    (Tcl/Tk 8.4.16 (pack rev.2)) - Windows XP
    [13:52:06] <sceptik> alengina : если найдешь скажи.. 
    а то мы на старой 0.10.1 сидим..
    [13:53:14] <alengina > vlf e;
    [13:53:20] <alengina > мда уж
    [13:54:15] <alengina > ну ладно пока ...

© [http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2008/02/03.html\#13:51:24](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2008/02/03.html#13:51:24) 

### <a id="Май_2008_скрытие_версии_клиента"></a>Май 2008 (скрытие версии клиента)

На сей раз побеждает (тоже досрочно) не вопрос, а ответ камрада [Gebb](Участник_Gebb.md): 

    [07:25:56] <ackerman1994> утра
    [07:26:28] <ackerman1994> не подскажете как поменять Client ID 
    или как там в tkabber? а то палят что я под виндой сижу
    [07:50:57] <Gebb> Если бы господь считал винду отстойной осью, 
    допустил бы он существование Ткаббера под ней?
    Так им и скажи. И не стесняйся винды.
    [08:13:24] <_vt_> в фортунки %)

© [http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2008/05/21.html\#07:25:56](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2008/05/21.html#07:25:56) 

# <a id="Как_правильно_троллить_в_конференции_tkabber@c.j.r."></a>Как правильно троллить в конференции tkabber@c.j.r.
В связи с недавними гонениями AOL на пасынков ICQ всё больше и больше народу переходит на Jabber. Бродя по Discovery сервера jabber.ru, многие новички, случается, заходят и в нашу конференцию, совершенно не зная, как себя при этом вести (топик комнаты освещает этот момент, но его мало кто читает). Часто люди пробуют в конфе разнообразные фичи свежепоставленного джаббер-клиента, разглядывают собственные смайлики или просто спамят или троллят. Причём в 90% случаев делают это из рук вон плохо. В нижеследующем коротком мануальчике мы постараемся рассказать об основных аспектах труЪ-тролленья, дающего невероятное количество лулзов при минимальных затратах сил. 









## <a id="Толстый_троллинг"></a>Толстый троллинг

К сожалению, толстый троллинг (налёты, спам и злоупотребление олбанским) очень неэффективен в этой конференции, потому что пресекается админами жестоко и на корню: им ничего не стоит забанить на полгода целый сервер или поставить комнату в read-only mode. Поэтому сосредоточимся на тонком и _очень тонком_ троллинге. Он, как и сам Ткаббер, — не для средних умов, но зато (как и сам Ткаббер) невероятно эффективен. 






## <a id="Тонкий_троллинг"></a>Тонкий троллинг

*  Перво-наперво, надо поставить Ткаббер и научиться в нём работать. После этого надо с месяцок потусоваться в конференции, втираясь в доверие. Пока вы этим занимаетесь, можете прочитать [Ткаббер ЧаВо](Ткаббер_ЧаВо.md), а лучше всю вики, чтобы быть осведомлённее самих разработчиков и при случае затыкать им рот цитатами оттуда. Не спешите в первые же дни задавать вопросы, иначе вы можете чего-нибудь не того ляпнуть, и вас примут за толстого тролля и сразу выгонят, а то и забанят. Но даже если и не выгонят, на вас ляжет пятно подозрения, и втереться в доверие станет на порядок сложнее. 













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

*  Плохого тролля сразу выдаёт плохой русский язык. Пишите грамотно, если хотите сойти в конференции за своего. Половина пользователей конфы и все её админы — настоящие граммар-наци. Если у вас в школе по русскому языку была тройка с длинным минусом, вам тут нечего делать. Вместо того чтобы получить удовольствие самому, вы доставите удовольствие этим глумливым грамотеям. И никакого олбанского! Вы же не хотите одной фразой испортить игру, рассчитанную на целые годы удовольствия? Хинт: если вам посоветовали спросить у бота в привате "wtf русский\_язык", это значит, что ваша фальшивая борода грамотного человека отклеилась. Бегите перечитывать [Розенталя.](http://www.spelling.spb.ru/rosenthal/alpha/) 










*  Та же история с так называемыми "слепыми смайлами с двойными подбородками", вот такими — )))))) Чего им взбрендило за них банить??????? Весь интернет так смеётся!!!!1111 Не может же быть, что весь интернет — идиоты, и лишь одни разработчики Ткаббера — умные. Что же они тогда строем не ходят? Тем не менее, чтобы не проколоться, пишите смайлики с глазками, вот так — :) А ещё лучше — даже не заикайтесь в конференции ни про них, ни про аватары. 






*  Можно, прикидываясь нубом, попросить написать какой-нибудь плагин и потом долго ухохатываться, читая их советы выучить тикль, который проще пареной репы, и написать плагин самому и потом поделиться с общественностью (на самом деле плагин давно написал ты сам и даже собираешься выложить его на вики, но потроллить — это же святое!) 





*  Очень весело бывает спросить, почему Ткаббер такой страшный, хотя на самом деле ты давно приделал к нему tile, просто не хочешь делиться тайной. То же самое относится к jingle. 



*  Самый писк тонкого тролленья — это сидеть в конфе через сам Ткаббер, допиленный таким образом, чтобы при выходе из конфы он выдавал что-нибудь вроде "QIP Infium: Спокойное общение" (ну и версию клиента и OS показывал соответствующую). Задаёшь свой глупый вопрос, ловишь лулзы, а потом выходишь из конференции и идёшь читать её логи, потому что самое интересное начинается, когда они видят твоё выходное сообщение. Естественно, допиливать Ткаббер надо самостоятельно, не прося помощи у разработчиков. Они не такие дураки, чтобы не связать эти два события в логическую цепочку. 







## <a id="Очень_тонкий_троллинг"></a>Очень тонкий троллинг



*  Теоретическая подготовка очень продвинутого тролля должна быть сравнимой с подготовкой разработчиков. Поэтому очень не помешает выучить тикль, благо он учится за три дня. В коде Ткаббера разбираться необязательно — там чёрт ногу сломит, но самые основные модули стоит выучить близко к тексту.  




*  Если вы выбрали амплуа нуба, можете попробовать тонко поиграть на доброте админов к тем, кто стремится к знаниям, а не идёт по лёгкому пути, донимая разрабов вопросами, давно разжёванными на вики. Поэтому перед тем как идти в конфу с каким-то вопросом, освежите в памяти официальную документацию и [Ткаббер ЧаВо](Ткаббер_ЧаВо.md). Погуглите, наконец. Подучив матчасть, можно не бояться сморозить какую-нибудь глупость, которая сразу выдаст вас с головой. Вопрос стоит задать [так](Topic.md), чтобы казалось, что вы мало чего понимаете, но из кожи вон лезете, чтобы разобраться. Разработчики таких любят :) Они сразу бросят все свои дела и наперебой кинутся помогать вам. Классно же, а? У вас-то ведь на самом деле всё работает! Ну или чинится двумя щёлканьями пальцев. 











*  Однако _очень тонкий троллинг_ теряет много остроты, если вы сидите на стабильной версии и прикидываетесь новичком. Научитесь пользоваться subversion, поставьте себе свежую версию из репозитория (ради смеха предварительно ознакомившись с [этой статьёй](SVN_disclaimer.md)). Так вы убьёте двух зайцев: во-первых, получите самые свежие фичи и исправления багов Ткаббера, а во-вторых, — это же круто, вы типа "сидите на голове репа"! Сейчас мы расскажем, как можно с выгодой использовать svn-версию для продвинутого тролленья. 








*  Время от времени вы можете "помочь разработке", показав девелоперам найденный баг (сидя на голове репа, вы получаете не только свежие фичи, но и свежие баги). Обязательно сделайте это по всей форме: залив текст ошибки на paste.org.ru, а скриншот — на tinypic.com. Расскажите, какие условия вызвали этот баг, как вы пытались с ним бороться, ну и так далее. Вот прикол — наивные ткабберовцы начнут уважать вас и считаться с вашим мнением, и невдомёк им, что на самом-то деле вы просто корчитесь от смеха! Троллить в этом стиле очень трудно, потому что можно, самому того не замечая, втянуться в разработку и полюбить эту кривую прогу и тупой тикль ([по словам одного из их гуру](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2009/02/04.html#14:49:23.893658), у него нету даже синтаксиса), который надо было выбросить на свалку ещё в прошлом тысячелетии и переписать Ткаббер на сишарпе, питоне или каком-нибудь другом [православном языке.](http://okante.narod.ru/D/) 

*  Ещё один путь "примкнуть" к разработке — сделать свою цветовую схему, свой набор смайликов, иконок или звуков, написать свой плагин, как это делают некоторые олухи, которым не жаль своего времени. Да, вы тоже потратите на это время, но разница в том, что они это сделали за свою опенсорсную идею, а вы сделаете, чтобы потом втайне простебаться над всеми пользователями, которые вам поверили ;) Сколько ни рисуй к Ткабберу красивых иконок и цветовых схем — он так и останется, к удовольствию анонимусов с ЛОРа, **самым страшным клиентом.** 

*  Чуть не забыл добавить: обладая Ткаббером, вы получаете в нагрузку ещё одну конференцию, где можно оттянуться: xmpp:tkabber-games@conference.jabber.ru. Поставьте себе игровые плагины, заходите и прикидывайтесь шахматистом или любителем шашек/рэндзю/реверси. Если не потроллите, то хоть развлечётесь в поддавки :) Кстати, можно ещё написать плагины для го, преферанса и морского боя — представляете, сколько славы и лулзов вы оторвёте за один такой плагин?! ;) 





## <a id="Резюмируя"></a>Резюмируя

























Эти две конференции — непаханое поле для умных, тонких ценителей настоящих лулзов. Было бы кому и чем пахать... Мы ждём вас, дорогие тролли! 


# <a id="TODO"></a>TODO
*  Устроить первый Вселенский Собор. 
*  Заказать у Церетели чугунное изваяние Ткаббера в виде официального логотипа — "Лампочки-Земли" в масштабе 1:1; измерения доступны [здесь](http://ru.wikipedia.org/wiki/Земля). 


*  Сочинить гимн и девиз Ткаббера; разработать флаг и герб. 
*  Таки сделать что-нибудь из этого! Или догнать хотя бы пиджин. 

![](../images/180px-Tkabber_jingle.jpg)

![](../images/magnify-clip.png)


Changes to wiki/ru/Между_офлайном_и_онлайном.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184

185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355


[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Между_офлайном_и_онлайном/index.html)


# Между офлайном и онлайном

Материал из Tkabber Wiki

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

## <a id="toc"></a>Содержание

* [1 Для самых маленьких](#Для_самых_маленьких)
* [2 Ветхий и Новый заветы XMPP](#Ветхий_и_Новый_заветы_XMPP)
* [3 Канал связи клиент-сервер в Jabber/XMPP](#Канал_связи_клиент-сервер_в_Jabber_XMPP)
   * [3.1 Концепции](#Концепции)
   * [3.2 Куда и как подключаться?](#Куда_и_как_подключаться)
   * [3.3 Защита потока](#Защита_потока)
      * [3.3.1 SSL/TLS](#SSL_TLS)
      * [3.3.2 Сертификаты SSL/TLS](#Сертификаты_SSL_TLS)
   * [3.4 Аутентификация пользователя](#Аутентификация_пользователя)
   * [3.5 Реализация в XMPP](#Реализация_в_XMPP)
   * [3.6 Реализация в Jabber](#Реализация_в_Jabber)
   * [3.7 Поддержка в Ткаббере](#Поддержка_в_Ткаббере)
* [4 Подключение к XMPP-серверу: практика](#Подключение_к_XMPP-серверу_практика)
   * [4.1 "Стандартный" XMPP сервер](#Стандартный_XMPP_сервер)
   * [4.2 Серверы Google Talk](#Серверы_Google_Talk)
* [5 Примечания](#Примечания)

# <a id="Для_самых_маленьких"></a>Для самых маленьких
Здесь приведены "рекомендованные" настройки для _типичного_ случая, под которым
мы понимаем соединение с сервером jabber.ru.

Рассмотрим самый простой случай: вы подключены к интернету напрямую, безо
всяких прокси, вместе с Ткаббером установлены все нужные и ненужные пакеты,
перечисленные, например, [тут](http://tkabber.jabber.ru/dependencies2). В этом
случае на 95% подойдут следующие настройки:

*  На вкладке "Соединение" окошка логина (которое вызывается по Ctrl-L) ничего
   отмечать не надо.
*  На вкладке "Аутентификация" включить две галочки: "Использовать SASL для
   аутентификации" и "Разрешить механизм SASL X-GOOGLE-TOKEN". Строго говоря,
   вторая из них нужна для подключения к аккаунту на гугль-талке, но пусть уж
   будет.
*  На вкладке "SSL & Сжатие" отметьте "Шифрование (STARTTLS)".
*  Вот, в общем-то, всё. Должно работать. Если вдруг не работает, попробуйте на
   вкладке "Шифрование" сменить опцию на "Шифрование (Старый SSL)" или рискните
   "Открытый несжатый текст". Эту последнюю опцию следует пробовать лишь в
   самых крайних случаях. Если с ней подключиться удалось, следующий ваш шаг
   должен быть сделан в направлении настройки защищённого (шифрованного)
   соединения. Прямым ходом идите к нам в [xmpp:tkabber@conference.jabber.ru
   конференцию] и просите помощи (дочитав перед этим статью до конца!) И ни в
   коем случае не злоупотребляйте опцией "Открытый текст". Тоже в качестве
   крайней меры можно попробовать и первую опцию про открытый текст на вкладке
   "Аутентификация" — с теми же оговорками.

![(!)](../images/Hammer.png) **Сделать:** развить

![(!)](../images/Hammer.png) **Сделать:** вынести в отдельную статью раздел
фака "Не могу подключиться ... через прокси" и поставить отсюда ссылку на него

# <a id="Ветхий_и_Новый_заветы_XMPP"></a>Ветхий и Новый заветы XMPP
Настало время развеять один укоренившийся миф.

Принято считать, что XMPP ≈ Jabber. В принципе, так и есть: XMPP обратно
совместим с Jabber, но и довольно серьёзные различия также имеют место.
Большая, если не бо́льшая часть этих различий как раз приходится на механизм
установки соединения с сервером.

Относительная сложность диалога логина в Ткаббере как раз отражает эти
различия, причём (возможно, к неудовольствию новичков) — с сугубо технических
позиций. Однако здесь мы попытаемся поставить всё на свои места. С другой
стороны, мы покажем, что дёргать настройки приходится, как правило, только при
переходе со "старого" сервера на "новый" и наоборот.
![(!)](../images/Hammer.png) **Сделать:** написать понятнее

[RFC \#3920](http://www.xmpp.org/rfcs/rfc3920.html) назвает "старый Jabber"
терминами "pre-XMPP" и "XMPP 0.9"; это, конечно, неофициальные наименования. Мы
будем использовать термин "Jabber", ссылаясь на устаревшие версии протокола, и
"XMPP", — ссылаясь на текущую, стандартную, версию.

Чтобы было понятнее "кто есть кто" и чего ожидать от конкретного сервера:

*  [jabberd 1.4](http://jabberd.jabberstudio.org/) — Jabber сервер; кое-где всё
   ещё используется, но больше не развивается.
*  [jabberd2](http://jabberd.jabberstudio.org/2/) — XMPP-сервер. Используется
   не очень часто.
*  [ejabberd](http://ejabberd.jabber.ru) — XMPP-сервер. Используется очень
   широко; в частности, jabber.org и jabber.ru работают на нём.

# <a id="Канал_связи_клиент-сервер_в_Jabber_XMPP"></a>Канал связи клиент-сервер в Jabber/XMPP
Этот раздел предназначен для тех, кто хочет понять суть происходящего, когда
Ткаббер устанавливает соединение с сервером и затем обменивается с ним
сообщениями.

Фактически, всё, здесь рассказанное, изложено в стандарте на протокол XMPP:
[RFC \#3920](http://www.xmpp.org/rfcs/rfc3920.html). Здесь же мы попытаемся
описать это всё попроще и на языке родных осин.

## <a id="Концепции"></a>Концепции

Передача информации — смысл и цель соединения между XMPP-клиентом и
XMPP-сервером. Это соединение представлено двумя XML-потоками: от к клиента к
серверу и от сервера к клиенту. Однако, прежде чем такая передача станет
возможной, нужно решить три проблемы:

*  Клиент должен выяснить, с каким физическим компьютером в сети и каким
   способом он должен установить соединение.
*  Сервер должен знать, что клиент — именно тот, за кого он себя выдаёт. Проще
   говоря, если с сервером хочет работать пользователь Вася, он должен
   подтвердить, что он именно Вася, а не Петя или Маша. Этот процесс называется
   _аутентификацией потока_ ("stream authentication"). Обычно таким
   подтверждением является знание васиного пароля на сервере.
*  Если не приняты какие либо специальные меры, информация в XMPP передаётся в
   открытом виде, то есть её можно "подслушивать" (англ. "to eavesdrop"),
   получая, к примеру, пароли к каким-либо ресурсам, которые наивный
   пользователь сообщил в чате другому пользователю. Также ни у одной из сторон
   TCP-канала связи нет гарантий того, что "та сторона" всё ещё "та": известно
   несколько атак на TCP/IP-соединение, позволяющих нарушить его целостность.
   Это называется влиянием на канал (англ. "tampering"). Специальные меры,
   решающие эти проблемы называются _защитой потока_ (англ. "stream security").

Вместо термина "поток" мы также будем часто использовать термин "канал". Сути
это не меняет.

XMPP чётко определяет стандартные способы защиты канала и аутентификации.

Кроме того, перед тем, как подключившийся клиент сможет начать обмен данными с
сервером, должна произойти так называемая "привязка ресурса" ("resource
binding") к созданному каналу — сервер должен закрепить за созданным каналом
определённый "ресурс" клиента.

![(!)](../images/Hammer.png) **Сделать:** расписать про ресурсы

## <a id="Куда_и_как_подключаться"></a>Куда и как подключаться?

## <a id="Защита_потока"></a>Защита потока

Традиционно как в Jabber-, так и XMPP-серверах процедура защиты канала, если
таковая производится, выполняется раньше, чем аутентификация. Это разумно, так
как в случае успешного завершения процедуры установления защиты потока,
протокол аутентификации пользователя будет надёжно защищён от атак.

### <a id="SSL_TLS"></a>SSL/TLS

Существует достаточно много протоколов для защиты потока связи в IP-сетях,
однако наибольшее распространение получил протокол
[SSL](http://ru.wikipedia.org/wiki/SSL) (Secure Sockets Layer).

Именно SSL используется как в Jabber, так и в XMPP для защиты канала. Однако,
используется несколько по-разному (об этом — ниже).

Также путаницу вносит то, что в SSL, первоначально разработанный Netscape, был
стандартизован IETF; при этом IETF переименовала протокол в
[TLS](http://ru.wikipedia.org/wiki/TLS) (Transport Layer Security). TLS основан
на "версии 3" протокола SSL (обычно она именуется "SSLv3") и отличается от
последнего довольно слабо, из-за чего обычно термины "SSL" и "TLS" используются
вместо друг друга. Это совершенно неверно с формальной точки зрения, и немного
неверно — с технической, однако удобно для пользователя: можете считать, что
это один и тот же протокол.

SSL реализует:

*  _Целостность передаваемых данных_ — гарантируется, что передаваемые данные
   не могут быть незаметно изменены.
*  _Конфиденциальнось передаваемых данных_ — данные могут шифроваться
   различными (в том числе весьма криптостойкими, например, AES) алгоритмами.
*  Взаимное удостоверение сторон, создающих канал связи, в том, что они именно
   те, за кого себя выдают.

Ключевым моментом в реализации этих возможностей является использование
_сертификатов_.

### <a id="Сертификаты_SSL_TLS"></a>Сертификаты SSL/TLS

SSL использует [сертификаты X.509](http://www.apps.ietf.org/rfc/rfc3280.html).

![(!)](../images/Hammer.png) **Сделать:** развить тему

## <a id="Аутентификация_пользователя"></a>Аутентификация пользователя

> *\<hiddenman> какая-то китайка уже SHA-1  
> вслед за MD5 и прочим "поломала".  

> \<ilyak> hiddenman: И теперь сидит, как дура, без SHA-1*

> *[Цитата с башорга](http://bash.org.ru/quote.php?num=93945)*

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

Технически клиент может доказать серверу, что знает правильный пароль,
несколькими способами.

Самый простой — просто передать пароль, введённый пользователем, серверу "как
есть", то есть в открытом виде. Это самый плохой способ с точки зрения защиты
данных: если трафик между клиентом и сервером может прослушать третье лицо
(это, к примеру, общий случай на сегменте сети Ethernet, повсеместно
применяемой в офисах), оно получит готовые данные для использования учётной
записи клиента (его "аккаунта") по своему усмотрению. Такой вид передачи данных
(без защиты) называется "открытым" ("plain text"). Резюмируя простыми словами,
такой пароль обязательно перехватит даже самый ленивый хакер — просто чтоб
неповадно было.

Чуть более защищённый способ — закодировать пароль при передаче. Такой способ,
к примеру, используется в ходе "простой" ("basic") аутентификации на
HTTP-прокси серверах. Однако такой способ защищает пароль только от глаз
смотрящего на распечатку сетевого трафика. Так как человек, желающий заполучить
пароль, скорее всего знает, _где именно_ он его ищет, он также знает, какой
способ используется для шифровки и, соответственно, не будет иметь трудностей с
расшифровкой. Таким образом, уровень защиты пароля в этом случае ненамного
выше, чем у открытого текста, ибо спасает лишь от глупого или очень зелёного
хакера.

Значительно более эффективны алгоритмы аутентификации, основанные на механизме
"вызов-ответ" ("challenge-response"), позволяющие обойтись без передачи пароля
между клиентом и сервером. Их идея в следующем:

*  Сервер посылает клиенту некоторые _случайные_ данные.
*  Клиент добавляет к ним свой пароль и считает на получившемся массиве данных
   _криптографический хэш_.
*  Клиент посылает полученный хэш серверу.
*  Сервер, зная пароль клиента, сам считает такой же хэш и сравнивает хэш
   клиента с результатом своих вычислений. Если они совпадают, клиент знает
   пароль.

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

Чаще всего для вычисления хэша применяют [алгоритм MD5](ftp://ftp.umbc.edu/pub/unix/rfc/rfc1321.txt.gz)
(см. также [материал в Википедии](http://ru.wikipedia.org/wiki/MD5))<sup>1</sup>.

## <a id="Реализация_в_XMPP"></a>Реализация в XMPP

![(!)](../images/Hammer.png) **Сделать:** написать

## <a id="Реализация_в_Jabber"></a>Реализация в Jabber

![(!)](../images/Hammer.png) **Сделать:** написать

## <a id="Поддержка_в_Ткаббере"></a>Поддержка в Ткаббере

![(!)](../images/Hammer.png) **Сделать:** написать

# <a id="Подключение_к_XMPP-серверу_практика"></a>Подключение к XMPP-серверу: практика
Здесь подробно рассказано, что предпринять для подключения к XMPP-серверу в
особо тяжёлых случаях (к примеру, параноидально настроенный прокси-сервер).
Акцент сделан на подключение к `jabber.ru`.

## <a id="Стандартный_XMPP_сервер"></a>"Стандартный" XMPP сервер

Итак, что можно сделать, если соединение с Вашим сервером через прокси не
проходит:

*  Попробуйте присоединиться на каждый из стандартных портов; возможно,
   какой-то из них будет работать (имейте в виду, что при выборе 5222 следует
   включать опцию "Шифрование (STARTTLS)", а при выборе 5223 — "Шифрование
   (старый SSL)".
*  Проверьте, принимает ли ваш Jabber-сервер соединения на порт 443 (следует
   выбрать "старый SSL" в настройках).
*  Если ничего не помогло, попробуйте использовать механизм HTTP-poll, если ваш
   сервер его поддерживает. Протокол HTTP-poll позволяет реализовать связь с
   сервером путём посылки серверу HTTP-запросов (стандартно — на порт 5280),
   что, в принципе, должно сделать возможной работу через любой прокси-сервер,
   кроме совсем уж параноидально настроенных.

Пользователи сервера [jabber.ru](http://jabber.ru) имеют несколько
дополнительных опций благодаря тому, что вокруг этого сервера построена
дополнительная "обвязка":

*  `ssl.jabber.ru` поддерживает соединения с шифрованием "старый SSL" на порт
   443;
*  `allports.jabber.ru` поддерживает соединения на _любой_ порт с поддержкой
   протокола STARTTLS.

Эти имена хостов и порты следует вводить в поля "хост" и "порт",
соответственно, настройки "Явно указать адрес и порт для подключения".

(Информацию про `jabber.ru` нечаянно сболтнул [**teo**](Участник_Teo.md).)

**Дополнительная информация про HTTP-poll:**

Для того, чтобы подключиться к серверу по HTTP-poll, нужно знать URL для
отправки HTTP-запросов. Есть два источника подобной информации:

*  На веб-сайте сервера опубликованы настройки — просто впишите их себе.
*  В идеале, сервер должен иметь специальную TXT-запись в DNS, содержащую
   информацию о HTTP-poll. Начиная с версии 0.9.9, Ткаббер способен сам
   выполнить соответствующий запрос, так что поле "URL для подключения" в
   настройках соединения по HTTP-poll можно оставить пустым (однако, см. ниже).
   Если у вас более старая версия Ткаббера, вы можете выполнить соответствующий
   запрос вручную и ввести полученный URL в настройки HTTP-poll. Запрос
   выполняется так:
   *  Windows (в командной оболочке):

            nslookup "-set type=TXT" _xmppconnect.jabber.ru

   *  Unix:

            dig +short _xmppconnect.jabber.ru txt

        или

            host -t txt _xmppconnect.jabber.ru

Понятно, что в случае сервера, отличного от `jabber.ru`, доменная часть
"псевдо-имени хоста" `_xmppconnect.jabber.ru` должна быть другой (например,
`_xmppconnect.my.cool.server.org`).

Эта команда должна вернуть строку, содержащую URL для подключения, например,
для `jabber.ru` возвращается
`"_xmpp-client-httppoll=http://httppoll.jabber.ru"`. В настройках,
соответственно, следует указать URL `http://httppoll.jabber.ru`. Естественно,
для другого сервера URL будет другим.

Подробнее про "ручное общение" с DNS-серверами написано
[**здесь**](Ткаббер_и_DNS.md#Ручное_разрешение_записей_DNS).

Примечание:

для работы с TXT-записями в DNS Ткабберу требуется наличие в системе библиотеки
**tcllib** версии 1.7 и выше, а для работы с SRV-записями — 1.8 и выше. Реально,
значение имеет версия пакета **dns** в библиотеке **tcllib**: поддержка SRV-записей
появилась в версии 1.2.1 пакета, поддержка TXT-записей — в версии 1.1.8, но имела
баг, который был исправлен в версии 1.3.1. Узнать версию пакета **dns**, доступную
Ткабберу, можно, выполнив в консоли Ткаббера (или в **tclsh, wish, tckon**) команду

    package versions dns

(За информацию про DNS TXT-записи, о HTTP-poll и за разъяснение ситуации с
версиями пакета **dns** — отдельное спасибо тиклевому хакеру
[Pat Thoyts](http://wiki.tcl.tk/Pat Thoyts).)

## <a id="Серверы_Google_Talk"></a>Серверы Google Talk

Подробно о подключении к серверам Google Talk рассказано [**здесь**](Google_Talk.md).

# <a id="Примечания"></a>Примечания
<sup>1</sup> Алгоритм MD5 был
[взломан](http://www.technewsworld.com/perl/board/mboard.pl?board=lnitalkback&thread=895&id=896&display=1)
в 2004 году. Есть [теоретическая возможность](http://www.cryptography.com/cnews/hash.html)
фальсификации документов, основанная на этом хаке: существуют так называемые коллизии,
когда двум разным документам соответствует один и тот же хэш. Кроме того, наличие в интернете
[ресурсов](http://ru.wikipedia.org/wiki/MD5#.D0.A1.D1.81.D1.8B.D0.BB.D0.BA.D0.B8),
посвящённых подбору пароля MD5 или SHA1 с помощью словаря (полу-брутфорс),
заставляет крепко подумать на тему выбора более надёжного алгоритма (при
желании можно нагуглить уже готовые генераторы коллизий).

SHA-1 тоже ["готов"...](http://en.epochtimes.com/news/7-1-11/50336.html)

![(!)](../images/Hammer.png) **Сделать:** порыть...



>





|
<
<
<






|
|
|
|
|
|
|
|
|

|
|



|
<

|
<
<
<

|
<
|
<
<
<
|
|
<
<
<
<
<
<
<
<
<

|

|
<


|

|
<
<
<

|
<
<
<
<
<

|
<
<
<

|

|
<
|
<
|
<


|
<
<

|
<
<



|
<
<
<

|
<
|
<
<
<
<
|
<
<
<
<
<
<
<

|
<

|

|
<
<
<

|





|
<
<
<



|
<
<

|
<

|
<
<
<
<
<
<
<

|

|
<
|
<
|
<

|
<



|

|



|
|
>
|

|

|
<
<
<

|
<

|
<
<
<
<
<
<
<
<
<
<
<
|
|
<
<
<
<
<

|
<
<

|
|
<
|
|
<
<

|
<
<
<

|
<



|



|



|


|
<
<



|
<

|
<
<
<
|
<
|
<
<
<
<

|
<
<

|
<
|
<

|
<

|

|

|
<
<
<
<
<
<
|
|
|
<
|
<
|
|
|
<
|
<
|
<
|

|
<
<

|
<
<
<
<

|
<

|
|
<
<
<
<
<
<
<


|
<
<



|


<
|
<
<
<
<
<
<
<

|

|
>
>
1
2
3
4
5
6
7
8



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

31
32



33
34

35



36
37









38
39
40
41

42
43
44
45
46



47
48





49
50



51
52
53
54

55

56

57
58
59


60
61


62
63
64
65



66
67

68




69







70
71

72
73
74
75



76
77
78
79
80
81
82
83



84
85
86
87


88
89

90
91







92
93
94
95

96

97

98
99

100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116



117
118

119
120











121
122





123
124


125
126
127

128
129


130
131



132
133

134
135
136
137
138
139
140
141
142
143
144
145
146
147
148


149
150
151
152

153
154



155

156




157
158


159
160

161

162
163

164
165
166
167
168
169






170
171
172

173

174
175
176

177

178

179
180
181


182
183




184
185

186
187
188







189
190
191


192
193
194
195
196
197

198







199
200
201
202
203
204
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Между_офлайном_и_онлайном/index.html)


# Между офлайном и онлайном

Материал из Tkabber Wiki

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




## <a id="toc"></a>Содержание

* [1 Для самых маленьких](#Для_самых_маленьких)
* [2 Ветхий и Новый заветы XMPP](#Ветхий_и_Новый_заветы_XMPP)
* [3 Канал связи клиент-сервер в Jabber/XMPP](#Канал_связи_клиент-сервер_в_Jabber_XMPP)
 * [3.1 Концепции](#Концепции)
 * [3.2 Куда и как подключаться?](#Куда_и_как_подключаться)
 * [3.3 Защита потока](#Защита_потока)
  * [3.3.1 SSL/TLS](#SSL_TLS)
  * [3.3.2 Сертификаты SSL/TLS](#Сертификаты_SSL_TLS)
 * [3.4 Аутентификация пользователя](#Аутентификация_пользователя)
 * [3.5 Реализация в XMPP](#Реализация_в_XMPP)
 * [3.6 Реализация в Jabber](#Реализация_в_Jabber)
 * [3.7 Поддержка в Ткаббере](#Поддержка_в_Ткаббере)
* [4 Подключение к XMPP-серверу: практика](#Подключение_к_XMPP-серверу_практика)
 * [4.1 "Стандартный" XMPP сервер](#Стандартный_XMPP_сервер)
 * [4.2 Серверы Google Talk](#Серверы_Google_Talk)
* [5 Примечания](#Примечания)

# <a id="Для_самых_маленьких"></a>Для самых маленьких
Здесь приведены "рекомендованные" настройки для _типичного_ случая, под которым мы понимаем соединение с сервером jabber.ru. 


Рассмотрим самый простой случай: вы подключены к интернету напрямую, безо всяких прокси, вместе с Ткаббером установлены все нужные и ненужные пакеты, перечисленные, например, [тут](http://tkabber.jabber.ru/dependencies2). В этом случае на 95% подойдут следующие настройки: 




*  На вкладке "Соединение" окошка логина (которое вызывается по Ctrl-L) ничего отмечать не надо. 

*  На вкладке "Аутентификация" включить две галочки: "Использовать SASL для аутентификации" и "Разрешить механизм SASL X-GOOGLE-TOKEN". Строго говоря, вторая из них нужна для подключения к аккаунту на гугль-талке, но пусть уж будет. 



*  На вкладке "SSL & Сжатие" отметьте "Шифрование (STARTTLS)". 
*  Вот, в общем-то, всё. Должно работать. Если вдруг не работает, попробуйте на вкладке "Шифрование" сменить опцию на "Шифрование (Старый SSL)" или рискните "Открытый несжатый текст". Эту последнюю опцию следует пробовать лишь в самых крайних случаях. Если с ней подключиться удалось, следующий ваш шаг должен быть сделан в направлении настройки защищённого (шифрованного) соединения. Прямым ходом идите к нам в [xmpp:tkabber@conference.jabber.ru конференцию] и просите помощи (дочитав перед этим статью до конца!) И ни в коем случае не злоупотребляйте опцией "Открытый текст". Тоже в качестве крайней меры можно попробовать и первую опцию про открытый текст на вкладке "Аутентификация" — с теми же оговорками. 










![(!)](../images/Hammer.png) **Сделать:** развить 

![(!)](../images/Hammer.png) **Сделать:** вынести в отдельную статью раздел фака "Не могу подключиться ... через прокси" и поставить отсюда ссылку на него 


# <a id="Ветхий_и_Новый_заветы_XMPP"></a>Ветхий и Новый заветы XMPP
Настало время развеять один укоренившийся миф. 

Принято считать, что XMPP ≈ Jabber. В принципе, так и есть: XMPP обратно совместим с Jabber, но и довольно серьёзные различия также имеют место. Большая, если не бо́льшая часть этих различий как раз приходится на механизм установки соединения с сервером. 




Относительная сложность диалога логина в Ткаббере как раз отражает эти различия, причём (возможно, к неудовольствию новичков) — с сугубо технических позиций. Однако здесь мы попытаемся поставить всё на свои места. С другой стороны, мы покажем, что дёргать настройки приходится, как правило, только при переходе со "старого" сервера на "новый" и наоборот. ![(!)](../images/Hammer.png) **Сделать:** написать понятнее 






[RFC \#3920](http://www.xmpp.org/rfcs/rfc3920.html) назвает "старый Jabber" терминами "pre-XMPP" и "XMPP 0.9"; это, конечно, неофициальные наименования. Мы будем использовать термин "Jabber", ссылаясь на устаревшие версии протокола, и "XMPP", — ссылаясь на текущую, стандартную, версию. 




Чтобы было понятнее "кто есть кто" и чего ожидать от конкретного сервера: 

*  [jabberd 1.4](http://jabberd.jabberstudio.org/) — Jabber сервер; кое-где всё ещё используется, но больше не развивается. 

*  [jabberd2](http://jabberd.jabberstudio.org/2/) — XMPP-сервер. Используется не очень часто. 

*  [ejabberd](http://ejabberd.jabber.ru) — XMPP-сервер. Используется очень широко; в частности, jabber.org и jabber.ru работают на нём. 


# <a id="Канал_связи_клиент-сервер_в_Jabber_XMPP"></a>Канал связи клиент-сервер в Jabber/XMPP
Этот раздел предназначен для тех, кто хочет понять суть происходящего, когда Ткаббер устанавливает соединение с сервером и затем обменивается с ним сообщениями. 



Фактически, всё, здесь рассказанное, изложено в стандарте на протокол XMPP: [RFC \#3920](http://www.xmpp.org/rfcs/rfc3920.html). Здесь же мы попытаемся описать это всё попроще и на языке родных осин. 



## <a id="Концепции"></a>Концепции

Передача информации — смысл и цель соединения между XMPP-клиентом и XMPP-сервером. Это соединение представлено двумя XML-потоками: от к клиента к серверу и от сервера к клиенту. Однако, прежде чем такая передача станет возможной, нужно решить три проблемы: 




*  Клиент должен выяснить, с каким физическим компьютером в сети и каким способом он должен установить соединение. 

*  Сервер должен знать, что клиент — именно тот, за кого он себя выдаёт. Проще говоря, если с сервером хочет работать пользователь Вася, он должен подтвердить, что он именно Вася, а не Петя или Маша. Этот процесс называется _аутентификацией потока_ ("stream authentication"). Обычно таким подтверждением является знание васиного пароля на сервере. 




*  Если не приняты какие либо специальные меры, информация в XMPP передаётся в открытом виде, то есть её можно "подслушивать" (англ. "to eavesdrop"), получая, к примеру, пароли к каким-либо ресурсам, которые наивный пользователь сообщил в чате другому пользователю. Также ни у одной из сторон TCP-канала связи нет гарантий того, что "та сторона" всё ещё "та": известно несколько атак на TCP/IP-соединение, позволяющих нарушить его целостность. Это называется влиянием на канал (англ. "tampering"). Специальные меры, решающие эти проблемы называются _защитой потока_ (англ. "stream security"). 








Вместо термина "поток" мы также будем часто использовать термин "канал". Сути это не меняет. 


XMPP чётко определяет стандартные способы защиты канала и аутентификации. 

Кроме того, перед тем, как подключившийся клиент сможет начать обмен данными с сервером, должна произойти так называемая "привязка ресурса" ("resource binding") к созданному каналу — сервер должен закрепить за созданным каналом определённый "ресурс" клиента. 




![(!)](../images/Hammer.png) **Сделать:** расписать про ресурсы 

## <a id="Куда_и_как_подключаться"></a>Куда и как подключаться?

## <a id="Защита_потока"></a>Защита потока

Традиционно как в Jabber-, так и XMPP-серверах процедура защиты канала, если таковая производится, выполняется раньше, чем аутентификация. Это разумно, так как в случае успешного завершения процедуры установления защиты потока, протокол аутентификации пользователя будет надёжно защищён от атак. 




### <a id="SSL_TLS"></a>SSL/TLS

Существует достаточно много протоколов для защиты потока связи в IP-сетях, однако наибольшее распространение получил протокол [SSL](http://ru.wikipedia.org/wiki/SSL) (Secure Sockets Layer). 



Именно SSL используется как в Jabber, так и в XMPP для защиты канала. Однако, используется несколько по-разному (об этом — ниже). 


Также путаницу вносит то, что в SSL, первоначально разработанный Netscape, был стандартизован IETF; при этом IETF переименовала протокол в [TLS](http://ru.wikipedia.org/wiki/TLS) (Transport Layer Security). TLS основан на "версии 3" протокола SSL (обычно она именуется "SSLv3") и отличается от последнего довольно слабо, из-за чего обычно термины "SSL" и "TLS" используются вместо друг друга. Это совершенно неверно с формальной точки зрения, и немного неверно — с технической, однако удобно для пользователя: можете считать, что это один и тот же протокол. 








SSL реализует: 

*  _Целостность передаваемых данных_ — гарантируется, что передаваемые данные не могут быть незаметно изменены. 

*  _Конфиденциальнось передаваемых данных_ — данные могут шифроваться различными (в том числе весьма криптостойкими, например, AES) алгоритмами. 

*  Взаимное удостоверение сторон, создающих канал связи, в том, что они именно те, за кого себя выдают. 


Ключевым моментом в реализации этих возможностей является использование _сертификатов_. 


### <a id="Сертификаты_SSL_TLS"></a>Сертификаты SSL/TLS

SSL использует [сертификаты X.509](http://www.apps.ietf.org/rfc/rfc3280.html). 

![(!)](../images/Hammer.png) **Сделать:** развить тему 

## <a id="Аутентификация_пользователя"></a>Аутентификация пользователя

\<hiddenman> какая-то китайка уже SHA-1
 вслед за MD5 и прочим "поломала". 

\<ilyak> hiddenman: И теперь сидит, как дура, без SHA-1 

[Цитата с башорга](http://bash.org.ru/quote.php?num=93945) 

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




Технически клиент может доказать серверу, что знает правильный пароль, несколькими способами. 


Самый простой — просто передать пароль, введённый пользователем, серверу "как есть", то есть в открытом виде. Это самый плохой способ с точки зрения защиты данных: если трафик между клиентом и сервером может прослушать третье лицо (это, к примеру, общий случай на сегменте сети Ethernet, повсеместно применяемой в офисах), оно получит готовые данные для использования учётной записи клиента (его "аккаунта") по своему усмотрению. Такой вид передачи данных (без защиты) называется "открытым" ("plain text"). Резюмируя простыми словами, такой пароль обязательно перехватит даже самый ленивый хакер — просто чтоб неповадно было. 












Чуть более защищённый способ — закодировать пароль при передаче. Такой способ, к примеру, используется в ходе "простой" ("basic") аутентификации на HTTP-прокси серверах. Однако такой способ защищает пароль только от глаз смотрящего на распечатку сетевого трафика. Так как человек, желающий заполучить пароль, скорее всего знает, _где именно_ он его ищет, он также знает, какой способ используется для шифровки и, соответственно, не будет иметь трудностей с расшифровкой. Таким образом, уровень защиты пароля в этом случае ненамного выше, чем у открытого текста, ибо спасает лишь от глупого или очень зелёного хакера. 






Значительно более эффективны алгоритмы аутентификации, основанные на механизме "вызов-ответ" ("challenge-response"), позволяющие обойтись без передачи пароля между клиентом и сервером. Их идея в следующем: 



*  Сервер посылает клиенту некоторые _случайные_ данные. 
*  Клиент добавляет к ним свой пароль и считает на получившемся массиве данных _криптографический хэш_. 

*  Клиент посылает полученный хэш серверу. 
*  Сервер, зная пароль клиента, сам считает такой же хэш и сравнивает хэш клиента с результатом своих вычислений. Если они совпадают, клиент знает пароль. 



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




Чаще всего для вычисления хэша применяют [алгоритм MD5](ftp://ftp.umbc.edu/pub/unix/rfc/rfc1321.txt.gz) (см. также [материал в Википедии](http://ru.wikipedia.org/wiki/MD5))<sup>1</sup>. 


## <a id="Реализация_в_XMPP"></a>Реализация в XMPP

![(!)](../images/Hammer.png) **Сделать:** написать 

## <a id="Реализация_в_Jabber"></a>Реализация в Jabber

![(!)](../images/Hammer.png) **Сделать:** написать 

## <a id="Поддержка_в_Ткаббере"></a>Поддержка в Ткаббере

![(!)](../images/Hammer.png) **Сделать:** написать 

# <a id="Подключение_к_XMPP-серверу_практика"></a>Подключение к XMPP-серверу: практика
Здесь подробно рассказано, что предпринять для подключения к XMPP-серверу в особо тяжёлых случаях (к примеру, параноидально настроенный прокси-сервер). Акцент сделан на подключение к `jabber.ru`. 



## <a id="Стандартный_XMPP_сервер"></a>"Стандартный" XMPP сервер

Итак, что можно сделать, если соединение с Вашим сервером через прокси не проходит: 


*  Попробуйте присоединиться на каждый из стандартных портов; возможно, какой-то из них будет работать (имейте в виду, что при выборе 5222 следует включать опцию "Шифрование (STARTTLS)", а при выборе 5223 — "Шифрование (старый SSL)". 



*  Проверьте, принимает ли ваш Jabber-сервер соединения на порт 443 (следует выбрать "старый SSL" в настройках). 

*  Если ничего не помогло, попробуйте использовать механизм HTTP-poll, если ваш сервер его поддерживает. Протокол HTTP-poll позволяет реализовать связь с сервером путём посылки серверу HTTP-запросов (стандартно — на порт 5280), что, в принципе, должно сделать возможной работу через любой прокси-сервер, кроме совсем уж параноидально настроенных. 





Пользователи сервера [jabber.ru](http://jabber.ru) имеют несколько дополнительных опций благодаря тому, что вокруг этого сервера построена дополнительная "обвязка": 



*  `ssl.jabber.ru` поддерживает соединения с шифрованием "старый SSL" на порт 443; 

*  `allports.jabber.ru` поддерживает соединения на _любой_ порт с поддержкой протокола STARTTLS. 


Эти имена хостов и порты следует вводить в поля "хост" и "порт", соответственно, настройки "Явно указать адрес и порт для подключения". 


(Информацию про `jabber.ru` нечаянно сболтнул [teo](Участник_Teo.md).) 

**Дополнительная информация про HTTP-poll:** 

Для того, чтобы подключиться к серверу по HTTP-poll, нужно знать URL для отправки HTTP-запросов. Есть два источника подобной информации: 







*  На веб-сайте сервера опубликованы настройки — просто впишите их себе. 
*  В идеале, сервер должен иметь специальную TXT-запись в DNS, содержащую информацию о HTTP-poll. Начиная с версии 0.9.9, Ткаббер способен сам выполнить соответствующий запрос, так что поле "URL для подключения" в настройках соединения по HTTP-poll можно оставить пустым (однако, см. ниже). Если у вас более старая версия Ткаббера, вы можете выполнить соответствующий запрос вручную и ввести полученный URL в настройки HTTP-poll. Запрос выполняется так: 

 *  Windows (в командной оболочке): 

    nslookup "-set type=TXT" _xmppconnect.jabber.ru
 
 *  Unix: 

    dig +short _xmppconnect.jabber.ru txt

 или 

    host -t txt _xmppconnect.jabber.ru

Понятно, что в случае сервера, отличного от `jabber.ru`, доменная часть "псевдо-имени хоста" `_xmppconnect.jabber.ru` должна быть другой (например, `_xmppconnect.my.cool.server.org`). 



Эта команда должна вернуть строку, содержащую URL для подключения, например, для `jabber.ru` возвращается  `"_xmpp-client-httppoll=http://httppoll.jabber.ru"`. В настройках, соответственно, следует указать URL `http://httppoll.jabber.ru`. Естественно, для другого сервера URL будет другим. 





Подробнее про "ручное общение" с DNS-серверами написано [здесь](Ткаббер_и_DNS.md#Ручное_разрешение_записей_DNS). 


Примечание: 
**tcllib****dns****tcllib****dns****tclsh, wish, tckon**







    package versions dns

(За информацию про DNS TXT-записи, о HTTP-poll и за разъяснение ситуации с версиями пакета **dns** — отдельное спасибо тиклевому хакеру [Pat Thoyts](http://wiki.tcl.tk/Pat Thoyts).) 



## <a id="Серверы_Google_Talk"></a>Серверы Google Talk

Подробно о подключении к серверам Google Talk рассказано [здесь](Google_Talk.md). 

# <a id="Примечания"></a>Примечания

<sup>1</sup> Алгоритм MD5 был [взломан](http://www.technewsworld.com/perl/board/mboard.pl?board=lnitalkback&thread=895&id=896&display=1) в 2004 году. Есть [теоретическая возможность](http://www.cryptography.com/cnews/hash.html) фальсификации документов, основанная на этом хаке: существуют так называемые коллизии, когда двум разным документам соответствует один и тот же хэш. Кроме того, наличие в интернете [ресурсов](http://ru.wikipedia.org/wiki/MD5#.D0.A1.D1.81.D1.8B.D0.BB.D0.BA.D0.B8), посвящённых подбору пароля MD5 или SHA1 с помощью словаря (полу-брутфорс), заставляет крепко подумать на тему выбора более надёжного алгоритма (при желании можно нагуглить уже готовые генераторы коллизий). 








SHA-1 тоже ["готов"...](http://en.epochtimes.com/news/7-1-11/50336.html) 

![(!)](../images/Hammer.png) **Сделать:** порыть... 


Changes to wiki/ru/Настроения.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18














































19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83

84

85




























86
87
88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129
130
131
132







133

134

135

136

137

138

139

140

141
142
143
144
145
146
147
148
149














150
151
152
153
154
155
156
157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569

570

571

572

573

574

575

576

577

578

579

580

581





582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599

600

601

602

603

604

605

606

607

608

609

610

611

612

613

614

615

616

617

618

619

620

621

622

623

624

625

626

627

628

629

630

631

632

633

634

635

636

637

638

639

640

641

642

643

644

645
646
647
648
649
650
651
652
653
654
655
656


[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Настроения/index.html)


# Настроения

Материал из Tkabber Wiki.

Исходные термины взяты из [XEP-0107](http://www.xmpp.org/extensions/xep-0107.html#moods).

## <a id="toc"></a>Содержание

* [1 Вариант перевода bigote](#Вариант_перевода_bigote)
* [2 "Unisex" от kostix](#Unisex_от_kostix)
* [3 "Что чувствую" от Gebb](#Что_чувствую_от_Gebb)
* [4 Чат с носителями языка (АКА просветление)](#Чат_с_носителями_языка_АКА_просветление)
* [5 Претендент на окончательный вариант (основан на "Unisex")](#Претендент_на_окончательный_вариант_основан_на_Unisex)
* [6 Согласование с "User Activity" (XEP-0108)](#Согласование_с_User_Activity_XEP-0108)

# <a id="Вариант_перевода_bigote"></a>Вариант перевода [bigote](Участник_Bigote.md)















































Оригинал | Перевод
---|---
afraid | испуганный
amazed | изумлённый
angry | сердитый
annoyed | раздражённый
anxious | обеспокоенный
aroused | возбуждённый
ashamed | пристыжённый
bored | скучающий
brave | храбрый
calm | спокойный
cold | холодный
confused | сбитый с толку
contented | довольный
cranky | недовольный
curious | любопытный
depressed | подавленный
disappointed | разочарованный
disgusted | чувствует отвращение
distracted | растерянный
embarrassed | смущённый
excited | взволнованный
flirtatious | кокетливый
frustrated | расстроенный

grumpy | сварливый

guilty | виноватый

happy | счастливый

hot | пылкий

humbled | скромный

humiliated | униженный

hungry | голодный

hurt | раненый

impressed | впечатлённый

in\_awe | благоговеющий

in\_love | влюблённый

indignant | возмущённый

interested | заинтересованный

intoxicated | одурманенный

invincible | неукротимый

jealous | ревнивый

lonely | одинокий

mean | подлый

moody | унылый

nervous | нервный

neutral | безразличный

offended | обиженный

playful | игривый
proud | гордый
relieved | успокоенный
remorseful | сожалеющий
restless | неустанный
sad | печальный
sarcastic | язвительный
serious | серьёзный
shocked | потрясённый
shy | робкий
sick | больной
sleepy | сонный
stressed | напряжённый
surprised | удивлённый
thirsty | хочет пить
worried | обеспокоенный


# <a id="Unisex_от_kostix"></a>"Unisex" от [kostix](Участник_Kostix.md)






























Оригинал | Перевод
---|---
afraid | напуган(а)

amazed | изумлен(а)

angry | сержусь

annoyed | в раздражении

anxious | беспокоюсь

aroused | в возбуждении

ashamed | стыжусь

bored | скучаю

brave | всё нипочём

calm | в спокойствии

cold | мне холодно

confused | сбит(а) с толку

contented | доволен/довольна

cranky | недоволен/недовольна

curious | любопытствую

depressed | подавлен(а)

disappointed | разочарован(а)

disgusted | чувствую отвращение

distracted | в растерянности

embarrassed | в смущении

excited | волнуюсь

flirtatious | кокетничаю

frustrated | расстроен(а)

grumpy | сварлив(а)

guilty | чувствую вину

happy | счастлив(а)

hot | пылаю

humbled | скромничаю

humiliated | унижен(а)

hungry | хочу есть

hurt | ранен(а)

impressed | под впечатлением

in\_awe | благоговею

in\_love | влюблён/влюблена

indignant | в возмущении

interested | заинтересован(а)

intoxicated | одурманен(а)

invincible | неукротим(а)

jealous | ревную

lonely | одинок(а)

mean | готов(а) на пакость

moody | в унынии
nervous | нервничаю
neutral | в безразличии
offended | обижен(а)







playful | игрив(а)

proud | горжусь

relieved | успокоенный(ая)

remorseful | сожалею

restless | не знаю усталости

sad | в печали

sarcastic | хочется язвить

serious | серьёзен/серьёзна

shocked | потрясён/потрясена
shy | стесняюсь
sick | болею
sleepy | хочу спать
stressed | в напряжении
surprised | удивляюсь
thirsty | хочу пить
worried | беспокоюсь















# <a id="Что_чувствую_от_Gebb"></a>"Что чувствую" от [Gebb](Участник_Gebb.md)
Предполагается, что настроения в программе будут отображаться так:

что чувствую: _настроение-в-винительном-падеже_

Оригинал | Перевод
---|---
afraid | испуг

amazed | изумление

angry | гнев

annoyed | раздражение

anxious | тревогу

aroused | возбуждение

ashamed | стыд

bored | скуку

brave | храбрость

calm | спокойствие

cold | хладнокровие (вариант: хладнокровный настрой)

confused | замешательство

contented | удовлетворённость

cranky | вспыльчивость (вариант: вспыльчивый настрой)

curious | любопытство

depressed | подавленность

disappointed | разочарование

disgusted | отвращение

distracted | растерянность

embarrassed | смущение

excited | волнение

flirtatious | кокетливый настрой (варианты: хочу флиртовать, приступ кокетства)

frustrated | расстройство

grumpy | сварливость (вариант: сварливый настрой)

guilty | вину

happy | счастье

hot | разгорячённость

humbled | поверженность

humiliated | унижение

hungry | голод

hurt | боль

impressed | впечатление (вариант: я впечатлён)

in\_awe | благоговение

in\_love | любовь

indignant | возмущение

interested | интерес

intoxicated | опьянение

invincible | непобедимость

jealous | ревность

lonely | одиночество

mean | недоброжелательность

moody | уныние

nervous | нервозность

neutral | ничего особенного

offended | обиду

playful | игривость (вариант: игривый настрой)

proud | гордость

relieved | облегчение

remorseful | раскаяние

restless | неугомонность

sad | печаль

sarcastic | язвительность (вариант: язвительный настрой)

serious | серьёзность (вариант: серьёзный настрой)

shocked | потрясение

shy | стеснение

sick | болезнь (вариант: я болен)

sleepy | сонливость

stressed | напряжение

surprised | удивление

thirsty | жажду

worried | обеспокоенность

# <a id="Чат_с_носителями_языка_АКА_просветление"></a>Чат с носителями языка (АКА просветление)
[00:06]\<kostix> Hi! mind if I ask a question regarding English language?

[00:06]\<hypnotoad> Fire away

[00:07]\<jim> away: YOU'RE FIRED!

[00:07]\<kbk> Don't ask to ask, just ask.

[00:08]\<kostix> We have just implemented Jabber extention called "User mood"
in Tkabber
([http://www.xmpp.org/extensions/xep-0107.html](http://www.xmpp.org/extensions/xep-0107.html))
but when translating that "moods" into russian we have problems. Basically how
\*in this context\* the mood "mean" should be translated?

[00:08]\<kostix> Webster gives a horrible lot of meanings

[00:08]\<kostix> which even contradict one another

[00:08]\<patthoyts> Its emotional state.

[00:08]\<hypnotoad> it's a state of sexual arousal

[00:08]\<patthoyts> ie: is the user angry, happy, etc

[00:09]\<patthoyts> (waste of time IMO)

[00:09]\<kostix> patthoyts: yeah, so what's with mean?

[00:09]\<kbk> "Mean" - petty, nasty, angry at a low level.

[00:09]\<patthoyts> but I guess you have to keep the kids happy.

[00:09]\<jim> mood is related to mode (like an emacs document mode, or the vi
mode of typing versus commands)

[00:09]\<kostix> patthoyts: are you talking about that extension? ;)

[00:09]\<hypnotoad> Wait, what emotion?

[00:09]\<hypnotoad> OHHH MEAN

[00:09]\<hypnotoad> Mean is "vindictive"

[00:10]\<jim> mode is also related to musical sound/"color"

[00:10]\<kostix> patthoyts: I've done it to test PEP (personal eventing) thing
in Tkabber and fixed some misc problems in it. so it's not in vain ;)

[00:10]\<patthoyts> If you are pulling the wings of a fly you are being mean.

[00:10]\<hypnotoad> It can be playful, but it's always taunting

[00:10]\<jim> that depends on the fly :P

[00:11]\<patthoyts> My yougest is always complaining that her sister is being
mean. Normally when the little one cant get onto the computer.

[00:11]\<hypnotoad> "That was a mean spirited trick"

[00:11]\<kbk> offensive. selfish. malicious. small-minded. ignoble.

[00:12]\<kostix> so it's basicaly "to contrive something evil in one's mind"
(pardon my english), right?

[00:12]\<patthoyts> yeah. sounds good.

[00:12]\<hypnotoad> "YOU MEANIE!" (Said when someone says something
deliberately hurtful)

[00:12]\<patthoyts> grumpy with a dash of vindictive.

[00:12]\<hypnotoad> It's more "evil with intent"

[00:12]\<kostix> damn, I didn't even know that word - vindictive ;)

[00:12]\<bschwarz> basically, how people are on some other channels ;)

[00:12]\<hypnotoad> You can't think mean, just act mean

[00:13]\* Emiliano feeling mean

[00:13]\<kbk> "Mean" suggests pettiness and small-mindedness.  It's an insult
of a small child; it doesn't sink to the level of "evil."

[00:13]\<kostix> hm, interesting insight...

[00:13]\<jim> well the contriving is not sufficient probably, but you're on the
right track... that is only to be mean in one's mind... to -actually- be mean,
you have to do something mean to another (I would think)... that is, you have
to be perceived as being mean by the party you're being mean to

[00:14]\<kostix> hm, even more interesting...

[00:14]\<hypnotoad> Telling a joke that embarrases someone is condidered "Mean"

[00:14]\<miguel> you guys still talking about me?

[00:14]\<hypnotoad> Sorry God

[00:14]\<jim> but that's exactly as you're using it in the application...
you're giving people the ability to be perceived as being in a mean mood

[00:15]\<jim> hypnotoad: but that also depends on intent... if it was intended
to embarrass, that would qualify as mean

[00:15]\<miguel> albert said I am raffiniert, not mean

[00:16]\<hypnotoad> Jim: I see, if you advertise that you are "mean" than
people should not be surprised by hurtful things

[00:16]\<jim> hypnotoad: that too :)

[00:16]\<kostix> hypnotoad: that's almost perfect explanation to me

[00:16]\<kbk> "mean mood" - probably something like "irritable," "irascible," "testy" is intended.

[00:16]\<kostix> hypnotoad said "use that explanation"

[00:17]\<jim> perhaps people who are only just grumpy might advertise
themselves as being mean so as to be left alone

[00:17]\* hypnotoad Bzzzzzzzz

[00:17]\* kostix raises and heads to the window to jump into...

[00:17]\<kbk> "petulant"

[00:17]\<hypnotoad> "petty"

[00:17]\<kostix> (so many new words...)

[00:18]\<jim> "petrudinous"

[00:18]\<hypnotoad> English is great for that.

[00:18]\<jim> wait, not that one

[00:18]\<kbk> Not being Russian speakers, we're throwing out English
synonymies, in hopes that something will resonate.

[00:19]\<hypnotoad> Pipes resonate

[00:19]\<hypnotoad> As to wine glasses...

[00:19]\* steveo thought he was loggin in to the tclers chat, not synonyms
anonymous ... \<:-)

[00:19]\<kbk> Spiteful.   "Mean" can also suggest "niggardly."

[00:20]\<kostix> kbk: that's what I intended to ignite ;)

[00:20]\<hypnotoad> synonomous anonymous?

[00:20]\<kbk> seasoned with a little bit of nutmeg and synonym.

[00:20]\<jim> anomalous anonymous?

[00:21]\<hypnotoad> anonymous anonymous

[00:21]\<hypnotoad> "Hi my name is (state you name), and I am nobody"

[00:21]\* steveo wonders just how badly we are confusing kostix

[00:22]\<hypnotoad> Not badly enough

[00:23]\<steveo> now, \*that's" mean ;)

[00:23]\<kbk> All this punning is being mean to a non-native speaker.

[00:23]\* kbk xed

[00:23]\<kostix> sorry, I have another words at hand in the same context, they
are: cold (is it really about feeling cold or what?), cranky and thirsty (is
that really about thirst or what?)

[00:23]\<hypnotoad> But I didn't mean to be mean!

[00:23]\<kostix> actually, that person who invented the set of moods is... strange

[00:24]\<hypnotoad> Cold: (references to reptiles) Cold blooded, not caring
about the feelings of others

[00:24]\<kbk> cranky - irascible, touchy, swift to anger (often because of
tiredness or illness)

[00:24]\<hypnotoad> thirsty is just plain "needs something to drink"

[00:25]\<kostix> ok, seems like we got cranky wrong, thanks

[00:25]\<hat0> thirsty is "khochit' pit'"

[00:25]\<hat0> that's all

[00:25]\<kbk> A perfect example of "cranky" is the behaviour of any toddler in
need of sleep.

[00:25]\<hypnotoad> Cranky is also like an old car engine.

[00:26]\<kostix> hat0: one person suggested it's about "mentally drained out"
or so... that's why I asked ;)

[00:26]\<hypnotoad> (where we get the word)

[00:26]\<kostix> now what's about "cold"?

[00:26]\<kbk> hypnotoad - Nonsense - the word was in use in the 1780s.

[00:26]\<kostix> (notice that the set of moods also has "hot")

[00:27]\<hypnotoad> Hot is "excited"

[00:27]\<kbk> cranky - ill-tempered, grouchy, cross.

[00:27]\* hypnotoad Learn someting new every day, Thanks Kevin

[00:27]\<hypnotoad> "Hot under the collar" is excited in an angry way

[00:28]\<hypnotoad> "Hot and bothered" is sexually aroused (but oddly only with
a female)

[00:28]\* Emiliano 's doughter getting "cranky"

[00:28]\<kbk> toad - Although a guy can say that he's hot for a lady...

[00:28]\<kostix> hypnotoad: what if we have "excited" in the \*same\* set of moods? ;)

[00:28]\<hypnotoad> True, and a lady can "look hot"

[00:29]\<hat0> also, if you thirst for something, that is not the same as to be
thirsty..  it is a strong desire for it (like "on zhazhdal mesti")

[00:29]\<kbk> kostix - In that case, 'hot' probably has a specifically sexual
connotation.  Your list does indeed sound a lottle strange.

[00:29]\<hypnotoad> Well just about every mood involves and excitement of one
form or another ;)

[00:31]\<hat0> cold, you could think "unfeeling" - this dictionary i have
suggests "kholodniy' chelovek" (which makes me laugh)

[00:31]\<Cameron\_> Do Russians say that?!

[00:31]\<Cameron\_> 'Twould be new to me.

[00:34]\<kostix> hat0: thanks. your knowledge of Russian keeps impress me ;)

[00:34]\<hypnotoad> hat0: What does that "kholodniy' chelovek" loosely
translate back to?

[00:34]\<hat0> hypnotoad:  cold person

[00:34]\<kostix> yes

[00:34]\<hypnotoad> Cold as in "was out in the siberian weather"

[00:35]\<hypnotoad> or cold as in "psychopathic killer"

[00:35]\<kostix> yes, cold as if put in refrigerator

[00:35]\<Cameron\_> kholodniy is from hot-cold.

[00:35]\<hypnotoad> Ah

[00:35]\<kbk> "Many are cold, but few are frozen."

[00:35]\<Cameron\_> That's it!  That's the one!

[00:36]\<Cameron\_> My pun acceptor overflowed its daily limit.

[00:36]\<kostix> :)

[00:37]\<kbk> This is nearly the only milieu that I've been in where
multilingual puns are commonplace.

[00:38]\<hypnotoad> There is a bit of a legend that in the early days of the
cold war the East and West devised an automatic translator that would operate
by teletype. After a few million dollars, they took it for a test spin to see
how well it worked, by entering a phrase in english, translating to russian,
and then back to english.

On phrase was "The spirit is willing, but the flesh is weak" The result was
"The vokda is watered down and the meat is rancid"

[00:38]\<kbk> No, "the vodka is agreeable."

[00:39]\<kbk> "but the meat has gone soft"

[00:39]\<hypnotoad> Kevin with the assist... Thank you thank you

[00:39]\<kbk> I liked "out of sight, out of mind" -> "blind idiot"

[00:39]\<hypnotoad> So wait.. it was real?

[00:39]\<kbk> No, translation software \*still\* isn't that good.

[00:40]\<Cameron\_> Why, that's no multilingual pun--I'm keeping my only tongue
in my own mouth.

[00:42]\<kbk> A true story, though: there was one document (about a French-made
minicomputer) that I got from a translation service that contained gems like
"each forefinger guestbook is divided into two pastures: the word address and
the byte rebate within the word"

[00:42]\<hypnotoad> [http://ray.tomes.biz/b2/index.php/c/2007/04/26/p117](http://ray.tomes.biz/b2/index.php/c/2007/04/26/p117)

[00:43]\<kbk> I had to translate that semimechanically back into French for it
to make any sense.

[00:43]\<hypnotoad> Quality

[00:43]\<kbk> "forefinger guestbook" -> "index register"; "pasture" -> "field";
"rebate" -> "offset"

[00:43]\<kostix> kbk: we have similar difficulties with chinese shit^Wgoods
with Russian-translated labels and texts

[00:45]\<hat0> i bought a chinese razor in tashkent, called the "BIG BUG RAZOR"

[00:45]\<kostix> Tcl NEEDS one :)

[00:45]\<hypnotoad> Well a tartula has a lot of hair you know

[00:46]\<hypnotoad> (Tarantula... not the caribbean island....)

[00:47]\<kbk> The document also contained numerous references to a K7 - I had
to read that aloud in French before the forehead-slapping "cassette" came to
mind.

[00:48]\<kbk> Una tortuga (a tortoise) generally has no hair at all.

---

[18:53]\* kostix coughs... anyone to help me out with English again? :}

[18:57]\<dkf> ask away...

[18:58]\<kostix> re that "user mood" thing from jabber: what's the difference
between "humbled" and "humiliated"? wordnet counts them as synonyms.

[18:59]\<kostix> so we're stuck again with translation

[19:00]\<kbk> kostix - "humbled" has a positive connotation - I'd use it for,
say, a monk contemplating the majesty of the Universe.

[19:00]\<kbk> "humiliated" in modern colloquial usage has a more negative
connotation - I'd use it of an athlete that lost badly in a competition.

# <a id="Претендент_на_окончательный_вариант_основан_на_Unisex"></a>Претендент на окончательный вариант (основан на "Unisex")
Этот вариант сделан с учётом многочисленных пожеланий переводчиков и лингвистов с
[ru\_translate](http://community.livejournal.com/ru_translate/9082757.html) и

[pishu\_pravilno](http://community.livejournal.com/pishu_pravilno/2804037.html),

а также вышепроцитированного чата с тиклерами. [**Автор**](Участник_Bigote.md)

этого варианта склоняется к переводу самого слова "mood" не как "настроение", а

как "состояние", взяв себе в союзники

[этот комментарий](http://community.livejournal.com/pishu_pravilno/2804037.html?thread=48256837#t48256837).

Соответственно, бо́льшая часть терминов будет в среднем роде, согласовываясь со

словом "состояние". Пару слов я решил перевести существительным в родительном

падеже, убрав при этом двоеточие после "состояния". Думаю, это легко

реализовать, поставив в файле перевода не "Состояние:", а просто "Состояние",

сами настроения-состояния писать как ": испуганное", ": всё нипочём", "

удивления". Критика приветствуется. (Кое-какие слова я ещё не доделал, допишу

завтра-послезавтра.)






Оригинал | Перевод
---|---
afraid | Состояние: испуганное
amazed | Состояние: изумлённое
angry | Состояние: рассерженное
annoyed | Состояние: раздражённое
anxious | Состояние: беспокойное
aroused | Состояние: возбуждённое
ashamed | Состояние: пристыжённое
bored | Состояние: скукотища!
brave | Состояние: всё нипочём
calm | Состояние: спокойное
cold | Состояние: равнодушное
confused | Состояние: в замешательстве
contented | Состояние: довольное
cranky | Состояние: недовольное
curious | Состояние: любознательное

depressed | Состояние: подавленное

disappointed | Состояние: разочарованное

disgusted | Состояние: чувствую отвращение

distracted | Состояние: растерянное

embarrassed | Состояние: смущённое

excited | Состояние: взволнованное

flirtatious | Состояние: кокетливое

frustrated | Состояние: расстроенное

grumpy | Состояние: ворчливое

guilty | Состояние: виноватое

happy | Состояние: счастливое

hot | Состояние: пылаю

humbled | Состояние: смиренное

humiliated | Состояние: униженное

hungry | Состояние: хочу есть

hurt | Состояние: уязвлённое

impressed | Состояние: под впечатлением

in\_awe | Состояние: благоговейное

in\_love | Состояние: влюблённое

indignant | Состояние: возмущённое

interested | Состояние: заинтересованное

intoxicated | Состояние: одурманенное

invincible | Состояние: неукротимое

jealous | Состояние: ревнивое

lonely | Состояние: одинокое

mean | Состояние: сволочное

moody | Состояние: унылое

nervous | Состояние: на нервах

neutral | Состояние: безразличное

offended | Состояние: обиженное

playful | Состояние: игривое

proud | Состояние: горделивое

relieved | Состояние: гора с плеч

remorseful | Состояние: раскаиваюсь

restless | Состояние: неугомонное

sad | Состояние: печальное

sarcastic | Состояние: язвительное

serious | Состояние: серьёзное

shocked | Состояние: потрясённое

shy | Состояние: застенчивое

sick | Состояние: болезненное

sleepy | Состояние: сонное

stressed | Состояние: напряжённое

surprised | Состояние: удивлённое

thirsty | Состояние: хочу пить

worried | Состояние: беспокойное

# <a id="Согласование_с_User_Activity_XEP-0108"></a>Согласование с "User Activity" (XEP-0108)
Существует некоторая проблема в согласовании перевода термина "mood" из "User
Mood" и перевода термина "activity" из "User Activity"
([XEP-0108](http://www.xmpp.org/extensions/xep-0108.html)).

[**Gebb**](Участник_Gebb.md) [предложил](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2007/08/26.html#18:04:56):

    <gebb> Насчёт мудов и активити.
    user mood = настроение/состояние, activity = занятие.
    Таково моё предложение.



>





|



|
|
|




|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
>
|
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
<
<
<
>
>
>
>
>
>
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
<
<
<
<
<
<
<
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|

|

|
|
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|


|

|

|

|

|
<
<
<
<

|

|

|

|

|

|

|

|

|

|
<

|

|

|

|

|

|
<

|

|

|

|
<

|

|

|
<

|

|
<

|

|

|

|

|

|

|
<

|

|
<
<
<

|

|

|

|

|
<

|
<

|

|
<

|

|

|

|

|
<

|

|

|

|

|

|

|

|

|
<

|

|

|
<

|

|

|

|

|

|

|

|

|

|

|

|

|
<
<

|

|

|
<

|
<

|

|

|

|

|
<

|

|
<

|

|

|

|

|

|

|

|

|
<

|

|

|

|

|
<

|
<

|
<

|
<

|

|

|

|
<

|

|

|

|

|

|

|

|

|

|

|

|
<

|
<
<
<
<

|
<

|

|

|

|

|

|

|
<

|
<
<
<

|

|
<

|

|
<

|
<

|

|

|

|

|
<
<

|



|

|

|
<

|

|
<

|
<


|
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
>
>
>
>
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|
>
|


|
<
<

|




>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
























67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113















114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231



232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255







256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409




410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429

430
431
432
433
434
435
436
437
438
439
440
441

442
443
444
445
446
447
448
449

450
451
452
453
454
455

456
457
458
459

460
461
462
463
464
465
466
467
468
469
470
471
472
473

474
475
476
477



478
479
480
481
482
483
484
485
486
487

488
489

490
491
492
493

494
495
496
497
498
499
500
501
502
503

504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521

522
523
524
525
526
527

528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553


554
555
556
557
558
559

560
561

562
563
564
565
566
567
568
569
570
571

572
573
574
575

576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593

594
595
596
597
598
599
600
601
602
603

604
605

606
607

608
609

610
611
612
613
614
615
616
617

618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641

642
643




644
645

646
647
648
649
650
651
652
653
654
655
656
657
658
659

660
661



662
663
664
665

666
667
668
669

670
671

672
673
674
675
676
677
678
679
680
681


682
683
684
685
686
687
688
689
690
691

692
693
694
695

696
697

698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
















732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827


828
829
830
831
832
833
834
835
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Настроения/index.html)


# Настроения

Материал из Tkabber Wiki.

Исходные термины взяты из [XEP-0107](http://www.xmpp.org/extensions/xep-0107.html#moods). 

## <a id="toc"></a>Содержание

* [1 Вариант перевода bigote[](Участник_Bigote.md)](#Вариант_перевода_bigoteУчастник_Bigote.md)
* [2 "Unisex" от kostix[](Участник_Kostix.md)](#Unisex_от_kostixУчастник_Kostix.md)
* [3 "Что чувствую" от Gebb[](Участник_Gebb.md)](#Что_чувствую_от_GebbУчастник_Gebb.md)
* [4 Чат с носителями языка (АКА просветление)](#Чат_с_носителями_языка_АКА_просветление)
* [5 Претендент на окончательный вариант (основан на "Unisex")](#Претендент_на_окончательный_вариант_основан_на_Unisex)
* [6 Согласование с "User Activity" (XEP-0108)](#Согласование_с_User_Activity_XEP-0108)

# <a id="Вариант_перевода_bigoteУчастник_Bigote.md"></a>Вариант перевода bigote[](Участник_Bigote.md)
 
 ** Оригинал **** Перевод **
 
   afraid  испуганный 
 
   amazed  изумлённый 
 
   angry  сердитый 
 
   annoyed  раздражённый 
 
   anxious  обеспокоенный 
 
   aroused  возбуждённый 
 
   ashamed  пристыжённый 
 
   bored  скучающий 
 
   brave  храбрый 
 
   calm  спокойный 
 
   cold  холодный 
 
   confused  сбитый с толку 
 
   contented  довольный 
 
   cranky  недовольный 
 
   curious  любопытный 
 
   depressed  подавленный 
 
   disappointed  разочарованный 
 
   disgusted  чувствует отвращение 
 
   distracted  растерянный 
 
   embarrassed  смущённый 
 
   excited  взволнованный 
 
   flirtatious  кокетливый 
 
























   frustrated  расстроенный 
 
   grumpy  сварливый 
 
   guilty  виноватый 
 
   happy  счастливый 
 
   hot  пылкий 
 
   humbled  скромный 
 
   humiliated  униженный 
 
   hungry  голодный 
 
   hurt  раненый 
 
   impressed  впечатлённый 
 
   in\_awe  благоговеющий 
 
   in\_love  влюблённый 
 
   indignant  возмущённый 
 
   interested  заинтересованный 
 
   intoxicated  одурманенный 
 
   invincible  неукротимый 
 
   jealous  ревнивый 
 
   lonely  одинокий 
 
   mean  подлый 
 
   moody  унылый 
 
   nervous  нервный 
 
   neutral  безразличный 
 
   offended  обиженный 
 
   playful  игривый 















 
   proud  гордый 
 
   relieved  успокоенный 
 
   remorseful  сожалеющий 
 
   restless  неустанный 
 
   sad  печальный 
 
   sarcastic  язвительный 
 
   serious  серьёзный 
 
   shocked  потрясённый 
 
   shy  робкий 
 
   sick  больной 
 
   sleepy  сонный 
 
   stressed  напряжённый 
 
   surprised  удивлённый 
 
   thirsty  хочет пить 
 
   worried  обеспокоенный 

# <a id="Unisex_от_kostixУчастник_Kostix.md"></a>"Unisex" от kostix[](Участник_Kostix.md)
 
 ** Оригинал **** Перевод **
 
  afraid  напуган(а) 
 
  amazed  изумлен(а) 
 
  angry  сержусь 
 
  annoyed  в раздражении 
 
  anxious  беспокоюсь 
 
  aroused  в возбуждении 
 
  ashamed  стыжусь 
 
  bored  скучаю 
 
  brave  всё нипочём 
 
  calm  в спокойствии 
 
  cold  мне холодно 
 
  confused  сбит(а) с толку 
 
  contented  доволен/довольна 
 
  cranky  недоволен/недовольна 
 
  curious  любопытствую 
 
  depressed  подавлен(а) 
 
  disappointed  разочарован(а) 
 
  disgusted  чувствую отвращение 
 
  distracted  в растерянности 
 
  embarrassed  в смущении 
 
  excited  волнуюсь 
 
  flirtatious  кокетничаю 
 
  frustrated  расстроен(а) 
 
  grumpy  сварлив(а) 
 
  guilty  чувствую вину 
 
  happy  счастлив(а) 
 
  hot  пылаю 
 
  humbled  скромничаю 
 
  humiliated  унижен(а) 
 
  hungry  хочу есть 
 
  hurt  ранен(а) 
 
  impressed  под впечатлением 
 
  in\_awe  благоговею 
 
  in\_love  влюблён/влюблена 
 
  indignant  в возмущении 
 
  interested  заинтересован(а) 
 
  intoxicated  одурманен(а) 
 
  invincible  неукротим(а) 
 
  jealous  ревную 
 
  lonely  одинок(а) 
 
  mean  готов(а) на пакость 
 
  moody  в унынии 



 
  nervous  нервничаю 
 
  neutral  в безразличии 
 
  offended  обижен(а) 
 
  playful  игрив(а) 
 
  proud  горжусь 
 
  relieved  успокоенный(ая) 
 
  remorseful  сожалею 
 
  restless  не знаю усталости 
 
  sad  в печали 
 
  sarcastic  хочется язвить 
 
  serious  серьёзен/серьёзна 
 
  shocked  потрясён/потрясена 







 
  shy  стесняюсь 
 
  sick  болею 
 
  sleepy  хочу спать 
 
  stressed  в напряжении 
 
  surprised  удивляюсь 
 
  thirsty  хочу пить 
 
  worried  беспокоюсь 

# <a id="Что_чувствую_от_GebbУчастник_Gebb.md"></a>"Что чувствую" от Gebb[](Участник_Gebb.md)
Предполагается, что настроения в программе будут отображаться так: 

что чувствую: _настроение-в-винительном-падеже_ 

 ** Оригинал **** Перевод **
 
 afraid испуг 
 
 amazed изумление 
 
 angry гнев 
 
 annoyed раздражение 
 
 anxious тревогу 
 
 aroused возбуждение 
 
 ashamed стыд 
 
 bored скуку 
 
 brave храбрость 
 
 calm спокойствие 
 
 cold хладнокровие (вариант: хладнокровный настрой) 
 
 confused замешательство 
 
 contented удовлетворённость 
 
 cranky вспыльчивость (вариант: вспыльчивый настрой) 
 
 curious любопытство 
 
 depressed подавленность 
 
 disappointed разочарование 
 
 disgusted отвращение 
 
 distracted растерянность 
 
 embarrassed смущение 
 
 excited волнение 
 
 flirtatious кокетливый настрой (варианты: хочу флиртовать, приступ кокетства) 
 
 frustrated расстройство 
 
 grumpy сварливость (вариант: сварливый настрой) 
 
 guilty вину 
 
 happy счастье 
 
 hot разгорячённость 
 
 humbled поверженность 
 
 humiliated унижение 
 
 hungry голод 
 
 hurt боль 
 
 impressed впечатление (вариант: я впечатлён) 
 
 in\_awe благоговение 
 
 in\_love любовь 
 
 indignant возмущение 
 
 interested интерес 
 
 intoxicated опьянение 
 
 invincible непобедимость 
 
 jealous ревность 
 
 lonely одиночество 
 
 mean недоброжелательность 
 
 moody уныние 
 
 nervous нервозность 
 
 neutral ничего особенного 
 
 offended обиду 
 
 playful игривость (вариант: игривый настрой) 
 
 proud гордость 
 
 relieved облегчение 
 
 remorseful раскаяние 
 
 restless неугомонность 
 
 sad печаль 
 
 sarcastic язвительность (вариант: язвительный настрой) 
 
 serious серьёзность (вариант: серьёзный настрой) 
 
 shocked потрясение 
 
 shy стеснение 
 
 sick болезнь (вариант: я болен) 
 
 sleepy сонливость 
 
 stressed напряжение 
 
 surprised удивление 
 
 thirsty жажду 
 
 worried обеспокоенность 

# <a id="Чат_с_носителями_языка_АКА_просветление"></a>Чат с носителями языка (АКА просветление)
[00:06]\<kostix> Hi! mind if I ask a question regarding English language? 

[00:06]\<hypnotoad> Fire away 

[00:07]\<jim> away: YOU'RE FIRED! 

[00:07]\<kbk> Don't ask to ask, just ask. 

[00:08]\<kostix> We have just implemented Jabber extention called "User mood" in Tkabber ([http://www.xmpp.org/extensions/xep-0107.html](http://www.xmpp.org/extensions/xep-0107.html)) but when translating that "moods" into russian we have problems. Basically how \*in this context\* the mood "mean" should be translated? 





[00:08]\<kostix> Webster gives a horrible lot of meanings 

[00:08]\<kostix> which even contradict one another 

[00:08]\<patthoyts> Its emotional state. 

[00:08]\<hypnotoad> it's a state of sexual arousal 

[00:08]\<patthoyts> ie: is the user angry, happy, etc 

[00:09]\<patthoyts> (waste of time IMO) 

[00:09]\<kostix> patthoyts: yeah, so what's with mean? 

[00:09]\<kbk> "Mean" - petty, nasty, angry at a low level. 

[00:09]\<patthoyts> but I guess you have to keep the kids happy. 

[00:09]\<jim> mood is related to mode (like an emacs document mode, or the vi mode of typing versus commands) 


[00:09]\<kostix> patthoyts: are you talking about that extension? ;) 

[00:09]\<hypnotoad> Wait, what emotion? 

[00:09]\<hypnotoad> OHHH MEAN 

[00:09]\<hypnotoad> Mean is "vindictive" 

[00:10]\<jim> mode is also related to musical sound/"color" 

[00:10]\<kostix> patthoyts: I've done it to test PEP (personal eventing) thing in Tkabber and fixed some misc problems in it. so it's not in vain ;) 


[00:10]\<patthoyts> If you are pulling the wings of a fly you are being mean. 

[00:10]\<hypnotoad> It can be playful, but it's always taunting 

[00:10]\<jim> that depends on the fly :P 

[00:11]\<patthoyts> My yougest is always complaining that her sister is being mean. Normally when the little one cant get onto the computer. 


[00:11]\<hypnotoad> "That was a mean spirited trick" 

[00:11]\<kbk> offensive. selfish. malicious. small-minded. ignoble. 

[00:12]\<kostix> so it's basicaly "to contrive something evil in one's mind" (pardon my english), right? 


[00:12]\<patthoyts> yeah. sounds good. 

[00:12]\<hypnotoad> "YOU MEANIE!" (Said when someone says something deliberately hurtful) 


[00:12]\<patthoyts> grumpy with a dash of vindictive. 

[00:12]\<hypnotoad> It's more "evil with intent" 

[00:12]\<kostix> damn, I didn't even know that word - vindictive ;) 

[00:12]\<bschwarz> basically, how people are on some other channels ;) 

[00:12]\<hypnotoad> You can't think mean, just act mean 

[00:13]\* Emiliano feeling mean 

[00:13]\<kbk> "Mean" suggests pettiness and small-mindedness.  It's an insult of a small child; it doesn't sink to the level of "evil." 


[00:13]\<kostix> hm, interesting insight... 

[00:13]\<jim> well the contriving is not sufficient probably, but you're on the right track... that is only to be mean in one's mind... to -actually- be mean, you have to do something mean to another (I would think)... that is, you have to be perceived as being mean by the party you're being mean to 




[00:14]\<kostix> hm, even more interesting... 

[00:14]\<hypnotoad> Telling a joke that embarrases someone is condidered "Mean" 

[00:14]\<miguel> you guys still talking about me? 

[00:14]\<hypnotoad> Sorry God 

[00:14]\<jim> but that's exactly as you're using it in the application... you're giving people the ability to be perceived as being in a mean mood 


[00:15]\<jim> hypnotoad: but that also depends on intent... if it was intended to embarrass, that would qualify as mean 


[00:15]\<miguel> albert said I am raffiniert, not mean 

[00:16]\<hypnotoad> Jim: I see, if you advertise that you are "mean" than people should not be surprised by hurtful things 


[00:16]\<jim> hypnotoad: that too :) 

[00:16]\<kostix> hypnotoad: that's almost perfect explanation to me 

[00:16]\<kbk> "mean mood" - probably something like "irritable," "irascible," "testy" is intended. 

[00:16]\<kostix> hypnotoad said "use that explanation" 

[00:17]\<jim> perhaps people who are only just grumpy might advertise themselves as being mean so as to be left alone 


[00:17]\* hypnotoad Bzzzzzzzz 

[00:17]\* kostix raises and heads to the window to jump into... 

[00:17]\<kbk> "petulant" 

[00:17]\<hypnotoad> "petty" 

[00:17]\<kostix> (so many new words...) 

[00:18]\<jim> "petrudinous" 

[00:18]\<hypnotoad> English is great for that. 

[00:18]\<jim> wait, not that one 

[00:18]\<kbk> Not being Russian speakers, we're throwing out English synonymies, in hopes that something will resonate. 


[00:19]\<hypnotoad> Pipes resonate 

[00:19]\<hypnotoad> As to wine glasses... 

[00:19]\* steveo thought he was loggin in to the tclers chat, not synonyms anonymous ... \<:-) 


[00:19]\<kbk> Spiteful.   "Mean" can also suggest "niggardly." 

[00:20]\<kostix> kbk: that's what I intended to ignite ;) 

[00:20]\<hypnotoad> synonomous anonymous? 

[00:20]\<kbk> seasoned with a little bit of nutmeg and synonym. 

[00:20]\<jim> anomalous anonymous? 

[00:21]\<hypnotoad> anonymous anonymous 

[00:21]\<hypnotoad> "Hi my name is (state you name), and I am nobody" 

[00:21]\* steveo wonders just how badly we are confusing kostix 

[00:22]\<hypnotoad> Not badly enough 

[00:23]\<steveo> now, \*that's" mean ;) 

[00:23]\<kbk> All this punning is being mean to a non-native speaker. 

[00:23]\* kbk xed 

[00:23]\<kostix> sorry, I have another words at hand in the same context, they are: cold (is it really about feeling cold or what?), cranky and thirsty (is that really about thirst or what?) 



[00:23]\<hypnotoad> But I didn't mean to be mean! 

[00:23]\<kostix> actually, that person who invented the set of moods is... strange 

[00:24]\<hypnotoad> Cold: (references to reptiles) Cold blooded, not caring about the feelings of others 


[00:24]\<kbk> cranky - irascible, touchy, swift to anger (often because of tiredness or illness) 


[00:24]\<hypnotoad> thirsty is just plain "needs something to drink" 

[00:25]\<kostix> ok, seems like we got cranky wrong, thanks 

[00:25]\<hat0> thirsty is "khochit' pit'" 

[00:25]\<hat0> that's all 

[00:25]\<kbk> A perfect example of "cranky" is the behaviour of any toddler in need of sleep. 


[00:25]\<hypnotoad> Cranky is also like an old car engine. 

[00:26]\<kostix> hat0: one person suggested it's about "mentally drained out" or so... that's why I asked ;) 


[00:26]\<hypnotoad> (where we get the word) 

[00:26]\<kostix> now what's about "cold"? 

[00:26]\<kbk> hypnotoad - Nonsense - the word was in use in the 1780s. 

[00:26]\<kostix> (notice that the set of moods also has "hot") 

[00:27]\<hypnotoad> Hot is "excited" 

[00:27]\<kbk> cranky - ill-tempered, grouchy, cross. 

[00:27]\* hypnotoad Learn someting new every day, Thanks Kevin 

[00:27]\<hypnotoad> "Hot under the collar" is excited in an angry way 

[00:28]\<hypnotoad> "Hot and bothered" is sexually aroused (but oddly only with a female) 


[00:28]\* Emiliano 's doughter getting "cranky" 

[00:28]\<kbk> toad - Although a guy can say that he's hot for a lady... 

[00:28]\<kostix> hypnotoad: what if we have "excited" in the \*same\* set of moods? ;) 

[00:28]\<hypnotoad> True, and a lady can "look hot" 

[00:29]\<hat0> also, if you thirst for something, that is not the same as to be thirsty..  it is a strong desire for it (like "on zhazhdal mesti") 


[00:29]\<kbk> kostix - In that case, 'hot' probably has a specifically sexual connotation.  Your list does indeed sound a lottle strange. 


[00:29]\<hypnotoad> Well just about every mood involves and excitement of one form or another ;) 


[00:31]\<hat0> cold, you could think "unfeeling" - this dictionary i have suggests "kholodniy' chelovek" (which makes me laugh) 


[00:31]\<Cameron\_> Do Russians say that?! 

[00:31]\<Cameron\_> 'Twould be new to me. 

[00:34]\<kostix> hat0: thanks. your knowledge of Russian keeps impress me ;) 

[00:34]\<hypnotoad> hat0: What does that "kholodniy' chelovek" loosely translate back to? 


[00:34]\<hat0> hypnotoad:  cold person 

[00:34]\<kostix> yes 

[00:34]\<hypnotoad> Cold as in "was out in the siberian weather" 

[00:35]\<hypnotoad> or cold as in "psychopathic killer" 

[00:35]\<kostix> yes, cold as if put in refrigerator 

[00:35]\<Cameron\_> kholodniy is from hot-cold. 

[00:35]\<hypnotoad> Ah 

[00:35]\<kbk> "Many are cold, but few are frozen." 

[00:35]\<Cameron\_> That's it!  That's the one! 

[00:36]\<Cameron\_> My pun acceptor overflowed its daily limit. 

[00:36]\<kostix> :) 

[00:37]\<kbk> This is nearly the only milieu that I've been in where multilingual puns are commonplace. 


[00:38]\<hypnotoad> There is a bit of a legend that in the early days of the cold war the East and West devised an automatic translator that would operate by teletype. After a few million dollars, they took it for a test spin to see how well it worked, by entering a phrase in english, translating to russian, and then back to english. 





On phrase was "The spirit is willing, but the flesh is weak" The result was "The vokda is watered down and the meat is rancid" 


[00:38]\<kbk> No, "the vodka is agreeable." 

[00:39]\<kbk> "but the meat has gone soft" 

[00:39]\<hypnotoad> Kevin with the assist... Thank you thank you 

[00:39]\<kbk> I liked "out of sight, out of mind" -> "blind idiot" 

[00:39]\<hypnotoad> So wait.. it was real? 

[00:39]\<kbk> No, translation software \*still\* isn't that good. 

[00:40]\<Cameron\_> Why, that's no multilingual pun--I'm keeping my only tongue in my own mouth. 


[00:42]\<kbk> A true story, though: there was one document (about a French-made minicomputer) that I got from a translation service that contained gems like "each forefinger guestbook is divided into two pastures: the word address and the byte rebate within the word" 




[00:42]\<hypnotoad> [http://ray.tomes.biz/b2/index.php/c/2007/04/26/p117](http://ray.tomes.biz/b2/index.php/c/2007/04/26/p117) 

[00:43]\<kbk> I had to translate that semimechanically back into French for it to make any sense. 


[00:43]\<hypnotoad> Quality 

[00:43]\<kbk> "forefinger guestbook" -> "index register"; "pasture" -> "field"; "rebate" -> "offset" 


[00:43]\<kostix> kbk: we have similar difficulties with chinese shit^Wgoods with Russian-translated labels and texts 


[00:45]\<hat0> i bought a chinese razor in tashkent, called the "BIG BUG RAZOR" 

[00:45]\<kostix> Tcl NEEDS one :) 

[00:45]\<hypnotoad> Well a tartula has a lot of hair you know 

[00:46]\<hypnotoad> (Tarantula... not the caribbean island....) 

[00:47]\<kbk> The document also contained numerous references to a K7 - I had to read that aloud in French before the forehead-slapping "cassette" came to mind. 



[00:48]\<kbk> Una tortuga (a tortoise) generally has no hair at all. 

---

[18:53]\* kostix coughs... anyone to help me out with English again? :} 

[18:57]\<dkf> ask away... 

[18:58]\<kostix> re that "user mood" thing from jabber: what's the difference between "humbled" and "humiliated"? wordnet counts them as synonyms. 


[18:59]\<kostix> so we're stuck again with translation 

[19:00]\<kbk> kostix - "humbled" has a positive connotation - I'd use it for, say, a monk contemplating the majesty of the Universe. 


[19:00]\<kbk> "humiliated" in modern colloquial usage has a more negative connotation - I'd use it of an athlete that lost badly in a competition. 


# <a id="Претендент_на_окончательный_вариант_основан_на_Unisex"></a>Претендент на окончательный вариант (основан на "Unisex")
Этот вариант сделан с учётом многочисленных пожеланий переводчиков и лингвистов с **[ru\_translate](http://community.livejournal.com/ru_translate/9082757.html)** и **[pishu\_pravilno](http://community.livejournal.com/pishu_pravilno/2804037.html)**, а также вышепроцитированного чата с тиклерами. [Автор](Участник_Bigote.md) этого варианта склоняется к переводу самого слова "mood" не как "настроение", а как "состояние", взяв себе в союзники [этот комментарий](http://community.livejournal.com/pishu_pravilno/2804037.html?thread=48256837#t48256837). Соответственно, бо́льшая часть терминов будет в среднем роде, согласовываясь со словом "состояние". Пару слов я решил перевести существительным в родительном падеже, убрав при этом двоеточие после "состояния". Думаю, это легко реализовать, поставив в файле перевода не "Состояние:", а просто "Состояние", сами настроения-состояния писать как ": испуганное", ": всё нипочём", " удивления". Критика приветствуется. (Кое-какие слова я ещё не доделал, допишу завтра-послезавтра.) 

 ** Оригинал **** Перевод **
 
  afraid  Состояние: испуганное 
 
  amazed  Состояние: изумлённое 
 
  angry  Состояние: рассерженное 
 
  annoyed  Состояние: раздражённое 
 
  anxious  Состояние: беспокойное 
 
  aroused  Состояние: возбуждённое 
 
  ashamed  Состояние: пристыжённое 
 
  bored  Состояние: скукотища! 
 
  brave  Состояние: всё нипочём 
 
  calm  Состояние: спокойное 
 
  cold  Состояние: равнодушное 
 
  confused  Состояние: в замешательстве 
 
  contented  Состояние: довольное 
 
  cranky  Состояние: недовольное 
 
















  curious  Состояние: любознательное 
 
  depressed  Состояние: подавленное 
 
  disappointed  Состояние: разочарованное 
 
  disgusted  Состояние: чувствую отвращение 
 
  distracted  Состояние: растерянное 
 
  embarrassed  Состояние: смущённое 
 
  excited  Состояние: взволнованное 
 
  flirtatious  Состояние: кокетливое 
 
  frustrated  Состояние: расстроенное 
 
  grumpy  Состояние: ворчливое 
 
  guilty  Состояние: виноватое 
 
  happy  Состояние: счастливое 
 
  hot  Состояние: пылаю 
 
  humbled  Состояние: смиренное 
 
  humiliated  Состояние: униженное 
 
  hungry  Состояние: хочу есть 
 
  hurt  Состояние: уязвлённое 
 
  impressed  Состояние: под впечатлением 
 
  in\_awe  Состояние: благоговейное 
 
  in\_love  Состояние: влюблённое 
 
  indignant  Состояние: возмущённое 
 
  interested  Состояние: заинтересованное 
 
  intoxicated  Состояние: одурманенное 
 
  invincible  Состояние: неукротимое 
 
  jealous  Состояние: ревнивое 
 
  lonely  Состояние: одинокое 
 
  mean  Состояние: сволочное 
 
  moody  Состояние: унылое 
 
  nervous  Состояние: на нервах 
 
  neutral  Состояние: безразличное 
 
  offended  Состояние: обиженное 
 
  playful  Состояние: игривое 
 
  proud  Состояние: горделивое 
 
  relieved  Состояние: гора с плеч 
 
  remorseful  Состояние: раскаиваюсь 
 
  restless  Состояние: неугомонное 
 
  sad  Состояние: печальное 
 
  sarcastic  Состояние: язвительное 
 
  serious  Состояние: серьёзное 
 
  shocked  Состояние: потрясённое 
 
  shy  Состояние: застенчивое 
 
  sick  Состояние: болезненное 
 
  sleepy  Состояние: сонное 
 
  stressed  Состояние: напряжённое 
 
  surprised  Состояние: удивлённое 
 
  thirsty  Состояние: хочу пить 
 
  worried  Состояние: беспокойное 

# <a id="Согласование_с_User_Activity_XEP-0108"></a>Согласование с "User Activity" (XEP-0108)
Существует некоторая проблема в согласовании перевода термина "mood" из "User Mood" и перевода термина "activity" из "User Activity" ([XEP-0108](http://www.xmpp.org/extensions/xep-0108.html)). 



[Gebb](Участник_Gebb.md) [предложил](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2007/08/26.html#18:04:56): 

    <gebb> Насчёт мудов и активити.
    user mood = настроение/состояние, activity = занятие.
    Таково моё предложение.


Changes to wiki/ru/Настройка_Ткаббера__азы_и_глубже.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417

[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Настройка_Ткаббера:_азы_и_глубже/index.html)


# Настройка Ткаббера: азы и глубже

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Вместо предисловия](#Вместо_предисловия)
* [2 Введение](#Введение)
* [3 Места скопления настроек](#Места_скопления_настроек)
* [4 Где лежат файлы конфигурации?](#Где_лежат_файлы_конфигурации)
   * [4.1 Тильда: большие возможности маленького символа](#Тильда_большие_возможности_маленького_символа)
* [5 Файл **custom.tcl** — руками не трогать!](#Файл_custom.tcl_-_руками_не_трогать)
   * [5.1 Формат файла **custom.tcl**](#Формат_файла_custom.tcl)
* [6 Файл **config.tcl** — швейцарский нож для Ткаббера](#Файл_config.tcl_-_швейцарский_нож_для_Ткаббера)
* [7 XRDB! как много в этом слове...](#XRDB_как_много_в_этом_слове...)

## <a id="Вместо_предисловия"></a>Вместо предисловия

Эта статья является попыткой объяснить новообращённым ткабберистам и
ткабберинам азы настройки Ткаббера и — главное — _объяснить, **как именно**
работает_ механизм его конфигурирования. Впрочем, текст содержит далеко не
только азы, но и достаточно глубокие погружения в детали. При этом авторами
были приложены некоторые усилия для того, чтобы организовать текст в каждом
разделе по нарастанию сложности (это так авторы сняли с себя ответственность за
качество материала).

Несмотря на то, что по _возможностям_ конфигурирования Ткаббер может спокойно
заткнуть за пояс большинство аналогичных программ, его подход к решению данной
проблемы сродни пресловутому "Unix-way": в руки пользователю даётся некоторое
количество рычагов различной формы, конструкции и сложности, умело дёргая за
которые, пользователь может добиться весьма многого. И даже странного.

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

Часть описанных проблем будет препарирована на данной странице.

## <a id="Введение"></a>Введение

Ткаббер написан на языке [Tcl](http://ru.wikipedia.org/wiki/Tcl) (произносится
"тикл" или "тикль") с использованием "родного" для тикля графического тулкита
[Tk](http://ru.wikipedia.org/wiki/Tk). Связка [Tcl/Tk](http://www.tcl.tk)
является переносимой, и это означает, что Ткаббер работает как минимум под
различными вариантами Unix, под Win32 и под MacOS (справедливости ради надо
отметить,  что пользователям последней системы придётся приложить для этого
куда больше усилий;  во всяком случае, нам пока неизвестны случаи работы
Ткаббера на "маках" с полпинка).

Также это означает, что тщетно ждать от Ткаббера наличия некоего "специального"
конфигуратора для \<впишите сюда вашу любимую ОС>. С другой стороны, в плане
_хранения конфигурационных файлов_ у перечисленных операционных систем больше
общих черт, чем различий; поэтому владея таким понятием как _"домашний каталог
пользователя",_ можно чувствовать себя уверенно при конфигурировании Ткаббера
на любой из систем, в которых он работает.

И ещё: существует (неправильное) мнение, что для того, чтобы работать с
Ткаббером, нужно редактировать какие-то файлы конфигурации. Это неверно — для
конфигурирования 90% того, что нужно "обычному пользователю", достаточно
встроенного в Ткаббер графического конфигуратора. Проблемы, которые нельзя
решить этим путём (например, "кривые шрифты"), обычно являются результатом
недоделок в настройке операционной системы.

![(!)](../images/Hammer.png) **Сделать:** плавно подвести к идее "замочи свой
~/.tkabber, потом — разбирайся"

## <a id="Места_скопления_настроек"></a>Места скопления настроек

Tkabber использует четыре источника для получения сведений о своей
конфигурации:

1. Настройки по умолчанию — то, что "прибито гвоздями" к коду, и используется,
   если нет соответствующих настроек из других источников.
1. Файл **custom.tcl** в _каталоге с файлами настроек_ (см. ниже). Этот файл
   создаётся Ткаббером и содержит те настройки, которые пользователь может
   изменять при помощи окна конфигурации Ткаббера.
1. Файл **config.tcl**, находящийся там же. Это файл содержит код на языке
   Tcl, который _выполняется_ Ткаббером при старте, и позволяет делать
   наиболее тонкую настройку.
1. X Resource DataBase (XRDB) — на Unix-системах — база данных
   [X-сервера](http://ru.wikipedia.org/wiki/X_Window_System), хранящая
   информацию о конфигурации различных [элементов управления GUI](http://ru.wikipedia.org/wiki/Виджет).

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

**На заметку:** Подобный подход может помочь "в борьбе" с некоторыми
дистрибутивами ткаббера, в которых по умолчанию подключены "навороченные" файлы
конфигурации, которые полезны для изучения, но "вываливают" на
неподготовленного пользователя слишком много информации.

Ещё важнее понимать, что каталог с файлами настроек — _единственное_ место в
системе, которое Ткаббер использует для управления своей конфигурацией (это не
совсем верно для случая XRDB, но об этом ниже). То есть никакого реестра или
других системно-зависимых средств. А благодаря способности тикля читать
текстовые файлы независимо от используемых символов перевода строки (а они
разные во всех трёх классах систем, на которых работает тикль), вам достаточно
просто скопировать каталог конфигурации на другую машину, а тикль с Ткаббером
позаботятся об остальном. И это означает, что вы можете "таскать за собой" этот
каталог не только с компьютера на компьютер, но и между разными операционными
системами!

Проблемы при переносе могут возникнуть только в том случае, если вы используете
не-ASCII символы (например, русские) в значениях параметров, которые
устанавливаются в файле **config.tcl**. Подробнее об этом — в секции,
посвящённой этому файлу.

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

Следующий раздел обсуждает в деталях где и как Ткаббер ожидает увидеть каталог
со своими настройками.

## <a id="Где_лежат_файлы_конфигурации"></a>Где лежат файлы конфигурации?

Короткий ответ: они находятся в подкаталоге **.tkabber** домашнего каталога
пользователя.

Если имя **.tkabber** — фиксированно, то с последним всё не так просто. Точнее,
просто, но допускает некоторые вариации.

Для начала полезно запомнить, что при операциях с файлами в Tcl домашний
каталог пользователя обозначается символом "~" (тильда), который имеет такой же
смысл, как и "~" в командных оболочках Unix-систем (что неудивительно, т.к. Tcl
был "рождён" в Unix).

При операциях с файлами тильда "раскрывается" в полный путь до вашего домашнего
каталога. К примеру, на моей домашней системе Debian GNU/Linux она раскрывается
в

    /home/kostix

а на моей рабочей станции Windows XP она "скрывает в себе"

    C:\Documents and Settings\Дормидонт Евлампиевич

Это означает, что в первом случае файлы конфигурации Tkabber хранятся в
каталоге

    /home/kostix/.tkabber

а во втором — в каталоге

    C:\Documents and Settings\Дормидонт Евлампиевич\Application Data\Tkabber

Системы Win9x/WinME являются однопользовательскими, и по причинам, которые
будут показаны ниже, каталог настроек Ткаббера на таких системах находится в
корне первого логического диска:

    C:\.TKABBER

Тильда может использоваться при указании различных каталогов в настройках
Tkabber'а (например, история чатов может храниться в каталоге ~/.tkabber/logs).
Так же вам могут "показать" подобный каталог в ходе диалога в [комнате
обсуждения Ткаббера] — не стоит удивляться: вам показывают "обобщённый"
вариант, который (должен быть) понятен пользователям любой ОС, в которой
работает Ткаббер.

Теперь — о более сложном.

### <a id="Тильда_большие_возможности_маленького_символа"></a>Тильда: большие возможности маленького символа

На самом деле, интерпретатор тикля "раскрывает" тильду, пользуясь информацией
из нескольких (проверенных) источников.

1\. Во-первых, тикль сверяется с [**переменной окружения**](Терминология.md#Переменные_окружения)
**HOME**. На Unix-системах эта переменная есть всегда (за исключением
клинических случаев). В Windows — напротив — её по умолчанию нет. Если такая
переменная есть, тикль использует её значение, и никакие силы не заставят его в
этом случае использовать что-то другое.

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

Этот же аспект используется дистрибутивом
[**Tkabber-Pack**](Дистрибутивы__которые_мы_выбираем.md#Прилавок), который в
скрипте запуска Ткаббера устанавливает переменную **HOME** в значение "."
(точка, т.е. "текущий каталог"), перемещая таким образом каталог **.tkabber**
"к себе".

2\. Во-вторых, если переменная окружения **HOME** не найдена, тикль использует
следующий набор правил:

2.1. **Unix:**

![(!)](../images/Hammer.png) **Сделать:** Написать про Unix

2.2. **Windows:**

* Под Windows интерпретатор тикля сначала пытается использовать каталог,
  полученный "склеиванием" значений переменных окружения **HOMEDRIVE** (имя
  диска с домашним каталогом) и **HOMEPATH** (путь на этом диске до домашнего
  каталога). Эти переменные по умолчанию есть на любой Windows системе класса
  NT, но их нет в Win9x/WinME, так как и понятие "домашний каталог
  пользователя" в них не завезли.

    Посмотреть значения этих переменных в Windows 2000 и выше можно, запустив
    оболочку командной строки **cmd.exe** (это можно сделать, выбрав "Пуск →
    Программы → Стандартные → Командная Строка"), и выполнив там:

        set | findstr HOME

    на моей системе это выглядит так:

        C:\> set | findstr HOME
        HOMEDRIVE=C:
        HOMEPATH=\Documents and Settings\Дормидонт Евлампиевич

    Команда **findstr** была здесь использована для фильтрации вывода команды **set**.

    В Unix-системах эквивалентом **findstr** является программа **grep** (на
    самом  деле это **findstr** является ограниченным эквивалентом **grep**). В
    Windows NT и Win9x/WinME нет команды **findstr**, так что придётся
    просматривать всю информацию глазами (или установить
    [grep для Win32](http://gnuwin32.sourceforge.net/packages/grep.htm)).

    Кроме того, пользователи Win9x/WinME лишены даже **cmd.exe** и вынуждены
    запускать **command.com**.

    **На заметку:** Команда **set** вообще очень удобна для изучения состояния
    переменных окружения в системе. Будучи запущена без параметров (как в
    примере выше), она выводит пары **ПЕРЕМЕННАЯ**=**ЗНАЧЕНИЕ**. Для
    ограничения её вывода можно применять **findstr** или **grep** как описано
    выше.

* Если же нет и переменных **HOMEDRIVE**/**HOMEPATH,** тикль заламывает руки и
  использует в качестве домашнего каталога пользователя каталог **C:\\**.
  Простенько и со вкусом. В системах Win9x/WinME эти переменных окружения
  отсутствуют так же, как и **HOME**, и это означает, что в них каталогом с
  настройками Ткаббера является "C:\\.TKABBER".

Не исключено, что прочитав про весь этот кошмар, доходчивый читатель задастся
вопросом: "а почему бы не прописать себе в окружение переменную **HOME** с
правильным значением раз и навсегда?". И будет прав. Такая настройка
используется многими, так как облегчает жизнь и многим другим программам,
знающим о существовании этой переменной окружения, например,
[редактору Vim](http://vim.sf.net) и
[клиенту системы Subversion](http://www.subversion.tigris.org).

Сделать это весьма просто: откройте свойства "Моего Компьютера", щёлкнув по его
иконке правой кнопкой и выбрав "Свойства", затем выберите закладку
"Дополнительно" и нажмите на появившейся форме кномку "Переменные среды"
(спасибо переводчикам, что не "вторника").

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

*  _Имя переменной:_ **HOME**
*  _Значение переменной:_ **%USERPROFILE%** (или **%HOMEDRIVE%/%HOMEPATH%**)

Конструкция

    %ИМЯ_ПЕРЕМЕННОЙ%

означает: "подставить значение из переменной с именем **ИМЯ\_ПЕРЕМЕННОЙ**".

Закройте оба диалога, нажимая "ОК", и выполните команду для вывода переменных
окружения ещё раз _в новой оболочке_ (т.к. старая не "увидит" сделанных вами
изменений). Теперь вывод должен выглядеть примерно так:

    HOME=C:\Documents and Settings\Дормидонт Евлампиевич
    HOMEDRIVE=C:
    HOMEPATH=\Documents and Settings\Дормидонт Евлампиевич

Вуаля!

**Внимание:** Замечено, что на разных версиях Windows встречаются различные
комбинации переменных **USERPROFILE**, **HOMEDRIVE** и **HOMEPATH** (да, c'est
la vie!). К примеру, авторам встречалась Windows NT 4.x, на которой были все
три переменные, но **HOMEDRIVE** и **HOMEPATH** в комбинации давали полную
чушь, в то время как **USERPROFILE** содержала достаточно вменяемое значение. В
Windows 2000 и Windows XP переменная **USERPROFILE** почти всегда содержит
правильное значение, однако, опять же, авторам встречались машины, на которых
эта переменная отсутствовала.

Выводов из этого — два:

*  **set** — ваш друг!
*  в крайнем случае всегда можно записать в **HOME** непосредственное значение.
   Это даже может оказаться полезным — установить "необычное" значение этой
   переменной "в глобальном масштабе", например, для случая "набор программ на
   винчестере в USB-салазках".

**На заметку:** Имейте в виду, что подстановки значений в переменных окружения
Windows выполняются только один раз, то есть, говоря проще, нельзя определить
переменную, которая будет ссылаться на другую переменную, которая будет
ссылаться на третью — подстановка этой третьей переменной выполнена не будет.

**Напоследок — ещё один трюк для сильных духом.**

Можно легко узнать что думает тикль по поводу вашего домашнего каталога (и при
случае внушит это Ткабберу), выполнив заклинание **"file norm ~"** без кавычек
в любой оболочке тикля, установленной в вашей системе.

Очень вероятно, что у вас как минимум есть **wish.exe** или **wish84.exe**, так
же, возможно, у вас есть **tclsh.exe**. Если же у вас есть **tkcon.tcl**, и вы
об этом знали, то вам, скорее всего, не стоит тратить время на чтение этого
руководства. Для нашей благородной цели сгодится любая из указанных программ.

С другой стороны, если у вас Ткаббер в виде tclkit или starpack, то вам, скорее
всего, не повезло (т.к. подобный дистрибутив это "вещь в себе"), но ниже
приведено решение и для этого случая. Если же у вас Tkabber Pack, то вы —
обладатель урезанного, но "нормального" дистрибутива Tcl/Tk, только находится
он там, куда вы установили Tkabber Pack, и указанный **wish.exe** следует
искать именно там.

Итак, запускаем то, что вам удалось обнаружить из приведённого списка и вводим
указанную команду. Примерный вид происходящего таков:

    % file norm ~
    C:/Documents and Settings/Дормидонт Евлампиевич

Внимательные из вас заметят, что в этом выводе — "неправильные" слэши: прямые,
а не обратные, как принято в ОС от Microsoft. В этом нет ничего странного:
тикль, работая под Windows, оперирует именно "прямыми", "юниксовыми" слэшами,
так как Windows на самом деле прекрасно понимает эту нотацию, только умело
скрывает это от пользователей.

**На заметку:** Не лишним также будет заметить, что Ткаббер имеет возможность
сам обеспечить вас [консолью для ввода команд Tcl](http://wiki.tcl.tk/672) (и
управления собой, в числе прочего; но эта тема
[**отдельной статьи**](Удалённое_управление_с_помощью_send.md)). В виндовой версии Ткаббера
консоль встроена, в \*nix у вас должен быть установлен пакет tkcon. Получить
оную можно, выбрав опцию "Показать консоль" пункта "Помощь" главного меню
Ткаббера.

Это может оказаться полезным для пользователей "упакованных" версий Ткаббера.

## <a id="Файл_custom.tcl_-_руками_не_трогать"></a>Файл **custom.tcl** — руками не трогать!

Файл **custom.tcl** это собственность Ткаббера. Ткаббер использует этот файл в
качестве постоянного хранилища своих настроек. Ткаббер читает **custom.tcl**
при старте и _перезаписывает_ его при выходе.

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

Кроме того, несмотря на то, что формат этого файла весьма прозрачен, нет
никаких гарантий того, что он не изменится в следующей версии Ткаббера.

Посему тем, кто не собирается нарочно копаться во внутренностях Ткаббера, лучше
всего относиться к этому файлу как к "чёрному ящику" — в духе времени уважать
права Ткаббера на частную собственность.

А ещё лучше — отнеситесь к нему как к трансформаторной будке.

### <a id="Формат_файла_custom.tcl"></a>Формат файла **custom.tcl**

Доскональное понимание формата файла **custom.tcl** требует определённых знаний
по языку Tcl, поскольку данные в нём хранятся в формате, который удобно читать
и писать интерпретатору тикля.

С другой стороны, формат можно назвать "дружественным", так как в конце-концов
это обычный текст, только "хитро" отформатированный.

Элементы Tcl, которые полезно знать для полного понимания предмета:

*  [Списки](http://wiki.tcl.tk/440)
*  [Массивы](http://wiki.tcl.tk/1032)
*  [Пространства имён](http://wiki.tcl.tk/1489)

Итак, файл **custom.tcl:**

*  Использует кодировку [UTF-8](http://ru.wikipedia.org/wiki/UTF-8)
*  Является набором строк, каждая из которых представляет собой _"правильно
   сформированный список"_ с точки зрения языка Tcl.
*  Каждый из этих списков состоит из двух элементов:
 1.  _Полное_ имя переменной, представляющей одну из опций конфигурации Ткаббера.
 1.  Значение этой переменной.

Значение переменной само может быть списком, а элементы этого списка, в свою
очередь так же могут быть списками. Такая структура может иметь произвольную
вложенность.

Вот, к примеру, кусочек (не)типичного файла **custom.tcl:**

    {::ifacetk::roster::options(nested) 1}
    {::::loginconf(httpproxy) gates.of.hell.microsoft.com}

Технически этот пример означает:

1.  Устанавливается истинным (1) значение переменной, заданной ключом "nested"
    в массиве "options", входящим в пространство имён "::ifacetk::roster".
1.  Переменная, заданная ключом "httpproxy" в глобальном массиве "::loginconf",
    устанавливается в значение "gates.of.hell.microsoft.com".

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

## <a id="Файл_config.tcl_-_швейцарский_нож_для_Ткаббера"></a>Файл **config.tcl** — швейцарский нож для Ткаббера

![(!)](../images/Hammer.png) **Сделать:** некоторое введение...

Про этот файл рассказано [**тут**](Config.tcl.md).

Также имеется [**список готовых "рецептов"**](Нетривиальные_настройки.md), поместив
которые в **config.tcl**, можно добиться интересного поведения от Ткаббера.
Изучение статьи про **config.tcl** не нужно для использования рецептов, однако
оно очень вам пригодится, если вы захотите реализовать какое-то сложное
изменение конфигурации своими руками.

## <a id="XRDB_как_много_в_этом_слове..."></a>XRDB! как много в этом слове...

Описание XRDB и его связи с "базой данных настроек Tk" вынесено в
[**отдельную статью**](XRDB.md).


>











|

|





|
<
<
<
<
<
<

|
<
<
<
<

|
<
<

|



|
<
<
<
<
<
<
<

|
<
<
<
<
<

|
<
<
<
<
<

|
<



|
<

|
<
<
|
<
<
|
<
|
<
<

|
<
<
<
<

|
<
<
<

|
<
<
<
<
<
<
<
<
<

|
<
<
<

|
<
<
<

|
<



|
<

|
<

|
<
<
<

|
<
<



|



|
<



|



|
<
<



|
<
<
<
<
<

|



|
<

<
|
<
<
<

|
<
<

|
<
<
<
<

|
<

|

|

|

|
<
<
<
<
<

|
<
<

|

|

|
|
|

|

|
<
<
<
<

|
<

|
<
<
<
<

<
|
<
<
<

|
<
<
<
<
<
<

|
<
<
<

|
<
<

|
|

|



|

|
<
<





|

|
<
<
<
<
<
<
<

|

|
|
<
<
<

|
<
<
<

|

|
<
<

|
<
<
<

|
<
<
<
<
<

|
<




|
<
<
<
<

|
<
<
<
<
<
<

|



|
<
<

|
<
<
<

|
<

|
<
<

|



|
<
<

|
<

|

|
|
|

|

|
|
<
|
|
|

|
<
<

|




|

|
<
|
<

|
<
<



|

|

<
|
<
<
<



|
|
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22






23
24




25
26


27
28
29
30
31
32







33
34





35
36





37
38

39
40
41
42

43
44


45


46

47


48
49




50
51



52
53









54
55



56
57



58
59

60
61
62
63

64
65

66
67



68
69


70
71
72
73
74
75
76
77

78
79
80
81
82
83
84
85


86
87
88
89





90
91
92
93
94
95

96

97



98
99


100
101




102
103

104
105
106
107
108
109
110
111





112
113


114
115
116
117
118
119
120
121
122
123
124
125




126
127

128
129




130

131



132
133






134
135



136
137


138
139
140
141
142
143
144
145
146
147
148


149
150
151
152
153
154
155
156







157
158
159
160
161



162
163



164
165
166
167


168
169



170
171





172
173

174
175
176
177
178




179
180






181
182
183
184
185
186


187
188



189
190

191
192


193
194
195
196
197
198


199
200

201
202
203
204
205
206
207
208
209
210
211

212
213
214
215
216


217
218
219
220
221
222
223
224
225

226

227
228


229
230
231
232
233
234
235

236



237
238
239
240
241
242
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Настройка_Ткаббера:_азы_и_глубже/index.html)


# Настройка Ткаббера: азы и глубже

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Вместо предисловия](#Вместо_предисловия)
* [2 Введение](#Введение)
* [3 Места скопления настроек](#Места_скопления_настроек)
* [4 Где лежат файлы конфигурации?](#Где_лежат_файлы_конфигурации)
 * [4.1 Тильда: большие возможности маленького символа](#Тильда_большие_возможности_маленького_символа)
* [5 Файл **custom.tcl** — руками не трогать!](#Файл_custom.tcl_-_руками_не_трогать)
 * [5.1 Формат файла **custom.tcl**](#Формат_файла_custom.tcl)
* [6 Файл **config.tcl** — швейцарский нож для Ткаббера](#Файл_config.tcl_-_швейцарский_нож_для_Ткаббера)
* [7 XRDB! как много в этом слове...](#XRDB_как_много_в_этом_слове...)

## <a id="Вместо_предисловия"></a>Вместо предисловия

Эта статья является попыткой объяснить новообращённым ткабберистам и ткабберинам азы настройки Ткаббера и — главное — _объяснить, **как именно** работает_ механизм его конфигурирования. Впрочем, текст содержит далеко не только азы, но и достаточно глубокие погружения в детали. При этом авторами были приложены некоторые усилия для того, чтобы организовать текст в каждом разделе по нарастанию сложности (это так авторы сняли с себя ответственность за качество материала). 







Несмотря на то, что по _возможностям_ конфигурирования Ткаббер может спокойно заткнуть за пояс большинство аналогичных программ, его подход к решению данной проблемы сродни пресловутому "Unix-way": в руки пользователю даётся некоторое количество рычагов различной формы, конструкции и сложности, умело дёргая за которые, пользователь может добиться весьма многого. И даже странного. 





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



Часть описанных проблем будет препарирована на данной странице. 

## <a id="Введение"></a>Введение

Ткаббер написан на языке [Tcl](http://ru.wikipedia.org/wiki/Tcl) (произносится "тикл" или "тикль") с использованием "родного" для тикля графического тулкита [Tk](http://ru.wikipedia.org/wiki/Tk). Связка [Tcl/Tk](http://www.tcl.tk) является переносимой, и это означает, что Ткаббер работает как минимум под различными вариантами Unix, под Win32 и под MacOS (справедливости ради надо отметить,  что пользователям последней системы придётся приложить для этого куда больше усилий;  во всяком случае, нам пока неизвестны случаи работы Ткаббера на "маках" с полпинка). 








Также это означает, что тщетно ждать от Ткаббера наличия некоего "специального" конфигуратора для \<впишите сюда вашу любимую ОС>. С другой стороны, в плане _хранения конфигурационных файлов_ у перечисленных операционных систем больше общих черт, чем различий; поэтому владея таким понятием как _"домашний каталог пользователя",_ можно чувствовать себя уверенно при конфигурировании Ткаббера на любой из систем, в которых он работает. 






И ещё: существует (неправильное) мнение, что для того, чтобы работать с Ткаббером, нужно редактировать какие-то файлы конфигурации. Это неверно — для конфигурирования 90% того, что нужно "обычному пользователю", достаточно встроенного в Ткаббер графического конфигуратора. Проблемы, которые нельзя решить этим путём (например, "кривые шрифты"), обычно являются результатом недоделок в настройке операционной системы. 






![(!)](../images/Hammer.png) **Сделать:** плавно подвести к идее "замочи свой ~/.tkabber, потом — разбирайся" 


## <a id="Места_скопления_настроек"></a>Места скопления настроек

Tkabber использует четыре источника для получения сведений о своей конфигурации: 


1.  Настройки по умолчанию — то, что "прибито гвоздями" к коду, и используется, если нет соответствующих настроек из других источников. 


1.  Файл **custom.tcl** в _каталоге с файлами настроек_ (см. ниже). Этот файл создаётся Ткаббером и содержит те настройки, которые пользователь может изменять при помощи окна конфигурации Ткаббера. 


1.  Файл **config.tcl**, находящийся там же. Это файл содержит код на языке Tcl, который _выполняется_ Ткаббером при старте, и позволяет делать наиболее тонкую настройку. 

1.  X Resource DataBase (XRDB) — на Unix-системах — база данных [X-сервера](http://ru.wikipedia.org/wiki/X_Window_System), хранящая информацию о конфигурации различных [элементов управления GUI](http://ru.wikipedia.org/wiki/Виджет). 



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





**На заметку:** Подобный подход может помочь "в борьбе" с некоторыми дистрибутивами ткаббера, в которых по умолчанию подключены "навороченные" файлы конфигурации, которые полезны для изучения, но "вываливают" на неподготовленного пользователя слишком много информации. 




Ещё важнее понимать, что каталог с файлами настроек — _единственное_ место в системе, которое Ткаббер использует для управления своей конфигурацией (это не совсем верно для случая XRDB, но об этом ниже). То есть никакого реестра или других системно-зависимых средств. А благодаря способности тикля читать текстовые файлы независимо от используемых символов перевода строки (а они разные во всех трёх классах систем, на которых работает тикль), вам достаточно просто скопировать каталог конфигурации на другую машину, а тикль с Ткаббером позаботятся об остальном. И это означает, что вы можете "таскать за собой" этот каталог не только с компьютера на компьютер, но и между разными операционными системами! 










Проблемы при переносе могут возникнуть только в том случае, если вы используете не-ASCII символы (например, русские) в значениях параметров, которые устанавливаются в файле **config.tcl**. Подробнее об этом — в секции, посвящённой этому файлу. 




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




Следующий раздел обсуждает в деталях где и как Ткаббер ожидает увидеть каталог со своими настройками. 


## <a id="Где_лежат_файлы_конфигурации"></a>Где лежат файлы конфигурации?

Короткий ответ: они находятся в подкаталоге **.tkabber** домашнего каталога пользователя. 


Если имя **.tkabber** — фиксированно, то с последним всё не так просто. Точнее, просто, но допускает некоторые вариации. 


Для начала полезно запомнить, что при операциях с файлами в Tcl домашний каталог пользователя обозначается символом "~" (тильда), который имеет такой же смысл, как и "~" в командных оболочках Unix-систем (что неудивительно, т.к. Tcl был "рождён" в Unix). 




При операциях с файлами тильда "раскрывается" в полный путь до вашего домашнего каталога. К примеру, на моей домашней системе Debian GNU/Linux она раскрывается в 



    /home/kostix

а на моей рабочей станции Windows XP она "скрывает в себе" 

    C:\Documents and Settings\Дормидонт Евлампиевич

Это означает, что в первом случае файлы конфигурации Tkabber хранятся в каталоге 


    /home/kostix/.tkabber

а во втором — в каталоге 

    C:\Documents and Settings\Дормидонт Евлампиевич\Application Data\Tkabber

Системы Win9x/WinME являются однопользовательскими, и по причинам, которые будут показаны ниже, каталог настроек Ткаббера на таких системах находится в корне первого логического диска: 



    C:\.TKABBER

Тильда может использоваться при указании различных каталогов в настройках Tkabber'а (например, история чатов может храниться в каталоге ~/.tkabber/logs). Так же вам могут "показать" подобный каталог в ходе диалога в [комнате обсуждения Ткаббера] — не стоит удивляться: вам показывают "обобщённый" вариант, который (должен быть) понятен пользователям любой ОС, в которой работает Ткаббер. 






Теперь — о более сложном. 

### <a id="Тильда_большие_возможности_маленького_символа"></a>Тильда: большие возможности маленького символа

На самом деле, интерпретатор тикля "раскрывает" тильду, пользуясь информацией из нескольких (проверенных) источников. 



1. Во-первых, тикль сверяется с [переменной окружения](Терминология.md#Переменные_окружения) **HOME**. На Unix-системах эта переменная есть всегда (за исключением клинических случаев). В Windows — напротив — её по умолчанию нет. Если такая переменная есть, тикль использует её значение, и никакие силы не заставят его в этом случае использовать что-то другое. 




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



Этот же аспект используется дистрибутивом [Tkabber-Pack](Дистрибутивы__которые_мы_выбираем.md#Прилавок), который в скрипте запуска Ткаббера устанавливает переменную **HOME** в значение "." (точка, т.е. "текущий каталог"), перемещая таким образом каталог **.tkabber** "к себе". 





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


2.1. **Unix:** 

![(!)](../images/Hammer.png) **Сделать:** Написать про Unix 

2.2. **Windows:** 

*  Под Windows интерпретатор тикля сначала пытается использовать каталог, полученный "склеиванием" значений переменных окружения **HOMEDRIVE** (имя диска с домашним каталогом) и **HOMEPATH** (путь на этом диске до домашнего каталога). Эти переменные по умолчанию есть на любой Windows системе класса NT, но их нет в Win9x/WinME, так как и понятие "домашний каталог пользователя" в них не завезли. 






Посмотреть значения этих переменных в Windows 2000 и выше можно, запустив оболочку командной строки **cmd.exe** (это можно сделать, выбрав "Пуск → Программы → Стандартные → Командная Строка"), и выполнив там: 



    set | findstr HOME

на моей системе это выглядит так: 

    C:\> set | findstr HOME
    HOMEDRIVE=C:
    HOMEPATH=\Documents and Settings\Дормидонт Евлампиевич

Команда **findstr** была здесь использована для фильтрации вывода команды **set**. 

В Unix-системах эквивалентом **findstr** является программа **grep** (на самом  деле это **findstr** является ограниченным эквивалентом **grep**). В Windows NT и Win9x/WinME нет команды **findstr**, так что придётся просматривать всю информацию глазами (или установить [grep для Win32](http://gnuwin32.sourceforge.net/packages/grep.htm)). 





Кроме того, пользователи Win9x/WinME лишены даже **cmd.exe** и вынуждены запускать **command.com**. 


**На заметку:** Команда **set** вообще очень удобна для изучения состояния переменных окружения в системе. Будучи запущена без параметров (как в примере выше), она выводит пары **ПЕРЕМЕННАЯ**=**ЗНАЧЕНИЕ**. Для ограничения её вывода можно применять **findstr** или **grep** как описано выше. 






*  Если же нет и переменных **HOMEDRIVE**/**HOMEPATH,** тикль заламывает руки и использует в качестве домашнего каталога пользователя каталог **C:\\**. Простенько и со вкусом. В системах Win9x/WinME эти переменных окружения отсутствуют так же, как и **HOME**, и это означает, что в них каталогом с настройками Ткаббера является "C:\\.TKABBER". 




Не исключено, что прочитав про весь этот кошмар, доходчивый читатель задастся вопросом: "а почему бы не прописать себе в окружение переменную **HOME** с правильным значением раз и навсегда?". И будет прав. Такая настройка используется многими, так как облегчает жизнь и многим другим программам, знающим о существовании этой переменной окружения, например, [редактору Vim](http://vim.sf.net) и [клиенту системы Subversion](http://www.subversion.tigris.org). 







Сделать это весьма просто: откройте свойства "Моего Компьютера", щёлкнув по его иконке правой кнопкой и выбрав "Свойства", затем выберите закладку "Дополнительно" и нажмите на появившейся форме кномку "Переменные среды" (спасибо переводчикам, что не "вторника"). 




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



*  _Имя переменной:_ **HOME** 
*  _Значение переменной:_ **%USERPROFILE%** (или **%HOMEDRIVE%/%HOMEPATH%**) 

Конструкция 

    %ИМЯ_ПЕРЕМЕННОЙ%

означает: "подставить значение из переменной с именем **ИМЯ\_ПЕРЕМЕННОЙ**". 

Закройте оба диалога, нажимая "ОК", и выполните команду для вывода переменных окружения ещё раз _в новой оболочке_ (т.к. старая не "увидит" сделанных вами изменений). Теперь вывод должен выглядеть примерно так: 



    HOME=C:\Documents and Settings\Дормидонт Евлампиевич
    HOMEDRIVE=C:
    HOMEPATH=\Documents and Settings\Дормидонт Евлампиевич

Вуаля! 

**Внимание:** Замечено, что на разных версиях Windows встречаются различные комбинации переменных **USERPROFILE**, **HOMEDRIVE** и **HOMEPATH** (да, c'est la vie!). К примеру, авторам встречалась Windows NT 4.x, на которой были все три переменные, но **HOMEDRIVE** и **HOMEPATH** в комбинации давали полную чушь, в то время как **USERPROFILE** содержала достаточно вменяемое значение. В Windows 2000 и Windows XP переменная **USERPROFILE** почти всегда содержит правильное значение, однако, опять же, авторам встречались машины, на которых эта переменная отсутствовала. 








Выводов из этого — два: 

*  **set** — ваш друг! 
*  в крайнем случае всегда можно записать в **HOME** непосредственное значение. Это даже может оказаться полезным — установить "необычное" значение этой переменной "в глобальном масштабе", например, для случая "набор программ на винчестере в USB-салазках". 




**На заметку:** Имейте в виду, что подстановки значений в переменных окружения Windows выполняются только один раз, то есть, говоря проще, нельзя определить переменную, которая будет ссылаться на другую переменную, которая будет ссылаться на третью — подстановка этой третьей переменной выполнена не будет. 




**Напоследок — ещё один трюк для сильных духом.** 

Можно легко узнать что думает тикль по поводу вашего домашнего каталога (и при случае внушит это Ткабберу), выполнив заклинание **"file norm ~"** без кавычек в любой оболочке тикля, установленной в вашей системе. 



Очень вероятно, что у вас как минимум есть **wish.exe** или **wish84.exe**, так же, возможно, у вас есть **tclsh.exe**. Если же у вас есть **tkcon.tcl**, и вы об этом знали, то вам, скорее всего, не стоит тратить время на чтение этого руководства. Для нашей благородной цели сгодится любая из указанных программ. 




С другой стороны, если у вас Ткаббер в виде tclkit или starpack, то вам, скорее всего, не повезло (т.к. подобный дистрибутив это "вещь в себе"), но ниже приведено решение и для этого случая. Если же у вас Tkabber Pack, то вы — обладатель урезанного, но "нормального" дистрибутива Tcl/Tk, только находится он там, куда вы установили Tkabber Pack, и указанный **wish.exe** следует искать именно там. 






Итак, запускаем то, что вам удалось обнаружить из приведённого списка и вводим указанную команду. Примерный вид происходящего таков: 


    % file norm ~
    C:/Documents and Settings/Дормидонт Евлампиевич

Внимательные из вас заметят, что в этом выводе — "неправильные" слэши: прямые, а не обратные, как принято в ОС от Microsoft. В этом нет ничего странного: тикль, работая под Windows, оперирует именно "прямыми", "юниксовыми" слэшами, так как Windows на самом деле прекрасно понимает эту нотацию, только умело скрывает это от пользователей. 





**На заметку:** Не лишним также будет заметить, что Ткаббер имеет возможность сам обеспечить вас [консолью для ввода команд Tcl](http://wiki.tcl.tk/672) (и управления собой, в числе прочего; но эта тема [отдельной статьи](Удалённое_управление_с_помощью_send.md)). В виндовой версии Ткаббера консоль встроена, в \*nix у вас должен быть установлен пакет tkcon. Получить оную можно, выбрав опцию "Показать консоль" пункта "Помощь" главного меню Ткаббера. 







Это может оказаться полезным для пользователей "упакованных" версий Ткаббера. 

## <a id="Файл_custom.tcl_-_руками_не_трогать"></a>Файл **custom.tcl** — руками не трогать!

Файл **custom.tcl** это собственность Ткаббера. Ткаббер использует этот файл в качестве постоянного хранилища своих настроек. Ткаббер читает **custom.tcl** при старте и _перезаписывает_ его при выходе. 



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




Кроме того, несмотря на то, что формат этого файла весьма прозрачен, нет никаких гарантий того, что он не изменится в следующей версии Ткаббера. 


Посему тем, кто не собирается нарочно копаться во внутренностях Ткаббера, лучше всего относиться к этому файлу как к "чёрному ящику" — в духе времени уважать права Ткаббера на частную собственность. 



А ещё лучше — отнеситесь к нему как к трансформаторной будке. 

### <a id="Формат_файла_custom.tcl"></a>Формат файла **custom.tcl**

Доскональное понимание формата файла **custom.tcl** требует определённых знаний по языку Tcl, поскольку данные в нём хранятся в формате, который удобно читать и писать интерпретатору тикля. 



С другой стороны, формат можно назвать "дружественным", так как в конце-концов это обычный текст, только "хитро" отформатированный. 


Элементы Tcl, которые полезно знать для полного понимания предмета: 

*  [Списки](http://wiki.tcl.tk/440) 
*  [Массивы](http://wiki.tcl.tk/1032) 
*  [Пространства имён](http://wiki.tcl.tk/1489) 

Итак, файл **custom.tcl:** 

*  Использует кодировку [UTF-8](http://ru.wikipedia.org/wiki/UTF-8) 
*  Является набором строк, каждая из которых представляет собой _"правильно сформированный список"_ с точки зрения языка Tcl. 

*  Каждый из этих списков состоит из двух элементов: 
 1.  _Полное_ имя переменной, представляющей одну из опций конфигурации Ткаббера. 
 1.  Значение этой переменной. 

Значение переменной само может быть списком, а элементы этого списка, в свою очередь так же могут быть списками. Такая структура может иметь произвольную вложенность. 



Вот, к примеру, кусочек (не)типичного файла **custom.tcl:** 

    {::ifacetk::roster::options(nested) 1}
    {::::loginconf(httpproxy) gates.of.hell.microsoft.com}

Технически этот пример означает: 

1.  Устанавливается истинным (1) значение переменной, заданной ключом "nested" в массиве "options", входящим в пространство имён "::ifacetk::roster". 

1.  Переменная, заданная ключом "httpproxy" в глобальном массиве "::loginconf", устанавливается в значение "gates.of.hell.microsoft.com". 


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



## <a id="Файл_config.tcl_-_швейцарский_нож_для_Ткаббера"></a>Файл **config.tcl** — швейцарский нож для Ткаббера

![(!)](../images/Hammer.png) **Сделать:** некоторое введение... 

Про этот файл рассказано [тут](Config.tcl.md). 


Также имеется [список готовых "рецептов"](Нетривиальные_настройки.md), поместив которые в **config.tcl**, можно добиться интересного поведения от Ткаббера. Изучение статьи про **config.tcl** не нужно для использования рецептов, однако оно очень вам пригодится, если вы захотите реализовать какое-то сложное изменение конфигурации своими руками. 




## <a id="XRDB_как_много_в_этом_слове..."></a>XRDB! как много в этом слове...

Описание XRDB и его связи с "базой данных настроек Tk" вынесено в [отдельную статью](XRDB.md). 


Changes to wiki/ru/Настройки.md.

1
2

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143


144


145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272

273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333

334

335

336
337
338

339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361

362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379

380

381
382

383
384

385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402

403
404
405
406
407

408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522


523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545




546
547
548
549
550
551
552
553
554
555
556
557
558
559
560

561

562

563

564

565

566
567
568

569

570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588

589
590
591

592

593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731


732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801




802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915




916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042

1043
1044
1045
1046
1047
1048
1049
1050
1051

1052
1053


1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267

1268

1269
1270
1271
1272
1273
1274

1275

1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291

1292
1293
1294
1295

1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307

1308
1309
1310
1311

1312
1313

1314
1315


1316

1317

1318
1319
1320
1321

1322










1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427


1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Настройки/index.html)


# Настройки

Материал из Tkabber Wiki.

Попасть в окно настроек просто: меню **Tkabber → Настройки**. Откроется
вкладка, полная кнопок, каждая из которых ведёт в свой раздел и содержит
настройки определённых элементов интерфейса, логина, плагинов, звука и прочих
всякостей. В этой статье мы попробуем подробно рассказать о наиболее важных
настройках и упомянуть вскользь не очень важные. Но все настройки, имеющиеся в
Ткаббере на данный момент (версия 10.0.1-beta, а точнее, ревизия 1401 из svn),
попадут в эту статью с минимальным описанием хотя бы для того, чтобы проще было
искать нужную по ключевым словам. Стоит напомнить, что в окне настроек, как и
почти везде в Ткаббере, работает поиск: Ctrl-s. Но ищет он, к сожалению, лишь в
пределах открытого раздела. Полного поиска по всем настройкам нет (то есть,
если из главного окна вы будете искать какую-нибудь настройку логина, вы её не
найдёте).

Ну что ж, перейдём непосредственно к настройкам, однако перед этим ознакомим
вас с одной тонкой, но важной вещью:

Пробуя настройки в этом конфигураторе, мало пометить чекбокс, нужно ещё
_применить изменение,_ чтобы Ткаббер о нём узнал. Для этого нажмите на кнопку
Состояние, расположенную рядом с изменённой настройкой, и выберите нужный
вариант. Можно сохранить настройку только для текущей сессии (равносильно
включению настроек через пункты меню), а можно сохранить и для будущих, тогда
при следующем старте вам не придётся ничего настраивать заново. Кроме того,
можно восстановить значение по умолчанию, в случае, если вы напортачили во
время экспериментов.

Продвинутым пользователям стоит заметить одну важную идею, лежащую в основе
механизма конфигурирования Ткаббера (и пока ещё нигде на этой вики более не
освещённую): любую настройку, которую вы видите в интерфейсе настроек, можно
установить программно из [**файла конфигурации**](Config.tcl.md); при этом длинные
непонятные "имена настроек" Ткаббера именно потому длинны и непонятны, что это
на самом деле — имена переменных, управляющих настройками, и эти имена можно
скопировать (физически, "натянув" на них выделение мышкой прямо в интерфейсе
настроек) и вставить в файл конфигурации, открытый в любимом текстовом
редакторе.

Имейте также в виду, что любая группа настроек может иметь несколько
"родителей": например, группа настроек "Emoticons", посвящённая эмоциконкам
(смайлам), доступна как из группы "Chat", так и из группы "Plugins" → "Rich
Text".

## <a id="toc"></a>Содержание

* [1 AutoAway](#AutoAway)
   * [1.1 ::plugins::autoaway::options(awaytime)](#pluginsautoawayoptionsawaytime)
   * [1.2 ::plugins::autoaway::options(xatime)](#pluginsautoawayoptionsxatime)
   * [1.3 ::plugins::autoaway::options(status)](#pluginsautoawayoptionsstatus)
   * [1.4 ::plugins::autoaway::options(drop\_priority)](#pluginsautoawayoptionsdrop_priority)
* [2 Chat](#Chat)
   * [2.1 ::chat::options(stop\_scroll)](#chatoptionsstop_scroll)
   * [2.2 ::chat::options(smart\_scroll)](#chatoptionssmart_scroll)
   * [2.3 ::chat::options(display\_status\_description)](#chatoptionsdisplay_status_description)
   * [2.4 ::chat::options(default\_message\_type)](#chatoptionsdefault_message_type)
   * [2.5 ::chat::options(gen\_status\_change\_msgs)](#chatoptionsgen_status_change_msgs)
   * [2.6 ::plugins::completion::options(completion\_expire)](#pluginscompletionoptionscompletion_expire)
   * [2.7 ::plugins::options(timestamp\_format)](#pluginsoptionstimestamp_format)
   * [2.8 ::plugins::options(delayed\_timestamp\_format)](#pluginsoptionsdelayed_timestamp_format)
   * [2.9 ::plugins::xhtml::options(enable)](#pluginsxhtmloptionsenable)
   * [2.10 ::plugins::log\_on\_open::options(max\_messages)](#pluginslog_on_openoptionsmax_messages)
   * [2.11 ::plugins::log\_on\_open::options(max\_interval)](#pluginslog_on_openoptionsmax_interval)
   * [2.12 ::plugins::nickcolors::options(use\_colored\_nicks)](#pluginsnickcolorsoptionsuse_colored_nicks)
   * [2.13 ::plugins::nickcolors::options(use\_colored\_roster\_nicks)](#pluginsnickcolorsoptionsuse_colored_roster_nicks)
   * [2.14 ::plugins::nickcolors::options(use\_colored\_messages)](#pluginsnickcolorsoptionsuse_colored_messages)
   * [2.15 ::muc::options(gen\_enter\_exit\_msgs)](#mucoptionsgen_enter_exit_msgs)
   * [2.16 ::muc::options(gen\_muc\_status\_change\_msgs)](#mucoptionsgen_muc_status_change_msgs)
   * [2.17 ::muc::options(gen\_muc\_position\_change\_msgs)](#mucoptionsgen_muc_position_change_msgs)
   * [2.18 ::muc::options(propose\_configure)](#mucoptionspropose_configure)
   * [2.19 ::muc::options(history\_maxchars)](#mucoptionshistory_maxchars)
   * [2.20 ::muc::options(history\_maxstanzas)](#mucoptionshistory_maxstanzas)
   * [2.21 ::muc::options(request\_only\_unseen\_history)](#mucoptionsrequest_only_unseen_history)
   * [2.22 ::plugins::tclchat::options(use\_tkchat\_colors)](#pluginstclchatoptionsuse_tkchat_colors)
   * [2.23 Chatstate](#Chatstate)
      * [2.23.1 ::plugins::chatstate::options(enable)](#pluginschatstateoptionsenable)
   * [2.24 Emoticons](#Emoticons)
      * [2.24.1 ::plugins::emoticons::options(show\_emoticons)](#pluginsemoticonsoptionsshow_emoticons)
      * [2.24.2 ::plugins::emoticons::options(theme)](#pluginsemoticonsoptionstheme)
      * [2.24.3 ::plugins::emoticons::options(match\_whole\_word)](#pluginsemoticonsoptionsmatch_whole_word)
      * [2.24.4 ::plugins::emoticons::options(handle\_lol)](#pluginsemoticonsoptionshandle_lol)
   * [2.25 Events](#Events)
      * [2.25.1 ::plugins::events::options(enable)](#pluginseventsoptionsenable)
   * [2.26 Highlight](#Highlight)
      * [2.26.1 ::plugins::highlight::options(enable\_highlighting)](#pluginshighlightoptionsenable_highlighting)
      * [2.26.2 ::plugins::highlight::options(highlight\_nick)](#pluginshighlightoptionshighlight_nick)
      * [2.26.3 ::plugins::highlight::options(highlight\_substrings)](#pluginshighlightoptionshighlight_substrings)
      * [2.26.4 ::plugins::highlight::options(highlight\_whole\_words)](#pluginshighlightoptionshighlight_whole_words)
   * [2.27 Logging](#Logging)
      * [2.27.1 ::logger::options(logdir)](#loggeroptionslogdir)
      * [2.27.2 ::logger::options(log\_chat)](#loggeroptionslog_chat)
      * [2.27.3 ::logger::options(log\_groupchat)](#loggeroptionslog_groupchat)
   * [2.28 MUC Ignoring](#MUC_Ignoring)
      * [2.28.1 ::plugins::mucignore::options(transient\_rules)](#pluginsmucignoreoptionstransient_rules)
   * [2.29 Stylecodes](#Stylecodes)
      * [2.29.1 ::plugins::stylecodes::options(emphasize)](#pluginsstylecodesoptionsemphasize)
      * [2.29.2 ::plugins::stylecodes::options(hide\_markup)](#pluginsstylecodesoptionshide_markup)
   * [2.30 Vcard](#Vcard)
* [3 Conference Info](#Conference_Info)
   * [3.1 ::plugins::conferenceinfo::options(autoask)](#pluginsconferenceinfooptionsautoask)
   * [3.2 ::plugins::conferenceinfo::options(interval)](#pluginsconferenceinfooptionsinterval)
   * [3.3 ::plugins::conferenceinfo::options(err\_interval)](#pluginsconferenceinfooptionserr_interval)
* [4 File Transfer](#File_Transfer)
   * [4.1 ::ft::options(download\_dir)](#ftoptionsdownload_dir)
   * [4.2 ::ft::options(default\_proto)](#ftoptionsdefault_proto)
   * [4.3 HTTP](#HTTP)
      * [4.3.1 ::plugins::http::options(port)](#pluginshttpoptionsport)
      * [4.3.2 ::plugins::http::options(host)](#pluginshttpoptionshost)
   * [4.4 Jidlink](#Jidlink)
      * [4.4.1 ::jidlink::transport(allowed,dtcp-active)](#jidlinktransportalloweddtcp-active)
      * [4.4.2 ::jidlink::transport(allowed,dtcp-passive)](#jidlinktransportalloweddtcp-passive)
      * [4.4.3 ::jidlink::transport(allowed,inband-bytestream)](#jidlinktransportallowedinband-bytestream)
   * [4.5 Stream Initiation](#Stream_Initiation)
      * [4.5.1 ::si::socks5::initiator::options(enable\_mediated\_connection)](#sisocks5initiatoroptionsenable_mediated_connection)
      * [4.5.2 ::si::socks5::initiator::options(proxy\_servers)](#sisocks5initiatoroptionsproxy_servers)
      * [4.5.3 ::si::transport(allowed,http://jabber.org/protocol/bytestreams)](#sitransportallowedhttp__jabber.org_protocol_bytestreams)
      * [4.5.4 ::si::transport(allowed,http://jabber.org/protocol/iqibb)](#sitransportallowedhttp__jabber.org_protocol_iqibb)
      * [4.5.5 ::si::transport(allowed,http://jabber.org/protocol/ibb)](#sitransportallowedhttp__jabber.org_protocol_ibb)
* [5 GPGME](#GPGME)
   * [5.1 ::ssj::options(one-passphrase)](#ssjoptionsone-passphrase)
   * [5.2 ::ssj::options(sign-traffic)](#ssjoptionssign-traffic)
   * [5.3 ::ssj::options(encrypt-traffic)](#ssjoptionsencrypt-traffic)
   * [5.4 ::ssj::options(key)](#ssjoptionskey)
   * [5.5 ::ssj::options(display\_sig\_warnings)](#ssjoptionsdisplay_sig_warnings)
* [6 Main Interface](#Main_Interface)
   * [6.1 ::ifacetk::options(use\_tabbar)](#ifacetkoptionsuse_tabbar)
   * [6.2 ::ifacetk::options(tabs\_side)](#ifacetkoptionstabs_side)
   * [6.3 ::ifacetk::options(tab\_minwidth)](#ifacetkoptionstab_minwidth)
   * [6.4 ::ifacetk::options(tab\_maxwidth)](#ifacetkoptionstab_maxwidth)
   * [6.5 ::ifacetk::options(show\_toolbar)](#ifacetkoptionsshow_toolbar)
   * [6.6 ::ifacetk::options(show\_presencebar)](#ifacetkoptionsshow_presencebar)
   * [6.7 ::ifacetk::options(show\_statusbar)](#ifacetkoptionsshow_statusbar)
   * [6.8 ::ifacetk::options(raise\_new\_tab)](#ifacetkoptionsraise_new_tab)
   * [6.9 ::ifacetk::options(message\_numbers\_in\_tabs)](#ifacetkoptionsmessage_numbers_in_tabs)
   * [6.10 ::ifacetk::options(update\_title\_delay)](#ifacetkoptionsupdate_title_delay)
   * [6.11 ::ifacetk::options(show\_tearoffs)](#ifacetkoptionsshow_tearoffs)
   * [6.12 ::ifacetk::options(closebuttonaction)](#ifacetkoptionsclosebuttonaction)
   * [6.13 ::pixmaps::options(pixmaps\_theme)](#pixmapsoptionspixmaps_theme)
   * [6.14 ::webbrowser](#webbrowser)
   * [6.15 Systray](#Systray)
      * [6.15.1 Общие настройки](#Общие_настройки)


      * [6.15.2 Настройки расширений работы с треем](#Настройки_расширений_работы_с_треем)


* [7 IQ](#IQ)
   * [7.1 ::iq::options(show\_iq\_requests)](#iqoptionsshow_iq_requests)
   * [7.2 ::iq::options(shorten\_iq\_namespaces)](#iqoptionsshorten_iq_namespaces)
   * [7.3 ::plugins::options(reply\_iq\_last)](#pluginsoptionsreply_iq_last)
   * [7.4 ::plugins::ping::options(ping)](#pluginspingoptionsping)
   * [7.5 ::plugins::ping::options(timeout)](#pluginspingoptionstimeout)
   * [7.6 ::plugins::ping::options(pong)](#pluginspingoptionspong)
   * [7.7 ::plugins::options(reply\_iq\_time)](#pluginsoptionsreply_iq_time)
   * [7.8 ::plugins::options(reply\_xmpp\_time)](#pluginsoptionsreply_xmpp_time)
   * [7.9 ::plugins::options(reply\_iq\_version)](#pluginsoptionsreply_iq_version)
   * [7.10 ::plugins::options(reply\_iq\_os\_version)](#pluginsoptionsreply_iq_os_version)
   * [7.11 ::muc::options(report\_muc\_rooms)](#mucoptionsreport_muc_rooms)
* [8 Login](#Login)
   * [8.1 ::::loginconf(user)](#loginconfuser)
   * [8.2 ::::loginconf(server)](#loginconfserver)
   * [8.3 ::::loginconf(password)](#loginconfpassword)
   * [8.4 ::::loginconf(resource)](#loginconfresource)
   * [8.5 ::::loginconf(priority)](#loginconfpriority)
   * [8.6 ::::loginconf(connect\_forever)](#loginconfconnect_forever)
   * [8.7 ::::loginconf(allowauthplain)](#loginconfallowauthplain)
   * [8.8 ::::loginconf(allowgoogletoken)](#loginconfallowgoogletoken)
   * [8.9 ::::loginconf(usesasl)](#loginconfusesasl)
   * [8.10 ::::loginconf(stream\_options)](#loginconfstream_options)
   * [8.11 ::::loginconf(sslcertfile)](#loginconfsslcertfile)
   * [8.12 ::::loginconf(sslcacertstore)](#loginconfsslcacertstore)
   * [8.13 ::::loginconf(sslkeyfile)](#loginconfsslkeyfile)
   * [8.14 ::::loginconf(proxy)](#loginconfproxy)
   * [8.15 ::::loginconf(proxyhost)](#loginconfproxyhost)
   * [8.16 ::::loginconf(proxyport)](#loginconfproxyport)
   * [8.17 ::::loginconf(proxyusername)](#loginconfproxyusername)
   * [8.18 ::::loginconf(proxypassword)](#loginconfproxypassword)
   * [8.19 ::::loginconf(proxyuseragent)](#loginconfproxyuseragent)
   * [8.20 ::::loginconf(usealtserver)](#loginconfusealtserver)
   * [8.21 ::::loginconf(altserver)](#loginconfaltserver)
   * [8.22 ::::loginconf(altport)](#loginconfaltport)
   * [8.23 ::::loginconf(replace\_opened)](#loginconfreplace_opened)
   * [8.24 ::::loginconf(usehttppoll)](#loginconfusehttppoll)
   * [8.25 ::::loginconf(pollurl)](#loginconfpollurl)
   * [8.26 ::::loginconf(usepollkeys)](#loginconfusepollkeys)
   * [8.27 ::::loginconf(numberofpollkeys)](#loginconfnumberofpollkeys)
   * [8.28 ::::loginconf(polltimeout)](#loginconfpolltimeout)
   * [8.29 ::::loginconf(pollmin)](#loginconfpollmin)
   * [8.30 ::::loginconf(pollmax)](#loginconfpollmax)
* [9 Messages](#Messages)
   * [9.1 ::plugins::headlines::options(cache)](#pluginsheadlinesoptionscache)
   * [9.2 ::plugins::headlines::options(multiple)](#pluginsheadlinesoptionsmultiple)
   * [9.3 ::plugins::headlines::options(display\_subject\_only)](#pluginsheadlinesoptionsdisplay_subject_only)
   * [9.4 ::plugins::headlines::options(timestamp\_format)](#pluginsheadlinesoptionstimestamp_format)
   * [9.5 ::plugins::headlines::options(show\_balloons)](#pluginsheadlinesoptionsshow_balloons)
   * [9.6 ::plugins::offline::options(flexible\_retrieval)](#pluginsofflineoptionsflexible_retrieval)
* [10 Plugins](#Plugins)
* [11 Privacy](#Privacy)
   * [11.1 ::filters::options(enable)](#filtersoptionsenable)
   * [11.2 ::privacy::options(activate\_at\_startup)](#privacyoptionsactivate_at_startup)
   * [11.3 MUC Ignoring](#MUC_Ignoring)
      * [11.3.1 ::plugins::mucignore::options(transient\_rules)](#pluginsmucignoreoptionstransient_rules)
* [12 Remote Control](#Remote_Control)
   * [12.1 ::remote::options(enable)](#remoteoptionsenable)
   * [12.2 ::remote::options(accept\_from\_myjid)](#remoteoptionsaccept_from_myjid)
   * [12.3 ::remote::options(accept\_list)](#remoteoptionsaccept_list)
* [13 Roster](#Roster)
   * [13.1 ::ifacetk::roster::use\_aliases](#ifacetkrosteruse_aliases)
   * [13.2 ::ifacetk::roster::show\_only\_online](#ifacetkrostershow_only_online)
   * [13.3 ::ifacetk::roster::show\_transport\_icons](#ifacetkrostershow_transport_icons)
   * [13.4 ::ifacetk::roster::show\_transport\_user\_icons](#ifacetkrostershow_transport_user_icons)
   * [13.5 ::ifacetk::roster::options(nested)](#ifacetkrosteroptionsnested)
   * [13.6 ::ifacetk::roster::options(nested\_delimiter)](#ifacetkrosteroptionsnested_delimiter)
   * [13.7 ::ifacetk::roster::options(show\_own\_resources)](#ifacetkrosteroptionsshow_own_resources)
   * [13.8 ::ifacetk::roster::options(chats\_group)](#ifacetkrosteroptionschats_group)
   * [13.9 ::ifacetk::roster::options(use\_filter)](#ifacetkrosteroptionsuse_filter)
   * [13.10 ::ifacetk::roster::options(match\_jids)](#ifacetkrosteroptionsmatch_jids)
   * [13.11 ::ifacetk::roster::options(free\_drop)](#ifacetkrosteroptionsfree_drop)
   * [13.12 ::ifacetk::roster::options(show\_subscription)](#ifacetkrosteroptionsshow_subscription)
   * [13.13 ::ifacetk::roster::options(show\_conference\_user\_info)](#ifacetkrosteroptionsshow_conference_user_info)
* [14 Sound](#Sound)
* [15 State](#State)
* [16 Warnings](#Warnings)
   * [16.1 ::tls\_warnings](#tls_warnings)

## <a id="AutoAway"></a>AutoAway
Параметры модуля, автоматически устанавливающего состояние "Отошёл" после
установленного периода бездействия. Для того, чтобы у вас автоэвей работал,
необходимо установить [дополнительный пакет](http://tkabber.jabber.ru/dependencies) (кстати говоря, без него и пункт
настроек этот не появится). Об установке пакета в Виндовс можно почитать
[**здесь**](Tkabber_Windows_Mini_HOWTO.md#WinIdle). И вот до кучи
[**дополнительное чтиво**](Ткаббер_ЧаВо/Глюки.md#Ткаббер_постоянно_держит_меня_в_состоянии_отошёл_away)
о возможных проблемах с AutoAway.

Имейте в виду, что автоэвей в Ткаббере следит за неактивностью прользователя в
масштабах системы, а не самого Ткаббера, поэтому если излишек нервных клеток
заставил вас запустить Doom 3, перед этим выставьте руками статус "Отошёл" или
"Отошёл давно" иначе для остальных вы продолжите оставаться доступным даже
будучи на [Фобосе](http://en.wikipedia.org/wiki/Doom_(video_game)).
(Справляться со статусами доступности может помочь
[**этот плагин**](Плагины.md#Customstatus).)

### <a id="pluginsautoawayoptionsawaytime"></a>::plugins::autoaway::options(awaytime)

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

### <a id="pluginsautoawayoptionsxatime"></a>::plugins::autoaway::options(xatime)

То же самое, но для состояния "Отошёл давно". По умолчанию стоит 15 минут.

### <a id="pluginsautoawayoptionsstatus"></a>::plugins::autoaway::options(status)

В этом поле можно дать описание статуса, то есть, причину, по которой Ткаббер
перешёл в состояние Away. По умолчанию там написано "Автоматически в состоянии
'отошёл' по бездействию", однако вы можете написать что-нибудь своё, не
забывая, впрочем, отразить факт **автоматической** смены статуса.

### <a id="pluginsautoawayoptionsdrop_priority"></a>::plugins::autoaway::options(drop\_priority)

По умолчанию галочка отмечена, и действие её — сбрасывать приоритет в 0 при
достижении состояния "Отошёл давно". Что такое приоритет,
[**читайте отдельно**](Ткаббер_ЧаВо/Разное.md#Приоритет).

## <a id="Chat"></a>Chat
Параметры разговора.

### <a id="chatoptionsstop_scroll"></a>::chat::options(stop\_scroll)

Эта опция в настройках идёт второй, но здесь мы опишем её раньше, чтобы вам
было понятней, что к чему. По умолчанию она выключена, и это правильно: если её
включить, то при получении новых сообщений в чат окошко скроллиться не будет, и
вам придётся прокручивать его вручную (с помощью полосы прокрутки или колесом
мыши), чтобы следить за разговором.


### <a id="chatoptionssmart_scroll"></a>::chat::options(smart\_scroll)

Если автопрокрутка у нас включена, имеет смысл улучшить её поведение. Умная
прокрутка следит, где вы в данный момент читаете сообщения разговора: если вы
выдите самое последнее сообщение, то приход нового сообщения сдвинет уже
имеющиеся в окне вверх (сработает прокрутка) и вы увидите это новое сообщение,
если же вы читаете ход дискуссии где-то в её середине и не видите последнего
сообщения, то поступление нового ничего прокручивать не будет, не отрывая вас
от созерцания интересной вам части излитого потока сознания.

### <a id="chatoptionsdisplay_status_description"></a>::chat::options(display\_status\_description)

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

### <a id="chatoptionsdefault_message_type"></a>::chat::options(default\_message\_type)

По умолчанию стоит "Разговор". Это означает, что при двойном клике на контакте
из ростера у вас запустится окно разговора в виде нового таба (или же нового
окна разговора, если у вас отключён режим с табами). Если же включить опцию
"Обычное", то при двойном клике запускается окно отправки сообщения, которое
пропадёт после его отправки. Окно разговора при отправке сообщения не
закрывается.

### <a id="chatoptionsgen_status_change_msgs"></a>::chat::options(gen\_status\_change\_msgs)

Значение по умолчанию — включено, что означает "Генерировать сообщения о том,
что собеседник сменил своё присутствие или статусное сообщение". Сообщения о
смене статуса появляются в самом окне или табе разговора (не путайте с окном
конференции): "[Чтв. Апрель 17 22:19]--- bigote свободен для разговора
(Свободен для разговора)". Эта опция может быть полезной для мягкого шпионажа
за вашими собеседниками.

### <a id="pluginscompletionoptionscompletion_expire"></a>::plugins::completion::options(completion\_expire)

Число сообщений, необходимое для того, чтобы отключить автодополнение
псевдонима автора последнего сообщения, адресованного персонально. По умолчанию
стоит 10. Сейчас расшифруем, что это означает. В Ткаббере можно слать
персональные сообщения в общем чате. Для этого надо либо ткнуть в ник человека
мышью, либо набрать первые символы его ника и нажать табуляцию. При этом в окне
ввода сообщения появится его ник, отделённый от последующего текста двоеточием
и пробелом. Теперь пишите свой текст, жмите ввод, и этот человек увидит свой
ник в этом сообщении подсвеченным и, если включен звук и настроено уведомление
о персональных сообщениях, то услышит, что кто-то персонально к нему обратился.
Этот человек теперь может легко ответить так же персонально и вам, просто нажав
табуляцию: при этом ваш ник окажется в его окошке ввода текста, и история
повторится. Так вот. Если он сразу не воспользуется этой возможностью, то после
прихода в чат 10 сообщений и больше нажатие табуляции выведет уже первую
доступную по алфавиту команду Ткаббера или социал.

### <a id="pluginsoptionstimestamp_format"></a>::plugins::options(timestamp\_format)

Формат вывода даты/времени в сообщениях. (Подробнее описание формата можно
узнать из документации к команде Tcl 'clock'.) Значение по умолчанию — [%R],

что означает лишь часы и минуты. Это мало. В конференциях можно сидеть днями, и

тогда бывает необходимо знать, какого числа (а то и месяца) была сказана та или

иная фраза. Если не хотите читать документацию к команде 'clock', можете
воспользоваться либо примерами, приведёнными рядом с опцией, либо моим выбором:
[%a %b %d %H:%M].


### <a id="pluginsoptionsdelayed_timestamp_format"></a>::plugins::options(delayed\_timestamp\_format)

Формат "отложенных" сообщений, то есть отправленных более суток назад. Это те
сообщения, которые ваши приятели шлют вам, когда вы долго не появляетесь в
онлайне, и они начинают волноваться, жмакать кнопку "Показать пользователей в
оффлайне" и интересоваться причинами вашего отсутствия. Значение по умолчанию —
[%m/%d %R]. Обычно его хватает.

### <a id="pluginsxhtmloptionsenable"></a>::plugins::xhtml::options(enable)

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

### <a id="pluginslog_on_openoptionsmax_messages"></a>::plugins::log\_on\_open::options(max\_messages)

Максимальное число запротоколированных сообщений, которое надо показывать во

вновь открываемом окне разговора (если положить отрицательным, то
неограниченное). По умолчанию стоит 20. Когда мы открываем окно разговора с
каким-либо из своих контактов, в окне появляется кусок предыдущей с ним беседы,
что весьма полезно, если эта предыдущая беседа состоялась месяц назад, и с того
момента собеседник вдруг ответил на вашу последнюю реплику. Если вы не помните,
о чём был разговор, трудно бывает врубиться, с какого перепугу он вам пишет эту
муть.

### <a id="pluginslog_on_openoptionsmax_interval"></a>::plugins::log\_on\_open::options(max\_interval)

Максимальный интервал (в часах) для которого запротоколированные сообщения надо
показывать во вновь открываемом окне разговора (если положить отрицательным, то
неограниченный интервал). По умолчанию стоит 24 часа, что для описанного выше
случая с разрывом в один месяц явно не подходит. Надо поставить отрицательное
значение.

### <a id="pluginsnickcolorsoptionsuse_colored_nicks"></a>::plugins::nickcolors::options(use\_colored\_nicks)


Использовать цветные псевдонимы в окнах разговоров/конференций.


### <a id="pluginsnickcolorsoptionsuse_colored_roster_nicks"></a>::plugins::nickcolors::options(use\_colored\_roster\_nicks)


Использовать цветные псевдонимы в списках участников конференций.


### <a id="pluginsnickcolorsoptionsuse_colored_messages"></a>::plugins::nickcolors::options(use\_colored\_messages)

Использовать цветные сообщения в окнах разговора. Эта и предыдущие две опции
отвечает за раскрашивание ников собеседников и их сообщений. Эти опции из
разряда тех, которые проще попробовать, чем читать о них или рассказывать. Так
что оставляем вас наедине с ними ;) И вот до кучи
[**информация о возможных проблемах**](Ткаббер_ЧаВо/Внешний_вид_и_звук.md#Цвета_сообщений_асечников),
связанных с цветами.

### <a id="mucoptionsgen_enter_exit_msgs"></a>::muc::options(gen\_enter\_exit\_msgs)

Генерировать статусные сообщения о входе/выходе участников в MUC-конференциях.
Выше описывалась опция генерации сообщений о смене статуса собеседника. Она
похожа на эту, только здесь генерируются сообщения вида "bigote вышел(а) из
комнаты: Disconnected", которые показываются в общем чате (другие названия:
конференция, MUC). По умолчанию стоит, и правильно делает, что стоит. Так мы
знаем, кто и во сколько заходил в конфу и покидал её.


### <a id="mucoptionsgen_muc_status_change_msgs"></a>::muc::options(gen\_muc\_status\_change\_msgs)

А это — близнец описанной гораздо выше и упомянутой чуть выше опции про
генерацию смены статусов. На этот раз — в MUC (Multi-User Conference).


### <a id="mucoptionsgen_muc_position_change_msgs"></a>::muc::options(gen\_muc\_position\_change\_msgs)

Генерировать сообщения о том, что положение, занимаемое участником конференции
(его ранг и/или роль), изменились. Ещё одна шпионская опция. Эта и предыдущая
опции по умолчанию выключены, потому что надоедают больше, чем приносят пользы.

### <a id="mucoptionspropose_configure"></a>::muc::options(propose\_configure)

Предлагать конфигурировать вновь созданную конференцию. Если установить в
false, то автоматически принимается конфигурация по умолчанию. Как ясно из
описания опции, она про конфигурацию созданных вами конференций. Поскольку по
умолчанию она выключена, не забывайте при создании новой комнаты зайти в её
меню (кнопка "Тема" в верхней части окна, которая выглядит совсем не кнопкой) и
настроить её (**MUC → Конфигурировать комнату**).

### <a id="mucoptionshistory_maxchars"></a>::muc::options(history\_maxchars)

Максимальное число символов в запрашиваемой истории конференции, совместимой с
MUC. По умолчанию 10000. Это напоминает описанную выше опцию про вывод старых
разговоров в свежеоткрытом окне. Отличие состоит в том, что тут история
выводится даже в том случае, если вы зашли в комнату впервые в жизни. Это
делается для того, чтобы вы были в курсе, о чём идёт беседа. Если история вам
мешает, вы её можете либо ограничить, либо отключить, вписав 0.

Важно понимать, что эта и следующие две опции управляют получением истории _с
сервера,_ в то время как опции группы `::plugins::log_on_open::options` ведают
выемкой сообщений из локальной истории разговоров, которую ведёт Ткаббер.

### <a id="mucoptionshistory_maxstanzas"></a>::muc::options(history\_maxstanzas)

То же самое, что и предыдущая опция, но уже не про количество символов, а про
количество строк в истории. Если быть точным, то речь идёт не о строках как
таковых, а о [**"станцах"**](Терминология.md#Станца_stanza), то есть отправленных в
конференцию сообщениях. Так, одно сообщение может содержать несколько строк, но
считаться будет всего одна станца. По умолчанию (и кажется, по максимуму тоже)
20.

### <a id="mucoptionsrequest_only_unseen_history"></a>::muc::options(request\_only\_unseen\_history)

Запрашивать только те сообщения из истории, которые не показаны в уже открытом
окне (для конференции, совместимой с MUC). Это на случай кратковременного
дисконнекта. Допустим, вы брыкнули ногой и выдернули сетевой кабель, однако
вовремя спохватились и быстро воткнули его обратно. Однако часть разговора
прошла без вас. Спасибо предыдущим двум опциям, она не потерялась, и сервер
заботливо её вам вывел. Но тут вот и фишка данной опции: если история
"перехлёстывается" с содержимым открытого окна чата, то вам в окно выведутся
только те фразы, которые прозвучали, когда вас реально не было, а не все 20
строчек и 10000 символов, прибитые гвоздями предыдущими опциями.

### <a id="pluginstclchatoptionsuse_tkchat_colors"></a>::plugins::tclchat::options(use\_tkchat\_colors)

Использовать встроенные цвета TkChat. Это не вам, дорогие начинающие
пользователи. Это вот [им](http://wiki.tcl.tk/tkchat).

---

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

### <a id="Chatstate"></a>Chatstate

Настройки расширения, отвечающего за уведомление о состоянии окна разговора.

#### <a id="pluginschatstateoptionsenable"></a>::plugins::chatstate::options(enable)

Включить рассылку уведомлений о состоянии окна разговора
([XEP-0085](http://www.xmpp.org/extensions/xep-0085.html)). Если вы включите
эту опцию, то будете получать уведомления типа "собеседник пишет письмо
турецкому султану" в верхней части окна. Таким образом вы знаете, что он не
балду гоняет, не игнорит вас, а честно пишет ответ. Полезная опция.

В настоящее время Ткаббер способен посылать только два состояния: `<active/>` и
`<composing/>` (на что уже пожаловались
[тут](http://www.jabber.ru/bugzilla/show_bug.cgi?id=360)), однако понимает он
все состояния.

Имейте в виду, что в Ткаббере есть
[**аналогичная настройка**](#Events), управляющая _другим механизмом_ реализации той
же самой, в принципе, функциональности, но на основе устаревшего в настоящее
время [расширения XMPP](http://www.xmpp.org/extensions/xep-0022.html).

### <a id="Emoticons"></a>Emoticons

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

#### <a id="pluginsemoticonsoptionsshow_emoticons"></a>::plugins::emoticons::options(show\_emoticons)

Показывать эмоциконки в виде картинок.

#### <a id="pluginsemoticonsoptionstheme"></a>::plugins::emoticons::options(theme)

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

#### <a id="pluginsemoticonsoptionsmatch_whole_word"></a>::plugins::emoticons::options(match\_whole\_word)

Только целые слова превращать в эмоциконки (не части слов). Этот параметр
установлен по умолчанию, а отвечает он за то, чтобы в картинку преобразовывался
лишь полноценный смайлик, не прижатый к впереди идущему слову.

#### <a id="pluginsemoticonsoptionshandle_lol"></a>::plugins::emoticons::options(handle\_lol)

Отдельные очень улыбчивые личности любят писать в чатах смайлики с двойными, а
то и тройными подбородками — :)))))) Эта опция приводит такие улыбки к
нормальному виду и потом преобразует в нормальный графический смайл.

### <a id="Events"></a>Events



Настройки расширения, отвечающего за уведомление об обработке сообщений в окне
разговора.

#### <a id="pluginseventsoptionsenable"></a>::plugins::events::options(enable)

Реализация устаревшего в настоящее время
[XEP-0022](http://www.xmpp.org/extensions/xep-0022.html), которое было замещено
другим механизмом, который управляется [**соответствующей группой настроек**](#Chatstate).

Эту опцию имеет смысл держать включённой только если вы общаетесь с владельцами
дремучих клиентов.

![(!)](../images/Hammer.png) **Сделать:** хорошо бы выяснить что гейтуют и что
не гейтуют из этого распространённые ICQ-гейты

По умолчанию включена.

### <a id="Highlight"></a>Highlight

Настройки модуля выделения слов в сообщениях конференций.

#### <a id="pluginshighlightoptionsenable_highlighting"></a>::plugins::highlight::options(enable\_highlighting)





Включить модуль выделения слов. По умолчанию включён.

#### <a id="pluginshighlightoptionshighlight_nick"></a>::plugins::highlight::options(highlight\_nick)

Выделять текущий псевдоним в сообщениях. Выше я рассказал про автодополнение
ников, опция ::plugins::completion::options(completion\_expire). Там приводил
пример о подсвечивании собственного ника, если кто-то его в чате пишет
(например, обращаясь ко мне). Вот здесь оно и настраивается, то бишь, это
подсвечивание можно и выключить.

#### <a id="pluginshighlightoptionshighlight_substrings"></a>::plugins::highlight::options(highlight\_substrings)

Подстроки, которые следует выделять в сообщениях. Ещё один полушпионский
модуль, позволяет подсвечивать ключевые слова, указанные в поле. Разделителем

является пробел, регистр надо учитывать. Введём для примера три слова,

разделённых пробелами: **вот такой тест**. Теперь любое из этих слов,

появившись в окне чата, будет подсвечено. Если попытаться подсвечивать не

отдельные слова, а подстроку, содержащую пробелы (несколько слов), то возникают

проблемы. Допустим, мы пытаемся указать Ткабберу, что подстрока ограничена

кавычками (как для точного поиска в Гугле): **"вот такой тест"**. Теперь пишем
в чате одно из этих слов — не подсвечивает. Пишем строку целиком, но без
кавычек: **вот такой тест** — не подсвечивает. Пишем строку с кавычками: **"вот

такой тест"** — подсвечивает.


#### <a id="pluginshighlightoptionshighlight_whole_words"></a>::plugins::highlight::options(highlight\_whole\_words)

Выделять только целые слова. Если выключить эту опцию (а по умолчанию она
включена), то подсвечиваться будут как целые слова, так и части слов,
подпадающие под заданные вами паттерны. Например, продолжая начатый выше
пример, напишем в чате слово "живот", имея в качестве ключевых слов **вот такой
тест**. При включённой опции ничего не выделится, но если её отключить, то
получим "жи**вот**" (кавычки здесь написаны лишь для отделения слова-примера от
повествования).

### <a id="Logging"></a>Logging

Параметры протоколирования.

#### <a id="loggeroptionslogdir"></a>::logger::options(logdir)

Директория, в которой сохраняются протоколы. Надо указать что-нибудь
осмысленное.


#### <a id="loggeroptionslog_chat"></a>::logger::options(log\_chat)


Сохранять протоколы персональных разговоров. По умолчанию включено.


#### <a id="loggeroptionslog_groupchat"></a>::logger::options(log\_groupchat)

Сохранять протоколы конференций.  По умолчанию включено.

### <a id="MUC_Ignoring"></a>MUC Ignoring

Игнорирование групповых и приватных сообщений от выбранных посетителей
многопользовательской конференции.

#### <a id="pluginsmucignoreoptionstransient_rules"></a>::plugins::mucignore::options(transient\_rules)

Если параметр установлен, то все изменения правил игнорирования будут
действовать только до того, как Ткаббер закроется, и не будут восстановлены при
следующем запуске. По умолчанию выключено, то есть, правила сохраняются.
[**Читать подробнее об игнорировании в конференциях**](MUC_Ignore.md).

### <a id="Stylecodes"></a>Stylecodes

Обработка стилевых кодов. Стилевые коды — это специальные символы для выделения
частей текста полужирным, курсивным или подчеркнутым начертанием и их
комбинациями.

#### <a id="pluginsstylecodesoptionsemphasize"></a>::plugins::stylecodes::options(emphasize)

Выделять сообщения со стилевыми кодами, используя разные шрифты. Про это вы
уже, надеюсь, [**прочитали**](Начинающим.md#Некоторые_полезные_команды).

#### <a id="pluginsstylecodesoptionshide_markup"></a>::plugins::stylecodes::options(hide\_markup)

Скрывать символы, задающие разметку стилевых кодов. Выделяет точно так же, как
и в предыдущей опции, но при этом ещё и показывает сами управляющие коды, то
есть, мы так и видим: __\*жирный текст\*__.

Эту опцию полезно включить тем, кому нравится использовать/видеть выделение
стайлкодами, но кто так же достаточно часто пишет/видит текст, который вызывает
"ложные срабатывания" движка, ответственного за "отлов" символов разметки,
определяющих выделения. Например, наиболее известная проблема движка стайлкодов
— срабатывание на именах каталогов Unix: `/usr/share/` отображается как
`/usr`*<code>share</code>*; если же данная опция включена, вы будете видеть `/usr`*`/share/`*.

С другой стороны, имейте в виду, что скрытые символы разметки стайлкодов не
влияют на текст, который помещается в буфер обмена при копировании: если вы
выделите описанный выше текст `/usr`*<code>share</code>* и затем вставите его куда-нибудь,
то вставлен будет текст `/usr/share/`, а не `/usrshare`.

### <a id="Vcard"></a>Vcard

Параметры отображения полей vCard в окне разговора. Зайдя внутрь, вы выпадете в
осадок. Там находится здоровенный список опций, позволяющих настроить внешний
вид, а точнее, показ нужных вам полей vCard. Если вы хотите быть готовыми к
любой, даже самой полной карточке, надо включить все поля. Если вы точно
уверены, что никто из ваших собеседников не будет пользоваться телефоном ISDN,
то можно соответствующее поле отключить.

## <a id="Conference_Info"></a>Conference Info
Параметры модуля информации о конференциях, позволяющего видеть список
участников конференции, закладка на которую находится в вашем списке контактов,
во всплывающем окне, независимо от того, подключены Вы к конференции или нет.

### <a id="pluginsconferenceinfooptionsautoask"></a>::plugins::conferenceinfo::options(autoask)

Подключить данный модуль. По умолчанию он отключён. Надеюсь, понятно, зачем он
нужен (см. чуть выше). Осторожнее с этой фичей: она гонит неслабый трафик.

### <a id="pluginsconferenceinfooptionsinterval"></a>::plugins::conferenceinfo::options(interval)

Интервал (в минутах) между запросами списка участников. Если вы мигрировали на
новую версию Ткаббера с какой-нибудь старой, и у вас остались старые настройки
в конфиге, проверьте интервал обновления. Старые настройки были в секундах, и
если нынешний Ткаббер начнёт запрашивать списки с интервалом в 300 минут,
пользы от такой опции мало :)

### <a id="pluginsconferenceinfooptionserr_interval"></a>::plugins::conferenceinfo::options(err\_interval)

Интервал (в минутах) после ошибки в ответ на запрос списка участников. В старых
настройках по умолчанию стояло 3600 (секунд), так что если вы переехали со
старой версии Ткаббера, напишите в этом поле 60.

## <a id="File_Transfer"></a>File Transfer
Параметры передачи файлов. Тема эта интересная, но сложноватая для новичка.
Подробнее о пересылке файлов можно почитать в
[**этой статье**](Пересылка_файлов__теория.md).

### <a id="ftoptionsdownload_dir"></a>::ft::options(download\_dir)

Директория в которой по умолчанию сохраняются полученные файлы.

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

### <a id="ftoptionsdefault_proto"></a>::ft::options(default\_proto)

Протокол передачи файлов по умолчанию. Здесь уже установлен Stream Initiation,
и он обычно подходит для большинства соединений. Если у вас проблемы при
передаче файлов, чтения вышеупомянутой статьи не избежать.

---

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

### <a id="HTTP"></a>HTTP

Параметры HTTP-транспорта.

#### <a id="pluginshttpoptionsport"></a>::plugins::http::options(port)

Порт для исходящей передачи файлов по HTTP (если равен 0, то выбирается
автоматически). Применяется, когда файл посылается через NAT через
пробрасываемый порт. По умолчанию стоит 0.

#### <a id="pluginshttpoptionshost"></a>::plugins::http::options(host)

Объявлять указанное имя (или IP-адрес) для исходящей передачи файлов по HTTP.

### <a id="Jidlink"></a>Jidlink

Настройки Jidlink. Jidlink — устаревший протокол, по-видимому, кроме Ткаббера
нигде и не реализованный, но тем не менее может использоваться на связке
Ткаббер-Ткаббер, если остальные варианты не работают.

#### <a id="jidlinktransportalloweddtcp-active"></a>::jidlink::transport(allowed,dtcp-active)

Разрешить использование Jidlink-транспорта dtcp-active. По умолчанию включён.

#### <a id="jidlinktransportalloweddtcp-passive"></a>::jidlink::transport(allowed,dtcp-passive)

Разрешить использование Jidlink-транспорта dtcp-passive. По умолчанию выключён.

#### <a id="jidlinktransportallowedinband-bytestream"></a>::jidlink::transport(allowed,inband-bytestream)

Разрешить использование Jidlink-транспорта inband-bytestream. По умолчанию
включён.

### <a id="Stream_Initiation"></a>Stream Initiation



Параметры SI-транспорта.

#### <a id="sisocks5initiatoroptionsenable_mediated_connection"></a>::si::socks5::initiator::options(enable\_mediated\_connection)

Использовать соединение SOCKS5 через посредника, если он доступен. Включён.

#### <a id="sisocks5initiatoroptionsproxy_servers"></a>::si::socks5::initiator::options(proxy\_servers)

Список прокси-серверов для передачи потока SOCKS5 (попытка использовать в
качестве посредника будет предпринята для всех доступных серверов). Тут уже
прописаны некоторые сервера. Если что-то идёт не так, можете попробовать
указать свои.

#### <a id="sitransportallowedhttp__jabber.org_protocol_bytestreams"></a>::si::transport(allowed,[http://jabber.org/protocol/bytestreams](http://jabber.org/protocol/bytestreams))

Разрешить использование SI-транспорта
[http://jabber.org/protocol/bytestreams](http://jabber.org/protocol/bytestreams).
Включён.

#### <a id="sitransportallowedhttp__jabber.org_protocol_iqibb"></a>::si::transport(allowed,[http://jabber.org/protocol/iqibb](http://jabber.org/protocol/iqibb))

Разрешить использование SI-транспорта
[http://jabber.org/protocol/iqibb](http://jabber.org/protocol/iqibb). Тоже
включён.

#### <a id="sitransportallowedhttp__jabber.org_protocol_ibb"></a>::si::transport(allowed,[http://jabber.org/protocol/ibb](http://jabber.org/protocol/ibb))

Разрешить использование SI-транспорта
[http://jabber.org/protocol/ibb](http://jabber.org/protocol/ibb). Тоже включён.

## <a id="GPGME"></a>GPGME
Параметры GPGME (цифровая подпись и шифрование). Для того, чтобы шифрование в
Ткаббере заработало и этот пункт настроек появился у вас, необходимо
[установить необходимые пакеты](http://tkabber.jabber.ru/gpg). Учтите, что
шифрование в Ткаббере возможно только в Linux.
[**Читайте дополнительно по теме**](Ткаббер_ЧаВо/Глюки.md#Шифрование_в_Ткаббере_проблемы_с_gpgme_tclgpgme).

### <a id="ssjoptionsone-passphrase"></a>::ssj::options(one-passphrase)

Использовать одну и ту же парольную фразу для подписи и шифрования сообщений.

### <a id="ssjoptionssign-traffic"></a>::ssj::options(sign-traffic)

Подписывать исходящие сообщения и обновления присутствия с помощью
[GPG](http://www.gnupg.org).

### <a id="ssjoptionsencrypt-traffic"></a>::ssj::options(encrypt-traffic)

Шифровать исходящие сообщения с помощью GPG, если возможно.

### <a id="ssjoptionskey"></a>::ssj::options(key)

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

### <a id="ssjoptionsdisplay_sig_warnings"></a>::ssj::options(display\_sig\_warnings)

Показывать предупреждения в случае неудачи при проверке подписи.

## <a id="Main_Interface"></a>Main Interface
Параметры основного интерфейса.

### <a id="ifacetkoptionsuse_tabbar"></a>::ifacetk::options(use\_tabbar)

Использовать интерфейс с вкладками ("табами"). По умолчанию включён. После
применения требуется рестарт.

### <a id="ifacetkoptionstabs_side"></a>::ifacetk::options(tabs\_side)





Сторона, с которой следует размещать заголовки вкладок в режиме с вкладками. По
умолчанию стоит "Сверху". Остальные возможные варианты — "Снизу", "Слева",
"Справа".

### <a id="ifacetkoptionstab_minwidth"></a>::ifacetk::options(tab\_minwidth)

Минимальная ширина кнопок заголовков вкладок в режиме со вкладками. По
умолчанию стоит 90 пикселей.

### <a id="ifacetkoptionstab_maxwidth"></a>::ifacetk::options(tab\_maxwidth)

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

### <a id="ifacetkoptionsshow_toolbar"></a>::ifacetk::options(show\_toolbar)

Показывать панель инструментов (то бишь панель с кнопками). По умолчанию
включена.

### <a id="ifacetkoptionsshow_presencebar"></a>::ifacetk::options(show\_presencebar)

Показывать панель присутствия/статуса. Это панель в нижней части окна Ткаббера,
где слева расположена кнопка принудительной смены статуса, а справа от неё —
поле для ввода описания статуса. После ввода описания не забывайте нажимать
Enter в поле ввода или менять статус.

### <a id="ifacetkoptionsshow_statusbar"></a>::ifacetk::options(show\_statusbar)

Показывать статусную строку. Это панелька, расположенная в самом низу. На
первый взгляд, толку от неё мало, но на самом деле там мелькают полезные
сообщения вроде уведомлений о коннекте ваших друзей, о смене их статуса и
прочие.

Там же появляется аббревиатура "SSL", если вы соединились с сервером, используя
защиту канала ("STARTTLS" или "Старый SSL" в окне логина). Если аббревиатура
нарисована чёрным цветом (или тем, что у вас выбрано вместо обычного цвета
текста), Ткабберу удалось удостовериться в том, что сервер "настоящий" (то есть
мы доверяем его сертификату), если цвет аббревиатуры — красный, то
достоверность сертификата сервера проверить не удалось (подробнее об этих
заморочках написано в [**отдельной статье**](Проверка_сертификата_сервера.md)).
Одиночный щелчок мышью на этой аббревиатуре показывает диалог с информацией о
сертификате сервера и алгоритме шифрования, используемом для защиты соединения.

### <a id="ifacetkoptionsraise_new_tab"></a>::ifacetk::options(raise\_new\_tab)

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

### <a id="ifacetkoptionsmessage_numbers_in_tabs"></a>::ifacetk::options(message\_numbers\_in\_tabs)

Показывать число непрочитанных сообщений в заголовках вкладок. По умолчанию
включено. Очень удобно — сразу видно, сколько наболтали в каждой комнате, пока
вас не было :)

### <a id="ifacetkoptionsupdate_title_delay"></a>::ifacetk::options(update\_title\_delay)

Задержка (в миллисекундах) между получением фокуса и обновлением заголовка окна
или вкладки. По умолчанию стоит 600 мс.

В ходе сеанса связи, когда окно Ткаббера неактивно, каждое новое сообщение
вызвает изменение заголовка окна Ткаббера: пред полным JID'ом вашего соединения
пишется количество непрочитанных сообщений в скобках, а так же за этим числом
рисуется "звёздочка" (\*), если среди сообщений есть адресованные лично вам
(или "хайлайты" в конференциях). После того, как вы активируете окно с
Ткаббером, он отсчитывает указанное в данной опции количество миллисекунд,
после чего сбрасывает заголовок окна в исходное состояние, которое оно имеет
сразу после успешного соединения с сервером, убирая информацию о наличии
непрочитанных сообщений. Если вы успеете в течение этого интервала времени
переключиться в какое-либо другое окно, заголовок окна Ткаббера останется без
изменений.

Помимо обновления заголовка окна, эта настройка управляет индикацией в иконке
панели системных уведомлений ("трея"), так как её состояние изменяется
синхронно с заголовком окна и отображает ту же информацию, только другими
средствами.

![(!)](../images/Hammer.png) **Сделать:** изучить поведение этой настройки в
случае многооконного интерфейса

### <a id="ifacetkoptionsshow_tearoffs"></a>::ifacetk::options(show\_tearoffs)

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

### <a id="ifacetkoptionsclosebuttonaction"></a>::ifacetk::options(closebuttonaction)

Действие, совершаемое при нажатии на кнопку закрытия окна. По умолчанию стоит
"Закрыть Ткаббер", и это поведение ваш покорный слуга (и, к счастью, авторы
программы тоже) находит правильным. Это уже извращённые умы придумали
_сворачивать_ программу при нажатии на кнопку **Закрыть**. Впрочем, если вы уже
привыкли к этой мелкой лжи, можете не отучиваться — Ткаббер предоставляет
несколько вариантов сворачивания.

### <a id="pixmapsoptionspixmaps_theme"></a>::pixmaps::options(pixmaps\_theme)

Тема пиктограмм Tkabber'а. Чтобы иметь возможность включить собственную тему,
положите её в поддиректорию директории pixmaps, которая лежит рядом с файлом
конфигурации (про то, где его искать, можно почитать [**здесь**]($__configdir.md)).
А [**здесь**](Цветовые_темы_и_пиктограммы.md#Пиктограммы) можно разжиться
пиктограммами, не включёнными в дистрибутив.

### <a id="webbrowser"></a>::webbrowser





Команда, которая будет выполнена при нажатии на URL в сообщении. Вместо '%s'
будет подставлен URL (например, "galeon -n %s"). Иногда (особенно в Виндовс) у
людей возникают проблемы с открытием линков в браузере. Читайте о них
[**здесь**](Ткаббер_ЧаВо/Глюки.md#Не_работает_браузер_под_виндами) и
[**здесь**](Ткаббер_ЧаВо/Глюки.md#При_клике_на_URLе_в_Ткаббере_запускается_две_Оперы_и_открывают_страницу_два_раза).

---

### <a id="Systray"></a>Systray

Параметры значка области системных уведомлений ("трея", системного лотка).

Эта группа настроек появляется в интерфейсе настроек только в том случае, если
Ткабберу доступно соответствующее расширение Tk, реализующее работу с треем: в
Windows это пакет [Winico](http://sourceforge.net/projects/tktable/), а в
системах на базе X Window используется минимум два разных пакета: Tk\_Theme и
tktray.

Настройки трея, если доступны, делятся, соответственно, на общие и уникальные
для каждого конкретного расширения:

#### <a id="Общие_настройки"></a>Общие настройки

##### <a id="ifacetksystrayoptionsdisplay_status"></a>::ifacetk::systray::options(display\_status)

Показывать всплывающее статусное окно ("тултип") над иконкой в трее, когда
главное окно свернуто. По умолчанию выключено.

Следует отметить, что показ статусного окна в Windows, очевидно сломан: окно с
иконкой докладывает кривую информацию о своём местоположении на экране, и
статусное окно поэтому рисуется неподалёку от верхнего левого угла десктопа.
Побороть это можно
[**заклинаниями в файле конфигурации**](Нетривиальные_настройки.md#Настройка_положения_окна_уведомлений_в_Windows).

##### <a id="ifacetksystrayoptionsblink"></a>::ifacetk::systray::options(blink)

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

#### <a id="Настройки_расширений_работы_с_треем"></a>Настройки расширений работы с треем

##### <a id="pluginstaskbaroptionsenable"></a>::plugins::taskbar::options(enable)

Использовать значок в системном лотке Windows.

Доступна, если иконка в трее управляется пакетом Winico.

##### <a id="pluginstktrayoptionsenable"></a>::plugins::tktray::options(enable)

Включить freedesktop system tray icon.

Появляется, если иконка в трее управляется пакетом tktray.

![(!)](../images/Hammer.png) **Сделать:** то же для Tk\_Theme

## <a id="IQ"></a>IQ
Параметры Info/Query (информационные и служебные запросы). Многие из этих опций
трафикогонные. Проконсультируйтесь со статьёй
[**Low traffic HOWTO**](Low_traffic_HOWTO.md#Настройки_Ткаббера) (подраздел "Ответы на
IQ-запросы"), чтобы быть в курсе, какие можно безболезненно отключить, а какие
лучше не трогать.

### <a id="iqoptionsshow_iq_requests"></a>::iq::options(show\_iq\_requests)

Показывать IQ-запросы в статусной строке. По умолчанию включено. Если у вас
отключена сама статусная строка (в Main Interface), то держать включённой эту
опцию не имеет смысла.

### <a id="iqoptionsshorten_iq_namespaces"></a>::iq::options(shorten\_iq\_namespaces)

Опускать "http://jabber.org/protocol/" при показе запросов в статусной строке.
По умолчанию включено.

### <a id="pluginsoptionsreply_iq_last"></a>::plugins::options(reply\_iq\_last)

Отвечать на запросы времени бездействия (jabber:iq:last). Первые три опции
включены по умолчанию.

### <a id="pluginspingoptionsping"></a>::plugins::ping::options(ping)

Пинговать сервер запросами urn:xmpp:ping. По умолчанию выключено.

### <a id="pluginspingoptionstimeout"></a>::plugins::ping::options(timeout)

Переподключаться к серверу, если он не ответил (возможно ошибкой) на пинг
(urn:xmpp:ping) за указанный временной интервал (в секундах). По умолчанию 30
секунд.

### <a id="pluginspingoptionspong"></a>::plugins::ping::options(pong)

Отвечать на пинг (urn:xmpp:ping). По умолчанию включено.

### <a id="pluginsoptionsreply_iq_time"></a>::plugins::options(reply\_iq\_time)

Отвечать на запросы времени (jabber:iq:time). Тоже включено. В Ткаббере
реализованы команды запроса времени, версии и т. п. В данном случае это "/time
nick". Эта опция разрешает отвечать на подобные запросы.

### <a id="pluginsoptionsreply_xmpp_time"></a>::plugins::options(reply\_xmpp\_time)

Reply to entity time (urn:xmpp:time) requests.

### <a id="pluginsoptionsreply_iq_version"></a>::plugins::options(reply\_iq\_version)

Отвечать на запросы версии (jabber:iq:version). Отвечает на запросы типа
"/version nick".

### <a id="pluginsoptionsreply_iq_os_version"></a>::plugins::options(reply\_iq\_os\_version)

Включать информацию об операционной системе в ответ на запрос версии
(jabber:iq:version). Позволяет при ответе на запрос о версии клиента отдавать
информацию и о вашей операционке. Если вы хотите сообщать версию Ткаббера, но
не выдавать инфу о системе, отключите её.

### <a id="mucoptionsreport_muc_rooms"></a>::muc::options(report\_muc\_rooms)

Отвечать на запрос disco\#items о MUC-конференциях, в которых Вы принимаете
участие.

## <a id="Login"></a>Login
Параметры подключения. Если вы уже залогинены, некоторые поля будут
заполненными вашими данными для логина, причём рядом с кнопкой "Состояние"

будет написано "Параметр установлен, но не сохранён для следующих сессий". Это
нормально. Кстати, если вы не планируете устраивать мультилогин или создавать
несколько профилей, можете сохранить эти значения для будущих сессий (кроме
пароля, ибо файл custom.tcl, куда сохраняются все настройки, никак не
шифруется; если вы хотите настроить безопасный автологин без ввода пароля,
почитайте [**здесь**](Плагины.md#CryptoConfig)). Многие параметры логина
рассмативаются в статьях [**Начинающим**](Начинающим.md) и
[**Между офлайном и онлайном**](Между_офлайном_и_онлайном.md), так что здесь мы отвлекаться на их
описание не будем.


### <a id="loginconfuser"></a>::::loginconf(user)



Имя пользователя.

### <a id="loginconfserver"></a>::::loginconf(server)

Имя сервера.

### <a id="loginconfpassword"></a>::::loginconf(password)

Пароль.

### <a id="loginconfresource"></a>::::loginconf(resource)

[**Ресурс**](Ткаббер_ЧаВо/Разное.md#Ресурс).

### <a id="loginconfpriority"></a>::::loginconf(priority)

[**Приоритет**](Ткаббер_ЧаВо/Разное.md#Приоритет).

### <a id="loginconfconnect_forever"></a>::::loginconf(connect\_forever)

Пытаться подключаться бесконечно много раз.

### <a id="loginconfallowauthplain"></a>::::loginconf(allowauthplain)

Разрешить механизмы аутентификации, использующие открытый текст (при этом
пароль передается незашифрованным).

Если вы не знаете, что делать с этой опцией, отключите её.

Остальным будет полезно знать две вещи:

*  Вменяемые реализации серверов разрешают клиенту использовать данный механизм
   аутентификации только если до её начала канал был защищён при помощи TLS
   (SSL).
*  Включение на сервере нестандартного способа аутентификации пользователей
   (например, при помощи внешней программы или LDAP) _требует_ использовать
   механизм аутентификации открытым текстом (при этом в случае с ejabberd
   предыдущий пункт перестаёт выполняться, и если вы развёртываете сервер с
   нестанратным подходом к аутентификации пользователей, задумайтесь об
   обязательном внедрении TLS).

### <a id="loginconfallowgoogletoken"></a>::::loginconf(allowgoogletoken)

Разрешить использование механизма аутентификации X-GOOGLE-TOKEN.

Имеет смысл только при подключении к серверам Google Talk и для своей работы
требует возможности подключения к серверам Google Talk по протоколу HTTPS, что,
в свою очередь, требует доступности для Ткаббера пакета **tls**.

Подключение к Google Talk — особая, сложная тема с некоторым количеством
подводных камней, поэтому ей посвящена [**отдельная статья**](Google_Talk.md).

### <a id="loginconfusesasl"></a>::::loginconf(usesasl)

Использовать SASL для аутентификации.

Держите включённой. Отключать её следует только в особо сложных случаях,
например, при соединениях с очень древними серверами (например, jabberd1) и то,
только если с включённой опцией Ткаббер отказывается соединяться, выдавая
ошибку "Server did not provide SASL feature".

### <a id="loginconfstream_options"></a>::::loginconf(stream\_options)

Настройки XMPP-потока при подключении к серверу.

### <a id="loginconfsslcertfile"></a>::::loginconf(sslcertfile)

Файл сертификата SSL (необязательный параметр).

### <a id="loginconfsslcacertstore"></a>::::loginconf(sslcacertstore)

Файл или директория центра сертификации (CA) SSL (необязательный параметр).

### <a id="loginconfsslkeyfile"></a>::::loginconf(sslkeyfile)

Файл секретного ключа SSL (необязательный параметр).

### <a id="loginconfproxy"></a>::::loginconf(proxy)

Тип прокси для подключения.

### <a id="loginconfproxyhost"></a>::::loginconf(proxyhost)

Адрес прокси-сервера. По умолчанию указан localhost.

### <a id="loginconfproxyport"></a>::::loginconf(proxyport)

Порт для подключения к прокси-серверу. Значение по умолчанию — 3128.

### <a id="loginconfproxyusername"></a>::::loginconf(proxyusername)

Имя пользователя для подключения к прокси-серверу.

### <a id="loginconfproxypassword"></a>::::loginconf(proxypassword)

Пароль для подключения к прокси-серверу.

### <a id="loginconfproxyuseragent"></a>::::loginconf(proxyuseragent)

Строка User-Agent.

### <a id="loginconfusealtserver"></a>::::loginconf(usealtserver)

Использовать явно указанные адрес сервера и порт для подключения.

### <a id="loginconfaltserver"></a>::::loginconf(altserver)

Имя альтернативного сервера или его IP-адрес.

### <a id="loginconfaltport"></a>::::loginconf(altport)

Порт для подключения к альтернативному серверу.

### <a id="loginconfreplace_opened"></a>::::loginconf(replace\_opened)

Закрыть открытые соединения. Для перелогина. Если вы планируете работать в
одном окне Ткаббера с двумя или более аккаунтами, отключите эту опцию. Если же
нет, лучше включите, чтобы не плодить открытые соединения в случае перелогина.

### <a id="loginconfusehttppoll"></a>::::loginconf(usehttppoll)

Использовать HTTP-подключение.

### <a id="loginconfpollurl"></a>::::loginconf(pollurl)

URL для подключения (опроса).

### <a id="loginconfusepollkeys"></a>::::loginconf(usepollkeys)

Использовать ключи безопасности HTTP-подключения (рекомендуется).

### <a id="loginconfnumberofpollkeys"></a>::::loginconf(numberofpollkeys)

Число ключей безопасности, после передачи серверу которых генерируется новая
последовательность ключей.

### <a id="loginconfpolltimeout"></a>::::loginconf(polltimeout)

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

### <a id="loginconfpollmin"></a>::::loginconf(pollmin)

Минимальный интервал между HTTP-запросами.

### <a id="loginconfpollmax"></a>::::loginconf(pollmax)

Максимальный интервал между HTTP-запросами.

## <a id="Messages"></a>Messages
Параметры отображения сообщений и новостей.

### <a id="pluginsheadlinesoptionscache"></a>::plugins::headlines::options(cache)

Сохранять новости при выходе и восстанавливать при старте. Пользуйтесь этой
опцией, учитывая следующее. Если у вас много фидов и если вы чистите окно от
устаревших сообщений редко, то при включённом сохранении сообщения потихоньку
накапливаются, и стартующий Ткаббер начинает грузиться заметно дольше. Впрочем,
опция полезна, так как не всегда есть время прочитать какую-то новость прямо
сейчас, до закрытия Ткаббера. При работе с новостями может оказаться удобным
внешний плагин [**Rsssaver**](Плагины.md#Rsssaver), сохраняющий новости в файл
каждые N новых сообщений. Стандартное поведение Ткаббера — сохранять их только
при выходе; при аварийном завершении программы все новые сообщения, пришедшие
за этот сеанс, теряются.

### <a id="pluginsheadlinesoptionsmultiple"></a>::plugins::headlines::options(multiple)

Показывать новости в одном/нескольких окнах. Позволяет выбрать, использовать ли
одно окно для всех новостей или же группировать новости по джидам фидов в
отдельных окнах.

### <a id="pluginsheadlinesoptionsdisplay_subject_only"></a>::plugins::headlines::options(display\_subject\_only)

Не показывать описание новости в виде ветви дерева (только всплывающее окно).

### <a id="pluginsheadlinesoptionstimestamp_format"></a>::plugins::headlines::options(timestamp\_format)

Формат вывода даты/времени в окне новостей. Для того, чтобы не показывать
дату/время совсем, установите эту опцию в пустую строку.

### <a id="pluginsheadlinesoptionsshow_balloons"></a>::plugins::headlines::options(show\_balloons)

Показывать всплывающие окна (тултипы) с текстом новости над заголовками
сообщений.

### <a id="pluginsofflineoptionsflexible_retrieval"></a>::plugins::offline::options(flexible\_retrieval)

Получать офлайновые сообщения с использованием протокола типа POP3.

## <a id="Plugins"></a>Plugins
Параметры расширений. Содержимое этого раздела настроек сильно зависит от того,
какие плагины у вас установлены. Возможно, имеет смысл описать настройки всех
имеющихся плагинов, но статья и так уже слишком большая, так что ограничимся
лишь рекомендацией вникать в строчки описания и действовать метдом тыка, если
вникнуть сложно. В ближайшем будущем статья [**Плагины**](Плагины.md) подвергнется
доработке, и скорее всего, опции настройки каждого плагина будут помещены туда.

## <a id="Privacy"></a>Privacy
Настройки блокировки сообщений (правил обеспечения приватности XMPP).

### <a id="filtersoptionsenable"></a>::filters::options(enable)

Включить поддержку модуля mod\_filter из jabberd 1.4 (устаревшие). По умолчанию
эта поддержка выключена. То и понятно, зачем по умолчанию грузить поддержку
устаревшего хлама? Если вы уверены, что ваш сервер — именно jabberd 1.4,
возможно, эта опция вам понадобится.

### <a id="privacyoptionsactivate_at_startup"></a>::privacy::options(activate\_at\_startup)

Активировать видимый/невидимый/игнорируемый списки (и список конференций) перед
тем, как объявлять о своём присутствии в сети. По умолчанию эта опция включена,
но вам может понадобиться отключить её. Подробнее об одном из таких случаев
читайте в статье [**Блокировка MRIM-спама**](Блокировка_MRIM-спама.md).



### <a id="MUC_Ignoring"></a>MUC Ignoring

Игнорирование групповых и приватных сообщений от выбранных посетителей
многопользовательской конференции. В этом подразделе имеется всего одна опция:

#### <a id="pluginsmucignoreoptionstransient_rules"></a>::plugins::mucignore::options(transient\_rules)



Если параметр установлен, то все изменения правил игнорирования будут
действовать только до того, как Tkabber закроется, и не будут восстановлены при
следующем запуске. По умолчанию выключено, так что Ткаббер должен запоминать
ваших доставал. Статья по теме — [**MUC Ignore**](MUC_Ignore.md).

## <a id="Remote_Control"></a>Remote Control
Настройки [удалённого управления (XEP-0146)](http://www.xmpp.org/extensions/xep-0146.html).
Под удалённым управлением понимается возможность выполнять из одного Jabber-клиента некоторые
фиксированные действия по управлению другим удалённым Jabber-клиентом, а точнее
— одним из активных подключений к серверу на нём. Стандартные команды включают
в себя, в числе прочих:

*  Отключение сессии;
*  Выход из всех активных групповых чатов (чтобы позволить зайти в них со своим
   зарегистрированным псевдонимом из своей текущей сессии).
*  Пересылка непрочитанных на удалённом клиенте сообщений вашему клиенту.


В дополнение к этому встроенному средству вы можете поставить внешние плагины
[**Remote Settings**](Плагины.md#Remote_Settings) и
[**Remote Commands**](Плагины.md#Remote_Commands). Подробнее почитать на эту тему вы можете

в статье и
[**How to add a new remote command**](../en/How_to_add_a_new_remote_command.md)
(англ.; конкретные примеры, иллюстрирующие плагин Remote Commands).
![(!)](../images/Hammer.png) **Сделать:** поправить эту ссылку, чтобы выглядела
как внутренняя ссылка вики, а саму статью неплохо бы в будущем перевести на
русский.

Имейте в виду, что это именно управление клиентом в контексте протокола XMPP;
оно не имеет ничего общего с управлением _программой Tkabber_ при помощи
средств операционной системы и её программного окружения (такого, например, про
которое написано в статье
[**Удалённое управление с помощью send**](Удалённое_управление_с_помощью_send.md)).


### <a id="remoteoptionsenable"></a>::remote::options(enable)

Включить удалённое управление. По умолчанию включено.


### <a id="remoteoptionsaccept_from_myjid"></a>::remote::options(accept\_from\_myjid)


Принимать подключение с моего собственного JID. Тоже включено.




### <a id="remoteoptionsaccept_list"></a>::remote::options(accept\_list)


Принимать подключение с перечисленных JID'ов. В этом поле можно перечислить
JID'ы, которым также разрешено удалённо управлять вашим Ткаббером. Разделять их
надо пробелом.












## <a id="Roster"></a>Roster
Параметры контактов.

### <a id="ifacetkrosteruse_aliases"></a>::ifacetk::roster::use\_aliases

Использовать aliases и показывать нескольких пользователей как один элемент
контактов. Представьте себе, что у вас в ростере болтается два пользователя,
сидящих на одном джиде, но с разными ресурсами. С отключённой опцией они будут
видны как два отдельных контакта. Если же опция включена (а по умолчанию она
включена), то оба эти контакта соберутся в группу со стрелочкой и будут
выглядеть как один пользователь. При нажатии на стрелку группа развернётся, и
вы увидите все подключения этого пользователя.

### <a id="ifacetkrostershow_only_online"></a>::ifacetk::roster::show\_only\_online

Показывать в окне контактов только подключённые контакты. По умолчанию опция
выключена, но в реальной жизни бывает удобнее включить показ только контактов,
находящихся в онлайне.

На панели инструментов имеется кнопка переключения списка контактов в режим
показа только активных контактов и обратно. Этот переключатель также доступен в
виде опции главного меню: **Tkabber → Контакты → Показываются только активные
пользователи'**.

Если активен режим показа только активных пользователей в списке контактов, его
можно отменять для отдельных групп списка контактов, включив в контекстном меню
интересующей группы переключатель **Показывать неподключённые контакты**.

Можно относительно легко навесить переключение обсуждаемого режима на
комбинацию клавиш, об этом рассказано
[**тут**](Нетривиальные_настройки.md#Хоткей_для_переключения_между_режимами_ростера_все_и_только_онлайн).

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

*  Вдумчивое распределение контактов по группам (с учётом того что любой
   контакт может одновременно входить в произвольное количество групп, а группы
   могут быть вложенными).
*  Использование фильтрации списка контактов.

![(!)](../images/Hammer.png) **Сделать:** ссылки на указанные фичи

### <a id="ifacetkrostershow_transport_icons"></a>::ifacetk::roster::show\_transport\_icons

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

### <a id="ifacetkrostershow_transport_user_icons"></a>::ifacetk::roster::show\_transport\_user\_icons

Использовать оригинальные пиктограммы для контактов, подключённых через
транспорты/службы, в окне контактов. По умолчанию тоже выключено.

### <a id="ifacetkrosteroptionsnested"></a>::ifacetk::roster::options(nested)

Отображать вложенные группы в контактах. По умолчанию выключено, а зря — это
очень удобная для упорядочивания ростера вещь. Проще всего объяснить это на
примере. Например, у нас кроме обычных друзей Андрея и Юли, которых сложно
куда-то отнести, есть друзья детства Вася, Петя и Алёша, есть друзья по универу
Коля, Лена и Наташа, и есть кореши Вован и Жора, с которыми мы постоянно
рубимся в "кваку". Редактируя контакты друзей, можно прописать для них
соответственно группы **Друзья**, **Друзья::Друзья детства**,
**Друзья::Универ**, **Друзья::Quake**. Причём можно пойти дальше и
университетских друзей разбросать по курсам: **Друзья::Универ::Однокурсники**
**Друзья::Универ::Остальные** В результате в ростере появится примерно такое:

<pre>
<strong>Друзья</strong>
Андрей
Юля
   <strong>Друзья детства</strong>
   Вася
   Петя
   Алёша
   <strong>Универ</strong>
      <strong>Однокурсники</strong>
      Коля
      <strong>Остальные</strong>
      Лена
      Наташа
   <strong>Quake</strong>
   Вован
   Жора
</pre>

### <a id="ifacetkrosteroptionsnested_delimiter"></a>::ifacetk::roster::options(nested\_delimiter)

Разделитель вложенных групп по умолчанию. По умолчанию разделителем является
двойное двоеточие, но вы можете указать свой. Не забудьте после смены
разделителя отредактировать все контакты, входившие во вложенные группы.

### <a id="ifacetkrosteroptionsshow_own_resources"></a>::ifacetk::roster::options(show\_own\_resources)

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

### <a id="ifacetkrosteroptionschats_group"></a>::ifacetk::roster::options(chats\_group)



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

### <a id="ifacetkrosteroptionsuse_filter"></a>::ifacetk::roster::options(use\_filter)

Использовать фильтр контактов. По умолчанию выключен. При его включении в
нижней части ростера, над кнопкой смены состояний, появляется поле для ввода
фильтра. Фильтром может быть любая последовательность символов.

Фильтрация работает по мере ввода. Например, если мы напишем туда букву "а"
(русскую), то из вышеупомнутых друзей в ростере останутся Андрей, Вася, Алёша,
Лена, Наташа, Вован и Жора. Добавив к этой букве "н", получим совсем маленький
ростер, состоящий из Андрея и Вована.

Нажатие клавиши Escape очищает поле ввода, возвращая список контактов в
исходное состояние.

### <a id="ifacetkrosteroptionsmatch_jids"></a>::ifacetk::roster::options(match\_jids)

Подбирать не только псевдоним, но и JID в фильтре контактов. Добавляет в фильтр
возможность поиска и по JID'ам, а не только по именам контактов. По умолчанию
выключено.

### <a id="ifacetkrosteroptionsfree_drop"></a>::ifacetk::roster::options(free\_drop)

При перетаскивании контакта из одной группы контактов в другую, его можно
отпустить не только над названием группы, но и над любым контактом в этой
группе. Если вы не знали, пользователей можно сортировать по группам обычным
Drag'n'Drop'ом. Назначение этой опции, думаю, понятно. По умолчанию включено.

### <a id="ifacetkrosteroptionsshow_subscription"></a>::ifacetk::roster::options(show\_subscription)

Показывать тип подписки на присутствие во всплывающем окне в контактах. По
умолчанию выключено. Тип подписки может быть "from" (контакт вас авторизовал, а
вы его нет), "to" (наоборот) и "both" (вы оба друг друга авторизовали).
Всплывающее окно, или тултип, появляется, если навести мышью на контакт.

### <a id="ifacetkrosteroptionsshow_conference_user_info"></a>::ifacetk::roster::options(show\_conference\_user\_info)

Показывать детальную информацию об участниках конференции во всплывающем окне,
соответствующем конференции, в контактах. Тоже по умолчанию выключено. Если
включить, то при наведении мыши на закладку конференции в ростере появляется
тултип со списком участников этой конфы, причём неважно, находитесь вы сами в
ней или нет. Для того, чтобы эта информация появилась, необходимо включить
опцию
[**::plugins::conferenceinfo::options(autoask)**](#pluginsconferenceinfooptionsautoask),
описанную выше.

## <a id="Sound"></a>Sound
Настройки звука.

## <a id="State"></a>State
Настройки сохранения состояния Ткаббера.

## <a id="Warnings"></a>Warnings
Параметры отображения предупреждений.

### <a id="tls_warnings"></a>::tls\_warnings

Показывать предупреждения SSL. По умолчанию включено.

Если эта опция включена, при каждой попытке защитить соединение с сервером при
помощи протокола TLS (SSL), в ходе которой не удаётся убедиться в том, что
сервер "настоящий" (то есть мы не доверяем представленному им сертификату),
Ткаббер будет показывать предупреждающий диалог, в котором будет указана
причина проблемы и подробная информация о сертификате сервера. В данном диалоге
Ткаббер предложит отказаться от соединения (действие по умолчанию) или
продолжить его на ваш страх и риск.

Ваше отношение к этой опции должно основываться на том уровне защиты, который
вам нужен от протокола TLS: если вам достаточно того, что TLS будет шифровать
трафик между вами и сервером, а проверка подлинности сервера вас не волнует
настолько чтобы повозиться с организацией доверия к этому серверу, можете
данную опцию отключить чтобы избавиться от лишних действий при каждом
подключении. В противном случае изучайте [**эту статью**](Проверка_сертификата_сервера.md).


>




|
<
<
<
<
<
<
<
<
<
<
<

|
<

|
<
<
<
<
<
<
<

|
<
<
<
<
<
<
<
<

|
<
<
<




|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
>
>

|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|


|
|
|
|

|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|



|

|
|
<
<
<
<
<
<

|
<
<
<
<
<
<

|

|
<

|

|

|

|
<
<
<

|

|
<
<

|
|
<
<
<
<
<
|
|
|
>

|

|
<
<
<
<
<
<

|

|
<
<
<
<
<
<
<

|

|
<
<
<
<
<

|

|
<
<
<
<
<

|

<
|
<
<
<
<
<
<
<
<
<
<
<
<

|

|
|
>
|
>
|
>
|
<
<
>

|

|
|
|
|
|

|

<
|
<
<
<
<
<
<

|

<
>
<
<
<
<
<
<
<

|

|
<
<
<
<

|

>
|
>

<
>

<
>

|

|
|
|
<
<
<

|

<
<
<
<
|
|
>

|

<
<
>

|

|
<
<

|

<
<
<
<
<
<
|
<

<
<
<
<
<
<
|
<
<
<

<
|
<
<
<
<
<
<

<
|
<
<
<
<
<
<
<
<
<

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|

|

|
<
<
<
<

|
<
<
<

|
<
<
<

|

|
<
<

|

|

|

|
<
<

|

|
<
<

|

|
<
<

|
>
>

<
<
<
|

|
<
<

|
<

|
<

|

|

|

|
>
>
>
>

<
<
<
<
|
<
<
<
<

|

|
|
>
|
>
|
>
|
>
|
>
|
>
|
<
<
>
|
>

|

|
<
<
<
<
<
<

|

|

|

<
<
>

|

>
|
>

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<

|

|
<
<

|
<
<
<
<
<

|
<
<
<

|

|
<
<
<
<
<

|
|
<
<

|

|
<

|

|
<
<
<
<

|

|
<
<

|
|
<
<

|

|

|
<
<

|

|
<
<



|
<
<

|

|

|

|
<
<

|

|

|

|
<
<

|

|

|

|

|

|
<
<
<

>
>
|

|

|

|

|
<
<
<

|

|
<
<

|

<
|
<

|

|
<

|
|
<
<
<
<

|

|

|

|
<

|

|

|

|
<
<

|

|

|
|

|
<
<
<
<
<

>
>
>
>
|
<
<

|

|
<

|

|
<
<
<
<

|

|
<

|

|
<
<
<

|

|
<
<
<

|
<
<
<
<
<
<
<
<

|

|
<
<
<
<
<
<

|

|
<
<

|

|
<

<
|
<
<
<
<
<
<
<
<
<

|
<
<
<

|
<

|

|
<
<
<
<
<

|

|
<
<
<
<
<

|

|
<
<
<
<

|
>
>
>
>

<
<
<
<
<
<
<
<
|

|

|
<
<
<
<

|
<

|

|

|
<

|
<
<
<
<

|

|
<
<
<
<
<

|

|

|

|

|

|

|

|

|
|
<
<
<
<

|

|
<
<

|

|
<

|

|
<

|

|

|

|
<
<

|

|

|

|
<
<

|

|

|

|
<

|

|
<
<
<

|

|
<

|
|
|
>
|
<
<
<
<
<
<
<
<
>

|
>
>

<
<
<
<
<
<
|

|

|

|

|

|

|

|

|

|
<

|

|

|
<
<
|
<
<
<
<
<

|

|

|
<
<

|
<

|

|

<
|
<
<

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|
<
<

|

|

|

|

|

|

|

|
<

|

|
<

|

|

|

|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<

|
|
<
<
<

|

<
|
<

<
<
<
|

|
<

<
|
<

|
<
<
<
<
<
<

|
<

<
|
<
<
<
<

|

<
<
<
<
>

>
<

|
<

|
>

>
|
<
<
<

|
<
<
<
<
<

<
<
<
<
>

<
<
<
>
|
|
|
|
<
<

<
<
<
<
<
>

|

<
>

|
>

|
>
>

>
|
>

<
<
<
>

>
>
>
>
>
>
>
>
>
>
|
|

|

|
<
<
<
<
<
<

|

|
<
<

|
<
<
<

<
|
<

|
<
<

|
<

|
<
<
|

|

|

|
<
<
<
<

|

|
<

|

|
<
<
<
<
<
<
<
<
<

<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<

|

|
<
<

|

|
<
<
<
<
<
<
<
<

>
>
|
<
<
<
<

|

|
<
<

|
<
<
<

|
<

|

|
<
<

|

|
<
<
<

|

|
<
<
<

|

|
<
<
<
<
<
<
<

|
|

|
|

|
|

|

|

|
<
<
<
<
<
<

|
|
|
<
<
<
1
2
3
4
5
6
7
8











9
10

11
12







13
14








15
16



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200






201
202






203
204
205
206

207
208
209
210
211
212
213
214



215
216
217
218


219
220
221





222
223
224
225
226
227
228
229






230
231
232
233







234
235
236
237





238
239
240
241





242
243
244

245












246
247
248
249
250
251
252
253
254
255
256


257
258
259
260
261
262
263
264
265
266
267
268

269






270
271
272

273







274
275
276
277




278
279
280
281
282
283
284

285
286

287
288
289
290
291
292
293



294
295
296




297
298
299
300
301
302


303
304
305
306
307


308
309
310






311

312






313



314

315






316

317









318
















319
320
321
322
323




324
325



326
327



328
329
330
331


332
333
334
335
336
337
338
339


340
341
342
343


344
345
346
347


348
349
350
351
352



353
354
355


356
357

358
359

360
361
362
363
364
365
366
367
368
369
370
371
372




373




374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390


391
392
393
394
395
396
397






398
399
400
401
402
403
404


405
406
407
408
409
410
411
412
























413

414
415
416
417


418
419





420
421



422
423
424
425





426
427
428


429
430
431
432

433
434
435
436




437
438
439
440


441
442
443


444
445
446
447
448
449


450
451
452
453


454
455
456
457


458
459
460
461
462
463
464
465


466
467
468
469
470
471
472
473


474
475
476
477
478
479
480
481
482
483
484
485



486
487
488
489
490
491
492
493
494
495
496
497



498
499
500
501


502
503
504

505

506
507
508
509

510
511
512




513
514
515
516
517
518
519
520

521
522
523
524
525
526
527
528


529
530
531
532
533
534
535
536
537





538
539
540
541
542
543


544
545
546
547

548
549
550
551




552
553
554
555

556
557
558
559



560
561
562
563



564
565








566
567
568
569






570
571
572
573


574
575
576
577

578

579









580
581



582
583

584
585
586
587





588
589
590
591





592
593
594
595




596
597
598
599
600
601
602








603
604
605
606
607




608
609

610
611
612
613
614
615

616
617




618
619
620
621





622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640




641
642
643
644


645
646
647
648

649
650
651
652

653
654
655
656
657
658
659
660


661
662
663
664
665
666
667
668


669
670
671
672
673
674
675
676

677
678
679
680



681
682
683
684

685
686
687
688
689
690








691
692
693
694
695
696






697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715

716
717
718
719
720
721


722





723
724
725
726
727
728


729
730

731
732
733
734
735

736


737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792


793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808

809
810
811
812

813
814
815
816
817
818
819
820
















821
822
823



824
825
826

827

828



829
830
831

832

833

834
835






836
837

838

839




840
841
842




843
844
845

846
847

848
849
850
851
852
853



854
855





856




857
858



859
860
861
862
863


864





865
866
867
868

869
870
871
872
873
874
875
876
877
878
879
880
881



882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899






900
901
902
903


904
905



906

907

908
909


910
911

912
913


914
915
916
917
918
919
920




921
922
923
924

925
926
927
928









929

930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945

946
947
948
949


950
951
952
953








954
955
956
957




958
959
960
961


962
963



964
965

966
967
968
969


970
971
972
973



974
975
976
977



978
979
980
981







982
983
984
985
986
987
988
989
990
991
992
993
994
995
996






997
998
999
1000



[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Настройки/index.html)


# Настройки

Материал из Tkabber Wiki.

Попасть в окно настроек просто: меню **Tkabber → Настройки**. Откроется вкладка, полная кнопок, каждая из которых ведёт в свой раздел и содержит настройки определённых элементов интерфейса, логина, плагинов, звука и прочих всякостей. В этой статье мы попробуем подробно рассказать о наиболее важных настройках и упомянуть вскользь не очень важные. Но все настройки, имеющиеся в Ткаббере на данный момент (версия 10.0.1-beta, а точнее, ревизия 1401 из svn), попадут в эту статью с минимальным описанием хотя бы для того, чтобы проще было искать нужную по ключевым словам. Стоит напомнить, что в окне настроек, как и почти везде в Ткаббере, работает поиск: Ctrl-s. Но ищет он, к сожалению, лишь в пределах открытого раздела. Полного поиска по всем настройкам нет (то есть, если из главного окна вы будете искать какую-нибудь настройку логина, вы её не найдёте). 












Ну что ж, перейдём непосредственно к настройкам, однако перед этим ознакомим вас с одной тонкой, но важной вещью: 


Пробуя настройки в этом конфигураторе, мало пометить чекбокс, нужно ещё _применить изменение,_ чтобы Ткаббер о нём узнал. Для этого нажмите на кнопку Состояние, расположенную рядом с изменённой настройкой, и выберите нужный вариант. Можно сохранить настройку только для текущей сессии (равносильно включению настроек через пункты меню), а можно сохранить и для будущих, тогда при следующем старте вам не придётся ничего настраивать заново. Кроме того, можно восстановить значение по умолчанию, в случае, если вы напортачили во время экспериментов. 








Продвинутым пользователям стоит заметить одну важную идею, лежащую в основе механизма конфигурирования Ткаббера (и пока ещё нигде на этой вики более не освещённую): любую настройку, которую вы видите в интерфейсе настроек, можно установить программно из [файла конфигурации](Config.tcl.md); при этом длинные непонятные "имена настроек" Ткаббера именно потому длинны и непонятны, что это на самом деле — имена переменных, управляющих настройками, и эти имена можно скопировать (физически, "натянув" на них выделение мышкой прямо в интерфейсе настроек) и вставить в файл конфигурации, открытый в любимом текстовом редакторе. 









Имейте также в виду, что любая группа настроек может иметь несколько "родителей": например, группа настроек "Emoticons", посвящённая эмоциконкам (смайлам), доступна как из группы "Chat", так и из группы "Plugins" → "Rich Text". 




## <a id="toc"></a>Содержание

* [1 AutoAway](#AutoAway)
 * [1.1 ::plugins::autoaway::options(awaytime)](#pluginsautoawayoptionsawaytime)
 * [1.2 ::plugins::autoaway::options(xatime)](#pluginsautoawayoptionsxatime)
 * [1.3 ::plugins::autoaway::options(status)](#pluginsautoawayoptionsstatus)
 * [1.4 ::plugins::autoaway::options(drop\_priority)](#pluginsautoawayoptionsdrop_priority)
* [2 Chat](#Chat)
 * [2.1 ::chat::options(stop\_scroll)](#chatoptionsstop_scroll)
 * [2.2 ::chat::options(smart\_scroll)](#chatoptionssmart_scroll)
 * [2.3 ::chat::options(display\_status\_description)](#chatoptionsdisplay_status_description)
 * [2.4 ::chat::options(default\_message\_type)](#chatoptionsdefault_message_type)
 * [2.5 ::chat::options(gen\_status\_change\_msgs)](#chatoptionsgen_status_change_msgs)
 * [2.6 ::plugins::completion::options(completion\_expire)](#pluginscompletionoptionscompletion_expire)
 * [2.7 ::plugins::options(timestamp\_format)](#pluginsoptionstimestamp_format)
 * [2.8 ::plugins::options(delayed\_timestamp\_format)](#pluginsoptionsdelayed_timestamp_format)
 * [2.9 ::plugins::xhtml::options(enable)](#pluginsxhtmloptionsenable)
 * [2.10 ::plugins::log\_on\_open::options(max\_messages)](#pluginslog_on_openoptionsmax_messages)
 * [2.11 ::plugins::log\_on\_open::options(max\_interval)](#pluginslog_on_openoptionsmax_interval)
 * [2.12 ::plugins::nickcolors::options(use\_colored\_nicks)](#pluginsnickcolorsoptionsuse_colored_nicks)
 * [2.13 ::plugins::nickcolors::options(use\_colored\_roster\_nicks)](#pluginsnickcolorsoptionsuse_colored_roster_nicks)
 * [2.14 ::plugins::nickcolors::options(use\_colored\_messages)](#pluginsnickcolorsoptionsuse_colored_messages)
 * [2.15 ::muc::options(gen\_enter\_exit\_msgs)](#mucoptionsgen_enter_exit_msgs)
 * [2.16 ::muc::options(gen\_muc\_status\_change\_msgs)](#mucoptionsgen_muc_status_change_msgs)
 * [2.17 ::muc::options(gen\_muc\_position\_change\_msgs)](#mucoptionsgen_muc_position_change_msgs)
 * [2.18 ::muc::options(propose\_configure)](#mucoptionspropose_configure)
 * [2.19 ::muc::options(history\_maxchars)](#mucoptionshistory_maxchars)
 * [2.20 ::muc::options(history\_maxstanzas)](#mucoptionshistory_maxstanzas)
 * [2.21 ::muc::options(request\_only\_unseen\_history)](#mucoptionsrequest_only_unseen_history)
 * [2.22 ::plugins::tclchat::options(use\_tkchat\_colors)](#pluginstclchatoptionsuse_tkchat_colors)
 * [2.23 Chatstate](#Chatstate)
  * [2.23.1 ::plugins::chatstate::options(enable)](#pluginschatstateoptionsenable)
 * [2.24 Emoticons](#Emoticons)
  * [2.24.1 ::plugins::emoticons::options(show\_emoticons)](#pluginsemoticonsoptionsshow_emoticons)
  * [2.24.2 ::plugins::emoticons::options(theme)](#pluginsemoticonsoptionstheme)
  * [2.24.3 ::plugins::emoticons::options(match\_whole\_word)](#pluginsemoticonsoptionsmatch_whole_word)
  * [2.24.4 ::plugins::emoticons::options(handle\_lol)](#pluginsemoticonsoptionshandle_lol)
 * [2.25 Events](#Events)
  * [2.25.1 ::plugins::events::options(enable)](#pluginseventsoptionsenable)
 * [2.26 Highlight](#Highlight)
  * [2.26.1 ::plugins::highlight::options(enable\_highlighting)](#pluginshighlightoptionsenable_highlighting)
  * [2.26.2 ::plugins::highlight::options(highlight\_nick)](#pluginshighlightoptionshighlight_nick)
  * [2.26.3 ::plugins::highlight::options(highlight\_substrings)](#pluginshighlightoptionshighlight_substrings)
  * [2.26.4 ::plugins::highlight::options(highlight\_whole\_words)](#pluginshighlightoptionshighlight_whole_words)
 * [2.27 Logging](#Logging)
  * [2.27.1 ::logger::options(logdir)](#loggeroptionslogdir)
  * [2.27.2 ::logger::options(log\_chat)](#loggeroptionslog_chat)
  * [2.27.3 ::logger::options(log\_groupchat)](#loggeroptionslog_groupchat)
 * [2.28 MUC Ignoring](#MUC_Ignoring)
  * [2.28.1 ::plugins::mucignore::options(transient\_rules)](#pluginsmucignoreoptionstransient_rules)
 * [2.29 Stylecodes](#Stylecodes)
  * [2.29.1 ::plugins::stylecodes::options(emphasize)](#pluginsstylecodesoptionsemphasize)
  * [2.29.2 ::plugins::stylecodes::options(hide\_markup)](#pluginsstylecodesoptionshide_markup)
 * [2.30 Vcard](#Vcard)
* [3 Conference Info](#Conference_Info)
 * [3.1 ::plugins::conferenceinfo::options(autoask)](#pluginsconferenceinfooptionsautoask)
 * [3.2 ::plugins::conferenceinfo::options(interval)](#pluginsconferenceinfooptionsinterval)
 * [3.3 ::plugins::conferenceinfo::options(err\_interval)](#pluginsconferenceinfooptionserr_interval)
* [4 File Transfer](#File_Transfer)
 * [4.1 ::ft::options(download\_dir)](#ftoptionsdownload_dir)
 * [4.2 ::ft::options(default\_proto)](#ftoptionsdefault_proto)
 * [4.3 HTTP](#HTTP)
  * [4.3.1 ::plugins::http::options(port)](#pluginshttpoptionsport)
  * [4.3.2 ::plugins::http::options(host)](#pluginshttpoptionshost)
 * [4.4 Jidlink](#Jidlink)
  * [4.4.1 ::jidlink::transport(allowed,dtcp-active)](#jidlinktransportalloweddtcp-active)
  * [4.4.2 ::jidlink::transport(allowed,dtcp-passive)](#jidlinktransportalloweddtcp-passive)
  * [4.4.3 ::jidlink::transport(allowed,inband-bytestream)](#jidlinktransportallowedinband-bytestream)
 * [4.5 Stream Initiation](#Stream_Initiation)
  * [4.5.1 ::si::socks5::initiator::options(enable\_mediated\_connection)](#sisocks5initiatoroptionsenable_mediated_connection)
  * [4.5.2 ::si::socks5::initiator::options(proxy\_servers)](#sisocks5initiatoroptionsproxy_servers)
  * [4.5.3 ::si::transport(allowed,[http://jabber.org/protocol/bytestreams](http://jabber.org/protocol/bytestreams))](#sitransportallowedhttp__jabber.org_protocol_bytestreamshttp__jabber.org_protocol_bytestreams)
  * [4.5.4 ::si::transport(allowed,[http://jabber.org/protocol/iqibb](http://jabber.org/protocol/iqibb))](#sitransportallowedhttp__jabber.org_protocol_iqibbhttp__jabber.org_protocol_iqibb)
  * [4.5.5 ::si::transport(allowed,[http://jabber.org/protocol/ibb](http://jabber.org/protocol/ibb))](#sitransportallowedhttp__jabber.org_protocol_ibbhttp__jabber.org_protocol_ibb)
* [5 GPGME](#GPGME)
 * [5.1 ::ssj::options(one-passphrase)](#ssjoptionsone-passphrase)
 * [5.2 ::ssj::options(sign-traffic)](#ssjoptionssign-traffic)
 * [5.3 ::ssj::options(encrypt-traffic)](#ssjoptionsencrypt-traffic)
 * [5.4 ::ssj::options(key)](#ssjoptionskey)
 * [5.5 ::ssj::options(display\_sig\_warnings)](#ssjoptionsdisplay_sig_warnings)
* [6 Main Interface](#Main_Interface)
 * [6.1 ::ifacetk::options(use\_tabbar)](#ifacetkoptionsuse_tabbar)
 * [6.2 ::ifacetk::options(tabs\_side)](#ifacetkoptionstabs_side)
 * [6.3 ::ifacetk::options(tab\_minwidth)](#ifacetkoptionstab_minwidth)
 * [6.4 ::ifacetk::options(tab\_maxwidth)](#ifacetkoptionstab_maxwidth)
 * [6.5 ::ifacetk::options(show\_toolbar)](#ifacetkoptionsshow_toolbar)
 * [6.6 ::ifacetk::options(show\_presencebar)](#ifacetkoptionsshow_presencebar)
 * [6.7 ::ifacetk::options(show\_statusbar)](#ifacetkoptionsshow_statusbar)
 * [6.8 ::ifacetk::options(raise\_new\_tab)](#ifacetkoptionsraise_new_tab)
 * [6.9 ::ifacetk::options(message\_numbers\_in\_tabs)](#ifacetkoptionsmessage_numbers_in_tabs)
 * [6.10 ::ifacetk::options(update\_title\_delay)](#ifacetkoptionsupdate_title_delay)
 * [6.11 ::ifacetk::options(show\_tearoffs)](#ifacetkoptionsshow_tearoffs)
 * [6.12 ::ifacetk::options(closebuttonaction)](#ifacetkoptionsclosebuttonaction)
 * [6.13 ::pixmaps::options(pixmaps\_theme)](#pixmapsoptionspixmaps_theme)
 * [6.14 ::webbrowser](#webbrowser)
 * [6.15 Systray](#Systray)
  * [6.15.1 Общие настройки](#Общие_настройки)
   * [6.15.1 ::ifacetk::systray::options(display\_status)](#ifacetksystrayoptionsdisplay_status)
   * [6.15.1 ::ifacetk::systray::options(blink)](#ifacetksystrayoptionsblink)
  * [6.15.2 Настройки расширений работы с треем](#Настройки_расширений_работы_с_треем)
   * [6.15.2 ::plugins::taskbar::options(enable)](#pluginstaskbaroptionsenable)
   * [6.15.2 ::plugins::tktray::options(enable)](#pluginstktrayoptionsenable)
* [7 IQ](#IQ)
 * [7.1 ::iq::options(show\_iq\_requests)](#iqoptionsshow_iq_requests)
 * [7.2 ::iq::options(shorten\_iq\_namespaces)](#iqoptionsshorten_iq_namespaces)
 * [7.3 ::plugins::options(reply\_iq\_last)](#pluginsoptionsreply_iq_last)
 * [7.4 ::plugins::ping::options(ping)](#pluginspingoptionsping)
 * [7.5 ::plugins::ping::options(timeout)](#pluginspingoptionstimeout)
 * [7.6 ::plugins::ping::options(pong)](#pluginspingoptionspong)
 * [7.7 ::plugins::options(reply\_iq\_time)](#pluginsoptionsreply_iq_time)
 * [7.8 ::plugins::options(reply\_xmpp\_time)](#pluginsoptionsreply_xmpp_time)
 * [7.9 ::plugins::options(reply\_iq\_version)](#pluginsoptionsreply_iq_version)
 * [7.10 ::plugins::options(reply\_iq\_os\_version)](#pluginsoptionsreply_iq_os_version)
 * [7.11 ::muc::options(report\_muc\_rooms)](#mucoptionsreport_muc_rooms)
* [8 Login](#Login)
 * [8.1 ::::loginconf(user)](#loginconfuser)
 * [8.2 ::::loginconf(server)](#loginconfserver)
 * [8.3 ::::loginconf(password)](#loginconfpassword)
 * [8.4 ::::loginconf(resource)](#loginconfresource)
 * [8.5 ::::loginconf(priority)](#loginconfpriority)
 * [8.6 ::::loginconf(connect\_forever)](#loginconfconnect_forever)
 * [8.7 ::::loginconf(allowauthplain)](#loginconfallowauthplain)
 * [8.8 ::::loginconf(allowgoogletoken)](#loginconfallowgoogletoken)
 * [8.9 ::::loginconf(usesasl)](#loginconfusesasl)
 * [8.10 ::::loginconf(stream\_options)](#loginconfstream_options)
 * [8.11 ::::loginconf(sslcertfile)](#loginconfsslcertfile)
 * [8.12 ::::loginconf(sslcacertstore)](#loginconfsslcacertstore)
 * [8.13 ::::loginconf(sslkeyfile)](#loginconfsslkeyfile)
 * [8.14 ::::loginconf(proxy)](#loginconfproxy)
 * [8.15 ::::loginconf(proxyhost)](#loginconfproxyhost)
 * [8.16 ::::loginconf(proxyport)](#loginconfproxyport)
 * [8.17 ::::loginconf(proxyusername)](#loginconfproxyusername)
 * [8.18 ::::loginconf(proxypassword)](#loginconfproxypassword)
 * [8.19 ::::loginconf(proxyuseragent)](#loginconfproxyuseragent)
 * [8.20 ::::loginconf(usealtserver)](#loginconfusealtserver)
 * [8.21 ::::loginconf(altserver)](#loginconfaltserver)
 * [8.22 ::::loginconf(altport)](#loginconfaltport)
 * [8.23 ::::loginconf(replace\_opened)](#loginconfreplace_opened)
 * [8.24 ::::loginconf(usehttppoll)](#loginconfusehttppoll)
 * [8.25 ::::loginconf(pollurl)](#loginconfpollurl)
 * [8.26 ::::loginconf(usepollkeys)](#loginconfusepollkeys)
 * [8.27 ::::loginconf(numberofpollkeys)](#loginconfnumberofpollkeys)
 * [8.28 ::::loginconf(polltimeout)](#loginconfpolltimeout)
 * [8.29 ::::loginconf(pollmin)](#loginconfpollmin)
 * [8.30 ::::loginconf(pollmax)](#loginconfpollmax)
* [9 Messages](#Messages)
 * [9.1 ::plugins::headlines::options(cache)](#pluginsheadlinesoptionscache)
 * [9.2 ::plugins::headlines::options(multiple)](#pluginsheadlinesoptionsmultiple)
 * [9.3 ::plugins::headlines::options(display\_subject\_only)](#pluginsheadlinesoptionsdisplay_subject_only)
 * [9.4 ::plugins::headlines::options(timestamp\_format)](#pluginsheadlinesoptionstimestamp_format)
 * [9.5 ::plugins::headlines::options(show\_balloons)](#pluginsheadlinesoptionsshow_balloons)
 * [9.6 ::plugins::offline::options(flexible\_retrieval)](#pluginsofflineoptionsflexible_retrieval)
* [10 Plugins](#Plugins)
* [11 Privacy](#Privacy)
 * [11.1 ::filters::options(enable)](#filtersoptionsenable)
 * [11.2 ::privacy::options(activate\_at\_startup)](#privacyoptionsactivate_at_startup)
 * [11.3 MUC Ignoring](#MUC_Ignoring)
  * [11.3.1 ::plugins::mucignore::options(transient\_rules)](#pluginsmucignoreoptionstransient_rules)
* [12 Remote Control](#Remote_Control)
 * [12.1 ::remote::options(enable)](#remoteoptionsenable)
 * [12.2 ::remote::options(accept\_from\_myjid)](#remoteoptionsaccept_from_myjid)
 * [12.3 ::remote::options(accept\_list)](#remoteoptionsaccept_list)
* [13 Roster](#Roster)
 * [13.1 ::ifacetk::roster::use\_aliases](#ifacetkrosteruse_aliases)
 * [13.2 ::ifacetk::roster::show\_only\_online](#ifacetkrostershow_only_online)
 * [13.3 ::ifacetk::roster::show\_transport\_icons](#ifacetkrostershow_transport_icons)
 * [13.4 ::ifacetk::roster::show\_transport\_user\_icons](#ifacetkrostershow_transport_user_icons)
 * [13.5 ::ifacetk::roster::options(nested)](#ifacetkrosteroptionsnested)
 * [13.6 ::ifacetk::roster::options(nested\_delimiter)](#ifacetkrosteroptionsnested_delimiter)
 * [13.7 ::ifacetk::roster::options(show\_own\_resources)](#ifacetkrosteroptionsshow_own_resources)
 * [13.8 ::ifacetk::roster::options(chats\_group)](#ifacetkrosteroptionschats_group)
 * [13.9 ::ifacetk::roster::options(use\_filter)](#ifacetkrosteroptionsuse_filter)
 * [13.10 ::ifacetk::roster::options(match\_jids)](#ifacetkrosteroptionsmatch_jids)
 * [13.11 ::ifacetk::roster::options(free\_drop)](#ifacetkrosteroptionsfree_drop)
 * [13.12 ::ifacetk::roster::options(show\_subscription)](#ifacetkrosteroptionsshow_subscription)
 * [13.13 ::ifacetk::roster::options(show\_conference\_user\_info)](#ifacetkrosteroptionsshow_conference_user_info)
* [14 Sound](#Sound)
* [15 State](#State)
* [16 Warnings](#Warnings)
 * [16.1 ::tls\_warnings](#tls_warnings)

# <a id="AutoAway"></a>AutoAway
Параметры модуля, автоматически устанавливающего состояние "Отошёл" после установленного периода бездействия. Для того, чтобы у вас автоэвей работал, необходимо установить [дополнительный пакет](http://tkabber.jabber.ru/dependencies) (кстати говоря, без него и пункт настроек этот не появится). Об установке пакета в Виндовс можно почитать [здесь](Tkabber_Windows_Mini_HOWTO.md#WinIdle). И вот до кучи [дополнительное чтиво](Ткаббер_ЧаВо/Глюки.md#Ткаббер_постоянно_держит_меня_в_состоянии_отошёл_away) о возможных проблемах с AutoAway. 







Имейте в виду, что автоэвей в Ткаббере следит за неактивностью прользователя в масштабах системы, а не самого Ткаббера, поэтому если излишек нервных клеток заставил вас запустить Doom 3, перед этим выставьте руками статус "Отошёл" или "Отошёл давно" иначе для остальных вы продолжите оставаться доступным даже будучи на [Фобосе](http://en.wikipedia.org/wiki/Doom_(video_game)). (Справляться со статусами доступности может помочь [этот плагин](Плагины.md#customstatus).) 







## <a id="pluginsautoawayoptionsawaytime"></a>::plugins::autoaway::options(awaytime)

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


## <a id="pluginsautoawayoptionsxatime"></a>::plugins::autoaway::options(xatime)

То же самое, но для состояния "Отошёл давно". По умолчанию стоит 15 минут. 

## <a id="pluginsautoawayoptionsstatus"></a>::plugins::autoaway::options(status)

В этом поле можно дать описание статуса, то есть, причину, по которой Ткаббер перешёл в состояние Away. По умолчанию там написано "Автоматически в состоянии 'отошёл' по бездействию", однако вы можете написать что-нибудь своё, не забывая, впрочем, отразить факт **автоматической** смены статуса. 




## <a id="pluginsautoawayoptionsdrop_priority"></a>::plugins::autoaway::options(drop\_priority)

По умолчанию галочка отмечена, и действие её — сбрасывать приоритет в 0 при достижении состояния "Отошёл давно". Что такое приоритет, [читайте отдельно](Ткаббер_ЧаВо/Разное.md#Приоритет). 



# <a id="Chat"></a>Chat
Параметры разговора. 






## <a id="chatoptionsstop_scroll"></a>::chat::options(stop\_scroll)

Эта опция в настройках идёт второй, но здесь мы опишем её раньше, чтобы вам было понятней, что к чему. По умолчанию она выключена, и это правильно: если её включить, то при получении новых сообщений в чат окошко скроллиться не будет, и вам придётся прокручивать его вручную (с помощью полосы прокрутки или колесом мыши), чтобы следить за разговором. 

## <a id="chatoptionssmart_scroll"></a>::chat::options(smart\_scroll)

Если автопрокрутка у нас включена, имеет смысл улучшить её поведение. Умная прокрутка следит, где вы в данный момент читаете сообщения разговора: если вы выдите самое последнее сообщение, то приход нового сообщения сдвинет уже имеющиеся в окне вверх (сработает прокрутка) и вы увидите это новое сообщение, если же вы читаете ход дискуссии где-то в её середине и не видите последнего сообщения, то поступление нового ничего прокручивать не будет, не отрывая вас от созерцания интересной вам части излитого потока сознания. 







## <a id="chatoptionsdisplay_status_description"></a>::chat::options(display\_status\_description)

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








## <a id="chatoptionsdefault_message_type"></a>::chat::options(default\_message\_type)

По умолчанию стоит "Разговор". Это означает, что при двойном клике на контакте из ростера у вас запустится окно разговора в виде нового таба (или же нового окна разговора, если у вас отключён режим с табами). Если же включить опцию "Обычное", то при двойном клике запускается окно отправки сообщения, которое пропадёт после его отправки. Окно разговора при отправке сообщения не закрывается. 






## <a id="chatoptionsgen_status_change_msgs"></a>::chat::options(gen\_status\_change\_msgs)

Значение по умолчанию — включено, что означает "Генерировать сообщения о том, что собеседник сменил своё присутствие или статусное сообщение". Сообщения о смене статуса появляются в самом окне или табе разговора (не путайте с окном конференции): "[Чтв. Апрель 17 22:19]--- bigote свободен для разговора (Свободен для разговора)". Эта опция может быть полезной для мягкого шпионажа за вашими собеседниками. 






## <a id="pluginscompletionoptionscompletion_expire"></a>::plugins::completion::options(completion\_expire)


Число сообщений, необходимое для того, чтобы отключить автодополнение псевдонима автора последнего сообщения, адресованного персонально. По умолчанию стоит 10. Сейчас расшифруем, что это означает. В Ткаббере можно слать персональные сообщения в общем чате. Для этого надо либо ткнуть в ник человека мышью, либо набрать первые символы его ника и нажать табуляцию. При этом в окне ввода сообщения появится его ник, отделённый от последующего текста двоеточием и пробелом. Теперь пишите свой текст, жмите ввод, и этот человек увидит свой ник в этом сообщении подсвеченным и, если включен звук и настроено уведомление о персональных сообщениях, то услышит, что кто-то персонально к нему обратился. Этот человек теперь может легко ответить так же персонально и вам, просто нажав табуляцию: при этом ваш ник окажется в его окошке ввода текста, и история повторится. Так вот. Если он сразу не воспользуется этой возможностью, то после прихода в чат 10 сообщений и больше нажатие табуляции выведет уже первую доступную по алфавиту команду Ткаббера или социал. 













## <a id="pluginsoptionstimestamp_format"></a>::plugins::options(timestamp\_format)

Формат вывода даты/времени в сообщениях. (Подробнее описание формата можно узнать из документации к команде Tcl 'clock'.) Значение по умолчанию — [%R], что означает лишь часы и минуты. Это мало. В конференциях можно сидеть днями, и тогда бывает необходимо знать, какого числа (а то и месяца) была сказана та или иная фраза. Если не хотите читать документацию к команде 'clock', можете воспользоваться либо примерами, приведёнными рядом с опцией, либо моим выбором: [%a %b %d %H:%M]. 

## <a id="pluginsoptionsdelayed_timestamp_format"></a>::plugins::options(delayed\_timestamp\_format)

Формат "отложенных" сообщений, то есть отправленных более суток назад. Это те сообщения, которые ваши приятели шлют вам, когда вы долго не появляетесь в онлайне, и они начинают волноваться, жмакать кнопку "Показать пользователей в оффлайне" и интересоваться причинами вашего отсутствия. Значение по умолчанию — [%m/%d %R]. Обычно его хватает. 

## <a id="pluginsxhtmloptionsenable"></a>::plugins::xhtml::options(enable)



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

## <a id="pluginslog_on_openoptionsmax_messages"></a>::plugins::log\_on\_open::options(max\_messages)

Максимальное число запротоколированных сообщений, которое надо показывать во вновь открываемом окне разговора (если положить отрицательным, то неограниченное). По умолчанию стоит 20. Когда мы открываем окно разговора с каким-либо из своих контактов, в окне появляется кусок предыдущей с ним беседы, что весьма полезно, если эта предыдущая беседа состоялась месяц назад, и с того момента собеседник вдруг ответил на вашу последнюю реплику. Если вы не помните, о чём был разговор, трудно бывает врубиться, с какого перепугу он вам пишет эту муть. 

## <a id="pluginslog_on_openoptionsmax_interval"></a>::plugins::log\_on\_open::options(max\_interval)

Максимальный интервал (в часах) для которого запротоколированные сообщения надо показывать во вновь открываемом окне разговора (если положить отрицательным, то неограниченный интервал). По умолчанию стоит 24 часа, что для описанного выше случая с разрывом в один месяц явно не подходит. Надо поставить отрицательное значение. 

## <a id="pluginsnickcolorsoptionsuse_colored_nicks"></a>::plugins::nickcolors::options(use\_colored\_nicks)


Использовать цветные псевдонимы в окнах разговоров/конференций. 







## <a id="pluginsnickcolorsoptionsuse_colored_roster_nicks"></a>::plugins::nickcolors::options(use\_colored\_roster\_nicks)


Использовать цветные псевдонимы в списках участников конференций. 








## <a id="pluginsnickcolorsoptionsuse_colored_messages"></a>::plugins::nickcolors::options(use\_colored\_messages)

Использовать цветные сообщения в окнах разговора. Эта и предыдущие две опции отвечает за раскрашивание ников собеседников и их сообщений. Эти опции из разряда тех, которые проще попробовать, чем читать о них или рассказывать. Так что оставляем вас наедине с ними ;) И вот до кучи [информация о возможных проблемах](Ткаббер_ЧаВо/Внешний_вид_и_звук.md#Цвета_сообщений_асечников), связанных с цветами. 





## <a id="mucoptionsgen_enter_exit_msgs"></a>::muc::options(gen\_enter\_exit\_msgs)

Генерировать статусные сообщения о входе/выходе участников в MUC-конференциях. Выше описывалась опция генерации сообщений о смене статуса собеседника. Она похожа на эту, только здесь генерируются сообщения вида "bigote вышел(а) из комнаты: Disconnected", которые показываются в общем чате (другие названия: конференция, MUC). По умолчанию стоит, и правильно делает, что стоит. Так мы знаем, кто и во сколько заходил в конфу и покидал её. 

## <a id="mucoptionsgen_muc_status_change_msgs"></a>::muc::options(gen\_muc\_status\_change\_msgs)


А это — близнец описанной гораздо выше и упомянутой чуть выше опции про генерацию смены статусов. На этот раз — в MUC (Multi-User Conference). 


## <a id="mucoptionsgen_muc_position_change_msgs"></a>::muc::options(gen\_muc\_position\_change\_msgs)

Генерировать сообщения о том, что положение, занимаемое участником конференции (его ранг и/или роль), изменились. Ещё одна шпионская опция. Эта и предыдущая опции по умолчанию выключены, потому что надоедают больше, чем приносят пользы. 

## <a id="mucoptionspropose_configure"></a>::muc::options(propose\_configure)

Предлагать конфигурировать вновь созданную конференцию. Если установить в false, то автоматически принимается конфигурация по умолчанию. Как ясно из описания опции, она про конфигурацию созданных вами конференций. Поскольку по умолчанию она выключена, не забывайте при создании новой комнаты зайти в её меню (кнопка "Тема" в верхней части окна, которая выглядит совсем не кнопкой) и настроить её (**MUC → Конфигурировать комнату**). 




## <a id="mucoptionshistory_maxchars"></a>::muc::options(history\_maxchars)





Максимальное число символов в запрашиваемой истории конференции, совместимой с MUC. По умолчанию 10000. Это напоминает описанную выше опцию про вывод старых разговоров в свежеоткрытом окне. Отличие состоит в том, что тут история выводится даже в том случае, если вы зашли в комнату впервые в жизни. Это делается для того, чтобы вы были в курсе, о чём идёт беседа. Если история вам мешает, вы её можете либо ограничить, либо отключить, вписав 0. 

Важно понимать, что эта и следующие две опции управляют получением истории _с сервера,_ в то время как опции группы `::plugins::log_on_open::options` ведают выемкой сообщений из локальной истории разговоров, которую ведёт Ткаббер. 

## <a id="mucoptionshistory_maxstanzas"></a>::muc::options(history\_maxstanzas)



То же самое, что и предыдущая опция, но уже не про количество символов, а про количество строк в истории. Если быть точным, то речь идёт не о строках как таковых, а о ["станцах"](Терминология.md#Станца_stanza), то есть отправленных в конференцию сообщениях. Так, одно сообщение может содержать несколько строк, но считаться будет всего одна станца. По умолчанию (и кажется, по максимуму тоже) 20. 

## <a id="mucoptionsrequest_only_unseen_history"></a>::muc::options(request\_only\_unseen\_history)

Запрашивать только те сообщения из истории, которые не показаны в уже открытом окне (для конференции, совместимой с MUC). Это на случай кратковременного дисконнекта. Допустим, вы брыкнули ногой и выдернули сетевой кабель, однако вовремя спохватились и быстро воткнули его обратно. Однако часть разговора прошла без вас. Спасибо предыдущим двум опциям, она не потерялась, и сервер заботливо её вам вывел. Но тут вот и фишка данной опции: если история "перехлёстывается" с содержимым открытого окна чата, то вам в окно выведутся только те фразы, которые прозвучали, когда вас реально не было, а не все 20 строчек и 10000 символов, прибитые гвоздями предыдущими опциями. 



## <a id="pluginstclchatoptionsuse_tkchat_colors"></a>::plugins::tclchat::options(use\_tkchat\_colors)







Использовать встроенные цвета TkChat. Это не вам, дорогие начинающие пользователи. Это вот [им](http://wiki.tcl.tk/tkchat). 








---





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








## <a id="Chatstate"></a>Chatstate


























Настройки расширения, отвечающего за уведомление о состоянии окна разговора. 

### <a id="pluginschatstateoptionsenable"></a>::plugins::chatstate::options(enable)

Включить рассылку уведомлений о состоянии окна разговора ([XEP-0085](http://www.xmpp.org/extensions/xep-0085.html)). Если вы включите эту опцию, то будете получать уведомления типа "собеседник пишет письмо турецкому султану" в верхней части окна. Таким образом вы знаете, что он не балду гоняет, не игнорит вас, а честно пишет ответ. Полезная опция. 





В настоящее время Ткаббер способен посылать только два состояния: `<active/>` и `<composing/>` (на что уже пожаловались [тут](http://www.jabber.ru/bugzilla/show_bug.cgi?id=360)), однако понимает он все состояния. 




Имейте в виду, что в Ткаббере есть [аналогичная настройка](Настройки.md#Events), управляющая _другим механизмом_ реализации той же самой, в принципе, функциональности, но на основе устаревшего в настоящее время [расширения XMPP](http://www.xmpp.org/extensions/xep-0022.html). 




## <a id="Emoticons"></a>Emoticons

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



### <a id="pluginsemoticonsoptionsshow_emoticons"></a>::plugins::emoticons::options(show\_emoticons)

Показывать эмоциконки в виде картинок. 

### <a id="pluginsemoticonsoptionstheme"></a>::plugins::emoticons::options(theme)

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



### <a id="pluginsemoticonsoptionsmatch_whole_word"></a>::plugins::emoticons::options(match\_whole\_word)

Только целые слова превращать в эмоциконки (не части слов). Этот параметр установлен по умолчанию, а отвечает он за то, чтобы в картинку преобразовывался лишь полноценный смайлик, не прижатый к впереди идущему слову. 



### <a id="pluginsemoticonsoptionshandle_lol"></a>::plugins::emoticons::options(handle\_lol)

Отдельные очень улыбчивые личности любят писать в чатах смайлики с двойными, а то и тройными подбородками — :)))))) Эта опция приводит такие улыбки к нормальному виду и потом преобразует в нормальный графический смайл. 



## <a id="Events"></a>Events

Настройки расширения, отвечающего за уведомление об обработке сообщений в окне разговора. 




### <a id="pluginseventsoptionsenable"></a>::plugins::events::options(enable)

Реализация устаревшего в настоящее время [XEP-0022](http://www.xmpp.org/extensions/xep-0022.html), которое было замещено другим механизмом, который управляется [соответствующей группой настроек](Настройки.md#Chatstate). 



Эту опцию имеет смысл держать включённой только если вы общаетесь с владельцами дремучих клиентов. 


![(!)](../images/Hammer.png) **Сделать:** хорошо бы выяснить что гейтуют и что не гейтуют из этого распространённые ICQ-гейты 


По умолчанию включена. 

## <a id="Highlight"></a>Highlight

Настройки модуля выделения слов в сообщениях конференций. 

### <a id="pluginshighlightoptionsenable_highlighting"></a>::plugins::highlight::options(enable\_highlighting)

Включить модуль выделения слов. По умолчанию включён. 

### <a id="pluginshighlightoptionshighlight_nick"></a>::plugins::highlight::options(highlight\_nick)





Выделять текущий псевдоним в сообщениях. Выше я рассказал про автодополнение ников, опция ::plugins::completion::options(completion\_expire). Там приводил пример о подсвечивании собственного ника, если кто-то его в чате пишет (например, обращаясь ко мне). Вот здесь оно и настраивается, то бишь, это подсвечивание можно и выключить. 





### <a id="pluginshighlightoptionshighlight_substrings"></a>::plugins::highlight::options(highlight\_substrings)

Подстроки, которые следует выделять в сообщениях. Ещё один полушпионский модуль, позволяет подсвечивать ключевые слова, указанные в поле. Разделителем является пробел, регистр надо учитывать. Введём для примера три слова, разделённых пробелами: **вот такой тест**. Теперь любое из этих слов, появившись в окне чата, будет подсвечено. Если попытаться подсвечивать не отдельные слова, а подстроку, содержащую пробелы (несколько слов), то возникают проблемы. Допустим, мы пытаемся указать Ткабберу, что подстрока ограничена кавычками (как для точного поиска в Гугле): **"вот такой тест"**. Теперь пишем в чате одно из этих слов — не подсвечивает. Пишем строку целиком, но без кавычек: **вот такой тест** — не подсвечивает. Пишем строку с кавычками: **"вот такой тест"** — подсвечивает. 

### <a id="pluginshighlightoptionshighlight_whole_words"></a>::plugins::highlight::options(highlight\_whole\_words)

Выделять только целые слова. Если выключить эту опцию (а по умолчанию она включена), то подсвечиваться будут как целые слова, так и части слов, подпадающие под заданные вами паттерны. Например, продолжая начатый выше пример, напишем в чате слово "живот", имея в качестве ключевых слов **вот такой тест**. При включённой опции ничего не выделится, но если её отключить, то получим "жи**вот**" (кавычки здесь написаны лишь для отделения слова-примера от повествования). 

## <a id="Logging"></a>Logging

Параметры протоколирования. 

### <a id="loggeroptionslogdir"></a>::logger::options(logdir)

Директория, в которой сохраняются протоколы. Надо указать что-нибудь осмысленное. 



### <a id="loggeroptionslog_chat"></a>::logger::options(log\_chat)

Сохранять протоколы персональных разговоров. По умолчанию включено. 

### <a id="loggeroptionslog_groupchat"></a>::logger::options(log\_groupchat)

Сохранять протоколы конференций.  По умолчанию включено. 







## <a id="MUC_Ignoring"></a>MUC Ignoring

Игнорирование групповых и приватных сообщений от выбранных посетителей многопользовательской конференции. 

### <a id="pluginsmucignoreoptionstransient_rules"></a>::plugins::mucignore::options(transient\_rules)



Если параметр установлен, то все изменения правил игнорирования будут действовать только до того, как Ткаббер закроется, и не будут восстановлены при следующем запуске. По умолчанию выключено, то есть, правила сохраняются. [Читать подробнее об игнорировании в конференциях](MUC_Ignore.md). 

## <a id="Stylecodes"></a>Stylecodes

Обработка стилевых кодов. Стилевые коды — это специальные символы для выделения частей текста полужирным, курсивным или подчеркнутым начертанием и их комбинациями. 

### <a id="pluginsstylecodesoptionsemphasize"></a>::plugins::stylecodes::options(emphasize)

























Выделять сообщения со стилевыми кодами, используя разные шрифты. Про это вы уже, надеюсь, [прочитали](Начинающим.md#Некоторые_полезные_команды). 


### <a id="pluginsstylecodesoptionshide_markup"></a>::plugins::stylecodes::options(hide\_markup)

Скрывать символы, задающие разметку стилевых кодов. Выделяет точно так же, как и в предыдущей опции, но при этом ещё и показывает сами управляющие коды, то есть, мы так и видим: **\*жирный текст\***. 



Эту опцию полезно включить тем, кому нравится использовать/видеть выделение стайлкодами, но кто так же достаточно часто пишет/видит текст, который вызывает "ложные срабатывания" движка, ответственного за "отлов" символов разметки, определяющих выделения. Например, наиболее известная проблема движка стайлкодов — срабатывание на именах каталогов Unix: `/usr/share/` отображается как `/usr_share_`; если же данная опция включена, вы будете видеть `/usr_/share/_`. 






С другой стороны, имейте в виду, что скрытые символы разметки стайлкодов не влияют на текст, который помещается в буфер обмена при копировании: если вы выделите описанный выше текст `/usr_share_` и затем вставите его куда-нибудь, то вставлен будет текст `/usr/share/`, а не `/usrshare`. 




## <a id="Vcard"></a>Vcard

Параметры отображения полей vCard в окне разговора. Зайдя внутрь, вы выпадете в осадок. Там находится здоровенный список опций, позволяющих настроить внешний вид, а точнее, показ нужных вам полей vCard. Если вы хотите быть готовыми к любой, даже самой полной карточке, надо включить все поля. Если вы точно уверены, что никто из ваших собеседников не будет пользоваться телефоном ISDN, то можно соответствующее поле отключить. 






# <a id="Conference_Info"></a>Conference Info
Параметры модуля информации о конференциях, позволяющего видеть список участников конференции, закладка на которую находится в вашем списке контактов, во всплывающем окне, независимо от того, подключены Вы к конференции или нет. 



## <a id="pluginsconferenceinfooptionsautoask"></a>::plugins::conferenceinfo::options(autoask)

Подключить данный модуль. По умолчанию он отключён. Надеюсь, понятно, зачем он нужен (см. чуть выше). Осторожнее с этой фичей: она гонит неслабый трафик. 


## <a id="pluginsconferenceinfooptionsinterval"></a>::plugins::conferenceinfo::options(interval)

Интервал (в минутах) между запросами списка участников. Если вы мигрировали на новую версию Ткаббера с какой-нибудь старой, и у вас остались старые настройки в конфиге, проверьте интервал обновления. Старые настройки были в секундах, и если нынешний Ткаббер начнёт запрашивать списки с интервалом в 300 минут, пользы от такой опции мало :) 





## <a id="pluginsconferenceinfooptionserr_interval"></a>::plugins::conferenceinfo::options(err\_interval)

Интервал (в минутах) после ошибки в ответ на запрос списка участников. В старых настройках по умолчанию стояло 3600 (секунд), так что если вы переехали со старой версии Ткаббера, напишите в этом поле 60. 



# <a id="File_Transfer"></a>File Transfer
Параметры передачи файлов. Тема эта интересная, но сложноватая для новичка. Подробнее о пересылке файлов можно почитать в [этой статье](Пересылка_файлов__теория.md). 



## <a id="ftoptionsdownload_dir"></a>::ft::options(download\_dir)

Директория в которой по умолчанию сохраняются полученные файлы. 

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



## <a id="ftoptionsdefault_proto"></a>::ft::options(default\_proto)

Протокол передачи файлов по умолчанию. Здесь уже установлен Stream Initiation, и он обычно подходит для большинства соединений. Если у вас проблемы при передаче файлов, чтения вышеупомянутой статьи не избежать. 



---

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



## <a id="HTTP"></a>HTTP

Параметры HTTP-транспорта. 

### <a id="pluginshttpoptionsport"></a>::plugins::http::options(port)

Порт для исходящей передачи файлов по HTTP (если равен 0, то выбирается автоматически). Применяется, когда файл посылается через NAT через пробрасываемый порт. По умолчанию стоит 0. 



### <a id="pluginshttpoptionshost"></a>::plugins::http::options(host)

Объявлять указанное имя (или IP-адрес) для исходящей передачи файлов по HTTP. 

## <a id="Jidlink"></a>Jidlink

Настройки Jidlink. Jidlink — устаревший протокол, по-видимому, кроме Ткаббера нигде и не реализованный, но тем не менее может использоваться на связке Ткаббер-Ткаббер, если остальные варианты не работают. 



### <a id="jidlinktransportalloweddtcp-active"></a>::jidlink::transport(allowed,dtcp-active)

Разрешить использование Jidlink-транспорта dtcp-active. По умолчанию включён. 

### <a id="jidlinktransportalloweddtcp-passive"></a>::jidlink::transport(allowed,dtcp-passive)

Разрешить использование Jidlink-транспорта dtcp-passive. По умолчанию выключён. 

### <a id="jidlinktransportallowedinband-bytestream"></a>::jidlink::transport(allowed,inband-bytestream)

Разрешить использование Jidlink-транспорта inband-bytestream. По умолчанию включён. 




## <a id="Stream_Initiation"></a>Stream Initiation

Параметры SI-транспорта. 

### <a id="sisocks5initiatoroptionsenable_mediated_connection"></a>::si::socks5::initiator::options(enable\_mediated\_connection)

Использовать соединение SOCKS5 через посредника, если он доступен. Включён. 

### <a id="sisocks5initiatoroptionsproxy_servers"></a>::si::socks5::initiator::options(proxy\_servers)

Список прокси-серверов для передачи потока SOCKS5 (попытка использовать в качестве посредника будет предпринята для всех доступных серверов). Тут уже прописаны некоторые сервера. Если что-то идёт не так, можете попробовать указать свои. 




### <a id="sitransportallowedhttp__jabber.org_protocol_bytestreamshttp__jabber.org_protocol_bytestreams"></a>::si::transport(allowed,[http://jabber.org/protocol/bytestreams](http://jabber.org/protocol/bytestreams))

Разрешить использование SI-транспорта [http://jabber.org/protocol/bytestreams](http://jabber.org/protocol/bytestreams). Включён. 



### <a id="sitransportallowedhttp__jabber.org_protocol_iqibbhttp__jabber.org_protocol_iqibb"></a>::si::transport(allowed,[http://jabber.org/protocol/iqibb](http://jabber.org/protocol/iqibb))


Разрешить использование SI-транспорта [http://jabber.org/protocol/iqibb](http://jabber.org/protocol/iqibb). Тоже включён. 


### <a id="sitransportallowedhttp__jabber.org_protocol_ibbhttp__jabber.org_protocol_ibb"></a>::si::transport(allowed,[http://jabber.org/protocol/ibb](http://jabber.org/protocol/ibb))

Разрешить использование SI-транспорта [http://jabber.org/protocol/ibb](http://jabber.org/protocol/ibb). Тоже включён. 


# <a id="GPGME"></a>GPGME
Параметры GPGME (цифровая подпись и шифрование). Для того, чтобы шифрование в Ткаббере заработало и этот пункт настроек появился у вас, необходимо [установить необходимые пакеты](http://tkabber.jabber.ru/gpg). Учтите, что шифрование в Ткаббере возможно только в Linux. [Читайте дополнительно по теме.](Ткаббер_ЧаВо/Глюки.md#Шифрование_в_Ткаббере_проблемы_с_gpgme_tclgpgme) 





## <a id="ssjoptionsone-passphrase"></a>::ssj::options(one-passphrase)

Использовать одну и ту же парольную фразу для подписи и шифрования сообщений. 

## <a id="ssjoptionssign-traffic"></a>::ssj::options(sign-traffic)

Подписывать исходящие сообщения и обновления присутствия с помощью [GPG](http://www.gnupg.org). 


## <a id="ssjoptionsencrypt-traffic"></a>::ssj::options(encrypt-traffic)

Шифровать исходящие сообщения с помощью GPG, если возможно. 

## <a id="ssjoptionskey"></a>::ssj::options(key)

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



## <a id="ssjoptionsdisplay_sig_warnings"></a>::ssj::options(display\_sig\_warnings)

Показывать предупреждения в случае неудачи при проверке подписи. 

# <a id="Main_Interface"></a>Main Interface
Параметры основного интерфейса. 

## <a id="ifacetkoptionsuse_tabbar"></a>::ifacetk::options(use\_tabbar)






Использовать интерфейс с вкладками ("табами"). По умолчанию включён. После применения требуется рестарт. 

## <a id="ifacetkoptionstabs_side"></a>::ifacetk::options(tabs\_side)

Сторона, с которой следует размещать заголовки вкладок в режиме с вкладками. По умолчанию стоит "Сверху". Остальные возможные варианты — "Снизу", "Слева", "Справа". 



## <a id="ifacetkoptionstab_minwidth"></a>::ifacetk::options(tab\_minwidth)

Минимальная ширина кнопок заголовков вкладок в режиме со вкладками. По умолчанию стоит 90 пикселей. 


## <a id="ifacetkoptionstab_maxwidth"></a>::ifacetk::options(tab\_maxwidth)

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





## <a id="ifacetkoptionsshow_toolbar"></a>::ifacetk::options(show\_toolbar)

Показывать панель инструментов (то бишь панель с кнопками). По умолчанию включена. 


## <a id="ifacetkoptionsshow_presencebar"></a>::ifacetk::options(show\_presencebar)

Показывать панель присутствия/статуса. Это панель в нижней части окна Ткаббера, где слева расположена кнопка принудительной смены статуса, а справа от неё — поле для ввода описания статуса. После ввода описания не забывайте нажимать Enter в поле ввода или менять статус. 




## <a id="ifacetkoptionsshow_statusbar"></a>::ifacetk::options(show\_statusbar)

Показывать статусную строку. Это панелька, расположенная в самом низу. На первый взгляд, толку от неё мало, но на самом деле там мелькают полезные сообщения вроде уведомлений о коннекте ваших друзей, о смене их статуса и прочие. 




Там же появляется аббревиатура "SSL", если вы соединились с сервером, используя защиту канала ("STARTTLS" или "Старый SSL" в окне логина). Если аббревиатура нарисована чёрным цветом (или тем, что у вас выбрано вместо обычного цвета текста), Ткабберу удалось удостовериться в том, что сервер "настоящий" (то есть мы доверяем его сертификату), если цвет аббревиатуры — красный, то достоверность сертификата сервера проверить не удалось (подробнее об этих заморочках написано в [отдельной статье](Проверка_сертификата_сервера.md)). Одиночный щелчок мышью на этой аббревиатуре показывает диалог с информацией о сертификате сервера и алгоритме шифрования, используемом для защиты соединения. 









## <a id="ifacetkoptionsraise_new_tab"></a>::ifacetk::options(raise\_new\_tab)

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







## <a id="ifacetkoptionsmessage_numbers_in_tabs"></a>::ifacetk::options(message\_numbers\_in\_tabs)

Показывать число непрочитанных сообщений в заголовках вкладок. По умолчанию включено. Очень удобно — сразу видно, сколько наболтали в каждой комнате, пока вас не было :) 



## <a id="ifacetkoptionsupdate_title_delay"></a>::ifacetk::options(update\_title\_delay)

Задержка (в миллисекундах) между получением фокуса и обновлением заголовка окна или вкладки. По умолчанию стоит 600 мс. 



В ходе сеанса связи, когда окно Ткаббера неактивно, каждое новое сообщение вызвает изменение заголовка окна Ткаббера: пред полным JID'ом вашего соединения пишется количество непрочитанных сообщений в скобках, а так же за этим числом рисуется "звёздочка" (\*), если среди сообщений есть адресованные лично вам (или "хайлайты" в конференциях). После того, как вы активируете окно с Ткаббером, он отсчитывает указанное в данной опции количество миллисекунд, после чего сбрасывает заголовок окна в исходное состояние, которое оно имеет сразу после успешного соединения с сервером, убирая информацию о наличии непрочитанных сообщений. Если вы успеете в течение этого интервала времени переключиться в какое-либо другое окно, заголовок окна Ткаббера останется без изменений. 










Помимо обновления заголовка окна, эта настройка управляет индикацией в иконке панели системных уведомлений ("трея"), так как её состояние изменяется синхронно с заголовком окна и отображает ту же информацию, только другими средствами. 




![(!)](../images/Hammer.png) **Сделать:** изучить поведение этой настройки в случае многооконного интерфейса 


## <a id="ifacetkoptionsshow_tearoffs"></a>::ifacetk::options(show\_tearoffs)

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






## <a id="ifacetkoptionsclosebuttonaction"></a>::ifacetk::options(closebuttonaction)

Действие, совершаемое при нажатии на кнопку закрытия окна. По умолчанию стоит "Закрыть Ткаббер", и это поведение ваш покорный слуга (и, к счастью, авторы программы тоже) находит правильным. Это уже извращённые умы придумали _сворачивать_ программу при нажатии на кнопку **Закрыть**. Впрочем, если вы уже привыкли к этой мелкой лжи, можете не отучиваться — Ткаббер предоставляет несколько вариантов сворачивания. 






## <a id="pixmapsoptionspixmaps_theme"></a>::pixmaps::options(pixmaps\_theme)

Тема пиктограмм Tkabber'а. Чтобы иметь возможность включить собственную тему, положите её в поддиректорию директории pixmaps, которая лежит рядом с файлом конфигурации (про то, где его искать, можно почитать [здесь]($__configdir.md)). А [здесь](Цветовые_темы_и_пиктограммы.md#Пиктограммы) можно разжиться пиктограммами, не включёнными в дистрибутив. 





## <a id="webbrowser"></a>::webbrowser

Команда, которая будет выполнена при нажатии на URL в сообщении. Вместо '%s' будет подставлен URL (например, "galeon -n %s"). Иногда (особенно в Виндовс) у людей возникают проблемы с открытием линков в браузере. Читайте о них [здесь](Ткаббер_ЧаВо/Глюки.md#Не_работает_браузер_под_виндами) и [здесь](Ткаббер_ЧаВо/Глюки.md#При_клике_на_URLе_в_Ткаббере_запускается_две_Оперы_и_открывают_страницу_два_раза). 

---









## <a id="Systray"></a>Systray

Параметры значка области системных уведомлений ("трея", системного лотка). 

Эта группа настроек появляется в интерфейсе настроек только в том случае, если Ткабберу доступно соответствующее расширение Tk, реализующее работу с треем: в Windows это пакет [Winico](http://sourceforge.net/projects/tktable/), а в системах на базе X Window используется минимум два разных пакета: Tk\_Theme и tktray. 





Настройки трея, если доступны, делятся, соответственно, на общие и уникальные для каждого конкретного расширения: 


### <a id="Общие_настройки"></a>Общие настройки

#### <a id="ifacetksystrayoptionsdisplay_status"></a>::ifacetk::systray::options(display\_status)

Показывать всплывающее статусное окно ("тултип") над иконкой в трее, когда главное окно свернуто. По умолчанию выключено. 


Следует отметить, что показ статусного окна в Windows, очевидно сломан: окно с иконкой докладывает кривую информацию о своём местоположении на экране, и статусное окно поэтому рисуется неподалёку от верхнего левого угла десктопа. Побороть это можно [заклинаниями в файле конфигурации](Нетривиальные_настройки.md#Настройка_положения_окна_уведомлений_в_Windows). 





#### <a id="ifacetksystrayoptionsblink"></a>::ifacetk::systray::options(blink)

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






### <a id="Настройки_расширений_работы_с_треем"></a>Настройки расширений работы с треем

#### <a id="pluginstaskbaroptionsenable"></a>::plugins::taskbar::options(enable)

Использовать значок в системном лотке Windows. 

Доступна, если иконка в трее управляется пакетом Winico. 

#### <a id="pluginstktrayoptionsenable"></a>::plugins::tktray::options(enable)

Включить freedesktop system tray icon. 

Появляется, если иконка в трее управляется пакетом tktray. 

![(!)](../images/Hammer.png) **Сделать:** то же для Tk\_Theme 

# <a id="IQ"></a>IQ
Параметры Info/Query (информационные и служебные запросы). Многие из этих опций трафикогонные. Проконсультируйтесь со статьёй [Low traffic HOWTO\#Настройки Ткаббера](Low_traffic_HOWTO.md#Настройки_Ткаббера) (подраздел "Ответы на IQ-запросы"), чтобы быть в курсе, какие можно безболезненно отключить, а какие лучше не трогать. 





## <a id="iqoptionsshow_iq_requests"></a>::iq::options(show\_iq\_requests)

Показывать IQ-запросы в статусной строке. По умолчанию включено. Если у вас отключена сама статусная строка (в Main Interface), то держать включённой эту опцию не имеет смысла. 



## <a id="iqoptionsshorten_iq_namespaces"></a>::iq::options(shorten\_iq\_namespaces)

Опускать "http://jabber.org/protocol/" при показе запросов в статусной строке. По умолчанию включено. 


## <a id="pluginsoptionsreply_iq_last"></a>::plugins::options(reply\_iq\_last)

Отвечать на запросы времени бездействия (jabber:iq:last). Первые три опции включены по умолчанию. 


## <a id="pluginspingoptionsping"></a>::plugins::ping::options(ping)

Пинговать сервер запросами urn:xmpp:ping. По умолчанию выключено. 

## <a id="pluginspingoptionstimeout"></a>::plugins::ping::options(timeout)

Переподключаться к серверу, если он не ответил (возможно ошибкой) на пинг (urn:xmpp:ping) за указанный временной интервал (в секундах). По умолчанию 30 секунд. 



## <a id="pluginspingoptionspong"></a>::plugins::ping::options(pong)

Отвечать на пинг (urn:xmpp:ping). По умолчанию включено. 

## <a id="pluginsoptionsreply_iq_time"></a>::plugins::options(reply\_iq\_time)

Отвечать на запросы времени (jabber:iq:time). Тоже включено. В Ткаббере реализованы команды запроса времени, версии и т. п. В данном случае это "/time nick". Эта опция разрешает отвечать на подобные запросы. 



## <a id="pluginsoptionsreply_xmpp_time"></a>::plugins::options(reply\_xmpp\_time)

Reply to entity time (urn:xmpp:time) requests. 

## <a id="pluginsoptionsreply_iq_version"></a>::plugins::options(reply\_iq\_version)

Отвечать на запросы версии (jabber:iq:version). Отвечает на запросы типа "/version nick". 


## <a id="pluginsoptionsreply_iq_os_version"></a>::plugins::options(reply\_iq\_os\_version)

Включать информацию об операционной системе в ответ на запрос версии (jabber:iq:version). Позволяет при ответе на запрос о версии клиента отдавать информацию и о вашей операционке. Если вы хотите сообщать версию Ткаббера, но не выдавать инфу о системе, отключите её. 




## <a id="mucoptionsreport_muc_rooms"></a>::muc::options(report\_muc\_rooms)

Отвечать на запрос disco\#items о MUC-конференциях, в которых Вы принимаете участие. 


# <a id="Login"></a>Login
Параметры подключения. Если вы уже залогинены, некоторые поля будут заполненными вашими данными для логина, причём рядом с кнопкой "Состояние" будет написано "Параметр установлен, но не сохранён для следующих сессий". Это нормально. Кстати, если вы не планируете устраивать мультилогин или создавать несколько профилей, можете сохранить эти значения для будущих сессий (кроме пароля, ибо файл custom.tcl, куда сохраняются все настройки, никак не шифруется; если вы хотите настроить безопасный автологин без ввода пароля, почитайте [здесь](Плагины.md#CryptoConfig)). Многие параметры логина рассмативаются в статьях [Начинающим](Начинающим.md) и [Между офлайном и онлайном](Между_офлайном_и_онлайном.md), так что здесь мы отвлекаться на их описание не будем. 

## <a id="loginconfuser"></a>::::loginconf(user)









Имя пользователя. 

## <a id="loginconfserver"></a>::::loginconf(server)

Имя сервера. 







## <a id="loginconfpassword"></a>::::loginconf(password)

Пароль. 

## <a id="loginconfresource"></a>::::loginconf(resource)

[Ресурс](Ткаббер_ЧаВо/Разное.md#Ресурс). 

## <a id="loginconfpriority"></a>::::loginconf(priority)

[Приоритет](Ткаббер_ЧаВо/Разное.md#Приоритет). 

## <a id="loginconfconnect_forever"></a>::::loginconf(connect\_forever)

Пытаться подключаться бесконечно много раз. 

## <a id="loginconfallowauthplain"></a>::::loginconf(allowauthplain)

Разрешить механизмы аутентификации, использующие открытый текст (при этом пароль передается незашифрованным). 


Если вы не знаете, что делать с этой опцией, отключите её. 

Остальным будет полезно знать две вещи: 

*  Вменяемые реализации серверов разрешают клиенту использовать данный механизм аутентификации только если до её начала канал был защищён при помощи TLS (SSL). 


*  Включение на сервере нестандартного способа аутентификации пользователей (например, при помощи внешней программы или LDAP) _требует_ использовать механизм аутентификации открытым текстом (при этом в случае с ejabberd предыдущий пункт перестаёт выполняться, и если вы развёртываете сервер с нестанратным подходом к аутентификации пользователей, задумайтесь об обязательном внедрении TLS). 






## <a id="loginconfallowgoogletoken"></a>::::loginconf(allowgoogletoken)

Разрешить использование механизма аутентификации X-GOOGLE-TOKEN. 

Имеет смысл только при подключении к серверам Google Talk и для своей работы требует возможности подключения к серверам Google Talk по протоколу HTTPS, что, в свою очередь, требует доступности для Ткаббера пакета **tls**. 



Подключение к Google Talk — особая, сложная тема с некоторым количеством подводных камней, поэтому ей посвящена [отдельная статья](Google_Talk.md). 


## <a id="loginconfusesasl"></a>::::loginconf(usesasl)

Использовать SASL для аутентификации. 


Держите включённой. Отключать её следует только в особо сложных случаях, например, при соединениях с очень древними серверами (например, jabberd1) и то, только если с включённой опцией Ткаббер отказывается соединяться, выдавая ошибку "Server did not provide SASL feature". 



## <a id="loginconfstream_options"></a>::::loginconf(stream\_options)

Настройки XMPP-потока при подключении к серверу. 

## <a id="loginconfsslcertfile"></a>::::loginconf(sslcertfile)

Файл сертификата SSL (необязательный параметр). 

## <a id="loginconfsslcacertstore"></a>::::loginconf(sslcacertstore)

Файл или директория центра сертификации (CA) SSL (необязательный параметр). 

## <a id="loginconfsslkeyfile"></a>::::loginconf(sslkeyfile)

Файл секретного ключа SSL (необязательный параметр). 

## <a id="loginconfproxy"></a>::::loginconf(proxy)

Тип прокси для подключения. 

## <a id="loginconfproxyhost"></a>::::loginconf(proxyhost)

Адрес прокси-сервера. По умолчанию указан localhost. 

## <a id="loginconfproxyport"></a>::::loginconf(proxyport)

Порт для подключения к прокси-серверу. Значение по умолчанию — 3128. 

## <a id="loginconfproxyusername"></a>::::loginconf(proxyusername)

Имя пользователя для подключения к прокси-серверу. 

## <a id="loginconfproxypassword"></a>::::loginconf(proxypassword)

Пароль для подключения к прокси-серверу. 

## <a id="loginconfproxyuseragent"></a>::::loginconf(proxyuseragent)

Строка User-Agent. 

## <a id="loginconfusealtserver"></a>::::loginconf(usealtserver)

Использовать явно указанные адрес сервера и порт для подключения. 

## <a id="loginconfaltserver"></a>::::loginconf(altserver)

Имя альтернативного сервера или его IP-адрес. 

## <a id="loginconfaltport"></a>::::loginconf(altport)

Порт для подключения к альтернативному серверу. 

## <a id="loginconfreplace_opened"></a>::::loginconf(replace\_opened)

Закрыть открытые соединения. Для перелогина. Если вы планируете работать в одном окне Ткаббера с двумя или более аккаунтами, отключите эту опцию. Если же нет, лучше включите, чтобы не плодить открытые соединения в случае перелогина. 



## <a id="loginconfusehttppoll"></a>::::loginconf(usehttppoll)

Использовать HTTP-подключение. 

## <a id="loginconfpollurl"></a>::::loginconf(pollurl)

URL для подключения (опроса). 

## <a id="loginconfusepollkeys"></a>::::loginconf(usepollkeys)

Использовать ключи безопасности HTTP-подключения (рекомендуется). 

## <a id="loginconfnumberofpollkeys"></a>::::loginconf(numberofpollkeys)

Число ключей безопасности, после передачи серверу которых генерируется новая последовательность ключей. 


## <a id="loginconfpolltimeout"></a>::::loginconf(polltimeout)

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


## <a id="loginconfpollmin"></a>::::loginconf(pollmin)

Минимальный интервал между HTTP-запросами. 

## <a id="loginconfpollmax"></a>::::loginconf(pollmax)

Максимальный интервал между HTTP-запросами. 

















# <a id="Messages"></a>Messages
Параметры отображения сообщений и новостей. 




## <a id="pluginsheadlinesoptionscache"></a>::plugins::headlines::options(cache)


Сохранять новости при выходе и восстанавливать при старте. Пользуйтесь этой опцией, учитывая следующее. Если у вас много фидов и если вы чистите окно от устаревших сообщений редко, то при включённом сохранении сообщения потихоньку накапливаются, и стартующий Ткаббер начинает грузиться заметно дольше. Впрочем, опция полезна, так как не всегда есть время прочитать какую-то новость прямо сейчас, до закрытия Ткаббера. При работе с новостями может оказаться удобным внешний плагин [Rsssaver](Плагины.md#Rsssaver), сохраняющий новости в файл каждые N новых сообщений. Стандартное поведение Ткаббера — сохранять их только при выходе; при аварийном завершении программы все новые сообщения, пришедшие за этот сеанс, теряются. 





## <a id="pluginsheadlinesoptionsmultiple"></a>::plugins::headlines::options(multiple)

Показывать новости в одном/нескольких окнах. Позволяет выбрать, использовать ли одно окно для всех новостей или же группировать новости по джидам фидов в отдельных окнах. 



## <a id="pluginsheadlinesoptionsdisplay_subject_only"></a>::plugins::headlines::options(display\_subject\_only)


Не показывать описание новости в виде ветви дерева (только всплывающее окно). 







## <a id="pluginsheadlinesoptionstimestamp_format"></a>::plugins::headlines::options(timestamp\_format)



Формат вывода даты/времени в окне новостей. Для того, чтобы не показывать дату/время совсем, установите эту опцию в пустую строку. 





## <a id="pluginsheadlinesoptionsshow_balloons"></a>::plugins::headlines::options(show\_balloons)





Показывать всплывающие окна (тултипы) с текстом новости над заголовками сообщений. 

## <a id="pluginsofflineoptionsflexible_retrieval"></a>::plugins::offline::options(flexible\_retrieval)


Получать офлайновые сообщения с использованием протокола типа POP3. 


# <a id="Plugins"></a>Plugins
Параметры расширений. Содержимое этого раздела настроек сильно зависит от того, какие плагины у вас установлены. Возможно, имеет смысл описать настройки всех имеющихся плагинов, но статья и так уже слишком большая, так что ограничимся лишь рекомендацией вникать в строчки описания и действовать метдом тыка, если вникнуть сложно. В ближайшем будущем статья [Плагины](Плагины.md) подвергнется доработке, и скорее всего, опции настройки каждого плагина будут помещены туда. 

# <a id="Privacy"></a>Privacy
Настройки блокировки сообщений (правил обеспечения приватности XMPP). 




## <a id="filtersoptionsenable"></a>::filters::options(enable)










Включить поддержку модуля mod\_filter из jabberd 1.4 (устаревшие). По умолчанию эта поддержка выключена. То и понятно, зачем по умолчанию грузить поддержку устаревшего хлама? Если вы уверены, что ваш сервер — именно jabberd 1.4, возможно, эта опция вам понадобится. 




## <a id="privacyoptionsactivate_at_startup"></a>::privacy::options(activate\_at\_startup)

Активировать видимый/невидимый/игнорируемый списки (и список конференций) перед тем, как объявлять о своём присутствии в сети. По умолчанию эта опция включена, но вам может понадобиться отключить её. Подробнее об одном из таких случаев читайте в статье [Блокировка MRIM-спама](Блокировка_MRIM-спама.md). 

## <a id="MUC_Ignoring"></a>MUC Ignoring








Игнорирование групповых и приватных сообщений от выбранных посетителей многопользовательской конференции. В этом подразделе имеется всего одна опция: 

### <a id="pluginsmucignoreoptionstransient_rules"></a>::plugins::mucignore::options(transient\_rules)


Если параметр установлен, то все изменения правил игнорирования будут действовать только до того, как Tkabber закроется, и не будут восстановлены при следующем запуске. По умолчанию выключено, так что Ткаббер должен запоминать ваших доставал. Статья по теме — [MUC Ignore](MUC_Ignore.md). 

# <a id="Remote_Control"></a>Remote Control
Настройки [удалённого управления (XEP-0146)](http://www.xmpp.org/extensions/xep-0146.html). Под удалённым управлением понимается возможность выполнять из одного Jabber-клиента некоторые фиксированные действия по управлению другим удалённым Jabber-клиентом, а точнее — одним из активных подключений к серверу на нём. Стандартные команды включают в себя, в числе прочих: 

*  Отключение сессии; 
*  Выход из всех активных групповых чатов (чтобы позволить зайти в них со своим зарегистрированным псевдонимом из своей текущей сессии). 
*  Пересылка непрочитанных на удалённом клиенте сообщений вашему клиенту. 

В дополнение к этому встроенному средству вы можете поставить внешние плагины [Remote Settings](Плагины.md#Remote_Settings) и [Remote Commands](Плагины.md#Remote_Commands). Подробнее почитать на эту тему вы можете в статье и [How\_to\_add\_a\_new\_remote\_command](../en/How_to_add_a_new_remote_command.md) (англ.; конкретные примеры, иллюстрирующие плагин Remote Commands). ![(!)](../images/Hammer.png) **Сделать:** поправить эту ссылку, чтобы выглядела как внутренняя ссылка вики, а саму статью неплохо бы в будущем перевести на русский. 

Имейте в виду, что это именно управление клиентом в контексте протокола XMPP; оно не имеет ничего общего с управлением _программой Tkabber_ при помощи средств операционной системы и её программного окружения (такого, например, про которое написано в статье [Удалённое управление с помощью send](Удалённое_управление_с_помощью_send.md)). 




## <a id="remoteoptionsenable"></a>::remote::options(enable)

Включить удалённое управление. По умолчанию включено. 

## <a id="remoteoptionsaccept_from_myjid"></a>::remote::options(accept\_from\_myjid)

Принимать подключение с моего собственного JID. Тоже включено. 

## <a id="remoteoptionsaccept_list"></a>::remote::options(accept\_list)

Принимать подключение с перечисленных JID'ов. В этом поле можно перечислить JID'ы, которым также разрешено удалённо управлять вашим Ткаббером. Разделять их надо пробелом. 

# <a id="Roster"></a>Roster
Параметры контактов. 

## <a id="ifacetkrosteruse_aliases"></a>::ifacetk::roster::use\_aliases

Использовать aliases и показывать нескольких пользователей как один элемент контактов. Представьте себе, что у вас в ростере болтается два пользователя, сидящих на одном джиде, но с разными ресурсами. С отключённой опцией они будут видны как два отдельных контакта. Если же опция включена (а по умолчанию она включена), то оба эти контакта соберутся в группу со стрелочкой и будут выглядеть как один пользователь. При нажатии на стрелку группа развернётся, и вы увидите все подключения этого пользователя. 







## <a id="ifacetkrostershow_only_online"></a>::ifacetk::roster::show\_only\_online

Показывать в окне контактов только подключённые контакты. По умолчанию опция выключена, но в реальной жизни бывает удобнее включить показ только контактов, находящихся в онлайне. 



На панели инструментов имеется кнопка переключения списка контактов в режим показа только активных контактов и обратно. Этот переключатель также доступен в виде опции главного меню: **Tkabber → Контакты → Показываются только активные пользователи'**. 





Если активен режим показа только активных пользователей в списке контактов, его можно отменять для отдельных групп списка контактов, включив в контекстном меню интересующей группы переключатель **Показывать неподключённые контакты**. 


Можно относительно легко навесить переключение обсуждаемого режима на комбинацию клавиш, об этом рассказано [тут](Нетривиальные_настройки.md#Хоткей_для_переключения_между_режимами_ростера_все_и_только_онлайн). 



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


*  Вдумчивое распределение контактов по группам (с учётом того что любой контакт может одновременно входить в произвольное количество групп, а группы могут быть вложенными). 


*  Использование фильтрации списка контактов. 

![(!)](../images/Hammer.png) **Сделать:** ссылки на указанные фичи 

## <a id="ifacetkrostershow_transport_icons"></a>::ifacetk::roster::show\_transport\_icons

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





## <a id="ifacetkrostershow_transport_user_icons"></a>::ifacetk::roster::show\_transport\_user\_icons

Использовать оригинальные пиктограммы для контактов, подключённых через транспорты/службы, в окне контактов. По умолчанию тоже выключено. 


## <a id="ifacetkrosteroptionsnested"></a>::ifacetk::roster::options(nested)

Отображать вложенные группы в контактах. По умолчанию выключено, а зря — это очень удобная для упорядочивания ростера вещь. Проще всего объяснить это на примере. Например, у нас кроме обычных друзей Андрея и Юли, которых сложно куда-то отнести, есть друзья детства Вася, Петя и Алёша, есть друзья по универу Коля, Лена и Наташа, и есть кореши Вован и Жора, с которыми мы постоянно рубимся в "кваку". Редактируя контакты друзей, можно прописать для них соответственно группы **Друзья**, **Друзья::Друзья детства**, **Друзья::Универ**, **Друзья::Quake**. Причём можно пойти дальше и университетских друзей разбросать по курсам: **Друзья::Универ::Однокурсники** **Друзья::Универ::Остальные** В результате в ростере появится примерно такое: 











    **Друзья**
    Андрей
    Юля
      **Друзья детства**
      Вася
      Петя
      Алёша
      **Универ**
         **Однокурсники**
         Коля
         **Остальные**
         Лена
         Наташа
       **Quake**
       Вован
       Жора


## <a id="ifacetkrosteroptionsnested_delimiter"></a>::ifacetk::roster::options(nested\_delimiter)

Разделитель вложенных групп по умолчанию. По умолчанию разделителем является двойное двоеточие, но вы можете указать свой. Не забудьте после смены разделителя отредактировать все контакты, входившие во вложенные группы. 



## <a id="ifacetkrosteroptionsshow_own_resources"></a>::ifacetk::roster::options(show\_own\_resources)

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









## <a id="ifacetkrosteroptionschats_group"></a>::ifacetk::roster::options(chats\_group)

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





## <a id="ifacetkrosteroptionsuse_filter"></a>::ifacetk::roster::options(use\_filter)

Использовать фильтр контактов. По умолчанию выключен. При его включении в нижней части ростера, над кнопкой смены состояний, появляется поле для ввода фильтра. Фильтром может быть любая последовательность символов. 



Фильтрация работает по мере ввода. Например, если мы напишем туда букву "а" (русскую), то из вышеупомнутых друзей в ростере останутся Андрей, Вася, Алёша, Лена, Наташа, Вован и Жора. Добавив к этой букве "н", получим совсем маленький ростер, состоящий из Андрея и Вована. 




Нажатие клавиши Escape очищает поле ввода, возвращая список контактов в исходное состояние. 


## <a id="ifacetkrosteroptionsmatch_jids"></a>::ifacetk::roster::options(match\_jids)

Подбирать не только псевдоним, но и JID в фильтре контактов. Добавляет в фильтр возможность поиска и по JID'ам, а не только по именам контактов. По умолчанию выключено. 



## <a id="ifacetkrosteroptionsfree_drop"></a>::ifacetk::roster::options(free\_drop)

При перетаскивании контакта из одной группы контактов в другую, его можно отпустить не только над названием группы, но и над любым контактом в этой группе. Если вы не знали, пользователей можно сортировать по группам обычным Drag'n'Drop'ом. Назначение этой опции, думаю, понятно. По умолчанию включено. 




## <a id="ifacetkrosteroptionsshow_subscription"></a>::ifacetk::roster::options(show\_subscription)

Показывать тип подписки на присутствие во всплывающем окне в контактах. По умолчанию выключено. Тип подписки может быть "from" (контакт вас авторизовал, а вы его нет), "to" (наоборот) и "both" (вы оба друг друга авторизовали). Всплывающее окно, или тултип, появляется, если навести мышью на контакт. 




## <a id="ifacetkrosteroptionsshow_conference_user_info"></a>::ifacetk::roster::options(show\_conference\_user\_info)

Показывать детальную информацию об участниках конференции во всплывающем окне, соответствующем конференции, в контактах. Тоже по умолчанию выключено. Если включить, то при наведении мыши на закладку конференции в ростере появляется тултип со списком участников этой конфы, причём неважно, находитесь вы сами в ней или нет. Для того, чтобы эта информация появилась, необходимо включить опцию [::plugins::conferenceinfo::options(autoask)](Настройки.md#pluginsconferenceinfooptionsautoask), описанную выше. 








# <a id="Sound"></a>Sound
Настройки звука. 

# <a id="State"></a>State
Настройки сохранения состояния Ткаббера. 

# <a id="Warnings"></a>Warnings
Параметры отображения предупреждений. 

## <a id="tls_warnings"></a>::tls\_warnings

Показывать предупреждения SSL. По умолчанию включено. 

Если эта опция включена, при каждой попытке защитить соединение с сервером при помощи протокола TLS (SSL), в ходе которой не удаётся убедиться в том, что сервер "настоящий" (то есть мы не доверяем представленному им сертификату), Ткаббер будет показывать предупреждающий диалог, в котором будет указана причина проблемы и подробная информация о сертификате сервера. В данном диалоге Ткаббер предложит отказаться от соединения (действие по умолчанию) или продолжить его на ваш страх и риск. 







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





Changes to wiki/ru/Начинающим.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186




187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230

231
232

233
234
235
236
237
238
239
240
241
242
243
244

245
246

247
248
249
250
251

252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271

272

273
274

275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334

335
336
337
338
339
340
341
342
343
344

345
346

347
348
349
350
351
352
353
354
355
356

357
358
359
360
361
362
363

364
365

366
367
368

369
370

371
372
373

374
375
376

377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394




395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465

466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489

490
491

492

493

494

495




496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531

532

533




534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Начинающим/index.html)


# Начинающим

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Установка и быстрый старт](#Установка_и_быстрый_старт)
   * [1.1 Окно логина](#Окно_логина)
   * [1.2 Создание нового аккаунта](#Создание_нового_аккаунта)
   * [1.3 Дискавери. Первые шаги](#Дискавери._Первые_шаги)
   * [1.4 Добавление контактов в ростер](#Добавление_контактов_в_ростер)
   * [1.5 Некоторые полезные команды](#Некоторые_полезные_команды)
   * [1.6 Дискавери. Добавляем контакты из:](#Дискавери._Добавляем_контакты_из)
      * [1.6.1 ICQ](#ICQ)
      * [1.6.2 IRC](#IRC)
      * [1.6.3 RSS](#RSS)

      * [1.6.4 Дополнительное чтение по теме](#Дополнительное_чтение_по_теме)
* [2 Локализация Ткаббера](#Локализация_Ткаббера)
* [3 Настройка Ткаббера](#Настройка_Ткаббера)

## <a id="Установка_и_быстрый_старт"></a>Установка и быстрый старт
Выбор [дистрибутива](http://tkabber.jabber.ru/download) зависит от операционной
системы, в которой вы работаете. Инсталляция Ткаббера в среде Linux подробно
[описана](http://tkabber.jabber.ru/tuto-install-tkabber) на сайте
[http://tkabber.jabber.ru](http://tkabber.jabber.ru) и проблем вызвать не
должна. Под Windows инсталляция тоже проходит гладко.

> _Если вы только собираетесь познакомиться с Ткаббером, пожалуйста, **не
  берите старые и "левые" версии** (из серии "друг принёс на болванке" или "в
  нашей локалке вот такую советуют") — если у вас возникнут с ней проблемы,
  шансы получить помощь "из первых рук" (от разработчиков и активных
  пользователей) у вас резко уменьшатся: скорее всего вам предложат либо
  поставить текущую официальную версию, либо пойти поговорить с авторами вашей
  "левой" версии._

Поэтому скачайте текущую стабильную версию подходящего вам дистрибутива
Ткаббера с [официального сайта](http://tkabber.jabber.ru/download), установите
его и переходите к процессу запуска, описанному ниже.

Текущей стабильной версией является 0.11.1.

**Примечание:** Ткаббер представлен несколькими "дистрибутивами" — то есть
различными "упаковками" одного и того же, по-сути, содержимого, — что создаёт
определённые проблемы для начинающих, которые встают перед выбором. Чтобы
помочь вам с _осознанным_ выбором, мы написали специальную
[**статью про дистрибутивы Ткаббера**](Дистрибутивы__которые_мы_выбираем.md).
К сожалению, она
получилась большой и сложной, поэтому, если вы рвётесь в бой и хотите "прямо
сейчас" запустить Ткаббер, рискнём предложить простой расклад:

* Если у вас Windows, возьмите [старпак](http://tkabber.jabber.ru/starpack)
  (один файл, не требует установки) или
  [ткаббер-пак](http://tkabber.jabber.ru/tkabber-pack) (инсталлятор "всё в
  одном").
* Если у вас Unix, поищите готовый пакет под свою систему.
   * Если готового пакета нет, вашим Unix'ом является Linux,
      * ...и это [Debian](http://www.debian.org), возьмите _всё, что нужно,_
        [отсюда](http://people.debian.org/~sgolovan/debian/);
      * ...и это что-то другое, попробуйте
	[старпак](http://tkabber.jabber.ru/tkabber-starpack) (учтите, что
	[последний старпак под линукс](http://tkabber.jabber.ru/tkabber-starpack/0.10)
	выпускался в бытность версии 0.10, то есть, он весьма замшелый, но на попробовать
	сойдёт) или ставьте руками согласно [этой таблице](http://tkabber.jabber.ru/dependencies).

### <a id="Окно_логина"></a>Окно логина

Допустим, пакет установлен и запущен. Появляется небольшой splash-screen с
именами авторов проекта и прогресс-баром, показывающим, как идёт загрузка.
Затем открываются главное окно программы и окно логина. В окне логина имеется
несколько вкладок, изрядно загруженных информацией, но на самом деле нам нужны
далеко не все опции. Рассмотрим все вкладки по порядку.

* **Учётная запись**
   * _Пользователь:_ Здесь пишем желаемый ник (к примеру, testirovanie).
   * _Сервер:_ Сервер, на котором вы хотите создать учётную запись. Выбор его
     для новичка — нетривиальная задача. Если вы хотите зарегистрироваться на
     одном из серверов [этого списка](http://www.jabber.org/user/publicservers.shtml), посмотрите, есть
     ли на нём гейты — "ворота" в мир ICQ, MSN, Yahoo, почтовые гейты,
     RSS-feed'ы. Вам ведь наверняка захочется использовать возможности
     протокола Jabber на всю катушку. Также следует обратить внимание на
     страну, в которой этот сервер работает. Если вы не знаете немецкого языка,
     регистрироваться на немецком сервере — не лучший шаг, если есть другие с
     такими же сервисами. Впрочем, может оказаться, что вы хотите
     зарегистрироваться на jabber-сервере вашей фирмы, университета или
     интернет-провайдера. Тогда всё проще — вводите его имя, и все дела.
   * _Пароль:_ тут всё должно быть ясно — латинские буквы верхнего и нижнего
     регистров и цифры. Идеальный вариант — не менее 6 символов, буквы разных
     регистров и цифры вперемешку, что-нибудь вроде _Xjh7W9bV_. Конечно, при
     коннекте через защищённое соединение (SSL) так изголяться не обязательно,
     но лучше не использовать английские слова, а писать что-нибудь
     невразумительное, опять же, добавляя цифры и играя с регистром:
     _92fLuMpIk29_. Такой пароль сравнительно легко запомнить и не очень
     обременительно набирать, но он гораздо надёжнее, чем _vasyarybkin_ или
     _sunlight_.
   * _Использовать хэш. пароль:_ Отметьте эту галочку обязательно, чтобы по
     крайней мере начинающие кул-хацкеры ваш пароль не прочитали. Лишняя
     безопасность ещё никому не вредила, тем более, что кроме нажатия этой
     галки делать больше ничего не надо.
   * _Ресурс и Приоритет:_ Я изменил ресурс, но вы оставьте всё как есть. В
     двух словах о ресурсе: можно логиниться к одной и той же учётной записи с
     разных клиентов и даже машин, но при этом нужно, чтобы каждый раз был
     указан новый ресурс. Сюда можно писать название клиента (Psi, Tkabber,
     Bombus — обычно своё имя выставляет сам клиент), ваше местоположение
     (Home, Work) и т.д. Приоритет тоже становится нужен, когда запущено
     несколько клиентов. Подробнее об этом мы расскажем в другой статье.

![Окно логина, вкладка "Учётная запись"](../images/Tkabber-Login-01-Credentials.png)

* **Соединение**
   * _Порт для подключения:_ Должен стоять 5222. Изменять его не надо.
   * _Подключиться через альтернативный сервер:_ Пока что тоже трогать ничего
     не надо. Эта опция может понадобиться в определённых случаях, но не
     сейчас.
   * _Закрыть открытые соединения:_ Тут можно и отметить на будущее, чтобы при
     перелогине открытые соединения закрывались и не мешались.

![Окно логина, вкладка "Соединение"](../images/Tkabber-Login-02-Connection.png)

* **SSL**
   * _Использовать SSL:_ Это безусловно надо отметить, вы ведь не хотите, чтобы
     ваши разговоры подслушивались, а пароли перехватывались?
   * _STARTTLS:_ Тип безопасного соединения. Сначала пробуйте его.
   * _Legacy SSL:_ Устаревшее SSL-соединение. В Ткаббере присутствует для
     совместимости со старыми серверами, на которых нет поддержки STARTTLS.
     Если и через Legacy SSL законнектиться не удаётся, отключите "Использовать
     SSL" — должно заработать. _Работать без SSL — крайняя мера, и в этом
     случае нужно обязательно отметить галочку "Использовать хэш. пароль" на
     вкладке "Учётная запись" — это будет единственная защита вашего пароля.
     Если же вдруг выяснится, что сервер не поддерживает шифрование паролей, мы
     искренне советуем забыть имя этого сервера и выбрать другой, благо их
     полно._
   * _SSL порт:_ Должен стоять 5223.

![Окно логина, вкладка "SSL"](../images/Tkabber-Login-03-Authentication.png)

![Окно логина, вкладка "Аутентификация"](../images/Tkabber-Login-04-Stream-features.png)

![(!)](../images/Hammer.png) **Сделать:** rearrange

* **Прокси:** Если вы находитесь за файерволлом (например, в сети университета
  или на работе) и не можете законнектиться напрямую, включите опцию
  "Использовать прокси" и пропишите параметры вашего прокси-сервера: адрес,
  порт, имя пользователя и пароль. Если эти данные вам не известны, можете
  узнать их у вашего системного администратора.

![Окно логина, вкладка "Прокси"](../images/Tkabber-Login-06-Proxy-Server.png)

* **HTTP-подключение:** Если вдруг все остальные методы не сработали,
  попробуйте отметить эту галочку. Но скорее всего вам этой опцией пользоваться
  не придётся.

![Окно логина, вкладка "HTTP-подключение"](../images/Tkabber-Login-05-HTTP-Polling.png)

### <a id="Создание_нового_аккаунта"></a>Создание нового аккаунта

Как видите, заполнять пришлось лишь самую первую вкладку. Жмём кнопку
соединения. Если вы запускаете Ткаббер первый раз в жизни, аккаунта у вас на
сервере нет. Программа, однако, попытается залогиниться, используя введённые
вами пользовательское имя и пароль, но, не найдя на сервере учётной записи,
предложит вам создать новую. Соглашайтесь, и через секунду ваш аккаунт будет
создан. Но может оказаться и так, что учётная запись с таким именем на этом
сервере уже существует. В этом случае Ткаббер снова выведет окошко с
предупреждением об ошибке авторизации. Тогда нужно ответить "Нет", а затем
попытаться залогиниться снова, придумав новый ник, либо попробовать другой
сервер, где, возможно, этот ник ещё не занят.

![Сообщение сервера об ошибке авторизации и одновременно предложение создать новый аккаунт](../images/Tkabber-New-Account-Creation-Query.png)

Если всё в порядке, вы получаете сообщение от сервера "Добро пожаловать" (не
обязательно именно такое, и не факт, что оно вообще будет - всё зависит от
настроек каждого конкретного сервера, но скорее всего вас как-то известят об
успешной регистрации). Впрочем, на сервере jabber.ru по неизвестной причине это
сообщение выводится даже тогда, когда вы пытаетесь зарегистрировать учётную
запись с уже существующим именем.

![Сообщение сервера об успешной регистрации нового аккаунта](../images/Welcome_ru.png)

### <a id="Дискавери._Первые_шаги"></a>Дискавери. Первые шаги

Допустим, новый аккаунт вы создали, но разговаривать пока не с кем — знакомых в
мире Jabber у вас нет. Что ж, пойдём их искать. В верхней части окна программы
имеется панель инструментов (тулбар), на которой есть несколько кнопок. Вторая
слева — в виде земного шара — это Обзор служб, ваш провожатый по серверу.





![Меню и панель инструментов](../images/Tkabber-Toolbar.png)

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

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

![Обзор служб](../images/120px-Discovery_ru.png)

![Обзор служб 1](../images/116px-Discovery_conference_1_ru.png)

![Обзор служб 2](../images/120px-Discovery_conference_2_ru.png)

Если вы уже знаете, к какой конференции хотите подключиться, то совсем не
обязательно проделывать все эти телодвижения. Нажмите третью по счёту кнопку —
"Присоединиться к группе" — и в открывшемся диалоге заполните поля "Группа",
"Сервер" и "Псевдоним". Например, если вы зарегистрировали аккаунт на сервере
jabber.ru и хотите зайти в комнату Talks, введите в первом поле **talks**, во
втором — **conference.jabber.ru**. Псевдоним уже будет стоять — ваш ник, под
которым вы зарегистрировались на сервере; можете оставить его как есть, а
можете поменять, если вдруг захочется. Если комната защищена паролем, то вы
должны ввести его в последнее поле.

![Другой способ подключения к конференции](../images/Tkabber-Join-Conference.png)

Чтобы каждый раз не лазить в Дискавери, можно добавить конференцию в ростер.
Это очень просто: **Службы → Добавить конференцию в контакты...** Появится
небольшое окошечко, где нужно ввести всего два параметра: группу и сервер,
причём поле "сервер" уже заполнено, и его нужно править лишь в том случае, если
вы добавляете группу с другого сервера, не с того, на котором вы залогинены. В
поле "группа" надо написать название комнаты, например, tkabber или talks.
Другой способ — перетащить конференцию из Дискавери в ростер мышью. Работает
drag-and-drop как в Виндовс, так и в Линукс.


### <a id="Добавление_контактов_в_ростер"></a>Добавление контактов в ростер


Может статься, у вас уже есть друг, который давно уже использует Jabber для
общения, или вы познакомились с кем-нибудь в комнате, и теперь хотите добавить
его в свой список друзей. Жмём самую левую кнопку в виде человечка с зелёным
плюсиком рядом — "Добавить нового пользователя". Выскакивает окошко с двумя
полями. В верхнее, маленькое, надо написать JID (Jabber ID, или полный
Jabber-адрес вашего друга): к примеру, petia@jabberserver.ru — то есть, и ник,
и "собачку", и имя сервера. Во втором поле уже "вбита" стандартная фраза
запроса на авторизацию: "I would like to add you to my roster" (мне хотелось бы
добавить вас в мой ростер). Если хотите, можете написать там что-то более
осмысленное, чтобы, например, человек, которого вы хотите к себе добавить,
понял, с кем имеет дело.


![Отправка запроса на авторизацию](../images/Adding_user_2roster_1_ru.png)


Ростер, он же список контактов (левое окошко меньшей ширины в главном окне) —
это аналог "аськиного" контактного листа, но в мире Jabber в этом списке могут
находиться контакты из джаббера, ICQ, Yahoo, AIM, пользователи MSN Messenger, а
также новостные агенты (RSS) и даже различные

[боты-сервисы](http://jabberworld.info/JID_полезных_Jabber-ботов) (кстати
говоря, эта ссылка ведёт на другую замечательную вики, посвящённую новичкам в
Jabber — обязательно там полазьте). Итак, вы отправили запрос на авторизацию
вашему другу, но совсем не обязательно, что он сейчас сидит и дожидается этого
запроса. Тем не менее, вы уже можете добавить его к себе в ростер. У вас
открывается окно со свойствами контакта. Вы можете отредактировать его
псевдоним (например, вместо ника ввести настоящее имя и фамилию), а также
внести этот контакт в группу (например, если это ваш друг, то в группу
"Friends" или "Друзья", а если это ваш коллега, то в группу "Работа"). Создать
группу очень просто: напишите её имя в окошечке слева, как в примере, и нажмите
"Добавить". Если у вас уже есть группа (например, вы добавляете уже второй
контакт), то она будет находиться в левом списке, в большом поле. Выделите её
мышью и опять-таки, жмите "Добавить". Просто выбрать группу слева или ввести её
имя в окошке недостаточно, обязательно надо добавить её, чтобы она появилась
справа, иначе пользователь будет находиться в общем списке под названием "Без
группы". Одного и того же пользователя можно добавить в несколько групп. Кроме
того, в Ткаббере можно организовать вложенные группы. Посмотрите на скриншот.
Самая нижняя из видимых групп выглядит так: Jabber::007::Админы. Разделителем
является двойное двоеточие. В результате в списке контактов появится группа
Jabber, внутри которой будет находиться подгруппа 007, а внутри неё — подгруппа

Админы. Если вы планируете заселять и промежуточные группы (Jabber и 007), надо

прописать и их, как это сделано на скриншоте. Итак, у нас всё готово. Жмите
"Продолжить", и пользователь добавляется в ростер.


![Редактирование контакта](../images/Adding_user_2roster_2_ru.png)

Если друг ваш сейчас не за компьютером, он не сможет авторизовать вас сразу же.
Поэтому его ник в ростере скрыт. Чтобы увидеть его, нажмите четвёртую кнопку.
Одна жёлтая лампочка показывает только пользователей, которые сейчас в онлайне,
жёлтая поверх чёрной — всех. Иконка, стоящая около ника вашего друга, —
"пустая", а во всплывающей подсказке (при наведении мыши на ник) можно увидеть
слово [none] — "нет подписки на присутствие". Это значит, ни он ещё не
авторизовал вас, ни вы его.

![Контакт в ростере, но вас ещё не авторизовал](../images/Adding_user_2roster_3_ru.png)

Когда он подойдёт к компьютеру или выйдет в онлайн, он увидит ваш запрос.

![Запрос получен вашим другом](../images/Adding_user_2roster_4_ru.png)

Он авторизует вас, нажав кнопку "Утвердить подписку", при этом его иконка станет жёлтой.

![Друг вас авторизовал, а вы его — ещё нет](../images/Tkabber-Roster-Tooltip-Subscribed-To.png)

В данном примере состояние подписки — [to], это означает, что собеседник вас
авторизовал, и вы можете видеть его присутствие (то есть, в онлайне он или
нет), а вы его — ещё не авторизовали. Противоположный случай: подписка [from] —
вы авторизовали собеседника (позволяете ему видеть, когда вы в онлайне), а он
вас — нет (при этом, само собой, его иконка останется чёрной).

Друг тоже отправляет вам запрос на авторизацию, в результате чего у вас
выскакивает примерно такое окно.

![Ваш друг просит вас авторизовать его](../images/Adding_user_2roster_5_ru.png)

Когда и вы авторизуете его, всплывающая подсказка будет показывать слово [both]
— "оба".

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

### <a id="Некоторые_полезные_команды"></a>Некоторые полезные команды

В принципе, общение в групповом чате или с глазу на глаз ничем не отличается от
общения в других программах — ICQ, IRC и так далее. Но свои тонкости есть, и
лучше сразу с ними познакомиться.

Пишем | Получаем
---|---
/me хочет спать | \* testirovanie хочет спать
/наклонный текст/ | _наклонный текст_
\_подчёркнутый текст\_ | <u>подчёркнутый текст</u>
\*жирный текст\* | **жирный текст**
/знаки препинания/! | _знаки препинания_!
/так неправильно!/ | /так неправильно!/
-перечёркнутый текст- | <s>перечёркнутый текст</s>
/\*можно\*/ /\_смешивать\_/ | _**можно** <u>смешивать</u>_
\*\_разные\_\* \*\_/стили/\_\* | **<u>разные</u> _<u>стили</u>_**

Как видите, текст можно делать жирным, подчёркнутым, перечёркнутым и курсивом.
Можно смешивать разные стили. Главное, помнить про вложение символов выделения:
если вы написали "/\*" в начале текста, то заканчивать выделение нужно обратной

последовательностью — "\*/".

Последовательности этих смешных символов, осуществляющих выделение текста,
называются "стайлкодами" (от "stylecodes", термин позаимствован из
["фидошной"](http://www.fidonet.org) читалки писем
[GOLDed](http://golded-plus.sourceforge.net)). Если эта возможность вам мешает,
её можно отключить в Настройках (группа **Chat → Stylecodes**).

Ткаббер поддерживает "горячие клавиши", и они могут значительно облегчить вашу
жизнь. Посмотреть их всегда можно в "Краткой справке" (меню "Помощь").


![Краткая справка](../images/Tkabber-Quick-Help.png)


Ткаббер по умолчанию отсылает сообщения по нажатию клавиши Enter. Если вы
привыкли работать с другими программами мгновенных сообщений (например, MSN
Messenger), которые отсылают "мессаги" по Ctrl-Enter, Ткаббер может показаться
неудобным. Однако это довольно легко исправляется — смотрите
[**здесь**](Патчи.md#Отправка_сообщений_по_нажатию_Ctrl-Enter). Даже если вы ничего
не смыслите в программировании, следуя примеру в инструкции, можете настроить
клиент "под себя". _На всякий случай скопируйте в другое место файл, который
собираетесь редактировать, и тогда в случае ошибки всегда сможете вернуться к
исходному состоянию._


Ещё пара полезностей. Находясь в конференции, вы можете узнать кое-какую
информацию о её участниках, наведя на ник курсор мыши или сделав на нём правый
клик. В первом случае появится всплывающая подсказка, где можно узнать, какой
ранг занимает тот или иной участник: owner (владелец комнаты), administrator
(администратор), moderator (модератор), member (участник) или none (никто, так
себе прохожий). Подробнее эти ранги мы рассмотрим потом.


![Всплывающая подсказка в конференции](../images/Conference_user_tooltip_ru.png)


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


![Контекстное меню в конференции](../images/Conference_user_menu_ru.png)


Нажав на него, вы получите довольно большое окно с несколькими вкладками, где
можете почитать персональную информацию, которую этот человек решил о себе

сообщить. Пользуясь случаем, давайте заполним свою персональную инфу и мы.
Чтобы открыть окно редактирования, ткнитесь в меню **TkabberРедактировать
личную информацию**.


* **Личная информация:** Ф.И.О., псевдоним, e-mail, веб-сайт. Рекомендуем
  заполнить хотя бы e-mail, потому что если вы вдруг забудете свой пароль, то
  администратор сервера ничем вам помочь не сможет, а так хоть вышлет его на
  указанный почтовый ящик.
* **Телефоны:** Что тут заполнять — решать вам, а выбор богат: ведь Ткаббер
  поддерживает стандарт vCard.
* **Адрес:** Конечно, полный адрес писать здесь не обязательно, но хотя бы
  город и страну указать не мешает. Занимательный плагин Георостер,
  показывающий на карте мира географическое положение собеседников, берёт
  информацию именно отсюда.
* **Организация:** Самое подходящее место рассказать о себе как о
  профессионале.
* **О себе:** А здесь можно выложить хоть биографию, а также указать дату
  своего рождения. Кроме того, в этом поле удобно размещать GPG/PGP public-key
  (лучше ссылку на ключ, загруженный на какой-нибудь keyserver, чтобы не
  загромождать пространство, да и пользователям gpg удобнее скачать ключ именно
  с сервера, а не возиться с копированием и ручным его импортированием).




* **Фотография:** Можно загрузить фото с жёсткого диска, а можно указать ссылку
  на изображение в интернете.

Чтобы сохранить изменения и отослать их на сервер, нажмите кнопку "Продолжить".

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

![(!)](../images/Hammer.png) **Сделать:** Перезалить галерею NaodW29-gallery4429bb43277b2e7500000002

Поскольку vCards хранятся на сервере, можно просматривать информацию о любом
пользователе — он даже может быть при этом в оффлайне! Для этого зайдите в меню
**Службы → Показать информацию о пользователе** и в открывшемся окошке введите
JID интересующей вас персоны.

![Запрос информации о пользователе](../images/Info_request_ru.png)

Ещё одна интересная тайна Ткаббера — встроенные команды. Наберите в поле ввода
сообщения прямой слэш "/" и понажимайте несколько раз табуляцию, и вы увидите
много интересного ;) Про кое-что из этого интересного можно почитать
[тут](http://jabberworld.info/Управляющие_команды_в_Jabber). Если понажимать
табуляцию, не вводя в поле ничего, там начнут появляться ники пользователей,
находящихся в комнате, причём в большинстве случаев самым первым появится тот,
кто, допустим, недавно назвал вас по нику — то есть, адресовал вам фразу, или
просто человек, сказавший последнюю реплику. Это свойство удобно использовать
для быстрой вставки нужного ника в строку набора. Если при этом вы наберёте
одну-две первые буквы какого-нибудь ника, то табуляция будет перебирать лишь те
ники, которые с этих букв начинаются.

И напоследок "домашнее задание" :)

1. Сделайте правый клик в окне группового чата и изучите самостоятельно
   контекстное меню — вам понравится ;)
1. Поводите курсор мыши над окном программы. Обратите внимание, что если
   какой-то элемент интерфейса меняет при этом свой цвет, он кликабелен —
   можете нажать кнопку мыши (и левую, и правую) и посмотреть, что получится.
   Некоторые элементы доступны для клика даже если не меняют цвет. Десять минут
   таких исследований, и вы убедитесь, что Ткаббер — это просто квест
   какой-то! :)

### <a id="Дискавери._Добавляем_контакты_из"></a>Дискавери. Добавляем контакты из:

#### <a id="ICQ"></a>ICQ

Если на вашем jabber-сервере есть гейт в ICQ, вы можете зарегистрироваться на
нём и общаться с друзьями из "аськи" через Jabber. Естественно, у вас уже
должен иметься рабочий аккаунт в системе ICQ. Регистрация же на jabber-сервере
проста: в Дискавери отыщите что-то вроде icq.jabber.ru и сделайте двойной клик,
чтобы открыть эту ветвь. В открывшемся новом списке есть пункт "Регистрация".
Сделайте двойной клик уже на нём, и появится окошко с двумя полями:
"Пользователь" и "Пароль". Введите в первое поле ваш ICQ UIN, во второе —
пароль к вашему асечному аккаунту.

![Регистрация на гейте ICQ](../images/Icq_register_ru.png)

Если у вас открыта "аська", закройте её или отключитесь, чтобы не мешалась.
Жмите "Ок", и если ошибок не было, вы получите сообщение, что регистрация
успешна. Теперь jabber-сервер знает параметры вашего аськиного аккаунта и может
логиниться на сервере ICQ.

Обычно Ткаббер сам "вытягивает" контакт-лист аськи, залогинившись к серверу ICQ
через гейт, и сам же заполняет все имена никами, взятыми из соответствующего
поля vCard аськиных пользователей — ваших друзей. Если этого не произошло, а
контакт-лист слишком большой, чтобы прописать их вручную, почитайте
[**тут**](Гейты_во_вражеские_сети.md#ICQ).

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


#### <a id="IRC"></a>IRC

Чуть подробнее остановимся на гейте в IRC — "ирку". Регистрироваться на гейте
не обязательно, можно либо просто зайти на канал, либо добавить его в ростер на
будущее. Делается это примерно так же, как в случае с обычной MUC (Multi-User
Conference, т.е. обычная конференция, о которых мы уже рассказали выше). Есть
одна тонкость в имени. Посмотрите внимательно на скриншот: в качестве группы
следует указывать не только имя канала, но и имя IRC-сервера, к которому вы
хотите присоединиться. В нашем примере **linux%chat.eu.freenode.net**: "linux"
— название канала (_без ведущего "\#"_), "chat.eu.freenode.net" — название
"иркиного" сервера, разделяются они знаком процента. А вот в качестве сервера,
что запрашивается во втором поле, идёт название гейта на вашем jabber-сервере.
У jabber.ru гейт на "ирку" в Дискавери отсутствует, и на сайте найти его точное
название — тоже проблема (если оно там есть вообще). Тем не менее, гейт
существует и зовётся **irc.e.jabber.ru** — прописывайте и наслаждайтесь :) В
поле "псевдоним" указываете ваш IRC-никнейм, а в поле "пароль" — ваш пароль в
IRC для этого ника. Замечено, что на серверах сети WeNet NickServ всё равно
просит вас представиться — в отдельном окне. Тогда надо просто ввести в этом
окошке текст: **identify your\_password** — без слэша, ведь это не команда
jabber или Ткаббера, а просто текст, отсылаемый Никсерву.

![Заходим на канал IRC](../images/Join_conference_IRC_ru.png)


Общаясь в "ирке" через Jabber, вполне можно пользоваться некоторыми популярными
командами, например, **/me**. Окно привата вызывается двойным кликом на нужном

никнейме. Остальные команды пока не тестировались, информация добавится позже.

Если хотите, чтобы она появилась побыстрее, опробуйте другие команды и

расскажите нам :)






#### <a id="RSS"></a>RSS

Внимание! rss.jabber.ru отключен на неизвестный срок, поэтому написанные ниже
советы неактуальны, но читать RSS-новости по-прежнему можно, если почитать
[тут](http://jabberworld.info/Транспорты_для_Jabber),
[тут](http://jabberworld.info/Список_публичных_транспортов_RSS) и
[тут](http://wiki.jrudevels.org/RSS_service).

Добавлять в ростер новостные фиды (RSS feeds) с **jabber.ru** следует так:
откройте в Дискавери поддерево rss.jabber.ru, выберите узел "Поиск" и
активируйте его (двойным щелчком мыши или нажатием клавиши Enter. Появится окно
поиска:

![Поиск в RSS на jabber.ru](../images/Tkabber-Stoat-headlines-Search.png)

Введите в нём интересующую вас подстроку для поиска (например, "dsa-long") и
подтвердите свой выбор. Если по вашему запросу что-нибудь нашлось, вам будет
предъявлена новая форма — с результатами поиска:

![Результаты поиска в RSS на jabber.ru](../images/Tkabber-Stoat-headlines-summary.png)

Выберите интересующий вас фид и активируйте его. Выскочит стандартное окно
запроса, который будет отослан этому фиду. Затем появится другое уже знакомое
нам окно редактирования контакта. Вы можете создать для новостей отдельную
группу, скажем, Новости или RSS, и добавлять новые фиды в неё. _Помните, что
новости обновляются хозяевами сайтов, и интервал может очень отличаться.
Скажем, lenta.ru за день может накидать больше сотни сообщений, а какой-нибудь
редко обновляемый сайт — три, за неделю._ Если хотите получать от сервера
уведомления о новых фидах, вам нужно зарегистрироваться в главной ветке дерева
rss.jabber.ru.

##### <a id="Частые_вопросы_по_RSS"></a>Частые вопросы по RSS

Нередко начинающие пользователи Ткаббера задают в конференции вопросы,
связанные с RSS. Приводим здесь ответы на эти вопросы в виде краткого
наставления :)



1. Открыть в диско весь список фидов невозможно. Пользуйтесь поиском




   (вызывается нажатием Ctrl-S — от слова "Search")
1. Найдя нужный фид, добавьте его в ростер. С этим контактом разговаривать
   бессмысленно. **Просто сидите и ждите.** Как уже было сказано выше,
   **новости выпускает сайт, а не Ткаббер,** так что сетовать на клиент
   бессмысленно. Возможно, некоторые новости от старых фидов не приходят к вам
   просто потому, что на сайте изменился адрес фида, а между тем в списке на
   rss.jabber.ru до сих пор болтается старая версия, на которую вы и подписаны.
   Поэтому перед тем как добавлять в ростер некий фид, не помешало бы
   убедиться, что по анонсируемому адресу действительно что-то имеется.
1. Когда сайт выпустит новость, она сама к вам придёт, и у вас откроется новое
   окошко с новостями, где можно будет эту новость прочитать и, если хочется
   посетить её полную версию на сайте, перейти по ссылке.
1. После прочтения новости удалять контакт из ростера не надо.
1. Если закрыть таб с новостями, они для вас исчезнут навсегда (ну, не совсем
   навсегда, потому что в пользовательском домашнем каталоге Ткаббера есть ещё
   бэкапный файл, который до закрытия Ткаббера можно и нужно спасти, иначе при
   выходе из Ткаббера он перезапишется).
1. Ткаббер в своём первозданном виде сохраняет новости только при корректном
   выходе. Как несложно догадаться, если вдруг у вас упадёт он или вообще вся
   система, то сохранятся лишь новости, которые были записаны в том файле
   (иначе говоря, всё, что наприходило с момента начала работы в Ткаббере,
   пропадёт).
1. На вики есть плагин [**rsssaver**](Плагины.md#Rsssaver), позволяющий сохранять
   новости автоматически каждые N новостей, а также добавляет кнопку для
   ручного их сохранения.

#### <a id="Дополнительное_чтение_по_теме"></a>Дополнительное чтение по теме

[Гейты во вражеские сети](Гейты_во_вражеские_сети.md).

## <a id="Локализация_Ткаббера"></a>Локализация Ткаббера
В подавляющем большинстве случаев проблем с локализацией Ткаббера не возникает.
Он с ходу "ловит" языковые настройки системы и готов к работе в удобном для вас
окружении. Начиная с версии 0.9.9 кириллица встроена и в Старпаке — это
однофайловая версия Ткаббера, не требующая инсталляции.

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

В заключение можно добавить, что Ткаббер поддерживает Unicode, то есть
корректно воспроизводит все юникодные символы.
![(!)](../images/Hammer.png) **Сделать:** Расписать немного подробнее про
локали и невозможность писать, скажем, по-испански при локали KOI-8.

Иногда случается, что русский текст в окне чата в ткаббере линуксовой версии
пишется "некрасивым" шрифтом (отличающимся от шрифта латинских символов), или
даже "кракозябрами". Это означает, что у вас в системе криво настроены шрифты,
и вам — [**сюда**](Шрифты.md).

Если вы — пользователь Ubuntu, то, скорее всего, Ткаббер, ставящийся из
репозитория, страшен, как сон алкоголика, ибо русские шрифты выглядят жутко.
Конечно, для общего развития вам не помешает ознакомиться со статьёй "Шрифты",
ссылка на которую дана выше, но если вам нужно быстрое решение, ознакомьтесь
[**со статьёй**](Установка_и_настройка_в_Ubuntu.md), специально написанной для
этого случая одним мудрым убунтологом.

## <a id="Настройка_Ткаббера"></a>Настройка Ткаббера
Ну вот, Ткаббер запущен и работает, и теперь вам хочется поковыряться с ним
немного и, не влезая в код, более-менее прилично настроить программу под себя.
Сделать это можно двумя способами: через пункты меню (при этом настройки
действуют только в течение текущей сессии) и через окно настроек. Первый способ
удобен для быстрого изучения возможностей клиента, при этом можно не опасаться
что-нибудь испортить. Второй способ требует времени, потому что, во-первых,
окно настроек Ткаббера похоже на лабиринт Минотавра, а во-вторых, пользователи
обычно сюда лезут один раз, всё делают и потом благополучно забывают, что где
находится.

Если первый способ более-менее понятен (броди по менюшкам, нажимай кнопочки,
смотри, что случилось), то со вторым посложнее. Настолько посложнее, что мы
давно уже хотим написать о настройках [**большую статью**](Настройки.md). Вот и
настал тот час, учитывая, что начинающие пользователи крайне нуждаются в
подробном рассказе о настройках, а поскольку продвинутые пользователи после
собственных ковыряний мало что помнят, имеет смысл рассказать об этом здесь :)

>








|
|
|
|
|
|
|
|
|
>
|



|
|
<
<
<
<

|
<
<
<
<
<
<

|
<
<

|

|
<
<
<
<
<
<
<

<
<
|
<
|
|
|
<
<
<
|
<
<

|

|
<
<
<
<

|
|
|
<
<
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
|
<
<
<
|
<
<
<
<
<
<

|

|
|
|
<
<
|
<

|

|
|
<
|
<
|
<
<
<
<
<
<
<
|

|

<
<
|

|
<
<
<
<

|

|
<
<

|

|

|
<
<
<
<
<
<
<
<
<

|

|
<
<
<
<
<

|
<
<
<
<
<
<
<

>
>
>
>
|

|
<
<
<
<
<

|
<
<
<
<
<
<
<

|

|
<
<
<
<
<
<
<
<
<
<
<
<

|

<
<
<
<
<
<
<
<
>

<
>

<
<
<
<
<
<
<
<
<
<
<
>

<
>

<
<
<
<
>
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
|
<
|
|
>
|
>
|
<
>

|

|
<
<
<
<
<
<

|

|

|

|

|

|
<
<
<
<

|
<

|

|
<

|
<
<

|

|
<
<

|
<
<
<
<
<
<
<
<
<
<
|
<
<
<
>
<
|
|
<
<
<
<
|
<
<
>
|
<
>
|
<
<
<
<
<
<
<
<
<
>
|
<
<
<
<
<
<
>
|
<
>
|
<
<
>
|
<
>

<
<
>
|
|
|
>

<
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
|
>
>
>
>
|
<

|

|
<
<

|

|
<
<
<

|

|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
|

|
|
<
<
<

<
<
<
<
>

|

<
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<

|

>
|
<
>
|
>
|
>
|
>

>
>
>
>
|

|
<
<
<
<

|
<
<
<

|

|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
>

>
|
>
>
>
>
|
|
<
<
<
<
<
<
<
|
<
<
|
|
<
<
<
|
<
<
<
<
<
|
<

|

|

|
|
<
<
<

|
<
<
<
<

|
<
<
<

|
<
<
<

|
<
<
<
<
<

|
|
<
<
<
<
<
<
<
<

|
|
|
<
<
<
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26




27
28






29
30


31
32
33
34







35


36

37
38
39



40


41
42
43
44




45
46
47
48










49








50



51






52
53
54
55
56
57


58

59
60
61
62
63

64

65







66
67
68
69


70
71
72




73
74
75
76


77
78
79
80
81
82









83
84
85
86





87
88







89
90
91
92
93
94
95
96





97
98







99
100
101
102












103
104
105








106
107

108
109











110
111

112
113




114
115














116
117

118
119
120
121
122
123

124
125
126
127
128






129
130
131
132
133
134
135
136
137
138
139
140




141
142

143
144
145
146

147
148


149
150
151
152


153
154










155



156

157
158




159


160
161

162
163









164
165






166
167

168
169


170
171

172
173


174
175
176
177
178
179

180
181
182
183
184
185
186
187
188
189
190
191
192

193
194
195
196
197
198
199

200
201
202
203


204
205
206
207



208
209
210
211







































212
213
214
215
216



217




218
219
220
221









222








223
224
225
226
227

228
229
230
231
232
233
234
235
236
237
238
239
240
241
242




243
244



245
246
247
248



















249
250
251
252
253
254
255
256
257
258
259







260


261
262



263





264

265
266
267
268
269
270
271



272
273




274
275



276
277



278
279





280
281
282








283
284
285
286



[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Начинающим/index.html)


# Начинающим

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Установка и быстрый старт](#Установка_и_быстрый_старт)
 * [1.1 Окно логина](#Окно_логина)
 * [1.2 Создание нового аккаунта](#Создание_нового_аккаунта)
 * [1.3 Дискавери. Первые шаги](#Дискавери._Первые_шаги)
 * [1.4 Добавление контактов в ростер](#Добавление_контактов_в_ростер)
 * [1.5 Некоторые полезные команды](#Некоторые_полезные_команды)
 * [1.6 Дискавери. Добавляем контакты из:](#Дискавери._Добавляем_контакты_из)
  * [1.6.1 ICQ](#ICQ)
  * [1.6.2 IRC](#IRC)
  * [1.6.3 RSS](#RSS)
   * [1.6.3 Частые вопросы по RSS](#Частые_вопросы_по_RSS)
  * [1.6.4 Дополнительное чтение по теме](#Дополнительное_чтение_по_теме)
* [2 Локализация Ткаббера](#Локализация_Ткаббера)
* [3 Настройка Ткаббера](#Настройка_Ткаббера)

# <a id="Установка_и_быстрый_старт"></a>Установка и быстрый старт
Выбор [дистрибутива](http://tkabber.jabber.ru/download) зависит от операционной системы, в которой вы работаете. Инсталляция Ткаббера в среде Linux подробно [описана](http://tkabber.jabber.ru/tuto-install-tkabber) на сайте [http://tkabber.jabber.ru](http://tkabber.jabber.ru) и проблем вызвать не должна. Под Windows инсталляция тоже проходит гладко. 





 _Если вы только собираетесь познакомиться с Ткаббером, пожалуйста, **не берите старые и "левые" версии** (из серии "друг принёс на болванке" или "в нашей локалке вот такую советуют") — если у вас возникнут с ней проблемы, шансы получить помощь "из первых рук" (от разработчиков и активных пользователей) у вас резко уменьшатся: скорее всего вам предложат либо поставить текущую официальную версию, либо пойти поговорить с авторами вашей "левой" версии._ 







Поэтому скачайте текущую стабильную версию подходящего вам дистрибутива Ткаббера с [официального сайта](http://tkabber.jabber.ru/download), установите его и переходите к процессу запуска, описанному ниже. 



Текущей стабильной версией является 0.11.1. 

**Примечание:** Ткаббер представлен несколькими "дистрибутивами" — то есть различными "упаковками" одного и того же, по-сути, содержимого, — что создаёт определённые проблемы для начинающих, которые встают перед выбором. Чтобы помочь вам с _осознанным_ выбором, мы написали специальную [статью про дистрибутивы Ткаббера](Дистрибутивы__которые_мы_выбираем.md). К сожалению, она получилась большой и сложной, поэтому, если вы рвётесь в бой и хотите "прямо сейчас" запустить Ткаббер, рискнём предложить простой расклад: 










*  Если у вас Windows, возьмите [старпак](http://tkabber.jabber.ru/starpack) (один файл, не требует установки) или [ткаббер-пак](http://tkabber.jabber.ru/tkabber-pack) (инсталлятор "всё в одном"). 

*  Если у вас Unix, поищите готовый пакет под свою систему. 
 *  Если готового пакета нет, вашим Unix'ом является Linux, 
  *  ...и это [Debian](http://www.debian.org), возьмите _всё, что нужно,_ [отсюда](http://people.debian.org/~sgolovan/debian/); 



  *  ...и это что-то другое, попробуйте [старпак](http://tkabber.jabber.ru/tkabber-starpack) (учтите, что [последний старпак под линукс](http://tkabber.jabber.ru/tkabber-starpack/0.10) выпускался в бытность версии 0.10, то есть, он весьма замшелый, но на попробовать сойдёт) или ставьте руками согласно [этой таблице](http://tkabber.jabber.ru/dependencies). 



## <a id="Окно_логина"></a>Окно логина

Допустим, пакет установлен и запущен. Появляется небольшой splash-screen с именами авторов проекта и прогресс-баром, показывающим, как идёт загрузка. Затем открываются главное окно программы и окно логина. В окне логина имеется несколько вкладок, изрядно загруженных информацией, но на самом деле нам нужны далеко не все опции. Рассмотрим все вкладки по порядку. 





*  **Учётная запись** 
 *  _Пользователь:_ Здесь пишем желаемый ник (к примеру, testirovanie). 
 *  _Сервер:_ Сервер, на котором вы хотите создать учётную запись. Выбор его для новичка — нетривиальная задача. Если вы хотите зарегистрироваться на одном из серверов [этого списка](http://www.jabber.org/user/publicservers.shtml), посмотрите, есть ли на нём гейты — "ворота" в мир ICQ, MSN, Yahoo, почтовые гейты, RSS-feed'ы. Вам ведь наверняка захочется использовать возможности протокола Jabber на всю катушку. Также следует обратить внимание на страну, в которой этот сервер работает. Если вы не знаете немецкого языка, регистрироваться на немецком сервере — не лучший шаг, если есть другие с такими же сервисами. Впрочем, может оказаться, что вы хотите зарегистрироваться на jabber-сервере вашей фирмы, университета или интернет-провайдера. Тогда всё проще — вводите его имя, и все дела. 










 *  _Пароль:_ тут всё должно быть ясно — латинские буквы верхнего и нижнего регистров и цифры. Идеальный вариант — не менее 6 символов, буквы разных регистров и цифры вперемешку, что-нибудь вроде _Xjh7W9bV_. Конечно, при коннекте через защищённое соединение (SSL) так изголяться не обязательно, но лучше не использовать английские слова, а писать что-нибудь невразумительное, опять же, добавляя цифры и играя с регистром: _92fLuMpIk29_. Такой пароль сравнительно легко запомнить и не очень обременительно набирать, но он гораздо надёжнее, чем _vasyarybkin_ или _sunlight_. 








 *  _Использовать хэш. пароль:_ Отметьте эту галочку обязательно, чтобы по крайней мере начинающие кул-хацкеры ваш пароль не прочитали. Лишняя безопасность ещё никому не вредила, тем более, что кроме нажатия этой галки делать больше ничего не надо. 



 *  _Ресурс и Приоритет:_ Я изменил ресурс, но вы оставьте всё как есть. В двух словах о ресурсе: можно логиниться к одной и той же учётной записи с разных клиентов и даже машин, но при этом нужно, чтобы каждый раз был указан новый ресурс. Сюда можно писать название клиента (Psi, Tkabber, Bombus — обычно своё имя выставляет сам клиент), ваше местоположение (Home, Work) и т.д. Приоритет тоже становится нужен, когда запущено несколько клиентов. Подробнее об этом мы расскажем в другой статье. 







![Окно логина, вкладка "Учётная запись"](../images/Tkabber-Login-01-Credentials.png) 

*  **Соединение** 
 *  _Порт для подключения:_ Должен стоять 5222. Изменять его не надо. 
 *  _Подключиться через альтернативный сервер:_ Пока что тоже трогать ничего не надо. Эта опция может понадобиться в определённых случаях, но не сейчас. 


 *  _Закрыть открытые соединения:_ Тут можно и отметить на будущее, чтобы при перелогине открытые соединения закрывались и не мешались. 


![Окно логина, вкладка "Соединение"](../images/Tkabber-Login-02-Connection.png) 

*  **SSL** 
 *  _Использовать SSL:_ Это безусловно надо отметить, вы ведь не хотите, чтобы ваши разговоры подслушивались, а пароли перехватывались? 

 *  _STARTTLS:_ Тип безопасного соединения. Сначала пробуйте его. 

 *  _Legacy SSL:_ Устаревшее SSL-соединение. В Ткаббере присутствует для совместимости со старыми серверами, на которых нет поддержки STARTTLS. Если и через Legacy SSL законнектиться не удаётся, отключите "Использовать SSL" — должно заработать. _Работать без SSL — крайняя мера, и в этом случае нужно обязательно отметить галочку "Использовать хэш. пароль" на вкладке "Учётная запись" — это будет единственная защита вашего пароля. Если же вдруг выяснится, что сервер не поддерживает шифрование паролей, мы искренне советуем забыть имя этого сервера и выбрать другой, благо их полно._ 







 *  _SSL порт:_ Должен стоять 5223. 

![Окно логина, вкладка "SSL"](../images/Tkabber-Login-03-Authentication.png) ![Окно логина, вкладка "Аутентификация"](../images/Tkabber-Login-04-Stream-features.png) 



![(!)](../images/Hammer.png) **Сделать:** rearrange 

*  **Прокси:** Если вы находитесь за файерволлом (например, в сети университета или на работе) и не можете законнектиться напрямую, включите опцию "Использовать прокси" и пропишите параметры вашего прокси-сервера: адрес, порт, имя пользователя и пароль. Если эти данные вам не известны, можете узнать их у вашего системного администратора. 





![Окно логина, вкладка "Прокси"](../images/Tkabber-Login-06-Proxy-Server.png) 

*  **HTTP-подключение:** Если вдруг все остальные методы не сработали, попробуйте отметить эту галочку. Но скорее всего вам этой опцией пользоваться не придётся. 



![Окно логина, вкладка "HTTP-подключение"](../images/Tkabber-Login-05-HTTP-Polling.png) 

## <a id="Создание_нового_аккаунта"></a>Создание нового аккаунта

Как видите, заполнять пришлось лишь самую первую вкладку. Жмём кнопку соединения. Если вы запускаете Ткаббер первый раз в жизни, аккаунта у вас на сервере нет. Программа, однако, попытается залогиниться, используя введённые вами пользовательское имя и пароль, но, не найдя на сервере учётной записи, предложит вам создать новую. Соглашайтесь, и через секунду ваш аккаунт будет создан. Но может оказаться и так, что учётная запись с таким именем на этом сервере уже существует. В этом случае Ткаббер снова выведет окошко с предупреждением об ошибке авторизации. Тогда нужно ответить "Нет", а затем попытаться залогиниться снова, придумав новый ник, либо попробовать другой сервер, где, возможно, этот ник ещё не занят. 










![Сообщение сервера об ошибке авторизации и одновременно предложение создать новый аккаунт](../images/Tkabber-New-Account-Creation-Query.png) 

Если всё в порядке, вы получаете сообщение от сервера "Добро пожаловать" (не обязательно именно такое, и не факт, что оно вообще будет - всё зависит от настроек каждого конкретного сервера, но скорее всего вас как-то известят об успешной регистрации). Впрочем, на сервере jabber.ru по неизвестной причине это сообщение выводится даже тогда, когда вы пытаетесь зарегистрировать учётную запись с уже существующим именем. 






![Сообщение сервера об успешной регистрации нового аккаунта](../images/Welcome_ru.png) 








## <a id="Дискавери._Первые_шаги"></a>Дискавери. Первые шаги

Допустим, новый аккаунт вы создали, но разговаривать пока не с кем — знакомых в мире Jabber у вас нет. Что ж, пойдём их искать. В верхней части окна программы имеется панель инструментов (тулбар), на которой есть несколько кнопок. Вторая слева — в виде земного шара — это Обзор служб, ваш провожатый по серверу. 

![Меню и панель инструментов](../images/Tkabber-Toolbar.png) 

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






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








![](../images/120px-Discovery_ru.png)

Обзор служб 













![](../images/116px-Discovery_conference_1_ru.png)









Обзор служб 1 


![](../images/120px-Discovery_conference_2_ru.png)












Обзор служб 2 


 Если вы уже знаете, к какой конференции хотите подключиться, то совсем не обязательно проделывать все эти телодвижения. Нажмите третью по счёту кнопку — "Присоединиться к группе" — и в открывшемся диалоге заполните поля "Группа", "Сервер" и "Псевдоним". Например, если вы зарегистрировали аккаунт на сервере jabber.ru и хотите зайти в комнату Talks, введите в первом поле **talks**, во втором — **conference.jabber.ru**. Псевдоним уже будет стоять — ваш ник, под которым вы зарегистрировались на сервере; можете оставить его как есть, а можете поменять, если вдруг захочется. Если комната защищена паролем, то вы должны ввести его в последнее поле. 





![Другой способ подключения к конференции](../images/Tkabber-Join-Conference.png) 















Чтобы каждый раз не лазить в Дискавери, можно добавить конференцию в ростер. Это очень просто: **Службы → Добавить конференцию в контакты...** Появится небольшое окошечко, где нужно ввести всего два параметра: группу и сервер, причём поле "сервер" уже заполнено, и его нужно править лишь в том случае, если вы добавляете группу с другого сервера, не с того, на котором вы залогинены. В поле "группа" надо написать название комнаты, например, tkabber или talks. Другой способ — перетащить конференцию из Дискавери в ростер мышью. Работает drag-and-drop как в Виндовс, так и в Линукс. 


## <a id="Добавление_контактов_в_ростер"></a>Добавление контактов в ростер

Может статься, у вас уже есть друг, который давно уже использует Jabber для общения, или вы познакомились с кем-нибудь в комнате, и теперь хотите добавить его в свой список друзей. Жмём самую левую кнопку в виде человечка с зелёным плюсиком рядом — "Добавить нового пользователя". Выскакивает окошко с двумя полями. В верхнее, маленькое, надо написать JID (Jabber ID, или полный Jabber-адрес вашего друга): к примеру, petia@jabberserver.ru — то есть, и ник, и "собачку", и имя сервера. Во втором поле уже "вбита" стандартная фраза запроса на авторизацию: "I would like to add you to my roster" (мне хотелось бы добавить вас в мой ростер). Если хотите, можете написать там что-то более осмысленное, чтобы, например, человек, которого вы хотите к себе добавить, понял, с кем имеет дело. 

![Отправка запроса на авторизацию](../images/Adding_user_2roster_1_ru.png) 


Ростер, он же список контактов (левое окошко меньшей ширины в главном окне) — это аналог "аськиного" контактного листа, но в мире Jabber в этом списке могут находиться контакты из джаббера, ICQ, Yahoo, AIM, пользователи MSN Messenger, а также новостные агенты (RSS) и даже различные [боты-сервисы](http://jabberworld.info/JID_полезных_Jabber-ботов) (кстати говоря, эта ссылка ведёт на другую замечательную вики, посвящённую новичкам в Jabber — обязательно там полазьте). Итак, вы отправили запрос на авторизацию вашему другу, но совсем не обязательно, что он сейчас сидит и дожидается этого запроса. Тем не менее, вы уже можете добавить его к себе в ростер. У вас открывается окно со свойствами контакта. Вы можете отредактировать его псевдоним (например, вместо ника ввести настоящее имя и фамилию), а также внести этот контакт в группу (например, если это ваш друг, то в группу "Friends" или "Друзья", а если это ваш коллега, то в группу "Работа"). Создать группу очень просто: напишите её имя в окошечке слева, как в примере, и нажмите "Добавить". Если у вас уже есть группа (например, вы добавляете уже второй контакт), то она будет находиться в левом списке, в большом поле. Выделите её мышью и опять-таки, жмите "Добавить". Просто выбрать группу слева или ввести её имя в окошке недостаточно, обязательно надо добавить её, чтобы она появилась справа, иначе пользователь будет находиться в общем списке под названием "Без группы". Одного и того же пользователя можно добавить в несколько групп. Кроме того, в Ткаббере можно организовать вложенные группы. Посмотрите на скриншот. Самая нижняя из видимых групп выглядит так: Jabber::007::Админы. Разделителем является двойное двоеточие. В результате в списке контактов появится группа Jabber, внутри которой будет находиться подгруппа 007, а внутри неё — подгруппа Админы. Если вы планируете заселять и промежуточные группы (Jabber и 007), надо прописать и их, как это сделано на скриншоте. Итак, у нас всё готово. Жмите "Продолжить", и пользователь добавляется в ростер. 

![Редактирование контакта](../images/Adding_user_2roster_2_ru.png) 

Если друг ваш сейчас не за компьютером, он не сможет авторизовать вас сразу же. Поэтому его ник в ростере скрыт. Чтобы увидеть его, нажмите четвёртую кнопку. Одна жёлтая лампочка показывает только пользователей, которые сейчас в онлайне, жёлтая поверх чёрной — всех. Иконка, стоящая около ника вашего друга, — "пустая", а во всплывающей подсказке (при наведении мыши на ник) можно увидеть слово [none] — "нет подписки на присутствие". Это значит, ни он ещё не авторизовал вас, ни вы его. 







![Контакт в ростере, но вас ещё не авторизовал](../images/Adding_user_2roster_3_ru.png) 

Когда он подойдёт к компьютеру или выйдет в онлайн, он увидит ваш запрос. 

![Запрос получен вашим другом](../images/Adding_user_2roster_4_ru.png) 

Он авторизует вас, нажав кнопку "Утвердить подписку", при этом его иконка станет жёлтой. 

![Друг вас авторизовал, а вы его — ещё нет](../images/Tkabber-Roster-Tooltip-Subscribed-To.png) 

В данном примере состояние подписки — [to], это означает, что собеседник вас авторизовал, и вы можете видеть его присутствие (то есть, в онлайне он или нет), а вы его — ещё не авторизовали. Противоположный случай: подписка [from] — вы авторизовали собеседника (позволяете ему видеть, когда вы в онлайне), а он вас — нет (при этом, само собой, его иконка останется чёрной). 





Друг тоже отправляет вам запрос на авторизацию, в результате чего у вас выскакивает примерно такое окно. 


![Ваш друг просит вас авторизовать его](../images/Adding_user_2roster_5_ru.png) 

Когда и вы авторизуете его, всплывающая подсказка будет показывать слово [both] — "оба". 


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



## <a id="Некоторые_полезные_команды"></a>Некоторые полезные команды

В принципе, общение в групповом чате или с глазу на глаз ничем не отличается от общения в других программах — ICQ, IRC и так далее. Но свои тонкости есть, и лучше сразу с ними познакомиться. 



 Пишем: Получаем: 










 



 /me хочет спать \* testirovanie хочет спать 

 
 /наклонный текст/ _наклонный текст_ 




 


 \_подчёркнутый текст\_ <u>подчёркнутый текст</u> 
 

 \*жирный текст\* **жирный текст** 
 









 /знаки препинания/! _знаки препинания_! 
 






 /так неправильно!/ /так неправильно!/ 
 

 -перечёркнутый текст- <s>перечёркнутый текст</s> 
 


 /\*можно\*/ /\_смешивать\_/ _**можно** <u>смешивать</u>_ 
 

 \*\_разные\_\* \*\_/стили/\_\* **<u>разные</u> _<u>стили</u>_** 



Как видите, текст можно делать жирным, подчёркнутым, перечёркнутым и курсивом. Можно смешивать разные стили. Главное, помнить про вложение символов выделения: если вы написали "/\*" в начале текста, то заканчивать выделение нужно обратной последовательностью — "\*/". 

Последовательности этих смешных символов, осуществляющих выделение текста, называются "стайлкодами" (от "stylecodes", термин позаимствован из ["фидошной"](http://www.fidonet.org) читалки писем [GOLDed](http://golded-plus.sourceforge.net)). Если эта возможность вам мешает, её можно отключить в Настройках (группа **ChatStylecodes**). 

Ткаббер поддерживает "горячие клавиши", и они могут значительно облегчить вашу жизнь. Посмотреть их всегда можно в "Краткой справке" (меню "Помощь"). 


![Краткая справка](../images/Tkabber-Quick-Help.png) 

Ткаббер по умолчанию отсылает сообщения по нажатию клавиши Enter. Если вы привыкли работать с другими программами мгновенных сообщений (например, MSN Messenger), которые отсылают "мессаги" по Ctrl-Enter, Ткаббер может показаться неудобным. Однако это довольно легко исправляется — смотрите [здесь](Патчи.md#Отправка_сообщений_по_нажатию_Ctrl-Enter). Даже если вы ничего не смыслите в программировании, следуя примеру в инструкции, можете настроить клиент "под себя". _На всякий случай скопируйте в другое место файл, который собираетесь редактировать, и тогда в случае ошибки всегда сможете вернуться к исходному состоянию._ 

Ещё пара полезностей. Находясь в конференции, вы можете узнать кое-какую информацию о её участниках, наведя на ник курсор мыши или сделав на нём правый клик. В первом случае появится всплывающая подсказка, где можно узнать, какой ранг занимает тот или иной участник: owner (владелец комнаты), administrator (администратор), moderator (модератор), member (участник) или none (никто, так себе прохожий). Подробнее эти ранги мы рассмотрим потом. 

![Всплывающая подсказка в конференции](../images/Conference_user_tooltip_ru.png) 

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

![Контекстное меню в конференции](../images/Conference_user_menu_ru.png) 

Нажав на него, вы получите довольно большое окно с несколькими вкладками, где можете почитать персональную информацию, которую этот человек решил о себе сообщить. Пользуясь случаем, давайте заполним свою персональную инфу и мы. Чтобы открыть окно редактирования, ткнитесь в меню **Tkabber → Редактировать личную информацию**. 


*  **Личная информация:** Ф.И.О., псевдоним, e-mail, веб-сайт. Рекомендуем заполнить хотя бы e-mail, потому что если вы вдруг забудете свой пароль, то администратор сервера ничем вам помочь не сможет, а так хоть вышлет его на указанный почтовый ящик. 
*  **Телефоны:** Что тут заполнять — решать вам, а выбор богат: ведь Ткаббер поддерживает стандарт vCard. 
*  **Адрес:** Конечно, полный адрес писать здесь не обязательно, но хотя бы город и страну указать не мешает. Занимательный плагин Георостер, показывающий на карте мира географическое положение собеседников, берёт информацию именно отсюда. 
*  **Организация:** Самое подходящее место рассказать о себе как о профессионале. 
*  **О себе:** А здесь можно выложить хоть биографию, а также указать дату своего рождения. Кроме того, в этом поле удобно размещать GPG/PGP public-key (лучше ссылку на ключ, загруженный на какой-нибудь keyserver, чтобы не загромождать пространство, да и пользователям gpg удобнее скачать ключ именно с сервера, а не возиться с копированием и ручным его импортированием). 
*  **Фотография:** Можно загрузить фото с жёсткого диска, а можно указать ссылку на изображение в интернете. 


Чтобы сохранить изменения и отослать их на сервер, нажмите кнопку "Продолжить". 

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



![(!)](../images/Hammer.png) **Сделать:** Перезалить галерею NaodW29-gallery4429bb43277b2e7500000002 

Поскольку vCards хранятся на сервере, можно просматривать информацию о любом пользователе — он даже может быть при этом в оффлайне! Для этого зайдите в меню **Службы → Показать информацию о пользователе** и в открывшемся окошке введите JID интересующей вас персоны. 




![Запрос информации о пользователе](../images/Info_request_ru.png) 

Ещё одна интересная тайна Ткаббера — встроенные команды. Наберите в поле ввода сообщения прямой слэш "/" и понажимайте несколько раз табуляцию, и вы увидите много интересного ;) Про кое-что из этого интересного можно почитать [тут](http://jabberworld.info/Управляющие_команды_в_Jabber). Если понажимать табуляцию, не вводя в поле ничего, там начнут появляться ники пользователей, находящихся в комнате, причём в большинстве случаев самым первым появится тот, кто, допустим, недавно назвал вас по нику — то есть, адресовал вам фразу, или просто человек, сказавший последнюю реплику. Это свойство удобно использовать для быстрой вставки нужного ника в строку набора. Если при этом вы наберёте одну-две первые буквы какого-нибудь ника, то табуляция будет перебирать лишь те ники, которые с этих букв начинаются. 








































И напоследок "домашнее задание" :) 

1.  Сделайте правый клик в окне группового чата и изучите самостоятельно контекстное меню — вам понравится ;) 
1.  Поводите курсор мыши над окном программы. Обратите внимание, что если какой-то элемент интерфейса меняет при этом свой цвет, он кликабелен — можете нажать кнопку мыши (и левую, и правую) и посмотреть, что получится. Некоторые элементы доступны для клика даже если не меняют цвет. Десять минут таких исследований, и вы убедитесь, что Ткаббер — это просто квест какой-то! :) 








## <a id="Дискавери._Добавляем_контакты_из"></a>Дискавери. Добавляем контакты из:

### <a id="ICQ"></a>ICQ










Если на вашем jabber-сервере есть гейт в ICQ, вы можете зарегистрироваться на нём и общаться с друзьями из "аськи" через Jabber. Естественно, у вас уже должен иметься рабочий аккаунт в системе ICQ. Регистрация же на jabber-сервере проста: в Дискавери отыщите что-то вроде icq.jabber.ru и сделайте двойной клик, чтобы открыть эту ветвь. В открывшемся новом списке есть пункт "Регистрация". Сделайте двойной клик уже на нём, и появится окошко с двумя полями: "Пользователь" и "Пароль". Введите в первое поле ваш ICQ UIN, во второе — пароль к вашему асечному аккаунту. 









![Регистрация на гейте ICQ](../images/Icq_register_ru.png) 

Если у вас открыта "аська", закройте её или отключитесь, чтобы не мешалась. Жмите "Ок", и если ошибок не было, вы получите сообщение, что регистрация успешна. Теперь jabber-сервер знает параметры вашего аськиного аккаунта и может логиниться на сервере ICQ. 


Обычно Ткаббер сам "вытягивает" контакт-лист аськи, залогинившись к серверу ICQ через гейт, и сам же заполняет все имена никами, взятыми из соответствующего поля vCard аськиных пользователей — ваших друзей. Если этого не произошло, а контакт-лист слишком большой, чтобы прописать их вручную, почитайте [тут](Гейты_во_вражеские_сети.md#ICQ). 

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

### <a id="IRC"></a>IRC

Чуть подробнее остановимся на гейте в IRC — "ирку". Регистрироваться на гейте не обязательно, можно либо просто зайти на канал, либо добавить его в ростер на будущее. Делается это примерно так же, как в случае с обычной MUC (Multi-User Conference, т.е. обычная конференция, о которых мы уже рассказали выше). Есть одна тонкость в имени. Посмотрите внимательно на скриншот: в качестве группы следует указывать не только имя канала, но и имя IRC-сервера, к которому вы хотите присоединиться. В нашем примере **linux%chat.eu.freenode.net**: "linux" — название канала (_без ведущего "\#"_), "chat.eu.freenode.net" — название "иркиного" сервера, разделяются они знаком процента. А вот в качестве сервера, что запрашивается во втором поле, идёт название гейта на вашем jabber-сервере. У jabber.ru гейт на "ирку" в Дискавери отсутствует, и на сайте найти его точное название — тоже проблема (если оно там есть вообще). Тем не менее, гейт существует и зовётся **irc.e.jabber.ru** — прописывайте и наслаждайтесь :) В поле "псевдоним" указываете ваш IRC-никнейм, а в поле "пароль" — ваш пароль в IRC для этого ника. Замечено, что на серверах сети WeNet NickServ всё равно просит вас представиться — в отдельном окне. Тогда надо просто ввести в этом окошке текст: **identify your\_password** — без слэша, ведь это не команда jabber или Ткаббера, а просто текст, отсылаемый Никсерву. 

![Заходим на канал IRC](../images/Join_conference_IRC_ru.png) 

Общаясь в "ирке" через Jabber, вполне можно пользоваться некоторыми популярными командами, например, **/me**. Окно привата вызывается двойным кликом на нужном никнейме. Остальные команды пока не тестировались, информация добавится позже. Если хотите, чтобы она появилась побыстрее, опробуйте другие команды и расскажите нам :) 

### <a id="RSS"></a>RSS

Внимание! rss.jabber.ru отключен на неизвестный срок, поэтому написанные ниже советы неактуальны, но читать RSS-новости по-прежнему можно, если почитать [тут](http://jabberworld.info/Транспорты_для_Jabber), [тут](http://jabberworld.info/Список_публичных_транспортов_RSS) и [тут](http://wiki.jrudevels.org/RSS_service) 





Добавлять в ростер новостные фиды (RSS feeds) с **jabber.ru** следует так: откройте в Дискавери поддерево rss.jabber.ru, выберите узел "Поиск" и активируйте его (двойным щелчком мыши или нажатием клавиши Enter. Появится окно поиска: 




![Поиск в RSS на jabber.ru](../images/Tkabber-Stoat-headlines-Search.png) 

Введите в нём интересующую вас подстроку для поиска (например, "dsa-long") и подтвердите свой выбор. Если по вашему запросу что-нибудь нашлось, вам будет предъявлена новая форма — с результатами поиска: 




















![Результаты поиска в RSS на jabber.ru](../images/Tkabber-Stoat-headlines-summary.png) 

Выберите интересующий вас фид и активируйте его. Выскочит стандартное окно запроса, который будет отослан этому фиду. Затем появится другое уже знакомое нам окно редактирования контакта. Вы можете создать для новостей отдельную группу, скажем, Новости или RSS, и добавлять новые фиды в неё. _Помните, что новости обновляются хозяевами сайтов, и интервал может очень отличаться. Скажем, lenta.ru за день может накидать больше сотни сообщений, а какой-нибудь редко обновляемый сайт — три, за неделю._ Если хотите получать от сервера уведомления о новых фидах, вам нужно зарегистрироваться в главной ветке дерева rss.jabber.ru. 

#### <a id="Частые_вопросы_по_RSS"></a>Частые вопросы по RSS

Нередко начинающие пользователи Ткаббера задают в конференции вопросы, связанные с RSS. Приводим здесь ответы на эти вопросы в виде краткого наставления :) 

1.  Открыть в диско весь список фидов невозможно. Пользуйтесь поиском (вызывается нажатием Ctrl-S — от слова "Search") 
1.  Найдя нужный фид, добавьте его в ростер. С этим контактом разговаривать бессмысленно. **Просто сидите и ждите.** Как уже было сказано выше, **новости выпускает сайт, а не Ткаббер,** так что сетовать на клиент бессмысленно. Возможно, некоторые новости от старых фидов не приходят к вам просто потому, что на сайте изменился адрес фида, а между тем в списке на rss.jabber.ru до сих пор болтается старая версия, на которую вы и подписаны. Поэтому перед тем как добавлять в ростер некий фид, не помешало бы убедиться, что по анонсируемому адресу действительно что-то имеется. 







1.  Когда сайт выпустит новость, она сама к вам придёт, и у вас откроется новое окошко с новостями, где можно будет эту новость прочитать и, если хочется посетить её полную версию на сайте, перейти по ссылке. 


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



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





1.  На вики есть плагин [rsssaver](Плагины.md#Rsssaver), позволяющий сохранять новости автоматически каждые N новостей, а также добавляет кнопку для ручного их сохранения. 


### <a id="Дополнительное_чтение_по_теме"></a>Дополнительное чтение по теме

[Гейты во вражеские сети](Гейты_во_вражеские_сети.md). 

# <a id="Локализация_Ткаббера"></a>Локализация Ткаббера
В подавляющем большинстве случаев проблем с локализацией Ткаббера не возникает. Он с ходу "ловит" языковые настройки системы и готов к работе в удобном для вас окружении. Начиная с версии 0.9.9 кириллица встроена и в Старпаке — это однофайловая версия Ткаббера, не требующая инсталляции. 




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





В заключение можно добавить, что Ткаббер поддерживает Unicode, то есть корректно воспроизводит все юникодные символы. ![(!)](../images/Hammer.png) **Сделать:** Расписать немного подробнее про локали и невозможность писать, скажем, по-испански при локали KOI-8. 




Иногда случается, что русский текст в окне чата в ткаббере линуксовой версии пишется "некрасивым" шрифтом (отличающимся от шрифта латинских символов), или даже "кракозябрами". Это означает, что у вас в системе криво настроены шрифты, и вам — [сюда](Шрифты.md). 




Если вы — пользователь Ubuntu, то, скорее всего, Ткаббер, ставящийся из репозитория, страшен, как сон алкоголика, ибо русские шрифты выглядят жутко. Конечно, для общего развития вам не помешает ознакомиться со статьёй "Шрифты", ссылка на которую дана выше, но если вам нужно быстрое решение, ознакомьтесь [со статьёй](Установка_и_настройка_в_Ubuntu.md), специально написанной для этого случая одним мудрым убунтологом. 






# <a id="Настройка_Ткаббера"></a>Настройка Ткаббера
Ну вот, Ткаббер запущен и работает, и теперь вам хочется поковыряться с ним немного и, не влезая в код, более-менее прилично настроить программу под себя. Сделать это можно двумя способами: через пункты меню (при этом настройки действуют только в течение текущей сессии) и через окно настроек. Первый способ удобен для быстрого изучения возможностей клиента, при этом можно не опасаться что-нибудь испортить. Второй способ требует времени, потому что, во-первых, окно настроек Ткаббера похоже на лабиринт Минотавра, а во-вторых, пользователи обычно сюда лезут один раз, всё делают и потом благополучно забывают, что где находится. 









Если первый способ более-менее понятен (броди по менюшкам, нажимай кнопочки, смотри, что случилось), то со вторым посложнее. Настолько посложнее, что мы давно уже хотим написать о настройках [большую статью](Настройки.md). Вот и настал тот час, учитывая, что начинающие пользователи крайне нуждаются в подробном рассказе о настройках, а поскольку продвинутые пользователи после собственных ковыряний мало что помнят, имеет смысл рассказать об этом здесь :) 





Changes to wiki/ru/Нетривиальные_настройки.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214

215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916

917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936

937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252

1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Нетривиальные_настройки/index.html)


# Нетривиальные настройки

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Вступление](#Вступление)
* [2 Глобальные Горячие Клавиши (Windows only)](#Глобальные_Горячие_Клавиши_Windows_only)
* [3 Отладочный лог под Windows](#Отладочный_лог_под_Windows)
* [4 Хоткей для переключения между режимами ростера "все" и "только онлайн"](#Хоткей_для_переключения_между_режимами_ростера_все_и_только_онлайн)
* [5 Комбинации кнопок а-ля Unix shell в текстовых виджетах](#Комбинации_кнопок_а-ля_Unix_shell_в_текстовых_виджетах)
   * [5.1 Команды перемещения курсора](#Команды_перемещения_курсора)
   * [5.2 Команды удаления текста](#Команды_удаления_текста)
   * [5.3 Undo/Redo](#Undo_Redo)
   * [5.4 Невошедшее](#Невошедшее)
   * [5.5 Замечания](#Замечания)
   * [5.6 Дидактика](#Дидактика)
* [6 Копирование текста по Ctrl-C из окна чата в "иксах"](#Копирование_текста_по_Ctrl-C_из_окна_чата_в_иксах)
* [7 Предотвращение запуска нескольких процессов Ткаббера](#Предотвращение_запуска_нескольких_процессов_Ткаббера)
   * [7.1 Простое решение](#Простое_решение)
   * [7.2 Проблема](#Проблема)
   * [7.3 Альтернатива: TCP сокет](#Альтернатива_TCP_сокет)
   * [7.4 Альтернатива: Блокировка файла](#Альтернатива_Блокировка_файла)
   * [7.5 Пища для размышлений](#Пища_для_размышлений)
* [8 Отправка сообщений нажатием Ctrl-Enter](#Отправка_сообщений_нажатием_Ctrl-Enter)
* [9 Отправка сообщений по нажатию NumPad Enter](#Отправка_сообщений_по_нажатию_NumPad_Enter)
* [10 Закрытие табов по Ctrl-W](#Закрытие_табов_по_Ctrl-W)
* [11 Скрытый по умолчанию ростер](#Скрытый_по_умолчанию_ростер)
* [12 Запрет IRC-команды /exec в окнах чата](#Запрет_IRC-команды__exec_в_окнах_чата)
* [13 Отмена подсветки текста активного таба](#Отмена_подсветки_текста_активного_таба)
* [14 Настройка кнопки "Тема" в групчатах](#Настройка_кнопки_Тема_в_групчатах)
* [15 Предустановленные описания статусов](#Предустановленные_описания_статусов)
   * [15.1 Что такое описание статуса и зачем нужны предустановленные описания](#Что_такое_описание_статуса_и_зачем_нужны_предустановленные_описания)
   * [15.2 Как настроить предустановленные описания](#Как_настроить_предустановленные_описания)
* [16 Добавление собственной кнопки на тулбар](#Добавление_собственной_кнопки_на_тулбар)
* [17 Собственное меню для киков в групчате](#Собственное_меню_для_киков_в_групчате)
* [18 Автоответчик](#Автоответчик)
   * [18.1 Установка](#Установка)
   * [18.2 Настройка](#Настройка)
   * [18.3 Управление](#Управление)
* [19 Настройка положения окна уведомлений в Windows](#Настройка_положения_окна_уведомлений_в_Windows)
* [20 Собственный шрифт для ростеров](#Собственный_шрифт_для_ростеров)
* [21 Перемещение элемента меню ростера комнаты](#Перемещение_элемента_меню_ростера_комнаты)
* [22 Кнопка Send (отправить) в окне ввода сообщения](#Кнопка_Send_отправить_в_окне_ввода_сообщения)

# <a id="Вступление"></a>Вступление
Эта статья является в некотором роде парной статье [**Патчи**](Патчи.md);
отличается она тем, что приведённые тут решения _не требуют изменения кода_
Ткаббера, что, несомненно, является для большинства применений более удачным
решением.

> _Важно понимать, что "нетривиальность" настроек означает прежде всего то, что
  большинство из них использует **недокументированные** "внутренности" Ткаббера,
  и это означает, что эти настройки могут "сломаться" новым релизом Ткаббера
  (или даже при следующем обновлении из репозитория, если вы следите за
  разработкой)._

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

Статья пытается достичь двух целей:

* Быть "книгой рецептов" — _готовых к употреблению_ решений некоторых проблем
  или осуществлению нестандартного поведения Ткаббера.
* Объяснить _как_ работают приведённые решения, то есть снабдить пользователей
  Ткаббера некоторым набором знаний для самостоятельного решения схожих задач.

Если вы только подступаетесь к нетривиальной конфигурации Ткаббера, потрудитесь
изучить [**эту статью**](Config.tcl.md). Там же можно найти информацию о подходах к
тестированию новой конфиругации. Если же и само существование/местоположение
файла конфигурации Ткаббера для вас неочевидно, начните
[**отсюда**](Config.tcl_для_начинающих.md).

Часто задаётся вопрос: что означает выражение "впишите в файл конфигурации _вне
хуков_ ..."? Оно означает, что приведённый кусок кода должен находиться "на
верхнем уровне" файла конфигурации, или — можно сказать и так — вне любого
блока, ограниченного {}. Не забывайте: приведённый в рецепте код скорее всего
не будет иметь смысла внутри какого-либо хука, то есть не следует допускать
таких записей:

    hook::add some_hook {
        ...
        # тут -- ваш кусок кода:
        hook::add some_other_hook {
            ...
        }
    }

убедитесь, что вы поместили код на "чистое место":

    hook::add some_hook {
        ...
    }

    # тут -- ваш кусок кода:
    hook::add some_other_hook {
        ...
    }

Ещё один часто всплывающий вопрос касается привязки комбинаций клавиш — под
Windows привязки на буквенно-цифровые клавиши работают только на английской
раскладке. Эта проблема подробно рассмотрена
[**здесь**](Wish_и_русская_раскладка_в_Windows.md).

# <a id="Глобальные_Горячие_Клавиши_Windows_only"></a>Глобальные Горячие Клавиши (Windows only)
Для разминки давайте прикрутим к Ткабберу стандартную возможность задавать
горячие клавиши (hotkeys) так, чтобы они действовали независимо от того,
активно окно Ткаббера в данный момент или нет. Дальше по тексту такие hotkeys
мы будем называть "Глобальные Горячие Клавиши" - **ГГК** (от "global hotkeys").

Поддержку ГГК можно реализовать только под Windows, где такая концепция
существует на уровне ОС.

Однако, Tk в Windows самостоятельно не поддерживает ГГК, поэтому необходимо
скачать [библиотеку Winutils](http://sourceforge.net/projects/tomasoft). После
чего распакуйте эту библиотеку в поддиректорию **tkabber/winutil/** в вашей
директории с исходниками Ткаббера (то, что называется $::rootdir в Ткаббере).
_Для примера, на том же уровне иерархии находятся директории ifaceck и ifacetk,
к которым мы ещё вернёмся в следующем патче._

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

    if {[file exists $rootdir/winutil/winutils.tcl]} {
        # This will load the neccessary dll on start up
        source $rootdir/winutil/winutils.tcl
    }

Теперь необходимо настроить горячие клавиши. Для этого опять откройте на
редактирование файл config.tcl, найдите в нём секцию **hook::add
finload\_hook** и вставьте в её конец следующие строки:

      winutils::hotkey #auto Ctrl+Shift+I {
          switch -- [wm state .] {
              normal  { wm state . iconic }
              default { wm state . normal }
          }
      }

То есть, если у вас ранее не было такой секции либо она была пустой, полный
кусок кода должен выглядеть так:

    hook::add finload_hook {
        winutils::hotkey #auto Ctrl+Shift+I {
            switch -- [wm state .] {
                normal  { wm state . iconic }
                default { wm state . normal }
            }
        }
    }

После чего сохраните файл config.ctl и перезагрузите Ткаббер. Если всё сделано
правильно, то вы сможете скрывать или открывать главное окно программы, нажимая
**Ctrl-Shift-I** (как это сделано в [Миранде](http://miranda-im.org/)). В
принципе ГГК может быть любой, как и действия, которые она должна выполнять.

И наконец, самое важное - выбрать клавиши, которые вам удобны, и действия,
которые вам нужны.  Воспользуйтесь моим примером (с действием, которое было
нужно мне) и настройте те действия, что удобны вам. Не забудьте потом зайти к
нам в конференцию
[`xmpp:tkabber@conference.jabber.ru`](xmpp:tkabber@conference.jabber.ru) и
рассказать, что у вас получилось :) Может быть, кому-нибудь ещё окажется
полезен ваш опыт.

Таким образом, ваши действия сводятся к следующим пунктам:

1.  Установить winutil;
1.  Подключить winutil через config.tcl;
1.  Настроить горячие клавиши в config.tcl;
1.  Перезагрузить Ткаббер и наслаждаться ещё одной его возможностью.

Автор — [**lknight**](Участник_Lknight.md).
[English variant of this tutorial](http://tkabber.jabber.ru/global-hotkeys-windows)

_Если к моменту, когда вы читаете это описание, линки на файлы/проекты уже
устарели, вы можете скачать актуальные на **октябрь 2005** файлы тут:_

* [WinUtils 0.8](../files/Winutil08.zip)

# <a id="Отладочный_лог_под_Windows"></a>Отладочный лог под Windows
Wish под Windows не имеет открытых потоков **stdout** и **stderr**, которые
можно куда-либо перенаправить; точнее, эти потоки направлены в
[**консоль процесса wish**](Ткаббер_ЧаВо.md#Консоль_Ткаббера).

С другой стороны, Ткаббер повсеместно использует для отладки процедуру
**debugmsg**, которая как раз "ругается" на **stdout**. Поэтому стандартное
юниксовое заклинание

    tkabber >/tmp/TKABBER_LOG 2>&1

здесь не проходит.

Обходной путь такой.

В начало **config.tcl** добавляем:

    # Отладка (1 -- включена, 0 -- выключена):
    if {1} {
        set debug_lvls {hook plugin chat}

        set logfile [file join [file norm ~] .tkabber TKABBER_LOG]

        close stdout
        open $logfile w

        close stderr
        open $logfile a

    } else {
        set debug_lvls {}
    }

Этот код перенаправляет стандартные потоки вывода в файл

    ВАШ_ДОМАШНИЙ_КАТАЛОГ\.tkabber\TKABBER_LOG

---

Список классов отладочной информации, определённый здесь как

    set debug_lvls {hook plugin chat}

естественно, имеет смысл отредактировать под ваши нужды. К примеру, при отладке
собственного плагина **frobozz** можно использовать в его коде команды типа

    debugmsg frobozz "foo: $foo; bar: $bar"

и внести **frobozz** в список классов отладочных сообщений:

    lappend debug_lvls frobozz

Подробности по поводу магии переоткрывания стандартных потоков ввода/вывода в
тикле описаны [здесь](http://www.tcl.tk/man/tcl8.4/TclLib/StdChannels.htm).

Стандартные потоки перенаправлял [**Kostix**](Участник_Kostix.md).

# <a id="Хоткей_для_переключения_между_режимами_ростера_все_и_только_онлайн"></a>Хоткей для переключения между режимами ростера "все" и "только онлайн"
Ниже приведён кусочек кода, вешающий на комбинацию Ctrl-o циклическое
переключение между режимами ростера "все" и "только онлайн".

Забейте в конфиг вне хуков:

    bind Text <Control-Key-o> {}
    bind . <Control-Key-o> ifacetk::roster::switch_only_online

Измените хоткей Ctrl-o по вкусу согласно
[этого документа](http://www.tcl.tk/man/tcl8.4/TkCmd/bind.htm). Если вы выберете
комбинацию, отличную от Ctrl-o, то первая команда из двух вам не потребуется
(однако смотрите ниже, чтобы подготовиться к возможным сюрпризам).

Пояснения для въедливых:

* Первая команда отучает текстовые виджеты Tk (используемые для реализации
  полей ввода чата в Ткаббере) реагировать на комбинацию Ctrl-o, на которую там
  повешено действие "добавить пустую строку под курсор". Это шаманство
  требуется потому, что большую часть времени вы будете нажимать Ctrl-o в тот
  момент, когда фокус ввода будет в одном из полей ввода чата, которое и будет
  пытаться его обработать раньше главного окна (см. ниже).
* Вторая команда прибивает выполнение нужного нам действия к главному окну
  приложения (которое в Tk называется ".") — (весьма продвинутая) реализация
  привязок событий к виджетам, реализованная в Tk, делает так, что, если
  программистом не указано обратное, любой виджет, в котором нет привязки
  некоторого действия к произошедшему в нём событию, в конечном итоге отправит
  это событие главному окну. Поэтому наша команда делает так, что нужная нам
  комбинация клавиш будет работать независимо от того, где находится фокус
  ввода. За подробностями отправляйтесь к документации по команде
  [bindtags](http://www.tcl.tk/man/tcl8.5/TkCmd/bindtags.htm).

# <a id="Комбинации_кнопок_а-ля_Unix_shell_в_текстовых_виджетах"></a>Комбинации кнопок а-ля Unix shell в текстовых виджетах
> **Внимание!** Данная функциональность реализована готовым
  [**плагином**](Плагины.md#Unixkeys).

Тут рассказывается о том, как прикрутить к текстовым виджетам в Ткаббере
"юниксшелловые" комбинации кнопок.

Естественно, это _не_ "комбинации кнопок юниксового шелла" в строгом смысле
этого понятия, ибо строгого смысла у этого понятия нет, да и само понятие
слишком расплывчато. Это — неполное воспроизведение набора команд по уполчанию
библиотеки **GNU Readline**. Если у вас есть под боком система с **Readline**,
документация на неё обычно доступна в формате GNU Texinfo, а вас интересует
страница руководства "rluserman". Кроме того, некоторые приведённые команды
"взяты" из оболочки **bash**. Проще говоря, эти настройки подойдут тем, чьи
"клавиатурные" рефлексы "заточены" на bash-подобную оболочку, режим вставки
Vim'а и прочие похожие вещи.

Приведённые настройки нужно писать в конфиг Ткаббера.

## <a id="Команды_перемещения_курсора"></a>Команды перемещения курсора

По умолчанию работают и не требуют дополнительных настроек следующие команды:

*  Ctrl-b и Ctrl-f — переместить курсор на символ назад и вперёд,
   соответственно.

*  Ctrl-a и Ctrl-e — переместить курсор в начало и конец текущей строки,
   соответственно.

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

Alt-b — переместить курсор на слово влево:

    bind Text <Alt-b> [bind Text <Control-Key-Left>]

Alt-f — переместить курсор на слово вправо:

    bind Text <Alt-f> [bind Text <Control-Key-Right>]

**Примечание:** на некоторых системах, возможно, вместо `Alt` понадобится
указывать модификатор `Meta`. Можно воспользоваться "копипастом", а можно
заставить работать тикль:

    array set map {
        b Left
        f Right
    }
    foreach key [array names map] {
        foreach mod {Alt Meta} {
            bind Text <$mod-$key> [bind Text <Control-Key-$map($key)>]
        }
    }
    unset map key mod

Эта команда создаст четыре биндинга: Alt-b, Meta-b, Alt-f; и Meta-f,
привязанные к соответствующим командам.

## <a id="Команды_удаления_текста"></a>Команды удаления текста

По умолчанию работают и не требуют дополнительных настроек следующие команды:

*  BackSpace — удалить символ слева от курсора.

*  Del и Ctrl-d — удалить символ справа от курсора.

*  Ctrl-k — убить текст от позиции курсора до конца строки.

Усовершенствуем встроенные возможности несколькими командами.

Данной команды нет в **Readline**, но она есть в **bash**:

Ctrl-u — убить текст от начала строки до позиции курсора:

    bind Text <Control-u> { %W delete {insert linestart} insert}

Теперь — убиение по границам слов:

Alt-BackSpace — удалить текст от курсора до начала слова, содержащего позицию
курсора, или до начала предыдущего слова, если курсор стоит между словами:

    bind Text <Alt-Key-BackSpace> { %W delete [tk::TextPrevPos %W insert tcl_startOfPreviousWord] insert }

Ситуация несколько сложнее с Control-w: в руководстве на **Readline** сказано,
что эта команда удаляет текст до предыдущего пробела и таким образом отличается
от Alt-BackSpace.

Лично мне ([**Kostix**](Участник_Kostix.md)) эта разница ясна не вполне.
Получается, что Ctrl-w не должна стирать  "foo", если нажата в ситуации "foo  |
bar" ("|" отмечает позицию курсора). Но она _сотрёт_ это слово, будучи
активирована в **bash**. Там она работает в точности, как предыдушая команда.

Одним словом, "suggestions are welcome", но здесь предлагается не
заморачиваться и повесить на Ctrl-w ту же команду, что и на Alt-BackSpace.
Здесь тоже имеет смысл призвать на помощь тикль:

    foreach {mod key} {Alt BackSpace Control w} {
        bind Text <$mod-Key-$key> { %W delete ...
    }
    unset mod key

Alt-d — удалить текст от курсора до конца слова, содержащего позицию курсора,
или до конца следующего слова, если курсор стоит между словами:

    bind Text <Alt-Key-d> { %W delete insert [::tk::TextNextPos %W insert tcl_endOfWord] }

Эту же команду может выполнять Alt-Del; повесьте на неё ту же команду, что и
для Alt-d. И опять пусть за нас работает тикль:

    foreach key {d Delete} {
        bind Text <Alt-Key-$key> { ...
    }
    unset key

## <a id="Undo_Redo"></a>Undo/Redo

Сначала — две команды, отменяющие любое последнее действие по редактированию
текста:

Ctrl-\_ работает в "иксовых" версиях Tk; для добавления такой поддержки в
Windows нужно сделать:

    event add <<Undo>> <Control-Key-underscore>

Ctrl-x,Ctrl-u добавляется (заодно показывая синтаксис "цепочечных" событий в
Tk) так:

    event add <<Undo>> <Control-Key-x><Control-Key-u>

Следующая команда — Ctrl-y — не может иметь чёткого эквивалента, поскольку
вставляет последний кусок текста, удалённый из строки и помещённый в kill-ring
**Readline** (а у текстовых виджетов Tk нет такой штуки). Однако фактически это
действие очень похоже на "Redo", и именно на эту комбинацию и повешено "Redo" в
Windows. В "иксовом" Tk Ctrl-y означает "вставить текст из CLIPBOARD". Если
есть желание "перебить" его чтоб было как "в виндах" и **bash**, то:

    bind <<Redo>> <Control-Key-y>

## <a id="Невошедшее"></a>Невошедшее

Пару команд **GNU Readline** мы обошли стороной:

*  Ctrl-l — перерисовать экран — по-видимому, смысла в контексте виджета Text
   не имеет.

*  M-y — "вращение" kill-ring'а **Readline** — как-то тоже не вписывается, т.к.
   стеком Undo/Redo управлять, насколько мне изестно, нельзя.

## <a id="Замечания"></a>Замечания

Пытливые умы могли заметить, что использовались две команды — `bind` и `event`.

*  Первая (в нашем случае) связывала воедино триплет "класс виджета, событие
   Tk, скрипт для выполнения", и с ней всё просто: ко всем виджетам класса
   `Text` в Ткаббере привязываются скрипты, которые выполняются при наступлении
   соответствующих событий (нажатий комбинаций клавиш).
*  Вторая связывала скрипты с _виртуальными событиями Tk_, которые уже связаны
   с (в том числе) виджетами класса `Text`.

Вывод, который следует из такого разделения, прост: те привязки, которые
делались к виртуальным событиям, будут работать помимо `Text` в виджете любого
класса, который эти события поддерживает. А те привязки, которые делались к
классу `Text`, будут работать только в текстовых виджетах. То есть не надо
ожидать, что они будут работать в однострочных полях ввода (класс `Entry`) или
комбобоксах (это вообще пакет BWidget и класс надо выяснять).

Нужно ли заморачиваться с подобной "тонкой настройкой" нетекстовых виджетов
(например, однострочных полей ввода) — вопрос философский. Как говорится,
"patches are welcome".

## <a id="Дидактика"></a>Дидактика

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

Посему ниже приведены некоторые идеи относительно данного раздела. Перед
чтением убедитесь, что вы приняли позу лотоса, левитируя, и ваша
[сахасрара](http://www.chakra.ru/sahasrara.htm) полностью открыта.

![(!)](../images/Hammer.png) **Сделать:** написать про основные идеи ковыряния

Примерный план:

*  понимание того, что Tcl/Tk — скриптовый и ультра-динамический язык, то есть
   можно делать радикальные модернизации кода готового приложения;
*  выяснение того, что chat input window — виджет Text;
*  чтение мануалов (man text event bind);
*  интроспекция и забавы с tkcon и простым виджетом text:
 *  bind Text; поиск по выводу;
 *  bind Text EVENT\_SPEC и анализ его вывода;
 *  info args, info body;
 *  info commands и ограничение его поиска.
 *  команды виджета Text;
 *  сложные текстовые индексы виджета Text;
 *  быстрое тестирование в tkcon.

...

"More юникс вея" в Ткаббер добавлял [**Kostix**](Участник_Kostix.md).

# <a id="Копирование_текста_по_Ctrl-C_из_окна_чата_в_иксах"></a>Копирование текста по Ctrl-C из окна чата в "иксах"
Ниже приведён кусок кода, который позволяет в Ткаббере "под иксами" копировать
текст из окна чата (из того, в котором ведётся _протокол_ чата), используя
стандартные клавиатурные комбинации копирования текста.

Проблема с "недопиленным" Ткаббером заключается в том, что окно чата никогда не
получает клавиатурный фокус, что необходимо для работы "хоткеев". В Windows
комбинация Ctrl-C работает для данного окна потому, что в Windows не
поддерживается механизм
["PRIMARY selection"](http://freedesktop.org/wiki/Standards_2fClipboardsWiki) —
копирование текста из виджета, не получающего клавиатурный фокус было бы в
противном случае невозможно.

"Иксовое ограничение" преодолевается следующим образом: на окно _ввода текста_
чата вешается собственный обработчик, который, будучи вызван по любой
стандартной (и нестандартной) комбинации клавиш, соответствующей действию
"копировать текст", проверяет:

*  если в окне ввода текста есть выделенный текст, то выполняется стандартное
   для окна действие по копированию этого текста;
*  если в окне ввода нет выделенного текста, то действие "копировать текст"
   эмулируется в соответствующем окне протокола чата — если там есть выделенный
   текст, он копируется в буфер обмена.

Таким образом, пользователь всегда жмёт хоткей "копировать текст" в окне ввода
текста чата, но текст копируется из того окна (ввода текста или протокола), в
котором в данный момент есть выделенный текст.

Этот код следует поместить в **config.tcl** вне любых хуков.

    # Customize chat input window bindings:
    namespace eval my {}
    proc my::tweak_chat_input_window {chatid type} {
        set cw [chat::chat_win $chatid]
        set iw [chat::input_win $chatid]

        bind $iw <<Copy>> [list \
            if {[string equal [selection own] %W]} [bind $iw <<Copy>>] \
            else [list event generate $cw <<Copy>>]
        ]
    }
    hook::add open_chat_post_hook my::tweak_chat_input_window

**Принцип действия** (можно не читать):

Для начала мы создаём собственное пространство имён "my". Это необязательный
шаг, но он убирает нашу процедуру из глобального пространства имён. Не мешалась
чтоб.

Поскольку наша цель — изменить настройку окна ввода текста для каждого
создаваемого сеанса чата, нам удобнее всего написать обработчик события
`open_chat_post_hook`, которое генерируется после  того, как Ткаббер создал
окно "верхнего уровня" для нового сеанса чата. (Про наиболее важные
[**хуки**](Загрузка_настроек.md) читайте в документации, идущей вместе с Ткаббером
— **tkabber.html**.)

Обработчик хука `open_chat_post_hook` вызывается с двумя параметрами:

*  **chatid** — идентификатор сеанса чата;
*  **type** — тип сеанса чата.

**chatid** — это "ключ", который позволяет получить доступ к различным
компонентам, поддерживающим данный сеанс чата.

Нас интересует доступ к двум окнам: ввода текста и протокола чата. Их имена мы
получаем при помощи процедур `chat_win` и `input_win` модуля "chat" (см.
**chats.tcl**).

Теперь окна у нас есть, и можно заняться навешиванием обработчика на
_виртуальное событие_ \<\<Copy>>. За подробностями обращайтесь к описаниям
команд [bind](http://www.tcl.tk/man/tcl8.4/TkCmd/bind.htm) и
[event](http://www.tcl.tk/man/tcl8.4/TkCmd/event.htm).

Обработчик будет состоять из одной команды — `if`, но так как нам нужно
обеспечить подстановку переменных при формировании этой команды, мы не можем
использовать {} и используем команду
[list](http://www.tcl.tk/man/tcl8.4/TkCmd/list.htm). (На самом деле в этом коде
можно вместо [list ...] использовать "...".)

Код обработчика события \<\<Copy>> первым делом узнаёт имя окна, владеющего в
данный момент выделением текста, при помощи команды
[selection](http://www.tcl.tk/man/tcl8.4/TkCmd/selection.htm), и сравнивает это
имя с именем окна, для которого выполняется обработчик (тикль подставляет его
вместо специального токена **%W**; на самом деле тут без проблем можно
использовать **$iw** вместо **%W**).

Если имена окон совпали, то выделением владеет окно ввода чата, и нам нужно
выполнить стандартное для него действие, закреплённое за событием \<\<Copy>>.
Поскольку своей командой `bind $iw ...` мы как раз это действие и
переопределяем, нам нужно узнать код текущего обработчика. Это делается при
помощи двухаргументной формы команды **bind**; результат выполнения этой
команды и формирует первую ("истинную") ветвь команды **if**.

Если имена не совпали, то нам стоит не мудрствуя лукаво сделать вид, будто
пользователь исхитрился выполнить действие "копировать текст" в окне протокола
чата. На помощь приходит умение команды **event** генерировать произвольные
события в произвольном окне. Соответствующий код, опять сформированный при
помощи команды **list**, чтобы разрешить подстановку переменной **cw**,
формирует "ложную" ветвь нашего обработчика.

Информацию о правильном формировании команд тикля (чем отличается {} от "" и
[list ...], а также зачем нужны "\\" на концах некоторых строк) читайте в
["Эндекологии"](http://wiki.tcl.tk/14940).

Эзотерический биндинг прикручивал [**Kostix**](Участник_Kostix.md).

# <a id="Предотвращение_запуска_нескольких_процессов_Ткаббера"></a>Предотвращение запуска нескольких процессов Ткаббера
Задача: сделать так, чтобы нельзя было запустить вторую копию Ткаббера.

## <a id="Простое_решение"></a>Простое решение

Впишите в конфиг вне любых хуков:

    if [catch {open $::configdir/lock {WRONLY CREAT EXCL}} fd] exit
    puts $fd [pid]; close $fd
    hook::add quit_hook { file delete $::configdir/lock }

Работает это следующим образом:

*  При старте Ткаббер проверяет, создан ли файл
   **[$::configdir]($__configdir.md)/lock**, и если создан, завершает
   выполнение.
*  Если такого файла нет, Ткаббер:
 *  Создаёт этот файл и записывает туда идентификатор своего процесса (хотя эта
    информация в дальнейшем не используется);
 *  Вешает обработчик, удаляющий данный файл, на событие **quit\_hook**,
    генерируемое при нормальном завершении работы Ткаббера.

Если Вам кажется, что "тема интерактива не раскрыта", замените первую строчку
на такой фрагмент:

    if [catch {open $::configdir/lock {WRONLY CREAT EXCL}} fd] {
        wm withdraw .
        tk_messageBox -title Tkabber -message {Уже работаем!}
        exit
    }

Фичу прикручивал [**Kostix**](Участник_Kostix.md).

Идея атомарной проверки существования файла, совмещённой с его открытием,
позаимствована [отсюда](http://wiki.tcl.tk/3496).

## <a id="Проблема"></a>Проблема

А если завершение работы Ткаббера было ненормальным?...

Фичу сомнениям подвергал [**ycbl**](Участник_Bigote.md).

[**Kostix**](Участник_Kostix.md) парирует: ...то тогда можно пойти и удалить
оставшийся файл руками.

Вообще, раз уж этот вопрос задаётся второй раз (см. ниже), вот два
альтернативных решения:

## <a id="Альтернатива_TCP_сокет"></a>Альтернатива: TCP сокет

    if [catch {socket -myaddr localhost -server {} 6666}] exit

Сия команда пытается открыть серверный TCP-сокет **127.0.0.1:6666**; если он
уже занят, команда завершается с ошибкой (**catch** возвращает "истину") и
работа интерпретатора тикля завершается (**exit**). В случае успеха этот порт
"занимается" Ткаббером и вторая копия Ткаббера не сможет запуститься по
причине, рассмотренной выше.

6666 — это TCP-порт, который пытается открыть  Ткаббер. Его следует выбрать по
вкусу, помня, однако, что:

*  Этот порт не должен штатно использоваться никакой другой программой;
*  Он должен находиться в диапазоне от 1024 до 65535.

Достоинство решения с сокетом — простота и кроссплатформенность, недосток:
бессмысленно занятый порт при работе Ткаббера. Кроме того, следует понимать,
что _выбранный порт может быть занят **любой** программой ещё до старта
Ткаббера,_ например, его может назначить ядро для исходящего TCP-соединения
какой-либо программы.

## <a id="Альтернатива_Блокировка_файла"></a>Альтернатива: Блокировка файла

    if {![catch {package require Tclx}]} {
        set fd [open $::configdir/lock w]
        if {![flock -nowait $fd]} {
            wm withdraw .
            tk_messageBox -message {Уже запущен!}
            exit
        }
        puts $fd [pid]; flush $fd
    }

Плюсы:

*  Более надёжно, чем сокет;
*  "Почти" кроссплатформенно (см. ниже);

Минусы:

*  Требует наличия пакета **Tclx**;
*  Не работает в Win9x;
*  Постоянно открытый файл в течение работы Ткаббера.

Можете также добавить к этому коду обработчик события **quit\_hook**,
аналогичный показанному выше, для удаления лок-файла при нормальном выходе из
Ткаббера.

## <a id="Пища_для_размышлений"></a>Пища для размышлений

Кроме приведённых решений, возможны и другие варианты, например:

*  Проверка лок-файла на валидность в Unix при помощи средств пакета **Tclx**:
   чтение PID процесса из лок-файла и проверка сигналом 0 команды **kill**
   существует ли этот процесс;
*  "Синглетон" при помощи DDE в Windows средствами пакета **dde**.

Можно придумать и ещё. Можете почитать
[обсуждение этих методов](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2007/01/03.html#21:12:38),
имевшее место в `tkabber@conference.jabber.ru`.

А вот [мнение профессионалов по этому поводу](http://wiki.tcl.tk/593).

# <a id="Отправка_сообщений_нажатием_Ctrl-Enter"></a>Отправка сообщений нажатием Ctrl-Enter
Впишите в конфиг вне всяких хуков:

    proc fix_msg_send_key {chatid type} {
        set iw [::chat::input_win $chatid]

        bind $iw <Control-KeyPress-Return> [bind $iw <KeyPress-Return>]
        bind $iw <KeyPress-Return> [bind $iw <Shift-KeyPress-Return>]
        bind $iw <Shift-KeyPress-Return> {}
    }

    hook::add open_chat_post_hook fix_msg_send_key

Эта процедура запускается после открытия любого окна чата. Действует она в четыре этапа:

1.  Получает имя окна ввода текста для соответствующего сеанса чата;
1.  Привязывает к этому окну на комбинацию Ctrl-Enter то действие, которое
    привязано к клавише Enter (то есть "отослать сообщение);
1.  Привязывает к этому окну на клавишу Enter то действие, которое привязано к
    комбинации Shift-Enter (то есть "вставить перевод строки");
1.  Уничтожает привязку к комбинации Shift-Enter.

Привязку кнопок фиксил [**kostix**](Участник_Kostix.md).

Альтернативное решение — [прямой патч на Tkabber](Патчи.md#Отправка_сообщений_по_нажатию_Ctrl-Enter).

# <a id="Отправка_сообщений_по_нажатию_NumPad_Enter"></a>Отправка сообщений по нажатию NumPad Enter
Добавить в конфиг вне хуков следующий код:

    bind all <Key-KP_Enter> {
        set event Return
        if {%s & 0x01} {
    	    set event Shift-$event
        }
        if {%s & 0x04} {
    	    set event Control-$event
        }
        if {%s & 0x08} {
    	    set event Alt-$event
        }
        if {$event == "Return"} {
    	    set event Key-$event
        }
        event generate %W <$event>
    }

Этот код навешивает реакцию на нажатие клавиши "Enter на дополнительной
клавиатуре" на специальный "тэг привязки" "all", обработчики для событий на
котором проверяются, если подходящие не найдены на окне, в котором событие
произошло (в реальности это несколько сложнее, но для нашего случая сойдёт).

Код обработчика проверяет состояние управляющих клавиш (Shift, Control, Alt) в
событии и генерирует в исходном окне аналогичное по смыслу событие, только
вместо "Enter на дополнительной клавиатуре" в нём прописана обычная клавиша
ввода.

# <a id="Закрытие_табов_по_Ctrl-W"></a>Закрытие табов по Ctrl-W
Впишите в конфиг вне хуков:

    hook::add finload_hook {
        bind . <Control-Key-w> [bind . <Control-Key-F4>]
    }

Этот тривиальный код привязывает к комбинации Ctrl-w на главном окне Ткаббера
действие, привязанное к комбинации Ctrl-F4 на нём же.

# <a id="Скрытый_по_умолчанию_ростер"></a>Скрытый по умолчанию ростер
Впишите в конфиг вне хуков:

    hook::add finload_hook {
        event generate . <<CollapseRoster>>
    }

Этот код программно генерирует событие, которое привязано к комбинации клавиш
Ctrl-r (действие "скрыть/показать ростер").

# <a id="Запрет_IRC-команды__exec_в_окнах_чата"></a>Запрет IRC-команды /exec в окнах чата
Некоторые параноидально настроенные граждане интересовались: не может ли
"IRC-style" команда чата `/exec` (действие "выполнить внешнюю программу при
помощи команды Tcl [exec](http://tcl.tk/man/tcl8.4/TclCmd/exec.htm) и
подставить то, что она вывела на stdout/stderr, в качестве результата") иметь
вредных последствий?

Чтобы запретить эту команду совсем, впишите в конфиг вне хуков:

    hook::add postload_hook {
        proc ::plugins::handle_exec_command args {}
        proc ::plugins::exec_command_comps args {}
    }

Этот приём определяет две "пустые" процедуры (то есть процедуры с пустым телом,
которые ничего не делают, будучи вызванными). Если процедура, имя которой
указано в качестве первого аргумента команды
[proc](http://tcl.tk/man/tcl8.4/TclCmd/proc.htm), существует, таковая
_удаляется_ и заменяется новой, определённой остальными аргументами команды
**proc**. Другими словами, подобный приём позволяет "деактивировать" любую
процедуру, не удаляя её (что привело бы к ошибкам времени выполнения).

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

# <a id="Отмена_подсветки_текста_активного_таба"></a>Отмена подсветки текста активного таба
Одному пользователю Ткаббера не понравилось, что виджет NoteBook из пакета
BWidget, используемый Ткаббером для создания "интерфейса с табами", изменяет
цвет текста активного таба (того, на котором в данный момент находится курсор
мыши) на "стандартный". При этом, если в окне данного таба есть непрочитанные
сообщения, и цвет текста в табе, соответственно, отличается от стандартного
(обычно он синий или красный), это цветовыделение "убивается" "активной
подсветкой".

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

    proc fix_tab_colors {w page} {
        $w itemconfigure $page -activeforeground \
            [$w itemcget $page -foreground]
    }

    hook::add finload_hook {
        .nb bindtabs <Any-Enter> [list fix_tab_colors %W]
    }

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

Работает этот код следующим образом:

*  Запуск процедуры `fix_tab_colors` привязвается к событию Tk "Enter" (курсор
   мыши вошёл в пределы окна виджета) с модификатором "Any" (в момент
   совершения события игнорируются нажатия любых кнопок) к виджету **.nb**,
   который и занимается управлением табами и их окнами. В момент привязки для
   процедуры сразу же указывается первый параметр: **%W** раскрывается
   подсистемой событий Tk в имя окна, в котором произошло событие;
*  В тот момент, когда указатель мыши входит в пределы одного из табов виджета
   **.nb**, этот таб становится _"активным"_ в терминах Tk, и для него
   вызывается определённая нами процедура, которой передаётся имя таба. Эта
   процедура:
   1.  Получает текущее значение настройки **-foreground** ("цвет текста") для
       переданного таба;
   1.  Устанавливает значение настройки **-activeforeground** ("цвет текста
       таба под курсором") для переданного таба.

В результате настройка **-activeforeground** таба получает текущее значение его
настройки **-foreground** при каждой активизации этого таба. То есть само
действие "фичи" — изменения цвета текста активного таба — эффективно
отменяется, что и требовалось получить.

**Примечание:** в данном случае, так как наша процедура используется для
обработки событий, происходящих ровно в одном окне, можно вместо **%W**
написать просто **.nb** — потеряется (ненужная) гибкость, но зато, возможно,
код станет несколько понятнее.

Подсветку отменял [**kostix**](Участник_Kostix.md).

# <a id="Настройка_кнопки_Тема_в_групчатах"></a>Настройка кнопки "Тема" в групчатах
Чтобы визуально выделить кнопку "Тема" в окнах групчата, можете вставить в файл
конфигурации этот код вне любых хуков:

    proc fix_topic_button {chatid type} {
        if {![string equal $type "groupchat"]} return

        set b [::chat::winid $chatid].status.mb
        $b config -relief raised -text Опции
    }

    hook::add open_chat_post_hook fix_topic_button

Код возвращает кнопке стандартную рельефность и меняет её название с "Тема" на
"Опции".

# <a id="Предустановленные_описания_статусов"></a>Предустановленные описания статусов
> **Внимание!** Доступен [**плагин**](Плагины.md#Customstatus) аналогичного
  назначения, предоставляющий более удобный способ работы с предустановками
  статусов и их описаний.

## <a id="Что_такое_описание_статуса_и_зачем_нужны_предустановленные_описания"></a>Что такое описание статуса и зачем нужны предустановленные описания

В нижней части окна Ткаббера есть текстовое поле для ввода описания статуса.
Описание статуса — это подробная информация о причине вашего отсутствия (или
присутствия, если хотите). Другие пользователи могут видеть это описание рядом
с вашим JID и статусом, например, наведя на ваш ник указатель мыши (это
поведение зависит от клиента). Если вы хотите установить описание статуса, вы
вводите его в упомянутое текстовое поле, после чего устанавливаете статус
посредством меню.

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

## <a id="Как_настроить_предустановленные_описания"></a>Как настроить предустановленные описания

Следующие изменения в **[файле конфигурации](Файл_конфигурации.md)** позволяют
при установке статуса менять описание статуса на заранее заданное.

1. Добавьте в **config.tcl** следующий текст.

        #Предустановленные описания статусов. Заменяйте текст в кавычках на свой.
        set default_text(available) "I am available" # описание статуса 'Доступен'
        set default_text(chat) "Free to chat"        # описание статуса 'Свободен для разговора'
        set default_text(away) "I am away"           # описание статуса 'Отошёл'
        set default_text(xa) "I am far away"         # описание статуса 'Отошёл давно'
        set default_text(dnd) "Do not disturb"       # описание статуса 'Не беспокоить'
    
        proc ::use_default_status_texts {} {
            set m .presence.button.menu
            foreach {status str} $::user_status_list {
                if {![info exists ::default_text($status)]} {
                    continue
                }
                switch -- $status {
                    invisible -
                    unavailable {}
                    default {
                        $m entryconfigure $str \

                           -command [join [list [list set textstatus   $::default_text($status)] [list set userstatus $status]] "; "]
                    }
                }
            }
        }

    Некоторые (или все) строки, начинающиеся с `set default\_text`, можно
    закомментировать. В таком случае при установке соответствующего статуса будет
    установлено описание статуса, введенное в текстовое поле в нижней части окна
    Ткаббера, то есть, для соответствующей команды меню будет установлено поведение
    по умолчанию.

1. Добавьте вызов процедуры `use\_default\_status\_texts` в процедуру
   `finload`. Если такой процедуры нет в файле **config.tcl**, то создайте её,
   вставив следующий текст.

        proc finload {} {
            use_default_status_texts
        }


**Примечание:** С приведёнными настройками изменение описания статуса будет
происходить только при изменении статуса с помощью меню, вызываемого кнопкой в
левом нижнем углу окна Ткаббера. Если вы хотите изменить описание статуса на
вписанное в поле вручную, воспользуйтесь командой главного меню **Tkabber →
Присутствие**.

# <a id="Добавление_собственной_кнопки_на_тулбар"></a>Добавление собственной кнопки на тулбар
Периодически пользователи Ткаббера предлагают добавить на тулбар ещё одну
кнопку, выполняющую ту или иную команду, обычно доступную другим способом,
например, через главное меню. Поскольку вкусы и потребности у всех разные,
разработчики обычно оставляют такие запросы без внимания.

На самом деле добавить свою кнопку на тулбар очень просто, если знать какую
именно команду Tcl требуется выполнять по нажатию этой кнопки, а это уже
зависит от личных способностей ковыряющихся в исходниках Ткаббера.

В качестве простейшего примера добавим на тулбар кнопку, открывающую окно **Raw
XML**, обычно доступное через пункт главного меню Ткаббера **Службы→Инструменты
администратора→Открыть окно XML**.

Поместите в файл **config.tcl** вне любых хуков:

    hook::add finload_hook {
        set b [[.mainframe gettoolbar 0].bbox add]
        $b configure \
            -highlightthickness 0 \
            -takefocus 0 -relief link \
            -bd $::tk_borderwidth \
            -padx 1 -pady 1 \
            -text XML \
            -helptext "Открыть окно XML" \
            -command ::plugins::rawxml::open_window \
    }

**Принцип действия** (читать необязательно):

Поскольку мы собираемся добавлять кнопку на уже _существующий_ виджет, наш код
должен выполняться после того, как элементы GUI созданы. Для этого код нужно
реализовать в виде обработчика [**хука**](Загрузка_настроек.md#Хуки)
**finload\_hook**.

Первая строка в обработчике добавляет кнопку на тулбар и присваивает её имя
переменной с именем "b":

*  Команда "`.mainframe gettoolbar 0`" возвращает имя "нулевого" (и
   единственного) тулбара Ткаббера;
*  К этому имени добавляется суффикс `.bbox`, в результате чего получается имя
   специального виджета — набора кнопок в тулбаре; оно же по совместительству
   является и именем команды, которую можно использовать для управления
   кнопками в этом наборе.
*  Полученная команда выполняется с аргументом `add`, добавляя новую кнопку в
   набор и возвращая имя этой кнопки, которое, как и обычно в Tk, одновременно
   является именем команды для управления этим виджетом.

Вторая строка конфигурирует добавленную кнопку:

*  Первые несколько опций (`-relief`, `-takefocus`, `-highlightthickness`,
   `-padx`, `-pady`, `-bd`) конфигурируют внешний вид кнопки  делают вид кнопки
   таким же, как у остальных, уже находящихся на тулбаре кнопок; интересующиеся
   могут изучить определение процедуры `ifacetk::add_toolbar_button` в файле
   ifacetk/iface.tcl.
*  Опция `-text` делает строку "XML" надписью на кнопке. Обратите внимание на
   то, что для этого подходят только короткие куски текста, иначе кнопка
   получится чрезмерно большой. В качестве альтернативы можно использовать
   картинку (см. ниже).
*  Опция `-helptext` настраивает всплывающую подсказку (тултип) у кнопки.
*  Ключевой является опция `-command`, которая привязывает команду к нажатию
   кнопки. В нашем случае это полное имя соответствующей процедуры тикля
   (определённой в файле **plugins/general/rawxml.tcl**) без параметров.

**Что дальше?**

Можно использовать опцию `-icon` вместо опции `-text`, если у вас есть готовая
картинка 24x24x8bpp. Картинка может быть в любом формате, поддерживаемом
Ткаббером, однако,
[**"переносимым"**](Ткаббер_ЧаВо.md#Не_видны_иконки_фото_и_т.д._в_JPEG_PNG)
является только формат GIF.

Картинка должна быть предварительно загружена при помощи команды
[image](http://www.tcl.tk/man/tcl8.4/TkCmd/image.htm), например:

    set img [image create photo -file /path/to/my/icon.gif]
    ...
    $button configure -icon $img ...

Кроме того, в Ткаббере есть готовая процедура, позволяющая добавить кнопку с
картинкой более просто, например:

    set icon     [image create photo -file smile.gif]
    set command  {tk_messageBox -message Cheese!}
    set helptext {Says "Cheese!"}
    ...
    ifacetk::add_toolbar_button $icon $command $helptext

Ткаббер использует виджеты **ButtonBox** и **Button** из пакета **BWidget**,
соответственно, за подробной информацией о возможностях работы с тулбаром и
отдельными кнопками следует обращаться к
[документации на BWidget](http://tcllib.sourceforge.net/BWman/).

# <a id="Собственное_меню_для_киков_в_групчате"></a>Собственное меню для киков в групчате
Добавьте этот код в **config.tcl** вне любых хуков:

    set my_kick_reasons {
        "Ya bastard"
        "Go away, bad boy"
        "French connectionUCK OFF!"
        "Чужие здесь не ходят!"
    }

    proc create_kick_presets_menu {m connid jid} {
        global my_kick_reasons

        menu $m

        foreach reason $my_kick_reasons {
            if {[string length $reason] > 25} {
                set label [string range $reason 0 22]...
            } else {
                set label $reason
            }
            $m add command -label $label \
                -command [list muc::change_item_param \
                {role none} down $connid $jid $reason]
        }

        set m
    }

    proc add_kick_presets {m connid jid} {
        set km $m.my_kick_menu
        create_kick_presets_menu $km $connid $jid

        $m add separator
        $m add cascade -label "Custom kicks" -menu $km
    }

    hook::add roster_create_groupchat_user_menu_hook add_kick_presets

Отредактируйте переменную **my\_kick\_reasons** по вкусу.

# <a id="Автоответчик"></a>Автоответчик
> Внимание! Данный код был преобразован в [**плагин**](Плагины.md#Autoanswer) и
  несколько улучшен (в частности, появилась иконка для тулбара). Рекомендуется
  пользоваться им; данная заметка сохранена для истории.

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

## <a id="Установка"></a>Установка

Чтобы установить автоответчик, нужно

1. в **config.tcl** добавить вне хуков следующий код:

        # === Answering machine ===
    
        # == Auto answer settings ==
        # Enable auto answer right from the start.
        # (When running, use the auto_answer [yes|no] procedure in
        #  console to turn auto answer on and off.)
        set auto_answ_enabled no
    
        # JIDs for which answering is disabled.
        # Has priority over auto_answ_regex.
        # A value of "^$" means no restrictions.
        set auto_answ_disable_regex "^$"
        # JIDs for which answering is enabled.
        # A value of "" (or ".", or ".*" etc) means for all JIDs
        set auto_answ_regex ""
        set auto_answ_message "Не могу сейчас говорить (отошел от компьютера). Вернусь — отвечу."
        # Changing status to one from this list
        # will automatically turn the auto answer mode on,
        # while entering a status not listed here will turn it off.
        # Comment this variable out to make the answer mode
        # independent of the availability status.
        set auto_answ_status {
             away
             xa
             dnd
        }
        # == end Auto answer settings ==
    
        proc update_auto_answ_button {} {
            # if button not found, don't do anythyng
            if { [[.mainframe gettoolbar 0].bbox index auto_answer] == -1 } {
                return
            }
            if {$::auto_answ_enabled} {
                set txt "Автоответчик вкл."
            } else {
                set txt "Автоответчик выкл."
            }
            [.mainframe gettoolbar 0].bbox itemconfigure auto_answer \
                 -command ::auto_answ_toggle  -text $txt -relief link
        }
    
        proc auto_answ_toggle {} {
            # Invert the "enabled" flag
            set ::auto_answ_enabled [expr !$::auto_answ_enabled]
            # reset reply counters
            if { [array exists ::answered] } {
                array unset ::answered
            }
            update_auto_answ_button
        }
    
        # Sends the message ($::auto_answ_message)
        proc answ_process_message {connid from id type is_subject subject body args} {
            variable answered
            # Do not reply if disabled
            if { !$::auto_answ_enabled } {
                return
            }
            # Do not reply to normal messages
            if {$type != "chat" } {
                return
            }
            set chatid [::chat::chatid $connid $from]
            # Do not reply in MUCs
            if { [::chat::is_groupchat $chatid] } {
                return
            }
            set jid [jlib::connection_jid $connid]
            # Just to make sure the program never replies to itself
            if { $jid == $from } {
                return
            }
            # Do not reply if regexp rules are not met
            # Do not reply to empty messages
            if { [regexp -nocase $::auto_answ_disable_regex $from] \
                   || ![regexp -nocase $::auto_answ_regex $from] \
                   || [string equal $body ""] } {
                return
            }
            # Increment the number of times we replied to this JID
            if { ![info exists answered($from)] } {
                set answered($from) 1
            } else {
                incr answered($from)
            }
            # Stop replying after 3 replies
            if { $answered($from) > 3 } {
                return
            }
            if {[catch { set user [jlib::connection_user $connid] }]} {
                set user ""
            }
            # Send the message
            hook::run chat_send_message_hook \
                $chatid $user $::auto_answ_message "chat"
        }
    
        # Turns auto answer on or off when status changes
        proc answ_on_status_change {name1 name2 op} {
            if { ![info exists ::auto_answ_status] } {
                return
            }
            # Enable auto answer if current status is in the $::answ_status list
            if { [lsearch -exact $::auto_answ_status $::userstatus] != -1 } {
                # Don't do anything if auto answer is already enabled
                if { $::auto_answ_enabled } {
                    return
                }
                auto_answ_toggle
                return
            }
            # Disable auto answer if current status is not in the $::answ_status list
            if { $::auto_answ_enabled } {
                auto_answ_toggle
            }
        }
    
        trace add variable userstatus write answ_on_status_change
    
        hook::add process_message_hook \
            answ_process_message 150
        # === end Answering machine ===

2. В процедуру `finload` добавить следующие строки.

        #Auto answer button
        [.mainframe gettoolbar 0].bbox add -name auto_answer
        update_auto_answ_button

    Если такой процедуры в файле **config.tcl** нет, создайте её. В итоге она будет выглядеть следующим образом.

        proc finload {} {
            #Auto answer button
            [.mainframe gettoolbar 0].bbox add -name auto_answer
            update_auto_answ_button
        }

## <a id="Настройка"></a>Настройка

Следующие переменные отвечают за параметры автоответчика.

`auto_answ_enabled` – если установлена в _yes_, Ткаббер будет запущен со включенным автоответчиком, если в _no_, то с выключенным. По умолчанию установлена в _no_.

`auto_answ_disable_regex` – регулярное выражение, определяющее JIDы, для которых отсылка сообщений автоответчиком запрещена.

`auto_answ_regex` – регулярное выражение, определяющее JIDы, для которых отсылка сообщений автоответчиком разрешена.

Переменная `auto_answ_disable_regex` имеет приоритет над `auto_answ_regex`, то
есть, если JID пользователя, от которого пришло сообщение, соответствует
выражению `auto_answ_disable_regex`, ответное сообщение не будет отправлено
несмотря на то, соответствует ли JID выражению `auto_answ_regex`. Если JID не
соответствует ни одному из выражений, сообщение не будет отправлено. Настройки
по умолчанию максимально разрешающие, с ними автоматическая отправка ответа
будет происходить на любой JID, от которого пришло сообщение.


**Примечание:** Групчаты являются исключением из этих правил: автоответчик
никогда не реагирует на сообщения из них.

`auto_answ_message` – сообщение, которое получит пользователь, пославший вам сообщение.

`auto_answ_status` – список статусов, при установке которых автоответчик
будет автоматически включаться. При входе в статус, не перечисленный в списке,
автоответчик будет отключаться. Закомментируйте эту переменную, чтобы изменение
статуса никак не влияло на автоответчик, возможность включать/выключать его
вручную остаётся в любом случае. Элементы `auto_answ_status` принимают
значения из списка: available, chat, away, dnd, xa. По умолчанию включение
автоответчика настроено для статусов "отошёл", "отошёл давно" и "не
беспокоить".

## <a id="Управление"></a>Управление

Если вы всё сделали правильно, на панели инструментов появится кнопка
**Автоответчик выкл.** При ее нажатии автоответчик включается, и надпись на
кнопке меняется на **Автоответчик вкл.**. Чтобы убрать эту кнопку с панели
инструментов, закомментируйте строки, добавленные в процедуру `finload`. В этом
случае включать/выключать автоответчик можно с помощью команды
`auto_answ_toggle` в консоли.

# <a id="Настройка_положения_окна_уведомлений_в_Windows"></a>Настройка положения окна уведомлений в Windows
**Вопрос:** Требуется переместить всплывающее окно ("балун", "тултип") с
уведомлениями, включающееся опцией **Настройки → MainInterface → Systray
→ ::ifacetk::systray::options(display\_status)**, из верхнего левого угла в
какое-то другое место экрана.

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

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

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

*  Откройте консоль Ткаббера;
*  Подведите указатель мыши к тому месту на экране, в котором по вашей задумке
   должен находиться верхний левый угол окна уведомлений;
*  Отпустите мышь, в консоли Ткаббера напишите:

        winfo pointerx .

    и затем:

        winfo pointery .

    вы получите ту самую пару чисел — координаты окна.

Добавьте в конфиг вне любых хуков:

    proc systray_tooltip_location args {
        return {ваша_координата_X ваша_координата_Y}
    }
    hook::add finload_hook {
        set ::ifacetk::systray::.tray(location) ::systray_tooltip_location
    }

Можете несколько усовершенствовать код, введя глобальную переменную:

    set notification_coords {0 0}

    proc systray_tooltip_location args {
        return $::notification_coords
    }
    hook::add finload_hook {
        set ::ifacetk::systray::.tray(location) ::systray_tooltip_location
    }

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

    set notification_coords {762 670}

# <a id="Собственный_шрифт_для_ростеров"></a>Собственный шрифт для ростеров
Шрифт ростеров (списка контактов и ростеров групчатов) настраивается синхронно
со шрифтом чата [**при помощи глобальной переменной _font_**](Шрифты.md). Если
требуется отдельно настраивать шрифты ростеров, придётся править код процедуры
`::ifacetk::roster::addline`. Для этого воспользуемся испытанным приёмом —
динамическим "патченьем" кода Ткаббера.

Напишите в [**config.tcl**](Config.tcl.md) вне любых хуков:

    # From: [http://wiki.tcl.tk/16978](http://wiki.tcl.tk/16978)
    proc params proc {
        set params [list]
        foreach param [info args $proc] {
            if {[info default $proc $param default]} {
                lappend params [list $param $default]
            } else {
                lappend params $param
            }
        }
        return $params
    }

    hook::add postload_hook {
        set proc ::ifacetk::roster::addline
        set body [info body $proc]
        set body [regsub -- {global\s+\yfont\y} $body {global rosterfont}]
        set body [regsub -all -- {\$font\y} $body {$rosterfont}]
        proc $proc [params $proc] $body
        unset proc body
    }

Теперь можно добавить к настройкам шрифтов в том же конфиге нечто вроде

    set rosterfont -*-arial-medium-*-*-*-*-*-*-*-*-*-iso10646-*

# <a id="Перемещение_элемента_меню_ростера_комнаты"></a>Перемещение элемента меню ростера комнаты
Некоторые неторопливые пользователи жалуются на то, что при перемещении
указателя мыши по контекстном меню ростера комнаты они часто "не дотягивают" до
искомого пункта "Показать информацию" и попадают в подменю пункта
"Игнорировать", расположенного выше. Приведённые строчки для
[**файла конфигурации**](Config.tcl_для_начинающих.md) перемещают элемент "Игнорировать" в
самый низ обсуждаемого меню:

    hook::add roster_create_groupchat_user_menu_hook imove 1000

    proc imove {m args} {
        set ix [$m index [::msgcat::mc "Ignore"]]
        set cmd [list $m insert end [$m type $ix]]
        set conf [$m entryconfigure $ix]
        foreach item $conf {
            lappend cmd [lindex $item 0] [lindex $item end]
        }
        $m delete $ix
        $m delete $ix ;# separator
        $m insert end separator
        eval $cmd
    }

**Принцип действия** (можно не читать):

Вначале мы добавляем процедуру, которую собираемся написать, в
[**хук**](Загрузка_настроек.md#Хуки), отвечающий за наполнение меню ростера комнаты
содержимым. Мы хотим, чтобы наша процедура запустилась последней в ходе
отработки хука, поэтому указываем для неё высокий приоритет (1000).

Далее определяем саму процедуру. Первым аргументом она получает имя
наполняемого меню. Остальные нас не интересуют и мы используем для них
стандартную идиому [`args`](http://www.tcl.tk/man/tcl8.5/TclCmd/proc.htm)
(любое число оставшихся аргументов).

Первым делом мы получаем индекс (номер по порядку, начиная с 0) элемента меню,
который собираемся переместить. Нас интересует опция "Игнорировать", но
поскольку мы хотим написать код, который работает независимо от языка
интерфейса, мы ссылаемся на перевод "референсного" названия ("Ignore") при
помощи команды [`msgcat`](http://www.tcl.tk/man/tcl8.5/TclCmd/msgcat.htm).

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

Наша команда (которая будет конструироваться в переменной `cmd`) начинается
"стандартным заклинанием" с участием подкоманды `insert` виджета
[`menu`](http://www.tcl.tk/man/tcl8.5/TkCmd/menu.htm) (a другая его подкоманда
— `type` — возвращает тип переданного ей элемента).

Затем мы получаем полное описание конфигурации данного элемента меню при помощи
подкоманды `entryconfigure` виджета `menu`. Эта информация возвращается в виде
списка — по одному элементу на каждую настройку, определённую для пункта меню;
каждый такой элемент, в свою очередь, является
[списком из пяти элементов](http://www.tcl.tk/man/tcl8.5/TkLib/ConfigWidg.htm):
название
настройки, имя настройки в [**базе данных опций Tk**](База_данных_опций_Tk.md),
класс настройки в БД опций, значение настройки по умолчанию и, наконец, текущее
значение этой настройки. Нас интересуют только первый и последний элементы из
перечисленных, так как именно их комбинация определяет текущее состояние
виджета. Посему мы итерируем по всем элементам списка конфигурации и добавляем
к конструируемой команде имена параметров конфигурации и их текущие значения.

После того, как команда вставки готова, мы удаляем наш элемент меню, сепаратор
под ним (это для красоты), после чего вставляем сепаратор в низ меню (опять же
для красоты) и, наконец, вставляем в самый низ наш "новый старый" элемент путём
выполнения ([eval](http://www.tcl.tk/man/tcl8.5/TclCmd/eval.htm))
сконструированной команды.

# <a id="Кнопка_Send_отправить_в_окне_ввода_сообщения"></a>Кнопка Send (отправить) в окне ввода сообщения
Кнопка **Send** в правой части окна ввода сообщения в окне разговора позволяет
отправлять сообщение с помощью мыши.

Иногда это позволяет сэкономить время, например, когда нужно выделить текст в
окне чата, вставить его средней кнопкой в окно ввода и тут же отправить, — все
эти действия можно выполнить без применения клавиатуры.

Добавить кнопку **Send** в окно ввода можно, поместив в
[**файл конфигурации**](Config.tcl_для_начинающих.md) следующий код, регистрирующий
обработчик хука `open_chat_post_hook`.

    proc open_chat_post_hook_handler {chatid type} {
        # Send button
        set iw [::chat::input_win $chatid]
        set parent [winfo parent $iw]
        set isw $parent.isw
        set pi [pack info $isw]
        set ix [lsearch -exact $pi -in]; incr ix
        set f [lindex $pi $ix]
        set sb [button $parent.send -text Send -command [list event generate $parent <KeyPress-Return>]]
        pack $isw -in $f -side left
        pack $sb -in $f -side right -fill y
        # End Send button
    }

    hook::add open_chat_post_hook open_chat_post_hook_handler

Автор кода [**Kostix**](Участник_Kostix.md).

**NB:** Если вы воспользовались инструкцией, изложенной в разделе
[**Отправка сообщений нажатием Ctrl-Enter**](#Отправка_сообщений_нажатием_Ctrl-Enter),
и добавили в **config.tcl** соответствующий код, то нужно заменить в
приведённой выше процедуре `open_chat_post_hook_handler` строку
`<KeyPress-Return>` на `<Control-KeyPress-Return>`.

>



|








|
|
|
|
|
|


|
|
|
|
|








|
|



|
|
|






|
<
<
<

|
<
<
<
<

|
<
<
<
<
<

|

|
<
|
<

|
<
<
<
<

|
<
<
<
<
<


|
|
|
|
|


|


|

|


|


|
<
<
<


|
<
<
<

|
<

|
<
<
<
<
<

|
<
<


|
|


|
<
<


|
|
|
|


|
<


|
|
|
|
|
|


|
<
<
<

|
<
<
<
<
<
<

|

|
|
|
|

<
|

|
<

|


|
<
<

|
<
<



|

|

|



|
|
|
|
|
|
|
|
|
>

|


|





|



|
<



|



|
<

|


|
<

|




|
<
<
<

|

|
<
<
<
<
<
|
<
<
<
<
<
<
<
<


|
<

|
<

|
<
<
<
<
<
<
<
<

|



|

|
<

|
<

|
<
<

|



|



|
<
<


|
|


|
|
|



|
<



|

|

|

|

|

|

|



|

|
<



|
<
<

<
|
<
<

|
<
<


|



|
<



|
<


|





|
<

|
<



|
<



|
<
<
<
<
<





|

|
<

|
<



|

|
<
<
<
|
<

|
<
<
<
<
<

|
<
<



|
<
<
<
<

|
<
<

|

|

|
<
|
|
|
|
|
|
|
|
|
|

|

|


|
<
<

|
<
<
<
<
<
<

|
<
<
<

|
<
|
<
<

|
<
<

|




|
|
|
|
|
|
|



|

|
<
<

|
<
<
<
<
<

|

|
|

|
<

|
<
<

|
<
<
<

|
<
<
<
<

|
<
<
<
<
<

|
<
<
<
<
<

|
<
<
<
<
<

|
<
<

|


|



|





|

|
<
<
|
|
<
|
<

|
<


|
|
|


|

|
<



|

|

|
<

|
<





|
<
<
<
<

|
<

|
|

|
<
<
<
<




|
|
|
|
|
|
|


|

|
|

|

|
|
|

|
<
<



|

|
<
<
|

<
|
<

|


|


|
|
|
|
|

|


|

|
|
<
|
<
|

|

|


|




|


|


|


|




|
<
<
<

|
<
<
<


|


|


|
<


|


|


|
<


|
<
<
<
<

|


|
|


|
<
<
<
<
<
<

|
<
<
<
<


|
<
<
<
<
<
<

|
<


|
|

|

|


|
<
<

|

|
<
<
<
<
<
|
<
<
<
|
<
|
<

|
<
<
<

|
<
<
<

|


|
<


|
|
|
|

|


|
<


<
|
<



|
<
<
<
<
<
<
<
|
<
<
<
<



|
<


<
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|

|
<
<
<
<

|
<
<
<
|
|
|

>
|
|
<
<
<


|
<
<
<

|
<
<

|
<
<

|


|
|
|
|
|
|
|
|
|


|

|
<
<
<

|
<

|
<
|
<
<
<
|
<
<

|

|
<
<
<
<
|
<
<
<
|
|
<
<

|

|
<
<
<
<

|
<





|
<







|
<
<
<


|


|
|
|
|

|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|

|
|
|
|
|

|


|


<
|
<

|
<
<
<
<
<
<
<
<



|

|

|

|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|

|
|
|

|

|
|
|

|

|
|
|
|
|



|

|

|

|

<
|
|
<
<
<
<
>

|
<

|

<
|
<
<
<
<
<
<



|
<
<
<
<
<


|
<
<
<

|
<
<

|
<

|
<
<

|
|
<
|
<
|
<
|
<
|
<
|

|


|


|


|




|


|


|




|
<
<
<
<

|



|
|
|
|
|
|
|
|
|

|

|
|
|
|
|
|


|




|
<
<
<
<
<


|

|
|
|
|
|
|
|
|
|
|


|

|
<
<
<

|
<
<
<

|
<
<
<
<

|
<
<
<
<

|
<
<
<

|
<
<
<
<
<
<
<
<
<
<
<

|
<
<
<
<


|
<
<
|
<
<

|
<
<


|
|
|
|
|
|
|
|
|
|
|

|


|

|
|
|
<
<
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50



51
52




53
54





55
56
57
58

59

60
61




62
63





64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84



85
86
87



88
89

90
91





92
93


94
95
96
97
98
99
100


101
102
103
104
105
106
107
108
109

110
111
112
113
114
115
116
117
118
119
120



121
122






123
124
125
126
127
128
129
130

131
132
133

134
135
136
137
138


139
140


141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176

177
178
179
180
181
182
183
184

185
186
187
188
189

190
191
192
193
194
195
196



197
198
199
200





201








202
203
204

205
206

207
208








209
210
211
212
213
214
215
216

217
218

219
220


221
222
223
224
225
226
227
228
229
230


231
232
233
234
235
236
237
238
239
240
241
242
243

244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265

266
267
268
269


270

271


272
273


274
275
276
277
278
279
280

281
282
283
284

285
286
287
288
289
290
291
292
293

294
295

296
297
298
299

300
301
302
303





304
305
306
307
308
309
310
311

312
313

314
315
316
317
318
319



320

321
322





323
324


325
326
327
328




329
330


331
332
333
334
335
336

337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353


354
355






356
357



358
359

360


361
362


363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381


382
383





384
385
386
387
388
389
390

391
392


393
394



395
396




397
398





399
400





401
402





403
404


405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421


422
423

424

425
426

427
428
429
430
431
432
433
434
435
436

437
438
439
440
441
442
443
444

445
446

447
448
449
450
451
452




453
454

455
456
457
458
459




460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484


485
486
487
488
489
490


491
492

493

494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513

514

515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541



542
543



544
545
546
547
548
549
550
551
552

553
554
555
556
557
558
559
560
561

562
563
564




565
566
567
568
569
570
571
572
573






574
575




576
577
578






579
580

581
582
583
584
585
586
587
588
589
590
591


592
593
594
595





596



597

598

599
600



601
602



603
604
605
606
607

608
609
610
611
612
613
614
615
616
617
618

619
620

621

622
623
624
625







626




627
628
629
630

631
632

633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658




659
660



661
662
663
664
665
666
667



668
669
670



671
672


673
674


675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692



693
694

695
696

697



698


699
700
701
702




703



704
705


706
707
708
709




710
711

712
713
714
715
716
717

718
719
720
721
722
723
724
725



726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768

769

770
771








772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926

927
928




929
930
931

932
933
934

935






936
937
938
939





940
941
942



943
944


945
946

947
948


949
950
951

952

953

954

955

956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983




984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014





1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033



1034
1035



1036
1037




1038
1039




1040
1041



1042
1043











1044
1045




1046
1047
1048


1049


1050
1051


1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073


[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Нетривиальные_настройки/index.html)


# Нетривиальные настройки

Материал из Tkabber Wiki.

## <a id="toc"></a>Содержание

* [1 Вступление](#Вступление)
* [2 Глобальные Горячие Клавиши (Windows only)](#Глобальные_Горячие_Клавиши_Windows_only)
* [3 Отладочный лог под Windows](#Отладочный_лог_под_Windows)
* [4 Хоткей для переключения между режимами ростера "все" и "только онлайн"](#Хоткей_для_переключения_между_режимами_ростера_все_и_только_онлайн)
* [5 Комбинации кнопок а-ля Unix shell в текстовых виджетах](#Комбинации_кнопок_а-ля_Unix_shell_в_текстовых_виджетах)
 * [5.1 Команды перемещения курсора](#Команды_перемещения_курсора)
 * [5.2 Команды удаления текста](#Команды_удаления_текста)
 * [5.3 Undo/Redo](#Undo_Redo)
 * [5.4 Невошедшее](#Невошедшее)
 * [5.5 Замечания](#Замечания)
 * [5.6 Дидактика](#Дидактика)
* [6 Копирование текста по Ctrl-C из окна чата в "иксах"](#Копирование_текста_по_Ctrl-C_из_окна_чата_в_иксах)
* [7 Предотвращение запуска нескольких процессов Ткаббера](#Предотвращение_запуска_нескольких_процессов_Ткаббера)
 * [7.1 Простое решение](#Простое_решение)
 * [7.2 Проблема](#Проблема)
 * [7.3 Альтернатива: TCP сокет](#Альтернатива_TCP_сокет)
 * [7.4 Альтернатива: Блокировка файла](#Альтернатива_Блокировка_файла)
 * [7.5 Пища для размышлений](#Пища_для_размышлений)
* [8 Отправка сообщений нажатием Ctrl-Enter](#Отправка_сообщений_нажатием_Ctrl-Enter)
* [9 Отправка сообщений по нажатию NumPad Enter](#Отправка_сообщений_по_нажатию_NumPad_Enter)
* [10 Закрытие табов по Ctrl-W](#Закрытие_табов_по_Ctrl-W)
* [11 Скрытый по умолчанию ростер](#Скрытый_по_умолчанию_ростер)
* [12 Запрет IRC-команды /exec в окнах чата](#Запрет_IRC-команды__exec_в_окнах_чата)
* [13 Отмена подсветки текста активного таба](#Отмена_подсветки_текста_активного_таба)
* [14 Настройка кнопки "Тема" в групчатах](#Настройка_кнопки_Тема_в_групчатах)
* [15 Предустановленные описания статусов](#Предустановленные_описания_статусов)
 * [15.1 Что такое описание статуса и зачем нужны предустановленные описания](#Что_такое_описание_статуса_и_зачем_нужны_предустановленные_описания)
 * [15.2 Как настроить предустановленные описания](#Как_настроить_предустановленные_описания)
* [16 Добавление собственной кнопки на тулбар](#Добавление_собственной_кнопки_на_тулбар)
* [17 Собственное меню для киков в групчате](#Собственное_меню_для_киков_в_групчате)
* [18 Автоответчик](#Автоответчик)
 * [18.1 Установка](#Установка)
 * [18.2 Настройка](#Настройка)
 * [18.3 Управление](#Управление)
* [19 Настройка положения окна уведомлений в Windows](#Настройка_положения_окна_уведомлений_в_Windows)
* [20 Собственный шрифт для ростеров](#Собственный_шрифт_для_ростеров)
* [21 Перемещение элемента меню ростера комнаты](#Перемещение_элемента_меню_ростера_комнаты)
* [22 Кнопка Send (отправить) в окне ввода сообщения](#Кнопка_Send_отправить_в_окне_ввода_сообщения)

# <a id="Вступление"></a>Вступление
Эта статья является в некотором роде парной статье [Патчи](Патчи.md); отличается она тем, что приведённые тут решения _не требуют изменения кода_ Ткаббера, что, несомненно, является для большинства применений более удачным решением. 




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





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






Статья пытается достичь двух целей: 

*  Быть "книгой рецептов" — _готовых к употреблению_ решений некоторых проблем или осуществлению нестандартного поведения Ткаббера. 

*  Объяснить _как_ работают приведённые решения, то есть снабдить пользователей Ткаббера некоторым набором знаний для самостоятельного решения схожих задач. 


Если вы только подступаетесь к нетривиальной конфигурации Ткаббера, потрудитесь изучить [эту статью](Config.tcl.md). Там же можно найти информацию о подходах к тестированию новой конфиругации. Если же и само существование/местоположение файла конфигурации Ткаббера для вас неочевидно, начните [отсюда](Config.tcl_для_начинающих.md). 





Часто задаётся вопрос: что означает выражение "впишите в файл конфигурации _вне хуков_ ..."? Оно означает, что приведённый кусок кода должен находиться "на верхнем уровне" файла конфигурации, или — можно сказать и так — вне любого блока, ограниченного {}. Не забывайте: приведённый в рецепте код скорее всего не будет иметь смысла внутри какого-либо хука, то есть не следует допускать таких записей: 






    hook::add some_hook {
    ...
      # тут -- ваш кусок кода:
      hook::add some_other_hook {
      ...
      }
    }

убедитесь, что вы поместили код на "чистое место": 

    hook::add some_hook {
    ...
    }
    
    # тут -- ваш кусок кода:
    hook::add some_other_hook {
    ...
    }

Ещё один часто всплывающий вопрос касается привязки комбинаций клавиш — под Windows привязки на буквенно-цифровые клавиши работают только на английской раскладке. Эта проблема подробно рассмотрена [здесь](Wish_и_русская_раскладка_в_Windows.md). 




# <a id="Глобальные_Горячие_Клавиши_Windows_only"></a>Глобальные Горячие Клавиши (Windows only)
Для разминки давайте прикрутим к Ткабберу стандартную возможность задавать горячие клавиши (hotkeys) так, чтобы они действовали независимо от того, активно окно Ткаббера в данный момент или нет. Дальше по тексту такие hotkeys мы будем называть "Глобальные Горячие Клавиши" - **ГГК** (от "global hotkeys"). 




Поддержку ГГК можно реализовать только под Windows, где такая концепция существует на уровне ОС. 


Однако, Tk в Windows самостоятельно не поддерживает ГГК, поэтому необходимо скачать [библиотеку Winutils](http://sourceforge.net/projects/tomasoft). После чего распакуйте эту библиотеку в поддиректорию **tkabber/winutil/** в вашей директории с исходниками Ткаббера (то, что называется $::rootdir в Ткаббере). _Для примера, на том же уровне иерархии находятся директории ifaceck и ifacetk, к которым мы ещё вернёмся в следующем патче._ 






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



    if {[file exists $rootdir/winutil/winutils.tcl]} {
      # This will load the neccessary dll on start up
      source $rootdir/winutil/winutils.tcl
    }

Теперь необходимо настроить горячие клавиши. Для этого опять откройте на редактирование файл config.tcl, найдите в нём секцию **hook::add finload\_hook** и вставьте в её конец следующие строки: 



      winutils::hotkey #auto Ctrl+Shift+I {
        switch -- [wm state .] {
          normal  { wm state . iconic }
          default { wm state . normal }
        }
      }

То есть, если у вас ранее не было такой секции либо она была пустой, полный кусок кода должен выглядеть так: 


    hook::add finload_hook {
      winutils::hotkey #auto Ctrl+Shift+I {
        switch -- [wm state .] {
          normal  { wm state . iconic }
          default { wm state . normal }
        }
      }
    }

После чего сохраните файл config.ctl и перезагрузите Ткаббер. Если всё сделано правильно, то вы сможете скрывать или открывать главное окно программы, нажимая **Ctrl-Shift-I** (как это сделано в [Миранде](http://miranda-im.org/)). В принципе ГГК может быть любой, как и действия, которые она должна выполнять.  




И наконец, самое важное - выбрать клавиши, которые вам удобны, и действия, которые вам нужны.  Воспользуйтесь моим примером (с действием, которое было нужно мне) и настройте те действия, что удобны вам. Не забудьте потом зайти к нам в конференцию `[xmpp:tkabber@conference.jabber.ru](xmpp:tkabber@conference.jabber.ru)` и рассказать, что у вас получилось :) Может быть, кому-нибудь ещё окажется полезен ваш опыт. 







Таким образом, ваши действия сводятся к следующим пунктам: 

1.  Установить winutil; 
1.  Подключить winutil через config.tcl; 
1.  Настроить горячие клавиши в config.tcl; 
1.  Перезагрузить Ткаббер и наслаждаться ещё одной его возможностью. 


Автор — [Участник:lknight](Участник_Lknight.md). **[English variant of this tutorial](http://tkabber.jabber.ru/global-hotkeys-windows)** 

_Если к моменту, когда вы читаете это описание, линки на файлы/проекты уже устарели, вы можете скачать актуальные на **октябрь 2005** файлы тут:_ 


* [WinUtils 0.8](../files/Winutil08.zip) 

# <a id="Отладочный_лог_под_Windows"></a>Отладочный лог под Windows
Wish под Windows не имеет открытых потоков **stdout** и **stderr**, которые можно куда-либо перенаправить; точнее, эти потоки направлены в [консоль процесса wish](Ткаббер_ЧаВо.md#Консоль_Ткаббера). 



С другой стороны, Ткаббер повсеместно использует для отладки процедуру **debugmsg**, которая как раз "ругается" на **stdout**. Поэтому стандартное юниксовое заклинание 



    tkabber >/tmp/TKABBER_LOG 2>&1

здесь не проходит. 

Обходной путь такой. 

В начало **config.tcl** добавляем: 

    # Отладка (1 -- включена, 0 -- выключена):
    if {1} {
      set debug_lvls {hook plugin chat}
    
      set logfile [file join [file norm ~] .tkabber TKABBER_LOG]
    
      close stdout
      open $logfile w
    
      close stderr
      open $logfile a
    
    } else {
      set debug_lvls {}
    }

Этот код перенаправляет стандартные потоки вывода в файл 

    ВАШ_ДОМАШНИЙ_КАТАЛОГ\.tkabber\TKABBER_LOG

---

Список классов отладочной информации, определённый здесь как 

    set debug_lvls {hook plugin chat}

естественно, имеет смысл отредактировать под ваши нужды. К примеру, при отладке собственного плагина **frobozz** можно использовать в его коде команды типа 


    debugmsg frobozz "foo: $foo; bar: $bar"

и внести **frobozz** в список классов отладочных сообщений: 

    lappend debug_lvls frobozz

Подробности по поводу магии переоткрывания стандартных потоков ввода/вывода в тикле описаны [здесь](http://www.tcl.tk/man/tcl8.4/TclLib/StdChannels.htm). 


Стандартные потоки перенаправлял [Kostix](Участник_Kostix.md). 

# <a id="Хоткей_для_переключения_между_режимами_ростера_все_и_только_онлайн"></a>Хоткей для переключения между режимами ростера "все" и "только онлайн"
Ниже приведён кусочек кода, вешающий на комбинацию Ctrl-o циклическое переключение между режимами ростера "все" и "только онлайн". 


Забейте в конфиг вне хуков: 

    bind Text <Control-Key-o> {}
    bind . <Control-Key-o> ifacetk::roster::switch_only_online

Измените хоткей Ctrl-o по вкусу согласно [этого документа](http://www.tcl.tk/man/tcl8.4/TkCmd/bind.htm). Если вы выберете комбинацию, отличную от Ctrl-o, то первая команда из двух вам не потребуется (однако смотрите ниже, чтобы подготовиться к возможным сюрпризам). 




Пояснения для въедливых: 

*  Первая команда отучает текстовые виджеты Tk (используемые для реализации полей ввода чата в Ткаббере) реагировать на комбинацию Ctrl-o, на которую там повешено действие "добавить пустую строку под курсор". Это шаманство требуется потому, что большую часть времени вы будете нажимать Ctrl-o в тот момент, когда фокус ввода будет в одном из полей ввода чата, которое и будет пытаться его обработать раньше главного окна (см. ниже). 





*  Вторая команда прибивает выполнение нужного нам действия к главному окну приложения (которое в Tk называется ".") — (весьма продвинутая) реализация привязок событий к виджетам, реализованная в Tk, делает так, что, если программистом не указано обратное, любой виджет, в котором нет привязки некоторого действия к произошедшему в нём событию, в конечном итоге отправит это событие главному окну. Поэтому наша команда делает так, что нужная нам комбинация клавиш будет работать независимо от того, где находится фокус ввода. За подробностями отправляйтесь к документации по команде [bindtags](http://www.tcl.tk/man/tcl8.5/TkCmd/bindtags.htm). 









# <a id="Комбинации_кнопок_а-ля_Unix_shell_в_текстовых_виджетах"></a>Комбинации кнопок а-ля Unix shell в текстовых виджетах
 **Внимание!** Данная функциональность реализована готовым [плагином](Плагины.md#unixkeys). 


Тут рассказывается о том, как прикрутить к текстовым виджетам в Ткаббере "юниксшелловые" комбинации кнопок. 


Естественно, это _не_ "комбинации кнопок юниксового шелла" в строгом смысле этого понятия, ибо строгого смысла у этого понятия нет, да и само понятие слишком расплывчато. Это — неполное воспроизведение набора команд по уполчанию библиотеки **GNU Readline**. Если у вас есть под боком система с **Readline**, документация на неё обычно доступна в формате GNU Texinfo, а вас интересует страница руководства "rluserman". Кроме того, некоторые приведённые команды "взяты" из оболочки **bash**. Проще говоря, эти настройки подойдут тем, чьи "клавиатурные" рефлексы "заточены" на bash-подобную оболочку, режим вставки Vim'а и прочие похожие вещи. 









Приведённые настройки нужно писать в конфиг Ткаббера. 

## <a id="Команды_перемещения_курсора"></a>Команды перемещения курсора

По умолчанию работают и не требуют дополнительных настроек следующие команды: 

*  Ctrl-b и Ctrl-f — переместить курсор на символ назад и вперёд, соответственно. 


*  Ctrl-a и Ctrl-e — переместить курсор в начало и конец текущей строки, соответственно. 


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



Alt-b — переместить курсор на слово влево: 

    bind Text <Alt-b> [bind Text <Control-Key-Left>]

Alt-f — переместить курсор на слово вправо: 

    bind Text <Alt-f> [bind Text <Control-Key-Right>]

**Примечание:** на некоторых системах, возможно, вместо `Alt` понадобится указывать модификатор `Meta`. Можно воспользоваться "копипастом", а можно заставить работать тикль: 



    array set map {
      b Left
      f Right
    }
    foreach key [array names map] {
      foreach mod {Alt Meta} {
        bind Text <$mod-$key> [bind Text <Control-Key-$map($key)>]
      }
    }
    unset map key mod

Эта команда создаст четыре биндинга: Alt-b, Meta-b, Alt-f; и Meta-f, привязанные к соответствующим командам. 


## <a id="Команды_удаления_текста"></a>Команды удаления текста

По умолчанию работают и не требуют дополнительных настроек следующие команды: 

*  BackSpace — удалить символ слева от курсора. 

*  Del и Ctrl-d — удалить символ справа от курсора. 

*  Ctrl-k — убить текст от позиции курсора до конца строки. 

Усовершенствуем встроенные возможности несколькими командами. 

Данной команды нет в **Readline**, но она есть в **bash**: 

Ctrl-u — убить текст от начала строки до позиции курсора: 

    bind Text <Control-u> { %W delete {insert linestart} insert}

Теперь — убиение по границам слов: 

Alt-BackSpace — удалить текст от курсора до начала слова, содержащего позицию курсора, или до начала предыдущего слова, если курсор стоит между словами: 


    bind Text <Alt-Key-BackSpace> { %W delete [tk::TextPrevPos %W insert tcl_startOfPreviousWord] insert }

Ситуация несколько сложнее с Control-w: в руководстве на **Readline** сказано, что эта команда удаляет текст до предыдущего пробела и таким образом отличается от Alt-BackSpace. 




Лично мне ([Kostix](Участник_Kostix.md)) эта разница ясна не вполне. Получается, что Ctrl-w не должна стирать  "foo", если нажата в ситуации "foo  | bar" ("|" отмечает позицию курсора). Но она _сотрёт_ это слово, будучи активирована в **bash**. Там она работает в точности, как предыдушая команда. 



Одним словом, "suggestions are welcome", но здесь предлагается не заморачиваться и повесить на Ctrl-w ту же команду, что и на Alt-BackSpace. Здесь тоже имеет смысл призвать на помощь тикль: 



    foreach {mod key} {Alt BackSpace Control w} {
      bind Text <$mod-Key-$key> { %W delete ...
    }
    unset mod key

Alt-d — удалить текст от курсора до конца слова, содержащего позицию курсора, или до конца следующего слова, если курсор стоит между словами: 


    bind Text <Alt-Key-d> { %W delete insert [::tk::TextNextPos %W insert tcl_endOfWord] }

Эту же команду может выполнять Alt-Del; повесьте на неё ту же команду, что и для Alt-d. И опять пусть за нас работает тикль: 


    foreach key {d Delete} {
      bind Text <Alt-Key-$key> { ...
    }
    unset key

## <a id="Undo_Redo"></a>Undo/Redo

Сначала — две команды, отменяющие любое последнее действие по редактированию текста: 


Ctrl-\_ работает в "иксовых" версиях Tk; для добавления такой поддержки в Windows нужно сделать: 


    event add <<Undo>> <Control-Key-underscore>

Ctrl-x,Ctrl-u добавляется (заодно показывая синтаксис "цепочечных" событий в Tk) так: 


    event add <<Undo>> <Control-Key-x><Control-Key-u>

Следующая команда — Ctrl-y — не может иметь чёткого эквивалента, поскольку вставляет последний кусок текста, удалённый из строки и помещённый в kill-ring **Readline** (а у текстовых виджетов Tk нет такой штуки). Однако фактически это действие очень похоже на "Redo", и именно на эту комбинацию и повешено "Redo" в Windows. В "иксовом" Tk Ctrl-y означает "вставить текст из CLIPBOARD". Если есть желание "перебить" его чтоб было как "в виндах" и **bash**, то: 






    bind <<Redo>> <Control-Key-y>

## <a id="Невошедшее"></a>Невошедшее

Пару команд **GNU Readline** мы обошли стороной: 

*  Ctrl-l — перерисовать экран — по-видимому, смысла в контексте виджета Text не имеет. 


*  M-y — "вращение" kill-ring'а **Readline** — как-то тоже не вписывается, т.к. стеком Undo/Redo управлять, насколько мне изестно, нельзя. 


## <a id="Замечания"></a>Замечания

Пытливые умы могли заметить, что использовались две команды — `bind` и `event`. 

*  Первая (в нашем случае) связывала воедино триплет "класс виджета, событие Tk, скрипт для выполнения", и с ней всё просто: ко всем виджетам класса `Text` в Ткаббере привязываются скрипты, которые выполняются при наступлении соответствующих событий (нажатий комбинаций клавиш). 



*  Вторая связывала скрипты с _виртуальными событиями Tk_, которые уже связаны с (в том числе) виджетами класса `Text`. 


Вывод, который следует из такого разделения, прост: те привязки, которые делались к виртуальным событиям, будут работать помимо `Text` в виджете любого класса, который эти события поддерживает. А те привязки, которые делались к классу `Text`, будут работать только в текстовых виджетах. То есть не надо ожидать, что они будут работать в однострочных полях ввода (класс `Entry`) или комбобоксах (это вообще пакет BWidget и класс надо выяснять). 






Нужно ли заморачиваться с подобной "тонкой настройкой" нетекстовых виджетов (например, однострочных полей ввода) — вопрос философский. Как говорится, "patches are welcome". 



## <a id="Дидактика"></a>Дидактика

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





Посему ниже приведены некоторые идеи относительно данного раздела. Перед чтением убедитесь, что вы приняли позу лотоса, левитируя, и ваша [сахасрара](http://www.chakra.ru/sahasrara.htm) полностью открыта. 



![(!)](../images/Hammer.png) **Сделать:** написать про основные идеи ковыряния 

Примерный план: 

*  понимание того, что Tcl/Tk — скриптовый и ультра-динамический язык, то есть можно делать радикальные модернизации кода готового приложения; 

*  выяснение того, что chat input window — виджет Text; 
*  чтение мануалов (man text event bind); 
*  интроспекция и забавы с tkcon и простым виджетом text: 
 *  bind Text; поиск по выводу; 
 *  bind Text EVENT\_SPEC и анализ его вывода; 
 *  info args, info body; 
 *  info commands и ограничение его поиска. 
 *  команды виджета Text; 
 *  сложные текстовые индексы виджета Text; 
 *  быстрое тестирование в tkcon. 

... 

"More юникс вея" в Ткаббер добавлял [Kostix](Участник_Kostix.md). 

# <a id="Копирование_текста_по_Ctrl-C_из_окна_чата_в_иксах"></a>Копирование текста по Ctrl-C из окна чата в "иксах"
Ниже приведён кусок кода, который позволяет в Ткаббере "под иксами" копировать текст из окна чата (из того, в котором ведётся _протокол_ чата), используя стандартные клавиатурные комбинации копирования текста. 



Проблема с "недопиленным" Ткаббером заключается в том, что окно чата никогда не получает клавиатурный фокус, что необходимо для работы "хоткеев". В Windows комбинация Ctrl-C работает для данного окна потому, что в Windows не поддерживается механизм ["PRIMARY selection"](http://freedesktop.org/wiki/Standards_2fClipboardsWiki) — копирование текста из виджета, не получающего клавиатурный фокус было бы в противном случае невозможно. 







"Иксовое ограничение" преодолевается следующим образом: на окно _ввода текста_ чата вешается собственный обработчик, который, будучи вызван по любой стандартной (и нестандартной) комбинации клавиш, соответствующей действию "копировать текст", проверяет: 




*  если в окне ввода текста есть выделенный текст, то выполняется стандартное для окна действие по копированию этого текста; 

*  если в окне ввода нет выделенного текста, то действие "копировать текст" эмулируется в соответствующем окне протокола чата — если там есть выделенный текст, он копируется в буфер обмена. 



Таким образом, пользователь всегда жмёт хоткей "копировать текст" в окне ввода текста чата, но текст копируется из того окна (ввода текста или протокола), в котором в данный момент есть выделенный текст. 



Этот код следует поместить в **config.tcl** вне любых хуков. 

    # Customize chat input window bindings:
    namespace eval my {}
    proc my::tweak_chat_input_window {chatid type} {
      set cw [chat::chat_win $chatid]
      set iw [chat::input_win $chatid]
    
      bind $iw <<Copy>> [list \
        if {[string equal [selection own] %W]} [bind $iw <<Copy>>] \
        else [list event generate $cw <<Copy>>]
      ]
    }
    hook::add open_chat_post_hook my::tweak_chat_input_window

**Принцип действия** (можно не читать): 

Для начала мы создаём собственное пространство имён "my". Это необязательный шаг, но он убирает нашу процедуру из глобального пространства имён. Не мешалась чтоб. 



Поскольку наша цель — изменить настройку окна ввода текста для каждого создаваемого сеанса чата, нам удобнее всего написать обработчик события `open_chat_post_hook`, которое генерируется после  того, как Ткаббер создал окно "верхнего уровня" для нового сеанса чата. (Про наиболее важные [хуки](Загрузка_настроек.md) читайте в документации, идущей вместе с Ткаббером — **tkabber.html**.) 






Обработчик хука `open_chat_post_hook` вызывается с двумя параметрами: 

*  **chatid** — идентификатор сеанса чата; 
*  **type** — тип сеанса чата. 

**chatid** — это "ключ", который позволяет получить доступ к различным компонентам, поддерживающим данный сеанс чата. 


Нас интересует доступ к двум окнам: ввода текста и протокола чата. Их имена мы получаем при помощи процедур `chat_win` и `input_win` модуля "chat" (см. **chats.tcl**). 



Теперь окна у нас есть, и можно заняться навешиванием обработчика на _виртуальное событие_ \<\<Copy>>. За подробностями обращайтесь к описаниям команд [bind](http://www.tcl.tk/man/tcl8.4/TkCmd/bind.htm) и [event](http://www.tcl.tk/man/tcl8.4/TkCmd/event.htm). 




Обработчик будет состоять из одной команды — `if`, но так как нам нужно обеспечить подстановку переменных при формировании этой команды, мы не можем использовать {} и используем команду [list](http://www.tcl.tk/man/tcl8.4/TkCmd/list.htm). (На самом деле в этом коде можно вместо [list ...] использовать "...".) 





Код обработчика события \<\<Copy>> первым делом узнаёт имя окна, владеющего в данный момент выделением текста, при помощи команды [selection](http://www.tcl.tk/man/tcl8.4/TkCmd/selection.htm), и сравнивает это имя с именем окна, для которого выполняется обработчик (тикль подставляет его вместо специального токена **%W**; на самом деле тут без проблем можно использовать **$iw** вместо **%W**). 






Если имена окон совпали, то выделением владеет окно ввода чата, и нам нужно выполнить стандартное для него действие, закреплённое за событием \<\<Copy>>. Поскольку своей командой `bind $iw ...` мы как раз это действие и переопределяем, нам нужно узнать код текущего обработчика. Это делается при помощи двухаргументной формы команды **bind**; результат выполнения этой команды и формирует первую ("истинную") ветвь команды **if**. 






Если имена не совпали, то нам стоит не мудрствуя лукаво сделать вид, будто пользователь исхитрился выполнить действие "копировать текст" в окне протокола чата. На помощь приходит умение команды **event** генерировать произвольные события в произвольном окне. Соответствующий код, опять сформированный при помощи команды **list**, чтобы разрешить подстановку переменной **cw**, формирует "ложную" ветвь нашего обработчика. 






Информацию о правильном формировании команд тикля (чем отличается {} от "" и [list ...], а также зачем нужны "\\" на концах некоторых строк) читайте в ["Эндекологии"](http://wiki.tcl.tk/14940). 



Эзотерический биндинг прикручивал [Kostix](Участник_Kostix.md). 

# <a id="Предотвращение_запуска_нескольких_процессов_Ткаббера"></a>Предотвращение запуска нескольких процессов Ткаббера
Задача: сделать так, чтобы нельзя было запустить вторую копию Ткаббера. 

## <a id="Простое_решение"></a>Простое решение

Впишите в конфиг вне любых хуков: 

    if [catch {open $::configdir/lock {WRONLY CREAT EXCL}} fd] exit
    puts $fd [pid]; close $fd
    hook::add quit_hook { file delete $::configdir/lock }

Работает это следующим образом: 

*  При старте Ткаббер проверяет, создан ли файл **[$::configdir]($__configdir.md)/lock**, и если создан, завершает выполнение. 


*  Если такого файла нет, Ткаббер: 
 *  Создаёт этот файл и записывает туда идентификатор своего процесса (хотя эта информация в дальнейшем не используется); 

 *  Вешает обработчик, удаляющий данный файл, на событие **quit\_hook**, генерируемое при нормальном завершении работы Ткаббера. 


Если Вам кажется, что "тема интерактива не раскрыта", замените первую строчку на такой фрагмент: 


    if [catch {open $::configdir/lock {WRONLY CREAT EXCL}} fd] {
      wm withdraw .
      tk_messageBox -title Tkabber -message {Уже работаем!}
      exit
    }

Фичу прикручивал [Kostix](Участник_Kostix.md). 

Идея атомарной проверки существования файла, совмещённой с его открытием, позаимствована [отсюда](http://wiki.tcl.tk/3496). 


## <a id="Проблема"></a>Проблема

А если завершение работы Ткаббера было ненормальным?... 

Фичу сомнениям подвергал [ycbl](Участник_Bigote.md). 

[Kostix](Участник_Kostix.md) парирует: ...то тогда можно пойти и удалить оставшийся файл руками. 


Вообще, раз уж этот вопрос задаётся второй раз (см. ниже), вот два альтернативных решения: 


## <a id="Альтернатива_TCP_сокет"></a>Альтернатива: TCP сокет

    if [catch {socket -myaddr localhost -server {} 6666}] exit

Сия команда пытается открыть серверный TCP-сокет **127.0.0.1:6666**; если он уже занят, команда завершается с ошибкой (**catch** возвращает "истину") и работа интерпретатора тикля завершается (**exit**). В случае успеха этот порт "занимается" Ткаббером и вторая копия Ткаббера не сможет запуститься по причине, рассмотренной выше. 





6666 — это TCP-порт, который пытается открыть  Ткаббер. Его следует выбрать по вкусу, помня, однако, что: 


*  Этот порт не должен штатно использоваться никакой другой программой; 
*  Он должен находиться в диапазоне от 1024 до 65535. 

Достоинство решения с сокетом — простота и кроссплатформенность, недосток: бессмысленно занятый порт при работе Ткаббера. Кроме того, следует понимать, что _выбранный порт может быть занят **любой** программой ещё до старта Ткаббера,_ например, его может назначить ядро для исходящего TCP-соединения какой-либо программы. 





## <a id="Альтернатива_Блокировка_файла"></a>Альтернатива: Блокировка файла

    if {![catch {package require Tclx}]} {
      set fd [open $::configdir/lock w]
      if {![flock -nowait $fd]} {
        wm withdraw .
        tk_messageBox -message {Уже запущен!}
        exit
      }
      puts $fd [pid]; flush $fd
    }

Плюсы: 

*  Более надёжно, чем сокет; 
*  "Почти" кроссплатформенно (см. ниже); 

Минусы: 

*  Требует наличия пакета **Tclx**; 
*  Не работает в Win9x; 
*  Постоянно открытый файл в течение работы Ткаббера. 

Можете также добавить к этому коду обработчик события **quit\_hook**, аналогичный показанному выше, для удаления лок-файла при нормальном выходе из Ткаббера. 



## <a id="Пища_для_размышлений"></a>Пища для размышлений

Кроме приведённых решений, возможны и другие варианты, например: 

*  Проверка лок-файла на валидность в Unix при помощи средств пакета **Tclx**: чтение PID процесса из лок-файла и проверка сигналом 0 команды **kill** существует ли этот процесс; 


*  "Синглетон" при помощи DDE в Windows средствами пакета **dde**. 


Можно придумать и ещё. Можете почитать [обсуждение этих методов](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2007/01/03.html#21:12:38), имевшее место в `tkabber@conference.jabber.ru`. 


А вот [мнение профессионалов по этому поводу](http://wiki.tcl.tk/593). 

# <a id="Отправка_сообщений_нажатием_Ctrl-Enter"></a>Отправка сообщений нажатием Ctrl-Enter
Впишите в конфиг вне всяких хуков: 

    proc fix_msg_send_key {chatid type} {
      set iw [::chat::input_win $chatid]
    
      bind $iw <Control-KeyPress-Return> [bind $iw <KeyPress-Return>]
      bind $iw <KeyPress-Return> [bind $iw <Shift-KeyPress-Return>]
      bind $iw <Shift-KeyPress-Return> {}
    }
    
    hook::add open_chat_post_hook fix_msg_send_key

Эта процедура запускается после открытия любого окна чата. Действует она в четыре этапа: 

1.  Получает имя окна ввода текста для соответствующего сеанса чата; 
1.  Привязывает к этому окну на комбинацию Ctrl-Enter то действие, которое привязано к клавише Enter (то есть "отослать сообщение); 

1.  Привязывает к этому окну на клавишу Enter то действие, которое привязано к комбинации Shift-Enter (то есть "вставить перевод строки"); 

1.  Уничтожает привязку к комбинации Shift-Enter. 

Привязку кнопок фиксил [kostix](Участник_Kostix.md). 

Альтернативное решение — [прямой патч на Tkabber](Патчи.md#_Отправка_сообщений_по_нажатию_Ctrl-Enter). 

# <a id="Отправка_сообщений_по_нажатию_NumPad_Enter"></a>Отправка сообщений по нажатию NumPad Enter
Добавить в конфиг вне хуков следующий код: 

    bind all <Key-KP_Enter> {
        set event Return
        if {%s & 0x01} {
    	set event Shift-$event
        }
        if {%s & 0x04} {
    	set event Control-$event
        }
        if {%s & 0x08} {
    	set event Alt-$event
        }
        if {$event == "Return"} {
    	set event Key-$event
        }
        event generate %W <$event>
    }

Этот код навешивает реакцию на нажатие клавиши "Enter на дополнительной клавиатуре" на специальный "тэг привязки" "all", обработчики для событий на котором проверяются, если подходящие не найдены на окне, в котором событие произошло (в реальности это несколько сложнее, но для нашего случая сойдёт). 




Код обработчика проверяет состояние управляющих клавиш (Shift, Control, Alt) в событии и генерирует в исходном окне аналогичное по смыслу событие, только вместо "Enter на дополнительной клавиатуре" в нём прописана обычная клавиша ввода. 




# <a id="Закрытие_табов_по_Ctrl-W"></a>Закрытие табов по Ctrl-W
Впишите в конфиг вне хуков: 

    hook::add finload_hook {
      bind . <Control-Key-w> [bind . <Control-Key-F4>]
    }

Этот тривиальный код привязывает к комбинации Ctrl-w на главном окне Ткаббера действие, привязанное к комбинации Ctrl-F4 на нём же. 


# <a id="Скрытый_по_умолчанию_ростер"></a>Скрытый по умолчанию ростер
Впишите в конфиг вне хуков: 

    hook::add finload_hook {
      event generate . <<CollapseRoster>>
    }

Этот код программно генерирует событие, которое привязано к комбинации клавиш Ctrl-r (действие "скрыть/показать ростер"). 


# <a id="Запрет_IRC-команды__exec_в_окнах_чата"></a>Запрет IRC-команды /exec в окнах чата
Некоторые параноидально настроенные граждане интересовались: не может ли "IRC-style" команда чата `/exec` (действие "выполнить внешнюю программу при помощи команды Tcl [exec](http://tcl.tk/man/tcl8.4/TclCmd/exec.htm) и подставить то, что она вывела на stdout/stderr, в качестве результата") иметь вредных последствий? 





Чтобы запретить эту команду совсем, впишите в конфиг вне хуков: 

    hook::add postload_hook {
      proc ::plugins::handle_exec_command args {}
      proc ::plugins::exec_command_comps args {}
    }

Этот приём определяет две "пустые" процедуры (то есть процедуры с пустым телом, которые ничего не делают, будучи вызванными). Если процедура, имя которой указано в качестве первого аргумента команды [proc](http://tcl.tk/man/tcl8.4/TclCmd/proc.htm), существует, таковая _удаляется_ и заменяется новой, определённой остальными аргументами команды **proc**. Другими словами, подобный приём позволяет "деактивировать" любую процедуру, не удаляя её (что привело бы к ошибкам времени выполнения). 







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





# <a id="Отмена_подсветки_текста_активного_таба"></a>Отмена подсветки текста активного таба
Одному пользователю Ткаббера не понравилось, что виджет NoteBook из пакета BWidget, используемый Ткаббером для создания "интерфейса с табами", изменяет цвет текста активного таба (того, на котором в данный момент находится курсор мыши) на "стандартный". При этом, если в окне данного таба есть непрочитанные сообщения, и цвет текста в табе, соответственно, отличается от стандартного (обычно он синий или красный), это цветовыделение "убивается" "активной подсветкой". 







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


    proc fix_tab_colors {w page} {
      $w itemconfigure $page -activeforeground \
        [$w itemcget $page -foreground]
    }
    
    hook::add finload_hook {
      .nb bindtabs <Any-Enter> [list fix_tab_colors %W]
    }

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



Работает этот код следующим образом: 

*  Запуск процедуры `fix_tab_colors` привязвается к событию Tk "Enter" (курсор мыши вошёл в пределы окна виджета) с модификатором "Any" (в момент совершения события игнорируются нажатия любых кнопок) к виджету **.nb**, который и занимается управлением табами и их окнами. В момент привязки для процедуры сразу же указывается первый параметр: **%W** раскрывается подсистемой событий Tk в имя окна, в котором произошло событие; 





*  В тот момент, когда указатель мыши входит в пределы одного из табов виджета **.nb**, этот таб становится _"активным"_ в терминах Tk, и для него вызывается определённая нами процедура, которой передаётся имя таба. Эта процедура: 



 1.  Получает текущее значение настройки **-foreground** ("цвет текста") для переданного таба; 

 1.  Устанавливает значение настройки **-activeforeground** ("цвет текста таба под курсором") для переданного таба. 


В результате настройка **-activeforeground** таба получает текущее значение его настройки **-foreground** при каждой активизации этого таба. То есть само действие "фичи" — изменения цвета текста активного таба — эффективно отменяется, что и требовалось получить. 




**Примечание:** в данном случае, так как наша процедура используется для обработки событий, происходящих ровно в одном окне, можно вместо **%W** написать просто **.nb** — потеряется (ненужная) гибкость, но зато, возможно, код станет несколько понятнее. 




Подсветку отменял [kostix](Участник_Kostix.md). 

# <a id="Настройка_кнопки_Тема_в_групчатах"></a>Настройка кнопки "Тема" в групчатах
Чтобы визуально выделить кнопку "Тема" в окнах групчата, можете вставить в файл конфигурации этот код вне любых хуков: 


    proc fix_topic_button {chatid type} {
      if {![string equal $type "groupchat"]} return
    
      set b [::chat::winid $chatid].status.mb
      $b config -relief raised -text Опции
    }
    
    hook::add open_chat_post_hook fix_topic_button

Код возвращает кнопке стандартную рельефность и меняет её название с "Тема" на "Опции". 


# <a id="Предустановленные_описания_статусов"></a>Предустановленные описания статусов

 **Внимание!** Доступен [плагин](Плагины.md#customstatus) аналогичного назначения, предоставляющий более удобный способ работы с предустановками статусов и их описаний. 


## <a id="Что_такое_описание_статуса_и_зачем_нужны_предустановленные_описания"></a>Что такое описание статуса и зачем нужны предустановленные описания

В нижней части окна Ткаббера есть текстовое поле для ввода описания статуса. Описание статуса — это подробная информация о причине вашего отсутствия (или присутствия, если хотите). Другие пользователи могут видеть это описание рядом с вашим JID и статусом, например, наведя на ваш ник указатель мыши (это поведение зависит от клиента). Если вы хотите установить описание статуса, вы вводите его в упомянутое текстовое поле, после чего устанавливаете статус посредством меню.







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





## <a id="Как_настроить_предустановленные_описания"></a>Как настроить предустановленные описания

Следующие изменения в **[файле конфигурации](Файл_конфигурации.md)** позволяют при установке статуса менять описание статуса на заранее заданное. 


1. Добавьте в **config.tcl** следующий текст.

    #Предустановленные описания статусов. Заменяйте текст в кавычках на свой.
    set default_text(available) "I am available" # описание статуса 'Доступен'
    set default_text(chat) "Free to chat"        # описание статуса 'Свободен для разговора'
    set default_text(away) "I am away"           # описание статуса 'Отошёл'
    set default_text(xa) "I am far away"         # описание статуса 'Отошёл давно'
    set default_text(dnd) "Do not disturb"       # описание статуса 'Не беспокоить'
    
    proc ::use_default_status_texts {} {
      set m .presence.button.menu
      foreach {status str} $::user_status_list {
          if {![info exists ::default_text($status)]} {
              continue
          }
          switch -- $status {
            invisible -
            unavailable {}
            default {
              $m entryconfigure \
               $str \
               -command [join [list [list set textstatus   $::default_text($status)] [list set userstatus $status]] "; "]
            }
          }
      }
    }

Некоторые (или все) строки, начинающиеся с `set default\_text`, можно закомментировать. В таком случае при установке соответствующего статуса будет установлено описание статуса, введенное в текстовое поле в нижней части окна Ткаббера, то есть, для соответствующей команды меню будет установлено поведение по умолчанию. 





1. Добавьте вызов процедуры `use\_default\_status\_texts` в процедуру `finload`. Если такой процедуры нет в файле **config.tcl**, то создайте её, вставив следующий текст.



    proc finload {} {
      use_default_status_texts
    }

Примечание 

 С приведёнными настройками изменение описания статуса будет происходить только при изменении статуса с помощью меню, вызываемого кнопкой в левом нижнем углу окна Ткаббера. Если вы хотите изменить описание статуса на вписанное в поле вручную, воспользуйтесь командой главного меню **Tkabber → Присутствие**. 




# <a id="Добавление_собственной_кнопки_на_тулбар"></a>Добавление собственной кнопки на тулбар
Периодически пользователи Ткаббера предлагают добавить на тулбар ещё одну кнопку, выполняющую ту или иную команду, обычно доступную другим способом, например, через главное меню. Поскольку вкусы и потребности у всех разные, разработчики обычно оставляют такие запросы без внимания. 




На самом деле добавить свою кнопку на тулбар очень просто, если знать какую именно команду Tcl требуется выполнять по нажатию этой кнопки, а это уже зависит от личных способностей ковыряющихся в исходниках Ткаббера. 



В качестве простейшего примера добавим на тулбар кнопку, открывающую окно **Raw XML**, обычно доступное через пункт главного меню Ткаббера **Службы→Инструменты администратора→Открыть окно XML**. 



Поместите в файл **config.tcl** вне любых хуков: 

    hook::add finload_hook {
      set b [[.mainframe gettoolbar 0].bbox add]
      $b configure \
        -highlightthickness 0 \
        -takefocus 0 -relief link \
        -bd $::tk_borderwidth \
        -padx 1 -pady 1 \
        -text XML \
        -helptext "Открыть окно XML" \
        -command ::plugins::rawxml::open_window \
    }

**Принцип действия** (читать необязательно): 

Поскольку мы собираемся добавлять кнопку на уже _существующий_ виджет, наш код должен выполняться после того, как элементы GUI созданы. Для этого код нужно реализовать в виде обработчика [хука](Загрузка_настроек.md#Хуки) **finload\_hook**. 




Первая строка в обработчике добавляет кнопку на тулбар и присваивает её имя переменной с именем "b": 


*  Команда "`.mainframe gettoolbar 0`" возвращает имя "нулевого" (и единственного) тулбара Ткаббера; 

*  К этому имени добавляется суффикс `.bbox`, в результате чего получается имя специального виджета — набора кнопок в тулбаре; оно же по совместительству является и именем команды, которую можно использовать для управления кнопками в этом наборе. 



*  Полученная команда выполняется с аргументом `add`, добавляя новую кнопку в набор и возвращая имя этой кнопки, которое, как и обычно в Tk, одновременно является именем команды для управления этим виджетом. 



Вторая строка конфигурирует добавленную кнопку: 

*  Первые несколько опций (`-relief`, `-takefocus`, `-highlightthickness`, `-padx`, `-pady`, `-bd`) конфигурируют внешний вид кнопки  делают вид кнопки таким же, как у остальных, уже находящихся на тулбаре кнопок; интересующиеся могут изучить определение процедуры `ifacetk::add_toolbar_button` в файле ifacetk/iface.tcl. 




*  Опция `-text` делает строку "XML" надписью на кнопке. Обратите внимание на то, что для этого подходят только короткие куски текста, иначе кнопка получится чрезмерно большой. В качестве альтернативы можно использовать картинку (см. ниже). 



*  Опция `-helptext` настраивает всплывающую подсказку (тултип) у кнопки. 
*  Ключевой является опция `-command`, которая привязывает команду к нажатию кнопки. В нашем случае это полное имя соответствующей процедуры тикля (определённой в файле **plugins/general/rawxml.tcl**) без параметров. 



**Что дальше?** 

Можно использовать опцию `-icon` вместо опции `-text`, если у вас есть готовая картинка 24x24x8bpp. Картинка может быть в любом формате, поддерживаемом Ткаббером, однако, ["переносимым"](Ткаббер_ЧаВо.md#Не_видны_иконки_фото_и_т.д._в_JPEG_PNG) является только формат GIF. 





Картинка должна быть предварительно загружена при помощи команды [image](http://www.tcl.tk/man/tcl8.4/TkCmd/image.htm), например: 


    set img [image create photo -file /path/to/my/icon.gif]
    ...
    $button configure -icon $img ...

Кроме того, в Ткаббере есть готовая процедура, позволяющая добавить кнопку с картинкой более просто, например: 


    set icon     [image create photo -file smile.gif]
    set command  {tk_messageBox -message Cheese!}
    set helptext {Says "Cheese!"}
    ...
    ifacetk::add_toolbar_button $icon $command $helptext

Ткаббер использует виджеты **ButtonBox** и **Button** из пакета **BWidget**, соответственно, за подробной информацией о возможностях работы с тулбаром и отдельными кнопками следует обращаться к [документации на BWidget](http://tcllib.sourceforge.net/BWman/). 




# <a id="Собственное_меню_для_киков_в_групчате"></a>Собственное меню для киков в групчате
Добавьте этот код в **config.tcl** вне любых хуков: 

    set my_kick_reasons {
      "Ya bastard"
      "Go away, bad boy"
      "French connectionUCK OFF!"
      "Чужие здесь не ходят!"
    }
    
    proc create_kick_presets_menu {m connid jid} {
      global my_kick_reasons
    
      menu $m
    
      foreach reason $my_kick_reasons {
        if {[string length $reason] > 25} {
          set label [string range $reason 0 22]...
        } else {
          set label $reason
        }
        $m add command -label $label \
          -command [list muc::change_item_param \
            {role none} down $connid $jid $reason]
      }
    
      set m
    }
    
    proc add_kick_presets {m connid jid} {
      set km $m.my_kick_menu
      create_kick_presets_menu $km $connid $jid
    
      $m add separator
      $m add cascade -label "Custom kicks" -menu $km
    }
    
    hook::add roster_create_groupchat_user_menu_hook add_kick_presets

Отредактируйте переменную **my\_kick\_reasons** по вкусу. 

# <a id="Автоответчик"></a>Автоответчик

 Внимание! Данный код был преобразован в [плагин](Плагины.md#autoanswer) и несколько улучшен (в частности, появилась иконка для тулбара). Рекомендуется пользоваться им; данная заметка сохранена для истории. 


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









## <a id="Установка"></a>Установка

Чтобы установить автоответчик, нужно 

1. в **config.tcl** добавить вне хуков следующий код: 

    # === Answering machine ===
    
    # == Auto answer settings ==
    # Enable auto answer right from the start.
    # (When running, use the auto_answer [yes|no] procedure in
    #  console to turn auto answer on and off.)
    set auto_answ_enabled no
    
    # JIDs for which answering is disabled.
    # Has priority over auto_answ_regex.
    # A value of "^$" means no restrictions.
    set auto_answ_disable_regex "^$"
    # JIDs for which answering is enabled.
    # A value of "" (or ".", or ".*" etc) means for all JIDs
    set auto_answ_regex ""
    set auto_answ_message "Не могу сейчас говорить (отошел от компьютера). Вернусь — отвечу."
    # Changing status to one from this list
    # will automatically turn the auto answer mode on,
    # while entering a status not listed here will turn it off.
    # Comment this variable out to make the answer mode 
    # independent of the availability status.
    set auto_answ_status {
       away
       xa
       dnd
    }
    # == end Auto answer settings ==
    
    proc update_auto_answ_button {} {
       # if button not found, don't do anythyng
       if { [[.mainframe gettoolbar 0].bbox index auto_answer] == -1 } {
          return
       }
       if {$::auto_answ_enabled} {
          set txt "Автоответчик вкл."
       } else {
          set txt "Автоответчик выкл."
       }
       [.mainframe gettoolbar 0].bbox itemconfigure auto_answer \
          -command ::auto_answ_toggle  -text $txt -relief link
    }
    
    proc auto_answ_toggle {} {
       # Invert the "enabled" flag
       set ::auto_answ_enabled [expr !$::auto_answ_enabled]
       # reset reply counters
       if { [array exists ::answered] } {
          array unset ::answered
       }
       update_auto_answ_button
    }
    
    # Sends the message ($::auto_answ_message)
    proc answ_process_message {connid from id type is_subject subject body args} {
      variable answered
      # Do not reply if disabled
      if { !$::auto_answ_enabled } {
         return
      }
      # Do not reply to normal messages
      if {$type != "chat" } {
         return
      }
      set chatid [::chat::chatid $connid $from]
      # Do not reply in MUCs
      if { [::chat::is_groupchat $chatid] } {
         return
      }
      set jid [jlib::connection_jid $connid]
      # Just to make sure the program never replies to itself
      if { $jid == $from } {
         return
      }
      # Do not reply if regexp rules are not met
      # Do not reply to empty messages
      if { [regexp -nocase $::auto_answ_disable_regex $from] \
            || ![regexp -nocase $::auto_answ_regex $from] \
            || [string equal $body ""] } {
         return
      }
      # Increment the number of times we replied to this JID
      if { ![info exists answered($from)] } {
         set answered($from) 1
      } else {
         incr answered($from)
      }
      # Stop replying after 3 replies
      if { $answered($from) > 3 } {
         return
      }
      if {[catch { set user [jlib::connection_user $connid] }]} {
         set user ""
      }
      # Send the message
      hook::run chat_send_message_hook \
         $chatid $user $::auto_answ_message "chat"
    }
    
    # Turns auto answer on or off when status changes
    proc answ_on_status_change {name1 name2 op} {
       if { ![info exists ::auto_answ_status] } {
          return
       }
       # Enable auto answer if current status is in the $::answ_status list
       if { [lsearch -exact $::auto_answ_status $::userstatus] != -1 } {
          # Don't do anything if auto answer is already enabled
          if { $::auto_answ_enabled } {
             return
          }
          auto_answ_toggle
          return
       }
       # Disable auto answer if current status is not in the $::answ_status list
       if { $::auto_answ_enabled } {
          auto_answ_toggle
       }
    }
    
    trace add variable userstatus write answ_on_status_change
    
    hook::add process_message_hook \
      answ_process_message 150
    # === end Answering machine ===

2. В процедуру `finload` добавить следующие строки. 

    #Auto answer button
    [.mainframe gettoolbar 0].bbox add -name auto_answer
    update_auto_answ_button

Если такой процедуры в файле **config.tcl** нет, создайте её. В итоге она будет выглядеть следующим образом. 

    proc finload {} {
      #Auto answer button
      [.mainframe gettoolbar 0].bbox add -name auto_answer
      update_auto_answ_button
    }

## <a id="Настройка"></a>Настройка

Следующие переменные отвечают за параметры автоответчика. 

`auto\_answ\_enabled` – если установлена в _yes_, Ткаббер будет запущен со включенным автоответчиком, если в _no_, то с выключенным. По умолчанию установлена в _no_. 

`auto\_answ\_disable\_regex` – регулярное выражение, определяющее JIDы, для которых отсылка сообщений автоответчиком запрещена. 

`auto\_answ\_regex` – регулярное выражение, определяющее JIDы, для которых отсылка сообщений автоответчиком разрешена. 


Переменная `auto\_answ\_disable\_regex` имеет приоритет над `auto\_answ\_regex`, то есть, если JID пользователя, от которого пришло сообщение, соответствует выражению `auto\_answ\_disable\_regex`, ответное сообщение не будет отправлено несмотря на то, соответствует ли JID выражению `auto\_answ\_regex`. Если JID не соответствует ни одному из выражений, сообщение не будет отправлено. Настройки по умолчанию максимально разрешающие, с ними автоматическая отправка ответа будет происходить на любой JID, от которого пришло сообщение. 





Примечание 

 Групчаты являются исключением из этих правил: автоответчик никогда не реагирует на сообщения из них. 


`auto\_answ\_message` – сообщение, которое получит пользователь, пославший вам сообщение. 


`auto\_answ\_status` – список статусов, при установке которых автоответчик будет автоматически включаться. При входе в статус, не перечисленный в списке, автоответчик будет отключаться. Закомментируйте эту переменную, чтобы изменение статуса никак не влияло на автоответчик, возможность включать/выключать его вручную остаётся в любом случае. Элементы `auto\_answ\_status` принимают значения из списка: available, chat, away, dnd, xa. По умолчанию включение автоответчика настроено для статусов "отошёл", "отошёл давно" и "не беспокоить". 







## <a id="Управление"></a>Управление

Если вы всё сделали правильно, на панели инструментов появится кнопка **Автоответчик выкл.** При ее нажатии автоответчик включается, и надпись на кнопке меняется на **Автоответчик вкл.**. Чтобы убрать эту кнопку с панели инструментов, закомментируйте строки, добавленные в процедуру `finload`. В этом случае включать/выключать автоответчик можно с помощью команды `auto\_answ\_toggle` в консоли. 






# <a id="Настройка_положения_окна_уведомлений_в_Windows"></a>Настройка положения окна уведомлений в Windows
**Вопрос:** Требуется переместить всплывающее окно ("балун", "тултип") с уведомлениями, включающееся опцией **Настройки → MainInterface → Systray → ::ifacetk::systray::options(display\_status)**, из верхнего левого угла в какое-то другое место экрана. 




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



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


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



*  Откройте консоль Ткаббера; 
*  Подведите указатель мыши к тому месту на экране, в котором по вашей задумке должен находиться верхний левый угол окна уведомлений; 

*  Отпустите мышь, в консоли Ткаббера напишите: 

    winfo pointerx .

и затем: 

    winfo pointery .

 вы получите ту самую пару чисел — координаты окна. 

Добавьте в конфиг вне любых хуков: 

    proc systray_tooltip_location args {
      return {ваша_координата_X ваша_координата_Y}
    }
    hook::add finload_hook {
      set ::ifacetk::systray::.tray(location) ::systray_tooltip_location
    }

Можете несколько усовершенствовать код, введя глобальную переменную: 

    set notification_coords {0 0}

    proc systray_tooltip_location args {
      return $::notification_coords
    }
    hook::add finload_hook {
      set ::ifacetk::systray::.tray(location) ::systray_tooltip_location
    }

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

    set notification_coords {762 670}

# <a id="Собственный_шрифт_для_ростеров"></a>Собственный шрифт для ростеров
Шрифт ростеров (списка контактов и ростеров групчатов) настраивается синхронно со шрифтом чата [при помощи глобальной переменной **font**](Шрифты.md). Если требуется отдельно настраивать шрифты ростеров, придётся править код процедуры `::ifacetk::roster::addline`. Для этого воспользуемся испытанным приёмом — динамическим "патченьем" кода Ткаббера. 





Напишите в [config.tcl](Config.tcl.md) вне любых хуков: 

    # From: [http://wiki.tcl.tk/16978](http://wiki.tcl.tk/16978)
    proc params proc {
      set params [list]
      foreach param [info args $proc] {
        if {[info default $proc $param default]} {
          lappend params [list $param $default]
        } else {
          lappend params $param
        }
      }
      return $params
    }
     
    hook::add postload_hook {
      set proc ::ifacetk::roster::addline
      set body [info body $proc]
      set body [regsub -- {global\s+\yfont\y} $body {global rosterfont}]
      set body [regsub -all -- {\$font\y} $body {$rosterfont}]
      proc $proc [params $proc] $body
      unset proc body
    }

Теперь можно добавить к настройкам шрифтов в том же конфиге нечто вроде 

    set rosterfont -*-arial-medium-*-*-*-*-*-*-*-*-*-iso10646-*

# <a id="Перемещение_элемента_меню_ростера_комнаты"></a>Перемещение элемента меню ростера комнаты
Некоторые неторопливые пользователи жалуются на то, что при перемещении указателя мыши по контекстном меню ростера комнаты они часто "не дотягивают" до искомого пункта "Показать информацию" и попадают в подменю пункта "Игнорировать", расположенного выше. Приведённые строчки для [файла конфигурации](Config.tcl_для_начинающих.md) перемещают элемент "Игнорировать" в самый низ обсуждаемого меню: 






    hook::add roster_create_groupchat_user_menu_hook imove 1000
    
    proc imove {m args} {
      set ix [$m index [::msgcat::mc "Ignore"]]
      set cmd [list $m insert end [$m type $ix]]
      set conf [$m entryconfigure $ix]
      foreach item $conf {
        lappend cmd [lindex $item 0] [lindex $item end]
      }
      $m delete $ix
      $m delete $ix ;# separator
      $m insert end separator
      eval $cmd
    }

**Принцип действия** (можно не читать): 

Вначале мы добавляем процедуру, которую собираемся написать, в [хук](Загрузка_настроек.md#Хуки), отвечающий за наполнение меню ростера комнаты содержимым. Мы хотим, чтобы наша процедура запустилась последней в ходе отработки хука, поэтому указываем для неё высокий приоритет (1000). 




Далее определяем саму процедуру. Первым аргументом она получает имя наполняемого меню. Остальные нас не интересуют и мы используем для них стандартную идиому [`args`](http://www.tcl.tk/man/tcl8.5/TclCmd/proc.htm) (любое число оставшихся аргументов). 




Первым делом мы получаем индекс (номер по порядку, начиная с 0) элемента меню, который собираемся переместить. Нас интересует опция "Игнорировать", но поскольку мы хотим написать код, который работает независимо от языка интерфейса, мы ссылаемся на перевод "референсного" названия ("Ignore") при помощи команды [`msgcat`](http://www.tcl.tk/man/tcl8.5/TclCmd/msgcat.htm). 





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





Наша команда (которая будет конструироваться в переменной `cmd`) начинается "стандартным заклинанием" с участием подкоманды `insert` виджета [`menu`](http://www.tcl.tk/man/tcl8.5/TkCmd/menu.htm) (a другая его подкоманда — `type` — возвращает тип переданного ей элемента). 




Затем мы получаем полное описание конфигурации данного элемента меню при помощи подкоманды `entryconfigure` виджета `menu`. Эта информация возвращается в виде списка — по одному элементу на каждую настройку, определённую для пункта меню; каждый такой элемент, в свою очередь, является [списком из пяти элементов](http://www.tcl.tk/man/tcl8.5/TkLib/ConfigWidg.htm): название настройки, имя настройки в [базе данных опций Tk](База_данных_опций_Tk.md), класс настройки в БД опций, значение настройки по умолчанию и, наконец, текущее значение этой настройки. Нас интересуют только первый и последний элементы из перечисленных, так как именно их комбинация определяет текущее состояние виджета. Посему мы итерируем по всем элементам списка конфигурации и добавляем к конструируемой команде имена параметров конфигурации и их текущие значения. 












После того, как команда вставки готова, мы удаляем наш элемент меню, сепаратор под ним (это для красоты), после чего вставляем сепаратор в низ меню (опять же для красоты) и, наконец, вставляем в самый низ наш "новый старый" элемент путём выполнения ([eval](http://www.tcl.tk/man/tcl8.5/TclCmd/eval.htm)) сконструированной команды. 





# <a id="Кнопка_Send_отправить_в_окне_ввода_сообщения"></a>Кнопка Send (отправить) в окне ввода сообщения
Кнопка **Send** в правой части окна ввода сообщения в окне разговора позволяет отправлять сообщение с помощью мыши. 


 Иногда это позволяет сэкономить время, например, когда нужно выделить текст в окне чата, вставить его средней кнопкой в окно ввода и тут же отправить, — все эти действия можно выполнить без применения клавиатуры. 



Добавить кнопку **Send** в окно ввода можно, поместив в **[файл конфигурации](Config.tcl_для_начинающих.md)** следующий код, регистрирующий обработчик хука `open_chat_post_hook`. 



    proc open_chat_post_hook_handler {chatid type} {
      # Send button
      set iw [::chat::input_win $chatid]
      set parent [winfo parent $iw]
      set isw $parent.isw
      set pi [pack info $isw]
      set ix [lsearch -exact $pi -in]; incr ix
      set f [lindex $pi $ix]
      set sb [button $parent.send -text Send -command [list event generate $parent <KeyPress-Return>]]
      pack $isw -in $f -side left
      pack $sb -in $f -side right -fill y
      # End Send button
    }
    
    hook::add open_chat_post_hook open_chat_post_hook_handler

Автор кода [Kostix](Участник_Kostix.md). 

**NB:** Если вы воспользовались инструкцией, изложенной в разделе **[Отправка сообщений нажатием Ctrl-Enter](Нетривиальные_настройки.md#Отправка_сообщений_нажатием_Ctrl-Enter)**, и добавили в **config.tcl** соответствующий код, то нужно заменить в приведённой выше процедуре `open_chat_post_hook_handler` строку `<KeyPress-Return>` на `<Control-KeyPress-Return>`. 




Changes to wiki/ru/Новый_вид_Tk_в_8.5.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91


[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Новый_вид_Tk_в_8.5)


# Новый вид Tk в 8.5

Материал из Tkabber Wiki

[16:22]\<kostix> Hi! A question regarding Tk in 8.5: since the next Debian will
contain 8.5 as its "stable" Tcl/Tk, we've taken a glance at Tk 8.5 and noticed
that it received that ugly "Windows-ish" checkboxes and radiobuttons in X. Is
there a way (hack, etc) to revert to the "old" look for X? Or this can be only
accomplished via Tile?

[16:25]\<ijchain> \* willdye recalls reading that it's indeed possible, without
Tile, but can't recall the specifics...

[16:26]\<jenglish> kostix -- the next Debian (etch), or the next next Debian?

[16:26]\<kostix> jenglish: Etch

[16:26]\<jenglish> I thought etch was in feature-freeze right now ...

[16:27]\<jenglish> Wow.  Where did you hear about this?  (The debian-tcl list
has been silent lately...)

[16:28]\<kostix> jenglish: wait a bit, please. I'm now consulting with Tkabber
PL, who maintains a bunch of Debian packages.

[16:30]\<kostix> jenglish: sorry, Joe -- my fault; there will even be no
8.4.14 :(

[16:32]\<kostix> jenglish: seems like just since 8.5 will be stable pretty
soon, we'll support it (and it will be, of course, awailable for Debian)

[16:32]\<kostix> So what about "old" look for plain 8.5 Tk? ;)

[16:32]\<suchenwi> Maybe a Motif theme for Tile? :p

[16:34]\<kostix> suchenwi: no Tile, Richard. Tkabber's look is "broken" right
now, and there's no plans to port it to Tile right now, since there's no stable
Tile

[16:35]\<dkf> The problem with the old Motif look is that it can't show
tristate values

[16:35]\<dkf> i.e. "some selected, some not"

[16:36]\<suchenwi> For Troolean logic?

[16:36]\<kostix> suchenwi: +1 :)

[16:37]\<suchenwi> like in SQL, the OR MAYBE NOT operator

[16:37]\<kostix> WHO KNOWS

[16:38]\<dkf> there's also the YES DEAR constant :)

[16:38]\<kostix> :)

[16:38]\<suchenwi> with the implementation "will probably not do"?

[16:38]\<kostix> dkf: so, the answer to my particular problem is "no"?

[16:39]\<dkf> 8.5 has capabilities that the old l&f could not support

[16:40]\<dkf> so there's not much chance of going back; if nothing else, Mentor
Graphics want the new functionality

[16:40]\<kostix> Hm. After all, 8.5 has may vast improvements, so at least the
pain of thansition is justified ;)

[16:40]\<kostix> \* many

[16:41]\* dkf has just added \_NET\_WM\_PING support to 8.5

[16:42]\* dkf ... on the grounds that there's no reason to not do it, and it's
transparent to scripts anyway

[16:48]\<arjen> Mentor Graphics?

[16:48]\<kostix> arjen: that's probably an euphemism ;)

[16:51]\<arjen> Ah, those Anglosaxons!

[16:55]\<spjuth> Mentor Graphics makes Modelsim, a simulator with a Tk GUI.
Brian Griffin works there.

[16:56]\<arjen> Now, that does ring a bell

[16:57]\<dkf> Based in/near Portland, Oregon

[16:57]\<arjen> Here is the WIki page: [http://wiki.tcl.tk/8648](http://wiki.tcl.tk/8648)



>





|
<
<
<
<

|
<

|

|

|

|
<

|
<

|
<

|
<

|

|

|
<
<

|
<

|

|

|

|

|

|

|

|

|

|

|
<

|
<

|

|

|
<

|

|

|

|
<

|

|

|
>
>
1
2
3
4
5
6
7
8




9
10

11
12
13
14
15
16
17
18

19
20

21
22

23
24

25
26
27
28
29
30


31
32

33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

55
56

57
58
59
60
61
62

63
64
65
66
67
68
69
70

71
72
73
74
75
76
77
78
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Новый_вид_Tk_в_8.5)


# Новый вид Tk в 8.5

Материал из Tkabber Wiki

[16:22]\<kostix> Hi! A question regarding Tk in 8.5: since the next Debian will contain 8.5 as its "stable" Tcl/Tk, we've taken a glance at Tk 8.5 and noticed that it received that ugly "Windows-ish" checkboxes and radiobuttons in X. Is there a way (hack, etc) to revert to the "old" look for X? Or this can be only accomplished via Tile? 





[16:25]\<ijchain> \* willdye recalls reading that it's indeed possible, without Tile, but can't recall the specifics... 


[16:26]\<jenglish> kostix -- the next Debian (etch), or the next next Debian? 

[16:26]\<kostix> jenglish: Etch 

[16:26]\<jenglish> I thought etch was in feature-freeze right now ... 

[16:27]\<jenglish> Wow.  Where did you hear about this?  (The debian-tcl list has been silent lately...) 


[16:28]\<kostix> jenglish: wait a bit, please. I'm now consulting with Tkabber PL, who maintains a bunch of Debian packages. 


[16:30]\<kostix> jenglish: sorry, Joe -- my fault; there will even be no 8.4.14 :( 


[16:32]\<kostix> jenglish: seems like just since 8.5 will be stable pretty soon, we'll support it (and it will be, of course, awailable for Debian) 


[16:32]\<kostix> So what about "old" look for plain 8.5 Tk? ;) 

[16:32]\<suchenwi> Maybe a Motif theme for Tile? :p 

[16:34]\<kostix> suchenwi: no Tile, Richard. Tkabber's look is "broken" right now, and there's no plans to port it to Tile right now, since there's no stable Tile 



[16:35]\<dkf> The problem with the old Motif look is that it can't show tristate values 


[16:35]\<dkf> i.e. "some selected, some not" 

[16:36]\<suchenwi> For Troolean logic? 

[16:36]\<kostix> suchenwi: +1 :) 

[16:37]\<suchenwi> like in SQL, the OR MAYBE NOT operator 

[16:37]\<kostix> WHO KNOWS 

[16:38]\<dkf> there's also the YES DEAR constant :) 

[16:38]\<kostix> :) 

[16:38]\<suchenwi> with the implementation "will probably not do"? 

[16:38]\<kostix> dkf: so, the answer to my particular problem is "no"? 

[16:39]\<dkf> 8.5 has capabilities that the old l&f could not support 

[16:40]\<dkf> so there's not much chance of going back; if nothing else, Mentor Graphics want the new functionality 


[16:40]\<kostix> Hm. After all, 8.5 has may vast improvements, so at least the pain of thansition is justified ;) 


[16:40]\<kostix> \* many 

[16:41]\* dkf has just added \_NET\_WM\_PING support to 8.5 

[16:42]\* dkf ... on the grounds that there's no reason to not do it, and it's transparent to scripts anyway 


[16:48]\<arjen> Mentor Graphics? 

[16:48]\<kostix> arjen: that's probably an euphemism ;) 

[16:51]\<arjen> Ah, those Anglosaxons! 

[16:55]\<spjuth> Mentor Graphics makes Modelsim, a simulator with a Tk GUI. Brian Griffin works there. 


[16:56]\<arjen> Now, that does ring a bell 

[16:57]\<dkf> Based in/near Portland, Oregon 

[16:57]\<arjen> Here is the WIki page: [http://wiki.tcl.tk/8648](http://wiki.tcl.tk/8648) 


Changes to wiki/ru/Особенности_реализации.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260

261
262
263
264
265
266
267
268
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Особенности_реализации/index.html)


# Особенности реализации

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Преамбула](#Преамбула)
* [2 Tcl/Tk](#Tcl_Tk)
* [3 Почему Tcl?](#Почему_Tcl)
* [4 Почему Tk?](#Почему_Tk)
* [5 Почему Tk, а не GTK/Qt/что-то ещё?](#Почему_Tk_а_не_GTK_Qt_что-то_ещё)
   * [5.1 А почему нет?](#А_почему_нет)
   * [5.2 Техническая сторона дела](#Техническая_сторона_дела)
* [6 Почему не отделить интерфейс от реализации?](#Почему_не_отделить_интерфейс_от_реализации)
* [7 Почему нет "внешнего API"?](#Почему_нет_внешнего_API)
* [8 Ткаббер выглядит отвратительно!](#Ткаббер_выглядит_отвратительно)
   * [8.1 Tile в Ткаббере](#Tile_в_Ткаббере)

# <a id="Преамбула"></a>Преамбула
В этой статье даются развёрнутые ответы на пачку различных вопросов,
периодически задаваемых пользователями Ткаббера относительно языка его
реализации, а также смежных вопросов — относительно его внешнего вида.

# <a id="Tcl_Tk"></a>Tcl/Tk
Ткаббер написан на языке [Tcl](http://www.tcl.tk) и использует библиотеку
[Tk](http://wiki.tcl.tk/15242) для создания графического интерфейса
пользователя (GUI).

Несмотря на наличие некоторых (практически беспрецедентно) мощных виджетов
(таких как [`text`](http://tcl.tk/man/tcl8.4/TkCmd/text.htm) (используются в
окнах чата) и [`canvas`](http://tcl.tk/man/tcl8.4/TkCmd/canvas.htm) (на нём
сделаны ростеры)), в Tk нет таких "примитивов" как: "progressbar", "notebook"
(виндовым программистам более известный как "page control" или "tab control"),
"сплиттеров", готовой поддержки стандартных диалоговоых окон. Однако для Tk
написана масса сторонних реализаций, компенсирующих этот недостаток; Ткаббер
широко использует один из подобных "наборов виджетов" —
[BWidget](http://wiki.tcl.tk/BWidget).

![(!)](../images/Hammer.png) **Сделать:** добавить про Tcllib

# <a id="Почему_Tcl"></a>Почему Tcl?
Вообще говоря, здесь проще всего ответить вопросом на вопрос: "а почему нет?" —
Tcl является продвинутым "скриптовым" языком; тот факт, что вокруг него
значительно меньше того шума, который именуется
[термином "hype"](http://www.google.com/search?as_q=define:hype),
и он никогда не был "в
моде" у населения [/.](http://slashdot.org), не говорит о том, что на нём
нельзя создать серьёзный проект. Более того, некоторые бывают удивлены, узнав,
что Ткаббер даже не является единственным
[Jabber-клиентом](http://coccinella.im/) и уж тем более не единственным
[Instant Messenger'ом](http://www.amsn-project.net), написанном на Tcl/Tk.

![(!)](../images/Hammer.png) **Сделать:** развить

# <a id="Почему_Tk"></a>Почему Tk?
Tk является "натуральным" выбором для создания GUI у приложения, написанного на
Tcl, из-за того, что связка Tcl/Tk является практически уникальной (если не
считать [совсем уж "эзотерических" решений](http://www.rebol.com)) в том
смысле, что GUI-тулкит очень удобно состыкован с языком — как в плане философии
использования, так и в плане используемых при работе с ним языковых
конструкций.

# <a id="Почему_Tk_а_не_GTK_Qt_что-то_ещё"></a>Почему Tk, а не GTK/Qt/что-то ещё?
Ответы можно условно разбить на две категории:

*  Стандартное заклинание: "а почему нет?";
*  Технические обоснования.

## <a id="А_почему_нет"></a>А почему нет?

99% претензий к Tk касается вовсе не его _технических_ характеристик, а того,
как он _выглядит_ (и вообще ощущается) на конкретной системе конкретного
пользователя — не секрет, что на 97% "десктопов" в современном мире установлена
одна из ОС, сошедших со стапелей Microsoft, а на жалких остатках, занятых, в
основном, решениями на базе [Linux](http://www.kernel.org) и \*BSD, царят
[GNOME](http://www.gnome.org) и [KDE](http://www.kde.org), то есть имеет место
"обоснованное засилье" приложений, использующих в виде GUI-тулкитов
[GTK](http://www.gtk.org) и [Qt](http://trolltech.com/products/qt),
соответственно.

Сейчас уже поздно стенать о том, что авторы GTK и Qt не дочитали спецификации
на X Window System, а также о том, что они изобрели (каждый — свою) системы
конфигурации тулкитов, несовместимые с когда-то бывшей хоть каким-то стандартом
систему конфигурации [Xt и Motif](http://en.wikipedia.org/wiki/Xt)
([**XRDB**](XRDB.md)). В результате мы имеем то, что имеем: несовместимые между
собой тулкиты, некоторые из которых борются за "мировое господство".

Отсюда и наш слабый аргумент: а почему, собственно, GTK или Qt? Потому, что он
доминирует на вашей системе? Но в любом случае всем угодить не получится:
GTK-приложение будет чужим в окружении Qt и наоборот. А приложение GTK или Qt
никогда не будет выглядеть совершенно нативно в Windows, пусть даже оно будет
ближе к "натуральному виду", чем Tk.

Наконец, Ткаббер был рождён как "иксовое" приложение, а довольно весомая часть
пользователей X Window вообще не использует "desktop environments", такие как
GNOME и KDE — они используют "каноническую" концепцию: window manager + набор
приложений, окнами которых он позволяет управлять. Приложения при этом могут
быть какими угодно, наглядно демонстрируя "разброд и шатание" иксовых тулкитов
во всей его неприглядности. Tk в этом случае выглядит не хуже и не лучше
других.

Следует также понимать, что у других тулкитов
[хватает своих "тараканов в голове"](http://vitus-wagner.livejournal.com/169017.html),
и переезд на другой тулкит запросто может создать проблем больше, чем решить.

## <a id="Техническая_сторона_дела"></a>Техническая сторона дела

У Tk есть несколько интересных особенностей, которые выделяют его в ряду
GUI-тулкитов:

*  Очень небольшой размер;
*  Масса расширений, _написанных на "чистом" Tcl;_
*  Tk является интегральной частью _шелла_
   [`wish`](http://tcl.tk/man/tcl8.4/UserCmd/wish.htm#M13), то есть
   программы, которая выполняет скрипты Tcl в "оконных" окружениях.

Это позволяет создавать дистрибутивы "всё-в-одном" из приложений, написанных
на Tcl/Tk —
[**старкиты и старпаки**](Дистрибутивы__которые_мы_выбираем.md#Tclkit_starkits_и_starpacks_немного_теории).

Другими словами, "близость" Tk к Tcl даёт этому тулкиту несколько очков форы
перед другими тулкитами, для которых требуется таскать за собой:

*  Специальные [**биндинги**](Терминология.md#Биндинги_bindings) к тулкиту;
*  Сам тулкит в виде библиотеки (или набора из десятка библиотек, как в случае с GTK2+).

![(!)](../images/Hammer.png) **Сделать:** развить

# <a id="Почему_не_отделить_интерфейс_от_реализации"></a>Почему не отделить интерфейс от реализации?
Людям, прочитавшим пару книжек по программированию, эта идея кажется разумной.
В реальности всё гораздо сложнее.

Самая главная проблема состоит в том, что разные GUI-тулкиты имеют разную
_философию_ программирования. Это приводит к тому, что для поддержки разных
тулкитов нужно: а) писать "ядро" в очень общем виде, разрабатывая некие
абстрактные интерфейсы для взаимодействия ядра с тулкитом; б) писать ещё по
одному слою кода для каждого тулкита — для привязки этого тулкита к ядру. В
результате код Ткаббера увеличится хорошо если вдвое, а его читабельность
уменьшится, видимо, даже более чем вдвое. Неплохую идею о том, к каким
проблемам приводит подобный подход, можно почерпнуть, глядя на
[GiTK](http://gitk.sourceforge.net).

Ещё одна проблема, незаметная при поверхностном осмотре, состоит в том, что
создание "чистого" кода практически невзоможно — любая платформа имеет
собственные заморочки, что требует "твиков" кода, создания "костылей" и прочих
уродств в определённых случаях. К сожалению, в Ткаббере вынужденно хватает
подобных мест. В случае с "многоинтерфейсным" подходом мы автоматически множим
и подобные проблемы.

Наконец, подумайте о координации разработки (а одна команда не станет окучивать
все направления — для этого требуются конкретные группы), а также о поддержке
пользователей: даже сейчас, когда Ткаббер широко используется только на двух
платформах (в Windows и Unix-based системах; в Mac OS X ситуация далека от
радужной в силу отсутствия в команде Ткаббера разработчиков, заинтересованнных
в улучшении ситуации), зачастую можно говорить о двух разных Ткабберах, так как
эти платформы имеют слишком много собственных особенностей. Представьте теперь,
что будет, если умножить число платформ на число поддерживаемых тулкитов?

Наконец, возможно, ключевой момент: разработчиков вполне устраивает Tcl/Tk, а
идеи "портировать Ткаббер под \<место для тулкита>" проистекают в основном от
тех, кто свой труд вкладывать в это не хочет.

# <a id="Почему_нет_внешнего_API"></a>Почему нет "внешнего API"?
"Внешнего API" (такого, как, например, API плагинов у
[Миранды](http://miranda-im.org)) в Ткаббере нет потому, что он написан на Tcl,
а не на Си; соответственно,   предполагается, что "скриптование" Ткаббера
производится кодом на Tcl.

Обвинение в отсутствии C API обычно приводят как причину "невозможности
скриптовать Ткаббер на языках, отличных от Tcl" (более конкретно — "на любимом
языке"). Теоретически это обвинение обоснованно. Однако давайте посмотрим на
проблему с практической точки зрения (игнорируя тот факт, что создание C API
для Tcl кода относится к области ненаучной фантастики):

*  Наличие C API не сделает автоматически доступными биндинги к этому API для
   других языков — таковые сначала кто-то должен написать. И поддерживать.
   Посему заявление "я не могу скриптовать/расширять Ткаббер на любимом языке"
   в большинстве случаев следует переводить как "я знаю только С++ и джаву, и
   ваш тикль учить не хочу".
*  Предположив наличие C API и биндингов к другим языкам, мы видим проблемы
   возможностей использования и портабельности: предположим, вы написали плагин
   к Ткабберу, скажем, на Питоне. Много ли пользователей захотят ставить
   рантайм питона в систему, чтобы использовать ваш плагин? Как быть с
   распространением плагина в "упакованных" версиях Ткаббера? Пусть даже плагин
   написан прямо на Си, — возникает проблема кроссплатформенной сборки, то есть
   полный пакет проблем поддержки нескольких систем компиляции (имеющих,
   например, место в случае сборки расширений Tcl, написанных на Си).

С другой стороны, скриптование/расширение Ткаббера на его "родном" языке лишено
_всех_ этих проблем, кроме проблемы самообучения допиливающего.

# <a id="Ткаббер_выглядит_отвратительно"></a>Ткаббер выглядит отвратительно!

> *\<zayza\> почему говорят, что ткабер страшный? о\_0  
> \<teo\> zayza: потому что видели его*

Ткаббер (а точнее — Tk) находится в ловушке всех без исключения
кроссплатформенных GUI-тулкитов — невозможно выглядеть "нативно", работая на
ненативной платформе. К сожалению, как было сказано выше, это относится не
только к проблеме "Tk в Windows", но и к "Tk в GNOME/KDE".

К сожалению, выглядеть "в струе" самых последних веяний моды Windows и прочих
"desktop environments" Tk, скорее всего, не будет никогда — тяжело прочно
сидеть на нескольких стульях разной высоты, формы и конструкции сразу.

Несколько подсластить пилюлю могут достаточно широкие возможности по изменению
внешнего вида Tk-приложений, о которых (когда-нибудь будет) рассказано
[**здесь**](База_данных_опций_Tk.md).

Заодно расскажем ещё об одной часто всплывающей теме:

## <a id="Tile_в_Ткаббере"></a>Tile в Ткаббере

[Tile](http://tktable.sourceforge.net/tile) — это _надстройка_ над Tk,
призванная решить некоторые проблемы с "луком и филом", присущие Tk:

*  Реализовать "нативный" вид в Windows XP (то есть использовать её движок
   тем);
*  Реализовать несколько новых виджетов, переделать старые.

Проблема с Tile состоит в том, что она _**не** является **"drop-in
replacement"** для Tk._ Это важно понимать: простое подключение Tile к
существующему проекту, использующему Tk, не привьёт ему "волшебным образом" все
преимущества Tile. В частности, если стандартные виджеты Tk ещё могут (с
некоторыми приседаниями при сборке Tile) "переехать" на новый движок, то все
"левые" виджеты (например, виджеты из BWidget) "сушат вёсла" — выглядят и
работают по-старому.

Другими словами, Ткаббер нужно _портировать_ под Tile, чтобы он с этой Tile
нормально заработал.

Тут возникает другая проблема. Она состоит в том, что Ткаббер позиционируется
разработчиками как максимально портабельное приложение. Это означает, в числе
прочего, что:

*  Ткаббер (формально) работает даже на Tcl/Tk 8.3;
*  Ткаббер _зависит_ (в смысле "не может работать без") только от таких
   программных компонентов, которые давно и широко доступны под любую из
   платформ, на которых работает Tcl/Tk. Причём только один из этих компонентов
   (собственно Tcl/Tk) написан на Си, и его нужно "собирать" на целевой
   платформе, если его там нет в готовом виде; остальные компоненты (Tcllib и
   BWidget) представляют собой код на Tcl — их достаточно "развернуть" из
   архивов, — и они готовы к работе.

Tile к этим компонентам _не_ относится. Достаточно сказать о том, что в природе
не существует даже такого понятия как "стабильный релиз Tile", а это означает,
что его API может меняться по два раза на дню.

На сегодняшний день состояние дел таково, что если мы бросим все дела и
"привяжем" Ткаббер к Tile, то это ударит как по разработчикам (им понадобится
оперативно следить за изменениями в Tile), так и по пользователям (Tile,
насколько нам известно, нет ни в одном серьёзном дистрибутиве Linux) — Ткаббер
потеряет одно из своих главных качеств — способность работать без чрезмерно
серьёзных телодвижений со стороны пользователя на любой системе, в которой есть
Tcl/Tk.

Ещё одна (менее серьёзная) проблема состоит в том, что Ткаббер действительно
сильно зависит от BWidget — с его помощью делаются: почти все диалоги, главное

меню, интерфейс с табами (правда, в альфе 0.10.1 уже реализован другой подход),
деревья, выпадающие списки так далее. Так как BWidget не поддерживает Tile и,
судя по-всему, не будет её поддерживать, портирование Ткаббера под Tile — это
очень серьёзный шаг: прежде чем его сделать, разработчики должны быть уверены,
что Tile получила такую же доступность, как BWidget.

Посему точка зрения [**автора этих строк**](Участник_Kostix.md) состоит в том, что
вряд ли стоит ожидать подвижек в этом направлении в ближайшие два года.

>












|
|



|


|
<
<


|
<
<

|
<
<
<
<
<
<
<
<

|


|
<
<
<
<
<
<
<
<
<

|


|
<
<
<
<
<


|

|
|



|
<
<
<
<
<
<
<
<

|
<
<
<
<
<

|
<
<
<
<

|
<
<
<
<
<
<

|
<
<



|
<

|
|
|
<
<

|
<
<

|
<

|
|

|


|
<

|
<
<
<
<
<
<
<
<

|
<
<
<
<
<

|
<
<
<
<
<
<
<

|
<
<


|
<
<
<

|
<
<
<
<

|
<
<
<
<
|
<
<
<
<
<
<
<

|
<



<
<
<
|
<
<
<

|
<
<

|
<
<

|



|
<

|
<
|

|
<
<
<
<
<
<

|
<

|
<
<

|
|
<
<
<
<
<
<

|
<
<

|
<
<
<
<
<
<

|
|
>
|
<
<
<
<

<
<
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23


24
25
26


27
28








29
30
31
32
33









34
35
36
37
38





39
40
41
42
43
44
45
46
47
48








49
50





51
52




53
54






55
56


57
58
59
60

61
62
63
64


65
66


67
68

69
70
71
72
73
74
75
76

77
78








79
80





81
82







83
84


85
86
87



88
89




90
91




92







93
94

95
96
97



98



99
100


101
102


103
104
105
106
107
108

109
110

111
112
113






114
115

116
117


118
119
120






121
122


123
124






125
126
127
128
129




130


[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Особенности_реализации/index.html)


# Особенности реализации

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Преамбула](#Преамбула)
* [2 Tcl/Tk](#Tcl_Tk)
* [3 Почему Tcl?](#Почему_Tcl)
* [4 Почему Tk?](#Почему_Tk)
* [5 Почему Tk, а не GTK/Qt/что-то ещё?](#Почему_Tk_а_не_GTK_Qt_что-то_ещё)
 * [5.1 А почему нет?](#А_почему_нет)
 * [5.2 Техническая сторона дела](#Техническая_сторона_дела)
* [6 Почему не отделить интерфейс от реализации?](#Почему_не_отделить_интерфейс_от_реализации)
* [7 Почему нет "внешнего API"?](#Почему_нет_внешнего_API)
* [8 Ткаббер выглядит отвратительно!](#Ткаббер_выглядит_отвратительно)
 * [8.1 Tile в Ткаббере](#Tile_в_Ткаббере)

# <a id="Преамбула"></a>Преамбула
В этой статье даются развёрнутые ответы на пачку различных вопросов, периодически задаваемых пользователями Ткаббера относительно языка его реализации, а также смежных вопросов — относительно его внешнего вида. 



# <a id="Tcl_Tk"></a>Tcl/Tk
Ткаббер написан на языке [Tcl](http://www.tcl.tk) и использует библиотеку [Tk](http://wiki.tcl.tk/15242) для создания графического интерфейса пользователя (GUI). 



Несмотря на наличие некоторых (практически беспрецедентно) мощных виджетов (таких как [**text**](http://tcl.tk/man/tcl8.4/TkCmd/text.htm) (используются в окнах чата) и [**canvas**](http://tcl.tk/man/tcl8.4/TkCmd/canvas.htm) (на нём сделаны ростеры)), в Tk нет таких "примитивов" как: "progressbar", "notebook" (виндовым программистам более известный как "page control" или "tab control"), "сплиттеров", готовой поддержки стандартных диалоговоых окон. Однако для Tk написана масса сторонних реализаций, компенсирующих этот недостаток; Ткаббер широко использует один из подобных "наборов виджетов" — [BWidget](http://wiki.tcl.tk/BWidget). 









![(!)](../images/Hammer.png) **Сделать:** добавить про Tcllib 

# <a id="Почему_Tcl"></a>Почему Tcl?
Вообще говоря, здесь проще всего ответить вопросом на вопрос: "а почему нет?" — Tcl является продвинутым "скриптовым" языком; тот факт, что вокруг него значительно меньше того шума, который именуется [термином "hype"](http://www.google.com/search?as_q=define:hype), и он никогда не был "в моде" у населения [/.](http://slashdot.org), не говорит о том, что на нём нельзя создать серьёзный проект. Более того, некоторые бывают удивлены, узнав, что Ткаббер даже не является единственным [Jabber-клиентом](http://coccinella.im/) и уж тем более не единственным [Instant Messenger'ом](http://www.amsn-project.net), написанном на Tcl/Tk. 










![(!)](../images/Hammer.png) **Сделать:** развить 

# <a id="Почему_Tk"></a>Почему Tk?
Tk является "натуральным" выбором для создания GUI у приложения, написанного на Tcl, из-за того, что связка Tcl/Tk является практически уникальной (если не считать [совсем уж "эзотерических" решений](http://www.rebol.com)) в том смысле, что GUI-тулкит очень удобно состыкован с языком — как в плане философии использования, так и в плане используемых при работе с ним языковых конструкций. 






# <a id="Почему_Tk_а_не_GTK_Qt_что-то_ещё"></a>Почему Tk, а не GTK/Qt/что-то ещё?
Ответы можно условно разбить на две категории: 

*  Стандартное заклинание: "а почему нет?"; 
*  Технические обоснования. 

## <a id="А_почему_нет"></a>А почему нет?

99% претензий к Tk касается вовсе не его _технических_ характеристик, а того, как он _выглядит_ (и вообще ощущается) на конкретной системе конкретного пользователя — не секрет, что на 97% "десктопов" в современном мире установлена одна из ОС, сошедших со стапелей Microsoft, а на жалких остатках, занятых, в основном, решениями на базе [Linux](http://www.kernel.org) и \*BSD, царят [GNOME](http://www.gnome.org) и [KDE](http://www.kde.org), то есть имеет место "обоснованное засилье" приложений, использующих в виде GUI-тулкитов [GTK](http://www.gtk.org) и [Qt](http://trolltech.com/products/qt), соответственно. 









Сейчас уже поздно стенать о том, что авторы GTK и Qt не дочитали спецификации на X Window System, а также о том, что они изобрели (каждый — свою) системы конфигурации тулкитов, несовместимые с когда-то бывшей хоть каким-то стандартом систему конфигурации [Xt и Motif](http://en.wikipedia.org/wiki/Xt) ([XRDB](XRDB.md)). В результате мы имеем то, что имеем: несовместимые между собой тулкиты, некоторые из которых борются за "мировое господство". 






Отсюда и наш слабый аргумент: а почему, собственно, GTK или Qt? Потому, что он доминирует на вашей системе? Но в любом случае всем угодить не получится: GTK-приложение будет чужим в окружении Qt и наоборот. А приложение GTK или Qt никогда не будет выглядеть совершенно нативно в Windows, пусть даже оно будет ближе к "натуральному виду", чем Tk. 





Наконец, Ткаббер был рождён как "иксовое" приложение, а довольно весомая часть пользователей X Window вообще не использует "desktop environments", такие как GNOME и KDE — они используют "каноническую" концепцию: window manager + набор приложений, окнами которых он позволяет управлять. Приложения при этом могут быть какими угодно, наглядно демонстрируя "разброд и шатание" иксовых тулкитов во всей его неприглядности. Tk в этом случае выглядит не хуже и не лучше других. 







Следует также понимать, что у других тулкитов [хватает своих "тараканов в голове"](http://vitus-wagner.livejournal.com/169017.html), и переезд на другой тулкит запросто может создать проблем больше, чем решить. 



## <a id="Техническая_сторона_дела"></a>Техническая сторона дела

У Tk есть несколько интересных особенностей, которые выделяют его в ряду GUI-тулкитов: 


*  Очень небольшой размер; 
*  Масса расширений, _написанных на "чистом" Tcl;_ 
*  Tk является интегральной частью _шелла_ [**wish**](http://tcl.tk/man/tcl8.4/UserCmd/wish.htm#M13), то есть программы, которая выполняет скрипты Tcl в "оконных" окружениях. 



Это позволяет создавать дистрибутивы "всё-в-одном" из приложений, написанных на Tcl/Tk — [старкиты и старпаки](Дистрибутивы__которые_мы_выбираем.md#Tclkit_starkits_и_starpacks_немного_теории). 



Другими словами, "близость" Tk к Tcl даёт этому тулкиту несколько очков форы перед другими тулкитами, для которых требуется таскать за собой: 


*  Специальные [биндинги](Терминология.md#Биндинги_bindings) к тулкиту; 
*  Сам тулкит в виде библиотеки (или набора из десятка библиотек, как в случае с GTK2+). 

![(!)](../images/Hammer.png) **Сделать:** развить 

# <a id="Почему_не_отделить_интерфейс_от_реализации"></a>Почему не отделить интерфейс от реализации?
Людям, прочитавшим пару книжек по программированию, эта идея кажется разумной. В реальности всё гораздо сложнее. 


Самая главная проблема состоит в том, что разные GUI-тулкиты имеют разную _философию_ программирования. Это приводит к тому, что для поддержки разных тулкитов нужно: а) писать "ядро" в очень общем виде, разрабатывая некие абстрактные интерфейсы для взаимодействия ядра с тулкитом; б) писать ещё по одному слою кода для каждого тулкита — для привязки этого тулкита к ядру. В результате код Ткаббера увеличится хорошо если вдвое, а его читабельность уменьшится, видимо, даже более чем вдвое. Неплохую идею о том, к каким проблемам приводит подобный подход, можно почерпнуть, глядя на [GiTK](http://gitk.sourceforge.net). 









Ещё одна проблема, незаметная при поверхностном осмотре, состоит в том, что создание "чистого" кода практически невзоможно — любая платформа имеет собственные заморочки, что требует "твиков" кода, создания "костылей" и прочих уродств в определённых случаях. К сожалению, в Ткаббере вынужденно хватает подобных мест. В случае с "многоинтерфейсным" подходом мы автоматически множим и подобные проблемы. 






Наконец, подумайте о координации разработки (а одна команда не станет окучивать все направления — для этого требуются конкретные группы), а также о поддержке пользователей: даже сейчас, когда Ткаббер широко используется только на двух платформах (в Windows и Unix-based системах; в Mac OS X ситуация далека от радужной в силу отсутствия в команде Ткаббера разработчиков, заинтересованнных в улучшении ситуации), зачастую можно говорить о двух разных Ткабберах, так как эти платформы имеют слишком много собственных особенностей. Представьте теперь, что будет, если умножить число платформ на число поддерживаемых тулкитов? 








Наконец, возможно, ключевой момент: разработчиков вполне устраивает Tcl/Tk, а идеи "портировать Ткаббер под \<место для тулкита>" проистекают в основном от тех, кто свой труд вкладывать в это не хочет. 



# <a id="Почему_нет_внешнего_API"></a>Почему нет "внешнего API"?
"Внешнего API" (такого, как, например, API плагинов у [Миранды](http://miranda-im.org)) в Ткаббере нет потому, что он написан на Tcl, а не на Си; соответственно,   предполагается, что "скриптование" Ткаббера производится кодом на Tcl. 




Обвинение в отсутствии C API обычно приводят как причину "невозможности скриптовать Ткаббер на языках, отличных от Tcl" (более конкретно — "на любимом языке"). Теоретически это обвинение обоснованно. Однако давайте посмотрим на проблему с практической точки зрения (игнорируя тот факт, что создание C API для Tcl кода относится к области ненаучной фантастики): 





*  Наличие C API не сделает автоматически доступными биндинги к этому API для других языков — таковые сначала кто-то должен написать. И поддерживать. Посему заявление "я не могу скриптовать/расширять Ткаббер на любимом языке" в большинстве случаев следует переводить как "я знаю только С++ и джаву, и ваш тикль учить не хочу". 




*  Предположив наличие C API и биндингов к другим языкам, мы видим проблемы возможностей использования и портабельности: предположим, вы написали плагин к Ткабберу, скажем, на Питоне. Много ли пользователей захотят ставить рантайм питона в систему, чтобы использовать ваш плагин? Как быть с распространением плагина в "упакованных" версиях Ткаббера? Пусть даже плагин написан прямо на Си, — возникает проблема кроссплатформенной сборки, то есть полный пакет проблем поддержки нескольких систем компиляции (имеющих, например, место в случае сборки расширений Tcl, написанных на Си). 








С другой стороны, скриптование/расширение Ткаббера на его "родном" языке лишено _всех_ этих проблем, кроме проблемы самообучения допиливающего. 


# <a id="Ткаббер_выглядит_отвратительно"></a>Ткаббер выглядит отвратительно!




Ткаббер (а точнее — Tk) находится в ловушке всех без исключения кроссплатформенных GUI-тулкитов — невозможно выглядеть "нативно", работая на ненативной платформе. К сожалению, как было сказано выше, это относится не только к проблеме "Tk в Windows", но и к "Tk в GNOME/KDE". 




К сожалению, выглядеть "в струе" самых последних веяний моды Windows и прочих "desktop environments" Tk, скорее всего, не будет никогда — тяжело прочно сидеть на нескольких стульях разной высоты, формы и конструкции сразу. 



Несколько подсластить пилюлю могут достаточно широкие возможности по изменению внешнего вида Tk-приложений, о которых (когда-нибудь будет) рассказано [здесь](База_данных_опций_Tk.md). 



Заодно расскажем ещё об одной часто всплывающей теме: 

## <a id="Tile_в_Ткаббере"></a>Tile в Ткаббере

[Tile](http://tktable.sourceforge.net/tile) — это _надстройка_ над Tk, призванная решить некоторые проблемы с "луком и филом", присущие Tk: 


*  Реализовать "нативный" вид в Windows XP (то есть использовать её движок тем); 

*  Реализовать несколько новых виджетов, переделать старые. 

Проблема с Tile состоит в том, что она _**не** является **"drop-in replacement"** для Tk._ Это важно понимать: простое подключение Tile к существующему проекту, использующему Tk, не привьёт ему "волшебным образом" все преимущества Tile. В частности, если стандартные виджеты Tk ещё могут (с некоторыми приседаниями при сборке Tile) "переехать" на новый движок, то все "левые" виджеты (например, виджеты из BWidget) "сушат вёсла" — выглядят и работают по-старому. 







Другими словами, Ткаббер нужно _портировать_ под Tile, чтобы он с этой Tile нормально заработал. 


Тут возникает другая проблема. Она состоит в том, что Ткаббер позиционируется разработчиками как максимально портабельное приложение. Это означает, в числе прочего, что: 



*  Ткаббер (формально) работает даже на Tcl/Tk 8.3; 
*  Ткаббер _зависит_ (в смысле "не может работать без") только от таких программных компонентов, которые давно и широко доступны под любую из платформ, на которых работает Tcl/Tk. Причём только один из этих компонентов (собственно Tcl/Tk) написан на Си, и его нужно "собирать" на целевой платформе, если его там нет в готовом виде; остальные компоненты (Tcllib и BWidget) представляют собой код на Tcl — их достаточно "развернуть" из архивов, — и они готовы к работе. 







Tile к этим компонентам _не_ относится. Достаточно сказать о том, что в природе не существует даже такого понятия как "стабильный релиз Tile", а это означает, что его API может меняться по два раза на дню. 



На сегодняшний день состояние дел таково, что если мы бросим все дела и "привяжем" Ткаббер к Tile, то это ударит как по разработчикам (им понадобится оперативно следить за изменениями в Tile), так и по пользователям (Tile, насколько нам известно, нет ни в одном серьёзном дистрибутиве Linux) — Ткаббер потеряет одно из своих главных качеств — способность работать без чрезмерно серьёзных телодвижений со стороны пользователя на любой системе, в которой есть Tcl/Tk. 







Ещё одна (менее серьёзная) проблема состоит в том, что Ткаббер действительно сильно зависит от BWidget — с его помощью делаются: почти все диалоги, главное меню, интерфейс с табами (правда, в альфе 0.10.1 уже реализован другой подход), деревья, выпадающие списки так далее. Так как BWidget не поддерживает Tile и, судя по-всему, не будет её поддерживать, портирование Ткаббера под Tile — это очень серьёзный шаг: прежде чем его сделать, разработчики должны быть уверены, что Tile получила такую же доступность, как BWidget. 

Посему точка зрения [автора этих строк](Участник_Kostix.md) состоит в том, что вряд ли стоит ожидать подвижек в этом направлении в ближайшие два года. 








Changes to wiki/ru/Остров_посланных_на....md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126


127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Остров_посланных_на...)


# Остров посланных на...

Материал из Tkabber Wiki

> _Необычной какой-то неокеанической красоты, высоты,  
> изящной длины открылся нам вдруг остров, стоящий посреди океана.  
> Казалось — он вулканического происхождения, потом казалось — нет.  
> И все же что-то вулканическое угадывалось в его мощных очертаниях._

> _© ["Остров посланных на..."](http://www.lib.ru/KOWAL/suervyer.txt#6) из сборника
  ["Суер-Выер"](http://www.lib.ru/KOWAL/suervyer.txt)
  [Юрия Коваля](http://www.lib.ru/KOWAL/)_

Доброго времени суток!

Поскольку вы находитесь здесь, можно предположить, что вы прочитали топик в
конференции `tkabber@conference.jabber.ru` и нажали ссылку. Обижаться не стоит,
вы на верном пути. Сейчас мы по-быстрому расскажем вам, как пользоваться этой
вики, конференцией и находящимся там ботом, чтобы ваше пребывание там было
приятным, а ваше и наше время не было потрачено зря, но с пользой.

## <a id="toc"></a>Содержание

* [1 Вики](#Вики)
* [2 Бот sulci](#Бот_sulci)
* [3 Другие источники информации](#Другие_источники_информации)
* [4 Конференция](#Конференция)
* [5 Проблема разрешилась?](#Проблема_разрешилась)
* [6 Проблема **НЕ** разрешилась?](#Проблема_НЕ_разрешилась)

# <a id="Вики"></a>Вики
Подробнее о навигации по вики можно прочитать на
[**Заглавной странице**](Заглавная_страница.md), здесь же можем сказать, что, перерыв
интернет в поисках документации по Ткабберу на русском (да и других языках), мы
ничего путнего почти и не нашли (а что нашли — обнародовали на странице
[**Ссылки**](Ссылки.md)). Иными словами: этот проект вполне можно считать
официальным источником информации по этой замечательной программе (не считая,
конечно, файла документации, идущего с пакетом, и официального сайта Ткаббера
[http://tkabber.jabber.ru](http://tkabber.jabber.ru)). К чему это всё? А к
тому, что не спешите задавать свой вопрос на конференции, почитайте сначала
хотя бы [**Ткаббер ЧаВо**](Ткаббер_ЧаВо.md), а лучше — и остальные статьи.

# <a id="Бот_sulci"></a>Бот sulci
Разговаривать с ботом имеет смысл, если у вас дорогой трафик или проблемы с
выходом в интернет. Он знает немного и может просветить лишь по самым основным
вопросам.

* Сразу предупреждаем: **общаться с ним в привате!**
* Один застенчивый новичок долго не мог попасть в приват к боту, потому что не
  знал, как записываться на приём.
   * Объясняем: открыть приват (не только с ботом) можно, сделав двойной клик
     на нике в списке участников конференции.
   * То же самое можно сделать, открыв на участнике конференции контекстное
     меню и выбрав там пункт "Начать разговор". Да не дрогнет рука ваша!
   * Ещё один вариант: набрать команду **/open sulci**

* Начать общение можно с этой фразы:

        wtf ткаббер_термины

* В ответ на неё бот выдаст ключевые слова, которым мы его обучили.
* Эти ключевые слова тоже используются с помощью команды **wtf**.
* Бот умеет искать в гугле:

        google поисковый запрос
        google_adv start limit поисковый запрос

    Во втором случае он выдаёт limit результатов, начиная с start. Например, по
    команде "google\_adv 4 5 tkabber wiki" бот выдаст пять ссылок по запросу
    "tkabber wiki", пропустив первые три ссылки.

Конечно, бот умеет много чего ещё, но это уже к Ткабберу не относится.

# <a id="Другие_источники_информации"></a>Другие источники информации
1. Как ни странно, родная документация, которую можно найти в
   **/usr/share/doc/tkabber/tkabber.html** или
   **C:\\Program Files\\Tkabber\\tkabber\\doc\\tkabber.html** (на английском);
1. У Ткаббера есть официальная страница
   [http://tkabber.jabber.ru](http://tkabber.jabber.ru) — поищите на ней; хоть
   форум там и пустынен, архив его может пригодиться;
1. Если вы пользователь Windows, имеет смысл ознакомиться с
   [этой статьёй](http://sgolovan.nes.ru/jabber/Tkabber-Windows-Mini-Howto.html) (на
   случай, если вдруг ни с того ни с сего тот сервер в дауне, у нас имеется
   [**"зеркало" этой статьи**](Tkabber_Windows_Mini_HOWTO.md));
1. Попробуйте пошерстить
   [логи конференции](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru) —
   возможно, ваша проблема уже обсуждалась;
1. Если религия позволяет, сходите на [google.com](http://google.com). В
   качестве поискового запроса можно написать:
   * первую строчку сообщения об ошибке или её часть, если по полной строке нет
     результатов,
   * ключевые слова:
      * обязательно: Ткаббер (tkabber),
      * в зависимости от потребностей: шрифт (font), автоэвей (autoaway),
	смайлик (emoticon, emoteicon) и так далее. Вообще учитесь пользоваться
	гуглем — в наше время это умение будет поважнее владения томагавком. Не
	удивляйтесь, если поиск приведёт вас на эту вики :)
   * ключевые слова в сочетании со служебным словом
     [site](http://www.google.ru/intl/ru/help/refinesearch.html#domain), если
     хотите искать только на определённом сайте. Например, если хотите искать
     слово "старпак" в логах конференции, введите в строке запроса следующий
     текст:
     **старпак site:http://chatlogs.jabber.ru/tkabber@conference.jabber.ru**
1. Не забудьте, что и на вики есть поиск:
   * Кнопка "Перейти" попытается перекинуть вас на статью с введённым именем.
   * Кнопка "Поиск" будет искать страницы, на которых присутствует введённое
     вами слово.
      * В случае неудачи попробуйте другие словоформы: вместо "смайлик" —
	"смайлика", "смайлики" и т. д.
      * Выяснилось, что поиск на вики глючит на запросах из латинских букв
	(например, не находится "icq", хотя это слово встречается в уйме
	статей; не находится "windo", зато находится "window" как составная
	часть слова "windows", ну и так далее). Плохо, конечно. Надеемся, что
	администраторы вики это когда-нибудь исправят, а пока посоветуем
	схитрить (во многих статьях используется слово "аська" и его
	производные, можете поискать на "аськ"; или же "новости", "фид" вместо
	"rss"). Или просмотрите список всех страниц (ссылка в левом меню).
	 * Отсюда вывод: на вики тоже искать гуглём (как искать на конкретном
	   сайте, описано чуть выше).

# <a id="Конференция"></a>Конференция

![](../images/180px-2faq.gif)



Если самостоятельное изучение документации плодов не принесло, общения с нами
не избежать. Как можно сделать его приятнее и свести потери нашего и вашего
времени к минимуму?

1. Не пожалейте ещё пяти минут и почитайте статью о том, как правильно задавать вопросы:
   * [короткая версия](http://mydebianblog.blogspot.com/2006/07/questions-mini-howto.html),
   * [более полная версия](http://bugtraq.ru/forum/faq/general/smart-questions.html),
   * [она же в гугле](http://www.google.com/search?as_q=перевод+how+to+ask+questions+in+a+smart+way),
   * бот тоже может помочь: **wtf хороший\_вопрос**.
1. Чтобы общение в конференции протекало в атмосфере добрососедства и
   взаимопонимания, постарайтесь руководствоваться принципами, давно
   проверенными временем в мире IRC и изложенными, в частности, на следующих
   страницах:
   * [кэш FAQ'а канала помощи по оконному менеджеру fvwm](http://66.102.9.104/search?q=cache:-bKM5BysLb8J:edulinux.homeunix.org/fvwm/fvwmchanfaq.html)
     (первая часть, про сам канал — на английском)
   * [статья о правилах поведения на каналах IRC-сети Wenet](http://www.wenet.ru/irc/etiquette)
     (по-русски)
1. Собственно, трудно к этому что-либо прибавить, но нелишним будет напомнить,
   что от того, **как** задан вопрос, сильно зависит ответ, который вы получите
   (а то и не получите вовсе). Перечитайте ещё раз пункты 1 и 2.
1. Всё же пришлось добавить одно пожелание: пожалуйста, очень вас просим, почти
   на коленях — **не коверкайте русский язык и не используйте "слепые" смайлики
   — вот такие:**

        ))))

    **А то забаним!** (Достало уже просто.)

# <a id="Проблема_разрешилась"></a>Проблема разрешилась?
Тогда будьте добры, расскажите в конференции, как вы этого добились. Можете
также написать об этом в ЧаВо или вообще написать новую статью. Ваш опыт
пригодится другим.

# <a id="Проблема_НЕ_разрешилась"></a>Проблема **НЕ** разрешилась?
Что ж, и такое бывает. Умейте держать удар, падать лицом в грязь, отливать
против ветра и уходить не солоно хлебавши. Жизнь коротка, но это не повод
отчаиваться. Отдохните от проблемы, а потом начните снова. Попробуйте
альтернативные пути решения, сходите на другие форумы и конференции, которые
могут быть как-то связаны с вашей задачей. На нас свет клином не сошёлся, и
кто-нибудь другой может подсказать решение. В конце концов, подумайте хорошо: а
настолько ли важна эта проблема? Может, вместо того, чтобы сутками пялиться в
монитор, пытаясь с ней разобраться, вам стоит расправить плечи, выбраться на
природу и послушать птиц? :) Жизнь коротка, знаете ли...

>





|
|
|
|

|
<
<

|

|
<
<
<
<








|


|
<
<
<
<
<
<
<
<
<


|
<
<

|
|
<
|
<
|
<
|
|
|

|

|
|
|

|
|

|
<
<

|


|
<
<
<
|
<
|
<
<
<
<
|
<
|
<
|
<
|
|
|
|
<
<
|
|
<
<
<
<
|
|
|
<
|
<
|
<
<
<
<
<
<
<
|
<





>
>
|
<
<

|
|
|
|
|
|
|
<
<
|
<
|
|
|
<
<
|
<
<
<
|
<
|


|
<
<

|
|
|
|
<
<
<
<
<
<
1
2
3
4
5
6
7
8
9
10
11
12
13


14
15
16
17




18
19
20
21
22
23
24
25
26
27
28
29









30
31
32


33
34
35

36

37

38
39
40
41
42
43
44
45
46
47
48
49
50
51


52
53
54
55
56



57

58




59

60

61

62
63
64
65


66
67




68
69
70

71

72







73

74
75
76
77
78
79
80
81


82
83
84
85
86
87
88
89


90

91
92
93


94



95

96
97
98
99


100
101
102
103
104






[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Остров_посланных_на...)


# Остров посланных на...

Материал из Tkabber Wiki

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

© ["Остров посланных на..."](http://www.lib.ru/KOWAL/suervyer.txt#6) из сборника ["Суер-Выер"](http://www.lib.ru/KOWAL/suervyer.txt) [Юрия Коваля](http://www.lib.ru/KOWAL/) 



Доброго времени суток! 

Поскольку вы находитесь здесь, можно предположить, что вы прочитали топик в конференции `tkabber@conference.jabber.ru` и нажали ссылку. Обижаться не стоит, вы на верном пути. Сейчас мы по-быстрому расскажем вам, как пользоваться этой вики, конференцией и находящимся там ботом, чтобы ваше пребывание там было приятным, а ваше и наше время не было потрачено зря, но с пользой. 





## <a id="toc"></a>Содержание

* [1 Вики](#Вики)
* [2 Бот sulci](#Бот_sulci)
* [3 Другие источники информации](#Другие_источники_информации)
* [4 Конференция](#Конференция)
* [5 Проблема разрешилась?](#Проблема_разрешилась)
* [6 Проблема НЕ разрешилась?****](#Проблема_НЕ_разрешилась)

# <a id="Вики"></a>Вики
Подробнее о навигации по вики можно прочитать на **[Заглавной странице](Заглавная_страница.md),** здесь же можем сказать, что, перерыв интернет в поисках документации по Ткабберу на русском (да и других языках), мы ничего путнего почти и не нашли (а что нашли — обнародовали на странице **[Ссылки](Ссылки.md)**). Иными словами: этот проект вполне можно считать официальным источником информации по этой замечательной программе (не считая, конечно, файла документации, идущего с пакетом, и официального сайта Ткаббера [http://tkabber.jabber.ru](http://tkabber.jabber.ru)). К чему это всё? А к тому, что не спешите задавать свой вопрос на конференции, почитайте сначала хотя бы **[Ткаббер ЧаВо](Ткаббер_ЧаВо.md),** а лучше — и остальные статьи. 










# <a id="Бот_sulci"></a>Бот sulci
Разговаривать с ботом имеет смысл, если у вас дорогой трафик или проблемы с выходом в интернет. Он знает немного и может просветить лишь по самым основным вопросам. 



*  Сразу предупреждаем: **общаться с ним в привате!** 
*  Один застенчивый новичок долго не мог попасть в приват к боту, потому что не знал, как записываться на приём. 

 *  Объясняем: открыть приват (не только с ботом) можно, сделав двойной клик на нике в списке участников конференции. 

 *  То же самое можно сделать, открыв на участнике конференции контекстное меню и выбрав там пункт "Начать разговор". Да не дрогнет рука ваша! 

 *  Ещё один вариант: набрать команду **/open sulci** 
 
*  Начать общение можно с этой фразы: 

    wtf ткаббер_термины

*  В ответ на неё бот выдаст ключевые слова, которым мы его обучили. 
*  Эти ключевые слова тоже используются с помощью команды **wtf**. 
*  Бот умеет искать в гугле: 

    google поисковый запрос
    google_adv start limit поисковый запрос

Во втором случае он выдаёт limit результатов, начиная с start. Например, по команде "google\_adv 4 5 tkabber wiki" бот выдаст пять ссылок по запросу "tkabber wiki", пропустив первые три ссылки. 



Конечно, бот умеет много чего ещё, но это уже к Ткабберу не относится. 

# <a id="Другие_источники_информации"></a>Другие источники информации
1.  Как ни странно, родная документация, которую можно найти в **/usr/share/doc/tkabber/tkabber.html** или **C:\\Program Files\\Tkabber\\tkabber\\doc\\tkabber.html** (на английском); 



1.  У Ткаббера есть официальная страница [http://tkabber.jabber.ru](http://tkabber.jabber.ru) — поищите на ней; хоть форум там и пустынен, архив его может пригодиться; 

1.  Если вы пользователь Windows, имеет смысл ознакомиться с [этой статьёй](http://sgolovan.nes.ru/jabber/Tkabber-Windows-Mini-Howto.html) (на случай, если вдруг ни с того ни с сего тот сервер в дауне, у нас имеется ["зеркало" этой статьи](Tkabber_Windows_Mini_HOWTO.md)); 




1.  Попробуйте пошерстить [логи конференции](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru) — возможно, ваша проблема уже обсуждалась; 

1.  Если религия позволяет, сходите на [google.com](http://google.com). В качестве поискового запроса можно написать: 

 *  первую строчку сообщения об ошибке или её часть, если по полной строке нет результатов, 

 *  ключевые слова: 
  *  обязательно: Ткаббер (tkabber), 
  *  в зависимости от потребностей: шрифт (font), автоэвей (autoaway), смайлик (emoticon, emoteicon) и так далее. Вообще учитесь пользоваться гуглем — в наше время это умение будет поважнее владения томагавком. Не удивляйтесь, если поиск приведёт вас на эту вики :) 
 


 *  ключевые слова в сочетании со служебным словом [site](http://www.google.ru/intl/ru/help/refinesearch.html#domain), если хотите искать только на определённом сайте. Например, если хотите искать слово "старпак" в логах конференции, введите в строке запроса следующий текст: **старпак site:http://chatlogs.jabber.ru/tkabber@conference.jabber.ru** 
 




1.  Не забудьте, что и на вики есть поиск: 
 *  Кнопка "Перейти" попытается перекинуть вас на статью с введённым именем. 
 *  Кнопка "Поиск" будет искать страницы, на которых присутствует введённое вами слово. 

  *  В случае неудачи попробуйте другие словоформы: вместо "смайлик" — "смайлика", "смайлики" и т. д. 

  *  Выяснилось, что поиск на вики глючит на запросах из латинских букв (например, не находится "icq", хотя это слово встречается в уйме статей; не находится "windo", зато находится "window" как составная часть слова "windows", ну и так далее). Плохо, конечно. Надеемся, что администраторы вики это когда-нибудь исправят, а пока посоветуем схитрить (во многих статьях используется слово "аська" и его производные, можете поискать на "аськ"; или же "новости", "фид" вместо "rss"). Или просмотрите список всех страниц (ссылка в левом меню). 







   *  Отсюда вывод: на вики тоже искать гуглём (как искать на конкретном сайте, описано чуть выше). 


# <a id="Конференция"></a>Конференция

![](../images/180px-2faq.gif)

![](../images/magnify-clip.png)

Если самостоятельное изучение документации плодов не принесло, общения с нами не избежать. Как можно сделать его приятнее и свести потери нашего и вашего времени к минимуму? 



1.  Не пожалейте ещё пяти минут и почитайте статью о том, как правильно задавать вопросы: 
 *  [короткая версия](http://mydebianblog.blogspot.com/2006/07/questions-mini-howto.html), 
 *  [более полная версия](http://bugtraq.ru/forum/faq/general/smart-questions.html), 
 *  [она же в гугле](http://www.google.com/search?as_q=перевод+how+to+ask+questions+in+a+smart+way), 
 *  бот тоже может помочь: **wtf хороший\_вопрос**. 
 
1.  Чтобы общение в конференции протекало в атмосфере добрососедства и взаимопонимания, постарайтесь руководствоваться принципами, давно проверенными временем в мире IRC и изложенными, в частности, на следующих страницах: 


 *  [кэш FAQ'а канала помощи по оконному менеджеру fvwm](http://66.102.9.104/search?q=cache:-bKM5BysLb8J:edulinux.homeunix.org/fvwm/fvwmchanfaq.html) (первая часть, про сам канал — на английском) 

 *  [статья о правилах поведения на каналах IRC-сети Wenet](http://www.wenet.ru/irc/etiquette) (по-русски) 
 
1.  Собственно, трудно к этому что-либо прибавить, но нелишним будет напомнить, что от того, **как** задан вопрос, сильно зависит ответ, который вы получите (а то и не получите вовсе). Перечитайте ещё раз пункты 1 и 2. 


1.  Всё же пришлось добавить одно пожелание: пожалуйста, очень вас просим, почти на коленях — **не коверкайте русский язык и не используйте "слепые" смайлики — вот такие:



    ))))

 А то забаним!** (Достало уже просто.) 

# <a id="Проблема_разрешилась"></a>Проблема разрешилась?
Тогда будьте добры, расскажите в конференции, как вы этого добились. Можете также написать об этом в ЧаВо или вообще написать новую статью. Ваш опыт пригодится другим. 



# <a id="Проблема_НЕ_разрешилась"></a>Проблема НЕ разрешилась?****
Что ж, и такое бывает. Умейте держать удар, падать лицом в грязь, отливать против ветра и уходить не солоно хлебавши. Жизнь коротка, но это не повод отчаиваться. Отдохните от проблемы, а потом начните снова. Попробуйте альтернативные пути решения, сходите на другие форумы и конференции, которые могут быть как-то связаны с вашей задачей. На нас свет клином не сошёлся, и кто-нибудь другой может подсказать решение. В конце концов, подумайте хорошо: а настолько ли важна эта проблема? Может, вместо того, чтобы сутками пялиться в монитор, пытаясь с ней разобраться, вам стоит расправить плечи, выбраться на природу и послушать птиц? :) Жизнь коротка, знаете ли... 








Changes to wiki/ru/Палитра_цветов.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Палитра_цветов/index.html)


# Палитра цветов

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Введение](#Введение)
* [2 Теория](#Теория)
   * [2.1 Цвета X Window](#Цвета_X_Window)
   * [2.2 Системные цвета](#Системные_цвета)
   * [2.3 Спецификации RGB](#Спецификации_RGB)
* [3 Практика](#Практика)
   * [3.1 Таблицы](#Таблицы)
   * [3.2 Утилиты](#Утилиты)

# <a id="Введение"></a>Введение
При редактировании различных настроек цветов в Ткаббере полезно иметь: в голове
— некоторые знания из области управления цветами в
[Tk](http://ru.wikipedia.org/wiki/Tk), и под рукой — вспомогательные утилиты,
облегчающие нелёгкий труд любителя
[*хохломы*](Цветовые_темы_и_пиктограммы.md#Цветовые_темы).

# <a id="Теория"></a>Теория
Tk понимает цвета в трёх вариантах:

*  "Стандартные цвета X Window";
*  "Системные" цвета;
*  Числовые обозначения цветов, кодирующие их RGB-компоненты.

## <a id="Цвета_X_Window"></a>Цвета X Window

Представляют собою большой набор различных цветов, стандартизированный для
использования в X Window System. В любых "иксах" идёт текстовый файл
**rgb.txt**, содержащий отображения названий цветов на их RGB-значения.

Про эти цвета Tk "знает" независимо от той системы, в которой работает.

"Официальный" (для Tk) список цветов представлен страницей руководства
["colors"](http://www.tcl.tk/man/tcl8.4/TkCmd/colors.htm), однако для подбора
цветов гораздо удобнее пользоваться спецсредствами, о которых рассказано
[**ниже**](Палитра_цветов.md#Практика).

## <a id="Системные_цвета"></a>Системные цвета

Это специальные цвета, доступные в определённой оконной системе. Имеются только
в Windows и Mac OS X. Их удобно использовать для того, чтобы назначать виджетам
"стандартные" ("системные") цвета.

![(!)](../images/Hammer.png) **Сделать:** таблицы из книги Уэлша

## <a id="Спецификации_RGB"></a>Спецификации RGB

Цвета также можно указывать напрямую — в RGB формате вида: \#RGB, \#RRGGBB,
\#RRRGGGBBB, \#RRRRGGGGBBBB, где "R", "G" и "B" должны быть представлены
шестнадцатеричными цифрами (каждая из которых представляет 4 бита данных).
Таким образом можно указывать цвета, соответствующие глубине цвета 4, 8, 12 и
16 бит.

Дополнительные подробности представлены
[здесь](http://www.tcl.tk/man/tcl8.4/TkLib/GetColor.htm#M5).

# <a id="Практика"></a>Практика
Есть два подхода к выбору цветов: готовые таблицы и утилиты, предоставляющие
возможность "подкрутить" нужный цвет.

## <a id="Таблицы"></a>Таблицы

...ищутся в гугле по запросу "rgb.txt". К примеру,
[вот](http://web.njit.edu/~kevin/rgb.txt.html) и
[вот](http://sedition.com/perl/rgb.html).

## <a id="Утилиты"></a>Утилиты

В X Window System есть пара "родных" утилит для выбора цветов: попроще —
**xcolors** и посложнее/поудобнее — **xcolorsel**.

В Windows "родных" утилит нет, но можно использовать внешние.

Наиболее прямолинейный подход — использовать для подбора цветов Tk приложения,
написанные на Tcl/Tk же. Для работы таких утилит нужен рантайм Tcl/Tk (то есть
["полноценный" дистрибутив](http://www.activestate.com/tcl) или
[tclkit](http://www.equi4.com/tclkit.html)).

Например, вот [отличная утилитка от Jeffry Hobbs'а](http://www.tcl.tk/community/hobbs/tcl/src/colordemo.tcl).
Она же доступна в виде
["тиклета"](http://www.tcl.tk/community/hobbs/tcl/tclet/color.html), если
соответствующий [плагин web-браузера](http://www.tcl.tk/software/plugin/) у вас
установлен.

Другие "color picker'ы" можно нарыть на [вики тиклеров](http://wiki.tcl.tk),
например: [вот](http://wiki.tcl.tk/9271),
[вот](http://wiki.tcl.tk/14976) и [вот](http://wiki.tcl.tk/xcolors).

>



|





|
|
|

|
|


|
<
<
<
<


|

|
|
|



|
<
<

|

|
<
<
<



|
<
<

|



|
<
<
<
<

|
<


|
<



|
<
<



|
<

|

|
<
<
<

|
<
<
<
<

|
|
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20




21
22
23
24
25
26
27
28
29
30
31


32
33
34
35



36
37
38
39


40
41
42
43
44
45




46
47

48
49
50

51
52
53
54


55
56
57
58

59
60
61
62



63
64




65
66
67
68
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Палитра_цветов/index.html)


# Палитра цветов

Материал из Tkabber Wiki.

## <a id="toc"></a>Содержание

* [1 Введение](#Введение)
* [2 Теория](#Теория)
 * [2.1 Цвета X Window](#Цвета_X_Window)
 * [2.2 Системные цвета](#Системные_цвета)
 * [2.3 Спецификации RGB](#Спецификации_RGB)
* [3 Практика](#Практика)
 * [3.1 Таблицы](#Таблицы)
 * [3.2 Утилиты](#Утилиты)

# <a id="Введение"></a>Введение
При редактировании различных настроек цветов в Ткаббере полезно иметь: в голове — некоторые знания из области управления цветами в [Tk](http://ru.wikipedia.org/wiki/Tk), и под рукой — вспомогательные утилиты, облегчающие нелёгкий труд любителя [хохломы](Цветовые_темы_и_пиктограммы.md#Цветовые_темы). 





# <a id="Теория"></a>Теория
Tk понимает цвета в трёх вариантах: 

*  "Стандартные цвета X Window"; 
*  "Системные" цвета; 
*  Числовые обозначения цветов, кодирующие их RGB-компоненты. 

## <a id="Цвета_X_Window"></a>Цвета X Window

Представляют собою большой набор различных цветов, стандартизированный для использования в X Window System. В любых "иксах" идёт текстовый файл **rgb.txt**, содержащий отображения названий цветов на их RGB-значения. 



Про эти цвета Tk "знает" независимо от той системы, в которой работает. 

"Официальный" (для Tk) список цветов представлен страницей руководства ["colors"](http://www.tcl.tk/man/tcl8.4/TkCmd/colors.htm), однако для подбора цветов гораздо удобнее пользоваться спецсредствами, о которых рассказано [ниже](Палитра_цветов.md#Практика). 




## <a id="Системные_цвета"></a>Системные цвета

Это специальные цвета, доступные в определённой оконной системе. Имеются только в Windows и Mac OS X. Их удобно использовать для того, чтобы назначать виджетам "стандартные" ("системные") цвета. 



![(!)](../images/Hammer.png) **Сделать:** таблицы из книги Уэлша 

## <a id="Спецификации_RGB"></a>Спецификации RGB

Цвета также можно указывать напрямую — в RGB формате вида: \#RGB, \#RRGGBB, \#RRRGGGBBB, \#RRRRGGGGBBBB, где "R", "G" и "B" должны быть представлены шестнадцатеричными цифрами (каждая из которых представляет 4 бита данных). Таким образом можно указывать цвета, соответствующие глубине цвета 4, 8, 12 и 16 бит. 





Дополнительные подробности представлены [здесь](http://www.tcl.tk/man/tcl8.4/TkLib/GetColor.htm#M5). 


# <a id="Практика"></a>Практика
Есть два подхода к выбору цветов: готовые таблицы и утилиты, предоставляющие возможность "подкрутить" нужный цвет. 


## <a id="Таблицы"></a>Таблицы

...ищутся в гугле по запросу "rgb.txt". К примеру, [вот](http://web.njit.edu/~kevin/rgb.txt.html) и [вот](http://sedition.com/perl/rgb.html). 



## <a id="Утилиты"></a>Утилиты

В X Window System есть пара "родных" утилит для выбора цветов: попроще — **xcolors** и посложнее/поудобнее — **xcolorsel**. 


В Windows "родных" утилит нет, но можно использовать внешние. 

Наиболее прямолинейный подход — использовать для подбора цветов Tk приложения, написанные на Tcl/Tk же. Для работы таких утилит нужен рантайм Tcl/Tk (то есть ["полноценный" дистрибутив](http://www.activestate.com/tcl) или [tclkit](http://www.equi4.com/tclkit.html)). 




Например, вот [отличная утилитка от Jeffry Hobbs'а](http://www.tcl.tk/community/hobbs/tcl/src/colordemo.tcl). Она же доступна в виде ["тиклета"](http://www.tcl.tk/community/hobbs/tcl/tclet/color.html), если соответствующий [плагин web-браузера](http://www.tcl.tk/software/plugin/) у вас установлен. 





Другие "color picker'ы" можно нарыть на [вики тиклеров](http://wiki.tcl.tk), например: [вот](http://wiki.tcl.tk/9271), [вот](http://wiki.tcl.tk/14976) и [вот](http://wiki.tcl.tk/xcolors). 


Changes to wiki/ru/Патчи.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Патчи/index.html)


# Патчи

Материал из Tkabber Wiki

Здесь мы "замахнёмся" на исходные коды самой программы, а точнее — её
модулей :)

* Короткие патчи в пару строк легко наложить самостоятельно, поискав в тексте
  модуля нужные строчки, поэтому и оформлять статью следует соответственно:
  просто указать, **что на что заменяется**.
* Патчи же покрупней имеет смысл выкладывать в виде файла различий
  some\_file\_name.diff, который можно получить, запустив в консоли или xterm
  команду diff. Соответственно, применять такой патч следует с помощью команды
  patch:
   1. Сохранить или перекинуть уже скачанный файл патча patch.diff в каталог,
      где находится "патчуемый" и перейти туда (скорее всего, для этого и
      следующего действия вам потребуются права root).
   1. Выполнить команду **patch -p0 \< patch.diff**.
   1. Перезапустить Ткаббер и, если требуется, сходить в Настройки и подправить
      опции.
   1. Создать патч можно командой **diff -u oldfile.tcl newfile.tcl >
      patch.diff**
      * Или же, если вы работаете над svn-версией файла, просто выполните **svn
	diff file.tcl > patch.diff**
   1. Если вам посчастливилось работать в среде Windows, не отчаивайтесь:
      скачайте и установите виндовые версии программ
      [patch](http://gnuwin32.sourceforge.net/packages/patch.htm) и
      [diff](http://gnuwin32.sourceforge.net/packages/diffutils.htm).

## <a id="toc"></a>Содержание

* [1 Отправка сообщений по нажатию Ctrl-Enter](#Отправка_сообщений_по_нажатию_Ctrl-Enter)
* [2 Ispell в Windows, правка](#Ispell_в_Windows_правка)
* [3 Нумерация закладок](#Нумерация_закладок)
* [4 Добавление аватары в окно чата (старый хак Badlop'а)](#Добавление_аватары_в_окно_чата_старый_хак_Badlopа)
* [5 Расширенная поддержка аватар в окне чата](#Расширенная_поддержка_аватар_в_окне_чата)
* [6 Показ времени "ухода в эвей" в статусе auto-away](#Показ_времени_ухода_в_эвей_в_статусе_auto-away)
   * [6.1 Дополнительные настройки AutoAway](#Дополнительные_настройки_AutoAway)
* [7 Транспортные иконки для гейта MRIM и его контактов<s></s>](#Транспортные_иконки_для_гейта_MRIM_и_его_контактовs_s)
* [8 Расширенное управление приоритетами для auto-away и auto-xa](#Расширенное_управление_приоритетами_для_auto-away_и_auto-xa)
* [9 Поиск в Дискавери<s></s>](#Поиск_в_Дискавериs_s)
* [10 Подтверждение при закрытии табов<s></s>](#Подтверждение_при_закрытии_табовs_s)
* [11 Выборочное управление посылкой уведомлений о событиях чата](#Выборочное_управление_посылкой_уведомлений_о_событиях_чата)
* [12 Поддержка ссылок в окне истории](#Поддержка_ссылок_в_окне_истории)
* [13 Выбор между старым и новым видом окна userinfo](#Выбор_между_старым_и_новым_видом_окна_userinfo)
* [14 Звуки в играх<s></s>](#Звуки_в_играхs_s)
* [15 Улучшенная поддержка XHTML](#Улучшенная_поддержка_XHTML)
* [16 Публикация проигрываемой мелодии при помощи запуска Ткаббера с ключом -pep](#Публикация_проигрываемой_мелодии_при_помощи_запуска_Ткаббера_с_ключом_-pep)
* [17 Отображение доступных контактов сверху списка](#Отображение_доступных_контактов_сверху_списка)
* [18 Звук на установленные к наблюдению в Шпионе jid'ы](#Звук_на_установленные_к_наблюдению_в_Шпионе_jidы)
* [19 Отключение смены значка в трее при получени прочих сообщений в конференции](#Отключение_смены_значка_в_трее_при_получени_прочих_сообщений_в_конференции)
* [20 Группы-исключения для показа в них сообщений сервера, когда соответствующая опция выключена](#Группы-исключения_для_показа_в_них_сообщений_сервера_когда_соответствующая_опция_выключена)
* [21 Включение подсветки (highlight) всего сообщения при обращении к вам в конференции<s></s>](#Включение_подсветки_highlight_всего_сообщения_при_обращении_к_вам_в_конференцииs_s)
* [22 Кнопка очистки фильтра ростера](#Кнопка_очистки_фильтра_ростера)

## <a id="Отправка_сообщений_по_нажатию_Ctrl-Enter"></a>Отправка сообщений по нажатию Ctrl-Enter
>  _Внимание!_ Существует решение, не требующее патча —
  [**настройка в конфиг**](Нетривиальные_настройки.md#Отправка_сообщений_нажатием_Ctrl-Enter).
  Поскольку она потенциально значительно надёжнее патча, рекомендуется
  использовать её.

Многие IM-программы отсылают сообщения по нажатию Ctrl-Enter, а сам Enter
используют для перевода строки, вместо или вместе с Shift-Enter. В Ткаббере
сообщения отсылаются по нажатию Enter, что и само по себе не очень удобно (если
вам хочется сделать в сообщении несколько абзацев, придётся нажать несколько
раз Shift-Enter и только один раз — Enter). А уж если вы пересаживаетесь на
Ткаббер с другой программы, то эта разница в простых вроде бы действиях и вовсе
может свести с ума. К счастью, проблема решается буквально за 5 минут.

Откройте файл **chats.tcl**, что лежит в главной директории, в вашем любимом
текстовом редакторе и найдите строку:

    bind $cw.input <Shift-Key-Return> { }

Видите, сразу за ней идёт блок:

       bind $cw.input <Key-Return> [double% "
           chat::send_message [list $cw] [list $chatid] [list $type]
           break"]

Теперь вам нужно немного всё поменять :) Вместо этих двух биндов сделайте так:

       bind $cw.input <Shift-Key-Return> { }

       bind $cw.input <Key-Return> { }

       bind $cw.input <Control-Key-Return> [double% "
    	   chat::send_message [list $cw] [list $chatid] [list $type]
    	   break"]

Фактически вы сделали просто перевод каретки (переход на следующую строку) как
по нажатию на Enter, так и по нажатию на Shift-Enter, а привычный для многих
Ctrl-Enter теперь будет отсылать сообщения.

_P.S. Лучшая документация — это исходники._

была тут галерея, но глюк случился.

Автор патча — [**lknight**](Участник_Lknight.md).

## <a id="Ispell_в_Windows_правка"></a>Ispell в Windows, правка
Сделав всё в соответствии с
[документацией](http://sgolovan.nes.ru/jabber/Tkabber-Windows-Mini-Howto.html)
от `xmpp:sgolovan@nes.ru` (teo), мы получаем в _$rootdir\\PLUGINS\\WINDOWS\\_
файл ispell.tcl, который на Windows-системах даёт странные эффекты — первое
проверяемое слово вызывает ошибку, которую нужно пропустить, и только потом всё
будет тип-топ. Простейший вариант правки: в строке №15 руками прописать вместо
_/usr/bin/ispell_ абсолютный путь к ispell на вашей системе. Но! Этим вы не
только добавите себе работы при следующем апдейте с CVS (а её и так немало у
тех, кто активно балуется ковырянием), но и сделаете необходимым менять пути и
в опциях, и в коде. Есть вариант другой.

Строки с 14 по 16

        #set options(executable) /usr/bin/ispell
        custom::defvar options(executable) /usr/bin/ispell \
    	[::msgcat::mc "Path to the ispell executable."] -group Ispell

заменяем на следующий код:

    #<PATCHED>
      if {![info exists ::plugins::ispell::options(executable)] \
          || [cequal $::plugins::ispell::options(executable)  ""]} {
            custom::defvar options(executable) /usr/bin/ispell \
            [::msgcat::mc "Path to the ispell executable."] -group Ispell
            } else {
            custom::defvar options(executable) $::plugins::ispell::options(executable) \
            [::msgcat::mc "Path to the ispell executable."] -group Ispell
            }
    #</PATCHED>

Всё работает как надо — берёт настройки из конфига и больше не ругается ;)

Автор патча — [**lknight**](Участник_Lknight.md).

## <a id="Нумерация_закладок"></a>Нумерация закладок
> _Внимание!_ Сразу скажем, что [**eXire**](Участник_EXire.md) реализовал этот патч
  в виде [**плагина**](Плагины.md#Tab_number). Однако для любителей ковыряться в
  коде оставляем описание необходимых действий.

Что хотелось получить? Возможно быстро (а не по одному) переключаться между
относительно большим количеством табов без использования мышки.

Как это должно выглядеть? Вот пример: ![Tkabber
num1.jpg](../images/Tkabber_num1.jpg)

---

Текущее (ужасное своей малой переносимостью, имхо) состояние системы.
Приводятся данные для версии ткаббера из цвс, за _"2005-10-12 Alexey Shchepin
`xmpp:alexey@sevcom.net`"._ Нам потребуется внести свои правки в 2 файла:

*  **\\chats.tcl**.

Находим 555-ю строку, с хуком:

    hook::run close_chat_post_hook $chatid

И вставляем после неё вызов функции

    ifacetk::lk_update_chat_titles

Всё, с этим файлом мы всё сделали. Теперь пора идти дальше.

*  **\\ifacetk\\iface.tcl**

Открываем это файл и находим в самом начале объявление _namespace'_а.

    namespace eval ifacetk {

Идём в самый его конец и дописываем туда нашу переменную:

    variable lk_index

*К слову сказать, префикс lk\_ имеют практически все переменные и функции,
чтобы их было легко потом найти ;)*

Далее находим ***proc ifacetk::on\_open\_chat\_window {chatid type} {*** И
делаем так, чтобы она и следующая дальше ***ifacetk::on\_close\_chat\_window***
выглядели так:

    proc ifacetk::on_open_chat_window {chatid type} {
       variable number_msg
       variable personal_msg
       variable lk_index

       set number_msg($chatid) 0
       set personal_msg($chatid) 0
       set lk_index($chatid) 0
    }

    proc ifacetk::on_close_chat_window {chatid} {
       variable number_msg
       variable personal_msg
       variable lk_index

       unset number_msg($chatid)
       unset personal_msg($chatid)
       unset lk_index($chatid)
    }

Далее ***proc ifacetk::update\_chat\_title {chatid} {*** Нужно привести в виду:

    proc ifacetk::update_chat_title {chatid} {
       global usetabbar
       variable options
       variable number_msg
       variable personal_msg
       variable lk_index

       set cw $chat::opened($chatid)

       if {$usetabbar} {
    	set tabtitle $chat::chats(tabtitlename,$chatid)
    	if {$options(message_numbers_in_tabs) && ($number_msg($chatid) > 0)} {
    	    append tabtitle " ($number_msg($chatid))"
    	}
        set tabtitle [format [::msgcat::mc "\[%s\] %s" $lk_index($chatid) $tabtitle]]
    	.nb itemconfigure [nbpage $cw] -text $tabtitle
       } else {
    	if {$personal_msg($chatid)} {
    	    set star "*"
    	} else {
    	    set star ""
    	}
    	if {$number_msg($chatid) > 0} {
    	    set title "($number_msg($chatid)$star) $chat::chats(titlename,$chatid)"
    	} else {
    	    set title $chat::chats(titlename,$chatid)
    	}
    	wm title $cw $title
    	wm iconname $cw $title
       }
    }

И сразу после неё вставить:

    proc ifacetk::lk_update_chat_titles {} {
        global usetabbar
        variable lk_index

        if {!$usetabbar} return
    		foreach tab [.nb pages] {
               if {[set path $tab] != ""} {
    		    set page [nbpage $path]
    		    if {[.nb index $page] < 0} {
    			set page $path
    			set path [pack slaves [.nb getframe $page]]

>





|
<

|
<
<
|
|
<
<
|
<
<
|
|
<
|
<
|
|
|
<
<
<









|

















|
<
|
<
<

|
<
<
<
<
<
<

|
<



|





|


|

|

|
|

|
<
<

|

|

|

|
<
|
<
<
<
<
<
<
<
<

|





|












|

|

|
<
|
<

|
<

|
<



|
<
<

|

|



|



|

|

|



|

|

|
<

|
<
<




|
|








|
|





|






|
|

|





|

















|



|
|







1
2
3
4
5
6
7
8

9
10


11
12


13


14
15

16

17
18
19



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

48


49
50






51
52

53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72


73
74
75
76
77
78
79
80

81








82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106

107

108
109

110
111

112
113
114
115


116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139

140
141


142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Патчи/index.html)


# Патчи

Материал из Tkabber Wiki

Здесь мы "замахнёмся" на исходные коды самой программы, а точнее — её модулей :) 


*  Короткие патчи в пару строк легко наложить самостоятельно, поискав в тексте модуля нужные строчки, поэтому и оформлять статью следует соответственно: просто указать, **что на что заменяется**. 


*  Патчи же покрупней имеет смысл выкладывать в виде файла различий some\_file\_name.diff, который можно получить, запустив в консоли или xterm команду diff. Соответственно, применять такой патч следует с помощью команды patch: 



1.  Сохранить или перекинуть уже скачанный файл патча patch.diff в каталог, где находится "патчуемый" и перейти туда (скорее всего, для этого и следующего действия вам потребуются права root). 


1.  Выполнить команду **patch -p0 \< patch.diff**. 
1.  Перезапустить Ткаббер и, если требуется, сходить в Настройки и подправить опции. 

1.  Создать патч можно командой **diff -u oldfile.tcl newfile.tcl > patch.diff** 

 *  Или же, если вы работаете над svn-версией файла, просто выполните **svn diff file.tcl > patch.diff** 
 
1.  Если вам посчастливилось работать в среде Windows, не отчаивайтесь: скачайте и установите виндовые версии программ [patch](http://gnuwin32.sourceforge.net/packages/patch.htm) и [diff.](http://gnuwin32.sourceforge.net/packages/diffutils.htm) 




## <a id="toc"></a>Содержание

* [1 Отправка сообщений по нажатию Ctrl-Enter](#Отправка_сообщений_по_нажатию_Ctrl-Enter)
* [2 Ispell в Windows, правка](#Ispell_в_Windows_правка)
* [3 Нумерация закладок](#Нумерация_закладок)
* [4 Добавление аватары в окно чата (старый хак Badlop'а)](#Добавление_аватары_в_окно_чата_старый_хак_Badlopа)
* [5 Расширенная поддержка аватар в окне чата](#Расширенная_поддержка_аватар_в_окне_чата)
* [6 Показ времени "ухода в эвей" в статусе auto-away](#Показ_времени_ухода_в_эвей_в_статусе_auto-away)
 * [6.1 Дополнительные настройки AutoAway](#Дополнительные_настройки_AutoAway)
* [7 Транспортные иконки для гейта MRIM и его контактов<s></s>](#Транспортные_иконки_для_гейта_MRIM_и_его_контактовs_s)
* [8 Расширенное управление приоритетами для auto-away и auto-xa](#Расширенное_управление_приоритетами_для_auto-away_и_auto-xa)
* [9 Поиск в Дискавери<s></s>](#Поиск_в_Дискавериs_s)
* [10 Подтверждение при закрытии табов<s></s>](#Подтверждение_при_закрытии_табовs_s)
* [11 Выборочное управление посылкой уведомлений о событиях чата](#Выборочное_управление_посылкой_уведомлений_о_событиях_чата)
* [12 Поддержка ссылок в окне истории](#Поддержка_ссылок_в_окне_истории)
* [13 Выбор между старым и новым видом окна userinfo](#Выбор_между_старым_и_новым_видом_окна_userinfo)
* [14 Звуки в играх<s></s>](#Звуки_в_играхs_s)
* [15 Улучшенная поддержка XHTML](#Улучшенная_поддержка_XHTML)
* [16 Публикация проигрываемой мелодии при помощи запуска Ткаббера с ключом -pep](#Публикация_проигрываемой_мелодии_при_помощи_запуска_Ткаббера_с_ключом_-pep)
* [17 Отображение доступных контактов сверху списка](#Отображение_доступных_контактов_сверху_списка)
* [18 Звук на установленные к наблюдению в Шпионе jid'ы](#Звук_на_установленные_к_наблюдению_в_Шпионе_jidы)
* [19 Отключение смены значка в трее при получени прочих сообщений в конференции](#Отключение_смены_значка_в_трее_при_получени_прочих_сообщений_в_конференции)
* [20 Группы-исключения для показа в них сообщений сервера, когда соответствующая опция выключена](#Группы-исключения_для_показа_в_них_сообщений_сервера_когда_соответствующая_опция_выключена)
* [21 Включение подсветки (highlight) всего сообщения при обращении к вам в конференции<s></s>](#Включение_подсветки_highlight_всего_сообщения_при_обращении_к_вам_в_конференцииs_s)
* [22 Кнопка очистки фильтра ростера](#Кнопка_очистки_фильтра_ростера)

# <a id="Отправка_сообщений_по_нажатию_Ctrl-Enter"></a>Отправка сообщений по нажатию Ctrl-Enter

 _Внимание!_ Существует решение, не требующее патча — [настройка в конфиг](Нетривиальные_настройки.md#Отправка_сообщений_нажатием_Ctrl-Enter). Поскольку она потенциально значительно надёжнее патча, рекомендуется использовать её. 



Многие IM-программы отсылают сообщения по нажатию Ctrl-Enter, а сам Enter используют для перевода строки, вместо или вместе с Shift-Enter. В Ткаббере сообщения отсылаются по нажатию Enter, что и само по себе не очень удобно (если вам хочется сделать в сообщении несколько абзацев, придётся нажать несколько раз Shift-Enter и только один раз — Enter). А уж если вы пересаживаетесь на Ткаббер с другой программы, то эта разница в простых вроде бы действиях и вовсе может свести с ума. К счастью, проблема решается буквально за 5 минут. 







Откройте файл **chats.tcl**, что лежит в главной директории, в вашем любимом текстовом редакторе и найдите строку: 


    bind $cw.input <Shift-Key-Return> { }

Видите, сразу за ней идёт блок: 

       bind $cw.input <Key-Return> [double% "
           chat::send_message [list $cw] [list $chatid] [list $type]
           break"]

Теперь вам нужно немного всё поменять :) Вместо этих двух биндов сделайте так: 

       bind $cw.input <Shift-Key-Return> { }
    
       bind $cw.input <Key-Return> { }
    
       bind $cw.input <Control-Key-Return> [double% "
    	chat::send_message [list $cw] [list $chatid] [list $type]
    	break"]

Фактически вы сделали просто перевод каретки (переход на следующую строку) как по нажатию на Enter, так и по нажатию на Shift-Enter, а привычный для многих Ctrl-Enter теперь будет отсылать сообщения. 



_P.S. Лучшая документация — это исходники._ 

была тут галерея, но глюк случился. 

Автор патча — [Участник:lknight](Участник_Lknight.md). 

# <a id="Ispell_в_Windows_правка"></a>Ispell в Windows, правка

Сделав всё в соответствии с [документацией](http://sgolovan.nes.ru/jabber/Tkabber-Windows-Mini-Howto.html) от `xmpp:sgolovan@nes.ru` (teo), мы получаем в _$rootdir\\PLUGINS\\WINDOWS\\_ файл ispell.tcl, который на Windows-системах даёт странные эффекты — первое проверяемое слово вызывает ошибку, которую нужно пропустить, и только потом всё будет тип-топ. Простейший вариант правки: в строке №15 руками прописать вместо _/usr/bin/ispell_ абсолютный путь к ispell на вашей системе. Но! Этим вы не только добавите себе работы при следующем апдейте с CVS (а её и так немало у тех, кто активно балуется ковырянием), но и сделаете необходимым менять пути и в опциях, и в коде. Есть вариант другой. 









Строки с 14 по 16 

        #set options(executable) /usr/bin/ispell
        custom::defvar options(executable) /usr/bin/ispell \
    	[::msgcat::mc "Path to the ispell executable."] -group Ispell

заменяем на следующий код: 

    #<PATCHED>
      if {![info exists ::plugins::ispell::options(executable)] \
          || [cequal $::plugins::ispell::options(executable)  ""]} {
            custom::defvar options(executable) /usr/bin/ispell \
            [::msgcat::mc "Path to the ispell executable."] -group Ispell
            } else {
            custom::defvar options(executable) $::plugins::ispell::options(executable) \
            [::msgcat::mc "Path to the ispell executable."] -group Ispell
            }
    #</PATCHED>

Всё работает как надо — берёт настройки из конфига и больше не ругается ;) 

Автор патча — [Участник:lknight](Участник_Lknight.md). 

# <a id="Нумерация_закладок"></a>Нумерация закладок

 _Внимание!_ Сразу скажем, что [eXire](Участник_EXire.md) реализовал этот патч в виде [плагина](Плагины.md#Tab_number). Однако для любителей ковыряться в коде оставляем описание необходимых действий. 


Что хотелось получить? Возможно быстро (а не по одному) переключаться между относительно большим количеством табов без использования мышки.  


Как это должно выглядеть? Вот пример: ![Tkabber num1.jpg](../images/Tkabber_num1.jpg) 


---

Текущее (ужасное своей малой переносимостью, имхо) состояние системы. Приводятся данные для версии ткаббера из цвс, за _"2005-10-12 Alexey Shchepin `xmpp:alexey@sevcom.net`"._ Нам потребуется внести свои правки в 2 файла: 



*  **\\chats.tcl**. 

Находим 555-ю строку, с хуком: 

    hook::run close_chat_post_hook $chatid

И вставляем после неё вызов функции 

    ifacetk::lk_update_chat_titles

Всё, с этим файлом мы всё сделали. Теперь пора идти дальше. 

*  **\\ifacetk\\iface.tcl**  

Открываем это файл и находим в самом начале объявление _namespace'_а. 

    namespace eval ifacetk {

Идём в самый его конец и дописываем туда нашу переменную: 

    variable lk_index	

_К слову сказать, префикс lk\_ имеют практически все переменные и функции, чтобы их было легко потом найти ;)_ 


Далее находим _**proc ifacetk::on\_open\_chat\_window {chatid type} {**_ И делаем так, чтобы она и следующая дальше _**ifacetk::on\_close\_chat\_window**_ выглядели так: 



    proc ifacetk::on_open_chat_window {chatid type} {
       variable number_msg
       variable personal_msg
       variable lk_index	
    
       set number_msg($chatid) 0
       set personal_msg($chatid) 0
       set lk_index($chatid) 0
    }

    proc ifacetk::on_close_chat_window {chatid} {
       variable number_msg
       variable personal_msg
       variable lk_index	
    
       unset number_msg($chatid)
       unset personal_msg($chatid)
       unset lk_index($chatid)
    }

Далее _**proc ifacetk::update\_chat\_title {chatid} {**_ Нужно привести в виду: 

    proc ifacetk::update_chat_title {chatid} {
       global usetabbar
       variable options
       variable number_msg
       variable personal_msg
       variable lk_index	
    
       set cw $chat::opened($chatid)
    
       if {$usetabbar} {
    	set tabtitle $chat::chats(tabtitlename,$chatid)
    	if {$options(message_numbers_in_tabs) && ($number_msg($chatid) > 0)} {
    	    append tabtitle " ($number_msg($chatid))"
    	}
        set tabtitle [format [::msgcat::mc "\[%s\] %s" $lk_index($chatid) $tabtitle]] 
    	.nb itemconfigure [nbpage $cw] -text $tabtitle
       } else {
    	if {$personal_msg($chatid)} {
    	    set star "*"
    	} else {
    	    set star ""
    	}
    	if {$number_msg($chatid) > 0} {
    	    set title "($number_msg($chatid)$star) $chat::chats(titlename,$chatid)"
    	} else {
    	    set title $chat::chats(titlename,$chatid)
    	}
    	wm title $cw $title
    	wm iconname $cw $title
       }
    }

И сразу после неё вставить: 

    proc ifacetk::lk_update_chat_titles {} {
        global usetabbar
        variable lk_index	
    
        if {!$usetabbar} return
    		foreach tab [.nb pages] {
               if {[set path $tab] != ""} {
    		    set page [nbpage $path]
    		    if {[.nb index $page] < 0} {
    			set page $path
    			set path [pack slaves [.nb getframe $page]]
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589

590
591
592
593
594
595
596
    			    set lk_index($chatid) $lk_var
    			    update_chat_title $chatid
                   }
                 }
             }
    }

И наконец, находим строку ***proc ifacetk::tab\_set\_updated {path {updated 0} {level ""}} {***
Добавляем после 6-й строки этой функции (*variable personal\_msg*)

    variable lk_index

Находим в этой же функции строку ***if {[info exists chat::chat\_id($path)]} {*** Приводим этот абзац к виду:

       set lk_var [expr [.nb index $page] + 1]
       if {[info exists chat::chat_id($path)]} {
    	if {!$updated || ($lvlnum == 0)} {
    	    set chatid $chat::chat_id($path)
    	    set number_msg($chatid) 0
    	    set personal_msg($chatid) 0
    	    set lk_index($chatid) $lk_var
    	    update_chat_title $chatid
    	    update_main_window_title
    	}
       }

Автор патча — [**lknight**](Участник_Lknight.md).

## <a id="Добавление_аватары_в_окно_чата_старый_хак_Badlopа"></a>Добавление аватары в окно чата (старый хак Badlop'а)
Если ваш собеседник имеет подключённую аватару, вы можете видеть её не только
на соответствующей вкладке в персональной информации, но и в окошке чата в
правом нижнем углу — непосредственно во время разговора. Добиться этого, как
оказывается, очень просто. Откройте файл **C:\\Program
Files\\Tkabber\\tkabber\\chats.tcl** (**/usr/lib/tkabber/chats.tcl**), найдите
строку:

    pack $cw.isw -fill both -expand yes -side bottom -in $dow

закомментируйте её и вставьте следующие четыре строки (**для версий 0.9.8 -
0.11.0 (включительно)**):

    pack $cw.isw -expand yes -fill both -side left -in $dow
    set avatar_img [avatar::get_image $connid [get_jid_of_user $connid $jid]]
    label $cw.avatar -image $avatar_img
    pack $cw.avatar -side right -in $dow

для версий **больше 0.11.0**:

    pack $cw.isw -expand yes -fill both -side left -in $dow
    set avatar_img [avatar::get_image $xlib [get_jid_of_user $xlib $jid]]
    label $cw.avatar -image $avatar_img
    pack $cw.avatar -side right -in $dow

Если вы используете **версию 0.9.7**, надо вставить другие четыре строчки, вот
эти:

    pack $cw.isw -expand yes -fill both -side left -in $dow
    set avatar_img [avatar::get_image [get_jid_of_user $connid $jid]]
    label $cw.avatar -image $avatar_img
    pack $cw.avatar -side right -in $dow

Обратите внимание — вся разница между версиями во второй строке, точнее даже
буквально в одном слове.

Чтобы не приходилось каждый раз лезть в код, когда захочется включить аватару
или выключить (через Настройки, к примеру, или по нажатию горячей клавиши),
можете [скачать](http://prikhodko.googlepages.com/tkabber) специально
заточенную под это дело версию Старпака от `xmpp:archimed@jabber.ru`.

*  В окно chat добавлен показ аватара собеседника (hack from badlop).
*  По умолчанию эта возможность выключена (по настоянию kostix и teo).
*  Включается через настройки в разделе Chat.

Информация о хаке [взята](http://tkabber.redlibre.org/?q=node/2) с испанского
сайта, посвящённого Ткабберу —
[http://tkabber.redlibre.org](http://tkabber.redlibre.org)

## <a id="Расширенная_поддержка_аватар_в_окне_чата"></a>Расширенная поддержка аватар в окне чата
Основные расширения:

1.  анимированные аватары;
1.  прозрачность в аватарах;
1.  масштабирование аватар к размеру видимой области.

В [*этом файле*](../files/Aniavatars.zip) находятся изменённые файлы **chat.tcl**
и **anigif.tcl**. Замените ими соответствующие файлы в Ткаббере (не забудьте
сделать резервную копию). По умолчанию опция показа аватары в окне чата
выключена. Включить можно в настройках в разделе Chat.

Также в архиве найдёте пример анимированного gif. Напоминаю, что Ткаббер
поддерживает только аватары в формате gif.

Если вы подключите анимированную аватару в качестве своей, то Ткаббер без этого
патча покажет лишь первый кадр анимации. Но покажет! Так что, не бойтесь
экспериментировать.

С благодарностью или негодованием обращаться к [**Archimed**](Участник_Archimed.md)
(`xmpp:archimed@jabber.ru`).

## <a id="Показ_времени_ухода_в_эвей_в_статусе_auto-away"></a>Показ времени "ухода в эвей" в статусе auto-away
> _Внимание!_ Патч уже не прикладывается без ошибок к версии 0.11.0.
  Править его всем лень.

Патч [**тут**](../files/Autoaway.diff). Как накладывать, читайте в самом начале
данной страницы (перед "Содержанием").

**На заметку:** после установки пропишите путь до каталога, в который вы
поставили **patch,** + **"\\bin"** в переменную окружения **PATH.** Например,
если ставили в

    C:\Program Files\GnuWin32

то путь должен быть

    C:\Program Files\GnuWin32\bin

Тогда можно будет запускать **patch** как написано выше — не указывая полный
путь до неё.

### <a id="Дополнительные_настройки_AutoAway"></a>Дополнительные настройки AutoAway

    ::plugins::autoaway::options(status)

Теперь специальный токен **%T** в этой строке раскрывается в значение времени,
которое было на момент начала ухода в эвей.

    ::plugins::autoaway::options(time_format)

Задаёт формат времени для "раскрытия" токена **%T**.

Это — формат для команды тикля **[clock format].** За описанием —
[сюда](http://purl.org/tcl/home/man/tcl8.4/TclCmd/clock.htm).

К примеру, "%H:%M:%S" (оно же "%T") раскрывается в нечто вроде "15:30:25".

    ::plugins::autoaway::options(time_is_gmt)

Указывает, что время будет форматироваться в формате GMT (Greenwich Mean Time).
Если опция выключена (**false**), то время форматируется согласно локальной
временной зоне.

Предложения и вопросы — к [**kostix**](Участник_Kostix.md).

## <a id="Транспортные_иконки_для_гейта_MRIM_и_его_контактовs_s"></a>Транспортные иконки для гейта MRIM и его контактов<s></s>
> [**Kostix**](Участник_Kostix.md) 03:28, 11 сентября 2006 (MSD) Иконки гейта MRIM
  — в транке начиная со вчерашнего дня, так что патч практически неактуален.
  Кроме того, работа с транспортными иконками была сильно доработана — они
  теперь выясняются не на основе имени хоста гейта, а на основе ответа на
  запрос `disco#info` от него. Также исправлен баг с исчезающими транспортными
  иконками в окне чата при смене статуса контакта. Короче, всем желающим
  MRIM-иконок лучше заиметь себе последнюю версию из Subversion.

Патч добавляет в _основной (он же "дефолтный", он же "по умолчанию")_ пакет
иконок "транспортные" иконки для гейта MRIM (Mail.RU Instant Messenger) и
контактов на нём. То есть вместо стандартных иконок "enlightened feather"
(лампочка с пером) будет майлрушное "калисо" (по меткому выражению **zenith**,
— автора MRIM-гейта).

Поддерживаются и отображаются состояния "доступен", "отошёл" и "недоступен";
состояния "не беспокоить" и "отошёл давно" не поддерживаются Mail.RU IM'ом и
отображаются гейтом на "отошёл", зато его состояние "invisible" не
поддерживается Джаббером и отображается гейтом на "недоступен".

Выглядит так: ![Mrim.png](../images/Mrim.png)
![Mrim-away.png](../images/Mrim-away.png)

Патч — [*тут*](../files/Tkabber-MRIM.zip).

Прикладывать так.

Во-первых, распаковать; в месте распаковки появится такая структура:

    roster.diff
    pixmaps/
     default/
      icondef.diff
      services/
       mrim_*.gif

Она соответствует расположению файлов в каталоге Ткаббера, поэтому дальнейшие действия такие:

1. Скопировать все файлы **mrim\_\*.gif** из **pixmaps/default/services** в
   такой же каталог Ткаббера.
1. Приложть патч **icondef.diff** на **pixmaps/default/icondef.xml** в каталоге
   Ткаббера.
1. Приложить патч **roster.diff** на **roster.tcl** в каталоге Ткаббера.

Можно также сначала просто скопировать все файлы из того места, куда вы их
распаковали, в каталог Ткаббера. Тогда иконки лягут в нужный каталог, а
diff-файлы лягут рядом с теми файлами, патчами на которые они являются.

Процесс наложения патча описан в самом верху этой страницы (перед
"Содержанием").

Перезапустить Ткаббер, убедиться, что включены опции

    ::ifacetk::roster::show_transport_icons

(для самого гейта) и

    ::ifacetk::roster::show_transport_user_icons

(для контактов на нём) по желанию.

Предложения и вопросы — к [**kostix**](Участник_Kostix.md).

## <a id="Расширенное_управление_приоритетами_для_auto-away_и_auto-xa"></a>Расширенное управление приоритетами для auto-away и auto-xa
Данный [**патч**](../files/Autoaway-ext-prios.diff) наделяет плагин AutoAway
следующими возможностями:

*  Раздельное управление изменением приоритета ресурса для состояний auto-away
   и auto-xa;
*  Возможность вручную задать значение приоритета для каждого из этих
   состояний.

Патч предназначен для тестирования идеи об автоматическом изменении приоритетов
различных копий Ткаббера (к примеру, одна запущена на работе, другая — дома).
Суть идеи: сконфигурировать такую систему приоритетов, которая позволит
максимально "осмысленно" направлять сообщения на различные копии Ткабберов по
мере того, как хозяин последних перемещается между ними. Понятно? Мне тоже
непонятно...

Подробно о зависимости поведении сервера от приоритетов нескольких подключений
к одному аккаунту читайте [здесь](http://www.xmpp.org/specs/rfc3921.html#rules)
(поищите по слову "priority").

Патчить нужно файл **plugins/general/autoaway.tcl**. Процесс наложения патча
описан в самом верху этой страницы (перед "Содержанием").

Предложения и вопросы — к [**kostix**](Участник_Kostix.md).

**NB:** патч создан против версии 0.9.9-1.2 (CVS).

**Примечание:** эти изменения приоритетов работают только при _автоматическом_
изменении статуса (т.е. когда статус пользователя меняется плагином AutoAway);
при смене статуса вручную никакого изменения приоритета не происходит.

## <a id="Поиск_в_Дискавериs_s"></a>Поиск в Дискавери<s></s>
<s>Версия первая, наколенная. Патч не предназначен для использования, хотя и
работает. Это так, пусть пока полежит :) Смотреть
[**тут**](../files/Disco-search.diff).</s>

[**Kostix**](Участник_Kostix.md) 03:21, 11 сентября 2006 (MSD) — поиск в
дискавери уже месяц как в транке. так что  этот патч уже совершенно неактуален
и будет удалён.

[**Kostix**](Участник_Kostix.md) 21:09, 18 сентября 2006 (MSD) — с другой
стороны, этот патч содержит код для прозрачной привязки виртуальных событий к
топлевелам (в no-tabbed mode) или к единственному топлевелу + передача события
в активный фрейм ноутбука (в tabbed mode), который надо бы отодрать и
присовокупить к транку.

## <a id="Подтверждение_при_закрытии_табовs_s"></a>Подтверждение при закрытии табов<s></s>
<s>Патч: [**Confirm.patch**](../files/Confirm.patch)</s>

**Неактуально. Есть [плагин](Плагины.md#Confirm).**

## <a id="Выборочное_управление_посылкой_уведомлений_о_событиях_чата"></a>Выборочное управление посылкой уведомлений о событиях чата
> _Внимание!_ Этот патч был сделан для борьбы с кривизной ICQ-гейта "JIT",
  который посылал ошибку в ответ на события чата; и эта ошибка показывалась в
  окне чата, как относящаяся к нему. Начиная с версии 0.10.0 Ткаббер содержит
  код, который устаняет подобную проблему другим способом.

[*Этот патч (+ плагин)*](../files/Chatstatectl.zip) позволяет
выключать/включать посылку уведомлений о событиях чата (chat state
notifications) для любого окна чата (т.е. для любого контакта, с которым открыт
сеанс чата).

Управление настройкой — флаг "Enable chat state notifications" в меню окна
чата.

Новая настройка "перекрывает" глобальную опцию
`::plugins::chatstate::options(enable)`. Значение локальной настройки
инициализируется значением глобальной опции при открытии окна чата.

Цель данной функциональности — обход багов, возникающих при работе с некоторыми
"ненативными" IM-сетями через соответствующие гейты. В основном, проблемы
возникают с различными ICQ-клиентами (печально знаменитое сообщение `"400
(Empty SMS messages are forbidden)"` в качестве реакции на любую активность в
окне чата и его закрытие).

Архив содержит каталог с плагином, который требуется положить в
**~/.tkabber/plugins**, и патч **chatstate.tcl.diff**, который следует положить
в tkabber/plugins/chat и запустить

    patch <chatstate.tcl.diff

После перезапуска Ткаббера в меню окна чата становится доступен флаг "Enable
chat state notifications".

Вопросы и пожелания слать [**Kostix**](Участник_Kostix.md).

**Примечание:** возможно сделать авто-запрещение посылки нотификаций для
выбранных JID'ов, например, вот так можно запретить нотификации для всех
контактов на ICQ-гейте:

Впишите в свой **config.tcl** вне хуков вот этот кусок кода:

    proc icq_must_die {w connid jid} {
      if {[regexp {@icq\.} $jid]} {
        set ::plugins::chatstate::options(enable,$jid) 0
      }
    }

    hook::add chat_create_user_menu_hook icq_must_die

Он отключает нотификации для любого джида, содержащего подстроку "@icq.", то
есть, к примеру `666777@icq.jabber.ru` и так далее.

## <a id="Поддержка_ссылок_в_окне_истории"></a>Поддержка ссылок в окне истории
Данный [**патч**](../files/Logger.patch) добавляет поддержку ссылок (которая
присутствует в окне чата) в окно истории. С вопросами и пожеланиями к
[**eXire**](Участник_EXire.md).

## <a id="Выбор_между_старым_и_новым_видом_окна_userinfo"></a>Выбор между старым и новым видом окна userinfo
Справедливо для svn-версии.

[**Патч**](../files/Userinfo.patch). Настройки в **Customize → Main Interface**.

## <a id="Звуки_в_играхs_s"></a>Звуки в играх<s></s>
<s>[*Патчи*](../files/Sound_patches.tar.gz) к играм. Так же нужно накатить
патч, который тоже находится в этом архиве, на файл
plugins/general/sound.tcl.</s>

В транке с 27.09.06.

## <a id="Улучшенная_поддержка_XHTML"></a>Улучшенная поддержка XHTML
Данный патч предназначен для улучшения отображения XHTML сообщений.
Протестирован с Gaim (Pidgin) и Adium и (частично) XEP-0071. Накладывать
заплатку нужно на файл tkabber/plugins/chat/draw\_xhtml\_message.tcl


    --- draw_xhtml_message.orig.tcl	2007-05-25 13:05:18.000000000 +0400
    +++ draw_xhtml_message.tcl	2007-06-05 12:31:32.000000000 +0400
    @@ -336,6 +336,32 @@
     	    color {
     		set state(color) $val
     	    }
    +	    font-style {







<
|

|

|













|

|
|
<
<
<
<
<



|
<






|






|
<






|
<

|
<
<
<

|
|
|

|
<
<

|
|

|
|
|

<
|
<
<

|
<

|
<
<

|
<

|
|
<

|
<

|
<
<



|



|
<

|



|
<



|

|
<

|



|
<
<

|

|
<
|
<
<
<
<
<

|
<
<
<
<

|
<
<
<

|
<

|

|

|








|

|
<
|
<
|

|
<
<

|
<

|



|



|

|

|
|
<

|
<
|
<

|
<
<
<
<
<

|
<
<

|
<

|

|

|
<
<

|
|
<
<

<
|
<

<
|
<
<
<

|
|

|

|
|
<
<
<

<
|
<
<

|
<

|
<
<

|
<
<
<
<
|
<
<
<
<

|
|
<

|

|
<
<

|






|


|
<

|
<
|
<

|
|

|

|
<
|
<

|

|
|
<
<
|
>







218
219
220
221
222
223
224

225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246





247
248
249
250

251
252
253
254
255
256
257
258
259
260
261
262
263
264

265
266
267
268
269
270
271

272
273



274
275
276
277
278
279


280
281
282
283
284
285
286
287

288


289
290

291
292


293
294

295
296
297

298
299

300
301


302
303
304
305
306
307
308
309

310
311
312
313
314
315

316
317
318
319
320
321

322
323
324
325
326
327


328
329
330
331

332





333
334




335
336



337
338

339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355

356

357
358
359


360
361

362
363
364
365
366
367
368
369
370
371
372
373
374
375
376

377
378

379

380
381





382
383


384
385

386
387
388
389
390
391


392
393
394


395

396

397

398



399
400
401
402
403
404
405
406



407

408


409
410

411
412


413
414




415




416
417
418

419
420
421
422


423
424
425
426
427
428
429
430
431
432
433
434

435
436

437

438
439
440
441
442
443
444

445

446
447
448
449
450


451
452
453
454
455
456
457
458
459
    			    set lk_index($chatid) $lk_var
    			    update_chat_title $chatid
                   }
                 }
             }
    }


И наконец, находим строку _**proc ifacetk::tab\_set\_updated {path {updated 0} {level ""}} {**_ Добавляем после 6-й строки этой функции (_variable personal\_msg_) 

    variable lk_index	

Находим в этой же функции строку _**if {[info exists chat::chat\_id($path)]} {**_ Приводим этот абзац к виду: 

       set lk_var [expr [.nb index $page] + 1]
       if {[info exists chat::chat_id($path)]} {
    	if {!$updated || ($lvlnum == 0)} {
    	    set chatid $chat::chat_id($path)
    	    set number_msg($chatid) 0
    	    set personal_msg($chatid) 0
    	    set lk_index($chatid) $lk_var
    	    update_chat_title $chatid
    	    update_main_window_title
    	}
       }

Автор патча — [Участник:lknight](Участник_Lknight.md). 

# <a id="Добавление_аватары_в_окно_чата_старый_хак_Badlopа"></a>Добавление аватары в окно чата (старый хак Badlop'а)
Если ваш собеседник имеет подключённую аватару, вы можете видеть её не только на соответствующей вкладке в персональной информации, но и в окошке чата в правом нижнем углу — непосредственно во время разговора. Добиться этого, как оказывается, очень просто. Откройте файл **C:\\Program Files\\Tkabber\\tkabber\\chats.tcl** (**/usr/lib/tkabber/chats.tcl**), найдите строку: 






    pack $cw.isw -fill both -expand yes -side bottom -in $dow

закомментируйте её и вставьте следующие четыре строки (**для версий 0.9.8 - 0.11.0 (включительно)**): 


    pack $cw.isw -expand yes -fill both -side left -in $dow
    set avatar_img [avatar::get_image $connid [get_jid_of_user $connid $jid]]
    label $cw.avatar -image $avatar_img
    pack $cw.avatar -side right -in $dow

для версий **больше 0.11.0**: 

    pack $cw.isw -expand yes -fill both -side left -in $dow
    set avatar_img [avatar::get_image $xlib [get_jid_of_user $xlib $jid]]
    label $cw.avatar -image $avatar_img
    pack $cw.avatar -side right -in $dow

Если вы используете **версию 0.9.7**, надо вставить другие четыре строчки, вот эти: 


    pack $cw.isw -expand yes -fill both -side left -in $dow
    set avatar_img [avatar::get_image [get_jid_of_user $connid $jid]]
    label $cw.avatar -image $avatar_img
    pack $cw.avatar -side right -in $dow

Обратите внимание — вся разница между версиями во второй строке, точнее даже буквально в одном слове. 


Чтобы не приходилось каждый раз лезть в код, когда захочется включить аватару или выключить (через Настройки, к примеру, или по нажатию горячей клавиши), можете [скачать](http://prikhodko.googlepages.com/tkabber) специально заточенную под это дело версию Старпака от `xmpp:archimed@jabber.ru`. 




*  В окно chat добавлен показ аватара собеседника (hack from badlop). 
*  По умолчанию эта возможность выключена (по настоянию kostix и teo). 
*  Включается через настройки в разделе Chat. 

Информация о хаке [взята](http://tkabber.redlibre.org/?q=node/2) с испанского сайта, посвящённого Ткабберу — [http://tkabber.redlibre.org](http://tkabber.redlibre.org) 



# <a id="Расширенная_поддержка_аватар_в_окне_чата"></a>Расширенная поддержка аватар в окне чата
Основные расширения: 

1.  анимированные аватары; 
1.  прозрачность в аватарах; 
1.  масштабирование аватар к размеру видимой области. 


В [этом файле](../files/Aniavatars.zip) находятся изменённые файлы **chat.tcl**  и **anigif.tcl**. Замените ими соответствующие файлы в Ткаббере (не забудьте сделать резервную копию). По умолчанию опция показа аватары в окне чата выключена. Включить можно в настройках в разделе Chat. 



Также в архиве найдёте пример анимированного gif. Напоминаю, что Ткаббер поддерживает только аватары в формате gif. 


Если вы подключите анимированную аватару в качестве своей, то Ткаббер без этого патча покажет лишь первый кадр анимации. Но покажет! Так что, не бойтесь экспериментировать. 



С благодарностью или негодованием обращаться к [Archimed](Участник_Archimed.md) (`xmpp:archimed@jabber.ru`). 


# <a id="Показ_времени_ухода_в_эвей_в_статусе_auto-away"></a>Показ времени "ухода в эвей" в статусе auto-away
 _Внимание!_ Патч уже не прикладывается без ошибок к версии 0.11.0. Править его всем лень. 


Патч [тут](../files/Autoaway.diff). Как накладывать, читайте в самом начале данной страницы (перед "Содержанием"). 


**На заметку:** после установки пропишите путь до каталога, в который вы поставили **patch,** + **"\\bin"** в переменную окружения **PATH.** Например, если ставили в 



    C:\Program Files\GnuWin32

то путь должен быть 

    C:\Program Files\GnuWin32\bin

Тогда можно будет запускать **patch** как написано выше — не указывая полный путь до неё. 


## <a id="Дополнительные_настройки_AutoAway"></a>Дополнительные настройки AutoAway

    ::plugins::autoaway::options(status)

Теперь специальный токен **%T** в этой строке раскрывается в значение времени, которое было на момент начала ухода в эвей. 


    ::plugins::autoaway::options(time_format)

Задаёт формат времени для "раскрытия" токена **%T**. 

Это — формат для команды тикля **[clock format].** За описанием — [сюда](http://purl.org/tcl/home/man/tcl8.4/TclCmd/clock.htm). 


К примеру, "%H:%M:%S" (оно же "%T") раскрывается в нечто вроде "15:30:25". 

    ::plugins::autoaway::options(time_is_gmt)

Указывает, что время будет форматироваться в формате GMT (Greenwich Mean Time). Если опция выключена (**false**), то время форматируется согласно локальной временной зоне. 



Предложения и вопросы — к [kostix](Участник_Kostix.md). 

# <a id="Транспортные_иконки_для_гейта_MRIM_и_его_контактовs_s"></a>Транспортные иконки для гейта MRIM и его контактов<s></s>

 [Kostix](Участник_Kostix.md) 03:28, 11 сентября 2006 (MSD) Иконки гейта MRIM — в транке начиная со вчерашнего дня, так что патч практически неактуален. Кроме того, работа с транспортными иконками была сильно доработана — они теперь выясняются не на основе имени хоста гейта, а на основе ответа на запрос `disco#info` от него. Также исправлен баг с исчезающими транспортными иконками в окне чата при смене статуса контакта. Короче, всем желающим MRIM-иконок лучше заиметь себе последнюю версию из Subversion. 






Патч добавляет в _основной (он же "дефолтный", он же "по умолчанию")_ пакет иконок "транспортные" иконки для гейта MRIM (Mail.RU Instant Messenger) и контактов на нём. То есть вместо стандартных иконок "enlightened feather" (лампочка с пером) будет майлрушное "калисо" (по меткому выражению **zenith**, — автора MRIM-гейта). 





Поддерживаются и отображаются состояния "доступен", "отошёл" и "недоступен"; состояния "не беспокоить" и "отошёл давно" не поддерживаются Mail.RU IM'ом и отображаются гейтом на "отошёл", зато его состояние "invisible" не поддерживается Джаббером и отображается гейтом на "недоступен". 




Выглядит так: ![Mrim.png](../images/Mrim.png) ![Mrim-away.png](../images/Mrim-away.png) 


Патч — [тут](../files/Tkabber-MRIM.zip). 

Прикладывать так. 

Во-первых, распаковать; в месте распаковки появится такая структура: 

    roster.diff
    pixmaps/
     default/
      icondef.diff
      services/
       mrim_*.gif

Она соответствует расположению файлов в каталоге Ткаббера, поэтому дальнейшие действия такие: 

1.  Скопировать все файлы **mrim\_\*.gif** из **pixmaps/default/services** в такой же каталог Ткаббера. 

1.  Приложть патч **icondef.diff** на **pixmaps/default/icondef.xml** в каталоге Ткаббера. 

1.  Приложить патч **roster.diff** на **roster.tcl** в каталоге Ткаббера. 

Можно также сначала просто скопировать все файлы из того места, куда вы их распаковали, в каталог Ткаббера. Тогда иконки лягут в нужный каталог, а diff-файлы лягут рядом с теми файлами, патчами на которые они являются. 



Процесс наложения патча описан в самом верху этой страницы (перед "Содержанием"). 


Перезапустить Ткаббер, убедиться, что включены опции 

    ::ifacetk::roster::show_transport_icons

(для самого гейта) и 

    ::ifacetk::roster::show_transport_user_icons

(для контактов на нём) по желанию. 

Предложения и вопросы — к [Участник:kostix](Участник_Kostix.md). 

# <a id="Расширенное_управление_приоритетами_для_auto-away_и_auto-xa"></a>Расширенное управление приоритетами для auto-away и auto-xa
Данный [патч](../files/Autoaway-ext-prios.diff) наделяет плагин AutoAway следующими возможностями: 


*  Раздельное управление изменением приоритета ресурса для состояний auto-away и auto-xa; 

*  Возможность вручную задать значение приоритета для каждого из этих состояний. 


Патч предназначен для тестирования идеи об автоматическом изменении приоритетов различных копий Ткаббера (к примеру, одна запущена на работе, другая — дома). Суть идеи: сконфигурировать такую систему приоритетов, которая позволит максимально "осмысленно" направлять сообщения на различные копии Ткабберов по мере того, как хозяин последних перемещается между ними. Понятно? Мне тоже непонятно... 






Подробно о зависимости поведении сервера от приоритетов нескольких подключений к одному аккаунту читайте [здесь](http://www.xmpp.org/specs/rfc3921.html#rules) (поищите по слову "priority"). 



Патчить нужно файл **plugins/general/autoaway.tcl**. Процесс наложения патча описан в самом верху этой страницы (перед "Содержанием"). 


Предложения и вопросы — к [Участник:kostix](Участник_Kostix.md). 

**NB:** патч создан против версии 0.9.9-1.2 (CVS). 

**Примечание:** эти изменения приоритетов работают только при _автоматическом_ изменении статуса (т.е. когда статус пользователя меняется плагином AutoAway); при смене статуса вручную никакого изменения приоритета не происходит. 



# <a id="Поиск_в_Дискавериs_s"></a>Поиск в Дискавери<s></s>
<s>Версия первая, наколенная. Патч не предназначен для использования, хотя и работает. Это так, пусть пока полежит :) Смотреть [тут](../files/Disco-search.diff).</s> 




[Kostix](Участник_Kostix.md) 03:21, 11 сентября 2006 (MSD) — поиск в дискавери уже месяц как в транке. так что  этот патч уже совершенно неактуален и будет удалён. 



[Kostix](Участник_Kostix.md) 21:09, 18 сентября 2006 (MSD) — с другой стороны, этот патч содержит код для прозрачной привязки виртуальных событий к топлевелам (в no-tabbed mode) или к единственному топлевелу + передача события в активный фрейм ноутбука (в tabbed mode), который надо бы отодрать и присовокупить к транку. 




# <a id="Подтверждение_при_закрытии_табовs_s"></a>Подтверждение при закрытии табов<s></s>
<s>Патч: [Media:confirm.patch](../files/Confirm.patch)</s> 

**Неактуально. Есть [плагин](Плагины.md#Confirm).** 

# <a id="Выборочное_управление_посылкой_уведомлений_о_событиях_чата"></a>Выборочное управление посылкой уведомлений о событиях чата
 _Внимание!_ Этот патч был сделан для борьбы с кривизной ICQ-гейта "JIT", который посылал ошибку в ответ на события чата; и эта ошибка показывалась в окне чата, как относящаяся к нему. Начиная с версии 0.10.0 Ткаббер содержит код, который устаняет подобную проблему другим способом. 





[Этот патч (+ плагин)](../files/Chatstatectl.zip) позволяет выключать/включать посылку уведомлений о событиях чата (chat state notifications) для любого окна чата (т.е. для любого контакта, с которым открыт сеанс чата). 



Управление настройкой — флаг "Enable chat state notifications" в меню окна чата. 


Новая настройка "перекрывает" глобальную опцию `::plugins::chatstate::options(enable)`. Значение локальной настройки инициализируется значением глобальной опции при открытии окна чата. 



Цель данной функциональности — обход багов, возникающих при работе с некоторыми "ненативными" IM-сетями через соответствующие гейты. В основном, проблемы возникают с различными ICQ-клиентами (печально знаменитое сообщение `"400 (Empty SMS messages are forbidden)"` в качестве реакции на любую активность в окне чата и его закрытие). 




**~/.tkabber/plugins****chatstate.tcl.diff**`




    patch <chatstate.tcl.diff
`
После перезапуска Ткаббера в меню окна чата становится доступен флаг "Enable chat state notifications". 


Вопросы и пожелания слать [Kostix](Участник_Kostix.md). 

**Примечание:** возможно сделать авто-запрещение посылки нотификаций для выбранных JID'ов, например, вот так можно запретить нотификации для всех контактов на ICQ-гейте: 



Впишите в свой **config.tcl** вне хуков вот этот кусок кода: 

    proc icq_must_die {w connid jid} {
      if {[regexp {@icq\.} $jid]} {
        set ::plugins::chatstate::options(enable,$jid) 0
      }
    }
    
    hook::add chat_create_user_menu_hook icq_must_die

Он отключает нотификации для любого джида, содержащего подстроку "@icq.", то есть, к примеру `666777@icq.jabber.ru` и так далее. 


# <a id="Поддержка_ссылок_в_окне_истории"></a>Поддержка ссылок в окне истории

Данный [патч](../files/Logger.patch) добавляет поддержку ссылок (которая присутствует в окне чата) в окно истории. С вопросами и пожеланиями к [eXire](Участник_EXire.md). 


# <a id="Выбор_между_старым_и_новым_видом_окна_userinfo"></a>Выбор между старым и новым видом окна userinfo
Справедливо для svn-версии. 

[Патч](../files/Userinfo.patch). Настройки в **Customize → Main Interface**. 

# <a id="Звуки_в_играхs_s"></a>Звуки в играх<s></s>

<s>[Патчи](../files/Sound_patches.tar.gz) к играм. Так же нужно накатить патч, который тоже находится в этом архиве, на файл plugins/general/sound.tcl.</s> 


В транке с 27.09.06. 

# <a id="Улучшенная_поддержка_XHTML"></a>Улучшенная поддержка XHTML
Данный патч предназначен для улучшения отображения XHTML сообщений. Протестирован с Gaim (Pidgin) и Adium и (частично) XEP-0071. Накладывать заплатку нужно на файл tkabber/plugins/chat/draw\_xhtml\_message.tcl 


`
    
    --- draw_xhtml_message.orig.tcl	2007-05-25 13:05:18.000000000 +0400
    +++ draw_xhtml_message.tcl	2007-06-05 12:31:32.000000000 +0400
    @@ -336,6 +336,32 @@
     	    color {
     		set state(color) $val
     	    }
    +	    font-style {
618
619
620
621
622
623
624
625

626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726


    +	    margin-left {
    +			incr state(lmargin1) 32
    +			incr state(lmargin2) 32
    +	    }
     	}
         }
     }


## <a id="Публикация_проигрываемой_мелодии_при_помощи_запуска_Ткаббера_с_ключом_-pep"></a>Публикация проигрываемой мелодии при помощи запуска Ткаббера с ключом -pep
Реализация того, что описано в
[**ТЗ по управлению через параметры командной строки**](ТЗ_по_управлению_через_параметры_командной_строки.md#Зачем_это_нужно).

Патч позволяет публиковать информацию о мелодии (pep:tune) при помощи вызова из
командной строки (shell-скрипта, батника; также есть встроенная возможность
медиаплееров запускать скрипт при смене трека).

**Cинтаксис:**

    tkabber -pep "tune:artist=Исполнитель,title=Название,track=номер_песни,
    length=продолжительность,source=источник,uri=ссылка,rating=оценка"

_В примере сделан перенос строки, потому что она получилась слишком длинной._
При запуске весь текст должен идти подряд, без пробелов после запятых. Кавычки
нужны на случай, если в названии песни или исполнителя будет пробел. Любое из
полей (artist, title, ...) может быть опущено. Порядок указания полей роли не
играет.

[А вот и сам патч](http://nicktian.narod.ru/pepswitch.diff).

Патч накладывается командой

    $patch -p0 <pepswitch.diff

из корневой папки исходных текстов Ткаббера.

--[*Nicktian*](Участник_Nicktian.md) 17:10, 3 марта 2009 (MSK)

## <a id="Отображение_доступных_контактов_сверху_списка"></a>Отображение доступных контактов сверху списка
Реализация возможности, описанной [**тут**](Планы_на_будущее.md#sКонтакты_онлайн_-_отображать_вверху_списка_s).

Сам патч: [*iroster.zip*](../files/Iroster.zip)

[*Jet*](Участник_Jet.md)

## <a id="Звук_на_установленные_к_наблюдению_в_Шпионе_jidы"></a>Звук на установленные к наблюдению в Шпионе jid'ы
В архиве сам патч и звуковой файл, который проигрывается при появлении
указанного в шпионе jid. В настройках плагина будет соответствующее поле для
замены/удаления звукового оповещения.

* Патч 1: [*Spy.zip*](../files/Spy.zip) Звук работает глобально, т.е.
  срабатывает на все установленные к наблюдению jid'ы.

* Патч 2: [*Spy2.zip*](../files/Spy-rev.1925.zip) Звук можно включать в окне
  самого Spy опционально на каждый отдельный jid, установленный к наблюдению (в
  окне Spy будет чекбокс. Спасибо archimed'у за помощь в доводке до ума).

[**Brennender**](Участник_Brennende.md)

## <a id="Отключение_смены_значка_в_трее_при_получени_прочих_сообщений_в_конференции"></a>Отключение смены значка в трее при получени прочих сообщений в конференции
Патч добавляет чекбокс в Main Interface → Systray, снятие флажка с которого
отключит уведомления в трее об обычных, не подсвеченных сообщениях в
конференции.

Файл: [*Systray.zip*](../files/Systray.zip)

[**Brennender**](Участник_Brennende.md)

## <a id="Группы-исключения_для_показа_в_них_сообщений_сервера_когда_соответствующая_опция_выключена"></a>Группы-исключения для показа в них сообщений сервера, когда соответствующая опция выключена
Когда вам надоедает лицезреть в комнатах, кто зашёл, кто вышел, кто сменил ник
и прочее, вы выключаете опцию `options(gen_enter_exit_msgs)` в Настройках →
Chat. Но бывает так, что вам хотелось бы мониторить пару конференций, если там
требуется усиленное модерирование. Этот патч как раз после вышеупомянутой опции
добавляет поле, куда можно вписать необходимые конференции, разделяя их
пробелом. Теперь, отключив генерацию сообщений сервера, вы будете продолжать
видеть всю необходимую для модератора информацию в нужных вам комнатах.

Файл [*Muc\_exception\_groups4gen\_enter\_exit\_msgs.zip*](../files/Muc_exception_groups4gen_enter_exit_msgs.zip)

[**ycbl**](Участник_Bigote.md)

## <a id="Включение_подсветки_highlight_всего_сообщения_при_обращении_к_вам_в_конференцииs_s"></a>Включение подсветки (highlight) всего сообщения при обращении к вам в конференции<s></s>
**ВНИМАНИЕ: Патч содержит недоработки. К тому же уже есть реализация в виде
[плагина](Плагины.md#Highlightex).**

В настройках: **Plugins → Rich Text** будет соответствующая опция для
включения. Патч накатывать по адресу _~tkabber/plugins/richtext_. За цвет
хайлайта отвечает опция, которую можно добавить в ваш .\*xrdb-файл в виде
hex-хначения

    *Chat.highlightforeground:   #ff0000

либо:

    *Chat.highlightforeground:   red

Или же добавлением в config.tcl такой строчки:

    option add *Chat.highlightforeground:   #ff0000

* Файл [*Highlight.zip*](../files/Highlight.zip)

Автор [*ancestor*](Участник_Ancestor.md)

## <a id="Кнопка_очистки_фильтра_ростера"></a>Кнопка очистки фильтра ростера
[Патч](http://justdanpo.cheb.ru/temp/tkabber_clearfilter_button.diff) добавляет
кнопку, при нажатии на которую фильтр ростера очищается, примерно как в фильтре
Skype.

[*den\_po*](Участник_Den_po.md)









|
>
|
|
<

|
<
<

|




|
<
<
<
<

|

|



|

|

|
|

|

|

|
|
<
<

<
|

<
|
<

|

|
<
|
<

|

|

|
|
<
<
<
<
<
<

|

|

|
|
<

|
<
<
<



|



|



|

|

|
|
<
<

|
>
>
481
482
483
484
485
486
487
488
489
490
491

492
493


494
495
496
497
498
499
500




501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520


521

522
523

524

525
526
527
528

529

530
531
532
533
534
535
536






537
538
539
540
541
542
543

544
545



546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562


563
564
565
566
    +	    margin-left {
    +			incr state(lmargin1) 32
    +			incr state(lmargin2) 32
    +	    }
     	}
         }
     }
    
`
# <a id="Публикация_проигрываемой_мелодии_при_помощи_запуска_Ткаббера_с_ключом_-pep"></a>Публикация проигрываемой мелодии при помощи запуска Ткаббера с ключом -pep
Реализация того, что описано в [ТЗ по управлению через параметры командной строки](ТЗ_по_управлению_через_параметры_командной_строки.md#Зачем_это_нужно). 


Патч позволяет публиковать информацию о мелодии (pep:tune) при помощи вызова из командной строки (shell-скрипта, батника; также есть встроенная возможность медиаплееров запускать скрипт при смене трека). 



**Cинтаксис:** 

    tkabber -pep "tune:artist=Исполнитель,title=Название,track=номер_песни,
    length=продолжительность,source=источник,uri=ссылка,rating=оценка"

_В примере сделан перенос строки, потому что она получилась слишком длинной._ При запуске весь текст должен идти подряд, без пробелов после запятых. Кавычки нужны на случай, если в названии песни или исполнителя будет пробел. Любое из полей (artist, title, ...) может быть опущено. Порядок указания полей роли не играет. 





[А вот и сам патч](http://nicktian.narod.ru/pepswitch.diff). 

Патч накладывается командой  

    $patch -p0 <pepswitch.diff

из корневой папки исходных текстов Ткаббера. 

--[Nicktian](Участник_Nicktian.md) 17:10, 3 марта 2009 (MSK) 

# <a id="Отображение_доступных_контактов_сверху_списка"></a>Отображение доступных контактов сверху списка
Реализация возможности, описанной [тут](Планы_на_будущее.md#Контакты_онлайн_-_отображать_вверху_списка). 

Сам патч: [iroster.zip](../files/Iroster.zip) 

[Jet](Участник_Jet.md) 

# <a id="Звук_на_установленные_к_наблюдению_в_Шпионе_jidы"></a>Звук на установленные к наблюдению в Шпионе jid'ы
В архиве сам патч и звуковой файл, который проигрывается при появлении указанного в шпионе jid. В настройках плагина будет соответствующее поле для замены/удаления звукового оповещения. 




* Патч 1: [Spy.zip](../files/Spy.zip) Звук работает глобально, т.е. срабатывает на все установленные к наблюдению jid'ы. 


* Патч 2: [Spy2.zip](../files/Spy(rev.1925).zip) Звук можно включать в окне самого Spy опционально на каждый отдельный jid, установленный к наблюдению (в окне Spy будет чекбокс. Спасибо archimed'у за помощь в доводке до ума). 


[Brennender](Участник_Brennende.md) 

# <a id="Отключение_смены_значка_в_трее_при_получени_прочих_сообщений_в_конференции"></a>Отключение смены значка в трее при получени прочих сообщений в конференции

Патч добавляет чекбокс в Main Interface → Systray, снятие флажка с которого отключит уведомления в трее об обычных, не подсвеченных сообщениях в конференции. 


Файл: [Systray.zip](../files/Systray.zip) 

[Brennender](Участник_Brennende.md) 

# <a id="Группы-исключения_для_показа_в_них_сообщений_сервера_когда_соответствующая_опция_выключена"></a>Группы-исключения для показа в них сообщений сервера, когда соответствующая опция выключена
Когда вам надоедает лицезреть в комнатах, кто зашёл, кто вышел, кто сменил ник и прочее, вы выключаете опцию `options(gen_enter_exit_msgs)` в Настройках → Chat. Но бывает так, что вам хотелось бы мониторить пару конференций, если там требуется усиленное модерирование. Этот патч как раз после вышеупомянутой опции добавляет поле, куда можно вписать необходимые конференции, разделяя их пробелом. Теперь, отключив генерацию сообщений сервера, вы будете продолжать видеть всю необходимую для модератора информацию в нужных вам комнатах. 







Файл [Muc\_exception\_groups4gen\_enter\_exit\_msgs.zip](../files/Muc_exception_groups4gen_enter_exit_msgs.zip) 

[ycbl](Участник_Bigote.md) 

# <a id="Включение_подсветки_highlight_всего_сообщения_при_обращении_к_вам_в_конференцииs_s"></a>Включение подсветки (highlight) всего сообщения при обращении к вам в конференции<s></s>
**ВНИМАНИЕ: Патч содержит недоработки. К тому же уже есть реализация в виде [плагина](Плагины.md#Highlightex).** 


В настройках: **Plugins → Rich Text** будет соответствующая опция для включения. Патч накатывать по адресу _~tkabber/plugins/richtext_. За цвет хайлайта отвечает опция, которую можно добавить в ваш .\*xrdb-файл в виде hex-хначения 




    *Chat.highlightforeground:   #ff0000

либо: 

    *Chat.highlightforeground:   red

Или же добавлением в config.tcl такой строчки: 

    option add *Chat.highlightforeground:   #ff0000

* Файл [Highlight.zip](../files/Highlight.zip) 

Автор [ancestor](Участник_Ancestor.md) 

# <a id="Кнопка_очистки_фильтра_ростера"></a>Кнопка очистки фильтра ростера
[Патч](http://justdanpo.cheb.ru/temp/tkabber_clearfilter_button.diff) добавляет кнопку, при нажатии на которую фильтр ростера очищается, примерно как в фильтре Skype. 



[den\_po](Участник_Den_po.md) 


Changes to wiki/ru/Пересылка_файлов__теория.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163

164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194









195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225







226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255


256

257


258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286

287

288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530

531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714

715


716

717

718

719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781

782
783
784
785
786
787
788
789
790
791
792
793

[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Пересылка_файлов:_теория/index.html)


# Пересылка файлов: теория

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Введение](#Введение)
* [2 Как соединены Вася@сервер1 и Петя@сервер2](#Как_соединены_Васясервер1_и_Петясервер2)
* [3 Обмен сообщениями + передача файлов = мезальянс?](#Обмен_сообщениями_+_передача_файлов_=_мезальянс)
* [4 Вася и Петя хотят передать файл](#Вася_и_Петя_хотят_передать_файл)
   * [4.1 Внутри и снаружи](#Внутри_и_снаружи)
* [5 Ху из ху?](#Ху_из_ху)
   * [5.1 Jidlink](#Jidlink)
   * [5.2 SI](#SI)
   * [5.3 HTTP (OOB)](#HTTP_OOB)
* [6 Две ступени к прекрасному](#Две_ступени_к_прекрасному)
* [7 Идеальная сеть и жестокая реальность](#Идеальная_сеть_и_жестокая_реальность)
* [8 И снова "внутри и снаружи": что выбрать?](#И_снова_внутри_и_снаружи_что_выбрать)
* [9 Спортивное ориентирование на местности доступных протоколов](#Спортивное_ориентирование_на_местности_доступных_протоколов)
   * [9.1 Jidlink](#Jidlink)
      * [9.1.1 Опции конфигурирования](#Опции_конфигурирования)
      * [9.1.2 Руководство по настройке](#Руководство_по_настройке)
   * [9.2 SI](#SI)
      * [9.2.1 Опции конфигурации](#Опции_конфигурации)
      * [9.2.2 Руководство по настройке](#Руководство_по_настройке)
   * [9.3 HTTP](#HTTP)
      * [9.3.1 Опции конфигурирования](#Опции_конфигурирования)
      * [9.3.2 Замечания по настройке](#Замечания_по_настройке)
      * [9.3.3 Настройка портфорвардинга для HTTP (OOB)](#Настройка_портфорвардинга_для_HTTP_OOB)
* [10 Тонкие различия протоколов](#Тонкие_различия_протоколов)
   * [10.1 Протоколы внутриканальной передачи данных](#Протоколы_внутриканальной_передачи_данных)
      * [10.1.1 Варианты реализации](#Варианты_реализации)
      * [10.1.2 Проблемы SI/IBB](#Проблемы_SI_IBB)
      * [10.1.3 Почему полезен IQ](#Почему_полезен_IQ)
      * [10.1.4 Доступные транспорты на основе IQ-запросов](#Доступные_транспорты_на_основе_IQ-запросов)
* [11 Это всё хорошо, но что выбрать для *моего* соединения?](#Это_всё_хорошо_но_что_выбрать_для_моего_соединения)
* [12 Благодарности](#Благодарности)
* [13 Скучные сугубо технические ссылки](#Скучные_сугубо_технические_ссылки)

## <a id="Введение"></a>Введение
Если вы туманно представляете себе этот вопрос или думаете, что два файла
переслать — это как два пальца об асфальт, то перед тем как продолжить чтение,
рекомендуем посетить [эту страничку](http://jabberworld.info/Передача_файлов)
на jabberworld.info. Там вы получите необходимый минимум знаний, который
поможет быстрее разобраться в премудростях файлопересылания.

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

Совсем нетерпеливые могут прыгнуть
[**прямо к описанию настроек**](#Спортивное_ориентирование_на_местности_доступных_протоколов).

Вы ещё здесь? Отлично! Тогда приступим. И начнём с простого.

## <a id="Как_соединены_Васясервер1_и_Петясервер2"></a>Как соединены Вася@сервер1 и Петя@сервер2
*  Джаббер-клиент Васи устанавливает соединение с сервером **сервер1**.
*  Джаббер-клиент Пети — с сервером **сервер2**.
*  **сервер1** и **сервер2** устанавливают соединение между собой.

Теперь, когда Вася шлёт сообщение Пете, происходит следующее:

*  васин клиент шлёт это сообщение своему серверу (**сервер1**).
*  васин сервер посылает его петиному серверу (**сервер2**).
*  петин сервер пересылает его петиному клиенту.
*  Петя видит сообщение и радуется.

Заметьте, что хотя между Васей и Петей есть _логическое_ соединение, реально
каждый из них соединён только со своим сервером. Это — типичная ошибка
начинающих пользователей: считать, что сообщение, посланное "на соседний
компьютер", посылается прямо на этот соседний компьютер. (К примеру, в случае
общения "через аську" в русском офисе сообщения на самом деле ходят через
сервер, находящийся в Америке.)

Соединение между васиным и петиным джаббер-клиентами мы будем называть
_каналом._

## <a id="Обмен_сообщениями_+_передача_файлов_=_мезальянс"></a>Обмен сообщениями + передача файлов = мезальянс?
Во-первых, надо отметить, что "Jabber" — это "разговорное название"
[протокола XMPP](http://www.xmpp.org), и эта аббревиатура образована от термина
_Extensible Messaging and Presence Protocol,_ означающего: _Расширяемый
Протокол для обмена **Сообщениями** и информацией о Присутствии._ Обратите
внимание на слово "сообщениями" — никакого упоминания о пересылке файлов.

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

**На заметку:** любопытный читатель может получить представление о том, что
летает по джаббер-сети, активизировав стандартный плагин "RAW XML Input" и
открыв "Окно XML" из меню "Службы->Инструменты администратора".

Передача файлов в эту концепцию _не_ вписывается.

Однако, она иногда требуется.

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

* Jidlink.
* [Out of Band Data (OOB)](http://www.jabber.org/jeps/jep-0066.html) (по
  причинам, объяснённым ниже, в Ткаббере называется "HTTP").
* [Передача файлов](http://www.jabber.org/jeps/jep-0096.html), основанная на
  протоколе [SI](http://www.jabber.org/jeps/jep-0095.html).

Независимо от протокола, поток байтов, который передаётся транспортом,
именуется _"bytestream",_ то есть... правильно — "поток байтов".

## <a id="Вася_и_Петя_хотят_передать_файл"></a>Вася и Петя хотят передать файл
Как мы помним, соедниение между **Вася@сервер1** и **Петя@сервер2** — чисто
логическое, то есть _нет прямого соединения_ между васиным и петиным
компьютерами.

Протоколы джаббера предоставляют Васе две _принципиально различные_ возможности
для того чтобы передать файл Пете:

* васин джаббер-клиент может установить _прямое соединение_ с петиным клиентом
  и передать файл, на время создав таким образом _физический канал_ между
  васиным и петиным компьютерами.
* васин джаббер-клиент может послать файл внутри существующего _логического
  канала_ между ним и петиным джаббер-клиентом.

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

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

Рассмотрим это чуть подробнее, а заодно введём пару "официальных" терминов.

### <a id="Внутри_и_снаружи"></a>Внутри и снаружи

С точки зрения пользователя джаббер-клиента самым серьёзным вопросом является
то, _как_ передаются данные  файла. Как уже объяснялось выше, есть всего два
способа это сделать: передать данные "внутри" имеющегося соединения и
"снаружи".

Отсюда — два термина:

* _In-band, IB ("в канале")_ — данные файла передаются внутри логического
  соединения между клиентами, то есть _опосредованно_ (в передаче участвуют не
  только клиенты, но и вся цепочка Джаббер-серверов между ними).
* _Out-of-band, OOB ("вне канала")_ — данные файла передаются _непосредственно_
  между клиентами (или через прокси-сервер). Джаббер-серверы клиентов в
  передаче не участвуют.

Термин "bytestream" не забывают и здесь, различая, соответственно

* In-band bytestreams (IBB) — внутриканальные потоки байтов.
* Out-of-band bytestreams (OOB) — внеканальные потоки байтов.

**На заметку:** сторого говоря, термин "band" здесь следует переводить
телекоммуникационным эквивалентом — "полоса", а приведённые термины означают
"внутриполосную" и "внеполосную" передачу данных, соответственно. Но мы
предпочтём простоту изложения академичности.


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

## <a id="Ху_из_ху"></a>Ху из ху?
### <a id="Jidlink"></a>Jidlink

* Поддерживает как in-band, так и out-of-band передачу.
* Никогда не являлся стандартным расширением Джаббера, и поэтому не является
  официальным.
* Из широко известных джаббер-клиентов, реализован только в Ткаббере.
* Для передачи данных в канале использует iq-паекты (IQ — это
  [подсистема Info/Query Джаббера](http://www.xmpp.org/specs/rfc3920.html#stanzas-semantics)).
* Для передачи данных вне канала использует протокол
  [Direct TCP (DTCP)](http://www.xmpp.org/extensions/xep-0046.html).

### <a id="SI"></a>SI

* Поддерживает как in-band, так и out-of-band передачу.
* Является стандартным расширением Джаббера (и самым новым транспортом для
  передачи файлов).
* Для передачи в канале может использовать:
   * текстовые сообщения — стандартный режим внутриканальной передачи (мы будем
     именовать этот режим аббревиатурой **SI/IBB**);
   * IQ-запросы — (пока ещё) нестандартный режим, реализованный в текущей
     альфа-версии Ткаббера, имеющий серьёзные преимущества перед стандартным
     (**SI/IQIBB**).
* Для передачи вне канала использует
  [потоки байтов SOCKS5](http://www.xmpp.org/extensions/xep-0065.html).
* Поддерживает опосредованные ("mediated") внеканальные соединения через
  специальные SOCKS5-прокси серверы (реализовано в текущей альфа-версии).










Термин _SI (Stream Initiation)_ является весьма обобщённым и означает "создание
потока". Имеется в виду организация дополнительного потока байтов по инициативе
одного из клиентов. Нас в данном случае интересует создание потока для передачи
файла.

Теория относительно SOCKS5 дана [**тут**](Терминология.md#SOCKS5).

### <a id="HTTP_OOB"></a>HTTP (OOB)

*  Является стандартным (и самым старым) способом передачи файлов.
*  Поддерживает только передачу вне канала.
*  Использует [протокол HTTP](http://ru.wikipedia.org/wiki/HTTP) для передачи
   данных; при этом инициатор во время передачи файла является HTTP-сервером,
   а получатель — клиентом.

## <a id="Две_ступени_к_прекрасному"></a>Две ступени к прекрасному
Передача файла при помощи любого протокола состоит из двух последовательных
фаз:

1. _"Рукопожатие",_ в ходе которого стороны договариваются о том, каким именно
   образом будет использован протокол. На этом этапе инициатор так же сообщает
   некоторую информацию о файле, а принимающая сторона должна подтвердить или
   отклонить запрос на передачу.
1. Собственно передача файла.

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

**Внимание!** Этот выбор _осуществляется автоматически,_ так что то, как именно
он будет осуществлён, зависит от настроек Ткаббера.








**Важно понимать,** что каждый протокол передачи файлов _предпочитает **прямые
(вне канала)** соединения_ внутриканальным.

Постигнув теорию, спустимся с небес на землю и узнаем что же создаёт проблемы
на пути лёгкой передачи файлов.

## <a id="Идеальная_сеть_и_жестокая_реальность"></a>Идеальная сеть и жестокая реальность
В идеальной TCP/IP сети нет вирусов, кракеров, спама, идиотов, фанатиков,
трафик бесплатен, и каждый компьютер имеет публичный IP-адрес.

Во вполне реальном [Интернет](http://ru.wikipedia.org/wiki/Интернет) это всё
есть, и поэтому:

* Компьютеры, "смотрящие" в Интернет непосредственно, обычно защищены
  ["межсетевыми экранами"](http://ru.wikipedia.org/wiki/Межсетевой_экран) — программами,
  которые не позволяют подключиться к компьютеру "снаружи".
* Компьютеры, подключённые к Интернет опосредованно, как правило, делают это
  через нечто, осуществляющее
  [преобразование сетевых адресов](http://ru.wikipedia.org/wiki/NAT), что так же
  убивает возможность соединиться с такими компьютерами "снаружи".

Некоторые люди также полагают, что иногда эту неприглядную ситуацию ещё сильнее
ухудшают странные люди, именуемые "системными администраторами": они всеми
доступными средствами изничтожают любую возможность "вылезти в свет" для
скучающих офисных работников.

Конкретные ситуации с соединениями на различных компьютерах могут сильно
отличаться. Например, компьютер может совершать любые исходящие соединения, но
не может принимать входящие. Или даже исходящие он может совершать только через
[прокси-сервер](http://ru.wikipedia.org/wiki/Прокси-сервер). Бывают и более


сложные условия.




В любом случае, идея очевидна: _в Интернете_ протоколам, подразумевающим
произвольные _прямые_ соединения между компьютерами живётся несладко. Интернет
это ярко выраженный образчик клиент-серверной архитектуры: только серверы,
предоставляющие специфические услуги (вроде HTTP, почты или Jabber), способны
принимать соединения от своих клиентов.

С другой стороны, в [локальных сетях](http://ru.wikipedia.org/wiki/LAN)
ситуация зачастую совсем другая. В них, как правило, все компьютеры считаются
добропорядочными и разрешают произвольные соединения друг с другом.

**Главный вывод** из этого таков: _в Интернет,_ как правило, прямая передача
информации между двумя "простыми" компьютерами невозможна. А это значит, что в
таких условиях, возможно, придётся использовать способность некоторых
протоколов передачи файлов посылать информацию внутри логического канала.

## <a id="И_снова_внутри_и_снаружи_что_выбрать"></a>И снова "внутри и снаружи": что выбрать?
Ответьте для себя на два вопроса:

1. Может ли мой компьютер установить произвольное TCP/IP-соединение с
   удалённым компьютера? (_"активный"_ способ установить соединение)
1. Может ли удалённый компьютер установить произвольное соединение с
   моим компьютером? (_"пассивный"_ способ)

Комбинация ответов "да" или "нет" на каждый из этих вопросов даст вам в руки
руководство к действию:

* Если ваш компьютер _может установить_ произвольное TCP/IP-соединение,
  то вы можете _разрешить_ протоколам передачи файлов устанавливать _исходящие
  прямые_ соединения.

* Если ваш компьютер _принимает_ прямые подключения (например, он находится

  в локальной сети), то вы можете _разрешить_ протоколам передачи файлов
  принимать _входящие прямые_ соединения.
* Если "нет" является ответом на оба вопроса, запрещайте оба типа прямых
  соединений: in-band bytestreams — ваша единственная возможность пересылать
  файлы.

**Внимание!** Необходимо чётко понимать две вещи:

1. _Все_ протоколы передачи файлов в джаббере _предпочитают прямую пересылку_
   внутриканальной как наиболее быструю и создающую минимальную нагрузку на
   серверы.
1. Нет способа узнать будет ли работать прямая пересылка, не попробовав её,
   то есть протокол не может сказать окажется ли выбранный способ передачи
   работающим.

Из этого нужно сделать **Самый Главный Вывод:**

> _Если прямая передача не поддерживается вашим компьютером, **запретите** её в
  настройках, так как она с большой долей вероятности будет выбираться в ходе
  "рукопожатия" протокола передачи файлов и не будет работать._

**На заметку:** это "не будет работать" обычно выражается в том, что соединение
долго "висит", и при этом никакой передачи файла не происходит. Причина обычно
состоит в том, что межсетевой экран, отделяющий компьютер-адресат (или ваш
компьютер) от внешней сети (обычно Интернет), молча "душит" "неправильные" с
его точки зрения [IP-пакеты](http://ru.wikipedia.org/wiki/IP). При этом
компьютер-передатчик (ваш компьютер), не получая никаких ответов на посылаемые
пакеты, ожидает их в течение некоторого (большого) тайм-аута (к примеру, для
ядра Linux 2.4.x он составляет около 10 минут).

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

## <a id="Спортивное_ориентирование_на_местности_доступных_протоколов"></a>Спортивное ориентирование на местности доступных протоколов
Все приведённые опции конфигурации для протоколов доступны для изменения как
через графический конфигуратор Ткаббера, так и через
[**config.tcl** (секция "post-load")](http://tkabber.jabber.ru/files/doc/tkabber.html#s.postload).

### <a id="Jidlink"></a>Jidlink

Этот протокол поддерживает как внеканальный, так и внутриканальный способы
передачи файлов.

Протокол **Jidlink** никогда не являлся частью стандарта **XMPP,** а поэтому
считается устаревшим. Кроме того, этот протокол по-видимому не поддерживается
ни одним из известных джаббер-клиентов, кроме Ткаббера.

С другой стороны, это не означает, что этот протокол не следует использовать
совсем — он отлично работает в случае соединения Ткаббер-Ткаббер. Кроме того,
он имеет достаточно тонкое положительное отличие от аналогичного протокола —
**SI/IBB,** которое будет обсуждаться ниже.

С другой стороны, в отличие от **SI, Jidlink** не поддерживает опосредованные
прямые соединения (mediated direct connections), поддержка которых уже есть в
текущей альфа-версии Ткаббера. Подробнее об этих соединениях — в описании
протокола **SI.**

#### <a id="Опции_конфигурирования"></a>Опции конфигурирования

Для конфигурирования протокола **Jidlink** доступны следующие опции:

    ::ft::ftjl::options(enable)

Разрешает использовать **Jidlink.** По умолчанию _выключена._

    ::jidlink::transport(allowed,dtcp-active)

Разрешает инициировать _исходящие прямые_ соединения. По умолчанию включена.

    ::jidlink::transport(allowed,dtcp-passive)

Разрешает принимать _входящие прямые_ соединения. По умолчанию включена.

    ::jidlink::transport(allowed,inband-bytestream)

Разрешает внутриканальную передачу файлов. По умолчанию включена.

#### <a id="Руководство_по_настройке"></a>Руководство по настройке

* Можете устанавливать произвольные исходящие прямые соединения? Оставьте
  включённым **dtcp-active.**
* Можете принимать произвольные входящие прямые соединения? Оставьте
  включённым **dtcp-passive.**
* Не можете ни того, ни другого? Оставьте включённой _только_
  **inband-bytestream.**

### <a id="SI"></a>SI

Протокол **SI** поддерживает как внеканальную, так и внутриканальную передачу
файлов.

#### <a id="Опции_конфигурации"></a>Опции конфигурации

В текущей стабильной версии (0.9.9) доступны следующие настройки:

    ::ft::si::options(enable)

Разрешает использовать **SI.** По умолчанию включена.

     ::si::transport(allowed,http://jabber.org/protocol/bytestreams)

Разрешает использовать прямые соединения. _Как исходящие, так и входящие;_
здесь нет раздельных опций как у **Jidlink.** По умолчанию включена.

     ::si::transport(allowed,http://jabber.org/protocol/ibb)

Разрешает использовать "стандартную "внутриканальную передачу файлов (текстовые
сообщения, **SI/IBB**). По умолчанию включена.

В ревизии 726 (2006-09-21) основной ветки разработки была добавлена реализация
внутриканальной передачи авторства Сергея Голованя (`xmpp:sgolovan@nes.ru`),
сочетающая достоинства SI и Jidlink — **SI/IQIBB**. Её использование можно
контролировать следующей опцией:

    ::si::transport(allowed,http://jabber.org/protocol/iqibb)

Разрешает использовать "нестандартную" внутриканальную передачу файлов
(IQ-запросы). По умолчанию включена.

В ревизии 727 (2006-09-23) основной ветки разработки был а добавлена реализация
поддержки опосредованных прямых SOCKS5-соединений. Она контролируется
следующими опциями:

    ::si::socks5::initiator::options(enable_mediated_connection)

Разрешает использовать опосредованные прямые соединения. По умолчанию включена.

    ::si::socks5::initiator::options(proxy_servers)

Список имён прокси серверов, соединение через которые следует пытаться
установить. Пробуются все сервера в списке по порядку. По умолчанию список
состоит из одного сервера — `proxy.jabber.org`; сервера в списке должны быть
разделены пробелами. Список публичных прокси-серверов можно найти на
[juick.info](http://juick.info/jabber:socks5_proxy_list)

#### <a id="Руководство_по_настройке"></a>Руководство по настройке

В отличие от **Jidlink, SI** не имеет раздельных опций настройки приёма и
передачи для внеканальных соединений, поэтому важно понимать как именно
устанавливается прямое SOCKS5-соединение в этом протоколе.

> В **SI** _инициатор_ посылки _открывает слушающий сокет_ на своём компьютере
  (то есть _является TCP-сервером_), а _принимающая сторона — пытается
  подключиться_ к нему (то есть _является TCP-клиентом_).

Иными словами, поведение внеканальной передачи в **SI** сильно зависит от того,
кто посылает файл, а кто — его принимает:

* Если вы _посылаете_ файл, то ваш компьютер должен иметь возможность
  _принимать_ произвольные TCP/IP соединения.
* Если вы _принимаете_ файл, что ваш компьютер должен иметь возможность
  _создавать_ произвольные TCP/IP соединения.

Нетрудно заметить, что эта схема создания внеканальных соединений обратна той,
которую использует **Jidlink.**

Ещё раз отметим, что в **SI** приём и передача для внеканальных соединений не
регулируются раздельно. А это означает, что если ваш компьютер "не дружит" с
_любым_ из способов установления прямых соединений (активным или пассивным),
вам лучше держать соответствующую опцию _выключенной,_ и включать её специально
в нужных случаях, когда вы уверены в том, что внеканальная передача будет
работать.

Транспорт **SI/IQIBB** имеет более высокий приоритет при рукопожатии, чем
**SI/IBB.**

![(!)](../images/Hammer.png) **Сделать:** написать про mediated connections

### <a id="HTTP"></a>HTTP

Этот протокол поддерживает только прямые соединения, при этом:

* сторона, _посылающая_ файл, выступает как HTTP-сервер и должна иметь
  возможность _принимать произвольные входящие соединения._
* сторона, _принимающая_ файл, должна иметь возможность установки
  _исходящего прямого соединения по протоколу HTTP (на произвольный порт)._

Иными словами, получатель "скачивает" файл с машины посылающего, выступая в
качестве "активной" стороны.

Теоретически, поскольку принимающая сторона получает файл при помощи запроса
**GET** протокола **HTTP,** _получатель_ может установить соединение этого типа
через HTTP-прокси.. Однако, в Ткаббере эта возможность не реализована.

#### <a id="Опции_конфигурирования"></a>Опции конфигурирования

В текущей стабильной версии (0.9.9) протокол управляется всего одной опцией:

    ::ft::http::options(enable)

Разрешает использовать протокол **HTTP (OOB).** По умолчанию включена.

Начиная с ревизии 731 (2006-09-25) в основную ветку разработки включен код
авторства Antoni Grzymala, добавляющий возможность прямой посылки файла с
компьютера, находящегося за
[NATP-устройством](http://ru.wikipedia.org/wiki/NAT) со специально настроенным
[портфорвардингом](http://en.wikipedia.org/wiki/Port_forwarding):

    ::ft::http::options(port)

Порт, который следует посылать при рукопожатии на удалённую сторону
(принимающую файл). По умолчанию имеет значение 0, означающее, что порт будет
выбран автоматически на локальной машине.

    ::ft::http::options(host)

Имя хоста или IP адрес, который следует посылать при рукопожатии на удалённую
сторону. По умолчанию пуста; в этом случае посылается сетевое имя локальной
машины.

**Примечание:** если доступен пакет **Tclx,** то будет передан IP адрес
локальной машины, в который "разрешается" её сетевое имя.

#### <a id="Замечания_по_настройке"></a>Замечания по настройке

Настраивать этот протокол имеет смысл только в том случае, если ваша машина
поддерживает прямые соединения или же у вас есть возможность настроить
портфорвардинг, как описано ниже.

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

#### <a id="Настройка_портфорвардинга_для_HTTP_OOB"></a>Настройка портфорвардинга для HTTP (OOB)

**Следует понимать,** что реализация такой схемы требует настройки
NATP-устройства, то есть вы либо должны иметь к нему физический доступ
(администрировать его), либо [хорошо попросить ;)](http://www.ararat.ru) о
такой настройке лицо, администирущее ваш NAT.

Ключевые идеи подобной настройки портфорвардинга:

* При _передаче_ файла Ткаббер на нашей машине будет выступать в роли
  HTTP-сервера, "отдающего" файл;
* Если наша машина имеет IP адрес из "приватного" диапазона (например,
  находится, в локальной сети), прямой доступ к ней "снаружи" (из Интернета)
  невозможен;
* Однако, если доступ "наружу" нашей машине обеспечивает NATP-устройство,
  на нём возможно настроить отображение какого-либо _фиксированного_ порта на
  какой-либо другой _фиксированный_ порт нашей машины.
* При такой настройке наш Ткаббер в ходе фазы рукопожатия протокола OOB
  должен сообщать удалённому Ткабберу адрес хоста и номер порта _своего NAT'а,_
  а не свои. При этом удалённый Ткаббер осуществит TCP-соединение с вашим
  NAT'ом, и вследствие действия механизма "проброса порта", соединение реально

  произойдёт с соответсвующим портом на вашей машине, на котором будет
  "слушать" Ткаббер.

Таким образом, опции "port" и "host", описанные выше, в случае настройки
портфорвардинга, должны содержать "пробрасываемый" порт на NAT'е и имя хоста
(или IP адрес ) NAT'а, соответственно.

Для "штатного" режима работы следует установить опцию "port" в значение 0, а
опции "host" присвоить пустую строку.

## <a id="Тонкие_различия_протоколов"></a>Тонкие различия протоколов
Это — "хардкорный" раздел, так как бла-бла...

### <a id="Протоколы_внутриканальной_передачи_данных"></a>Протоколы внутриканальной передачи данных

> _Раньше я пользовался  
> обычными протоколами передачи данных,  
> и передавали они вечно всякую хрень.  
> Но с тех пор, как я пользуюсь IQ,  
> по каналам лезет одна философия.  
> Дело в IQ?_

> *© [**Bigote**](Участник_Bigote.md)*

Тема данного раздела узка: поведение различных протоколов внутриканальной
передачи данных на _медленных и ненадёжных_ соединениях (в основном, на
"dial-up" и GPRS-линках). Именно на них "всплывают" как интересные особенности
реализации TCP/IP в операционных системах и интерпретаторе Tcl, так и
невнимание некоторых разработчиков к проблемам нестабильных соединений.

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

* **Jidlink/IBB**;
* **SI/IBB** — "штатный" внутриканальный транспорт группы протоколов SI;
* **SI/IQIBB** — экспериментальный внутриканальный транспорт группы
  протоколов SI.

В текущей стабильной версии транспорт **SI/IQIBB** отсутствует.

**Имейте в виду,** что приведённые названия протоколов не являются официальными
и введены нами для удобного сравнительного именования: форма
`ГРУППА_ПРОТОКОЛОВ/ТРАНСПОРТ` позволяет одновременно указать "групповую
принадлежность" транспорта и его конкретную реализацию.

#### <a id="Варианты_реализации"></a>Варианты реализации

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

На данный момент существуют две концепции её решения:

* использование текстовых сообщений (строфа `message`);
* использование IQ-запросов (строфа `iq`).

Теоретически, у них есть свои слабые и сильные стороны, однако на практике
IQ-запросы выигрывают. Ниже мы объясним — почему.

Официально, в настоящий момент XMPP поддерживает только три протокола передачи
файлов: **HTTP, SI/bytestreams, SI/IBB,** и из них только один (**SI/IBB**)
предназначен для внутриканальной передачи файлов.

Протокол **SI/IBB** использует посылку текстовых сообщений в качестве "движка":
пересылаемый файл бьётся на небольшие куски ("чанки", на жаргоне), каждый из
которых кодируется при помощи алгоритма
[base64](http://ru.wikipedia.org/wiki/Base64) и пересылается принимающему
клиенту как текстовое сообщение.

#### <a id="Проблемы_SI_IBB"></a>Проблемы SI/IBB

Есть две проблемы, которые делают применение **SI/IBB** затруднительным на
медленных и нестабильных линиях.

Во-первых, в XMPP нет механизма подтверждения доставки текстовых сообщений (так
как они доставляются гарантированно). Это приводит к тому, что невозможно
узнать, принят ли уже данный кусок получателем или ещё нет. Из-за этого
_типичная реализация **SI/IBB** "вливает" весь файл в передаваемый XML-поток с
максимально возможной скоростью._ И тут в игру вступает системное кэширование
на пару с забитием полосы пропускания канала.

В Ткаббере, при передаче через подсистему
[сетевых сокетов](http://ru.wikipedia.org/wiki/Сокет_(программный_интерфейс\))
Tcl, информация кэшируется на двух уровнях: в буферах интерпретатора Tcl и в
буферах стека TCP/IP ядра операционной системы. Эти буферы достаточно велики: к
примеру, штатно настроенная реализация TCP/IP ядра Linux серии 2.4.x
предоставляет каждому соединению передающий буфер размером 16 килобайт. Буфер
интерпретатора Tcl значительно больше — на машине автора статьи Tcl 8.4.9
спокойно поглощал "за один присест" файл размером 1,2 мегабайта.

Буферизация в большинстве случаев весьма полезна, однако на медленном канале
она играет с Ткаббером злую шутку: передача файла размером 1-2 мегабайта в
таких условиях с точки зрения Ткаббера происходит моментально — файл
поглощается буферами тикля и ОС, после чего начинает медленно вливаться в
_физический_ канал передачи (скорость которого на модеме составляет не больше
трёх килобайт в секунду, а зачастую — меньше двух). Если пользователь вдруг
решает отменить посылку файла, это уже невозможно — диалог посылки файла
успешно закрыт.

Но не это самое неприятное, самое неприятное — это "забитие" полосы пропускания
канала. Поскольку сеанс связи по протоколу XMPP фактически представляет собой
два XML-потока (от клиента на сервер и обратно), любое сообщение от клиента
добавлятся в конец "клиентского" потока, и оно не может нагло пролезть без
очереди для отправки на сервер, равно как и нет возможности открыть
альтернативный поток. Это означает, что пока наш файл томительно "вливается" в
медленный канал, любая наша активность в виде исходящих сообщений будет просто
добавляться в "хвост" потока, "голова" которого ещё "не пролезла" на сервер.
Причём из-за того, что потоки на приём и передачу — разные, несчастный
пользователь получает входящие сообщения (например, наблюдает активность в
чатах), но сам он до окончания передачи файла эффективно отстранён от активных
действий.

Вторую проблему с **SI/IBB** создаёт комбинация из поддержки сервером
["офлайнового" хранения сообщений](http://www.xmpp.org/extensions/xep-0013.html)
и ненадёжного соединения со стороны получателя файла.

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

Однако, представьте ситуацию: в момент передачи файла при помощи посылки
текстовых сообщений физический канал получателя даёт сбой. Сервер получателя
через определённое (заметим, что довольно немаленькое) время осознаёт, что
TCP/IP-соединение с клиентом разорвано. При этом сообщения, пришедшие за период
от разрыва физического канала до разрыва логического, _теряются безвозвратно_
(сервер отсылает их, не зная, что клиент "отвалился"), а остальные начинают
складываться в офлайновое хранилище. (Потеря сообщений, описанная только что,
на самом деле имеет более широкие последствия, чем проблемы при передаче
файлов: файлы мы шлём редко, а разговариваем постоянно, так что уверенность в
доставке **всех** сообщений на любом, даже самом поганом соединении — жизненно
важный вопрос.)

Вновь подключившийся к серверу клиент, принимавший файл, ничего "не помнит" про
имевший место приём файла (**SI/IBB** не поддерживает докачку), но несмотря на
это, сервер начинает передавать клиенту все поступившие за время отсутствия
клиента текстовые сообщения, которыми вполне может оказаться "долившийся" за
это время длинный файл. Эти сообщения будут выбрасываться клиентом (так как они
не относятся ни к какому логическому каналу передачи файлов), но никакой
возможности "не скачивать" такие сообщения у клиента нет. На медленном канале
визуально это выглядит как "подвиснувший" Ткаббер при активности на приёмном
устройстве.

О реализации в существующих Jabber-серверах неких "умных" алгоритмов особой
обработки текстовых сообщений в подобных случаях нам ничего неизвестно; судя
по-всему, их нет.

#### <a id="Почему_полезен_IQ"></a>Почему полезен IQ

Второй разновидностью "движка" для внутриканальной посылки файлов является
использование механизма IQ-запросов, которые предназначены для получения
всевозможной информации об участниках XMPP-сети.

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

А этот простой факт одним махом решает обе проблемы, присущие простым текстовым
сообщениям транспорта **SI/IBB**:

* Можно посылать следующий пакет с данными файла только после того, как принят
  ответ-"подтверждение" на предыдущий, а значит, нет проблемы с "поглощением"
  файла системными буферами и всех проблем, которые оно тянет за собой;
* IQ-запросы не имеют смысла, если клиент-адресат не подключен к серверу,
  поэтому сервер "заворачивает" IQ-запросы в подобных случаях, удобно сообщая о
  появлении проблемы в нашем "канале передачи файла" — передающая сторона может
  просто прекратить передачу, приняв сообщение о такой ошибке. Проблемы с
  "ложным докачиванием файла" вновь подключившимся клиентом тоже не существует:
  IQ-запросы не попадают в офлайновое хранилище сообщений.

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

У каждой палки, как известно, два конца, поэтому за удобство приходится
расплачиваться:

* Увеличение общего трафика за счёт пакетов-"подтверждений";
* Механизм, использующий текстовые сообщения, _потенциально_ способен
  "прокачивать" информацию с более высокой скоростью за счёт отсутствия

  ожидания пакетов-"подтверждений", то есть IQ-пересылка в силу своей природы


  должна работать медленнее.



В реальной жизни никакого преимущества в скорости не выходит по двум причинам:


* Как правило, на Jabber-серверах имеет место ограничение на максимальную
  скорость клиентских потоков — так называемый "шейпинг" ("traffic shaping"), и
  это ограничение весьма серьёзно (ведь даже очень быстро набирающий текст
  человек не способен превысить порог в десяток символов за секунду, так что
  скорость потока можно смело ограничивать весьма сильно);
* Медленный канал вроде модема "съедает" различия в скорости даже при полном
  отсутствии ограничений на сервере.

Одним словом, внутриканальная передача файлов на основе IQ-запросов — выбор
пользователей с высоким IQ :)

#### <a id="Доступные_транспорты_на_основе_IQ-запросов"></a>Доступные транспорты на основе IQ-запросов

Увы, современная ситуация с такими транспортами не вполне хороша.

Текущая стабильная версия Ткаббера (0.9.9) реализует "устаревший" транспорт
**Jidlink/IBB**, а текущая альфа-версия реализует экспериментальный (и пока что
нестандартный) транспорт **SI/IQIBB**. Оба транспорта используют IQ-запросы в
качестве движка и оба успешно решают проблемы, присущие стандартному транспорту
**SI/IBB**.

Статус описанных протоколов таков:

* **Jidlink** официально отвергнут комитетом XMPP после некоторой стадии
  "обкатки", и стандартом теперь считается группа протоколов **SI**. Другими
  словами, **Jidlink** "административно мёртв". Это означает, что вряд ли стоит
  ожидать появления поддержки этого протокола в новых Jabber-клиентах, да и
  среди "старых" по-видимому только Ткаббер его поддерживает.
* **SI/IQIBB** это попытка Сергея Голованя "подружить" удачную конструктивную
  идею **Jidlink/IBB** и стандартность **SI**. Данный протокол пока что
  существует только в виде экспериментальной реализации в Ткаббере, его, как и
  **Jidlink**, нет в других клиентах, и пока что никто не нашёл времени и сил
  составить официальную заявку в комитет XMPP на регистрацю и "обкатку" этого
  протокола.

Ситуацию, однако, не следует считать такой уж плачевной: в конце концов на
связке Ткаббер-Ткаббер хорошо работает любой из этих протоколов, а механизм
рукопожатия из **SI** проигнорирует **SI/IQIBB** при попытке установления
SI-соединения с другим клиентом.

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

* Пересаживайте всех на Ткаббер (ну, это понятно),
* Помогите с составлением заявки в комитет XMPP :)

## <a id="Это_всё_хорошо_но_что_выбрать_для_моего_соединения"></a>Это всё хорошо, но что выбрать для *моего* соединения?
![(!)](../images/Hammer.png) **Сделать:** написать

## <a id="Благодарности"></a>Благодарности
Бо́льшую часть технических деталей о протоколах и их реализации автору объяснил
Сергей Головань `xmpp:sgolovan@nes.ru` — один из разработчиков Ткаббера.

## <a id="Скучные_сугубо_технические_ссылки"></a>Скучные сугубо технические ссылки
* [Главный Сайт Протокола XMPP](http://www.xmpp.org/). Здесь находятся ссылки
  на всю информацию, касающуюся протокола XMPP.
* [Список XEPs](http://www.xmpp.org/extensions/). _XEP_ это _XMPP Enhancement
  Proposal — Предложение по Расширению протокола XMPP._
   * [In-Band Bytestreams (IBB)](http://www.xmpp.org/extensions/xep-0047.html)
   * [Потоки байтов SOCKS5](http://www.xmpp.org/extensions/xep-0065.html)
   * [Out of Band Data (OOB)](http://www.xmpp.org/extensions/xep-0066.html)
   * [Stream Initiation (SI)](http://www.xmpp.org/extensions/xep-0095.html)
   * [Передача файлов на основе SI](http://www.xmpp.org/extensions/xep-0096.html)

* Старые XEP'ы, имеющие отношение к **Jidlink**:
   * [Reliable Entity Link (REL)](http://www.xmpp.org/extensions/xep-0041.html) —
     бывший **Jidlink.** Этот XEP является устаревшим.
   * [Список ревизий JEP-0041](http://www.xmpp.org/cgi-bin/viewcvs.cgi/cvs/jeps/0041/jep-0041.xml).
     Переименование **Jidlink** в **REL** произошло
     [между версиями 1.10 и 1.11 этого документа](http://www.xmpp.org/cgi-bin/viewcvs.cgi/cvs/jeps/0041/jep-0041.xml?r1=1.10&r2=1.11).
   * [Direct TCP (DTCP)](http://www.xmpp.org/extensions/xep-0046.html) —
     один из транспортов, которые использует **Jidlink.** Этот XEP является устаревшим.
   * [Jidlink file transfer](http://www.xmpp.org/cgi-bin/viewcvs.cgi/cvs/jeps/0052/jep-0052.xml);
     реализация в Ткаббере основана на версии 1.4 этого документа.
   * [Feature Negotiation](http://www.xmpp.org/extensions/xep-0020.html)
     используется **Jidlink'ом** в ходе рукопожатия.


>








|


|

|
|
|




|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|



|
|
<
<
<
<

|
<
<
<

|
<

|

|
|
|
|

|

|
|
|
|

|
<
<
<
<
<

|
<

|
|
<
<
<
<

|
<
<
<
<

|
<
<

|

|

|
<

|
<
|
|
<

|
<

|
|
<
<

|
<

|
<
<
|
<

|
<

<
|
<
<
<

|

|

|
<
<
<

|

|
<
<
|
<
<

|

|
|
<
<
<
<
|
>

|

|
|

|
|
<
|
<
|
|
<

|
<
<
<
<
<
<
<
<
<
<
<
<
<
<

>
>
>
>
>
>
>
>
>
|
<
<
<

|

|

|
|
|
<
<

|
|
<
<
<
<
<
<
<
<
<
<
<
<
<

>
>
>
>
>
>
>
|
<

|
<

|
|
<

|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
>
>
|
>

>
>
|
<
<
<
<

|
<
<

|
<
<
<

|
|

|
<
|
<
<
<
<
<
<
<
|
>
|
>
|
<
|
<
<

|

|
<
<
|
<
<

|

|
<
<

|
<
<
<
<
<
<
<

|
<

|
|
<
<

|

|
<

|
<
<

|
<
<
<

|
<
<
<

|

|



|



|



|



|

|

|
<
|
<
|
<

|

|
<

|

|



|



|
<



|
<

|
<
<
<



|
<

|
<
<



|



|
<
<
<
<

|

|
<
<

|
<
<

|
<

|
<
|
<

|
<

|
<
<
<
<
<

|
<

|

|

|

|
<
<
|

|
<

|
<
<

|

|



|

|
<
<
<
<



|
<
<



|
<
<

|
<

|

|
<
<

|
<

|

|
<
<
<

|

|
<
|
<
<
|
<
<
|
|
<
<
>
<
<

<
<
<
<
|
<

|
|

|

|
|
|
|
|
|

|

|
<
<
<
<

|
<

|
|
|
<

|

|
<
<
<

|

|
<
<
<

|

|
|

|
<

|
<
<

|
<
<
<
<

|

|
<

|
<
<
<
<
<

|
<
<
<
<
<
<
<

|
<
<
<
<
<
<
<

|
<
<
<
<
<
<
<
<
<
<
<

|
<
<

|
<
<

|
<
<
<
<
<
<
<
<
<
<

|
<
<
<
<
<
<
<
<

|
<
<

|

<
|
<

|
<
<
<
<
<

|
<

|
<
<
|
<
<
<
<
<

|
<
<
<

|
<

|
|
|
>
|
>
>
|
>

>
|
>

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<
<

|

<
|
<
<
<
|
<
<
<
<
<

<
|
<
<

|

|
|

|
|

|
|
<

|
|
<
<
|
|
|
|
|
|
>
|
|
<
|
<
<
<
|
<
|
|
|
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44




45
46



47
48

49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64





65
66

67
68
69




70
71




72
73


74
75
76
77
78
79

80
81

82
83

84
85

86
87
88


89
90

91
92


93

94
95

96

97



98
99
100
101
102
103



104
105
106
107


108


109
110
111
112
113




114
115
116
117
118
119
120
121
122
123

124

125
126

127
128














129
130
131
132
133
134
135
136
137
138
139



140
141
142
143
144
145
146
147


148
149
150













151
152
153
154
155
156
157
158
159

160
161

162
163
164

165
166


















167
168
169
170
171
172
173
174
175




176
177


178
179



180
181
182
183
184

185







186
187
188
189
190

191


192
193
194
195


196


197
198
199
200


201
202







203
204

205
206
207


208
209
210
211

212
213


214
215



216
217



218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241

242

243

244
245
246
247

248
249
250
251
252
253
254
255
256
257
258
259

260
261
262
263

264
265



266
267
268
269

270
271


272
273
274
275
276
277
278
279




280
281
282
283


284
285


286
287

288
289

290

291
292

293
294





295
296

297
298
299
300
301
302
303
304


305
306
307

308
309


310
311
312
313
314
315
316
317
318
319




320
321
322
323


324
325
326
327


328
329

330
331
332
333


334
335

336
337
338
339



340
341
342
343

344


345


346
347


348


349




350

351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366




367
368

369
370
371
372

373
374
375
376



377
378
379
380



381
382
383
384
385
386
387

388
389


390
391




392
393
394
395

396
397





398
399







400
401







402
403











404
405


406
407


408
409










410
411








412
413


414
415
416

417

418
419





420
421

422
423


424





425
426



427
428

429
430
431
432
433
434
435
436
437
438
439
440
441
442
443















444




445
446
447

448



449





450

451


452
453
454
455
456
457
458
459
460
461
462

463
464
465


466
467
468
469
470
471
472
473
474

475



476

477
478
479
480
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Пересылка_файлов:_теория/index.html)


# Пересылка файлов: теория

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Введение](#Введение)
* [2 Как соединены Вася@сервер1 и Петя@сервер2](#Как_соединены_Вася@сервер1_и_Петя@сервер2)
* [3 Обмен сообщениями + передача файлов = мезальянс?](#Обмен_сообщениями_+_передача_файлов_=_мезальянс)
* [4 Вася и Петя хотят передать файл](#Вася_и_Петя_хотят_передать_файл)
 * [4.1 Внутри и снаружи](#Внутри_и_снаружи)
* [5 Ху из ху?](#Ху_из_ху)
 * [5.1 Jidlink](#Jidlink)
 * [5.2 SI](#SI)
 * [5.3 HTTP (OOB)](#HTTP_OOB)
* [6 Две ступени к прекрасному](#Две_ступени_к_прекрасному)
* [7 Идеальная сеть и жестокая реальность](#Идеальная_сеть_и_жестокая_реальность)
* [8 И снова "внутри и снаружи": что выбрать?](#И_снова_внутри_и_снаружи_что_выбрать)
* [9 Спортивное ориентирование на местности доступных протоколов](#Спортивное_ориентирование_на_местности_доступных_протоколов)
 * [9.1 Jidlink](#Jidlink)
  * [9.1.1 Опции конфигурирования](#Опции_конфигурирования)
  * [9.1.2 Руководство по настройке](#Руководство_по_настройке)
 * [9.2 SI](#SI)
  * [9.2.1 Опции конфигурации](#Опции_конфигурации)
  * [9.2.2 Руководство по настройке](#Руководство_по_настройке)
 * [9.3 HTTP](#HTTP)
  * [9.3.1 Опции конфигурирования](#Опции_конфигурирования)
  * [9.3.2 Замечания по настройке](#Замечания_по_настройке)
  * [9.3.3 Настройка портфорвардинга для HTTP (OOB)](#Настройка_портфорвардинга_для_HTTP_OOB)
* [10 Тонкие различия протоколов](#Тонкие_различия_протоколов)
 * [10.1 Протоколы внутриканальной передачи данных](#Протоколы_внутриканальной_передачи_данных)
  * [10.1.1 Варианты реализации](#Варианты_реализации)
  * [10.1.2 Проблемы SI/IBB](#Проблемы_SI_IBB)
  * [10.1.3 Почему полезен IQ](#Почему_полезен_IQ)
  * [10.1.4 Доступные транспорты на основе IQ-запросов](#Доступные_транспорты_на_основе_IQ-запросов)
* [11 Это всё хорошо, но что выбрать для моего соединения?__](#Это_всё_хорошо_но_что_выбрать_для_моего_соединения__)
* [12 Благодарности](#Благодарности)
* [13 Скучные сугубо технические ссылки](#Скучные_сугубо_технические_ссылки)

# <a id="Введение"></a>Введение
Если вы туманно представляете себе этот вопрос или думаете, что два файла переслать — это как два пальца об асфальт, то перед тем как продолжить чтение, рекомендуем посетить [эту страничку](http://jabberworld.info/Передача_файлов) на jabberworld.info. Там вы получите необходимый минимум знаний, который поможет быстрее разобраться в премудростях файлопересылания. 





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




Совсем нетерпеливые могут прыгнуть [прямо к описанию настроек](Пересылка_файлов__теория.md#Спортивное_ориентирование_на_местности_доступных_протоколов). 


Вы ещё здесь? Отлично! Тогда приступим. И начнём с простого. 

# <a id="Как_соединены_Вася@сервер1_и_Петя@сервер2"></a>Как соединены Вася@сервер1 и Петя@сервер2
*  Джаббер-клиент Васи устанавливает соединение с сервером **сервер1**. 
*  Джаббер-клиент Пети — с сервером **сервер2**. 
*  **сервер1** и **сервер2** устанавливают соединение между собой. 

Теперь, когда Вася шлёт сообщение Пете, происходит следующее: 

*  васин клиент шлёт это сообщение своему серверу (**сервер1**). 
*  васин сервер посылает его петиному серверу (**сервер2**). 
*  петин сервер пересылает его петиному клиенту. 
*  Петя видит сообщение и радуется. 

Заметьте, что хотя между Васей и Петей есть _логическое_ соединение, реально каждый из них соединён только со своим сервером. Это — типичная ошибка начинающих пользователей: считать, что сообщение, посланное "на соседний компьютер", посылается прямо на этот соседний компьютер. (К примеру, в случае общения "через аську" в русском офисе сообщения на самом деле ходят через сервер, находящийся в Америке.) 






Соединение между васиным и петиным джаббер-клиентами мы будем называть _каналом._ 


# <a id="Обмен_сообщениями_+_передача_файлов_=_мезальянс"></a>Обмен сообщениями + передача файлов = мезальянс?
Во-первых, надо отметить, что "Jabber" — это "разговорное название" [протокола XMPP,](http://www.xmpp.org) и эта аббревиатура образована от термина _Extensible Messaging and Presence Protocol,_ означающего: _Расширяемый Протокол для обмена **Сообщениями** и информацией о Присутствии._ Обратите внимание на слово "сообщениями" — никакого упоминания о пересылке файлов. 





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





**На заметку:** любопытный читатель может получить представление о том, что летает по джаббер-сети, активизировав стандартный плагин "RAW XML Input" и открыв "Окно XML" из меню "Службы->Инструменты администратора". 



Передача файлов в эту концепцию _не_ вписывается. 

Однако, она иногда требуется. 

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


*  Jidlink. 

*  [Out of Band Data (OOB)](http://www.jabber.org/jeps/jep-0066.html) (по причинам, объяснённым ниже, в Ткаббере называется "HTTP").  
*  [Передача файлов](http://www.jabber.org/jeps/jep-0096.html), основанная на протоколе [SI](http://www.jabber.org/jeps/jep-0095.html). 


Независимо от протокола, поток байтов, который передаётся транспортом, именуется _"bytestream",_ то есть... правильно — "поток байтов". 


# <a id="Вася_и_Петя_хотят_передать_файл"></a>Вася и Петя хотят передать файл
Как мы помним, соедниение между **Вася@сервер1** и **Петя@сервер2** — чисто логическое, то есть _нет прямого соединения_ между васиным и петиным компьютерами. 



Протоколы джаббера предоставляют Васе две _принципиально различные_ возможности для того чтобы передать файл Пете: 


*  васин джаббер-клиент может установить _прямое соединение_ с петиным клиентом и передать файл, на время создав таким образом _физический канал_ между васиным и петиным компьютерами. 


*  васин джаббер-клиент может послать файл внутри существующего _логического канала_ между ним и петиным джаббер-клиентом. 


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



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




Рассмотрим это чуть подробнее, а заодно введём пару "официальных" терминов. 

## <a id="Внутри_и_снаружи"></a>Внутри и снаружи

С точки зрения пользователя джаббер-клиента самым серьёзным вопросом является то, _как_ передаются данные  файла. Как уже объяснялось выше, есть всего два способа это сделать: передать данные "внутри" имеющегося соединения и "снаружи". 




Отсюда — два термина: 

*  _In-band, IB ("в канале")_ — данные файла передаются внутри логического соединения между клиентами, то есть _опосредованно_ (в передаче участвуют не только клиенты, но и вся цепочка Джаббер-серверов между ними). 


*  _Out-of-band, OOB ("вне канала")_ — данные файла передаются _непосредственно_ между клиентами (или через прокси-сервер). Джаббер-серверы клиентов в передаче не участвуют. 



Термин "bytestream" не забывают и здесь, различая, соответственно 

*  In-band bytestreams (IBB) — внутриканальные потоки байтов. 
*  Out-of-band bytestreams (OOB) — внеканальные потоки байтов. 





**На заметку:** сторого говоря, термин "band" здесь следует переводить телекоммуникационным эквивалентом — "полоса", а приведённые термины означают "внутриполосную" и "внеполосную" передачу данных, соответственно. Но мы предпочтём простоту изложения академичности. 

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

# <a id="Ху_из_ху"></a>Ху из ху?
## <a id="Jidlink"></a>Jidlink

*  Поддерживает как in-band, так и out-of-band передачу. 
*  Никогда не являлся стандартным расширением Джаббера, и поэтому не является официальным. 

*  Из широко известных джаббер-клиентов, реализован только в Ткаббере. 

*  Для передачи данных в канале использует iq-паекты (IQ — это [подсистема Info/Query Джаббера](http://www.xmpp.org/specs/rfc3920.html#stanzas-semantics)). 
*  Для передачи данных вне канала использует протокол [Direct TCP (DTCP)](http://www.xmpp.org/extensions/xep-0046.html). 


## <a id="SI"></a>SI















*  Поддерживает как in-band, так и out-of-band передачу. 
*  Является стандартным расширением Джаббера (и самым новым транспортом для передачи файлов). 
*  Для передачи в канале может использовать: 
 *  текстовые сообщения — стандартный режим внутриканальной передачи (мы будем именовать этот режим аббревиатурой **SI/IBB**); 
 *  IQ-запросы — (пока ещё) нестандартный режим, реализованный в текущей альфа-версии Ткаббера, имеющий серьёзные преимущества перед стандартным (**SI/IQIBB**). 
 
*  Для передачи вне канала использует [потоки байтов SOCKS5](http://www.xmpp.org/extensions/xep-0065.html). 
*  Поддерживает опосредованные ("mediated") внеканальные соединения через специальные SOCKS5-прокси серверы (реализовано в текущей альфа-версии). 

Термин _SI (Stream Initiation)_ является весьма обобщённым и означает "создание потока". Имеется в виду организация дополнительного потока байтов по инициативе одного из клиентов. Нас в данном случае интересует создание потока для передачи файла. 




Теория относительно SOCKS5 дана [тут](Терминология.md#SOCKS5). 

## <a id="HTTP_OOB"></a>HTTP (OOB)

*  Является стандартным (и самым старым) способом передачи файлов. 
*  Поддерживает только передачу вне канала. 
*  Использует [протокол HTTP](http://ru.wikipedia.org/wiki/HTTP) для передачи данных; при этом инициатор во время передачи файла является HTTP-сервером, а получатель — клиентом. 



# <a id="Две_ступени_к_прекрасному"></a>Две ступени к прекрасному
Передача файла при помощи любого протокола состоит из двух последовательных фаз: 














1.  _"Рукопожатие",_ в ходе которого стороны договариваются о том, каким именно образом будет использован протокол. На этом этапе инициатор так же сообщает некоторую информацию о файле, а принимающая сторона должна подтвердить или отклонить запрос на передачу. 
1.  Собственно передача файла. 

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

**Внимание!** Этот выбор _осуществляется автоматически,_ так что то, как именно он будет осуществлён, зависит от настроек Ткаббера. 

**Важно понимать,** что каждый протокол передачи файлов _предпочитает **прямые (вне канала)** соединения_ внутриканальным. 


Постигнув теорию, спустимся с небес на землю и узнаем что же создаёт проблемы на пути лёгкой передачи файлов. 


# <a id="Идеальная_сеть_и_жестокая_реальность"></a>Идеальная сеть и жестокая реальность
В идеальной TCP/IP сети нет вирусов, кракеров, спама, идиотов, фанатиков, трафик бесплатен, и каждый компьютер имеет публичный IP-адрес. 


Во вполне реальном [Интернет](http://ru.wikipedia.org/wiki/Интернет) это всё есть, и поэтому: 



















*  Компьютеры, "смотрящие" в Интернет непосредственно, обычно защищены ["межсетевыми экранами"](http://ru.wikipedia.org/wiki/Межсетевой_экран) — программами, которые не позволяют подключиться к компьютеру "снаружи". 
*  Компьютеры, подключённые к Интернет опосредованно, как правило, делают это через нечто, осуществляющее [преобразование сетевых адресов](http://ru.wikipedia.org/wiki/NAT), что так же убивает возможность соединиться с такими компьютерами "снаружи". 

Некоторые люди также полагают, что иногда эту неприглядную ситуацию ещё сильнее ухудшают странные люди, именуемые "системными администраторами": они всеми доступными средствами изничтожают любую возможность "вылезти в свет" для скучающих офисных работников. 

Конкретные ситуации с соединениями на различных компьютерах могут сильно отличаться. Например, компьютер может совершать любые исходящие соединения, но не может принимать входящие. Или даже исходящие он может совершать только через [прокси-сервер](http://ru.wikipedia.org/wiki/Прокси-сервер). Бывают и более сложные условия. 

В любом случае, идея очевидна: _в Интернете_ протоколам, подразумевающим произвольные _прямые_ соединения между компьютерами живётся несладко. Интернет это ярко выраженный образчик клиент-серверной архитектуры: только серверы, предоставляющие специфические услуги (вроде HTTP, почты или Jabber), способны принимать соединения от своих клиентов. 





С другой стороны, в [локальных сетях](http://ru.wikipedia.org/wiki/LAN) ситуация зачастую совсем другая. В них, как правило, все компьютеры считаются добропорядочными и разрешают произвольные соединения друг с другом. 



**Главный вывод** из этого таков: _в Интернет,_ как правило, прямая передача информации между двумя "простыми" компьютерами невозможна. А это значит, что в таких условиях, возможно, придётся использовать способность некоторых протоколов передачи файлов посылать информацию внутри логического канала. 




# <a id="И_снова_внутри_и_снаружи_что_выбрать"></a>И снова "внутри и снаружи": что выбрать?
Ответьте для себя на два вопроса: 

1.  Может ли мой компьютер установить произвольное TCP/IP-соединение с удалённым компьютера? (_"активный"_ способ установить соединение) 

1.  Может ли удалённый компьютер установить произвольное соединение с моим компьютером? (_"пассивный"_ способ) 








Комбинация ответов "да" или "нет" на каждый из этих вопросов даст вам в руки руководство к действию: 

*  Если ваш компьютер _может установить_ произвольное TCP/IP-соединение, то вы можете _разрешить_ протоколам передачи файлов устанавливать _исходящие прямые_ соединения. 
*  Если ваш компьютер _принимает_ прямые подключения (например, он нахдится в локальной сети), то вы можете _разрешить_ протоколам передачи файлов принимать _входящие прямые_ соединения. 

*  Если "нет" является ответом на оба вопроса, запрещайте оба типа прямых соединений: in-band bytestreams — ваша единственная возможность пересылать файлы. 



**Внимание!** Необходимо чётко понимать две вещи: 

1.  _Все_ протоколы передачи файлов в джаббере _предпочитают прямую пересылку_ внутриканальной как наиболее быструю и создающую минимальную нагрузку на серверы. 


1.  Нет способа узнать будет ли работать прямая пересылка, не попробовав её, то есть протокол не может сказать окажется ли выбранный способ передачи работающим. 



Из этого нужно сделать **Самый Главный Вывод:** 

 _Если прямая передача не поддерживается вашим компьютером, **запретите** её в настройках, так как она с большой долей вероятности будет выбираться в ходе "рукопожатия" протокола передачи файлов и не будет работать._ 



**На заметку:** это "не будет работать" обычно выражается в том, что соединение долго "висит", и при этом никакой передачи файла не происходит. Причина обычно состоит в том, что межсетевой экран, отделяющий компьютер-адресат (или ваш компьютер) от внешней сети (обычно Интернет), молча "душит" "неправильные" с его точки зрения [IP-пакеты](http://ru.wikipedia.org/wiki/IP). При этом компьютер-передатчик (ваш компьютер), не получая никаких ответов на посылаемые пакеты, ожидает их в течение некоторого (большого) тайм-аута (к примеру, для ядра Linux 2.4.x он составляет около 10 минут). 








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


# <a id="Спортивное_ориентирование_на_местности_доступных_протоколов"></a>Спортивное ориентирование на местности доступных протоколов
Все приведённые опции конфигурации для протоколов доступны для изменения как через графический конфигуратор Ткаббера, так и через [**config.tcl** (секция "post-load")](http://tkabber.jabber.ru/files/doc/tkabber.html#s.postload). 



## <a id="Jidlink"></a>Jidlink

Этот протокол поддерживает как внеканальный, так и внутриканальный способы передачи файлов. 


Протокол **Jidlink** никогда не являлся частью стандарта **XMPP,** а поэтому считается устаревшим. Кроме того, этот протокол по-видимому не поддерживается ни одним из известных джаббер-клиентов, кроме Ткаббера. 



С другой стороны, это не означает, что этот протокол не следует использовать совсем — он отлично работает в случае соединения Ткаббер-Ткаббер. Кроме того, он имеет достаточно тонкое положительное отличие от аналогичного протокола — **SI/IBB,** которое будет обсуждаться ниже. 




С другой стороны, в отличие от **SI, Jidlink** не поддерживает опосредованные прямые соединения (mediated direct connections), поддержка которых уже есть в текущей альфа-версии Ткаббера. Подробнее об этих соединениях — в описании протокола **SI.** 




### <a id="Опции_конфигурирования"></a>Опции конфигурирования

Для конфигурирования протокола **Jidlink** доступны следующие опции: 

    ::ft::ftjl::options(enable)

Разрешает использовать **Jidlink.** По умолчанию _выключена._ 

    ::jidlink::transport(allowed,dtcp-active)

Разрешает инициировать _исходящие прямые_ соединения. По умолчанию включена. 

    ::jidlink::transport(allowed,dtcp-passive)

Разрешает принимать _входящие прямые_ соединения. По умолчанию включена. 

    ::jidlink::transport(allowed,inband-bytestream)

Разрешает внутриканальную передачу файлов. По умолчанию включена. 

### <a id="Руководство_по_настройке"></a>Руководство по настройке

*  Можете устанавливать произвольные исходящие прямые соединения? Оставьте включённым **dtcp-active.** 

*  Можете принимать произвольные входящие прямые соединения? Оставьте включённым **dtcp-passive.** 

*  Не можете ни того, ни другого? Оставьте включённой _только_ **inband-bytestream.** 


## <a id="SI"></a>SI

Протокол **SI** поддерживает как внеканальную, так и внутриканальную передачу файлов. 


### <a id="Опции_конфигурации"></a>Опции конфигурации

В текущей стабильной версии (0.9.9) доступны следующие настройки: 

    ::ft::si::options(enable)

Разрешает использовать **SI.** По умолчанию включена. 

     ::si::transport(allowed,http://jabber.org/protocol/bytestreams)

Разрешает использовать прямые соединения. _Как исходящие, так и входящие;_ здесь нет раздельных опций как у **Jidlink.** По умолчанию включена. 


     ::si::transport(allowed,http://jabber.org/protocol/ibb)

Разрешает использовать "стандартную "внутриканальную передачу файлов (текстовые сообщения, **SI/IBB**). По умолчанию включена. 


В ревизии 726 (2006-09-21) основной ветки разработки была добавлена реализация внутриканальной передачи авторства Сергея Голованя (`xmpp:sgolovan@nes.ru`), сочетающая достоинства SI и Jidlink — **SI/IQIBB**. Её использование можно контролировать следующей опцией: 




    ::si::transport(allowed,http://jabber.org/protocol/iqibb)

Разрешает использовать "нестандартную" внутриканальную передачу файлов (IQ-запросы). По умолчанию включена. 


В ревизии 727 (2006-09-23) основной ветки разработки был а добавлена реализация поддержки опосредованных прямых SOCKS5-соединений. Она контролируется следующими опциями: 



    ::si::socks5::initiator::options(enable_mediated_connection)

Разрешает использовать опосредованные прямые соединения. По умолчанию включена. 

    ::si::socks5::initiator::options(proxy_servers)

Список имён прокси серверов, соединение через которые следует пытаться установить. Пробуются все сервера в списке по порядку. По умолчанию список состоит из одного сервера — `proxy.jabber.org`; сервера в списке должны быть разделены пробелами. Список публичных прокси-серверов можно найти на [juick.info](http://juick.info/jabber:socks5_proxy_list) 





### <a id="Руководство_по_настройке"></a>Руководство по настройке

В отличие от **Jidlink, SI** не имеет раздельных опций настройки приёма и передачи для внеканальных соединений, поэтому важно понимать как именно устанавливается прямое SOCKS5-соединение в этом протоколе. 



 В **SI** _инициатор_ посылки _открывает слушающий сокет_ на своём компьютере (то есть _является TCP-сервером_), а _принимающая сторона — пытается подключиться_ к нему (то есть _является TCP-клиентом_). 



Иными словами, поведение внеканальной передачи в **SI** сильно зависит от того, кто посылает файл, а кто — его принимает: 


*  Если вы _посылаете_ файл, то ваш компьютер должен иметь возможность _принимать_ произвольные TCP/IP соединения. 

*  Если вы _принимаете_ файл, что ваш компьютер должен иметь возможность _создавать_ произвольные TCP/IP соединения. 


Нетрудно заметить, что эта схема создания внеканальных соединений обратна той, которую использует **Jidlink.** 


Ещё раз отметим, что в **SI** приём и передача для внеканальных соединений не регулируются раздельно. А это означает, что если ваш компьютер "не дружит" с _любым_ из способов установления прямых соединений (активным или пассивным), вам лучше держать соответствующую опцию _выключенной,_ и включать её специально в нужных случаях, когда вы уверены в том, что внеканальная передача будет работать. 






Транспорт **SI/IQIBB** имеет более высокий приоритет при рукопожатии, чем **SI/IBB.** 


![(!)](../images/Hammer.png) **Сделать:** написать про mediated connections 

## <a id="HTTP"></a>HTTP

Этот протокол поддерживает только прямые соединения, при этом: 

*  сторона, _посылающая_ файл, выступает как HTTP-сервер и должна иметь возможность _принимать произвольные входящие соединения._ 


*  сторона, _принимающая_ файл, должна иметь возможность установки _исходящего прямого соединения по протоколу HTTP (на произвольный порт)._ 

Иными словами, получатель "скачивает" файл с машины посылающего, выступая в качестве "активной" стороны. 


Теоретически, поскольку принимающая сторона получает файл при помощи запроса **GET** протокола **HTTP,** _получатель_ может установить соединение этого типа через HTTP-прокси.. Однако, в Ткаббере эта возможность не реализована. 



### <a id="Опции_конфигурирования"></a>Опции конфигурирования

В текущей стабильной версии (0.9.9) протокол управляется всего одной опцией: 

    ::ft::http::options(enable)

Разрешает использовать протокол **HTTP (OOB).** По умолчанию включена. 

Начиная с ревизии 731 (2006-09-25) в основную ветку разработки включен код авторства Antoni Grzymala, добавляющий возможность прямой посылки файла с компьютера, находящегося за [NATP-устройством](http://ru.wikipedia.org/wiki/NAT) со специально настроенным [портфорвардингом](http://en.wikipedia.org/wiki/Port_forwarding): 





    ::ft::http::options(port)

Порт, который следует посылать при рукопожатии на удалённую сторону (принимающую файл). По умолчанию имеет значение 0, означающее, что порт будет выбран автоматически на локальной машине. 



    ::ft::http::options(host)

Имя хоста или IP адрес, который следует посылать при рукопожатии на удалённую сторону. По умолчанию пуста; в этом случае посылается сетевое имя локальной машины. 



**Примечание:** если доступен пакет **Tclx,** то будет передан IP адрес локальной машины, в который "разрешается" её сетевое имя. 


### <a id="Замечания_по_настройке"></a>Замечания по настройке

Настраивать этот протокол имеет смысл только в том случае, если ваша машина поддерживает прямые соединения или же у вас есть возможность настроить портфорвардинг, как описано ниже. 



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


### <a id="Настройка_портфорвардинга_для_HTTP_OOB"></a>Настройка портфорвардинга для HTTP (OOB)

**Следует понимать,** что реализация такой схемы требует настройки NATP-устройства, то есть вы либо должны иметь к нему физический доступ (администрировать его), либо [хорошо попросить ;)](http://www.ararat.ru) о такой настройке лицо, администирущее ваш NAT. 




Ключевые идеи подобной настройки портфорвардинга: 

*  При _передаче_ файла Ткаббер на нашей машине будет выступать в роли HTTP-сервера, "отдающего" файл; 

*  Если наша машина имеет IP адрес из "приватного" диапазона (например, находится, в локальной сети), прямой доступ к ней "снаружи" (из Интернета) невозможен; 


*  Однако, если доступ "наружу" нашей машине обеспечивает NATP-устройство, на нём возможно настроить отображение какого-либо _фиксированного_ порта на какой-либо другой _фиксированный_ порт нашей машины. 


*  При такой настройке наш Ткаббер в ходе фазы рукопожатия протокола OOB должен сообщать удалённому Ткабберу адрес хоста и номер порта _своего NAT'а,_ а не свои. При этом удалённый Ткаббер осуществит TCP-соединение с вашим NAT'ом, и вследствие действия механизма "проброса порта", соединение реально произойдёт с соответсвующим портом на вашей машине, на котором будет "слушать" Ткаббер. 



Таким образом, опции "port" и "host", описанные выше, в случае настройки портфорвардинга, должны содержать "пробрасываемый" порт на NAT'е и имя хоста (или IP адрес ) NAT'а, соответственно. 







Для "штатного" режима работы следует установить опцию "port" в значение 0, а опции "host" присвоить пустую строку. 


# <a id="Тонкие_различия_протоколов"></a>Тонкие различия протоколов
Это — "хардкорный" раздел, так как бла-бла... 

## <a id="Протоколы_внутриканальной_передачи_данных"></a>Протоколы внутриканальной передачи данных

Раньше я пользовался
 обычными протоколами передачи данных,
 и передавали они вечно всякую хрень.
 Но с тех пор, как я пользуюсь IQ,
 по каналам лезет одна философия.
 Дело в IQ? 

© [Bigote](Участник_Bigote.md) 

Тема данного раздела узка: поведение различных протоколов внутриканальной передачи данных на _медленных и ненадёжных_ соединениях (в основном, на "dial-up" и GPRS-линках). Именно на них "всплывают" как интересные особенности реализации TCP/IP в операционных системах и интерпретаторе Tcl, так и невнимание некоторых разработчиков к проблемам нестабильных соединений. 





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


*  **Jidlink/IBB**; 
*  **SI/IBB** — "штатный" внутриканальный транспорт группы протоколов SI; 
*  **SI/IQIBB** — экспериментальный внутриканальный транспорт группы протоколов SI. 


В текущей стабильной версии транспорт **SI/IQIBB** отсутствует. 

**Имейте в виду,** что приведённые названия протоколов не являются официальными и введены нами для удобного сравнительного именования: форма `ГРУППА_ПРОТОКОЛОВ/ТРАНСПОРТ` позволяет одновременно указать "групповую принадлежность" транспорта и его конкретную реализацию. 




### <a id="Варианты_реализации"></a>Варианты реализации

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




На данный момент существуют две концепции её решения: 

*  использование текстовых сообщений (строфа `message`); 
*  использование IQ-запросов (строфа `iq`). 

Теоретически, у них есть свои слабые и сильные стороны, однако на практике IQ-запросы выигрывают. Ниже мы объясним — почему. 


Официально, в настоящий момент XMPP поддерживает только три протокола передачи файлов: **HTTP, SI/bytestreams, SI/IBB,** и из них только один (**SI/IBB**) предназначен для внутриканальной передачи файлов. 



Протокол **SI/IBB** использует посылку текстовых сообщений в качестве "движка": пересылаемый файл бьётся на небольшие куски ("чанки", на жаргоне), каждый из которых кодируется при помощи алгоритма [base64](http://ru.wikipedia.org/wiki/Base64) и пересылается принимающему клиенту как текстовое сообщение. 





### <a id="Проблемы_SI_IBB"></a>Проблемы SI/IBB

Есть две проблемы, которые делают применение **SI/IBB** затруднительным на медленных и нестабильных линиях. 


Во-первых, в XMPP нет механизма подтверждения доставки текстовых сообщений (так как они доставляются гарантированно). Это приводит к тому, что невозможно узнать, принят ли уже данный кусок получателем или ещё нет. Из-за этого _типичная реализация **SI/IBB** "вливает" весь файл в передаваемый XML-поток с максимально возможной скоростью._ И тут в игру вступает системное кэширование на пару с забитием полосы пропускания канала. 






В Ткаббере, при передаче через подсистему [сетевых сокетов](http://ru.wikipedia.org/wiki/Сокет_(Программный_интерфейс)) Tcl, информация кэшируется на двух уровнях: в буферах интерпретатора Tcl и в буферах стека TCP/IP ядра операционной системы. Эти буферы достаточно велики: к примеру, штатно настроенная реализация TCP/IP ядра Linux серии 2.4.x предоставляет каждому соединению передающий буфер размером 16 килобайт. Буфер интерпретатора Tcl значительно больше — на машине автора статьи Tcl 8.4.9 спокойно поглощал "за один присест" файл размером 1,2 мегабайта. 








Буферизация в большинстве случаев весьма полезна, однако на медленном канале она играет с Ткаббером злую шутку: передача файла размером 1-2 мегабайта в таких условиях с точки зрения Ткаббера происходит моментально — файл поглощается буферами тикля и ОС, после чего начинает медленно вливаться в _физический_ канал передачи (скорость которого на модеме составляет не больше трёх килобайт в секунду, а зачастую — меньше двух). Если пользователь вдруг решает отменить посылку файла, это уже невозможно — диалог посылки файла успешно закрыт. 








Но не это самое неприятное, самое неприятное — это "забитие" полосы пропускания канала. Поскольку сеанс связи по протоколу XMPP фактически представляет собой два XML-потока (от клиента на сервер и обратно), любое сообщение от клиента добавлятся в конец "клиентского" потока, и оно не может нагло пролезть без очереди для отправки на сервер, равно как и нет возможности открыть альтернативный поток. Это означает, что пока наш файл томительно "вливается" в медленный канал, любая наша активность в виде исходящих сообщений будет просто добавляться в "хвост" потока, "голова" которого ещё "не пролезла" на сервер. Причём из-за того, что потоки на приём и передачу — разные, несчастный пользователь получает входящие сообщения (например, наблюдает активность в чатах), но сам он до окончания передачи файла эффективно отстранён от активных действий. 












Вторую проблему с **SI/IBB** создаёт комбинация из поддержки сервером ["офлайнового" хранения сообщений](http://www.xmpp.org/extensions/xep-0013.html) и ненадёжного соединения со стороны получателя файла. 



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



Однако, представьте ситуацию: в момент передачи файла при помощи посылки текстовых сообщений физический канал получателя даёт сбой. Сервер получателя через определённое (заметим, что довольно немаленькое) время осознаёт, что TCP/IP-соединение с клиентом разорвано. При этом сообщения, пришедшие за период от разрыва физического канала до разрыва логического, _теряются безвозвратно_ (сервер отсылает их, не зная, что клиент "отвалился"), а остальные начинают складываться в офлайновое хранилище. (Потеря сообщений, описанная только что, на самом деле имеет более широкие последствия, чем проблемы при передаче файлов: файлы мы шлём редко, а разговариваем постоянно, так что уверенность в доставке **всех** сообщений на любом, даже самом поганом соединении — жизненно важный вопрос.) 











Вновь подключившийся к серверу клиент, принимавший файл, ничего "не помнит" про имевший место приём файла (**SI/IBB** не поддерживает докачку), но несмотря на это, сервер начинает передавать клиенту все поступившие за время отсутствия клиента текстовые сообщения, которыми вполне может оказаться "долившийся" за это время длинный файл. Эти сообщения будут выбрасываться клиентом (так как они не относятся ни к какому логическому каналу передачи файлов), но никакой возможности "не скачивать" такие сообщения у клиента нет. На медленном канале визуально это выглядит как "подвиснувший" Ткаббер при активности на приёмном устройстве. 









О реализации в существующих Jabber-серверах неких "умных" алгоритмов особой обработки текстовых сообщений в подобных случаях нам ничего неизвестно; судя по-всему, их нет. 



### <a id="Почему_полезен_IQ"></a>Почему полезен IQ


Второй разновидностью "движка" для внутриканальной посылки файлов является использование механизма IQ-запросов, которые предназначены для получения всевозможной информации об участниках XMPP-сети. 


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






А этот простой факт одним махом решает обе проблемы, присущие простым текстовым сообщениям транспорта **SI/IBB**: 


*  Можно посылать следующий пакет с данными файла только после того, как принят ответ-"подтверждение" на предыдущий, а значит, нет проблемы с "поглощением" файла системными буферами и всех проблем, которые оно тянет за собой; 


*  IQ-запросы не имеют смысла, если клиент-адресат не подключен к серверу, поэтому сервер "заворачивает" IQ-запросы в подобных случаях, удобно сообщая о появлении проблемы в нашем "канале передачи файла" — передающая сторона может просто прекратить передачу, приняв сообщение о такой ошибке. Проблемы с "ложным докачиванием файла" вновь подключившимся клиентом тоже не существует: IQ-запросы не попадают в офлайновое хранилище сообщений. 






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




У каждой палки, как известно, два конца, поэтому за удобство приходится расплачиваться: 


*  Увеличение общего трафика за счёт пакетов-"подтверждений"; 
*  Механизм, использующий текстовые сообщения, _потенциально_ способен "прокачивать" информацию с более высокой скоростью за счёт отсутствия ожидания пакетов-"подтверждений", то есть IQ-пересылка в силу своей природы должна работать медленнее. 

В реальной жизни никакого преимущества в скорости не выходит по двум причинам: 

*  Как правило, на Jabber-серверах имеет место ограничение на максимальную скорость клиентских потоков — так называемый "шейпинг" ("traffic shaping"), и это ограничение весьма серьёзно (ведь даже очень быстро набирающий текст человек не способен превысить порог в десяток символов за секунду, так что скорость потока можно смело ограничивать весьма сильно); 
*  Медленный канал вроде модема "съедает" различия в скорости даже при полном отсутствии ограничений на сервере. 

Одним словом, внутриканальная передача файлов на основе IQ-запросов — выбор пользователей с высоким IQ :) 

### <a id="Доступные_транспорты_на_основе_IQ-запросов"></a>Доступные транспорты на основе IQ-запросов

Увы, современная ситуация с такими транспортами не вполне хороша. 
















Текущая стабильная версия Ткаббера (0.9.9) реализует "устаревший" транспорт **Jidlink/IBB**, а текущая альфа-версия реализует экспериментальный (и пока что нестандартный) транспорт **SI/IQIBB**. Оба транспорта используют IQ-запросы в качестве движка и оба успешно решают проблемы, присущие стандартному транспорту **SI/IBB**. 





Статус описанных протоколов таков: 


*  **Jidlink** официально отвергнут комитетом XMPP после некоторой стадии "обкатки", и стандартом теперь считается группа протоколов **SI**. Другими словами, **Jidlink** "административно мёртв". Это означает, что вряд ли стоит ожидать появления поддержки этого протокола в новых Jabber-клиентах, да и среди "старых" по-видимому только Ткаббер его поддерживает. 



*  **SI/IQIBB** это попытка Сергея Голованя "подружить" удачную конструктивную идею **Jidlink/IBB** и стандартность **SI**. Данный протокол пока что существует только в виде экспериментальной реализации в Ткаббере, его, как и **Jidlink**, нет в других клиентах, и пока что никто не нашёл времени и сил составить официальную заявку в комитет XMPP на регистрацю и "обкатку" этого протокола. 







Ситуацию, однако, не следует считать такой уж плачевной: в конце концов на связке Ткаббер-Ткаббер хорошо работает любой из этих протоколов, а механизм рукопожатия из **SI** проигнорирует **SI/IQIBB** при попытке установления SI-соединения с другим клиентом. 



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

*  Пересаживайте всех на Ткаббер (ну, это понятно), 
*  Помогите с составлением заявки в комитет XMPP :) 

# <a id="Это_всё_хорошо_но_что_выбрать_для_моего_соединения__"></a>Это всё хорошо, но что выбрать для моего соединения?__
![(!)](../images/Hammer.png) **Сделать:** написать 

# <a id="Благодарности"></a>Благодарности
Бо́льшую часть технических деталей о протоколах и их реализации автору объяснил Сергей Головань `xmpp:sgolovan@nes.ru` — один из разработчиков Ткаббера. 


# <a id="Скучные_сугубо_технические_ссылки"></a>Скучные сугубо технические ссылки
*  [Главный Сайт Протокола XMPP](http://www.xmpp.org/). Здесь находятся ссылки на всю информацию, касающуюся протокола XMPP. 


*  [Список XEPs](http://www.xmpp.org/extensions/). _XEP_ это _XMPP Enhancement Proposal — Предложение по Расширению протокола XMPP._ 
 *  [In-Band Bytestreams (IBB)](http://www.xmpp.org/extensions/xep-0047.html) 
 *  [Потоки байтов SOCKS5](http://www.xmpp.org/extensions/xep-0065.html) 
 *  [Out of Band Data (OOB)](http://www.xmpp.org/extensions/xep-0066.html) 
 *  [Stream Initiation (SI)](http://www.xmpp.org/extensions/xep-0095.html) 
 *  [Передача файлов на основе SI](http://www.xmpp.org/extensions/xep-0096.html) 
 
*  Старые XEP'ы, имеющие отношение к **Jidlink**: 
 *  [Reliable Entity Link (REL)](http://www.xmpp.org/extensions/xep-0041.html) — бывший **Jidlink.** Этот XEP является устаревшим. 

 *  [Список ревизий JEP-0041](http://www.xmpp.org/cgi-bin/viewcvs.cgi/cvs/jeps/0041/jep-0041.xml). Переименование **Jidlink** в **REL** произошло [между версиями 1.10 и 1.11 этого документа](http://www.xmpp.org/cgi-bin/viewcvs.cgi/cvs/jeps/0041/jep-0041.xml?r1=1.10&r2=1.11). 



 *  [Direct TCP (DTCP)](http://www.xmpp.org/extensions/xep-0046.html) — один из транспортов, которые использует **Jidlink.** Этот XEP является устаревшим. 

 *  [Jidlink file transfer](http://www.xmpp.org/cgi-bin/viewcvs.cgi/cvs/jeps/0052/jep-0052.xml); реализация в Ткаббере основана на версии 1.4 этого документа. 
 *  [Feature Negotiation](http://www.xmpp.org/extensions/xep-0020.html) используется **Jidlink'ом** в ходе рукопожатия 


Changes to wiki/ru/Плагины.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402

403
404
405
406
407
408
409

410
411
412
413
414
415

416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477






478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553

554
555

556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629

630

631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689


690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774


775
776
777

778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025


1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058

1059
1060
1061
1062

1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074

1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091

1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144




1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190

1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278

1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316

1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380

1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405






1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541


1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586


1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609

1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785


1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908


1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199

2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307


[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Плагины/index.html)


# Плагины

Материал из Tkabber Wiki

![(!)](../images/Hammer.png) **Сделать:** вынести на отдельные странички
описания плагинов, превышающие по размерам половину экрана (примерно, конечно),
оставив здесь лишь краткие пояснения и ссылки.

## <a id="toc"></a>Содержание

* [1 Плагинология](#Плагинология)
   * [1.1 Как подключить плагин](#Как_подключить_плагин)
   * [1.2 Подводные камни при обновлении Ткаббера](#Подводные_камни_при_обновлении_Ткаббера)
   * [1.3 Анатомия плагина](#Анатомия_плагина)
   * [1.4 Сисадмину на заметку](#Сисадмину_на_заметку)
   * [1.5 Советы разработчику плагинов](#Советы_разработчику_плагинов)
* [2 Официальные плагины для Ткаббера](#Официальные_плагины_для_Ткаббера)
   * [2.1 Abbrev](#Abbrev)
   * [2.2 Aniemoticons](#Aniemoticons)
   * [2.3 Attline](#Attline)
   * [2.4 Ctcomp](#Ctcomp)
   * [2.5 Custom URLs](#Custom_URLs)
   * [2.6 Floating Log](#Floating_Log)
   * [2.7 Floating Roster Contact](#Floating_Roster_Contact)
   * [2.8 Gmail Notifications](#Gmail_Notifications)
   * [2.9 Histool](#Histool)
   * [2.10 Open URL](#Open_URL)
   * [2.11 Presencecmd](#Presencecmd)
   * [2.12 Quote Last Message (quotelastmsg)](#Quote_Last_Message_quotelastmsg)
   * [2.13 Receipts](#Receipts)
   * [2.14 Recentstatus](#Recentstatus)
   * [2.15 Singularity](#Singularity)
   * [2.16 Stripes](#Stripes)
   * [2.17 Tclchat](#Tclchat)
   * [2.18 Tkabber-KHIM](#Tkabber-KHIM)
   * [2.19 Unixkeys](#Unixkeys)
* [3 Полуофициальные плагины для Ткаббера](#Полуофициальные_плагины_для_Ткаббера)
   * [3.1 Alarm](#Alarm)
   * [3.2 Antispam](#Antispam)
   * [3.3 Autoanswer](#Autoanswer)
   * [3.4 Autosubscribe](#Autosubscribe)
   * [3.5 Bldjid](#Bldjid)
   * [3.6 Customstatus](#Customstatus)
   * [3.7 Flip](#Flip)
   * [3.8 Green](#Green)
   * [3.9 Hidemuctopic](#Hidemuctopic)
   * [3.10 Juick](#Juick)
   * [3.11 Killerfeature](#Killerfeature)
   * [3.12 Notes](#Notes)
   * [3.13 Now Playing](#Now_Playing)
   * [3.14 Open History](#Open_History)
   * [3.15 Plugin Manager](#Plugin_Manager)
   * [3.16 Reminder](#Reminder)
   * [3.17 Snoopstatus](#Snoopstatus)
   * [3.18 Urgent](#Urgent)
   * [3.19 Urlcmd](#Urlcmd)
* [4 Неофициальные плагины](#Неофициальные_плагины)
   * [4.1 8bitgw](#8bitgw)
   * [4.2 Autoconnect](#Autoconnect)
   * [4.3 Autoraise](#Autoraise)
   * [4.4 Autoretrieve](#Autoretrieve)
   * [4.5 Bmuc](#Bmuc)
   * [4.6 Bookmarks](#Bookmarks)
   * [4.7 Chess-mod](#Chess-mod)
   * [4.8 Clienticons](#Clienticons)
   * [4.9 Confirm](#Confirm)
   * [4.10 CryptoConfig](#CryptoConfig)
   * [4.11 Cyrillize2](#Cyrillize2)
   * [4.12 Follownick](#Follownick)
   * [4.13 Goto (заготовка для плагина)](#Goto_заготовка_для_плагина)
   * [4.14 Hihglight XEP and RFC URLs](#Hihglight_XEP_and_RFC_URLs)
   * [4.15 Highlightex](#Highlightex)
   * [4.16 Histballoon](#Histballoon)
   * [4.17 Jdiskurl](#Jdiskurl)
   * [4.18 Last Activity](#Last_Activity)
   * [4.19 Meebo me](#Meebo_me)
   * [4.20 Mimetex](#Mimetex)
   * [4.21 Nickomp](#Nickomp)
   * [4.22 NickSaneColors](#NickSaneColors)
   * [4.23 OSD redux](#OSD_redux)
   * [4.24 Patches](#Patches)
   * [4.25 Postpone Text (добавлен в транк)](#Postpone_Text_добавлен_в_транк)
   * [4.26 Reject subscription](#Reject_subscription)
   * [4.27 Remote Commands](#Remote_Commands)
   * [4.28 Remote IP Address](#Remote_IP_Address)
   * [4.29 Remote Settings](#Remote_Settings)
   * [4.30 Roster Avatars](#Roster_Avatars)
   * [4.31 Rsssaver](#Rsssaver)
   * [4.32 Savebtn](#Savebtn)
   * [4.33 Server Info](#Server_Info)
   * [4.34 So\_keepalive](#So_keepalive)
   * [4.35 Spam filter](#Spam_filter)
   * [4.36 Tab number](#Tab_number)
   * [4.37 Tkabho](#Tkabho)
   * [4.38 Vcardavatars](#Vcardavatars)
   * [4.39 Wintweaks (устарел)](#Wintweaks_устарел)

## <a id="Плагинология"></a>Плагинология
В этом разделе рассказано о внешних плагинах Ткаббера.

Если вы — новичок, прочитайте как минимум первые два раздела.

### <a id="Как_подключить_плагин"></a>Как подключить плагин

При старте Ткаббер ищет плагины в двух местах и в указанном порядке:

1. Каталог, имя которого находится в переменной окружения **TKABBER\_SITE\_PLUGINS**
1. Каталог **[$::configdir]($__configdir.md)/plugins**

Любой из этих каталогов (в том числе оба) могут отсутствовать. Первый из них,
как и следует из названия соответствующей переменной окружения, предназначен
для использования плагинов всеми пользователями системы, в то время как второй
— конкретным пользователем (то есть лично вами). Строго говоря, переменную
окружения можно установить не на уровне системы, а для конкретного
пользователя, что несколько гибче. К тому же её вообще можно просто прописать в
конфиге:

    set env(TKABBER_SITE_PLUGINS) Q:/Path/To/TkabberPluginsDirectory

Обратите внимание на прямые слэши, а ещё лучше — ознакомьтесь сначала с
[**этим небольшим отрывком**](Config.tcl.md#Немного_о_синтаксисе_тикля) из статьи про
конфиг.

Физически плагин Ткаббера представляет собой _каталог_ с файлами, который
следует скопировать в любую из указанных выше директорий (но только в одну из
них). Заметьте, что копировать надо каталог целиком, а не файлы из него; кроме
того, каталог плагина нельзя переименовывать (об этом — ниже). И ещё надо
учесть, что в каталоге **plugins** должны лежать непосредственно директории с
плагинами, и ничего в промежутке, например, если вы работаете в системе как
Vasya Pupkin, и решили поставить плагины **attline**, **georoster** и **chess**,
то если вы всё сделали правильно, вы должны получить такую структуру каталогов:

    C:\Documents and Settings\
      Vasya Pupkin\
        Application Data\
          Tkabber\
            plugins\
              attline\
                attline.tcl
                ...
              chess\
                chess.tcl
                ...
              georoster\
                georoster.tcl
                ...

Добавленный плагин Ткаббер загрузит при следующем старте.

**На заметку:** как ни странно, но некоторых пользователей на поприще
подключения плагина останавливало отсутствие каталога `plugins` в домашнем
каталоге Ткаббера. Это — совершенно нормальное явление; если такого каталога
нет, создайте его.

**На заметку:** не обязательно копировать каталог с плагином из дистрибутива в
**[$::configdir]($__configdir.md)/plugins** — вполне можно сделать
[**символическую ссылку**](Symlinks.md), например, такую:

    ~/.tkabber/plugins/latex → /usr/local/share/tkabber-svn/tkabber-plugins/latex

Имейте в виду, что Ткаббер не спускается в подкаталоги при поиске плагинов,
поэтому не имеет смысла линковать  сам каталог с плагинами из дистрибутива
_под_ какой-либо каталог плагинов Ткаббера. Зато вполне можно его _заместить,_
создав симлинк, например, так:

    ~/.tkabber/plugins → /usr/local/share/tkabber-svn/tkabber-plugins

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

**Внимание:** с появлением в составе Ткаббера так называемого Менеджера
плагинов (в настройках выглядит как кнопка "Plugins Management") очень многие
пользователи (и автор этих строк в том числе) забывают после установки плагина
включить его в этом самом Менеджере. Там всё просто и быстро. Идём в
вышеозначенное место, ищем плагин, включаем галочку, сохраняем изменения. Всё.
Плагин на ходу загружается и работает. При "горячем" отключении, кстати, он _не
выгружается из памяти,_ а просто выключается (его функциональность становится
недоступной). Если точнее, кое-что всё-таки выгружается, и это зависит от
автора (впрочем, полная выгрузка плагинов на данный момент пока невозможна).
Естественно, не все плагины можно включить-выключить таким способом, а лишь те,
чьи авторы об этом позаботились. Очень желательно поэтому, когда вы
выкладываете сюда свой плагин, оборудованный этой возможностью, напоминать
пользователям, чтобы после установки они пошли в Менеджер и включили плагин,
потому что _по умолчанию Ткаббер их не подключает._ Имеется шаблон для вики,
позволяющий вставлять в текст статьи хорошо заметную надпись. В нужное место
(лучше всего в самом начале) следует поместить следующий код разметки:

    == My Plugin ==
    {{plugmgr}}

Выглядеть надпись будет так: ![(!)](../images/Ok_icon.png) **Включить в
Менеджере плагинов **

Пользователям, желающим установить себе такой плагин, следует помнить, что
Менеджер плагинов имеется лишь в svn-версии Ткаббера (а если точнее, его не
имеется в 0.11.1 и более древних версиях — есть надежда, что 0.12 всё же
выйдет, и, кстати, выйдет она не раньше, чем _все_ плагины будут снабжены
возможностью динамической загрузки/выгрузки).

### <a id="Подводные_камни_при_обновлении_Ткаббера"></a>Подводные камни при обновлении Ткаббера

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

Это означает, что обновляя Ткаббер, — не важно, "снимаете" ли вы копию из
репозитория или устанавливаете следующий стабильный релиз — нужно всегда
помнить про установленные плагины и обновлять их вместе с Ткаббером.

Невнимание к этому факту порождает 99% проблем из серии "после обновления
Ткаббер сыплет ошибками". Обновите плагины и перезапустите Ткаббер.

**На заметку:** иногда возникает обратная проблема: вы даёте плагин от "свежей"
версии Ткаббера своему товарищу с более старой версией этой программы, и там он
не работает. Решением проблемы, если обновление Ткаббера невозможно, является
установка плагинов от соответствующей более старой версии Ткаббера, которые
доступны вместе со своими плагинами
[здесь](http://jabberstudio.org/projects/tkabber/releases/).

### <a id="Анатомия_плагина"></a>Анатомия плагина

В простейшем случае каталог плагина содержит один-единственный файл формата
".tcl", имя которого совпадает с именем каталога; именно этот файл Ткаббер
читает при загрузке плагина. Если в каталоге есть другие файлы **.tcl**, то они
загружаются, как правило, главным файлом плагина или вообще служат для какой-то
другой цели.

Вообще же, только главный файл плагина присутствует всегда, а остальное
содержимое каталога плагина может быть в принципе любым. Зачастую там есть
документация (например, файл README), которую, конечно же, стоит изучить. Также
там могут быть различные данные, используемые плагином, например, в плагинах
игр, использующих графику (шахматы, шашки), можно найти ещё подкаталог **pixmaps**,
где хранятся изображения доски и фигур.

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

Каталог **msgs**, если есть, содержит переводы текстовых ресурсов плагина (текста
сообщений и т.п.) на языки, отличные от английского. Этот каталог может быть
интересен с двух точек зрения:

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

        ::msgcat::mcload ...

    (это загрузка каталогов с текстовыми ресурсами) и окружите её строчками:

        set orig [::msgcat::mclocale]

        ::msgcat::mclocale LC

    сверху и

        ::msgcat::mclocale $orig

    — снизу. Вместо "LC" должна быть интересующая вас локаль (например, ru,
    uk, es и т.д.).
* Во-вторых, каталог **msgs** — это именно то, что вам нужно менять, если
  вы хотите "перевести" плагин на какой-либо другой язык или исправить уже
  имеющийся перевод. Подробнее о технике перевода текстовых ресурсов Tcl
  рассказано [**тут**](Tkabber_Wiki_Справка.md#Локализация_Ткаббера).

Каталог **.svn**, если есть, содержит техническую информацию системы контроля
версий Subversion, которая используется при разработке Ткаббера. Обычно такой
каталог у вас появляется в каждом подкаталоге плагинов, которые вы "вынули" из
репозитория Ткаббера (об этом рассказано ниже, в разделе "Стандартные
плагины").

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

Дело в том, что после того, как вы получили из репозитория Subversion рабочую
копию проекта, содержащего каталоги (и подкаталоги, и подкаталоги
подкаталогов...), каждый из этих каталогов (и глубже) технически способен
обновляться из репозитория независмо от остальных частей рабочей копии! Говоря
проще, если вы "вынули" из репозитория все плагины, но используете лишь
пару-тройку из них, вы можете обновлять из репозитория их и только их, просто
выполняя команду

    svn update

в каталогах этих плагинов. Причём сам каталог с плагином может при этом
находиться где угодно — например, быть установленным в один из директориев для
плагинов Ткаббера. Вот так можно обновить плагин "whiteboard":

    $ cd ~/.tkabber/plugins/whiteboard
    $ svn up

### <a id="Сисадмину_на_заметку"></a>Сисадмину на заметку

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

**Примечание:** Начиная с марта 2009 года ведутся работы по переводу плагинов
на динамические рельсы — теперь в Настройках появился пункт **Plugin
Management**, где вы можете включить или выключить нужный вам плагин прямо на
ходу (естественно, если он уже переведён на эти самые рельсы). Но надо
полагать, в новом стабильном релизе Ткаббера по крайней мере все официальные
плагины можно будет загружать/выгружать динамически.

### <a id="Советы_разработчику_плагинов"></a>Советы разработчику плагинов

Если вы хотите попробовать свои силы в написании плагина, но не знаете, с
чего начать, возможно, вам поможет
[**статья с некоторыми рекомендациями разработчику**](Разработка_плагинов.md).
Она далека от идеала и не претендует на полноту освещения этой темы, но
кое-какие идеи вам даст.

## <a id="Официальные_плагины_для_Ткаббера"></a>Официальные плагины для Ткаббера
![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов ** Почти все эти
плагины можно и нужно включать через Менеджер плагинов (за исключением, разве
что, osd, latex и Tkabber-khim (последний уже намертво прикручен к Ткабберу)).

В этом разделе ничего принципиально нового не будет — сводка по существующим
плагинам и краткое вспомоществование для желающих скачать и установить их.

Итак, на сегодняшний день на
[официальной странице плагинов](http://tkabber.jabber.ru/tkabber-plugins)
насчитывается 17 расширений к Ткабберу: bc, checkers, chess, cyrillize,
ejabberd, georoster, mute, osd, reversi, socials, spy и whiteboard. В двух
словах о каждом:

1. bc — игра ["Быки и коровы"](http://games.look.ru/bc/). Управление
   командами: /bcstart /bcstop /bcnext /bctop
1. checkers — шашки (включает разные версии: обычные, русские, американские,
   испанские и итальянские). Плагин весьма проработан - есть много игровых возможностей.
1. chess — шахматы. Тоже весьма продвинут.
1. cyrillize — если при вводе сообщения вы ошиблись раскладкой, дело
   можно поправить, нажав Ctrl+'.
1. ejabberd — утилитка, позволяющая удалённо общаться с вашим ejabberd
   сервером.
1. georoster — показывает на карте мира, где находятся ваши собеседники
   (если у них заполнены соответствующие поля в vCard).
1. mute — экспериментальный плагин для коллективного редактирования
   текста.
1. poker — техасский покер (Texas hold'em).
1. osd — выводит некоторые события и сообщения "на широком экране" —
   On-Screen Display. Про его минимальную настройку можно почитать
   [тут](http://vonderer.blogspot.com/2007/02/tkabber.html).
1. reversi — ещё одна настольная игра.
1. socials — позволяет вводить команды типа **/танцевать** (результат
   будет такой: **\*nick пляшет дикий танец!**).
1. spy — шпионит за присутствием, регистрируя появления в онлайне и
   уходы в оффлайн. Можно выбрать конкретного человека или нескольких и
   получать оповещения при их появлении.
1. whiteboard — доска для рисования. Удобно, когда надо нарисовать схему
   проезда к месту <s>распития пива</s> оффлайновой Jabber-тусовки ;)
1. debug — он и в Африке отладчик, пишет в лог ошибки касательно
   отмеченных ключевых слов.
1. latex — показывает формулы, написанные в формате LaTeX, в виде
   картинок-математических формул. Работает под Windows и \*nix. Нужно
   дополнительно установить пакеты latex, dvips, imagemagick.
1. traffic — считает количество байт в несжатом, незашифрованном XML
   потоке. Группирует по JID-у отправителя и по типу станцы.
   [**Читать подробнее**](Low_traffic_HOWTO.md#Средства_самоконтроля).
1. [**Tkabber-KHIM**](#Tkabber-KHIM) — позволяет вводить в Ткаббере
   произвольные символы Unicode значительно более удобным способом,
   чем при помощи встроенного механизма
   [**"unisymbols"**](Ткаббер_ЧаВо.md#Ввод_хитрых_юникодных_символов).

В версию [0.11.0](http://tkabber.jabber.ru/node/464) было интегрировано
несколько плагинов: attline, ctcomp, custom-urls, floatinglog, gmail, openurl,
presencecmd, receipts и unixkeys. Краткие справки о них доступны
[здесь](http://www.jabber.ru/node/893) и
[здесь](http://www.jabber.ru/node/641). Некоторые из них подробнее освещены
ниже. ![(!)](../images/Hammer.png) **Сделать:** перенести краткое опиcание из
статьи на j.r. сюда

Установить самый свежий пакет плагинов можно из SVN. Для этого необходимо
проделать [следующее](http://tkabber.jabber.ru/svn) (естественно, у вас должен
быть установлен пакет svn):

    svn co http://svn.xmpp.ru/repos/tkabber/trunk/tkabber-plugins tkabber-plugins

### <a id="Abbrev"></a>Abbrev

> **Внимание!** Этот плагин находится в транке в качестве _встроенного_
  средства начиная с ревизии 994 (3 Марта 2007). Интерфейс управления не
  изменился; несущественно изменился формат вывода информации командами
  плагина. _**Изменился** механизм раскрытия сокращений:_ во встроенном плагине
  сокращения раскрываются вводом Shift-space.

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

Плагин предоставляет три "команды" чата:

##### /abbrev 
Создаёт сокращение. Форма использования:


    /abbrev что на что

привязывает к сокращению "что" строку "на что".

##### /unabbrev 
Удаляет сокращение. Форма использования:


    /unabbrev что

удаляет сокращение "что". Аргумент "\*" представляет собой особую форму команды
— удаляются все имеющиеся сокращения.

##### /listabbrevs 

Показывает текущие сокращения.

Сокращения разворачиваются динамически при нажатии кнопки **space** после ввода
слова-сокращения. Например, если у нас есть сокращение для "днк", то если после
ввода слова "днк" вы введёте пробел, сокращение "днк" развернётся в
"дезоксирибонуклеиновая кислота".

**Внимание:** чтобы подавить разворачивание, вводите **Shift-space**.

Пример:

    /abbrev прив приветствую участников конференции!

(добавили сокращение "прив" с замещением "приветствую участников
конференции!"), далее используем его:

    хочу всем сказать: прив
                           ^тут вводится пробел

в итоге имеем:

    хочу всем сказать: приветствую участников конференции!

Сокращения сохраняются в базу данных Customize. Выполнен русский перевод
сообщений плагина.

Подробности смотрите в файле README.

**Полезный совет:** добавьте следующее сокращение:

    /abbrev аббрев /abbrev

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

    /abbrev ме /me
    /abbrev унаббрев /unabbrev
    /abbrev листаббр /listabbrevs
    /abbrev девойс /devoice

и так далее (многие плагины работают с помощью команд, которые не всегда вовремя вспоминаются; вот тут-то и пригодится "листаббр"!). Теперь нет нужды переключаться на английскую раскладку для набора команд :)

Файл: [*Abbrev.zip*](../files/Abbrev.zip) (~6 кб)

Автор: [**kostix**](Участник_Kostix.md)

### <a id="Aniemoticons"></a>Aniemoticons

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов **

Плагин для любителей анимированных смайликов.
![(!)](../images/Hammer.png) **Сделать:** Развить?

### <a id="Attline"></a>Attline

![(!)](../images/Hammer.png) **Сделать:** Написать.

### <a id="Ctcomp"></a>Ctcomp

> _Внимание!_ Этот плагин вошёл в число официальных внешних плагинов Ткаббера и
  находится в транке начиная с ревизии 1256 (7 октября 2007). Версия плагина в
  транке была сильно переработана по сравнению с предыдущей версией (1.2).







**Текущая версия**

[**kostix**](Участник_Kostix.md) 7 октября 2007 (MSK): v2.0 (является копией версии в транке).

**Назначение и принцип действия**

Этот плагин — "Chat Text Completion" — реализует автозавершение слов, вводимых
в окне ввода чата, словами, имеющимися в окне протокола чата и в окне ввода
чата.

Идея простая: в ходе общения в чат были помещены какие-то (сложные) слова, и
вам хочется воспроизвести одно из таких слов в своём сообщении. Слово есть в
окне протокола чата, но для того, чтобы его поместить в своё сообщение,
необходимо его скопировать в буфер обмена _при помощи мыши_ и затем вставить в
поле ввода чата. А данный плагин позволяет написать несколько первых букв
требуемого слова (минимум — одну) и затем комбинациями клавиш **Ctrl-n** и **Ctrl-p**
циклически "прокрутить" все подходящие под ваш ввод слова прямо "на месте",
выбрать нужное и продолжить редактирование. Кто знает, как работает
"completion" в insert mode текстового редактора [Vim](http://vim.sf.net),
поймёт откуда позаимствован принцип действия этого плагина и, вероятно, найдёт
привязки кнопок по умолчанию удобными. Жест из Emacs **Alt-/** также
поддерживается.

Также можно вызвать меню со списком имеющихся дополнений слова.

**Управление**

Плагин переопределяет две стандартные привязки поля ввода чата (по умолчанию
отвечающие за помещение в поле ввода чата текста следующего/предыдущего
отосланного сообщения):

* **Ctrl-n** — включает режим автодополнения слова, если он не включен и
  показывает первый подходящий вариант; если режим уже работает, показывает
  следующий вариант. Соответственно, последовательные нажатия этой комбинации
  клавиш перебирают все возможные варианты, циклически.
* **Ctrl-p** — делает то же самое, что и предыдущая комбинация, только
  перебирает варианты в обратном порядке.

Эти комбинации являются основными. Возможно чередовать их использование,
произвольно перемещаясь по "кольцу" возможных вариантов дополнения введённых
букв слова.

* **Escape** — отменяет режим автозавершения. Текущий вариант
  автозавершения удаляется и поле ввода чата приводится в такое же состояние,
  которое у него было до включения режима автозавершения.
* **Enter** — выбирает (подтверждает) текущий вариант автозавершения.
  Курсор остаётся сразу за полученным словом. Действие этой клавиши по отсылке
  сообщения "съедается" в данном режиме.
* **Alt-/** — полностью повторяет действие **Ctrl-n**; этот жест взят из Emacs.
* **Ctrl-Alt-/** — показывает меню с первыми 20 найденными дополнениями.
  Активация элемента этого меню вставляет выбранное дополнение вместо исходного
  слова. Щелчок мышью вне меню или нажатие клавиши **Escape** отменяют меню,
  оставляя исходное слово без изменений.
* Любые клавиши или их комбинации из тех, что не указаны выше, нажатые при
  активном режиме автозавершения (то есть когда показывается один из
  предложенных вариантов завершения слова) прекращают режим автозавершения как
  если бы была нажата клавиша **Enter**; при этом нажатая комбинация клавиш
  передаётся окну ввода текста, например, если в режиме автозавершения был
  нажат **BackSpace**, текущий вариант автозавершения будет принят, после чего
  самый правый его символ будет удалён.

**Пример**

Имеем в окне протокола чата несколько слов, среди которых есть: "abbot",
"abridged", "abduction" и "abba".

Вводим в поле ввода чата:

    ab
      ^тут нажимаем Ctrl-n, Alt-/ или Ctrl-p

переходим в режим автодополнения, в котором Ткаббер будет показывать все слова,
начинающиеся с "ab" на месте введённого вами "ab"; дополненная часть слова
выделяется другим цветом фона:
<pre>
ab<span style="background:pink">ba</span>

ab<span style="background:pink">duction</span>
ab<span style="background:pink">ot</span>

ab<span style="background:pink">ridged</span>
...
</pre>
Значения в списке отсортированы; **Ctrl-n** и **Alt-/** перебирают значения в
порядке возрастания, **Ctrl-p** — в обратном порядке.

Далее **Enter** для подтверждения использования текущего варианта, или **Escape**
для выхода из режима автодополнения (и возврата к исходному тексту: "ab").

Также можно было нажать **Ctrl-Alt-/** вместо **Ctrl-n** (и прочих) чтобы
получить меню со списком подходящих слов.

**Проблемы**

Указанные комбинации клавиш не будут работать на русской раскладке Windows в
силу [**печально известного бага Tk в Windows**](Wish_и_русская_раскладка_в_Windows.md). В
[README](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber-plugins/ctcomp/README)
описан костыль для этой проблемы (потребуется написать несколько строчек в
config.tcl.

**Плагин**

Большая просьба потестировать, если интересно, и не стесняться сообщать
багрепорты/пожелания.

_Рекомендуется_ прочитать приложенный
[README](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber-plugins/ctcomp/README)
— там описаны доступные настройки плагина и вообще дано больше информации по
нему.

Файл: [*Ctcomp.zip*](../files/Ctcomp.zip) (~9 кб)

Автор: [**kostix**](Участник_Kostix.md)

### <a id="Custom_URLs"></a>Custom URLs

![(!)](../images/Hammer.png) **Сделать:** Написать.

### <a id="Floating_Log"></a>Floating Log

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов **

> _Внимание!_ Этот плагин вошёл в число официальных внешних плагинов Ткаббера и
  находится в транке начиная с ревизии 1245 (6 октября 2007).

Плагин показывает во всплывающих окнах приходящие сообщения и сообщения статуса.

Файл: [*Floatinglog.zip*](../files/Floatinglog.zip)

Текущая версия: 0.4 , 26-August-2007.

Автор: [**archimed**](Участник_Archimed.md)

### <a id="Floating_Roster_Contact"></a>Floating Roster Contact

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов **

Proof-of-concept plugin. Позволяет "оторвать" элемент ростера в плавающее окно
без декораций. Перемещение этого окна по Drag'n'Drop. Плагин очень недоделанный
(окошки не запоминаются, при логауте не пропадают, на roster push не реагируют,
наверняка ещё чего-нибудь нужное не делают).

*  **Файл:** [float.tar.gz](http://sgolovan.nes.ru/jabber/tmp/float.tar.gz) (1K)

[**Teo**](Участник_Teo.md)

### <a id="Gmail_Notifications"></a>Gmail Notifications

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов **

Если вы пользуетесь джаббер-аккаунтом на gmail.com, то этот плагин позволит вам
получать уведомления о почте, приходящей по вашему адресу. Плагин использует
расширение XMPP
[Gmail Notifications](http://code.google.com/apis/talk/jep_extensions/gmail.html).

Уведомления показываются в отдельном окне/вкладке.


**Примечание:** Если вы не пользуетесь gmail.com в качестве Jabber-сервера, но
хотите получать уведомления о почтовых сообщениях, то этот плагин вам не
поможет. Вместо него можно использовать J2J-транспорт. Но помните, что владелец
J2J-транспорта может подсмотреть ваш пароль на gmail.com и читать вашу почту.
Оно вам надо? Подробнее можно почитать
[на странице проекта J2J](http://wiki.jrudevels.org/index.php/J2J).

*  **Файл:** [gmail-1.0.tar.gz](http://sgolovan.nes.ru/jabber/tmp/gmail-1.0.tar.gz) (3K)

[**Teo**](Участник_Teo.md)

### <a id="Histool"></a>Histool

> **Внимание!** начиная с 0.10.0-beta2 этот плагин интергирован в Ткаббер в
  качестве встроенного средства (пункт главного меню **Службы → Разговоры**) и
  дальше развивается там. Этот раздел будет убран через некоторое время.

"History tool" — браузер истории чата.

**Внимание!** Плагин предназначен для "новой системы логирования", появившейся
в альфа-версии начиная с релиза 841 (26 Декабря 2006), кроме того код плагина
был частично интегрирован в транк Ткаббера (и сам плагин туда собирается), так
что этот плагин работает только с Ткаббером начиная с релиза 1004 (04 Марта
2007).

Этот плагин реализует окно, которое можно открыть через пункт главного меню
**Services → Plugins → Chat history**, предоставляющий несколько способов для
доступа ко всей истории чатов:

* Список JID'ов, для которых есть логи чата;
* Дерево, отражающее структуру логов;
* <s>Полнотекстовый поиск по логам</s> (пока не реализован).

Двойной клик на любом JID'е открывает стандартный диалог с логом чата для этого
JID'а.

В списке джидов и дереве логов работает поиск (панель открывается по
`<<OpenSearchPanel>>`, прибитому по умолчанию на **Ctrl-s**.

**Баги/ограничения** текущей версии:

* <s>Код показа лога чата для JID'а в Ткаббере содержит ошибку: если вы
  попытаетесь посмотреть лог общения в привате с некоторым поситителем комнаты
  при том, что не будете в этот момент находиться в данной комнате, Ткаббер
  покажет лог самой комнаты.</s> (исправлено в релизе 987 (28 Февраля 2007).
* На некоторых джидах глючит открытие лога; механизм пока не выявлен.
* Полнотекстовый поиск не реализован.
* Есть мелкие проблемы с клавиатурным фокусом при переключении табов.
* README не дописан.

Файл: [**Histool.zip**](../files/Histool.zip) (~8 кб)

Текущая версия: 0.6, 04-Mar-2007.

Автор: [**kostix**](Участник_Kostix.md)

### <a id="Open_URL"></a>Open URL



![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов **

Добавляет в меню по правой кнопке на URL в окне чата пункты, позволяющие
открыть этот URL в заданном браузере.

*  **Файл:** [openurl.tar.gz](http://sgolovan.nes.ru/jabber/tmp/openurl.tar.gz) (1K)

[**Teo**](Участник_Teo.md)

### <a id="Presencecmd"></a>Presencecmd

> _**Внимание!** Данный плагин без изменений добавлен в число официальных
  внешних плагинов Ткаббера и находится в транке начиная с ревизии 1189
  (17 августа 2007)._

Добавляет две новые IRC-команды чата для управления присутствием (глобальным и
направленным).

Примеры:

    /presence dnd

    /presence chat
    Hey girls!

    /presence
    Now read this!

    /chatpresence xa
    Gone shopping

Подробности — в [README](http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/presencecmd/README).

Файл: [*Presencecmd.zip*](../files/Presencecmd.zip) (~6k)

Текущая версия: 0.2, 14-July-2007.

    http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/presencecmd

Автор: [**kostix**](Участник_Kostix.md)

### <a id="Quote_Last_Message_quotelastmsg"></a>Quote Last Message (quotelastmsg)

Копирует в поле редактирования последнее сообщение из чата и прибавляет к нему
угловые скобки (признак цитирования). Хоткей — **Alt-Q** Если это сочетание уже
занято, вы можете перебиндить его в конфиге. Например, так, как об этом
рассказано в README, который лежит в папке с плагином:

    event delete <<QuoteLastMessage>> <Alt-q>
    event delete <<QuoteLastMessage>> <Meta-q>
    event add    <<QuoteLastMessage>> <Control-Shift-m>

Кстати, с помощью этого плагина удобно редактировать обширный топик.

### <a id="Receipts"></a>Receipts

![(!)](../images/Hammer.png) **Сделать:** Написать.

### <a id="Recentstatus"></a>Recentstatus

> _Внимание!_ Плагин интергирован в виде _встроенного_ средства начиная со
  стабильной версии [0.11.0](http://tkabber.jabber.ru/node/464), поэтому плагин
  следует использовать только на версиях \<= 0.10.0. Если вы "апгрейдитесь" на
  0.11.0 с более старой версии, проверьте — не установлен ли у вас этот плагин;
  если установлен, обязательно удалите его, в противном случае это может
  привести к мистическим глюкам.

Плагин меняет штатный виджет Ткаббера для вода "статусного сообщения" (справа
от кнопки, открывающий меню состояний доступности) на комбобокс, который хранит
историю последних установленных статусных сообщений. Каждое установленное
пользователем статусное сообщение записывается в историю. История сохраняется
между перезапусками Ткаббера. Возможно настроить максимальную длину истории.

**Примечание:** В репозитории tkabber-3rd-party его уже нет. Если вам по
каким-то причинам нужна старая версия, трясите автора ;)

Автор: [**kostix**](Участник_Kostix.md)

### <a id="Singularity"></a>Singularity

![(!)](../images/Hammer.png) **Сделать:** Написать.

### <a id="Stripes"></a>Stripes

![](../images/180px-Stripes.png)



![](../images/180px-Dark-stripes.png)


> **Внимание!** Этот плагин включён в транк начиная с версии 0.11.1. При этом в
  нём был исправлен баг, указанный ниже.

Этот плагин позволяет раскрашивать фон целых нечётных и/или чётных сообщений в
окне чата. Поддерживается раздельная установка цвета фона для чётных и нечётных
сообщений через базу опций Tk (Tk option database) или XRDB, например, так:

    option add *Chat.oddBackground  gray77
    option add *Chat.evenBackground gray84

Если цвет для соотв. типа сообщений не задан, он не устанавливается (остаётся
тем, который используется по умолчанию).

Настройки цветов должны идти либо в **preload\_hook**, либо быть "на верхнем
уровне" (вне хуков).

С подбором цветов поможет [**эта статья**](Палитра_цветов.md).

**Внимание!** плагин имеет баг, связанный с невозможностью (в плагине) узнать
момент окончания отрисовки сообщения: при поступлении нового сообщения в окно
чата плагин раскрашивает _предыдущее_ сообщение, а не текущее. Это приводит к
тому, что последнее сообщение, помещённое в окно чата не будет раскрашено до
поступления следующего сообщения. (Если у кого-то есть идеи как это обойти —
пишите автору.)

Файл: [*Stripes.zip*](../files/Stripes.zip) (~1.5 кб)

Текущая версия: 0.1, 07-Mar-2007.

Автор: [**kostix**](Участник_Kostix.md)

### <a id="Tclchat"></a>Tclchat

![(!)](../images/Hammer.png) **Сделать:** Написать.

### <a id="Tkabber-KHIM"></a>Tkabber-KHIM

> _Внимание!_ С 13 декабря 2006 этот плагин находится в транке, так что если вы
  используете версию с SVN, не заморачивайтесь и снимите его оттуда. Тем более,
  что версия плагина в транке уже получила несколько изменений, недоступных в
  выложенной здесь версии. (Изменения, впрочем, не принципиальные, так что если
  у Вас стабильная версия Ткаббера, возьмите плагин отсюда.)

Этот плагин прикручивает к Ткабберу особый "как бы метод ввода" авторства
[Кевина Кенни](http://wiki.tcl.tk/kbk) — [KHIM](http://wiki.tcl.tk/16343),
позволяя вводить в Ткаббере произвольные символы Unicode значительно более
удобным способом, чем при помощи встроенного механизма
[**"unisymbols"**](Ткаббер_ЧаВо.md#Ввод_хитрых_юникодных_символов):

* Можно определить особую "кнопку композиции" — например, **Pause**, и список
  "входных последовательностей" — пар символов, которые, будучи введены после
  нажатия кнопки композиции, "превращаются" в некоторый символ Unicode. Клавиша
  композиции, входные последовательности и их отображение на символы Unicode
  настраиваются произвольным образом.
* Двойным нажатием упомянутой клавиши композиции можно вызвать специальное
  окно, предоставляющее возможность выбрать любой символ Unicode, который будет
  вставлен в текущую позицию курсора.

Примерно это выглядит так:

* В настройках KHIM вы выбрали клавишу **Scroll\_Lock** в качестве клавиши
  композиции, и определили, что последовательность символов **"A** даёт "А
  умляут" — Ä.
* Тогда после применения настроек вы можете в любом поле ввода Ткаббера
  ввести: **Scroll\_Lock**`"A` и получить Ä.

После установки плагина и перезапуска Ткаббера посетите меню **Службы →
Расширения** и выберите там пункт "KHIM Options". _Обязательно_ прочтите
справку по работе и настройке KHIM, нажав "Справка..." в появившемся диалоге.

Пакеты **khim** и **autoscroll**, необходимые для работы Ткаббера, но имеющиеся
только в **tklib**, упакованы прямо в  плагин, т.к. **tklib** не очень
распространён, и в текущую стабильную его версию **khim** ещё не входит.

Плагин должен работать на любой версии Ткаббера, так что приветствуется
тестирование на любых доступных версиях.

**Пара полезных советов:** Помните, что KHIM включен по умолчанию, то есть
чисто теоретически в настройки ходить не обязательно (в случае, если пакет вам
уже знаком). Но конечно, если вы видите его впервые, сходить туда имеет смысл:
ознакомиться с "прошитыми" комбинациями и, в случае нужды, дополнить и/или
измененить список, ну и почитать справку. После завершения работы с опциями
окно можно закрыть (но можно и оставить, чтобы иметь комбинации перед глазами).
В некоторых европейских раскладках (в частности, в испанской) некоторые
дефолтные комбинации могут не работать. Например, буква "энье" — n, вводящаяся
по умолчанию как **Pause**`~n` — из-за тильды, которая сама по себе висит на
сочетании клавиш "RightAlt-4" и портит весь пирог. Ввод этой буквы можно легко
перевесить на другое сочетание, к примеру, "$n" (доллар вызывается как обычно,
"Shift-4", и проблем не вызывает). Так что если у вас установлен нетрадиционный
дополнительный язык, и вы испытываете трудности с вводом некоторых букв, всё
можно легко поправить. Не бойтесь обновлять плагин &mdash; все ваши изменения
сохраняются в файле **~/.tkabber/custom.tcl**, и останутся там даже после
удаления самого плагина.

Это — предварительная версия плагина, что означает отсутствие документации.

Файл: [*Tkabber-khim.zip*](../files/Tkabber-khim.zip)

Автор: [**Kostix**](Участник_Kostix.md)

Версия: 1.2

Размер файла: ~34k

**Примечание:** если у вас в системе есть свежий **tklib**, то вы можете
удалить подкаталоги **khim** и **autoscroll** из каталога с плагином. Про то,
как снять **tklib** с CVS и поставить его в систему, рассказано
[**здесь**](Установка_tklib_в__nix.md). Имейте в виду, что KHIM вошёл в состав
tklib совсем недавно, и текущая стабильная версия (на 9 декабря 2006 года) его
не содержит — берите с CVS.

**Однако** имейте в виду, что в той версии **khim**, что идёт с плагином, уже
имеется один багфикс и русский перевод всех окон KHIM. Этого пока нет в
**tklib**.

### <a id="Unixkeys"></a>Unixkeys

> _Внимание!_ Плагин интергирован в виде стандартного внешнего плагина начиная
  со стабильной версии [0.11.0](http://tkabber.jabber.ru/node/464). В транке
  плагин был доработан: его функциональность была расширена на все поля ввода,
  включая однострочные и комбобоксы, а жест **Ctrl-\\** заменён на **Ctrl-/**.

Плагин приделывает ко всем многострочным полям ввода в Ткаббере (включая поля
ввода сообщений чатов) комбинации клавиш, традиционные для средств
редактирования в Unix. Фактически, в плагин "завёрнута" функциональность,
описанная
[**здесь**](Нетривиальные_настройки.md#Комбинации_кнопок_а-ля_Unix_shell_в_текстовых_виджетах)
(главное отличие — в плагине реализован жест **Ctrl-\\**, означающий "выделить
всё").

Подробности — в [README](http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/unixkeys/README).

    http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/unixkeys

Автор: [**kostix**](Участник_Kostix.md)

## <a id="Полуофициальные_плагины_для_Ткаббера"></a>Полуофициальные плагины для Ткаббера
Здесь ссылки на плагины для Ткаббера, которые не попали в tkabber-plugins, но
их авторы не поленились получить доступ к репозиторию
[tkabber-3rd-party](http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins) и
выложили свои творения туда. Скачать их можно командой

    svn co http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins ~/tkabber-3rd-party-plugins

### <a id="Alarm"></a>Alarm

> _Внимание!_ версия этого плагина, доступная в виде архива по ссылке,
  перестала работать после очередного изменения внутреннего API обработки
  IQ-запросов в Ткаббере; исправленная версия доступна _только_ в "левом"
  репозитории (см. ниже).

Возможность послать собеседнику сигнал. Вид сигнала (звук, сообщение, запись в
чате) выбирает собеседник. Есть фильтр и защита от флуда. Идея
[отсюда](http://forum.jrudevels.org/viewtopic.php?p=546#546) продолжение
[здесь](http://forum.jrudevels.org/viewtopic.php?t=1006). Разработан протокол,
описание внутри. Все ошибки и запросы присылайте [**Feez**](Участник_Feez.md).

*  **Файл:** [*Alarm-0.3.tar.gz*](../files/Alarm-0.3.tar.gz) (15K)
*  **Версия:** 0.3 [**Changelog**](Plugins/Alarm/Changelog.md)

Исправленная версия, работающая на альфах 0.10.1 и выше доступна в репозитории:

    https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/alarm

### <a id="Antispam"></a>Antispam

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

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

Плагин доступен в репозитории по адресу
[https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/antispam](https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/antispam)
Подробности — в [README](https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/antispam/README).

Автор: [**Gebb**](Участник_Gebb.md).

### <a id="Autoanswer"></a>Autoanswer

Автоответчик. Позволяет автоматически посылать пользователю, написавшему вам
личное сообщение (или "в приват" конференции), пока вы находитесь в
"недоступном" состоянии (список таковых поддаётся настройке), некоторое
заготовленное сообщение, например, "Я занят, перезвоните попозже!" ©. Таким
образом, плагин удобен для борьбы с людьми, которые не умеют или не хотят
понимать, что означает ваш текущий статус.

Автоответчик можно быстро включать/отключать с помощью соответствующей иконки
на тулбаре.

> Имейте в виду, что если вы пользуетесь "автоэвеем", _настоятельно_
  рекомендуется исключить из состояний, в которых включается автоответчик,
  "away" и "xa", оставив только "dnd". Впрочем, плагин в этом плане не очень
  назойлив. Он отсылает автоответ только на первое сообщение и дальше уже
  помалкивает. При желании число автоответов можно изменить в коде.

Подробности — в [README](http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/autoanswer/README).

    http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/autoanswer

Авторы: [**Gebb**](Участник_Gebb.md), [**kostix**](Участник_Kostix.md). Иконки сделал [**ART**](Участник_ART.md).

### <a id="Autosubscribe"></a>Autosubscribe

![(!)](../images/Hammer.png) **Сделать:** Написать.

### <a id="Bldjid"></a>Bldjid

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов **

Мощный плагин в помощь админам, позволяющий банить и разбанивать пользователей
по их джидам во всех комнатах, где у вас есть админские права. Кроме этого,
позволяет мониторить заходы пользователей в комнаты (можно задать список
интересующих) даже при выключенной опции `::muc::options(gen_enter_exit_msgs)`.
При этом собирается следующая информация: время захода, ник, реальный джид с
ресурсом (при наличии у вас соответствующих прав в комнате), роль/ранг, версия
клиента и ОС. Эта информация доступна не только во время текущей сессии, но и
записывается в лог, откуда её можно выудить при поиске, что позволяет
отслеживать долгосрочную историю заходов посетителей. Поиск возможен по нику,
джиду, роли/рангу, версии, при этом можно совмещать несколько параметров в
одном поисковом запросе. Кроме того, в плагине имеются команды, дающие
возможность проверить, находится ли искомый джид в списке членов или в чёрном
списке комнаты. Также можно включить "шпиона", уведомляющего о заходе в
контролируемые комнаты нужного вам человека (указав его джид). Есть и
возможность кардинальной чистки бан-листа как целиком, так и указав причину
бана, что помогает разбанивать сонмы товарищей, забаненных ботом (естественно,
если бот указывал определённую причину).

Описывать каждую команду здесь не имеет смысла, поэтому дальнейшее знакомство с
плагином лучше продолжить
[здесь](http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/bldjid/README.ru)

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

    /bldhelp

**Известные проблемы:**

* Плагин не работает со стабильной версией Ткаббера 0.11.1 — только с SVN-версией.
  Впрочем, скоро SVN-версия сама станет стабильной ;)
* Если изменить размер окна ввода сообщения, пока окошко монитора закрыто,
  монитор перестаёт открываться (если сделать то же самое при открытом
  мониторе, проблем нет). Впрочем, это лечится закрыванием окна комнаты и новым
  в неё входом.

Скачать плагин можно по адресу:


[https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/bldjid](https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/bldjid)

[**ycbl**](Участник_Bigote.md) 03:32, 29 марта 2010 (MSD)

### <a id="Customstatus"></a>Customstatus

Плагин позволяет управлять набором пар «статус присутствия "доступен"/текстовое
описание», позволяя делать предустановки для различных статусов присутствия.
Это позволяет быстро устанавливать статус с заранее заданным текстовым
описанием. Набор статусов/описаний доступен в виде меню, привязанного к новой
кнопке тулбара. В этом же меню имеется пункт, вызывающий редактор набора
статусов.

Набор статусов сохраняется при помощи стандартного механизма Customize.

Продвинутые пользователи могут попробовать задействовать дополнительные
настройки. Пока что их можно править только напрямую в файле плагина. За
настройки отвечает массив **options**:

    variable options
    array set options {
        subvert_main_presets_menu   no
        subvert_quick_presets_menu  no
        add_toolbar_item            yes
        toolbar_item_image          services/icq/chat
        accelerate_menus            no
        extend_quick_presets_panel  yes
        quick_presets_panel_image   services/icq/chat
    }

Разъяснение настроек:

##### subvert\_main\_presets\_menu 

> Заменяет меню "Присутствие" в главном меню Ткаббера на то, которое
  предоставляет этот плагин.

##### subvert\_quick\_presets\_menu 

> то же самое для "быстрого" меню статусов (на "Панели присутствия/статуса").

##### add\_toolbar\_item 
> Управляет добавлением на тулбар кнопки, нажатие на которую показывает меню
  статусов. Это — поведение плагина по умолчанию.

##### toolbar\_item\_image 
> Устанавливает имя загруженной картинки для кнопки на тулбаре. Список
  доступных картинок можно получить, выполнив в консоли Ткаббера команду
  "`image names`".

##### accelerate\_menus 

> Если включена, при формировании меню предустановок первые девять опций меню
  предваряются префиксами "1.", "2." и т.д., которые являются акселераторами и
  могут быть активированы нажатием соотв. клавиши **1**, **2** и т.д., когда меню
  открыто. Это может быть полезно, если сам вызов меню предустановок повешен на
  комбинацию клавиш, например, таким кодом в файле конфигурации:

        hook::add finload_hook {
            bind . <Control-p> {
                tk_popup .presence.button.custom_menu [winfo pointerx .] [winfo pointery .]
            }
        }

##### extend\_quick\_presets\_panel 
> Добавляет кнопку, аналогичную таковой на тулбаре, справа от кнопки выбора
  присутствия на "Панели присутствия/статуса".

##### quick\_presets\_panel\_image 

> Устанавливает картинку для этой кнопки.

**Ухищрения:**

* В полях ввода сообщений для статусов в окне редактора предустановок работают
  комбинации клавиш **Ctrl-↑** и **Ctrl-↓**, которые перемещают активный элемент списка
  вверх и вниз, соответственно.

**Основные недоработки/баги:**

* "Продвинутые" настройки нельзя установить из файла конфигурации.

Приветствуется самое широкое тестирование. Багрепорты и пожелания шлите автору.

Файл: [**Customstatus.zip**](../files/Customstatus.zip) (~7кБ)

Версия: 0.6, 06-Mar-2007

    http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/customstatus

Автор: [**kostix**](Участник_Kostix.md)

### <a id="Flip"></a>Flip

Плагин-шутка. 1 апреля при заходе в конференцию с вероятностью 50%
"переворачивает" ваш ник вверх тормашками. Смотрится прикольно :) На следующий
день перевёрнутые ники приходят в норму.

<s>**Недостаток:** Если выключить Ткаббер до полуночи и включить снова уже 2
апреля, ники в норму не придут. Для исправления требуется приделать сохранение
в файл.</s> Приделано. Кроме того, обнаружен баг с одной буквой (R),
перевёрнутая версия которой принадлежит арабскому алфавиту. На jabber.ru
запрещено использование ников, состоящих из смеси арабских и не-арабских букв,
поэтому с ником, содержащим R, вас бы не пустили ни в одну из комнат. Пришлось
её выкинуть. Если заметите подобное поведение с другими буквами, просьба
сообщить. Также будем рады дополнениям таблицы букв-перевёртышей (см. код
плагина).

**URL:**

    https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/flip/

**Автор:** [**ycbl**](Участник_Bigote.md)

### <a id="Green"></a>Green

Плагин предназначен для реализации в Ткаббере слежения за событиями управления
питанием системы, таких как suspend и resume. Идея состоит в том, чтобы
корректно закрыть все активные соединения с серверами при уходе системы в
suspend, запомнив их. Затем, если требуется, восстановить их после того, как
система переходит в нормальный режим работы, предварительно подождав некоторое
время, пока не "поднимется" сеть.





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

* В случае работы в Windows (Windows 2000 и выше) он полагается на специальное
  расширение Tcl/Tk — [winpm](http://tkwinpm.googlecode.com), которое должно
  быть установлено и доступно Ткабберу. При помощи данного расширения плагин
  слушает сообщения системы об изменениях в состоянии питания и выполняет
  соответствующие им действия.
* В случае работы в системах, основанных на X Window (Linux, \*BSD и подобных),
  в которых отсутствует механизм, подобный реализованному в Windows,
  используется другой подход, основанный на использовании специального "скрипта
  активации", который поставляется вместе с плагином (файл swsusp-tkabber.tcl в
  каталоге плагина). Этот скрипт предназначен для запуска из соответствующих
  пользовательских скриптов, которые вызывает система управления питанием при
  наступлении различных событий, таких как suspend и resume. Скрипт активации
  сообщает всем работающим на том же дисплее копиям Ткаббера о наступлении
  соответствующего события управления питанием; эти уведомления обрабатываются
  плагином.

Иными словами, в случае с Windows плагин работает "сам собой", а в случае
систем, основанных на X Window, ему помогает внешний скрипт, организация
правильного запуска которого — задача пользователя.

_Важно понимать,_ что сам плагин должен быть установлен в Ткаббере в любом
случае.

Подробности — в [README](http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/green/README).

По поводу работы в Linux, см.
[обсуждение на багзилле Ткаббера](http://www.jabber.ru/bugzilla/show_bug.cgi?id=376).

    http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/green

Автор: [kostix](Участник_Kostix.md)

### <a id="Hidemuctopic"></a>Hidemuctopic

Небольшой плагин, который, будучи установленным, скрывает поле темы комнаты,
высвобождая несколько ценных миллиметров пространства. Чтобы вновь увидеть его
для доступа к редактированию темы или к настройкам и командам комнаты (плохо
заметная "кнопка" с надписью "Тема" слева от поля с топиком), нужно нажать
**Ctrl-T**

**URL:**


    https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/hidemuctopic/

**Автор:** [**kostix**](Участник_Kostix.md)

### <a id="Juick"></a>Juick

Плагин для жуйкования. То бишь, ведения (микро)блога на
[juick.com](http://juick.com). [**Подробнее**](Плагины/Juick.md).

### <a id="Killerfeature"></a>Killerfeature

Плагин предназначен для ручного
[удаления XMPP-аккаунта с сервера](http://www.xmpp.org/extensions/xep-0077.html#usecases-cancel).

После установки плагина, в подменю "Tkabber" главного меню Ткаббера появится
новый пункт "Delete account...", активизация которого представит пользователю
диалог с одним или более чекбоксами — по одному на каждый уникальный аккаунт из
числа активных (подключённых) в данный момент. Нажатие кнопки "ОК" данного
диалога отправит серверу команду удаления каждого помеченного пользователем
аккаунта; при этом также происходит отключение этих аккаунтов. Никаких
подтверждений запрошено не будет. Выйти из диалога без удаления аккаунтов
можно, нажав кнопку "Отмена", нажав **Escape** или закрыв окно диалога средствами
оконного менеджера.

> _**Внимание!** Восстановить удалённый аккаунт не будет никакой возможности
  (кроме разве что ползания на коленях перед админом сервера с мольбами
  поднять ваш аккаунт из последнего бэкапа)._

Текущая версия в репозитории Subversion:

    http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/killerfeature

Автор: [**kostix**](Участник_Kostix.md)

### <a id="Notes"></a>Notes

Плагин для ведения заметок. Заметки хранятся в связанном с JID'ом хранилище в
соответствии с [XEP-0049](http://www.xmpp.org/extensions/xep-0049.html). Плагин
совместим с аналогичными плагинами для Miranda и Psi+. Поддерживается работа с
несколькими одновременно подключёнными аккаунтами. Есть возможность
отфильтровать заметки по одному или нескольким тегам, а также экспортировать их
в файл.

Пока что плагин предоставляет только один способ взаимодействия с пользователем
— через несложный графический интерфейс. В будущем планируется добавить набор
команд для управления заметками из чата.

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

Текущая версия в репозитории Subversion (для Ткаббера с менеджером плагинов):

    https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/notes

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

    https://github.com/Totktonada/tkabber4notes

Некоторая дополнительная информация по плагину собрана тут:

    https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/notes/doc/

Автор: [*Totktonada*](Участник_Totktonada.md)

### <a id="Now_Playing"></a>Now Playing

![(!)](../images/Hammer.png) **Сделать:** Написать.

### <a id="Open_History"></a>Open History

Небольшой, но полезный плагин, позволяющий открывать историю разговоров в
комнате или с контактом из ростера без использования мыши, с помощью нехитрой
команды. Для истории любого конкретного джида:

    /history jid

Для просмотра истории текущего разговора:

    /history

**Недостаток:** В случае просто **/history** в привате конференции откроется
история конференции, а не этого привата.

**URL:**


    https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/openhistory/

**Автор:** [*Sceptik*](Участник_Sceptik.md)

### <a id="Plugin_Manager"></a>Plugin Manager

> _Внимание!_ простым пользователям Ткаббера это средство скорее всего не нужно,
  потому что это не "настоящий" плагин; если вы просматриваете список плагинов в
  поисках чего-нибудь "вкусненького", пропускайте этот раздел и читайте дальше.

Это средство было специально написано для Windows-дистрибутивов Ткаббера (пак и
старпак), которые устанавливают в систему все стандартные внешние плагины
вместе с Ткаббером чтобы пользователю не надо было качать их отдельно. Plugin
Manager добавляет в Ткаббер возможность открыть специальное окно со списком
всех стандартных внешних плагинов, выбрать требуемые и установить их одним
нажатием кнопки. Точно так же их можно удалять из пользовательского каталога
плагинов. Таким образом, пользователю не нужно думать о том, как устанавливать
или удалять плагин, а также о том, куда инсталлятор распаковал плагины.

В настоящий момент (post-0.11.1 девелоперская версия) в Ткаббере реализована
возможность динамической загрузки и выгрузки плагинов в процессе работы без
требования перезагрузки. После того, как во всех стандартных внешних плагинах
будет реализована поддержка этой возможности, Plugin Manager станет не нужен,
поскольку устанавливать стандартные внешние плагины путём копирования их в
пользовательский каталог плагинов будет не нужно: достаточно будет пометить
видимые Ткабберу плагины в группе настроек "Plugins Management" как
используемые и сохранить настройки.

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

**URL:**


    https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/pluginmanager/

**Автор:** [**Archimed**](Участник_Archimed.md)

### <a id="Reminder"></a>Reminder

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов **

Плагин, позволяющий задавать напоминания о некоторых грядущих событиях (не
забыть выключить чайник, позвонить кому-либо и т. д.). Время срабатывания можно
задать как в абсолютном формате (полная дата вида **MM/DD/YYYY HH:MM:SS**), так
и в относительном (**HH(H):MM:SS**, **MM(M):SS**, **S(S)**). Относительный
формат также используется при задании тайм-аута с помощью ключевых слов,
например: **tomorrow 1:00:00** — через 25 часов, **week** — через неделю. Когда
наступит заданный вами момент времени, выскочит небольшое окошко с текущим
временем и текстом напоминания и прозвучит сигнал (сигнал можно отключить в
настройках). Кроме обычных одноразовых напоминаний также планируется приделать
повторяющиеся (каждый час, день, неделю, месяц, год), а также напоминания о
днях рождения контактов из ростера и, по желанию, посетителей конференций.

Формат команды:

    /remind time
    message

Кроме этого, можно выводить список текущих напоминаний посредством команды

    /listrems

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

    /delrem #

где \# — номер нужного (а точнее, ненужного) вам напоминания в полученном
списке. Удалить за один раз можно только одно напоминание, при этом помните,
что оно сразу же пропадает из списка, в результате чего нумерация нарушается,
поэтому для гарантии выведите список ещё раз, если вам надо удалить несколько.

Есть возможность задать выполнение команд в определённое время, при этом
сообщение, указываемое на следующей строке, должно начинаться с ключевого слова
**cmd** (например, 25 ноября в час дня разбанить некоего посетителя):

    /remind 11/25/2010 13:00:00
    cmd ::muc::unban ::xmpp::1 \
    foo@conference.jabber.ru pupkin@jabber.ru

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

    /remind 3 days
    cmd source /home/myself/bin/test.tcl

Напоминания сразу же после их задания сохраняются в файле настроек `custom.tcl`
и восстанавливаются оттуда при следующем запуске Ткаббера. Если какое-либо из
них "протухло" за время, пока Ткаббер был выключен, при старте появится уже
знакомое окошко, где помимо текущего времени и текста напоминания будет ещё
указано время, на которое оно было установлено.

Краткую помощь по использованию программы можно получить по команде

    /remind help

**URL:**


    https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/reminder

**Автор:** [**ycbl**](Участник_Bigote.md)

### <a id="Snoopstatus"></a>Snoopstatus

![(!)](../images/Hammer.png) **Сделать:** Написать.

### <a id="Urgent"></a>Urgent

![(!)](../images/Hammer.png) **Сделать:** Написать.

### <a id="Urlcmd"></a>Urlcmd

Добавляет две новые IRC-команды чата для перехода по ссылкам, содержащимся в
сообщениях чата.

Примеры:

Команда | Действие
---|---
/listurls | Показать список ссылок в текущем окне.
/browseurl | Открыть последнюю ссылку в броузере.
/browseurl 1 | Открыть ссылку с номером 1 в списке.







Плагин доступен в репозитории по адресу

    http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/urlcmd

Подробности — в [README](http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/urlcmd/README).

Авторы: [**Gebb**](Участник_Gebb.md), [**kostix**](Участник_Kostix.md).

## <a id="Неофициальные_плагины"></a>Неофициальные плагины
А здесь собраны плагины, не попавшие ни в официальный, ни в 3rd-party
репозитории. Некоторые из них, вероятно, устарели, так что если какой-то вдруг
у вас не работает, разыскивайте авторов.

### <a id="8bitgw"></a>8bitgw

Плагин, позволяющий общаться с "асечниками" и другими страдальцами через
XMPP-гейты, работающие с 8-битным набором символов, отличным от того, с которым
работает клиент "асечника". Например, можно общаться с русским "асечником",
использующим Windows-1251, через "буржуйский" гейт, считающий, что в ICQ-сети
используется Latin-1.

**Настройка:**

Параметр `::plugins::8bitgw::gateways` в секции Customize **Plugins →
8bitGateways** содержит (возможно пустой) Tcl-список гейтов и связанных с ними
наборов символов в следующем формате:

    {сервер1 кодировка_сети кодировка_удалённого_клиента} [{сервер2 ...} ...]

(символы [ и ] отделяют необязательную часть).

Гейты задаются "голым JID'ом" ("bare JID"), т.е. адресом без узловой части и
ресурса, например: `icq.someserver.com`.

Названия наборов символов сети и удалённого клиента должны быть понятны тиклю;
узнать, что для него понятно, можно, выполнив в `tclsh`, `wish` или консоли
Ткаббера команду

    encoding names

Тикль работает с каноническими наименованиями наборов символов, в частности, он
не знает про "Latin-1", зато знает про "iso8859-1".

Пример: такая настройка

    {aim-icq.jabber.anywise.com iso8859-1 cp1251} {icq.ru.biz cp1251 cp1252}

заставит плагин совершать перекодировки исходящих и входящих данных чтобы:

* общаться с русскими ICQ/AIM-клиентами (использующими cp1251) через сервер
  `aim-icq.jabber.anywise.com`, настроенный на использование iso8859-1 в
  качестве транспортной кодировки;
* общаться с европейскими "асечниками" (использующими cp1252) через
  "русский" гейт, использующий cp1251 в качестве транспортной кодировки.

**Ошибки/недоработки:**

* Нельзя настраивать кодировку для каждого удалённого клиента в отдельности;
* Нельзя использовать символы Unicode за пределами "кодировки удалённого
  клиента" — вместо них удалённый клиент увидит знаки вопроса ("?");
* Нет перевода текстовых ресурсов на русский;
* Нет README;
* Неудобная настройка;
* Не тестировался на связках, отличных от "Windows-1251 + Latin-1";
* Патчит код Ткаббера, что является нестабильным в долгосрочной перспективе
  (в идеале Ткабберу нужен хук `rewrite_outgoing_message_hook`).
* Не преобразует другие виды передаваемой и принимаемой текстовой информации,
  такие как статус пользователя (в идеале Ткабберу нужен хук, который вызывался
  бы для каждого распарсенного и приготовленного к помещению в поток узла типа
  CDATA, но это слишком стрёмно, чтобы быть хуком).

Багрепорты/пожелания шлите автору.

Файл: [*8bitgw.zip*](../files/8bitgw.zip) (~3 кб)

Текущая версия: 0.1, 01-June-2007.

Автор: [**kostix**](Участник_Kostix.md)

### <a id="Autoconnect"></a>Autoconnect

Данный плагин предназначен для автоматического соединения с нужными
транспортами после отсоединения или при старте Ткаббера. Критику и пожелания
направляйте [**eXire**](Участник_EXire.md).

*  **Файл:** [*Autoconnect-0.4.tar.gz*](../files/Autoconnect-0.4.tar.gz) (1K)
*  **Версия:** 0.4

### <a id="Autoraise"></a>Autoraise

Этот плагин написан в качестве фикса к проблеме, сформулированной
[тут](http://tkabber.jabber.ru/node/320).

Плагин "поднимает" главное окно Ткаббера, если таковое свёрнуто или скрыто, на
экран при приходе любого нового сообщения (в т. ч. от сервера, сообщений о
присутствии и т. п.).

Управление:

* Настройки: опция-флаг `::plugins::autoraise::autoraise`
* Главное меню: **Tkabber→View→Auto raise on new message**

**Ограничения:**

* Работает _только_ для "интерфейса с табами", т. к. восстанавливает
  главное окно, что является бессмысленным для многооконного интерфейса.
* Не имеет возможностей для фильтрации сообщений — поднимается по любому
  пришедшему.
* "Патчит" одну из процедур Ткаббера, что является ненадёжным методом
  в долговременной перспективе.

Тестирование и отзывы приветствуются.

Файл: [**Autoraise.zip**](../files/Autoraise.zip) (~4 кб)

Текущая версия: 0.1, 29-Mar-2007.

Автор: [**kostix**](Участник_Kostix.md)

### <a id="Autoretrieve"></a>Autoretrieve

Этот плагин автоматически запрашивает информацию о пользователях в конференции,
т. е. информация сразу доступна в тултипе и не надо открывать окно Userinfo.
Включить/отключить плагин можно в **Customize→Conference Info**

* **Файл:** [**Autoretrieve.tar.gz**](../files/20081020172036!Autoretrieve.tar.gz) (1К)
* **Файл:** для 0.11.1 [*Autoretrieve.tar.gz*](../files/Autoretrieve21102008.tar.gz) (1К)

[**eXire**](Участник_EXire.md)

### <a id="Bmuc"></a>Bmuc

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов **

![](../images/180px-Bmuc.png)



Плагин позволяет блокировать все приватные сообщения в конкретной конференции,
отправленные вам участниками с рангом «None». Также есть возможность блокировки
приватных сообщений от модераторов и членов (включается по выбору отдельно).
Управление плагином осуществляется через меню на кнопке «Тема:» в конференции.

>  _**Внимание!** Плагин будет работать только с SVN-версией Ткаббера._

*  **Файл:** [*Bmuc.zip*](../files/Bmuc.zip)

Автор: [*Jet*](Участник_Jet.md)

Модифицированный плагин с расширенной возможностью блокировки сообщений в
группчате доступен в репозитории по адресу:

    http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/bmucx/

Автор модификации: [*ancestor*](Участник_Ancestor.md)

### <a id="Bookmarks"></a>Bookmarks

Плагин автоматически ставит bookmark в окнах чата при автоматическом и ручном
уходе в away, а также при потере фокуса окном Ткаббера. Настраивается через
**Customize → Plugins → Bookmarks**.

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

**Будет работать только с 0.10.0-beta1 и старше.**

Для работы в Windows требуется пакет tclWinidle.

[**eXire**](Участник_EXire.md).

*  **Файл** [*Bookmarks-0.4.5.tar.gz*](../files/Bookmarks-0.4.5.tar.gz) (1K)

Ныне вытеснен плагином attline. Не работает начиная где-то с 1816 ревизии июля
2009г.

### <a id="Chess-mod"></a>Chess-mod

![](../images/180px-Chess-mod.gif)



Модифицированный плагин для игры в шахматы, добавлены координаты для клеток
игровой доски и отмена последнего сделанного хода по обоюдному согласию

*  **Файл:** [*Chess-mod.zip*](../files/Chess-mod.zip)

Автор плагина: [*Jet*](Участник_Jet.md)

### <a id="Clienticons"></a>Clienticons

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов **

Добавляет иконки клиентов в ростер и список участников конференции. Иконки
клиентов и идея взяты из Psi+
([http://psi-dev.googlecode.com/](http://psi-dev.googlecode.com/))

> _**Внимание!** Плагин будет работать только с SVN-версией Ткаббера._

*  **Файл:** [*Clienticons.zip*](../files/Clienticons.zip)

Автор: [*Jet*](Участник_Jet.md)

- - - -


Модифицированный [*ancestor*](Участник_Ancestor.md) плагин c обновленными
иконками доступен в репозитории по адресу:

    http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/clienticons/

### <a id="Confirm"></a>Confirm

Добавляет вопрос при закрытии всех/остальных табов и Ткаббера. Есть графические
настройки в **Customize→Plugins→Confirm**.

[**eXire**](Участник_EXire.md)

*  **Файл:** [*Confirm-0.2.tar.gz*](../files/Confirm-0.2.tar.gz) (1K)

### <a id="CryptoConfig"></a>CryptoConfig

Позволяет хранить часть **config.tcl** (например, настройки **loginconf**) или
всё его содержимое в зашифрованном файле.

При загрузке Ткаббера спрашивает пароль, использованный для шифрования,
дешифрует файл и исполняет код из него.

Требует наличия в системе OpenSSL или GPG.

Подробности — в README.

Файл: [*Cryptoconfig.zip*](../files/Cryptoconfig.zip)

Текущая версия: 0.1, 16-June-2007.

Автор: [**kostix**](Участник_Kostix.md)

### <a id="Cyrillize2"></a>Cyrillize2

> _Внимание!_ Стандартная версия этого плагина — "cyrillize" — получила ту же
  самую функциональность в ревизии 869 (11 января 2007); "навешена" она на
  комбинацию **Ctrl-"** (или **Ctrl-Shift-'**). Кроме того, комбинация **Ctrl-;**
  "занята" встроенным средством Ткаббера —
  [**unisymbols**](0.9.x/ЧаВо.md#Очень_неудобный_способ). Посему данный плагин
  следует считать не рекомендованным к использованию.

Усовершенствование стандартного плагина cyrillize. В него было добавлено
сокращение C-; по которому можно перевести  введенный русский текст в латиницу.

**Файл**: [*Cyrillize2-0.1.tar.gz*](../files/Cyrillize2-0.1.tar.gz)
 Усовершенствовал [**feez**](Участник_Feez.md)

### <a id="Follownick"></a>Follownick

Плагин для MUC, позволяющий быстро "прыгать" по сообщениям конкретного
участника:

* Клик средней кнопкой на нике или сообщении в окне лога делает так,
  что предыдущее (т.е. более старое) сообщение от этого участника появляется в
  окне с логом чата (то есть устанавливает viewport над "лентой" чата так,
  чтобы это сообщение было видно).
* **Shift**+клик средней кнопкой ищет следующее по отношению к текущему сообщение
  (т.е. более новое).

После перемещения ник искомого сообщения подсвечивается.

Основная идея плагина: быстрое перемещение по постам конкретного человека в "шумных" комнатах.

**Ошибки/недоработки:**

*  Ничего не настраивается.
*  Полное отсутствие сопроводиловки.

Багрепорты/пожелания шлите автору.

Файл: [*Follownick.zip*](../files/Follownick.zip) (~1 кб)

Текущая версия: 0.1, 03-May-2007.

Автор: [**kostix**](Участник_Kostix.md)

### <a id="Goto_заготовка_для_плагина"></a>Goto (заготовка для плагина)

Заготовка для плагина активации таба по его заголовку из окна любого чата.
Добавляет команду "/goto tabname" и соответствующие возможности автодополнения
по клавише **Tab**. На данный момент позволяет перейти только на таб с чатом (в том
числе на таб с конференцией).

Для работы заготовки вставить в config.tcl вне хуков следующий код.

    # Goto
    # ====
    proc gotochat {name} {
        foreach chatid [chat::opened] {
            set tabtitle [lindex [chat::window_titles $chatid] 0]

            if {[string equal $name $tabtitle]} {
                chat::activate $chatid
            }
        }
    }

    hook::add chat_send_message_hook [namespace current]::handle_goto 15

    proc handle_goto {chatid user body type} {
        if {[string equal -length 6 $body "/goto "]} {
            set tabname [crange $body 6 end]
            gotochat $tabname
            return stop
        }
    }

    hook::add generate_completions_hook [namespace current]::goto_commands_comps 99

    proc goto_commands_comps {chatid compsvar wordstart line} {
        upvar 0 $compsvar comps

        if {!$wordstart} {
           lappend comps "/goto "
        }

        if {$wordstart && [string equal -length 6 $line "/goto "]} {
            set tabtitles {}

            foreach chatid [chat::opened] {
                set tabtitle [lindex [chat::window_titles $chatid] 0]
                lappend tabtitles $tabtitle
            }

            set comps [concat $tabtitles $comps]
        }
    }
    # ====

Автор: [*Totktonada*](Участник_Totktonada.md).

### <a id="Hihglight_XEP_and_RFC_URLs"></a>Hihglight XEP and RFC URLs

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов **

> _Внимание!_ плагин с этой (а точнее — с расширенной) функциональностью
  доступен среди стандартных внешних плагинов в репозитории начиная с ревизии
  1145 (12 июня 2007). Называется "custom-urls", помимо XEP, RFC и Debian Bug
  IDs, позволяет добавлять обработку своих форматов (примеры есть в коде
  плагина).

Подсвечивает как URL в окне чата слова xep-0123 или jep-0123. При клике
открывает браузер на странице соответствующего XEP (XMPP Extension Proposal, а
не то, что вы подумали). Версия 0.3 перестала соответствовать названию. Теперь
подсвечиваются также и ссылки на RFC. Формат тот же, что и для XEP. В версии
0.4 строка \#12345 превращается в URL, ведущий на Debian BTS.

**Будет работать только с alpha-20061115 и свежее.**

*  **Файл:** [xeps-0.4.tar.gz](http://sgolovan.nes.ru/jabber/tmp/xeps-0.4.tar.gz) (1K)

[**Teo**](Участник_Teo.md)

### <a id="Highlightex"></a>Highlightex

Данный плагин подсвечивает (highlight) всё сообщение целиком при обращении к
вам в конференции. В настройках имеется опция для задания цвета подсветки в
16-теричном формате.

*  **Файл:** [*Highlightex.zip*](../files/Highlightex.zip)

Автор: [*ancestor*](Участник_Ancestor.md)

### <a id="Histballoon"></a>Histballoon

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов **

Добавляет всплывающее описание к строке статуса, в котором выводит 20 последних
сообщений.

*  **Файл:** [**Histballoon.zip**](../files/Histballoon.zip)

Автор: [*Jet*](Участник_Jet.md)

### <a id="Jdiskurl"></a>Jdiskurl



![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов **

Расширение, которое добавляет в контекстное меню ссылок вида
[http://disk.jabbim.cz/user@sever.tld/filename.ext](http://disk.jabbim.cz/user@sever.tld/filename.ext)
пункт, позволяющий запрашивать файл через джаббер-диск public@disk.jabbim.cz
(должен находиться в ростере).

> _**Внимание!** Плагин будет работать только с SVN-версией Ткаббера._

*  **Файл:** [*Jdiskurl.zip*](../files/Jdiskurl.zip)

Автор: [*Jet*](Участник_Jet.md)

### <a id="Last_Activity"></a>Last Activity

Special for kroko :)

Этот плагин изменяет поведение Ткаббера на запрос last. Теперь в графе Interval
(userinfo) или по команде /last \<nick> показывается время, которое окно
клиента \<nick> неактивно.

**Будет работать только с alpha-20061110 и старше.**

*  **Файл:** [**Last\_activity.tar.gz**](../files/Last_activity.tar.gz) (1K)

[**eXire**](Участник_EXire.md)

### <a id="Meebo_me"></a>Meebo me

Плагин автоматически принимает запросы авторизации и отслеживает смену ника
([XEP-0172](http://www.xmpp.org/extensions/xep-0172.html)), но только для
пользователей `*@guest.meebo.org`. Он вам понадобится, если вы собираетесь
использовать виджет [meebome](http://www.meebome.com/) и сообщения принимать в
Ткаббере. Все ошибки и запросы присылайте [**Feez-у**](Участник_Feez.md).

*  **Файл:** [*Meebome-0.2.tar.gz*](../files/Meebome-0.2.tar.gz) (1K)

### <a id="Mimetex"></a>Mimetex

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

Плагин работает так же, как и стандартный плагин **latex**, но использует в
качестве "движка" [MimeTex](http://www.forkosh.com/mimetex.html).
Соответственно, _**MimeTeX** должен быть установлен, чтобы этот плагин
работал_.

**MimeTex**, однако же, представляет собой _один_ исполняемый файл, что даёт
ему соответствующие преимущества перед плагином **latex**: он работает быстрее,
и его намного проще установить; в частности, есть версия для Windows.

**Установка:**

1. Установите **MimeTex**:
   * Скачайте исходники и соберите бинарь сами, согласно
     [соответствующему разделу официальной страницы](http://www.forkosh.dreamhost.com/source_mimetex.html#quickbuild).
     Убедитесь, что собираете _без_ ключа `-DOPAQUE`. Если у вас тёмный фон окон чата в Ткаббере, собирайте
     с ключом `-DWHITE` чтобы получить белый цвет символов в формулах.
   * Или скачайте уже готовую версию [оттуда же](http://www.forkosh.com/mimetex.html#precompiled).
     Там же есть версия под Windows.
1. Поставьте плагин, перезапустите Ткаббер, посетите группу настроек
   **Plugins → MimeTex** и установите там правильный путь до исполняемого файла
   **MimeTex**.

Имейте в виду, что в [Debian GNU/Linux](http://www.debian.org) есть готовый
пакет (правда, похоже, он собран без поддержки антиалиасинга).

**Использование:**

**MimeTex** пытается отобразить всё, что находится между парами токенов "$$", например:

    Это — $$f(x)=\int_{-\infty}^xe^{-t^2}dt$$ формула

отображается как

> Это — ![Mimetex-example.gif](../images/Mimetex-example.gif) формула.

**Ошибки/недоработки:**

*  Не поддерживается преобразование цветов в генерируемых картинках, они
   вставляются в текст "как есть".
*  Не поддерживается исправление антиалиасинга для цветов фона окна чата,
   отличающихся от чисто белого или чисто чёрного.
*  Отсутствует README.
*  Отсутствует перевод на русский.

Файл: [*Mimetex.zip*](../files/Mimetex.zip) (~5 кб)

Текущая версия: 0.3, 16-May-2007.

Автор: [**kostix**](Участник_Kostix.md)

**Последние изменения:**

[**kostix**](Участник_Kostix.md) 21:33, 16 мая 2007 (MSD): Исправлен регексп для
поиска формул в тексте сообщения, изменён приоритет парсера формул с тем, чтобы
он отрабатывал раньше парсеров эмоциконок и стайлкодов (спасибо
[**Gman**](Участник_Gman.md) за наводку). Теперь нормально просекаются формулы
примеров №№ 6 и 9 с оф. сайта.

### <a id="Nickomp"></a>Nickomp

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов**

Позволяет перебирать ники участников конференции по табу не только в окне ввода
конференции, но и в привате любого участника этой конференции (привет @neris).
Работает только с свн версией. ©
[http://juick.com/Jet/583486](http://juick.com/Jet/583486)

Скачать плагин можно по [ссылке](http://jetftp.narod.ru/nickomp.zip)
в посте автора, но на всякий случай файл потырен и размещён и тут.

Файл: [**Nickomp.zip**](../files/Nickomp.zip)

Автор: [*Jet*](Участник_Jet.md)

### <a id="NickSaneColors"></a>NickSaneColors

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов **

![Групчат до и после](../images/180px-Nicksanecolors_groupchat_before_after.png)



**Общая информация**

Плагин переопределяет дефолтный массив цветов для ников
($::plugins::nickcolors::NickColorPool) в зависимости от текущего цвета фона
чата, установленного цветовой схемой.

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

![Color distance.png](../images/Color_distance.png)

Пользователю предлагается задать интервал по шкале от 0 до 100 (по умолчанию
40..60), при попадании в который цвет добавляется в массив используемых цветов.
Значение 0 соответствует одинаковым цветам, значение 100 соответствует
максимально отличающимся цветам.

Цвета выбираются из массива, взятого здесь:
[Colors with Names](http://wiki.tcl.tk/16166).

**Установка**

*  Распаковать архив в стандартную директорию для плагинов (на \*nix системах
   это ~/.tkabber/plugins/)
*  Включить плагин в менеджере расширений (Plugins Management)

**Использование**

*  (Опционально) установить значения для порогового интервала.

Если в указанный диапазон не попадает ни одного цвета из исходных,
восстанавливается массив цветов по умолчанию. Также массив цветов по умолчанию
восстанавливается при выгрузке плагина.

**Ошибки/недоработки**

Возможны.

Файл: [**NickSaneColors.zip**](../files/Nicksanecolors.zip), 4.5K

Текущая версия: 0.1, 2010-02-19

    http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/nicksanecolors

Автор: [**hekp0maht**](Участник_HEKP0MAHT.md)

### <a id="OSD_redux"></a>OSD redux

Попытка привести штатный плагин OSD к удобоваримому — по меркам современного
Ткаббера — виду:

*  Поддержка Customize (**Plugins → XOSD Status Display**) — настройки цвета,
   шрифта, тени и таймаутов;
*  Управление местоположением вывода XOSD на экране.

Плагин _**не** доделан_ и выложен тут просто по просьбе одного ткабберовца. Это
означает, что не все опции работают (или работают не так, как задумывалось).

Несмотря на это, плагин вполне себе работает на машине автора.

Файл: [**Tkabber-osd.zip**](../files/Tkabber-osd.zip), ~3k

Автор: [**Kostix**](Участник_Kostix.md)

**Примечание:** на всякий случай учтите, что:

*  Плагин предназначен для
   [X Window System](http://en.wikipedia.org/wiki/X_Window_System)
   и не работает в Windows;
*  Он требует наличия работающего
   [XOSD-сервера и утилиты osd\_cat к нему](http://ignavus.net/software.html),
   (подробнее можно почитать [тут](http://ldots.org/xosd-guide/) ).

### <a id="Patches"></a>Patches

Плагин, который использует одну из особенностей языка, на котором написан
Ткаббер, и позволяет «патчить» код Ткаббера без его изменения. Плагин состоит
из 2 частей: сам файл плагина (patches.zip/plugins/patches/patches.tcl) и файлы
пропатченных процедур (patches.zip/patches/\*.tcl). Работает всё достаточно
просто: во время загрузки плагина он (плагин) загружает все файлы с расширением
\*.tcl из папки patches.zip/patches/, которая должна находиться там же, где и
config.tcl.

**Описание патчей:**

*  1\_smart-emoticons.tcl — Устанавливает порядок смайлов согласно тому,
   как они записаны в icondef.xml и убирает поля в меню смайлов.
*  2\_block-retry-server-messages.tcl — Блокирует повторяющиеся сообщения
   о смене статуса и рангов / ролей в конференциях.
*  3\_recoloring-chat.tcl — Меняет цвета элементов окна чата.
*  4\_status-panel-and-window.tcl — Заменяет стандартную статусную панель.
   Добавляет окно для установки статуса, приоритета и статусного собщения,
   а также значки статусов в меню.
*  5\_draw-subject-of-chat-window.tcl — Показывает тему сообщения (не
   путать с темой конференции) в окнах чата.
*  6\_roster-bg-image.tcl (отключён) — Добавляет фоновое изображение
   в ростер (расположение задаётся в коде патча).
*  7\_recalc\_position-balloon.tcl — Размещает всплывающую подсказку слева
   или сверху от курсора, если недостаточно места для её отображения (Windows).
*  8\_del-roster-horizontal-scrollbar.tcl — Удаляет горизонтальную прокрутку
   в ростере.
*  9\_roster-avatars.tcl — Добавляет vCard-аватары в ростер, показывает
   сообщение статуса под ником, жирный шрифт для групп контактов. Аватары
   обновляются при проверке vCard, сохранение аватар происходит только для
   авторизованных пользователей, при удалении аватары из vCard в клиенте она не
   удаляется.
*  10\_recursor-chat.tcl — Меняет поведение курсора мыши в окне чата.
*  11\_sorted-jids-in-roster.tcl — Меняет порядок сортировки джидов,
   перемещая недоступные контакты в конец списка.
*  12\_disable-autoaway-is-tray — Блокирует выход из автоэвея, если окно
   свернуто в трей.

> _**Внимание!** Несмотря на то, что никаких изменений в коде Ткаббера не
  происходит, стоит учитывать, что файлы содержат в себе изменённые процедуры,
  которые могут вызывать некорректную работу в различных ревизиях Ткаббера._

Пара иллюстраций (возможно, через некоторое время помрут на картинкохостинге; в
общем-то, не жалко :)). [Номер один](http://i38.tinypic.com/728vlu.png).
[Номер два](http://i36.tinypic.com/t6t6h2.png) (непонятно, кому может понадобиться
бэкграунд в виде картинки в ростере; полагаю, что даже если сделать элементы
ростеров прозрачными, общий вид лучше не станет).

*  **Файл:** [*Patches.zip*](../files/Patches.zip)

Автор: [*Jet*](Участник_Jet.md)

### <a id="Postpone_Text_добавлен_в_транк"></a>Postpone Text (добавлен в транк)

**Лирическое отступление**

> _Внимание!_ С ревизии 953 (18 фев 2007) интегрировано в транк в виде
  _встроенного_ средства, выполненного [**teo**](Участник_Teo.md) на основе данного
  плагина.

Оно несколько отличается от описанного здесь; отличия сформулированы в конце
этого раздела.

Пока автору плагина, обсуждаемого в этом разделе, неясно насколько лучше/хуже
новая встроенная версия, поэтому пока что данный плагин "поживёт" здесь.

**Описание плагина**

[**Этот плагин**](../files/Postpone.tar.gz) (~5k) реализует достаточно глупую
вещь — с каждым окном ввода сеансов чата связывается собственный скрытый
текстовый буфер + добавляется биндинг, позволяющий:

*  по первой активации биндинга _переместить_ текст из поля ввода в буфер;
*  по второй его активации переместить текст обратно.

Основная идея: лично у меня ([**Kostix**](Участник_Kostix.md)) часто возникает
ситуация, когда я пишу длинный продуманный текст, и вдруг вижу, что надо _бы_
что-то быстро написать в чат, отослать это, а затем продолжить редактирование.
Причём сделать это быстрее, чем "выделить весь текст и скопировать в клипборд",
и сделать это не трогая клипборд.

Данный плагин эту возможность реализует.

Настраивается:

*  Событие (биндинг) для операций с буфером;
*  Фон поля ввода при полном буфере (отключабельно);
*  Способ вставки текста из буфера.

Настройки плагина находятся в подгруппе "Postpone Text" группы "Chat".

Приложен README с подробным описанием.

**Внимание!** В настоящий момент плагин будет работать только с SVN-версией
Ткаббера, снятой оттуда после того, как в транке появился тип "options" для
элементов Customize (то есть в версиях начиная от 29 сентября 2006 года). Патч,
реализующий "старый" тип "list", возможно, воспоследует.

**Внимание!** Если вы хотите использовать здешний плагин вместо нового
встроенного вместе с комбинацией Ctrl-q, вам понадобится "отучить" встроенный
плагин от этой комбинации.

Для этого поместите в файл конфигурации Ткаббера вне любых хуков такой код:

    hook::add postload_hook {
        event delete <<ChatPushText>> <Control-q>
        event delete <<ChatPopText>>  <Control-g>
    }

[**Kostix**](Участник_Kostix.md) 18:01, 28 октября 2006 (MSD)

**Отличия нового плагина [teo](Участник_Teo.md)**

* Буфер теперь представляет собой _стек (LIFO),_ в который можно последовательно
  сохранить несколько кусков текста и потом последовательно извлечь их оттуда.
* Используется два жеста для управления текстом:
   * **Ctrl-q** — убрать текст из поля ввода и _добавить его_ в буфер, сделав
     там новую запись. Эта привязка связана с виртуальным событием `<<ChatPushText>>`.
   * **Ctrl-g** — удалить последний "кусок" текста из буфера и вставить
     его справа от курсора в поле ввода. Эта привязка связана с виртуальным
     событием `<<ChatPopText>>`.
* Отсутствует визуальная индикация факта нахождения сохранённого
  текста в буфере.
* Отсутствует настройка методов помещения текста из буфера в поле
  ввода — он всегда вставляется справа от курсора, определяющего текущее
  место вставки.

### <a id="Reject_subscription"></a>Reject subscription

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

* **Файл:** [**Reject\_subscription.zip**](../files/Reject_subscription.zip)

Автор: [**Teo**](Участник_Teo.md)

### <a id="Remote_Commands"></a>Remote Commands

Плагин, который стоит использовать с особой осторожностью. Он позволяет
удалённо выполнять команды на компьютере. Необходимые команды со всеми
аргументами необходимо предварительно занести в список в начале файла. Первая
команда будет командой по умолчанию.

*  **Файл**: [*Remote\_commands-0.1.tar.gz*](../files/Remote_commands-0.1.tar.gz)
*  **Версия**: 0.1, 01-04-2007

[**feez**](Участник_Feez.md)

### <a id="Remote_IP_Address"></a>Remote IP Address

Плагин, добавляющий команду удалённого управления для получения IP-адреса
соединения Tkabber-а с сервером.

* **Файл**: для Tkabber из trunk:
  [remote\_ip\_address-tkabber-trunk.tar.gz](http://www.vsi.ru/~yegor/files/remote_ip_address-tkabber-trunk.tar.gz)
* **Файл**: для Tkabber 0.11.1:
  [remote\_ip\_address-tkabber-0.11.1.tar.gz](http://www.vsi.ru/~yegor/files/remote_ip_address-tkabber-0.11.1.tar.gz)
*  **Версия**: 07-02-2010

[*yegor*](Участник_Yegor.md)

### <a id="Remote_Settings"></a>Remote Settings

Плагин, позволяющий удаленно изменять настройки Ткаббера. Кроме того, это PoC
плагин, показывающий, как создавать в плагине команды для удаленного вызова и
как создавать мультишаговые команды (визарды). Будет использоваться в доке
[**How\_to\_add\_a\_new\_remote\_command**](../en/How_to_add_a_new_remote_command.md)
как пример.

* **Файл**: [*Remote\_settings-0.1.tar.gz*](../files/Remote_settings-0.1.tar.gz) (~4Kb)

* **Версия**: 0.1, 01-04-2007

[**feez**](Участник_Feez.md)

### <a id="Roster_Avatars"></a>Roster Avatars

Выглядит оно [так](../images/1112349.png).

То же самое, что в патче «9\_roster-avatars.tcl» [**этого**](#Patches)
плагина. Добавляет vCard-аватары в ростер, показывает сообщение статуса под
ником, жирный шрифт для групп контактов. Аватары обновляются при проверке
vCard, сохранение аватар происходит только для авторизованных пользователей,
при удалении аватары из vCard в клиенте она не удаляется. Аватарки контактов
можно добавлять и самому: положить в папке .tkabber/vcard\_avatars картинку
размером 30\*30 пикселей в формате png с названием, соответствующему полному
jid контакта.

*  Небольшое изменение: изменён (уменьшен) размер аватар до 30\*30 пикс.
*  Установка: распаковать архив в папку с плагинами, запустить Ткаббер.

*  **Файл:** [*Rosteravatars.zip*](../files/Rosteravatars.zip)

Автор: [*Jet*](Участник_Jet.md)

Выпилил в отдельный плагин: [**BrennendeR**](Участник_Brennende.md)

### <a id="Rsssaver"></a>Rsssaver

Поскольку Ткаббер не кэширует новости при некорректном выходе, то у людей, не
закрывающих Ткаббер днями/неделями, возникали случаи, когда в кэше находились
новости недельной (и более) давности. Данный плагин кэширует новости через %n
пришедших сообщений, а также добавляет кнопку сохранения в окно новостей (для
ручного сохранения).

[**eXire**](Участник_EXire.md).

*  **Файл** [*Rsssaver-0.2.3.tar.gz*](../files/Rsssaver-0.2.3.tar.gz) (1K)

### <a id="Savebtn"></a>Savebtn

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов **

Расширение, позволяющее сохранять фото из vCard. После установки в окне
просмотра информации о пользователе, на вкладке "Фотография", появится кнопка
"Сохранить фото".


*  **Файл:** [*Savebtn.zip*](../files/Savebtn.zip)

Автор: [*Jet*](Участник_Jet.md)

### <a id="Server_Info"></a>Server Info

Добавляет в меню по правой кнопке для контакта (в контактах или в списке
участников конференции) пункты для получения информации о сервере этого
контакта и для того, чтобы непосредственно открыть окно Service discovery на
контакте или на его сервере.

* **Файл:** [server\_info.tar.gz](http://sgolovan.nes.ru/jabber/tmp/server_info.tar.gz) (1K)
* **Файл:** для версии 0.11.1 [*server\_info.tar.gz*](../files/Server_info.tar.gz) (1K)

[**Teo**](Участник_Teo.md)

### <a id="So_keepalive"></a>So\_keepalive

Плагин предназначен для включения опции SO\_KEEPALIVE на сокетах соединений,
устанавливаемых Ткаббером.

Требует наличия пакета [Tclx](http://tclx.sourceforge.net/).

"Очень бета" в том смысле, что требует очень серьёзного тестирования, а так же
[настройки _Вашей_
системы](http://libkeepalive.sourceforge.net/docs/TCP-Keepalive-HOWTO) для
того, чтобы механизм TCP keepalive делал то, что Вы от него ожидаете.

Читайте README.

Файл: [**So\_keepalive.zip**](../files/So-keepalive.zip), ~3.5k

Автор: [**Kostix**](Участник_Kostix.md)

### <a id="Spam_filter"></a>Spam filter

Подтверждает сообщения, которые не сочтёт спамом.

Для фильтрации требуется:

1. Джид+ресурс в настройках конференции в качестве фильтра.

2. Присутствие в конференции.

*  **Файл:** [spamfilter.tar.gz](http://alefix.narod.ru/spamfilter.tar.gz), 511b

[*alfix*](Участник_Alfix.md)

### <a id="Tab_number"></a>Tab number

Переделка [**патча**](Патчи.md#Нумерация_закладок)
[**Lknight'а**](Участник_Lknight.md) в плагин. Сделано не очень красиво,
но ничего более умного не придумал. Если есть какие-то идеи,
то прошу сообщить [**eXire**](Участник_EXire.md).

*  **Файл:** [*Tab\_number-0.1.2.tar.gz*](../files/Tab_number-0.1.2.tar.gz) (1K)

### <a id="Tkabho"></a>Tkabho

Первая попытка приделать бота к Ткабберу для возможности использования простыми
пользователями без настройки чего-либо. Плагин написан на основе моего
jabber-бота на тикле — [taho](http://taho.googlecode.com).

[архив zip](http://taho.googlecode.com/files/tkabho.zip)

[архив tar.bz2](http://taho.googlecode.com/files/tkabho.tar.bz2)

Автор: [*Kellin*](Участник_Kellin.md).

### <a id="Vcardavatars"></a>Vcardavatars

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов **

Показывает аватары из вкард в окне чата. Изображения обновляются при просмотре
информации о пользователе и хранятся локально. Пока нет работы с альфа-каналом.

> _**Внимание!** Плагин будет работать только с SVN-версией Ткаббера._

* **Файл:** [*Vcardavatars.zip*](../files/Vcardavatars.zip)

Автор: [*Jet*](Участник_Jet.md)

### <a id="Wintweaks_устарел"></a>Wintweaks (устарел)

> _Внимание!_ Начиная с [версии 0.11.0](http://tkabber.jabber.ru/node/464)
  Ткаббер содержит доработанную версию данного хака непосредственно в коде,
  поэтому плагин потерял всякий смысл. Если вы "апгрейдите" Ткаббер до 0.11.0,
  удалите этот плагин.

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

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

**Ошибки/недоработки:**

* Сплиттеры надо сделать раза в два уже.

Файл: [*Wintweaks.zip*](../files/Wintweaks.zip) (~2 кб)

Текущая версия: 0.1, 24-Apr-2007.

Автор: [*kostix*](Участник_Kostix.md)



>





|
<
<




|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|

|

|

|

|
|

|
<
<
<
<
<
<



|
<
<

|
<
<
<
<
<
<
<
















|

|
<
<
<

|
<
<



|
<
<
<



|
<
<
<
<

|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




|
<

|
<
<
<
<

|

|
<
<
<

|
<
<

|
<

|
<
<
<
<
<

|

|
<
<
<
<

|
<
<
<
<
<

|
<

|
<
<

|
<
<
<
|
<
|
<
|

|
<
|
<
|
<
|
<
|
<
<
<

<
|
<
<
<

|
<

<
<
<
<
<
<
<
<

<
<
<
<




|

|
<
<
<
<

|
<
<
<
<
<

|

|
<
<
<
<

|
|
<
<

|
<

<
|
<
<
<

|
<
|
<
|
<
|
|
<
|
<
|
<
|
|
<
<
|
|
<
<
|
<
|
<
|
<
|
<
<
|
<
<
<
|
<
<

|
<
<
<
<
<
<

|
<
<
|

|
|

|
<
<
<
<

|
<
<

|

|
<

>

<
|

|
<

>

<
|
<

|
>
|

|
<
<
<

|

|



|
<




|



|
<

|

|



|






|

|

|

|

|

|
<

|
<
<
<
<
<
<
<
<

>
>
>
>
>
>
|

|

|

|
<
<

|
<
<
<
<
<
<
<
<
<
<
<

|

|

|
<
<

<
|
<
<
|
<

|
<
<

<
|
<
<
|
<
|
<
|
<
<
|
<
<
<
<
<
<

|

|
<

|




|
|
<
<
<
>
|
<
>
|
|
|
|
<

<
|

<
|

|

|
<
<
<
<

|

|
<

|
<
<
<

|

|

|

|

|

|

|
<

|

|

|

|

|

|

|
<
<
<

|

|

|
<
<
<
<
<
<
|
>
|
>

|
<
<
<
<
<

|

|

|

|
<
<

|

|
<
<
<
<

|
<
<

|
|
|

|
<

<
|

|

|
<
<
<
|
|
|
|

|

|

|
<
<

>
>
|

|
<

|

|

|

|
<
<

|
<

|












|

|

|



|

|

|
<
<
<





|

|

|

|

|
<
<
<
<
<

|
<
<
<
<

|
<

|

|

|

|


>
>



>
|
|

|
<
<




|
<

|
<

|

|
<
<
<
<
<

|

|

|

|

|

|

|
<
<
<
<

|
<
<
<
<

<
|
<
<
<
|
<
<

|

<
|
<
|
<

|
<
<

|
<
<

|
<

|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<

|

|

|

|

|

|
<
<
<
<
<

|
<
<

|

|
<
<
<

|
<
<
<
<
<
<

|



|

|
|
<
<
<
|

|
|

|
<
<
<

|
<
<
<
<

|
|

|



|

|
<
<

|
<


|
|

|

|

|
<
<
<
<
<

|
<

<
|
<
<
<

|



|

|

|

|

|

|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<

|
<
<

|
<



|

|
<
|
<
<
<

|
>
>
|

|

|

|
<
<
<
<
<

|

|
<
<



|
|
|
|
|
|
|


|

|
>
|
<

|
>
|

|
|
|

|
|
|
<

|
>
|
<
<
<
<

|
|
|
|
|

|
|
|

|
>
|

|

|
<
<

|

|

|

|

|



|

|

|
<
<

|
<
<
<
<
<
<
<
<

|

|
|
<

<
|
<
<
<
<
<
<

>
>
>
>
|
<
<

|
<
<
<
<
|
<
<
<
<
<
<
<
<
<

|
<
<

|
<

|

<
|



|

|

|
<
<
<
<

|

>
|

|

|

|
<

|

<
|

|
<
<
<
<
<
<
<
<

|
<
<
<
<



|

|

|
<
<
<
<
<

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|

|

|

|
<
<



|



|
<

|

>
|

|

|

|
<
<

|
<
<
<
<
<
<
<

|
<
<
<
<
<
<
<

|
<
<
<
<
<
<

|

>
|

|

|

|

|
<
<
<
<
<
<
<
<
<
<

|




|



|



|
<
<
<

|
<
<

|



|
<


|

|
<
<
<
<

|



|

>
|

|

|

|

|

|

|

|
<

|

|
<
<
<
<
|
>
>
>
>
>
>
|

|

|

|

|
|
<
<

|

|
<
<
<
<

|

|
<
<



|

|
<

|
<
<



|
<

|



|

|
<
<
<
|

|

|
|
<
|
|
|
|
|
<
|
<
<
<

|

|

|

|

|

|
<
<

|
|

|

|
<

|
<
<

|

|
|

|

<
|
|
<
|
<

|

|

|

|

|

|
<
<

|
|

|

|

|



>
>
|
<
<
<

|

|

|

|
<

|

|

|

|
<
<

|
<
<
<
<

|

|

|

|

|
<

|



>
>
|
<

|

|

|

|

|
<
<

|

|

|
<
<

>
|
|

|

|

|
<

|

|

|

|
<

|
<

|

|

|

|

|

|

|
<
<
<
<
<

|
<

|
|

|

|
<

|
<
<
<
|
<

|

|

|

|
|

|

|

|

|

|

|
<
<
<

|






|





|

|







|

|


|



|


|




|





|

|

|

|
<
<
<
<

|
<
<
<
<

|

|

|

|

|
<
<

|

|

|

|

|
<

|

|
<
<

>
>
|

|
<
<
<

|

|

|

|

|

|
<
<

|

|

|

|

|
<
<
<
<

|

|

|
<
<

|
<
<
<

|
<
<

|

|
<
|
<
<
|
|
<
|
<

|
<

|

|



|

|

|

|
<
|
<
|
|

|

|

|

|

<
|
<
<
<

|

|

<
<
<
<
<
|
<

|

|

|

|

|

>
>
|

|
<
<

|
<
<

|

|
<
<
<

|
<

|

|
<
|

|

|

|
<
<

|

|

|

|



|

|

|
<

|
<
|

|
<

|

|

|

|

|
<
<
<
<
|

|

|
<
<
<
<
<
<

|

|
<
|
<
|
|
<
<
|
<
|
<
|
<
|
<
|
<
<
<
<
|
|
<
|
<

|
<
<

|
<
<
<
<

|

|

|

|

|
<
<

|
<

|
<

|

<
|
<

|
|

<
|
<
<
<

|

|

|
|
|

|

|

|
<
<
<

|
<
<

|


|
|


|

|

|
<
|
<
|
<
|
|
|
<
|
<
<

|

|
<
<

|

|

|

|
<
<
<

|
|

|

|

|
<

<
|
<
|
|

|

|

|
<
<
<
<

|
|
|

|

|

|

<
|
<
<
<
<
<
<

|
|

|

|

|

|

|
<
<
<
<

|

|

|

|

|
|
<
>

<
<
|

|

|
<
<
<

|
|

|

|

|
<

|

|
<
<
<

|

|

|

|

|

|

|

|

|

|

|

<
|
<
<

|

|

|
<
<

|
<
|

|

|

|

|
<

|

|

|

|

<
|
<
<

|
<
<

|
<
<
<

|

|

|

|

|
>
>
1
2
3
4
5
6
7
8


9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111






112
113
114
115


116
117







118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136



137
138


139
140
141
142



143
144
145
146




147
148















149
150
151
152
153

154
155




156
157
158
159



160
161


162
163

164
165





166
167
168
169




170
171





172
173

174
175


176
177



178

179

180
181
182

183

184

185

186



187

188



189
190

191








192




193
194
195
196
197
198
199




200
201





202
203
204
205




206
207
208


209
210

211

212



213
214

215

216

217
218

219

220

221
222


223
224


225

226

227

228


229



230


231
232






233
234


235
236
237
238
239
240




241
242


243
244
245
246

247
248
249

250
251
252

253
254
255

256

257
258
259
260
261
262



263
264
265
266
267
268
269
270

271
272
273
274
275
276
277
278
279

280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304

305
306








307
308
309
310
311
312
313
314
315
316
317
318
319
320


321
322











323
324
325
326
327
328


329

330


331

332
333


334

335


336

337

338


339






340
341
342
343

344
345
346
347
348
349
350
351



352
353

354
355
356
357
358

359

360
361

362
363
364
365
366




367
368
369
370

371
372



373
374
375
376
377
378
379
380
381
382
383
384
385
386

387
388
389
390
391
392
393
394
395
396
397
398
399
400



401
402
403
404
405
406






407
408
409
410
411
412





413
414
415
416
417
418
419
420


421
422
423
424




425
426


427
428
429
430
431
432

433

434
435
436
437
438



439
440
441
442
443
444
445
446
447
448


449
450
451
452
453
454

455
456
457
458
459
460
461
462


463
464

465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491



492
493
494
495
496
497
498
499
500
501
502
503
504
505





506
507




508
509

510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529


530
531
532
533
534

535
536

537
538
539
540





541
542
543
544
545
546
547
548
549
550
551
552
553
554




555
556




557

558



559


560
561
562

563

564

565
566


567
568


569
570

571
572















573
574
575
576
577
578
579
580
581
582
583
584





585
586


587
588
589
590



591
592






593
594
595
596
597
598
599
600
601



602
603
604
605
606
607



608
609




610
611
612
613
614
615
616
617
618
619
620


621
622

623
624
625
626
627
628
629
630
631
632





633
634

635

636



637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
















653
654


655
656

657
658
659
660
661
662

663



664
665
666
667
668
669
670
671
672
673
674





675
676
677
678


679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695

696
697
698
699
700
701
702
703
704
705
706
707

708
709
710
711




712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729


730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747


748
749








750
751
752
753
754

755

756






757
758
759
760
761
762


763
764




765









766
767


768
769

770
771
772

773
774
775
776
777
778
779
780
781




782
783
784
785
786
787
788
789
790
791
792

793
794
795

796
797
798








799
800




801
802
803
804
805
806
807
808





809
























810
811
812
813
814
815
816


817
818
819
820
821
822
823
824

825
826
827
828
829
830
831
832
833
834
835


836
837







838
839







840
841






842
843
844
845
846
847
848
849
850
851
852
853
854










855
856
857
858
859
860
861
862
863
864
865
866
867
868
869



870
871


872
873
874
875
876
877

878
879
880
881
882




883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905

906
907
908
909




910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926


927
928
929
930




931
932
933
934


935
936
937
938
939
940

941
942


943
944
945
946

947
948
949
950
951
952
953
954



955
956
957
958
959
960

961
962
963
964
965

966



967
968
969
970
971
972
973
974
975
976
977
978


979
980
981
982
983
984
985

986
987


988
989
990
991
992
993
994
995

996
997

998

999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010


1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025



1026
1027
1028
1029
1030
1031
1032
1033

1034
1035
1036
1037
1038
1039
1040
1041


1042
1043




1044
1045
1046
1047
1048
1049
1050
1051
1052
1053

1054
1055
1056
1057
1058
1059
1060
1061

1062
1063
1064
1065
1066
1067
1068
1069
1070
1071


1072
1073
1074
1075
1076
1077


1078
1079
1080
1081
1082
1083
1084
1085
1086
1087

1088
1089
1090
1091
1092
1093
1094
1095

1096
1097

1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111





1112
1113

1114
1115
1116
1117
1118
1119
1120

1121
1122



1123

1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144



1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198




1199
1200




1201
1202
1203
1204
1205
1206
1207
1208
1209
1210


1211
1212
1213
1214
1215
1216
1217
1218
1219
1220

1221
1222
1223
1224


1225
1226
1227
1228
1229
1230



1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242


1243
1244
1245
1246
1247
1248
1249
1250
1251
1252




1253
1254
1255
1256
1257
1258


1259
1260



1261
1262


1263
1264
1265
1266

1267


1268
1269

1270

1271
1272

1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286

1287

1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298

1299



1300
1301
1302
1303
1304





1305

1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321


1322
1323


1324
1325
1326
1327



1328
1329

1330
1331
1332
1333

1334
1335
1336
1337
1338
1339
1340


1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356

1357
1358

1359
1360
1361

1362
1363
1364
1365
1366
1367
1368
1369
1370
1371




1372
1373
1374
1375
1376






1377
1378
1379
1380

1381

1382
1383


1384

1385

1386

1387

1388




1389
1390

1391

1392
1393


1394
1395




1396
1397
1398
1399
1400
1401
1402
1403
1404
1405


1406
1407

1408
1409

1410
1411
1412

1413

1414
1415
1416
1417

1418



1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432



1433
1434


1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447

1448

1449

1450
1451
1452

1453


1454
1455
1456
1457


1458
1459
1460
1461
1462
1463
1464
1465



1466
1467
1468
1469
1470
1471
1472
1473
1474

1475

1476

1477
1478
1479
1480
1481
1482
1483
1484




1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495

1496






1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509




1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520

1521
1522


1523
1524
1525
1526
1527



1528
1529
1530
1531
1532
1533
1534
1535
1536

1537
1538
1539
1540



1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563

1564


1565
1566
1567
1568
1569
1570


1571
1572

1573
1574
1575
1576
1577
1578
1579
1580
1581

1582
1583
1584
1585
1586
1587
1588
1589
1590

1591


1592
1593


1594
1595



1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Плагины/index.html)


# Плагины

Материал из Tkabber Wiki

 ![(!)](../images/Hammer.png) **Сделать:** вынести на отдельные странички описания плагинов, превышающие по размерам половину экрана (примерно, конечно), оставив здесь лишь краткие пояснения и ссылки. 



## <a id="toc"></a>Содержание

* [1 Плагинология](#Плагинология)
 * [1.1 Как подключить плагин](#Как_подключить_плагин)
 * [1.2 Подводные камни при обновлении Ткаббера](#Подводные_камни_при_обновлении_Ткаббера)
 * [1.3 Анатомия плагина](#Анатомия_плагина)
 * [1.4 Сисадмину на заметку](#Сисадмину_на_заметку)
 * [1.5 Советы разработчику плагинов](#Советы_разработчику_плагинов)
* [2 Официальные плагины для Ткаббера](#Официальные_плагины_для_Ткаббера)
 * [2.1 Abbrev](#Abbrev)
 * [2.2 Aniemoticons](#Aniemoticons)
 * [2.3 Attline](#Attline)
 * [2.4 Ctcomp](#Ctcomp)
 * [2.5 Custom URLs](#Custom_URLs)
 * [2.6 Floating Log](#Floating_Log)
 * [2.7 Floating Roster Contact](#Floating_Roster_Contact)
 * [2.8 Gmail Notifications](#Gmail_Notifications)
 * [2.9 Histool](#Histool)
 * [2.10 Open URL](#Open_URL)
 * [2.11 Presencecmd](#Presencecmd)
 * [2.12 Quote Last Message (quotelastmsg)](#Quote_Last_Message_quotelastmsg)
 * [2.13 Receipts](#Receipts)
 * [2.14 Recentstatus](#Recentstatus)
 * [2.15 Singularity](#Singularity)
 * [2.16 Stripes](#Stripes)
 * [2.17 Tclchat](#Tclchat)
 * [2.18 Tkabber-KHIM](#Tkabber-KHIM)
 * [2.19 Unixkeys](#Unixkeys)
* [3 Полуофициальные плагины для Ткаббера](#Полуофициальные_плагины_для_Ткаббера)
 * [3.1 Alarm](#Alarm)
 * [3.2 Antispam](#Antispam)
 * [3.3 Autoanswer](#Autoanswer)
 * [3.4 Autosubscribe](#Autosubscribe)
 * [3.5 Bldjid](#Bldjid)
 * [3.6 Customstatus](#Customstatus)
 * [3.7 Flip](#Flip)
 * [3.8 Green](#Green)
 * [3.9 Hidemuctopic](#Hidemuctopic)
 * [3.10 Juick](#Juick)
 * [3.11 Killerfeature](#Killerfeature)
 * [3.12 Notes](#Notes)
 * [3.13 Now Playing](#Now_Playing)
 * [3.14 Open History](#Open_History)
 * [3.15 Plugin Manager](#Plugin_Manager)
 * [3.16 Reminder](#Reminder)
 * [3.17 Snoopstatus](#Snoopstatus)
 * [3.18 Urgent](#Urgent)
 * [3.19 Urlcmd](#Urlcmd)
* [4 Неофициальные плагины](#Неофициальные_плагины)
 * [4.1 8bitgw](#8bitgw)
 * [4.2 Autoconnect](#Autoconnect)
 * [4.3 Autoraise](#Autoraise)
 * [4.4 Autoretrieve](#Autoretrieve)
 * [4.5 Bmuc](#Bmuc)
 * [4.6 Bookmarks](#Bookmarks)
 * [4.7 Chess-mod](#Chess-mod)
 * [4.8 Clienticons](#Clienticons)
 * [4.9 Confirm](#Confirm)
 * [4.10 CryptoConfig](#CryptoConfig)
 * [4.11 Cyrillize2](#Cyrillize2)
 * [4.12 Follownick](#Follownick)
 * [4.13 Goto (заготовка для плагина)](#Goto_заготовка_для_плагина)
 * [4.14 Hihglight XEP and RFC URLs](#Hihglight_XEP_and_RFC_URLs)
 * [4.15 Highlightex](#Highlightex)
 * [4.16 Histballoon](#Histballoon)
 * [4.17 Jdiskurl](#Jdiskurl)
 * [4.18 Last Activity](#Last_Activity)
 * [4.19 Meebo me](#Meebo_me)
 * [4.20 Mimetex](#Mimetex)
 * [4.21 Nickomp](#Nickomp)
 * [4.22 NickSaneColors](#NickSaneColors)
 * [4.23 OSD redux](#OSD_redux)
 * [4.24 Patches](#Patches)
 * [4.25 Postpone Text (добавлен в транк)](#Postpone_Text_добавлен_в_транк)
 * [4.26 Reject subscription](#Reject_subscription)
 * [4.27 Remote Commands](#Remote_Commands)
 * [4.28 Remote IP Address](#Remote_IP_Address)
 * [4.29 Remote Settings](#Remote_Settings)
 * [4.30 Roster Avatars](#Roster_Avatars)
 * [4.31 Rsssaver](#Rsssaver)
 * [4.32 Savebtn](#Savebtn)
 * [4.33 Server Info](#Server_Info)
 * [4.34 So\_keepalive](#So_keepalive)
 * [4.35 Spam filter](#Spam_filter)
 * [4.36 Tab number](#Tab_number)
 * [4.37 Tkabho](#Tkabho)
 * [4.38 Vcardavatars](#Vcardavatars)
 * [4.39 Wintweaks (устарел)](#Wintweaks_устарел)

# <a id="Плагинология"></a>Плагинология
В этом разделе рассказано о внешних плагинах Ткаббера. 

Если вы — новичок, прочитайте как минимум первые два раздела. 

## <a id="Как_подключить_плагин"></a>Как подключить плагин

При старте Ткаббер ищет плагины в двух местах и в указанном порядке: 

1.  Каталог, имя которого находится в переменной окружения TKABBER\_SITE\_PLUGINS 
1.  Каталог [$::configdir]($__configdir.md)/plugins 

Любой из этих каталогов (в том числе оба) могут отсутствовать. Первый из них, как и следует из названия соответствующей переменной окружения, предназначен для использования плагинов всеми пользователями системы, в то время как второй — конкретным пользователем (то есть лично вами). Строго говоря, переменную окружения можно установить не на уровне системы, а для конкретного пользователя, что несколько гибче. К тому же её вообще можно просто прописать в конфиге: 







    set env(TKABBER_SITE_PLUGINS) Q:/Path/To/TkabberPluginsDirectory

Обратите внимание на прямые слэши, а ещё лучше — ознакомьтесь сначала с [этим небольшим отрывком](Config.tcl.md#Немного_о_синтаксисе_тикля) из статьи про конфиг. 



Физически плагин Ткаббера представляет собой _каталог_ с файлами, который следует скопировать в любую из указанных выше директорий (но только в одну из них). Заметьте, что копировать надо каталог целиком, а не файлы из него; кроме того, каталог плагина нельзя переименовывать (об этом — ниже). И ещё надо учесть, что в каталоге plugins должны лежать непосредственно директории с плагинами, и ничего в промежутке, например, если вы работаете в системе как Vasya Pupkin, и решили поставить плагины attline, georoster и chess, то если вы всё сделали правильно, вы должны получить такую структуру каталогов: 








    C:\Documents and Settings\
      Vasya Pupkin\
        Application Data\
          Tkabber\
            plugins\
              attline\
                attline.tcl
                ...
              chess\
                chess.tcl
                ...
              georoster\
                georoster.tcl
                ...

Добавленный плагин Ткаббер загрузит при следующем старте. 

**На заметку:** как ни странно, но некоторых пользователей на поприще подключения плагина останавливало отсутствие каталога `plugins` в домашнем каталоге Ткаббера. Это — совершенно нормальное явление; если такого каталога нет, создайте его. 




**На заметку:** не обязательно копировать каталог с плагином из дистрибутива в [$::configdir]($__configdir.md)/plugins — вполне можно сделать [символическую ссылку](Symlinks.md), например, такую: 



    ~/.tkabber/plugins/latex → /usr/local/share/tkabber-svn/tkabber-plugins/latex

Имейте в виду, что Ткаббер не спускается в подкаталоги при поиске плагинов, поэтому не имеет смысла линковать  сам каталог с плагинами из дистрибутива _под_ какой-либо каталог плагинов Ткаббера. Зато вполне можно его _заместить,_ создав симлинк, например, так: 




    ~/.tkabber/plugins → /usr/local/share/tkabber-svn/tkabber-plugins

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





**Внимание:** с появлением в составе Ткаббера так называемого Менеджера плагинов (в настройках выглядит как кнопка Plugins Management) очень многие пользователи (и автор этих строк в том числе) забывают после установки плагина включить его в этом самом Менеджере. Там всё просто и быстро. Идём в вышеозначенное место, ищем плагин, включаем галочку, сохраняем изменения. Всё. Плагин на ходу загружается и работает. При "горячем" отключении, кстати, он _не выгружается из памяти,_ а просто выключается (его функциональность становится недоступной). Если точнее, кое-что всё-таки выгружается, и это зависит от автора (впрочем, полная выгрузка плагинов на данный момент пока невозможна). Естественно, не все плагины можно включить-выключить таким способом, а лишь те, чьи авторы об этом позаботились. Очень желательно поэтому, когда вы выкладываете сюда свой плагин, оборудованный этой возможностью, напоминать пользователям, чтобы после установки они пошли в Менеджер и включили плагин, потому что _по умолчанию Ткаббер их не подключает._ Имеется шаблон для вики, позволяющий вставлять в текст статьи хорошо заметную надпись. В нужное место (лучше всего в самом начале) следует поместить следующий код разметки: 
















    == My Plugin ==
    {{plugmgr}}

Выглядеть надпись будет так: ![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов ** 


Пользователям, желающим установить себе такой плагин, следует помнить, что Менеджер плагинов имеется лишь в svn-версии Ткаббера (а если точнее, его не имеется в 0.11.1 и более древних версиях — есть надежда, что 0.12 всё же выйдет, и, кстати, выйдет она не раньше, чем _все_ плагины будут снабжены возможностью динамической загрузки/выгрузки). 





## <a id="Подводные_камни_при_обновлении_Ткаббера"></a>Подводные камни при обновлении Ткаббера

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




Это означает, что обновляя Ткаббер, — не важно, "снимаете" ли вы копию из репозитория или устанавливаете следующий стабильный релиз — нужно всегда помнить про установленные плагины и обновлять их вместе с Ткаббером. 



Невнимание к этому факту порождает 99% проблем из серии "после обновления Ткаббер сыплет ошибками". Обновите плагины и перезапустите Ткаббер. 


**На заметку:** иногда возникает обратная проблема: вы даёте плагин от "свежей" версии Ткаббера своему товарищу с более старой версией этой программы, и там он не работает. Решением проблемы, если обновление Ткаббера невозможно, является установка плагинов от соответствующей более старой версии Ткаббера, которые доступны вместе со своими плагинами [здесь](http://jabberstudio.org/projects/tkabber/releases/). 






## <a id="Анатомия_плагина"></a>Анатомия плагина

В простейшем случае каталог плагина содержит один-единственный файл формата ".tcl", имя которого совпадает с именем каталога; именно этот файл Ткаббер читает при загрузке плагина. Если в каталоге есть другие файлы .tcl, то они загружаются, как правило, главным файлом плагина или вообще служат для какой-то другой цели. 





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






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


Каталог msgs, если есть, содержит переводы текстовых ресурсов плагина (текста сообщений и т.п.) на языки, отличные от английского. Этот каталог может быть интересен с двух точек зрения: 



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



    ::msgcat::mcload ...

 (это загрузка каталогов с текстовыми ресурсами) и окружите её строчками: 

    set orig [::msgcat::mclocale]

    ::msgcat::mclocale LC

 сверху и 

    ::msgcat::mclocale $orig

 — снизу. Вместо "LC" должна быть интересующая вас локаль (например, ru, uk, es и т.д.). 

*  Во-вторых, каталог **msgs** — это именно то, что вам нужно менять, если вы хотите "перевести" плагин на какой-либо другой язык или исправить уже имеющийся перевод. Подробнее о технике перевода текстовых ресурсов Tcl рассказано [тут](Tkabber_Wiki_Справка.md#Локализация_Ткаббера). 





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




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










    svn update





    $ cd ~/.tkabber/plugins/whiteboard
    $ svn up

## <a id="Сисадмину_на_заметку"></a>Сисадмину на заметку

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





**Примечание:** Начиная с марта 2009 года ведутся работы по переводу плагинов на динамические рельсы — теперь в Настройках появился пункт **Plugin Management**, где вы можете включить или выключить нужный вам плагин прямо на ходу (естественно, если он уже переведён на эти самые рельсы). Но надо полагать, в новом стабильном релизе Ткаббера по крайней мере все официальные плагины можно будет загружать/выгружать динамически. 






## <a id="Советы_разработчику_плагинов"></a>Советы разработчику плагинов

Если вы хотите попробовать свои силы в написании плагина, но не знаете, с чего начать, возможно, вам поможет [статья с некоторыми рекомендациями разработчику](Разработка_плагинов.md). Она далека от идеала и не претендует на полноту освещения этой темы, но кое-какие идеи вам даст. 





# <a id="Официальные_плагины_для_Ткаббера"></a>Официальные плагины для Ткаббера
![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов ** Почти все эти плагины можно и нужно включать через Менеджер плагинов (за исключением, разве что, osd, latex и Tkabber-khim (последний уже намертво прикручен к Ткабберу)). 



В этом разделе ничего принципиально нового не будет — сводка по существующим плагинам и краткое вспомоществование для желающих скачать и установить их. 



Итак, на сегодняшний день на [официальной странице плагинов](http://tkabber.jabber.ru/tkabber-plugins) насчитывается 17 расширений к Ткабберу: bc, checkers, chess, cyrillize, ejabberd, georoster, mute, osd, reversi, socials, spy и whiteboard. В двух словах о каждом: 




1.  bc — игра ["Быки и коровы"](http://games.look.ru/bc/). Управление командами: /bcstart /bcstop /bcnext /bctop 

1.  checkers — шашки (включает разные версии: обычные, русские, американские, испанские и итальянские). Плагин весьма проработан - есть много игровых возможностей. 

1.  chess — шахматы. Тоже весьма продвинут. 

1.  cyrillize — если при вводе сообщения вы ошиблись раскладкой, дело можно поправить, нажав Ctrl+'. 
1.  ejabberd — утилитка, позволяющая удалённо общаться с вашим ejabberd сервером. 

1.  georoster — показывает на карте мира, где находятся ваши собеседники (если у них заполнены соответствующие поля в vCard). 

1.  mute — экспериментальный плагин для коллективного редактирования текста. 

1.  poker — техасский покер (Texas hold'em). 
1.  osd — выводит некоторые события и сообщения "на широком экране" — On-Screen Display. Про его минимальную настройку можно почитать [тут](http://vonderer.blogspot.com/2007/02/tkabber.html). 


1.  reversi — ещё одна настольная игра. 
1.  socials — позволяет вводить команды типа **/танцевать** (результат будет такой: **\*nick пляшет дикий танец!**). 


1.  spy — шпионит за присутствием, регистрируя появления в онлайне и уходы в оффлайн. Можно выбрать конкретного человека или нескольких и получать оповещения при их появлении. 

1.  whiteboard — доска для рисования. Удобно, когда надо нарисовать схему проезда к месту <s>распития пива</s> оффлайновой Jabber-тусовки ;) 

1.  debug — он и в Африке отладчик, пишет в лог ошибки касательно отмеченных ключевых слов. 

1.  latex — показывает формулы, написанные в формате LaTeX, в виде картинок-математических формул. Работает под Windows и \*nix. Нужно дополнительно установить пакеты latex, dvips, imagemagick. 


1.  traffic — считает количество байт в несжатом, незашифрованном XML потоке. Группирует по JID-у отправителя и по типу станцы. [Читать подробнее.](Low_traffic_HOWTO.md#Средства_самоконтроля) 



1.  [Tkabber-KHIM](Плагины.md#Tkabber-KHIM) — позволяет вводить в Ткаббере произвольные символы Unicode значительно более удобным способом, чем при помощи встроенного механизма ["unisymbols"](Ткаббер_ЧаВо.md#Ввод_хитрых_юникодных_символов). 



В версию [0.11.0](http://tkabber.jabber.ru/node/464) было интегрировано несколько плагинов: attline, ctcomp, custom-urls, floatinglog, gmail, openurl, presencecmd, receipts и unixkeys. Краткие справки о них доступны [здесь](http://www.jabber.ru/node/893) и [здесь](http://www.jabber.ru/node/641). Некоторые из них подробнее освещены ниже. ![(!)](../images/Hammer.png) **Сделать:** перенести краткое опиcание из статьи на j.r. сюда 







Установить самый свежий пакет плагинов можно из SVN. Для этого необходимо проделать [следующее](http://tkabber.jabber.ru/svn) (естественно, у вас должен быть установлен пакет svn): 


`
    svn co http://svn.xmpp.ru/repos/tkabber/trunk/tkabber-plugins tkabber-plugins
`
## <a id="Abbrev"></a>Abbrev

 **Внимание!** Этот плагин находится в транке в качестве _встроенного_ средства начиная с ревизии 994 (3 Марта 2007). Интерфейс управления не изменился; несущественно изменился формат вывода информации командами плагина. _**Изменился** механизм раскрытия сокращений:_ во встроенном плагине сокращения раскрываются вводом Shift-space. 





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



Плагин предоставляет три "команды" чата: 

 /abbrev 


 Создаёт сокращение. Форма использования: 
    /abbrev что на что

 привязывает к сокращению "что" строку "на что". 

 /unabbrev 


 Удаляет сокращение. Форма использования: 
    /unabbrev что

 удаляет сокращение "что". Аргумент "\*" представляет собой особую форму команды — удаляются все имеющиеся сокращения. 


 /listabbrevs 

 Показывает текущие сокращения. 

Сокращения разворачиваются динамически при нажатии кнопки space после ввода слова-сокращения. Например, если у нас есть сокращение для "днк", то если после ввода слова "днк" вы введёте пробел, сокращение "днк" развернётся в "дезоксирибонуклеиновая кислота". 




**Внимание:** чтобы подавить разворачивание, вводите Shift-space. 

Пример: 

    /abbrev прив приветствую участников конференции!

(добавили сокращение "прив" с замещением "приветствую участников конференции!"), далее используем его: 


    хочу всем сказать: прив
                           ^тут вводится пробел

в итоге имеем: 

    хочу всем сказать: приветствую участников конференции!

Сокращения сохраняются в базу данных Customize. Выполнен русский перевод сообщений плагина. 


Подробности смотрите в файле README. 

**Полезный совет:** добавьте следующее сокращение: 

    /abbrev аббрев /abbrev

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

    /abbrev ме /me
    /abbrev унаббрев /unabbrev
    /abbrev листаббр /listabbrevs
    /abbrev девойс /devoice

и так далее (многие плагины работают с помощью команд, которые не всегда вовремя вспоминаются; вот тут-то и пригодится "листаббр"!). Теперь нет нужды переключаться на английскую раскладку для набора команд :) 

Файл: [abbrev.zip](../files/Abbrev.zip) (~6 кб) 

Автор: [kostix](Участник_Kostix.md) 

## <a id="Aniemoticons"></a>Aniemoticons

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов ** 

Плагин для любителей анимированных смайликов. ![(!)](../images/Hammer.png) **Сделать:** Развить? 


## <a id="Attline"></a>Attline









![(!)](../images/Hammer.png) **Сделать:** Написать. 

## <a id="Ctcomp"></a>Ctcomp

 _Внимание!_ Этот плагин вошёл в число официальных внешних плагинов Ткаббера и находится в транке начиная с ревизии 1256 (7 октября 2007). Версия плагина в транке была сильно переработана по сравнению с предыдущей версией (1.2). 

**Текущая версия** 

[kostix](Участник_Kostix.md) 7 октября 2007 (MSK): v2.0 (является копией версии в транке). 

**Назначение и принцип действия** 

Этот плагин — "Chat Text Completion" — реализует автозавершение слов, вводимых в окне ввода чата, словами, имеющимися в окне протокола чата и в окне ввода чата. 



Идея простая: в ходе общения в чат были помещены какие-то (сложные) слова, и вам хочется воспроизвести одно из таких слов в своём сообщении. Слово есть в окне протокола чата, но для того, чтобы его поместить в своё сообщение, необходимо его скопировать в буфер обмена _при помощи мыши_ и затем вставить в поле ввода чата. А данный плагин позволяет написать несколько первых букв требуемого слова (минимум — одну) и затем комбинациями клавиш Ctrl-n и Ctrl-p циклически "прокрутить" все подходящие под ваш ввод слова прямо "на месте", выбрать нужное и продолжить редактирование. Кто знает, как работает "completion" в insert mode текстового редактора [Vim](http://vim.sf.net), поймёт откуда позаимствован принцип действия этого плагина и, вероятно, найдёт привязки кнопок по умолчанию удобными. Жест из Emacs Alt-/ также поддерживается. 












Также можно вызвать меню со списком имеющихся дополнений слова. 

**Управление** 

Плагин переопределяет две стандартные привязки поля ввода чата (по умолчанию отвечающие за помещение в поле ввода чата текста следующего/предыдущего отосланного сообщения): 




*  Ctrl-n — включает режим автодополнения слова, если он не включен и показывает первый подходящий вариант; если режим уже работает, показывает следующий вариант. Соответственно, последовательные нажатия этой комбинации клавиш перебирают все возможные варианты, циклически. 


*  Ctrl-p — делает то же самое, что и предыдущая комбинация, только перебирает варианты в обратном порядке. 


Эти комбинации являются основными. Возможно чередовать их использование, произвольно перемещаясь по "кольцу" возможных вариантов дополнения введённых букв слова. 




*  Escape — отменяет режим автозавершения. Текущий вариант автозавершения удаляется и поле ввода чата приводится в такое же состояние, которое у него было до включения режима автозавершения. 


*  Enter — выбирает (подтверждает) текущий вариант автозавершения. Курсор остаётся сразу за полученным словом. Действие этой клавиши по отсылке сообщения "съедается" в данном режиме. 

*  Alt-/ — полностью повторяет действие Ctrl-n; этот жест взят из Emacs. 

*  Ctrl-Alt-/ — показывает меню с первыми 20 найденными дополнениями. Активация элемента этого меню вставляет выбранное дополнение вместо исходного слова. Щелчок мышью вне меню или нажатие клавиши Escape отменяют меню, оставляя исходное слово без изменений. 


*  Любые клавиши или их комбинации из тех, что не указаны выше, нажатые при активном режиме автозавершения (то есть когда показывается один из предложенных вариантов завершения слова) прекращают режим автозавершения как если бы была нажата клавиша Enter; при этом нажатая комбинация клавиш передаётся окну ввода текста, например, если в режиме автозавершения был нажат BackSpace, текущий вариант автозавершения будет принят, после чего самый правый его символ будет удалён. 







**Пример** 

Имеем в окне протокола чата несколько слов, среди которых есть: "abbot", "abridged", "abduction" и "abba". 


Вводим в поле ввода чата: 

    ab
      ^тут нажимаем Ctrl-n, Alt-/ или Ctrl-p

переходим в режим автодополнения, в котором Ткаббер будет показывать все слова, начинающиеся с "ab" на месте введённого вами "ab"; дополненная часть слова выделяется другим цветом фона: 




    abba
    abduction

    abot
    abridged
    ...

Значения в списке отсортированы; Ctrl-n и Alt-/ перебирают значения в порядке возрастания, Ctrl-p — в обратном порядке. 



Далее Enter для подтверждения использования текущего варианта, или Escape для выхода из режима автодополнения (и возврата к исходному тексту: "ab"). 


Также можно было нажать Ctrl-Alt-/ вместо Ctrl-n (и прочих) чтобы получить меню со списком подходящих слов. 

**Проблемы** 

Указанные комбинации клавиш не будут работать на русской раскладке Windows в силу [печально известного бага Tk в Windows](Wish_и_русская_раскладка_в_Windows.md). В [README](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber-plugins/ctcomp/README) описан костыль для этой проблемы (потребуется написать несколько строчек в config.tcl. 





**Плагин** 

Большая просьба потестировать, если интересно, и не стесняться сообщать багрепорты/пожелания. 


_Рекомендуется_ прочитать приложенный [README](http://svn.xmpp.ru/repos/tkabber/trunk/tkabber-plugins/ctcomp/README) — там описаны доступные настройки плагина и вообще дано больше информации по нему. 




Файл: [ctcomp.zip](../files/Ctcomp.zip) (~9 кб) 

Автор: [kostix](Участник_Kostix.md) 

## <a id="Custom_URLs"></a>Custom URLs

![(!)](../images/Hammer.png) **Сделать:** Написать. 

## <a id="Floating_Log"></a>Floating Log

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов ** 

 _Внимание!_ Этот плагин вошёл в число официальных внешних плагинов Ткаббера и находится в транке начиная с ревизии 1245 (6 октября 2007). 


Плагин показывает во всплывающих окнах приходящие сообщения и сообщения статуса. 

Файл: [floatinglog.zip](../files/Floatinglog.zip) 

Текущая версия: 0.4 , 26-August-2007. 

Автор: [archimed](Участник_Archimed.md) 

## <a id="Floating_Roster_Contact"></a>Floating Roster Contact

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов ** 

Proof-of-concept plugin. Позволяет "оторвать" элемент ростера в плавающее окно без декораций. Перемещение этого окна по Drag'n'Drop. Плагин очень недоделанный (окошки не запоминаются, при логауте не пропадают, на roster push не реагируют, наверняка ещё чего-нибудь нужное не делают). 




*  **Файл:** [float.tar.gz](http://sgolovan.nes.ru/jabber/tmp/float.tar.gz) (1K) 

[Teo](Участник_Teo.md) 

## <a id="Gmail_Notifications"></a>Gmail Notifications







![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов ** 

Если вы пользуетесь джаббер-аккаунтом на gmail.com, то этот плагин позволит вам получать уведомления о почте, приходящей по вашему адресу. Плагин использует расширение XMPP [Gmail Notifications](http://code.google.com/apis/talk/jep_extensions/gmail.html). Уведомления показываются в отдельном окне/вкладке. 

**Примечание:** Если вы не пользуетесь gmail.com в качестве Jabber-сервера, но хотите получать уведомления о почтовых сообщениях, то этот плагин вам не поможет. Вместо него можно использовать J2J-транспорт. Но помните, что владелец J2J-транспорта может подсмотреть ваш пароль на gmail.com и читать вашу почту. Оно вам надо? Подробнее можно почитать [на странице проекта J2J](http://wiki.jrudevels.org/index.php/J2J). 






*  **Файл:** [gmail-1.0.tar.gz](http://sgolovan.nes.ru/jabber/tmp/gmail-1.0.tar.gz) (3K) 

[Teo](Участник_Teo.md) 

## <a id="Histool"></a>Histool

 **Внимание!** начиная с 0.10.0-beta2 этот плагин интергирован в Ткаббер в качестве встроенного средства (пункт главного меню **Службы → Разговоры**) и дальше развивается там. Этот раздел будет убран через некоторое время. 



"History tool" — браузер истории чата. 

**Внимание!** Плагин предназначен для "новой системы логирования", появившейся в альфа-версии начиная с релиза 841 (26 Декабря 2006), кроме того код плагина был частично интегрирован в транк Ткаббера (и сам плагин туда собирается), так что этот плагин работает только с Ткаббером начиная с релиза 1004 (04 Марта 2007). 





Этот плагин реализует окно, которое можно открыть через пункт главного меню **Services → Plugins → Chat history**, предоставляющий несколько способов для доступа ко всей истории чатов: 



*  Список JID'ов, для которых есть логи чата; 
*  Дерево, отражающее структуру логов; 
*  <s>Полнотекстовый поиск по логам</s> (пока не реализован). 

Двойной клик на любом JID'е открывает стандартный диалог с логом чата для этого JID'а. 



В списке джидов и дереве логов работает поиск (панель открывается по `<<OpenSearchPanel>>`, прибитому по умолчанию на Ctrl-s. 

**Баги/ограничения** текущей версии: 

*  <s>Код показа лога чата для JID'а в Ткаббере содержит ошибку: если вы попытаетесь посмотреть лог общения в привате с некоторым поситителем комнаты при том, что не будете в этот момент находиться в данной комнате, Ткаббер покажет лог самой комнаты.</s> (исправлено в релизе 987 (28 Февраля 2007). 



*  На некоторых джидах глючит открытие лога; механизм пока не выявлен. 
*  Полнотекстовый поиск не реализован. 
*  Есть мелкие проблемы с клавиатурным фокусом при переключении табов. 
*  README не дописан. 

Файл: [histool.zip](../files/Histool.zip) (~8 кб) 

Текущая версия: 0.6, 04-Mar-2007. 

Автор: [kostix](Участник_Kostix.md) 



## <a id="Open_URL"></a>Open URL

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов ** 

Добавляет в меню по правой кнопке на URL в окне чата пункты, позволяющие открыть этот URL в заданном браузере. 


*  **Файл:** [openurl.tar.gz](http://sgolovan.nes.ru/jabber/tmp/openurl.tar.gz) (1K) 

[Teo](Участник_Teo.md) 

## <a id="Presencecmd"></a>Presencecmd

 _**Внимание!** Данный плагин без изменений добавлен в число официальных внешних плагинов Ткаббера и находится в транке начиная с ревизии 1189 (17 августа 2007)._ 



Добавляет две новые IRC-команды чата для управления присутствием (глобальным и направленным). 


Примеры: 

    /presence dnd

    /presence chat
    Hey girls!

    /presence
    Now read this!

    /chatpresence xa
    Gone shopping

Подробности — в [README](http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/presencecmd/README). 

Файл: [presencecmd.zip](../files/Presencecmd.zip) (~6k) 

Текущая версия: 0.2, 14-July-2007. 

    http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/presencecmd

Автор: [kostix](Участник_Kostix.md) 

## <a id="Quote_Last_Message_quotelastmsg"></a>Quote Last Message (quotelastmsg)

Копирует в поле редактирования последнее сообщение из чата и прибавляет к нему угловые скобки (признак цитирования). Хоткей — Alt-Q Если это сочетание уже занято, вы можете перебиндить его в конфиге. Например, так, как об этом рассказано в README, который лежит в папке с плагином: 




    event delete <<QuoteLastMessage>> <Alt-q>
    event delete <<QuoteLastMessage>> <Meta-q>
    event add    <<QuoteLastMessage>> <Control-Shift-m>

Кстати, с помощью этого плагина удобно редактировать обширный топик. 

## <a id="Receipts"></a>Receipts

![(!)](../images/Hammer.png) **Сделать:** Написать. 

## <a id="Recentstatus"></a>Recentstatus

 _Внимание!_ Плагин интергирован в виде _встроенного_ средства начиная со стабильной версии [0.11.0](http://tkabber.jabber.ru/node/464), поэтому плагин следует использовать только на версиях \<= 0.10.0. Если вы "апгрейдитесь" на 0.11.0 с более старой версии, проверьте — не установлен ли у вас этот плагин; если установлен, обязательно удалите его, в противном случае это может привести к мистическим глюкам. 






Плагин меняет штатный виджет Ткаббера для вода "статусного сообщения" (справа от кнопки, открывающий меню состояний доступности) на комбобокс, который хранит историю последних установленных статусных сообщений. Каждое установленное пользователем статусное сообщение записывается в историю. История сохраняется между перезапусками Ткаббера. Возможно настроить максимальную длину истории. 





**Примечание:** В репозитории tkabber-3rd-party его уже нет. Если вам по каким-то причинам нужна старая версия, трясите автора ;) 


Автор: [kostix](Участник_Kostix.md) 

## <a id="Singularity"></a>Singularity

![(!)](../images/Hammer.png) **Сделать:** Написать. 

## <a id="Stripes"></a>Stripes

![](../images/180px-Stripes.png)

![](../images/magnify-clip.png)

![](../images/180px-Dark-stripes.png)

![](../images/magnify-clip.png)

 **Внимание!** Этот плагин включён в транк начиная с версии 0.11.1. При этом в нём был исправлен баг, указанный ниже. 

Этот плагин позволяет раскрашивать фон целых нечётных и/или чётных сообщений в окне чата. Поддерживается раздельная установка цвета фона для чётных и нечётных сообщений через базу опций Tk (Tk option database) или XRDB, например, так: 



    option add *Chat.oddBackground  gray77
    option add *Chat.evenBackground gray84

Если цвет для соотв. типа сообщений не задан, он не устанавливается (остаётся тем, который используется по умолчанию). 


Настройки цветов должны идти либо в **preload\_hook**, либо быть "на верхнем уровне" (вне хуков). 


С подбором цветов поможет [эта статья](Палитра_цветов.md). 

**Внимание!** плагин имеет баг, связанный с невозможностью (в плагине) узнать момент окончания отрисовки сообщения: при поступлении нового сообщения в окно чата плагин раскрашивает _предыдущее_ сообщение, а не текущее. Это приводит к тому, что последнее сообщение, помещённое в окно чата не будет раскрашено до поступления следующего сообщения. (Если у кого-то есть идеи как это обойти — пишите автору.) 






Файл: [stripes.zip](../files/Stripes.zip) (~1.5 кб) 

Текущая версия: 0.1, 07-Mar-2007. 

Автор: [kostix](Участник_Kostix.md) 

## <a id="Tclchat"></a>Tclchat

![(!)](../images/Hammer.png) **Сделать:** Написать. 

## <a id="Tkabber-KHIM"></a>Tkabber-KHIM

 _Внимание!_ С 13 декабря 2006 этот плагин находится в транке, так что если вы используете версию с SVN, не заморачивайтесь и снимите его оттуда. Тем более, что версия плагина в транке уже получила несколько изменений, недоступных в выложенной здесь версии. (Изменения, впрочем, не принципиальные, так что если у Вас стабильная версия Ткаббера, возьмите плагин отсюда.) 





Этот плагин прикручивает к Ткабберу особый "как бы метод ввода" авторства [Кевина Кенни](http://wiki.tcl.tk/kbk) — [KHIM](http://wiki.tcl.tk/16343), позволяя вводить в Ткаббере произвольные символы Unicode значительно более удобным способом, чем при помощи встроенного механизма ["unisymbols"](Ткаббер_ЧаВо.md#Ввод_хитрых_юникодных_символов): 






*  Можно определить особую "кнопку композиции" — например, Pause, и список "входных последовательностей" — пар символов, которые, будучи введены после нажатия кнопки композиции, "превращаются" в некоторый символ Unicode. Клавиша композиции, входные последовательности и их отображение на символы Unicode настраиваются произвольным образом. 



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



Примерно это выглядит так: 


*  В настройках KHIM вы выбрали клавишу Scroll\_Lock в качестве клавиши композиции, и определили, что последовательность символов **"A** даёт "А умляут" — Ä. 

*  Тогда после применения настроек вы можете в любом поле ввода Ткаббера ввести: Scroll\_Lock`"A` и получить Ä. 


После установки плагина и перезапуска Ткаббера посетите меню **Службы → Расширения** и выберите там пункт "KHIM Options". _Обязательно_ прочтите справку по работе и настройке KHIM, нажав "Справка..." в появившемся диалоге. 



Пакеты **khim** и **autoscroll**, необходимые для работы Ткаббера, но имеющиеся только в **tklib**, упакованы прямо в  плагин, т.к. **tklib** не очень распространён, и в текущую стабильную его версию **khim** ещё не входит. 



Плагин должен работать на любой версии Ткаббера, так что приветствуется тестирование на любых доступных версиях. 


**Пара полезных советов:** Помните, что KHIM включен по умолчанию, то есть чисто теоретически в настройки ходить не обязательно (в случае, если пакет вам уже знаком). Но конечно, если вы видите его впервые, сходить туда имеет смысл: ознакомиться с "прошитыми" комбинациями и, в случае нужды, дополнить и/или измененить список, ну и почитать справку. После завершения работы с опциями окно можно закрыть (но можно и оставить, чтобы иметь комбинации перед глазами). В некоторых европейских раскладках (в частности, в испанской) некоторые дефолтные комбинации могут не работать. Например, буква "энье" — n, вводящаяся по умолчанию как Pause`~n` — из-за тильды, которая сама по себе висит на сочетании клавиш "RightAlt-4" и портит весь пирог. Ввод этой буквы можно легко перевесить на другое сочетание, к примеру, "$n" (доллар вызывается как обычно, "Shift-4", и проблем не вызывает). Так что если у вас установлен нетрадиционный дополнительный язык, и вы испытываете трудности с вводом некоторых букв, всё можно легко поправить. Не бойтесь обновлять плагин &mdash; все ваши изменения сохраняются в файле **~/.tkabber/custom.tcl**, и останутся там даже после удаления самого плагина. 
















Это — предварительная версия плагина, что означает отсутствие документации. 

Файл: [tkabber-khim.zip](../files/Tkabber-khim.zip) 

Автор: [Kostix](Участник_Kostix.md) 

Версия: 1.2 

Размер файла: ~34k 

**Примечание:** если у вас в системе есть свежий **tklib**, то вы можете удалить подкаталоги **khim** и **autoscroll** из каталога с плагином. Про то, как снять **tklib** с CVS и поставить его в систему, рассказано [здесь](Установка_tklib_в__nix.md). Имейте в виду, что KHIM вошёл в состав tklib совсем недавно, и текущая стабильная версия (на 9 декабря 2006 года) его не содержит — берите с CVS. 






**Однако** имейте в виду, что в той версии **khim**, что идёт с плагином, уже имеется один багфикс и русский перевод всех окон KHIM. Этого пока нет в **tklib**. 



## <a id="Unixkeys"></a>Unixkeys

 _Внимание!_ Плагин интергирован в виде стандартного внешнего плагина начиная со стабильной версии [0.11.0](http://tkabber.jabber.ru/node/464). В транке плагин был доработан: его функциональность была расширена на все поля ввода, включая однострочные и комбобоксы, а жест Ctrl-\\ заменён на Ctrl-/. 




Плагин приделывает ко всем многострочным полям ввода в Ткаббере (включая поля ввода сообщений чатов) комбинации клавиш, традиционные для средств редактирования в Unix. Фактически, в плагин "завёрнута" функциональность, описанная [здесь](Нетривиальные_настройки.md#Комбинации_кнопок_а-ля_Unix_shell_в_текстовых_виджетах) (главное отличие — в плагине реализован жест Ctrl-\\, означающий "выделить всё"). 







Подробности — в [README](http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/unixkeys/README). 

    http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/unixkeys

Автор: [kostix](Участник_Kostix.md) 

# <a id="Полуофициальные_плагины_для_Ткаббера"></a>Полуофициальные плагины для Ткаббера
Здесь ссылки на плагины для Ткаббера, которые не попали в tkabber-plugins, но их авторы не поленились получить доступ к репозиторию [tkabber-3rd-party](http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins) и выложили свои творения туда. Скачать их можно командой 



`
    svn co http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins ~/tkabber-3rd-party-plugins
`
## <a id="Alarm"></a>Alarm

 _Внимание!_ версия этого плагина, доступная в виде архива по ссылке, перестала работать после очередного изменения внутреннего API обработки IQ-запросов в Ткаббере; исправленная версия доступна _только_ в "левом" репозитории (см. ниже). 




Возможность послать собеседнику сигнал. Вид сигнала (звук, сообщение, запись в чате) выбирает собеседник. Есть фильтр и защита от флуда. Идея [отсюда](http://forum.jrudevels.org/viewtopic.php?p=546#546) продолжение [здесь](http://forum.jrudevels.org/viewtopic.php?t=1006). Разработан протокол, описание внутри. Все ошибки и запросы присылайте [Feez](Участник_Feez.md). 





*  **Файл:** [Alarm-0.3.tar.gz](../files/Alarm-0.3.tar.gz) (15K) 
*  **Версия:** 0.3 [Changelog](Plugins/Alarm/Changelog.md) 

Исправленная версия, работающая на альфах 0.10.1 и выше доступна в репозитории: 

    https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/alarm

## <a id="Antispam"></a>Antispam

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



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


Плагин доступен в репозитории по адресу
 [https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/antispam](https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/antispam) 
Подробности — в [README](https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/antispam/README). 

Автор: [Gebb](Участник_Gebb.md). 

## <a id="Autoanswer"></a>Autoanswer

Автоответчик. Позволяет автоматически посылать пользователю, написавшему вам личное сообщение (или "в приват" конференции), пока вы находитесь в "недоступном" состоянии (список таковых поддаётся настройке), некоторое заготовленное сообщение, например, "Я занят, перезвоните попозже!" ©. Таким образом, плагин удобен для борьбы с людьми, которые не умеют или не хотят понимать, что означает ваш текущий статус. 






Автоответчик можно быстро включать/отключать с помощью соответствующей иконки на тулбаре. 



 Имейте в виду, что если вы пользуетесь "автоэвеем", _настоятельно_ рекомендуется исключить из состояний, в которых включается автоответчик, "away" и "xa", оставив только "dnd". Впрочем, плагин в этом плане не очень назойлив. Он отсылает автоответ только на первое сообщение и дальше уже помалкивает. При желании число автоответов можно изменить в коде. 




Подробности — в [README](http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/autoanswer/README). 

    http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/autoanswer

Авторы: [Gebb](Участник_Gebb.md), [kostix](Участник_Kostix.md). Иконки сделал [ART](Участник_ART.md). 

## <a id="Autosubscribe"></a>Autosubscribe

![(!)](../images/Hammer.png) **Сделать:** Написать. 

## <a id="Bldjid"></a>Bldjid

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов ** 

Мощный плагин в помощь админам, позволяющий банить и разбанивать пользователей по их джидам во всех комнатах, где у вас есть админские права. Кроме этого, позволяет мониторить заходы пользователей в комнаты (можно задать список интересующих) даже при выключенной опции `::muc::options(gen_enter_exit_msgs)`. При этом собирается следующая информация: время захода, ник, реальный джид с ресурсом (при наличии у вас соответствующих прав в комнате), роль/ранг, версия клиента и ОС. Эта информация доступна не только во время текущей сессии, но и записывается в лог, откуда её можно выудить при поиске, что позволяет отслеживать долгосрочную историю заходов посетителей. Поиск возможен по нику, джиду, роли/рангу, версии, при этом можно совмещать несколько параметров в одном поисковом запросе. Кроме того, в плагине имеются команды, дающие возможность проверить, находится ли искомый джид в списке членов или в чёрном списке комнаты. Также можно включить "шпиона", уведомляющего о заходе в контролируемые комнаты нужного вам человека (указав его джид). Есть и возможность кардинальной чистки бан-листа как целиком, так и указав причину бана, что помогает разбанивать сонмы товарищей, забаненных ботом (естественно, если бот указывал определённую причину). 

















Описывать каждую команду здесь не имеет смысла, поэтому дальнейшее знакомство с плагином лучше продолжить [здесь](http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/bldjid/README.ru) 



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


    /bldhelp

**Известные проблемы:** 

*  Плагин не работает со стабильной версией Ткаббера 0.11.1 — только с SVN-версией. Впрочем, скоро SVN-версия сама станет стабильной ;) 

*  Если изменить размер окна ввода сообщения, пока окошко монитора закрыто, монитор перестаёт открываться (если сделать то же самое при открытом мониторе, проблем нет). Впрочем, это лечится закрыванием окна комнаты и новым в неё входом. 




Скачать плагин можно по адресу: 

    [http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/bldjid](http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/bldjid)
    [https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/bldjid](https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/bldjid)

[ycbl](Участник_Bigote.md) 03:32, 29 марта 2010 (MSD) 

## <a id="Customstatus"></a>Customstatus

Плагин позволяет управлять набором пар «статус присутствия "доступен"/текстовое описание», позволяя делать предустановки для различных статусов присутствия. Это позволяет быстро устанавливать статус с заранее заданным текстовым описанием. Набор статусов/описаний доступен в виде меню, привязанного к новой кнопке тулбара. В этом же меню имеется пункт, вызывающий редактор набора статусов. 






Набор статусов сохраняется при помощи стандартного механизма Customize. 

Продвинутые пользователи могут попробовать задействовать дополнительные настройки. Пока что их можно править только напрямую в файле плагина. За настройки отвечает массив **options**: 



    variable options
    array set options {
      subvert_main_presets_menu   no
      subvert_quick_presets_menu  no
      add_toolbar_item            yes
      toolbar_item_image          services/icq/chat
      accelerate_menus            no
      extend_quick_presets_panel  yes
      quick_presets_panel_image   services/icq/chat
    }

Разъяснение настроек: 

 subvert\_main\_presets\_menu 

 Заменяет меню "Присутствие" в главном меню Ткаббера на то, которое предоставляет этот плагин. 


 subvert\_quick\_presets\_menu 

 то же самое для "быстрого" меню статусов (на "Панели присутствия/статуса"). 

 add\_toolbar\_item 

 Управляет добавлением на тулбар кнопки, нажатие на которую показывает меню статусов. Это — поведение плагина по умолчанию. 

 toolbar\_item\_image 

 Устанавливает имя загруженной картинки для кнопки на тулбаре. Список доступных картинок можно получить, выполнив в консоли Ткаббера команду "`image names`". 


 accelerate\_menus 

 Если включена, при формировании меню предустановок первые девять опций меню предваряются префиксами "1.", "2." и т.д., которые являются акселераторами и могут быть активированы нажатием соотв. клавиши 1, 2 и т.д., когда меню открыто. Это может быть полезно, если сам вызов меню предустановок повешен на комбинацию клавиш, например, таким кодом в файле конфигурации: 





    hook::add finload_hook {
      bind . <Control-p> {
        tk_popup .presence.button.custom_menu [winfo pointerx .] [winfo pointery .]
      }
    }

 extend\_quick\_presets\_panel 

 Добавляет кнопку, аналогичную таковой на тулбаре, справа от кнопки выбора присутствия на "Панели присутствия/статуса". 

 quick\_presets\_panel\_image 

 Устанавливает картинку для этой кнопки. 

**Ухищрения:** 

*  В полях ввода сообщений для статусов в окне редактора предустановок работают комбинации клавиш Ctrl-↑ и Ctrl-↓, которые перемещают активный элемент списка вверх и вниз, соответственно. 



**Основные недоработки/баги:** 

*  "Продвинутые" настройки нельзя установить из файла конфигурации. 

Приветствуется самое широкое тестирование. Багрепорты и пожелания шлите автору. 

Файл: [customstatus.zip](../files/Customstatus.zip) (~7кБ) 

Версия: 0.6, 06-Mar-2007 

    http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/customstatus

Автор: [kostix](Участник_Kostix.md) 

## <a id="Flip"></a>Flip

Плагин-шутка. 1 апреля при заходе в конференцию с вероятностью 50% "переворачивает" ваш ник вверх тормашками. Смотрится прикольно :) На следующий день перевёрнутые ники приходят в норму. 



<s>**Недостаток:** Если выключить Ткаббер до полуночи и включить снова уже 2 апреля, ники в норму не придут. Для исправления требуется приделать сохранение в файл.</s> Приделано. Кроме того, обнаружен баг с одной буквой (R), перевёрнутая версия которой принадлежит арабскому алфавиту. На jabber.ru запрещено использование ников, состоящих из смеси арабских и не-арабских букв, поэтому с ником, содержащим R, вас бы не пустили ни в одну из комнат. Пришлось её выкинуть. Если заметите подобное поведение с другими буквами, просьба сообщить. Также будем рады дополнениям таблицы букв-перевёртышей (см. код плагина). 









**URL:** 

    [http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/flip/](http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/flip/)
    [https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/flip/](https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/flip/)



**Автор:** [ycbl](Участник_Bigote.md) 







## <a id="Green"></a>Green

Плагин предназначен для реализации в Ткаббере слежения за событиями управления питанием системы, таких как suspend и resume. Идея состоит в том, чтобы корректно закрыть все активные соединения с серверами при уходе системы в suspend, запомнив их. Затем, если требуется, восстановить их после того, как система переходит в нормальный режим работы, предварительно подождав некоторое время, пока не "поднимется" сеть. 

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



*  В случае работы в Windows (Windows 2000 и выше) он полагается на специальное расширение Tcl/Tk — [winpm](http://tkwinpm.googlecode.com), которое должно быть установлено и доступно Ткабберу. При помощи данного расширения плагин слушает сообщения системы об изменениях в состоянии питания и выполняет соответствующие им действия. 




*  В случае работы в системах, основанных на X Window (Linux, \*BSD и подобных), в которых отсутствует механизм, подобный реализованному в Windows, используется другой подход, основанный на использовании специального "скрипта активации", который поставляется вместе с плагином (файл swsusp-tkabber.tcl в каталоге плагина). Этот скрипт предназначен для запуска из соответствующих пользовательских скриптов, которые вызывает система управления питанием при наступлении различных событий, таких как suspend и resume. Скрипт активации сообщает всем работающим на том же дисплее копиям Ткаббера о наступлении соответствующего события управления питанием; эти уведомления обрабатываются плагином. 










Иными словами, в случае с Windows плагин работает "сам собой", а в случае систем, основанных на X Window, ему помогает внешний скрипт, организация правильного запуска которого — задача пользователя. 



_Важно понимать,_ что сам плагин должен быть установлен в Ткаббере в любом случае. 


Подробности — в [README](http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/green/README). 


По поводу работы в Linux, см. [обсуждение на багзилле Ткаббера](http://www.jabber.ru/bugzilla/show_bug.cgi?id=376). 

    http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/green

Автор: [kostix](Участник_Kostix.md) 

## <a id="Hidemuctopic"></a>Hidemuctopic

Небольшой плагин, который, будучи установленным, скрывает поле темы комнаты, высвобождая несколько ценных миллиметров пространства. Чтобы вновь увидеть его для доступа к редактированию темы или к настройкам и командам комнаты (плохо заметная "кнопка" с надписью "Тема" слева от поля с топиком), нужно нажать Ctrl-T 





**URL:** 

    [http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/hidemuctopic/](http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/hidemuctopic/)
    [https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/hidemuctopic/](https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/hidemuctopic/)

**Автор:** [kostix](Участник_Kostix.md) 

## <a id="Juick"></a>Juick

Плагин для жуйкования. То бишь, ведения (микро)блога на [juick.com](http://juick.com). [Подробнее](Плагины/Juick.md). 


## <a id="Killerfeature"></a>Killerfeature


Плагин предназначен для ручного [удаления XMPP-аккаунта с сервера](http://www.xmpp.org/extensions/xep-0077.html#usecases-cancel). 

После установки плагина, в подменю "Tkabber" главного меню Ткаббера появится новый пункт "Delete account...", активизация которого представит пользователю диалог с одним или более чекбоксами — по одному на каждый уникальный аккаунт из числа активных (подключённых) в данный момент. Нажатие кнопки "ОК" данного диалога отправит серверу команду удаления каждого помеченного пользователем аккаунта; при этом также происходит отключение этих аккаунтов. Никаких подтверждений запрошено не будет. Выйти из диалога без удаления аккаунтов можно, нажав кнопку "Отмена", нажав Escape или закрыв окно диалога средствами оконного менеджера. 









 _**Внимание!** Восстановить удалённый аккаунт не будет никакой возможности (кроме разве что ползания на коленях перед админом сервера с мольбами поднять ваш аккаунт из последнего бэкапа)._ 





    http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/killerfeature

Автор: [kostix](Участник_Kostix.md) 

## <a id="Notes"></a>Notes

Плагин для ведения заметок. Заметки хранятся в связанном с JID'ом хранилище в соответствии с [XEP-0049](http://www.xmpp.org/extensions/xep-0049.html). Плагин совместим с аналогичными плагинами для Miranda и Psi+. Поддерживается работа с несколькими одновременно подключёнными аккаунтами. Есть возможность отфильтровать заметки по одному или нескольким тегам, а также экспортировать их в файл. [Подробнее](Плагины/Notes.md). 






























## <a id="Now_Playing"></a>Now Playing

![(!)](../images/Hammer.png) **Сделать:** Написать. 

## <a id="Open_History"></a>Open History

Небольшой, но полезный плагин, позволяющий открывать историю разговоров в комнате или с контактом из ростера без использования мыши, с помощью нехитрой команды. Для истории любого конкретного джида: 



    /history jid

Для просмотра истории текущего разговора: 

    /history

**Недостаток:** В случае просто **/history** в привате конференции откроется история конференции, а не этого привата. 


**URL:** 

    [http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/openhistory/](http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/openhistory/)
    [https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/openhistory/](https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/openhistory/)

**Автор:** [Sceptik](Участник_Sceptik.md) 

## <a id="Plugin_Manager"></a>Plugin Manager

_Внимание!_ простым пользователям Ткаббера это средство скорее всего не нужно, потому что это не "настоящий" плагин; если вы просматриваете список плагинов в поисках чего-нибудь "вкусненького", пропускайте этот раздел и читайте дальше. 



Это средство было специально написано для Windows-дистрибутивов Ткаббера (пак и старпак), которые устанавливают в систему все стандартные внешние плагины вместе с Ткаббером чтобы пользователю не надо было качать их отдельно. Plugin Manager добавляет в Ткаббер возможность открыть специальное окно со списком всех стандартных внешних плагинов, выбрать требуемые и установить их одним нажатием кнопки. Точно так же их можно удалять из пользовательского каталога плагинов. Таким образом, пользователю не нужно думать о том, как устанавливать или удалять плагин, а также о том, куда инсталлятор распаковал плагины. 








В настоящий момент (post-0.11.1 девелоперская версия) в Ткаббере реализована возможность динамической загрузки и выгрузки плагинов в процессе работы без требования перезагрузки. После того, как во всех стандартных внешних плагинах будет реализована поддержка этой возможности, Plugin Manager станет не нужен, поскольку устанавливать стандартные внешние плагины путём копирования их в пользовательский каталог плагинов будет не нужно: достаточно будет пометить видимые Ткабберу плагины в группе настроек "Plugins Management" как используемые и сохранить настройки. 








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







**URL:** 

    [http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/pluginmanager/](http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/pluginmanager/)
    [https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/pluginmanager/](https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/pluginmanager/)

**Автор:** [Archimed](Участник_Archimed.md) 

## <a id="Reminder"></a>Reminder

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов ** 

Плагин, позволяющий задавать напоминания о некоторых грядущих событиях (не забыть выключить чайник, позвонить кому-либо и т. д.). Время срабатывания можно задать как в абсолютном формате (полная дата вида **MM/DD/YYYY HH:MM:SS**), так и в относительном (**HH(H):MM:SS**, **MM(M):SS**, **S(S)**). Относительный формат также используется при задании тайм-аута с помощью ключевых слов, например: **tomorrow 1:00:00** — через 25 часов, **week** — через неделю. Когда наступит заданный вами момент времени, выскочит небольшое окошко с текущим временем и текстом напоминания и прозвучит сигнал (сигнал можно отключить в настройках). Кроме обычных одноразовых напоминаний также планируется приделать повторяющиеся (каждый час, день, неделю, месяц, год), а также напоминания о днях рождения контактов из ростера и, по желанию, посетителей конференций. 











Формат команды: 

    /remind time
    message

Кроме этого, можно выводить список текущих напоминаний посредством команды 

    /listrems

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

    /delrem #

где \# — номер нужного (а точнее, ненужного) вам напоминания в полученном списке. Удалить за один раз можно только одно напоминание, при этом помните, что оно сразу же пропадает из списка, в результате чего нумерация нарушается, поэтому для гарантии выведите список ещё раз, если вам надо удалить несколько. 




Есть возможность задать выполнение команд в определённое время, при этом сообщение, указываемое на следующей строке, должно начинаться с ключевого слова **cmd** (например, 25 ноября в час дня разбанить некоего посетителя): 



    /remind 11/25/2010 13:00:00 
    cmd ::muc::unban ::xmpp::1 \
    foo@conference.jabber.ru pupkin@jabber.ru

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


    /remind 3 days
    cmd source /home/myself/bin/test.tcl 

Напоминания сразу же после их задания сохраняются в файле настроек `custom.tcl` и восстанавливаются оттуда при следующем запуске Ткаббера. Если какое-либо из них "протухло" за время, пока Ткаббер был выключен, при старте появится уже знакомое окошко, где помимо текущего времени и текста напоминания будет ещё указано время, на которое оно было установлено. 





Краткую помощь по использованию программы можно получить по команде 

    /remind help

**URL:** 

    [http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/reminder](http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/reminder)
    [https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/reminder](https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/reminder)

**Автор:** [ycbl](Участник_Bigote.md) 

## <a id="Snoopstatus"></a>Snoopstatus

![(!)](../images/Hammer.png) **Сделать:** Написать. 

## <a id="Urgent"></a>Urgent

![(!)](../images/Hammer.png) **Сделать:** Написать. 

## <a id="Urlcmd"></a>Urlcmd

Добавляет две новые IRC-команды чата для перехода по ссылкам, содержащимся в сообщениях чата. 


Примеры: 

 **Команда ****Действие **




 
 /listurls Показать список ссылок в текущем окне. 
 
 /browseurl Открыть последнюю ссылку в броузере. 
 
 /browseurl 1 Открыть ссылку с номером 1 в списке. 

Плагин доступен в репозитории по адресу 

    [http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/urlcmd](http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/urlcmd)

Подробности — в [README](http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/urlcmd/README). 

Авторы: [Gebb](Участник_Gebb.md), [kostix](Участник_Kostix.md). 

# <a id="Неофициальные_плагины"></a>Неофициальные плагины
А здесь собраны плагины, не попавшие ни в официальный, ни в 3rd-party репозитории. Некоторые из них, вероятно, устарели, так что если какой-то вдруг у вас не работает, разыскивайте авторов. 



## <a id="8bitgw"></a>8bitgw

Плагин, позволяющий общаться с "асечниками" и другими страдальцами через XMPP-гейты, работающие с 8-битным набором символов, отличным от того, с которым работает клиент "асечника". Например, можно общаться с русским "асечником", использующим Windows-1251, через "буржуйский" гейт, считающий, что в ICQ-сети используется Latin-1. 





**Настройка:** 

Параметр `::plugins::8bitgw::gateways` в секции Customize **Plugins → 8bitGateways** содержит (возможно пустой) Tcl-список гейтов и связанных с ними наборов символов в следующем формате: 



    {сервер1 кодировка_сети кодировка_удалённого_клиента} [{сервер2 ...} ...]

(символы [ и ] отделяют необязательную часть). 

Гейты задаются "голым JID'ом" ("bare JID"), т.е. адресом без узловой части и ресурса, например: `icq.someserver.com`. 


Названия наборов символов сети и удалённого клиента должны быть понятны тиклю; узнать, что для него понятно, можно, выполнив в `tclsh`, `wish` или консоли Ткаббера команду 



    encoding names

Тикль работает с каноническими наименованиями наборов символов, в частности, он не знает про "Latin-1", зато знает про "iso8859-1". 


Пример: такая настройка 

    {aim-icq.jabber.anywise.com iso8859-1 cp1251} {icq.ru.biz cp1251 cp1252}

заставит плагин совершать перекодировки исходящих и входящих данных чтобы: 

*  общаться с русскими ICQ/AIM-клиентами (использующими cp1251) через сервер `aim-icq.jabber.anywise.com`, настроенный на использование iso8859-1 в качестве транспортной кодировки; 



*  общаться с европейскими "асечниками" (использующими cp1252) через "русский" гейт, использующий cp1251 в качестве транспортной кодировки. 

**Ошибки/недоработки:** 

*  Нельзя настраивать кодировку для каждого удалённого клиента в отдельности; 
*  Нельзя использовать символы Unicode за пределами "кодировки удалённого клиента" — вместо них удалённый клиент увидит знаки вопроса ("?"); 

*  Нет перевода текстовых ресурсов на русский; 
*  Нет README; 
*  Неудобная настройка; 
*  Не тестировался на связках, отличных от "Windows-1251 + Latin-1"; 
*  Патчит код Ткаббера, что является нестабильным в долгосрочной перспективе (в идеале Ткабберу нужен хук `rewrite_outgoing_message_hook`). 

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




Багрепорты/пожелания шлите автору. 

Файл: [8bitgw.zip](../files/8bitgw.zip) (~3 кб) 

Текущая версия: 0.1, 01-June-2007. 

Автор: [kostix](Участник_Kostix.md) 

## <a id="Autoconnect"></a>Autoconnect

Данный плагин предназначен для автоматического соединения с нужными транспортами после отсоединения или при старте Ткаббера. Критику и пожелания направляйте [eXire](Участник_EXire.md). 



*  **Файл:** [Media:autoconnect-0.4.tar.gz](../files/Autoconnect-0.4.tar.gz) (1K) 
*  **Версия:** 0.4 

## <a id="Autoraise"></a>Autoraise

Этот плагин написан в качестве фикса к проблеме, сформулированной [тут](http://tkabber.jabber.ru/node/320). 


Плагин "поднимает" главное окно Ткаббера, если таковое свёрнуто или скрыто, на экран при приходе любого нового сообщения (в т. ч. от сервера, сообщений о присутствии и т. п.). 



Управление: 

*  Настройки: опция-флаг `::plugins::autoraise::autoraise` 
*  Главное меню: **Tkabber→View→Auto raise on new message** 

**Ограничения:** 


*  Работает _только_ для "интерфейса с табами", т. к. восстанавливает главное окно, что является бессмысленным для многооконного интерфейса. 
*  Не имеет возможностей для фильтрации сообщений — поднимается по любому пришедшему. 

*  "Патчит" одну из процедур Ткаббера, что является ненадёжным методом в долговременной перспективе. 


Тестирование и отзывы приветствуются. 

Файл: [autoraise.zip](../files/Autoraise.zip) (~4 кб) 

Текущая версия: 0.1, 29-Mar-2007. 

Автор: [kostix](Участник_Kostix.md) 

## <a id="Autoretrieve"></a>Autoretrieve

Этот плагин автоматически запрашивает информацию о пользователях в конференции, т. е. информация сразу доступна в тултипе и не надо открывать окно Userinfo. Включить/отключить плагин можно в **Customize→Conference Info** 



*  **Файл:** [autoretrieve.tar.gz](../files/20081020172036!Autoretrieve.tar.gz) (1К) 
*  **Файл:** для 0.11.1 [autoretrieve.tar.gz](../files/Autoretrieve21102008.tar.gz) (1К) 

[eXire](Участник_EXire.md) 

## <a id="Bmuc"></a>Bmuc

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов ** 

![](../images/180px-Bmuc.png)

![](../images/magnify-clip.png)

Плагин позволяет блокировать все приватные сообщения в конкретной конференции, отправленные вам участниками с рангом «None». Также есть возможность блокировки приватных сообщений от модераторов и членов (включается по выбору отдельно). Управление плагином осуществляется через меню на кнопке «Тема:» в конференции. 




 _**Внимание!** Плагин будет работать только с SVN-версией Ткаббера._ 

*  **Файл:** [Bmuc.zip](../files/Bmuc.zip) 

Автор: [Jet](Участник_Jet.md) 

Модифицированный плагин с расширенной возможностью блокировки сообщений в группчате доступен в репозитории по адресу: 


    [http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/bmucx/](http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/bmucx/)

Автор модификации: [ancestor](Участник_Ancestor.md) 

## <a id="Bookmarks"></a>Bookmarks

Плагин автоматически ставит bookmark в окнах чата при автоматическом и ручном уходе в away, а также при потере фокуса окном Ткаббера. Настраивается через **Customize → Plugins → Bookmarks**. 



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





**Будет работать только с 0.10.0-beta1 и старше.** 

Для работы в Windows требуется пакет tclWinidle. 

[eXire](Участник_EXire.md). 

*  **Файл** [Media:bookmarks-0.4.5.tar.gz](../files/Bookmarks-0.4.5.tar.gz) (1K) 

Ныне вытеснен плагином attline. Не работает начиная где-то с 1816 ревизии июля 2009г. 


## <a id="Chess-mod"></a>Chess-mod

![](../images/180px-Chess-mod.gif)

![](../images/magnify-clip.png)

Модифицированный плагин для игры в шахматы, добавлены координаты для клеток игровой доски и отмена последнего сделанного хода по обоюдному согласию 


*  **Файл:** [Chess-mod.zip](../files/Chess-mod.zip) 

Автор плагина: [Jet](Участник_Jet.md) 

## <a id="Clienticons"></a>Clienticons

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов ** 

Добавляет иконки клиентов в ростер и список участников конференции. Иконки клиентов и идея взяты из Psi+ ([http://psi-dev.googlecode.com/](http://psi-dev.googlecode.com/)) 



 _**Внимание!** Плагин будет работать только с SVN-версией Ткаббера._ 

*  **Файл:** [Clienticons.zip](../files/Clienticons.zip) 

Автор: [Jet](Участник_Jet.md) 



- - - -  

Модифицированный [ancestor](Участник_Ancestor.md) плагин c обновленными иконками доступен в репозитории по адресу: 

    [http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/clienticons/](http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/clienticons/)

## <a id="Confirm"></a>Confirm

Добавляет вопрос при закрытии всех/остальных табов и Ткаббера. Есть графические настройки в **Customize→Plugins→Confirm**. 


[eXire](Участник_EXire.md) 

*  **Файл:** [Media:confirm-0.2.tar.gz](../files/Confirm-0.2.tar.gz) (1K) 

## <a id="CryptoConfig"></a>CryptoConfig

Позволяет хранить часть **config.tcl** (например, настройки **loginconf**) или всё его содержимое в зашифрованном файле. 


При загрузке Ткаббера спрашивает пароль, использованный для шифрования, дешифрует файл и исполняет код из него. 


Требует наличия в системе OpenSSL или GPG. 

Подробности — в README. 

Файл: [cryptoconfig.zip](../files/Cryptoconfig.zip) 

Текущая версия: 0.1, 16-June-2007. 

Автор: [kostix](Участник_Kostix.md) 

## <a id="Cyrillize2"></a>Cyrillize2

 _Внимание!_ Стандартная версия этого плагина — "cyrillize" — получила ту же самую функциональность в ревизии 869 (11 января 2007); "навешена" она на комбинацию Ctrl-" (или Ctrl-Shift-'). Кроме того, комбинация Ctrl-; "занята" встроенным средством Ткаббера — [unisymbols](0.9.x/ЧаВо.md#Очень_неудобный_способ). Посему данный плагин следует считать не рекомендованным к использованию. 






Усовершенствование стандартного плагина cyrillize. В него было добавлено сокращение C-; по которому можно перевести  введенный русский текст в латиницу. 


**Файл**: [Media:Cyrillize2-0.1.tar.gz](../files/Cyrillize2-0.1.tar.gz) 
 Усовершенствовал [feez](Участник_Feez.md) 

## <a id="Follownick"></a>Follownick

Плагин для MUC, позволяющий быстро "прыгать" по сообщениям конкретного участника: 


*  Клик средней кнопкой на нике или сообщении в окне лога делает так, что предыдущее (т.е. более старое) сообщение от этого участника появляется в окне с логом чата (то есть устанавливает viewport над "лентой" чата так, чтобы это сообщение было видно). 



*  Shift+клик средней кнопкой ищет следующее по отношению к текущему сообщение (т.е. более новое). 


После перемещения ник искомого сообщения подсвечивается. 

Основная идея плагина: быстрое перемещение по постам конкретного человека в "шумных" комнатах. 

**Ошибки/недоработки:** 

*  Ничего не настраивается. 
*  Полное отсутствие сопроводиловки. 

Багрепорты/пожелания шлите автору. 

Файл: [follownick.zip](../files/Follownick.zip) (~1 кб) 

Текущая версия: 0.1, 03-May-2007. 

Автор: [kostix](Участник_Kostix.md) 

## <a id="Goto_заготовка_для_плагина"></a>Goto (заготовка для плагина)

Заготовка для плагина активации таба по его заголовку из окна любого чата. Добавляет команду "/goto tabname" и соответствующие возможности автодополнения по клавише Tab. На данный момент позволяет перейти только на таб с чатом (в том числе на таб с конференцией). 




Для работы заготовки вставить в config.tcl вне хуков следующий код. 

    # Goto
    # ====
    proc gotochat {name} {
        foreach chatid [chat::opened] {
            set tabtitle [lindex [chat::window_titles $chatid] 0]
    
            if {[string equal $name $tabtitle]} {
                chat::activate $chatid
            }
        }
    }
    
    hook::add chat_send_message_hook [namespace current]::handle_goto 15
    
    proc handle_goto {chatid user body type} {
        if {[string equal -length 6 $body "/goto "]} {
            set tabname [crange $body 6 end]
            gotochat $tabname
            return stop
        }
    }
    
    hook::add generate_completions_hook [namespace current]::goto_commands_comps 99
    
    proc goto_commands_comps {chatid compsvar wordstart line} {
        upvar 0 $compsvar comps
    
        if {!$wordstart} {
           lappend comps "/goto "
        }
    
        if {$wordstart && [string equal -length 6 $line "/goto "]} {
            set tabtitles {}
    
            foreach chatid [chat::opened] {
                set tabtitle [lindex [chat::window_titles $chatid] 0]
                lappend tabtitles $tabtitle
            }
    
            set comps [concat $tabtitles $comps]
        }
    }
    # ====

Автор: [Totktonada](Участник_Totktonada.md). 

## <a id="Hihglight_XEP_and_RFC_URLs"></a>Hihglight XEP and RFC URLs

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов ** 

 _Внимание!_ плагин с этой (а точнее — с расширенной) функциональностью доступен среди стандартных внешних плагинов в репозитории начиная с ревизии 1145 (12 июня 2007). Называется "custom-urls", помимо XEP, RFC и Debian Bug IDs, позволяет добавлять обработку своих форматов (примеры есть в коде плагина). 





Подсвечивает как URL в окне чата слова xep-0123 или jep-0123. При клике открывает браузер на странице соответствующего XEP (XMPP Extension Proposal, а не то, что вы подумали). Версия 0.3 перестала соответствовать названию. Теперь подсвечиваются также и ссылки на RFC. Формат тот же, что и для XEP. В версии 0.4 строка \#12345 превращается в URL, ведущий на Debian BTS. 





**Будет работать только с alpha-20061115 и свежее.** 

*  **Файл:** [xeps-0.4.tar.gz](http://sgolovan.nes.ru/jabber/tmp/xeps-0.4.tar.gz) (1K) 

[Teo](Участник_Teo.md) 

## <a id="Highlightex"></a>Highlightex

Данный плагин подсвечивает (highlight) всё сообщение целиком при обращении к вам в конференции. В настройках имеется опция для задания цвета подсветки в 16-теричном формате. 



*  **Файл:** [Highlightex.zip](../files/Highlightex.zip) 

Автор: [ancestor](Участник_Ancestor.md) 

## <a id="Histballoon"></a>Histballoon

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов ** 

Добавляет всплывающее описание к строке статуса, в котором выводит 20 последних сообщений. 


*  **Файл:** [Histballoon.zip](../files/Histballoon.zip) 

Автор: [Jet](Участник_Jet.md) 



## <a id="Jdiskurl"></a>Jdiskurl

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов ** 

Расширение, которое добавляет в контекстное меню ссылок вида [http://disk.jabbim.cz/user@sever.tld/filename.ext](http://disk.jabbim.cz/user@sever.tld/filename.ext) пункт, позволяющий запрашивать файл через джаббер-диск public@disk.jabbim.cz (должен находиться в ростере). 




 _**Внимание!** Плагин будет работать только с SVN-версией Ткаббера._ 

*  **Файл:** [Jdiskurl.zip](../files/Jdiskurl.zip) 

Автор: [Jet](Участник_Jet.md) 

## <a id="Last_Activity"></a>Last Activity

Special for kroko :) 

Этот плагин изменяет поведение Ткаббера на запрос last. Теперь в графе Interval (userinfo) или по команде /last \<nick> показывается время, которое окно клиента \<nick> неактивно. 



**Будет работать только с alpha-20061110 и старше.** 

*  **Файл:** [Media:Last\_activity.tar.gz](../files/Last_activity.tar.gz) (1K) 

[eXire](Участник_EXire.md) 

## <a id="Meebo_me"></a>Meebo me

Плагин автоматически принимает запросы авторизации и отслеживает смену ника ([XEP-0172](http://www.xmpp.org/extensions/xep-0172.html)), но только для пользователей `*@guest.meebo.org`. Он вам понадобится, если вы собираетесь использовать виджет [meebome](http://www.meebome.com/) и сообщения принимать в Ткаббере. Все ошибки и запросы присылайте [Feez-у](Участник_Feez.md). 





*  **Файл:** [Media:Meebome-0.2.tar.gz](../files/Meebome-0.2.tar.gz) (1K) 

## <a id="Mimetex"></a>Mimetex

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



Плагин работает так же, как и стандартный плагин **latex**, но использует в качестве "движка" [MimeTex](http://www.forkosh.com/mimetex.html). Соответственно, _**MimeTeX** должен быть установлен, чтобы этот плагин работал_. 




**MimeTex**, однако же, представляет собой _один_ исполняемый файл, что даёт ему соответствующие преимущества перед плагином **latex**: он работает быстрее, и его намного проще установить; в частности, есть версия для Windows. 



**Установка:** 

1.  Установите **MimeTex**: 

 *  Скачайте исходники и соберите бинарь сами, согласно [соответствующему разделу официальной страницы](http://www.forkosh.dreamhost.com/source_mimetex.html#quickbuild). Убедитесь, что собираете _без_ ключа `-DOPAQUE`. Если у вас тёмный фон окон чата в Ткаббере, собирайте с ключом `-DWHITE` чтобы получить белый цвет символов в формулах. 


 *  Или скачайте уже готовую версию [оттуда же](http://www.forkosh.com/mimetex.html#precompiled). Там же есть версия под Windows. 
 

1.  Поставьте плагин, перезапустите Ткаббер, посетите группу настроек **Plugins → MimeTex** и установите там правильный путь до исполняемого файла **MimeTex**. 


Имейте в виду, что в [Debian GNU/Linux](http://www.debian.org) есть готовый пакет (правда, похоже, он собран без поддержки антиалиасинга). 


**Использование:** 

**MimeTex** пытается отобразить всё, что находится между парами токенов "$$", например: 

    Это — $$f(x)=\int_{-\infty}^xe^{-t^2}dt$$ формула

отображается как 

    Это — ![Mimetex-example.gif](../images/Mimetex-example.gif) формула.

**Ошибки/недоработки:** 

*  Не поддерживается преобразование цветов в генерируемых картинках, они вставляются в текст "как есть". 

*  Не поддерживается исправление антиалиасинга для цветов фона окна чата, отличающихся от чисто белого или чисто чёрного. 

*  Отсутствует README. 
*  Отсутствует перевод на русский. 

Файл: [mimetex.zip](../files/Mimetex.zip) (~5 кб) 

Текущая версия: 0.3, 16-May-2007. 

Автор: [kostix](Участник_Kostix.md) 

**Последние изменения:** 


[kostix](Участник_Kostix.md) 21:33, 16 мая 2007 (MSD): Исправлен регексп для поиска формул в тексте сообщения, изменён приоритет парсера формул с тем, чтобы он отрабатывал раньше парсеров эмоциконок и стайлкодов (спасибо [Gman](Участник_Gman.md) за наводку). Теперь нормально просекаются формулы примеров №№ 6 и 9 с оф. сайта. 




## <a id="Nickomp"></a>Nickomp

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов ** Позволяет перебирать ники участников конференции по табу не только в окне ввода конференции, но и в привате любого участника этой конференции (привет @neris). Работает только с свн версией. © [http://juick.com/Jet/583486](http://juick.com/Jet/583486) 






Скачать плагин можно по [ссылке](http://jetftp.narod.ru/nickomp.zip) в посте автора, но на всякий случай файл потырен и размещён и тут. 


Файл: [Nickomp.zip](../files/Nickomp.zip) 

Автор: [Jet](Участник_Jet.md) 

## <a id="NickSaneColors"></a>NickSaneColors

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов ** 

![](../images/180px-Nicksanecolors_groupchat_before_after.png)

![](../images/magnify-clip.png)

**Общая информация** 

Плагин переопределяет дефолтный массив цветов для ников ($::plugins::nickcolors::NickColorPool) в зависимости от текущего цвета фона чата, установленного цветовой схемой. 



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



![Color distance.png](../images/Color_distance.png) 

Пользователю предлагается задать интервал по шкале от 0 до 100 (по умолчанию 40..60), при попадании в который цвет добавляется в массив используемых цветов. Значение 0 соответствует одинаковым цветам, значение 100 соответствует максимально отличающимся цветам. 




Цвета выбираются из массива, взятого здесь: [Colors with Names](http://wiki.tcl.tk/16166). 


**Установка** 

*  Распаковать архив в стандартную директорию для плагинов (на \*nix системах это ~/.tkabber/plugins/) 

*  Включить плагин в менеджере расширений (Plugins Management) 

**Использование** 

*  (Опционально) установить значения для порогового интервала. 

Если в указанный диапазон не попадает ни одного цвета из исходных, восстанавливается массив цветов по умолчанию. Также массив цветов по умолчанию восстанавливается при выгрузке плагина. 



**Ошибки/недоработки** 

Возможны. 

Файл: [NickSaneColors.zip](../files/Nicksanecolors.zip), 4.5K 

Текущая версия: 0.1, 2010-02-19 

    http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/nicksanecolors

Автор: [hekp0maht](Участник_HEKP0MAHT.md) 

## <a id="OSD_redux"></a>OSD redux

Попытка привести штатный плагин OSD к удобоваримому — по меркам современного Ткаббера — виду: 


*  Поддержка Customize (**Plugins → XOSD Status Display**) — настройки цвета, шрифта, тени и таймаутов; 

*  Управление местоположением вывода XOSD на экране. 

Плагин _**не **доделан_ и выложен тут просто по просьбе одного ткабберовца. Это означает, что не все опции работают (или работают не так, как задумывалось). 


Несмотря на это, плагин вполне себе работает на машине автора. 

Файл: [tkabber-osd.zip](../files/Tkabber-osd.zip), ~3k 

Автор: [Kostix](Участник_Kostix.md) 

**Примечание:** на всякий случай учтите, что: 

*  Плагин предназначен для [X Window System](http://en.wikipedia.org/wiki/X_Window_System) и не работает в Windows; 




*  Он требует наличия работающего [XOSD-сервера и утилиты osd\_cat к нему](http://ignavus.net/software.html), (подробнее можно почитать [тут](http://ldots.org/xosd-guide/) ). 

## <a id="Patches"></a>Patches

Плагин, который использует одну из особенностей языка, на котором написан Ткаббер, и позволяет «патчить» код Ткаббера без его изменения. Плагин состоит из 2 частей: сам файл плагина (patches.zip/plugins/patches/patches.tcl) и файлы пропатченных процедур (patches.zip/patches/\*.tcl). Работает всё достаточно просто: во время загрузки плагина он (плагин) загружает все файлы с расширением \*.tcl из папки patches.zip/patches/, которая должна находиться там же, где и config.tcl. 







**Описание патчей:** 

*  1\_smart-emoticons.tcl — Устанавливает порядок смайлов согласно тому, как они записаны в icondef.xml и убирает поля в меню смайлов. 

*  2\_block-retry-server-messages.tcl — Блокирует повторяющиеся сообщения о смене статуса и рангов / ролей в конференциях. 

*  3\_recoloring-chat.tcl — Меняет цвета элементов окна чата. 
*  4\_status-panel-and-window.tcl — Заменяет стандартную статусную панель. Добавляет окно для установки статуса, приоритета и статусного собщения, а также значки статусов в меню. 


*  5\_draw-subject-of-chat-window.tcl — Показывает тему сообщения (не путать с темой конференции) в окнах чата. 

*  6\_roster-bg-image.tcl (отключён) — Добавляет фоновое изображение в ростер (расположение задаётся в коде патча). 

*  7\_recalc\_position-balloon.tcl — Размещает всплывающую подсказку слева или сверху от курсора, если недостаточно места для её отображения (Windows). 

*  8\_del-roster-horizontal-scrollbar.tcl — Удаляет горизонтальную прокрутку в ростере. 

*  9\_roster-avatars.tcl — Добавляет vCard-аватары в ростер, показывает сообщение статуса под ником, жирный шрифт для групп контактов. Аватары обновляются при проверке vCard, сохранение аватар происходит только для авторизованных пользователей, при удалении аватары из vCard в клиенте она не удаляется. 




*  10\_recursor-chat.tcl — Меняет поведение курсора мыши в окне чата. 
*  11\_sorted-jids-in-roster.tcl — Меняет порядок сортировки джидов, перемещая недоступные контакты в конец списка. 

*  12\_disable-autoaway-is-tray — Блокирует выход из автоэвея, если окно свернуто в трей. 


 _**Внимание!** Несмотря на то, что никаких изменений в коде Ткаббера не происходит, стоит учитывать, что файлы содержат в себе изменённые процедуры, которые могут вызывать некорректную работу в различных ревизиях Ткаббера._ 



Пара иллюстраций (возможно, через некоторое время помрут на картинкохостинге; в общем-то, не жалко :)). [Номер один](http://i38.tinypic.com/728vlu.png). [Номер два](http://i36.tinypic.com/t6t6h2.png) (непонятно, кому может понадобиться бэкграунд в виде картинки в ростере; полагаю, что даже если сделать элементы ростеров прозрачными, общий вид лучше не станет). 





*  **Файл:** [Patches.zip](../files/Patches.zip) 

Автор: [Jet](Участник_Jet.md) 

## <a id="Postpone_Text_добавлен_в_транк"></a>Postpone Text (добавлен в транк)

**Лирическое отступление** 

 _Внимание!_ С ревизии 953 (18 фев 2007) интегрировано в транк в виде _встроенного_ средства, выполненного [teo](Участник_Teo.md) на основе данного плагина.  



Оно несколько отличается от описанного здесь; отличия сформулированы в конце этого раздела. 


Пока автору плагина, обсуждаемого в этом разделе, неясно насколько лучше/хуже новая встроенная версия, поэтому пока что данный плагин "поживёт" здесь. 


**Описание плагина** 


[Этот плагин](../files/Postpone.tar.gz) (~5k) реализует достаточно глупую вещь — с каждым окном ввода сеансов чата связывается собственный скрытый текстовый буфер + добавляется биндинг, позволяющий: 


*  по первой активации биндинга _переместить_ текст из поля ввода в буфер; 
*  по второй его активации переместить текст обратно. 


Основная идея: лично у меня ([Kostix](Участник_Kostix.md)) часто возникает ситуация, когда я пишу длинный продуманный текст, и вдруг вижу, что надо _бы_ что-то быстро написать в чат, отослать это, а затем продолжить редактирование. Причём сделать это быстрее, чем "выделить весь текст и скопировать в клипборд", и сделать это не трогая клипборд. 




Данный плагин эту возможность реализует. 

Настраивается: 

*  Событие (биндинг) для операций с буфером; 
*  Фон поля ввода при полном буфере (отключабельно); 
*  Способ вставки текста из буфера. 

Настройки плагина находятся в подгруппе "Postpone Text" группы "Chat". 

Приложен README с подробным описанием. 

**Внимание!** В настоящий момент плагин будет работать только с SVN-версией Ткаббера, снятой оттуда после того, как в транке появился тип "options" для элементов Customize (то есть в версиях начиная от 29 сентября 2006 года). Патч, реализующий "старый" тип "list", возможно, воспоследует. 




**Внимание!** Если вы хотите использовать здешний плагин вместо нового встроенного вместе с комбинацией Ctrl-q, вам понадобится "отучить" встроенный плагин от этой комбинации. 



Для этого поместите в файл конфигурации Ткаббера вне любых хуков такой код: 

    hook::add postload_hook {
      event delete <<ChatPushText>> <Control-q>
      event delete <<ChatPopText>>  <Control-g>
    }

[Kostix](Участник_Kostix.md) 18:01, 28 октября 2006 (MSD) 

**Отличия нового плагина [teo](Участник_Teo.md)** 

*  Буфер теперь представляет собой _стек (LIFO),_ в который можно последовательно сохранить несколько кусков текста и потом последовательно извлечь их оттуда. 

*  Используется два жеста для управления текстом: 

 *  Ctrl-q — убрать текст из поля ввода и _добавить его_ в буфер, сделав там новую запись. Эта привязка связана с виртуальным событием `<<ChatPushText>>`. 

 *  Ctrl-g — удалить последний "кусок" текста из буфера и вставить его справа от курсора в поле ввода. Эта привязка связана с виртуальным событием `<<ChatPopText>>`. 
 
*  Отсутствует визуальная индикация факта нахождения сохранённого текста в буфере. 

*  Отсутствует настройка методов помещения текста из буфера в поле ввода — он всегда вставляется справа от курсора, определяющего текущее место вставки. 



## <a id="Reject_subscription"></a>Reject subscription

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



*  **Файл:** [Reject\_subscription.zip](../files/Reject_subscription.zip) 

Автор: [Teo](Участник_Teo.md) 

## <a id="Remote_Commands"></a>Remote Commands

Плагин, который стоит использовать с особой осторожностью. Он позволяет удалённо выполнять команды на компьютере. Необходимые команды со всеми аргументами необходимо предварительно занести в список в начале файла. Первая команда будет командой по умолчанию. 




*  **Файл**: [Media:Remote\_commands-0.1.tar.gz](../files/Remote_commands-0.1.tar.gz) 
*  **Версия**: 0.1, 01-04-2007 

[feez](Участник_Feez.md) 

## <a id="Remote_IP_Address"></a>Remote IP Address

Плагин, добавляющий команду удалённого управления для получения IP-адреса соединения Tkabber-а с сервером. 



*  **Файл**: для Tkabber из trunk: [remote\_ip\_address-tkabber-trunk.tar.gz](http://www.vsi.ru/~yegor/files/remote_ip_address-tkabber-trunk.tar.gz) 

*  **Файл**: для Tkabber 0.11.1: [remote\_ip\_address-tkabber-0.11.1.tar.gz](http://www.vsi.ru/~yegor/files/remote_ip_address-tkabber-0.11.1.tar.gz) 
*  **Версия**: 07-02-2010 

[yegor](Участник_Yegor.md) 

## <a id="Remote_Settings"></a>Remote Settings

Плагин, позволяющий удаленно изменять настройки Ткаббера. Кроме того, это PoC плагин, показывающий, как создавать в плагине команды для удаленного вызова и как создавать мультишаговые команды (визарды). Будет использоваться в доке [How\_to\_add\_a\_new\_remote\_command](../en/How_to_add_a_new_remote_command.md) как пример. 





*  **Файл**: [Media:Remote\_settings-0.1.tar.gz](../files/Remote_settings-0.1.tar.gz) (~4Kb) 
 
*  **Версия**: 0.1, 01-04-2007 

[feez](Участник_Feez.md) 

## <a id="Roster_Avatars"></a>Roster Avatars

Выглядит оно [так](../images/1112349.png). 


То же самое, что в патче «9\_roster-avatars.tcl» [этого](Плагины.md#Patches) плагина. Добавляет vCard-аватары в ростер, показывает сообщение статуса под ником, жирный шрифт для групп контактов. Аватары обновляются при проверке vCard, сохранение аватар происходит только для авторизованных пользователей, при удалении аватары из vCard в клиенте она не удаляется. Аватарки контактов можно добавлять и самому: положить в папке .tkabber/vcard\_avatars картинку размером 30\*30 пикселей в формате png с названием, соответствующему полному jid контакта. 







*  Небольшое изменение: изменён (уменьшен) размер аватар до 30\*30 пикс. 
*  Установка: распаковать архив в папку с плагинами, запустить Ткаббер. 

*  **Файл:** [Rosteravatars.zip](../files/Rosteravatars.zip) 

Автор: [Jet](Участник_Jet.md)  

Выпилил в отдельный плагин: [BrennendeR\_](Участник_Brennende.md) 

## <a id="Rsssaver"></a>Rsssaver

Поскольку Ткаббер не кэширует новости при некорректном выходе, то у людей, не закрывающих Ткаббер днями/неделями, возникали случаи, когда в кэше находились новости недельной (и более) давности. Данный плагин кэширует новости через %n пришедших сообщений, а также добавляет кнопку сохранения в окно новостей (для ручного сохранения). 





[eXire](Участник_EXire.md). 

*  **Файл** [Media:rsssaver-0.2.3.tar.gz](../files/Rsssaver-0.2.3.tar.gz) (1K) 

## <a id="Savebtn"></a>Savebtn

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов ** 

Расширение, позволяющее сохранять фото из vCard. После установки в окне просмотра информации о пользователе, на вкладке "Фотография", появится кнопка "Сохранить фото". 


*  **Файл:** [Savebtn.zip](../files/Savebtn.zip) 



Автор: [Jet](Участник_Jet.md) 

## <a id="Server_Info"></a>Server Info

Добавляет в меню по правой кнопке для контакта (в контактах или в списке участников конференции) пункты для получения информации о сервере этого контакта и для того, чтобы непосредственно открыть окно Service discovery на контакте или на его сервере. 




*  **Файл:** [server\_info.tar.gz](http://sgolovan.nes.ru/jabber/tmp/server_info.tar.gz) (1K) 
*  **Файл:** для версии 0.11.1 [server\_info.tar.gz](../files/Server_info.tar.gz) (1K) 

[Teo](Участник_Teo.md) 

## <a id="So_keepalive"></a>So\_keepalive

Плагин предназначен для включения опции SO\_KEEPALIVE на сокетах соединений, устанавливаемых Ткаббером. 


Требует наличия пакета [Tclx](http://tclx.sourceforge.net/). 

"Очень бета" в том смысле, что требует очень серьёзного тестирования, а так же [настройки _Вашей_ системы](http://libkeepalive.sourceforge.net/docs/TCP-Keepalive-HOWTO) для того, чтобы механизм TCP keepalive делал то, что Вы от него ожидаете. 




Читайте README. 

Файл: [so\_keepalive.zip](../files/So-keepalive.zip), ~3.5k 

Автор: [Kostix](Участник_Kostix.md) 

## <a id="Spam_filter"></a>Spam filter

Подтверждает сообщения, которые не сочтёт спамом. 

Для фильтрации требуется: 

1. Джид+ресурс в настройках конференции в качестве фильтра. 

2. Присутствие в конференции. 

*  **Файл:** [spamfilter.tar.gz](http://alefix.narod.ru/spamfilter.tar.gz), 511b 

[alfix](Участник_Alfix.md) 

## <a id="Tab_number"></a>Tab number


Переделка [патча](Патчи.md#Нумерация_закладок) [Lknight'а](Участник_Lknight.md) в плагин. Сделано не очень красиво, но ничего более умного не придумал. Если есть какие-то идеи, то прошу сообщить [eXire](Участник_EXire.md). 



*  **Файл:** [Media:tab\_number-0.1.2.tar.gz](../files/Tab_number-0.1.2.tar.gz) (1K) 

## <a id="Tkabho"></a>Tkabho

Первая попытка приделать бота к Ткабберу для возможности использования простыми пользователями без настройки чего-либо. Плагин написан на основе моего jabber-бота на тикле — [taho](http://taho.googlecode.com). 



    [архив zip](http://taho.googlecode.com/files/tkabho.zip)

    [архив tar.bz2](http://taho.googlecode.com/files/tkabho.tar.bz2)

Автор: [Kellin](Участник_Kellin.md). 

## <a id="Vcardavatars"></a>Vcardavatars

![(!)](../images/Ok_icon.png) **Включить в Менеджере плагинов ** 

Показывает аватары из вкард в окне чата. Изображения обновляются при просмотре информации о пользователе и хранятся локально. Пока нет работы с альфа-каналом. 


 _**Внимание!** Плагин будет работать только с SVN-версией Ткаббера._ 

*  **Файл:** [Vcardavatars.zip](../files/Vcardavatars.zip) 

Автор: [Jet](Участник_Jet.md) 

## <a id="Wintweaks_устарел"></a>Wintweaks (устарел)


 _Внимание!_ Начиная с [версии 0.11.0](http://tkabber.jabber.ru/node/464) Ткаббер содержит доработанную версию данного хака непосредственно в коде, поэтому плагин потерял всякий смысл. Если вы "апгрейдите" Ткаббер до 0.11.0, удалите этот плагин. 



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



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




**Ошибки/недоработки:** 

*  Сплиттеры надо сделать раза в два уже. 

Файл: [wintweaks.zip](../files/Wintweaks.zip) (~2 кб) 

Текущая версия: 0.1, 24-Apr-2007. 

Автор: [kostix](Участник_Kostix.md) 


Changes to wiki/ru/Плагины/AntiSPIM.md.

1
2

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Плагины/AntiSPIM/index.html)


# Плагины/AntiSPIM

Материал из Tkabber Wiki

Идея взята из отложенного протокола
[JEP-0159 Spim blocking](http://www.jabber.org/jeps/jep-0159.html)
но там предлагают реализовать на серверах а тут в Ткаббере. Первый вариант
конечно лучше, но протокол то отложен, когда активируют и активируют ли вообще
неизвестно.

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

1. если from есть в ростере, то пропускать.
1. если from есть в списке jid-ов на которые недавно уходили сообщения
   (последняя три дня к примеру), то пропускать.
1. возможен еще конфигурируемый фильтр по серверу. К примеру для всех серверов
   кроме icq.jabber.ru тоже пропускать.
1. для всех остальных соообщение/презенс сохранить, а в ответ выслать случайную
   текстовую капчу, которую можно взять из файлика и ждать ответ некоторое время.
   Если ответ пришел и он верен -- показать сохраненное сообщение, иначе через
   некоторое время сохраненное сообщение удалить а JID забыть.

Список JID-ов, на которые отсылались сообщения, список JID-ов которым были
высланы капчи,  ответы на эти капчи и сами сохраненные сообщения можно хранить
на сервере в jabber:x:private
([JEP-0049](http://www.jabber.org/jeps/jep-0049.html)) при этом периодически
(можно не по  таймеру, а во время очередного обновления данных) удалять записи
с истекшим сроком годности.

Еще надо предусмотреть:

* зацикливание, когда на $from висит бот, который будет в ответ на каждую
  капчу высылать своё сообщения, например, список доступных команд.
* сообщения от jid-ов из чата. Они не в ростере и им сообщения не высылались,
  но высылать им капчи нельзя. Надо как-то тоже обработать.



>




|
<
<
<
<

|
<

|
|
<
|
<
|
<
<
<

|
<
<
<
<
<

|

|
<
|
|
>
1
2
3
4
5
6
7
8




9
10

11
12
13

14

15



16
17





18
19
20
21

22
23
24
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Плагины/AntiSPIM/index.html)


# Плагины/AntiSPIM

Материал из Tkabber Wiki

Идея взята из отложенного протокола [JEP-0159 Spim blocking](http://www.jabber.org/jeps/jep-0159.html) но там предлагают реализовать на серверах а тут в Ткаббере. Первый вариант конечно лучше, но протокол то отложен, когда активируют и активируют ли вообще неизвестно. 





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


1.  если from есть в ростере, то пропускать. 
1.  если from есть в списке jid-ов на которые недавно уходили сообщения (последняя три дня к примеру), то пропускать. 

1.  возможен еще конфигурируемый фильтр по серверу. К примеру для всех серверов кроме icq.jabber.ru тоже пропускать. 

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




Список JID-ов, на которые отсылались сообщения, список JID-ов которым были высланы капчи,  ответы на эти капчи и сами сохраненные сообщения можно хранить на сервере в jabber:x:private ([JEP-0049](http://www.jabber.org/jeps/jep-0049.html)) при этом периодически (можно не по  таймеру, а во время очередного обновления данных) удалять записи с истекшим сроком годности. 






Еще надо предусмотреть:  

*  зацикливание, когда на $from висит бот, который будет в ответ на каждую капчу высылать своё сообщения, например, список доступных команд. 

*  сообщения от jid-ов из чата. Они не в ростере и им сообщения не высылались, но высылать им капчи нельзя. Надо как-то тоже обработать. 


Changes to wiki/ru/Плагины/Juick.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

46


47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Плагины/Juick/index.html)


# Плагины/Juick

Материал из Tkabber Wiki

Плагин для жуйкования. То бишь, ведения (микро)блога на
[juick.com](http://juick.com).

На данный момент нам известны оригинальная версия авторства
[roche](http://juick.com/roche/) и её форк от
[*Totktonada*](../Участник_Totktonada.md). Поскольку оригинальная версия не
развивается уже достаточно давно, рекомендуется использовать форк (он же —
версия из SVN tkabber-3rd-party, ссылки см. ниже).

Возможности списком:

* Подсветка различными цветами сущностей (номеров, ников, тегов).
* Выделение цветом цитат (строк, начинающихся с символа '>').
* Вставка сущностей в текущую позицию ввода по клику правой клавишей.
* ![(!)](../../images/Ok_icon.png) **Включить в Менеджере плагинов **
* Меню по правой кнопке мыши:
   * Копирование сущностей в буфер обмена.
   * Открытие треда/блога/тега в браузере.
   * Подписка на тред.
* Подсветка приватных сообщений (PM) в окне чата. По умолчанию подобраны
  бросающиеся в глаза цвета: синие буквы на оранжевом фоне.
* Поддержка изменения цветов через xrdb.
* Персональными сообщениями считаются только приватные (PM) (было также для
  ответов на комментарии пользователя, но теперь сломано). Индикация остальных
  сообщений с Juick'а — как у сообщений из конференции. Это поведение
  отключаемо.
* Добавлена команда для подписки и просмотра треда: «S \#123456+».
* Выводится время появления поста на Juick'е (независимо от времени его прихода
  клиенту пользователя) из juick-xmpp-api.
* Номерки выделяются во всех чатах. При нажатии на номер фокус перемешается на
  окно Juick'а (JID можно указать в настройках), и номер помещается в поле
  ввода.
* Удаляется элемент jabber:x:oob из сообщений с Juick'а. Скажи «нет»
  всплывающим окнам!
* Дополнение жуйковых команд и сущностей из открытого чата по клавише `<Tab>`.
* Отображение markdown-ссылок в окне Juick.

Плагин доступен через Subversion (tkabber-3rd-party) в двух инкарнациях:


* <http://svn.xmpp.ru/repos/tkabber-3rd-party/branches/plugins-0.11.1/juick/>


* <http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/juick/>

На данный момент (14.04.2012) обе ветки абсолютно идентичны и работают как с
Ткаббером 0.11.1, так и с SVN-версией Ткаббера. Достигается это с помощью слоя
совместимости, который подключается, если плагин запущен под релизным (0.11.1)
Ткаббером. Впрочем, некоторые отличия в работе плагина могут наблюдаться; к
примеру, динамическая загрузка/выгрузка будет работать только с новым
Ткаббером.

Как оригинальная версия, так и форк доступны через Git:

* Оригинал: <https://github.com/feuerbach/tkabber4juick>
* Форк: <https://github.com/Totktonada/tkabber4juick>

На Juick’е про плагин обычно пишут с тегом
[\*tkabber4juick](http://juick.com/tag/tkabber4juick).

Авторы: [roche](http://juick.com/roche),
[*Totktonada*](../Участник_Totktonada.md).


>





|
<

|
<
<
<
<

|

|
|
|
|
|
|
|
|
|
|
|
|
<
<
<
|
|
<
|
<
<
|
<
|
|

|

>
|
>
>
|

|
<
<
<
<
<

|

|
|

|
<

|
|
>
1
2
3
4
5
6
7
8

9
10




11
12
13
14
15
16
17
18
19
20
21
22
23
24
25



26
27

28


29

30
31
32
33
34
35
36
37
38
39
40
41





42
43
44
45
46
47
48

49
50
51
52
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Плагины/Juick/index.html)


# Плагины/Juick

Материал из Tkabber Wiki

Плагин для жуйкования. То бишь, ведения (микро)блога на [juick.com](http://juick.com). 


На данный момент нам известны оригинальная версия авторства [roche](http://juick.com/roche/) и её форк от [Totktonada](../Участник_Totktonada.md). Поскольку оригинальная версия не развивается уже достаточно давно, рекомендуется использовать форк (он же — версия из SVN tkabber-3rd-party, ссылки см. ниже). 





Возможности списком: 

*  Подсветка различными цветами сущностей (номеров, ников, тегов). 
*  Выделение цветом цитат (строк, начинающихся с символа '>'). 
*  Вставка сущностей в текущую позицию ввода по клику правой клавишей. 
*  ![(!)](../../images/Ok_icon.png) **Включить в Менеджере плагинов ** 
*  Меню по правой кнопке мыши: 
 *  Копирование сущностей в буфер обмена. 
 *  Открытие треда/блога/тега в браузере. 
 *  Подписка на тред. 
 
*  Подсветка приватных сообщений (PM) в окне чата. По умолчанию подобраны бросающиеся в глаза цвета: синие буквы на оранжевом фоне. 
*  Поддержка изменения цветов через xrdb. 
*  Персональными сообщениями считаются только приватные (PM) (было также для ответов на комментарии пользователя, но теперь сломано). Индикация остальных сообщений с Juick'а — как у сообщений из конференции. Это поведение отключаемо. 



*  Добавлена команда для подписки и просмотра треда: «S \#123456+». 
*  Выводится время появления поста на Juick'е (независимо от времени его прихода клиенту пользователя) из juick-xmpp-api. 

*  Номерки выделяются во всех чатах. При нажатии на номер фокус перемешается на окно Juick'а (JID можно указать в настройках), и номер помещается в поле ввода. 


*  Удаляется элемент jabber:x:oob из сообщений с Juick'а. Скажи «нет» всплывающим окнам! 

*  Дополнение жуйковых команд и сущностей из открытого чата по клавише Tab. 
*  Отображение markdown-ссылок в окне Juick. 

Плагин доступен через Subversion (tkabber-3rd-party) в двух инкарнациях: 

*  
    http://svn.xmpp.ru/repos/tkabber-3rd-party/branches/plugins-0.11.1/juick/
 
*  
    http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/juick/

На данный момент (14.04.2012) обе ветки абсолютно идентичны и работают как с Ткаббером 0.11.1, так и с SVN-версией Ткаббера. Достигается это с помощью слоя совместимости, который подключается, если плагин запущен под релизным (0.11.1) Ткаббером. Впрочем, некоторые отличия в работе плагина могут наблюдаться; к примеру, динамическая загрузка/выгрузка будет работать только с новым Ткаббером. 






Как оригинальная версия, так и форк доступны через Git: 

*  Оригинал: [https://github.com/feuerbach/tkabber4juick](https://github.com/feuerbach/tkabber4juick) 
*  Форк: [https://github.com/Totktonada/tkabber4juick](https://github.com/Totktonada/tkabber4juick) 

На Juick’е про плагин обычно пишут с тегом [\*tkabber4juick](http://juick.com/tag/tkabber4juick). 


Авторы: [roche](http://juick.com/roche), [Totktonada](../Участник_Totktonada.md). 


Changes to wiki/ru/Планы_на_будущее.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96




97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142



143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234

235

236
237

238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265


266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389


390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581

582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659

[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Планы_на_будущее/index.html)


# Планы на будущее

Материал из Tkabber Wiki

Сюда давайте писать то, что собираемся на этой вики (а также просто касательно
Ткаббера) сделать: про что написать статью, что протестировать и т.д.

То, что уже сделано, можно не стирать, а <s>зачёркивать</s>, чтобы было видно
ход работ.

Просьба не путать разделы "Разработка" и "Вики". В раздел "Вики" вносите ваши
пожелания, касающиеся организации именно вики, а не проблем с Ткаббером.


## <a id="toc"></a>Содержание

* [1 Разработка](#Разработка)
   * [1.1 Удаленное управление](#Удаленное_управление)
   * [1.2 <s>Контакты онлайн - отображать вверху списка</s>](#sКонтакты_онлайн_-_отображать_вверху_списка_s)
   * [1.3 MUC. Пресеты для причин kick/ban](#MUC._Пресеты_для_причин_kick_ban)
   * [1.4 Ъ положение Ткаббера на раб. столе](#Ъ_положение_Ткаббера_на_раб._столе)
   * [1.5 Шрефты @;%&!](#Шрефты_)
   * [1.6 Меню в истории разговоров](#Меню_в_истории_разговоров)
   * [1.7 Статусбар в полнотекстовом поиске](#Статусбар_в_полнотекстовом_поиске)
   * [1.8 Нормальная закладка при потере фокуса](#Нормальная_закладка_при_потере_фокуса)
   * [1.9 ГУЙ для метаконтактов](#ГУЙ_для_метаконтактов)
   * [1.10 Сделать сохранение положения ростера (свернут-развернут) (Fixer)](#Сделать_сохранение_положения_ростера_свернут-развернут_Fixer)
   * [1.11 Добавить возможность сохранять пароль в md5 виде для автологина  (Fixer)](#Добавить_возможность_сохранять_пароль_в_md5_виде_для_автологина__Fixer)
   * [1.12 Встроить плагин autoconnect (борьба с "№;%:\*" транспортами) (сомнительно)](#Встроить_плагин_autoconnect_борьба_с_№_транспортами_сомнительно)
   * [1.13 Нумерация закладок](#Нумерация_закладок)
   * [1.14 Поиск в диско и т.д.](#Поиск_в_диско_и_т.д.)
   * [1.15 Звуки к играм](#Звуки_к_играм)
   * [1.16 Доработать кое-какие игры](#Доработать_кое-какие_игры)
   * [1.17 <s>Кэш новостей</s>](#sКэш_новостей_s)
   * [1.18 <s>Игнор в выпадающем меню на JID</s>](#sИгнор_в_выпадающем_меню_на_JID_s)
   * [1.19 Подтверждения](#Подтверждения)
      * [1.19.1 <s>Сделать хотя бы в виде патча</s>](#sСделать_хотя_бы_в_виде_патча_s)
      * [1.19.2 <s>Довести их до уровня плагина</s>](#sДовести_их_до_уровня_плагина_s)
   * [1.20 Чебуратор](#Чебуратор)
   * [1.21 Закладки](#Закладки)
      * [1.21.1 Автоматическая установка](#Автоматическая_установка)
      * [1.21.2 Выборочное удаление](#Выборочное_удаление)
   * [1.22 Управление ткаббером через командную строку](#Управление_ткаббером_через_командную_строку)
   * [1.23 Доделать мультилогин](#Доделать_мультилогин)
   * [1.24 Анти SPIM](#Анти_SPIM)
   * [1.25 Плагин "Whiteboard" aka "Грифельная доска"](#Плагин_Whiteboard_aka_Грифельная_доска)
   * [1.26 Отправка сообщения нескольким контактам](#Отправка_сообщения_нескольким_контактам)
   * [1.27 <s>Озвучить бы Spy</s>](#sОзвучить_бы_Spy_s)
   * [1.28 <s>!Пофиксить! цвет в Spy</s>](#sПофиксить_цвет_в_Spy_s)
   * [1.29 <s>!Пофиксить! цвет по адресу "История разговоров - логи" под темой дарк (Fixer)</s>](#sПофиксить_цвет_по_адресу_История_разговоров_-_логи_под_темой_дарк_Fixer_s)
   * [1.30 Довести до ума XHTML](#Довести_до_ума_XHTML)
   * [1.31 Мои ожидания от Attline (Attention Line) plugin'а](#Мои_ожидания_от_Attline_Attention_Line_pluginа)
   * [1.32 Плагин для взятия ресурса из файла](#Плагин_для_взятия_ресурса_из_файла)
   * [1.33 Кнопки быстрого доступа к нужным функциям некоторых плагинов](#Кнопки_быстрого_доступа_к_нужным_функциям_некоторых_плагинов)
   * [1.34 Показ во всплывающем окне (тултипе) посетителя конфы всех его ников в данной конфе](#Показ_во_всплывающем_окне_тултипе_посетителя_конфы_всех_его_ников_в_данной_конфе)
* [2 Known Issues](#Known_Issues)
* [3 По Вики](#По_Вики)
   * [3.1 Структура вики](#Структура_вики)
   * [3.2 Перевод на английский](#Перевод_на_английский)
   * [3.3 Перевод на испанский](#Перевод_на_испанский)
   * [3.4 Статья "Файл конфигурации"](#Статья_Файл_конфигурации)
   * [3.5 <s>Каталанский язык</s>](#sКаталанский_язык_s)
   * [3.6 Написать статьи](#Написать_статьи)
   * [3.7 Галереи](#Галереи)
      * [3.7.1 <s>Глюки</s>](#sГлюки_s)
      * [3.7.2 Перезалить их](#Перезалить_их)
   * [3.8 Обновить скриншоты к статьям](#Обновить_скриншоты_к_статьям)
   * [3.9 Разобраться с многоязычным интерфейсом](#Разобраться_с_многоязычным_интерфейсом)
   * [3.10 Ссылки xmpp:](#Ссылки_xmpp)
   * [3.11 Интервики на  JaWiki](#Интервики_на__JaWiki)
   * [3.12 Проблемы, найденные в вики при осмотре Ткаббера 0.10.0-svn-20070521(tcl/tk 8.4.11)](#Проблемы_найденные_в_вики_при_осмотре_Ткаббера_0.10.0-svn-20070521tcl_tk_8.4.11)

## <a id="Разработка"></a>Разработка
Этот раздел представляет собой что-то вроде feature request. Если у вас есть
какие-то идеи относительно улучшения Ткаббера, можете оставлять тут свои
пожелания. Просьба быть лаконичными и писать ясно, чтобы любой мог себе уяснить
вашу идею. Если у вас чешутся руки чего-то попрограммировать, но нет идей — вот
они перед вами :)

> _Имейте, однако, в виду, что эта статья — не более, чем сборник пожеланий:
  сюда кто угодно может писать свои "хотелки", и это совершенно не означает,
  что их кто-либо когда-либо возьмётся реализовывать. Если вам интересны
  **намерения разработчиков** (то есть тех, кто активно пишет код для
  Ткаббера), читайте ["TODO разработчиков"](../en/TODO.md). Писать туда не
  надо. И опять же имейте в виду, что появление чего-либо в том TODO не
  означает, что это что-либо **точно** будет реализовано; это всё — типичные
  [WIBNIs](http://foldoc.org/foldoc.cgi?WIBNI)._

### <a id="Удаленное_управление"></a>Удаленное управление

<s>[http://www.jabber.org/jeps/jep-0146.html](http://www.jabber.org/jeps/jep-0146.html).
С маленькими переделками ткаббера задача постепенно
[решается](http://forum.jrudevels.org/viewtopic.php?t=1014). (c) feez </s>

[**Kostix**](Участник_Kostix.md) 21:11, 18 сентября 2006 (MSD) первый вариант уже в




транке! :)

### <a id="sКонтакты_онлайн_-_отображать_вверху_списка_s"></a><s>Контакты онлайн - отображать вверху списка</s>

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

[**kostix**](Участник_Kostix.md) 22:17, 23 апреля 2008 (MSD) -- два возражения:

* Как это средство должно взаимодействовать с группами ростера? Отдельная
  сортировка для каждой группы? Но в чём смысл тогда? -- при большом ростере с
  открытыми группами всё равно не избежать прокрутки.
* В Ткаббере есть возможность переключать ростер в режим показа только тех, кто
  в онлайне. Это делается с тулбара или главного меню, а также может легко
  навешиваться на комбинацию клавиш, о чём рассказано в статье
  [**Нетривиальные настройки**](Нетривиальные_настройки.md).
* Наконец, в Ткаббере уже есть фильтрация ростера по буквам ника контакта.

---

**Gooseman:** Контраргументы: согласен, функциональность добавляется очень
небольшая, но все таки добавляется. Необходимость в прокрутке как раз -



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

---

[**ycbl**](Участник_Bigote.md) 14:16, 20 июня 2009 (MSD)

По-моему, товарищ [*Jet*](Участник_Jet.md)
[**заработал себе**](Патчи.md#Отображение_доступных_контактов_сверху_списка)
пресловутый ясчик пива ;)

### <a id="MUC._Пресеты_для_причин_kick_ban"></a>MUC. Пресеты для причин kick/ban

<s>Добавить выбор причины кика или бана из списка, определяемым пользователем.
Возможны варианты как через меню, т.е. дополнительное подменю, либо после клика
на команду - окно.</s>

См. этот
[**кусок в конфиг**](Нетривиальные_настройки.md#Собственное_меню_для_киков_в_групчате).

Впрочем, возможно, реализация этой штуки в виде плагина с визуальным редактором
пресетов (на манер [**customstatus**](Плагины.md#Customstatus)) имеет смысл.




### <a id="Ъ_положение_Ткаббера_на_раб._столе"></a>Ъ положение Ткаббера на раб. столе

Сделать так шоб ткаббер сам рассчитывал размеры и положение окна в зависимости
от разрешения, точно по центру экрана и определенное соотношение сторон, +
<s>возможность сохранить положение для будущих сеансов!</s> Вторая часть
пожелания реализована в svn-версии (приблизительно февраль 2009).

### <a id="Шрефты_"></a>Шрефты @;%&!

<s>Добавить наконец полноценную настройку шрифтов, допилить диалоги
поиска...</s>

### <a id="Меню_в_истории_разговоров"></a>Меню в истории разговоров

Добавить по всем закоулкам истории разговоров меню с пунктами типа "копировать,
гугл, блабла" (Fixer)

### <a id="Статусбар_в_полнотекстовом_поиске"></a>Статусбар в полнотекстовом поиске

Добавить в полнотекстовом поиске правее кнопок "Поиск" и "Отменить" показ
статуса - идет поиск/найдено Н слов/приостановлено. (Fixer)

### <a id="Нормальная_закладка_при_потере_фокуса"></a>Нормальная закладка при потере фокуса

<s>Сделать закладку в виде линии при потере фокуса</s> (Fixer)

Начиная с версии 0.11.0 имеется встроенный плагин attline.

### <a id="ГУЙ_для_метаконтактов"></a>ГУЙ для метаконтактов

<s>Сделать нормальный гуй для создания метаконтактов, т.е. объединения
нескольких контактов в один.</s> (Fixer)

Реализовано в svn-версии (февраль или март 2009).

### <a id="Сделать_сохранение_положения_ростера_свернут-развернут_Fixer"></a>Сделать сохранение положения ростера (свернут-развернут) (Fixer)

### <a id="Добавить_возможность_сохранять_пароль_в_md5_виде_для_автологина__Fixer"></a>Добавить возможность сохранять пароль в md5 виде для автологина  (Fixer)

MD5 хакнут уж несколько лет как. Где-то тут даже на вики мы про это написали.

[**ycbl**](Участник_Bigote.md) 01:30, 8 мая 2007 (MSD)

BTW, для целей "чтоб не читали пароль, когда флэшку с Ткаббером кому-то
отдаёшь" MD5 "хватило бы за глаза и за уши". Эту фичу нельзя реализовать по
теоретическим соображениям, т.к. Ткабберу нужен чистый и ничем не замутнённый
пароль для аутентификации на сервере, а любой крипто-хэш по определению (в
теории) нереверсивен.

[**kostix**](Участник_Kostix.md) 18:59, 8 мая 2007 (MSD)

Хм, по словам kostix данную фичу реализовать не удастся, имхо, попробовать
написать скрипт и статью по gnupg и config.tcl?

[*Fixer*](Участник_Fixer.md) 17:54, 8 мая 2007 (MSD)

Рабочую флэшку с Ткаббером (то есть которой вы сами пользуетесь) я бы вообще
порекомендовал никому не давать, особенно если вы не шарите в тикле. Да если и
шарите, будете каждый раз проверять, наизменял ли ваш заклятый друг в шутку или
всерьёз какой-нибудь тихий закоулок кода? А уж сохранить себе "на память"
зашифрованный конфиг такого доброго дяди и вообще сам бог велел.

[**ycbl**](Участник_Bigote.md) надевает чёрные очки и удаляется, незаметно
оглядываясь по сторонам.

Как ни странно, после случая с модом "Pandora" для Bombus'а такая паранойя не
выглядит чересчур излишней.

[**kostix**](Участник_Kostix.md) 14:42, 9 мая 2007 (MSD)

Tkabber на флешке? А starpack для чего придумали? :)

[*Fixer*](Участник_Fixer.md) 23:45, 9 мая 2007 (MSD)

### <a id="Встроить_плагин_autoconnect_борьба_с_№_транспортами_сомнительно"></a>Встроить плагин autoconnect (борьба с "№;%:\*" транспортами) (сомнительно)

Довести до ума транспорт и добавить в официальную сборку? Слишком часто
отпадает аськотранспорт %) .\_.

[*Fixer*](Участник_Fixer.md) 18:02, 8 мая 2007 (MSD)

### <a id="Нумерация_закладок"></a>Нумерация закладок

<s>Довести до состояния Plugin нумерацию закладок. (c) lknight</s>
 **Добавил в [Плагины](Плагины.md#Tab_number). [eXire](Участник_EXire.md)**

### <a id="Поиск_в_диско_и_т.д."></a>Поиск в диско и т.д.

<s>Поиск регэкспы или просто строкой в browse/discovery окне. (искать
конференции) и RSS неплохо бы, а в идеале - заточить под любой элемент
Дискавери (с) bigote (похоже, что RSS в Дискавери уже так и работает, жаль

только, что полный список они убрали - он там совсем не лишний).</s>


[**Kostix**](Участник_Kostix.md) 03:17, 7 сентября 2006 (MSD) Поиск диско есть

в SVN начиная с 2006-08-17, поиск в RawXML — с 2006-08-18. Не хватает поиска в
Headlines и Message Archive.

### <a id="Звуки_к_играм"></a>Звуки к играм

<s>Как-нибудь надо прикрутить звуковое оповещение к играм (желательно, чтобы
можно было выбрать свой звук, т.е. чтобы он отличался от стандартных).</s> Ещё
можно попробовать сделать шахматные часы, которые вполне могут служить и для
других игровых плагинов. (c) bigote

Первая часть реализована, причём уже давно (не то в 0.10.0, не то в 0.11.0).

### <a id="Доработать_кое-какие_игры"></a>Доработать кое-какие игры

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

* Можно ли сделать оповещение о закрытии таба в принципе? Это всё равно, что
  позвонить в милицию после того, как тебя застрелили :) Но вдруг???
* Хорошо бы приделать сохранение состояния игры на диск, чтобы по крайней мере
  иметь возможность восстанавливать её после перезапуска клиента (а в идеале —
  и после падения). (c) bigote

### <a id="sКэш_новостей_s"></a><s>Кэш новостей</s>



<s>Кстати, очень бы не помешало переделать сохранение кэша новостей в реальном
времени, а не при закрытии Ткаббера — любое вынужденное его прибивание убивает
и текущее состояние окна новостей — в кэше хранятся старые новости (возможно,
недельной давности). (c) bigote</s>

**Добавил в [Плагины.](Плагины.md#Rsssaver) [eXire.](Участник_EXire.md)**

### <a id="sИгнор_в_выпадающем_меню_на_JID_s"></a><s>Игнор в выпадающем меню на JID</s>

<s>Сделать (если вдруг это не сделает **Teo**) в выпадающем на Jid'е по правой
кнопке мышке меню возможность добавить/убрать из игнор списка. (с) lknight</s>

**Оказывается, давно уже это дело реализовано :)**

### <a id="Подтверждения"></a>Подтверждения

#### <a id="sСделать_хотя_бы_в_виде_патча_s"></a><s>Сделать хотя бы в виде патча</s>

<s>Добавить подтверждения закрытия табов. О закрытии единичного таба - не
обязательно, но до кучи можно. А вот про "Закрыть остальные вкладки" и "Закрыть
все вкладки" - надо бы. Я уже разок закрыл "остальные вкладки"... :) (c)
bigote</s>

**Добавил в [Патчи](Патчи.md). [eXire](Участник_EXire.md)**

#### <a id="sДовести_их_до_уровня_плагина_s"></a><s>Довести их до уровня плагина</s>

<s>Сделать плагином, плюс добавить подтверждение на закрытие Ткаббера, плюс
добавить опции в Настройки.</s>

 **Добавил в [Плагины.](Плагины.md#Confirm) [eXire](Участник_EXire.md).**

### <a id="Чебуратор"></a>Чебуратор

Сделать конфигуратор к Ткабберу. Описание выложено
[**отдельной статьёй**](Чебуратор.md).
Обсуждать конфигуратор давайте там же, в отдельной
статье (подробности на месте).

### <a id="Закладки"></a>Закладки

#### <a id="Автоматическая_установка"></a>Автоматическая установка

<s>Был тут разговор про них... Идея такая: при переходе в автоэвей в каждой
открытой конференции автоматом устанавливается закладка в последней строке.</s>

<s>Новые идеи: сделать, чтобы закладки самостоятельно втыкались при ручной
смене статуса и потере фокуса окном Ткаббера. Причём, при потере фокуса должна
вставляться закладка другого цвета (добавить другой пиксмап, например, ту же
закладку, только зелёного цвета). Добавить раздельные настройки для включения
каждого вида закладок, потому что потеря фокуса - частое явление, и не всем
может понравиться наблюдать у себя кучи зелёных закладок.</s>

**Добавил в [Плагины](Плагины.md#Bookmarks). [eXire](Участник_EXire.md).**

#### <a id="Выборочное_удаление"></a>Выборочное удаление

На данный момент удалять можно только все закладки в окне чата. Хорошо бы иметь
возможность удалять ту, которую хочется (через контекстное меню, как и
расставляем).

### <a id="Управление_ткаббером_через_командную_строку"></a>Управление ткаббером через командную строку

Цель: чтобы при нажатии на ссылку вида `xmpp:user@jabber.ru` открывался Ткаббер
с нужными параметрами и выполнял нужное действие. xmppmime.tcl содержит похожую
функциональность но только для уже устаревших
[xmpp-mime файлов](http://www.jabber.org/jeps/jep-0081.html).

Сюда же чтобы можно было изменять PEP-стостояния через вызов Ткаббера с определенными параметрами.

[**Более подробное изложение мыслей**](ТЗ_по_управлению_через_параметры_командной_строки.md)

### <a id="Доделать_мультилогин"></a>Доделать мультилогин

Не хватает:

* автоматическое подключение нескольких профилей и настройка соответствующая.
* выбор содинения в окне disco/browser (или перед открытием) с которого должны
  отправлятся запросы
* выбор аккаунта для редактирования личной информации

[**Kostix**](Участник_Kostix.md) 17:09, 27 октября 2006 (MSD) советует смотреть
[**сюда**](Tkabber.md#Лёгкий_в_использовании_мультилогин). То, чего не хватает, и
так известно прекрасно. Выработка разумного решения проблемы — вопрос более
сложный и более интересный.

### <a id="Анти_SPIM"></a>Анти SPIM

Реализация антиспама с капчами, а то спама из асечного транспорта все больше и
больше. Идея взята  из отложенного протокола
[JEP-0159 Spim blocking](http://www.jabber.org/jeps/jep-0159.html)

[**Подробнее ...**](Плагины/AntiSPIM.md)

### <a id="Плагин_Whiteboard_aka_Грифельная_доска"></a>Плагин "Whiteboard" aka "Грифельная доска"

Я тут поковырял плагин "whiteboard", ничего особенного - добавил окружность,
многоугольник, цвет заливки... Хотелось бы узнать, я фигнёй страдаю и этим и
так кто-то занимается?

Вообщем есть там планы развития какие?

Просто код для многоугольника в svgrender.tcl уже был. Да и с tcl/tk я всего
два дня знаком, ковыряюсь "just for fun".

[*Zakon*](Участник_Zakon.md) 02:06, 27 октября 2006 (MSD)

---

Нет, не фигнёй. Там бы ещё очень не помешал экспорт нарисованного во что-то
удобоваримое, например .svg (сейчас есть экспорт в .ps, но это не комильфо, в
векторном редакторе это не отредактируешь), а также .gif или .png (только
рабочей области). И очень не помешал бы импорт из svg нарисованных ранее
рисунков. Правда, специалисты говорят, что это затруднительно, но у кого-то
проскакивала и мысль насчёт сохранения рисунка в своём формате (где будет
храниться не сам рисунок, а станцы, с помощью которых всё отрисовывалось),
тогда при открытии такого файла Ткаббер просто выполнит сценарий и отошлёт
результат всем собеседникам, с кем эта доска открыта. Думаю, **такая** доска
была бы архиудобной для чего хочешь: хоть дорогу на <s>пьянку</s> линуксовку
рисуй, хоть совещание с клиентом или с сотрудниками устраивай, хоть проекты
разрабатывай в UML.

[**ycbl**](Участник_Bigote.md) 14:57, 22 августа 2009 (MSD)



### <a id="Отправка_сообщения_нескольким_контактам"></a>Отправка сообщения нескольким контактам

Добавить в окно чата возможность отослать сообщение нескольким контактам с
возможностью выбора из ростера.

### <a id="sОзвучить_бы_Spy_s"></a><s>Озвучить бы Spy</s>

Давно мечтаю о такой фигне: чтобы Spy не просто шпиёнил за кем-нибудь из
ростера, но и извещал звуком (желательно, чтобы можно было задать
индивидуальный звук для каждого, за кем шпиёним) о появлении этого товарища в
онлайне. И чтоб можно было настраивать степень надоедливости: пищать всегда;
пищать, когда я сам онлайн; пищать, когда я в эвее (не в XA); пищать, когда
окно Ткаббера в фокусе или вне фокуса. И чтоб эта настройка была независимой от
просто звуков Ткаббера. То есть, допустим, у меня просто звуки отключаются,
когда окно Ткаббера в ростере и когда я в эвее. А вот извещения о присутствии
кого-нибудь мне бы хотелось получать всегда. А можно присобачить к нему его
собственный тайм-аут, независимый от тайм-аута автоэвея. Отходишь, например, от
компа дела поделать, а неплохо бы знать, что некий нужный чел появился. Если
привязывать озвучку к тайм-ауту автоэвея, то она вскоре перестанет работать, а
если включить её на постоянку, она будет зря надоедать окружающим, когда я
ухожу на работу. А так настроил ему часа полтора-два — и хватит.

[**ycbl**](Участник_Bigote.md) 04:32, 27 января 2007 (MSK)

P.S. Что-то сумбурно написал, но если чего непонятно, ловите в конфе или
спрашивайте напрямую.

* Вот [**тут**](Патчи.md#Звук_на_установленные_к_наблюдению_в_Шпионе_jidы) немного
  сделано. Звук срабатывающий вместе с всплывающим окошком. (BrennendeR~)

### <a id="sПофиксить_цвет_в_Spy_s"></a><s>!Пофиксить! цвет в Spy</s>

Под темой dark синие надписи практически нечитабельны .\_. (Fixer)

* В \*.xrdb добавить что-то вроде

        *Spy.timestampforeground:       white
        *Spy.nickforeground:            yellow
        *Spy.jidforeground:             white
        *Spy.presenceforeground:        red
        *Spy.reasonforeground:          #9953d9

(BrennendeR~)

### <a id="sПофиксить_цвет_по_адресу_История_разговоров_-_логи_под_темой_дарк_Fixer_s"></a><s>!Пофиксить! цвет по адресу "История разговоров - логи" под темой дарк (Fixer)</s>

Бо ужоснах.

* Аналогично предыдущему: крутится за .\*xrdb примерно так

        *JDisco.fill:			white
        *JDisco.activefill:		#020d61
        *JDisco.border:	       		#fcff00
        *JDisco.featurecolor:		#37cf45
        *JDisco.identitycolor:		#ffff00
        *JDisco.optioncolor:		mediumorchid3
        *JDisco.cbackground:            #ff0000
        *JDisco.foreground:             #ffff00
        *Tree*background:		#111111
        *fill:                   	#ffffff
        *linesfill:			#ff0000
        *crossfill:			#ffff00

(BrennendeR~)

### <a id="Довести_до_ума_XHTML"></a>Довести до ума XHTML

Можете не принимать, но вот мой "официальный" feature request по доведению до
ума поддержки XHTML.

1) Убрать жёстко прошитую helvetica из кода, пускай всё рисуется дефолтным фонтом.

2) Убрать изменение размера шрифта (вроде, 12 там жёстко прошито), пускай всё
рисуется дефолтным размером, тем более что огромные "ПРИВЕТ, ДРУЖИЩЕ" по утрам
никому и не нужны.

3) Убрать жуткие вертикальные пробелы до и после сообщения, зачем они задуманы?

4) "Полечить" установку weight и underline, не рисует их вообще.

Таким образом неплохо бы оставить bold/normal, italic/roman и foreground color.

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

### <a id="Мои_ожидания_от_Attline_Attention_Line_pluginа"></a>Мои ожидания от Attline (Attention Line) plugin'а

Версия от JID:timur@a-cube.vsi.ru aka
[mailto:timur.davletshin@gmail.com](mailto:timur.davletshin@gmail.com) по
просьбе kostix.

В Ткаббере из trunk'а появился новый весьма полезный plugin. Но его поведение
немного отличается от того, что мне хотелось бы видеть как простому
пользователю.

Т.к. имеется всего одна настройка, меняющая поведение модуля, то разделим всё
на два случая.

1) Когда plugins::atline::options(remove\_expired) 0

Окна чата, когда они открываюся мною:

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

Окна чата, когда приходит сообщение:

Я ожидаю, что я увижу вкладку с сообщениями, где непрочитанные сообщения будут
отчерны до тех пор, пока я их не прочитаю, после этого линия-разделитель
сползёт вниз.

Окна групчата:

Я ожидаю, что во вновь открытом окне линия будет находиться внизу. Вновь
появившиеся сообщения будут отчёркиваться, после прочтения линия-разделитель
сползёт вниз.

 2) Когда plugins::atline::options(remove\_expired) 1

Окна чата, когда они открываюся мною:

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

Окна чата, когда приходит сообщение:

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

Окна групчата:

Я ожидаю, что во вновь открытом окне не будет никаких линий, а отчёркиваться
будут лишь непрочитанные сообщения, притом, после прочтения линия-разделитель
исчезнет.

### <a id="Плагин_для_взятия_ресурса_из_файла"></a>Плагин для взятия ресурса из файла

    [19:17]<j2a> можещь в ткаббере плаг сделать, чтобы он брал ресурс из файла?
    [19:17]<j2a> т.е. я ему говорю: ресурс возьми из файла /etc/roaming/place
    [19:17]<j2a> и он считает оттуда, home, work, например
    [19:18]<j2a> а то на буке автоматом меняются сетевые профили, хочу чтобы ткаббер тож ловил их

[**kostix**](Участник_Kostix.md) 19:42, 20 августа 2007 (MSD)

### <a id="Кнопки_быстрого_доступа_к_нужным_функциям_некоторых_плагинов"></a>Кнопки быстрого доступа к нужным функциям некоторых плагинов

[Tue Feb 09 16:44]\<bigote> эх, к некоторым плагинам надо бы для удобства
кнопки на тулбар прикрутить. ощущаю острую нехватку включения/выключения
антиспама и включения/выключения разных режимов в floatinglog.

[Tue Feb 09 16:45]\<bigote> иногда надо на короткое время врубить показ
сообщений во время dnd. приходится лазить в настройки каждый раз.

### <a id="Показ_во_всплывающем_окне_тултипе_посетителя_конфы_всех_его_ников_в_данной_конфе"></a>Показ во всплывающем окне (тултипе) посетителя конфы всех его ников в данной конфе

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

## <a id="Known_Issues"></a>Known Issues
== Beryl + ATI r300 oss driver + Ubuntu edgy == [*Fixer*](Участник_Fixer.md)

1) Медленная прорисовка

2) Смазывается текст в окне настроек

3) Значок в трее отображается некорректно - становится белым. (возможно
проблема с одним из модулей Х.орг)

== Compiz + ATI r300 oss driver + Ubuntu feisty == [*Fixer*](Участник_Fixer.md)

1) Значок в трее отображается некорректно - становится белым.

## <a id="По_Вики"></a>По Вики
Планы пока просты:

### <a id="Структура_вики"></a>Структура вики

<s>Довести до ума структуру.</s> Будем считать, что доведено ;)

### <a id="Перевод_на_английский"></a>Перевод на английский

Когда она утрясётся, заняться переводить то, что уже есть, на English.
_(Процесс пошёл.)_

### <a id="Перевод_на_испанский"></a>Перевод на испанский

Когда будет что-нибудь по-английски готово, покалякать с испанцами, вдруг у них
есть желание сделать испанскую версию. Если нет - потихоньку переводить и на
Spanish. _(Можно начинать пинать ;))_


### <a id="Статья_Файл_конфигурации"></a>Статья "Файл конфигурации"

Приткнуть куда-нибудь статью [**Файл конфигурации**](Файл_конфигурации.md) и
дописать её или перекроить (или вообще выкинуть).

### <a id="sКаталанский_язык_s"></a><s>Каталанский язык</s>

<s>Спросить у lknight, нельзя ли добавить каталанский язык, а то в списке его
что-то не вижу. Вроде бы **ca** он должен быть? С другой стороны, уже в полный
рост используются домены .cat - то есть, можно сделать и так:
название\_статьи\_(cat)</s>

**Добавлено - расширение (ca)**

### <a id="Написать_статьи"></a>Написать статьи

Надо бы написать статьи Меню, Настройки

### <a id="Галереи"></a>Галереи

#### <a id="sГлюки_s"></a><s>Глюки</s>

<s>Разобраться с галереями, почему они глючат - это пинать lknigt'a.</s>

**Разобрались. Поставил в Помощь ссылку на образец работающего кода.**

#### <a id="Перезалить_их"></a>Перезалить их

Надо перезалить галереи в соответствующие статьи (Быстрый старт и куда-то там
ещё).

### <a id="Обновить_скриншоты_к_статьям"></a>Обновить скриншоты к статьям

Вообще неплохо бы обновить скриншоты - я делал их по версии 0.9.7, а там
интерфейс был совсем другой.

### <a id="Разобраться_с_многоязычным_интерфейсом"></a>Разобраться с многоязычным интерфейсом

<s>Работает только русский интерфейс, однако вроде есть возможность сделать,
чтобы и остальные работали. Подсказал вариант, который можно попробовать,
`xmpp:michael@wensley.org.uk` - дать почитать его lknight'у.</s> В связи с
переходом на доменную систему неактуально.

### <a id="Ссылки_xmpp"></a>Ссылки xmpp:

Подправить wiki движок, чтобы надпись вида xmpp:user@jabber.ru превращалась в
ссылку, как это сделано для mailto:

### <a id="Интервики_на__JaWiki"></a>Интервики на  JaWiki

Сделайте плиз интервики на wiki.jrudevels.org. Ключевое слово, если можно,
jawiki. :)

> Там уже [сделали](http://wiki.jrudevels.org/index.php/Sandbox) интервики на
  ru.tkabber.ru

### <a id="Проблемы_найденные_в_вики_при_осмотре_Ткаббера_0.10.0-svn-20070521tcl_tk_8.4.11"></a>Проблемы, найденные в вики при осмотре Ткаббера 0.10.0-svn-20070521(tcl/tk 8.4.11)

1) Описание настроек домашней директории устарело. Везде надо поменять старое
использование переменных окружения HOME/HOMEPATH итп, на **TKABBER\_HOME**

2) Описание настроек домашней директории устарело. Везде надо поменять старую
запись вида ~/.tkabber/ на новую **$configdir**

3) В разделе "_нетривиальные настройки_", порции "_Команды удаления текста_",
допущена ошибка в названии клавиши  <code>&lt;Back<b>S</b>pace&gt;</code>. Её называли там
<code>&lt;Back<b>s</b>pace&gt;</code>. Там поправил, но боюсь где-нибудь ещё так. А если использовать
указанный код - ткаббер ругается :)

---

Простейший поиск показал, что это слово встречается только в той статье, и уже
исправлено. Будем надеяться, что больше его нигде нет.
[**ycbl**](Участник_Bigote.md) 14:55, 12 июня 2007 (MSD)

4) Изменился путь к цветовым схемам, надо бы в вики его тоже поправить
(добавилась поддиректория xrdb)


>





|
<

|
<

|
|
>




|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|


|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
<
<
<
<

|
<
<
<
<
<
<
<

|

|
<
<

|
>
>
>
>
<

<
<
<
<
<
<
|

|
<
<
|
<
<
<
|



|
|
>
>
>
<
<
<

<
<
<
<
<
|
<

|

|
<
<

<
|

|
|
>
>
>

<
<
<
<
<
<
<
|

|
<

|

|
<

|

|
<

|

|

|

|

|
<

|

|

|

|

|

|
<
<
<
<

|

|
<

|
<
<
<
<
|
|

|
<

|
<

|

|

|

|

|
<

|

|

|
|
<
<
<
<
<
|
>
|
>

|
>
|
<

|

|
<
<
<

|

|

|
<
<
<
<

|
<
|
<
<
<
<

>
>
|
<
<
<

|

|

|
<

|

|

|

|
<
<
<

|

|

|
<
<
|

|

|
<
<
<

|

|

|
<

|
<
<
<
<
<

|

|

|
<
<

|

|
<
<
<

|

|

|

|

|
|
<
|

<
|
<
<

|

|
<
<

|

|

|
<
<

|

|
<

|



|
<
<
<
<
<
<
<
<
<
<
<
<
<

>
>
|

|
<

|

|
<
<
<
<
<
<
<
<
<
<
<
<
<

|

|
<

|
<

|

|

|

|
|
|
|
|

|

|

|

|

|
|
|
|
|
|
|
|
|
|
|
|

|

|

|
<

|

|
<
<

|

|

|

|
<

|

|
<
<

|
<
<

|
<

|

|

|
<

|

|
<
<

|

|
<
<

|

|

|
<

|

|
<

|

|
<
<

|






|

|

|
<
<

<
<
<
|

|
<
<
<
<

|
|

|

|

|
<

|

|

|
|

|

|

|

|
<

|
<
<
<
|
>

|

<
|

|

|
<
<
<

|

|

|

|

|

|

|

|

|
<

|

|
<

|

|
<
<
<

|

|
<

|

|
<

|
<

|

|
<

|
<

|
<
<
<



|
<
<

|
|
>
1
2
3
4
5
6
7
8

9
10

11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75




76
77







78
79
80
81


82
83
84
85
86
87

88






89
90
91


92



93
94
95
96
97
98
99
100
101



102





103

104
105
106
107


108

109
110
111
112
113
114
115
116







117
118
119

120
121
122
123

124
125
126
127

128
129
130
131
132
133
134
135
136
137

138
139
140
141
142
143
144
145
146
147
148
149




150
151
152
153

154
155




156
157
158
159

160
161

162
163
164
165
166
167
168
169
170
171

172
173
174
175
176
177
178





179
180
181
182
183
184
185
186

187
188
189
190



191
192
193
194
195
196




197
198

199




200
201
202
203



204
205
206
207
208
209

210
211
212
213
214
215
216
217



218
219
220
221
222
223


224
225
226
227
228



229
230
231
232
233
234

235
236





237
238
239
240
241
242


243
244
245
246



247
248
249
250
251
252
253
254
255
256
257

258
259

260


261
262
263
264


265
266
267
268
269
270


271
272
273
274

275
276
277
278
279
280













281
282
283
284
285
286

287
288
289
290













291
292
293
294

295
296

297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335

336
337
338
339


340
341
342
343
344
345
346
347

348
349
350
351


352
353


354
355

356
357
358
359
360
361

362
363
364
365


366
367
368
369


370
371
372
373
374
375

376
377
378
379

380
381
382
383


384
385
386
387
388
389
390
391
392
393
394
395
396


397



398
399
400




401
402
403
404
405
406
407
408
409

410
411
412
413
414
415
416
417
418
419
420
421
422
423
424

425
426



427
428
429
430
431

432
433
434
435
436



437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454

455
456
457
458

459
460
461
462



463
464
465
466

467
468
469
470

471
472

473
474
475
476

477
478

479
480



481
482
483
484


485
486
487
488
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Планы_на_будущее/index.html)


# Планы на будущее

Материал из Tkabber Wiki

Сюда давайте писать то, что собираемся на этой вики (а также просто касательно Ткаббера) сделать: про что написать статью, что протестировать и т.д. 


То, что уже сделано, можно не стирать, а <s>зачёркивать</s>, чтобы было видно ход работ. 


Просьба не путать разделы "Разработка" и "Вики". В раздел "Вики" вносите ваши пожелания, касающиеся организации именно вики, а не проблем с Ткаббером. 

---

## <a id="toc"></a>Содержание

* [1 Разработка](#Разработка)
 * [1.1 Удаленное управление](#Удаленное_управление)
 * [1.2 <s>Контакты онлайн - отображать вверху списка</s>](#sКонтакты_онлайн_-_отображать_вверху_списка_s)
 * [1.3 MUC. Пресеты для причин kick/ban](#MUC._Пресеты_для_причин_kick_ban)
 * [1.4 Ъ положение Ткаббера на раб. столе](#Ъ_положение_Ткаббера_на_раб._столе)
 * [1.5 Шрефты @;%&!](#Шрефты_@%&)
 * [1.6 Меню в истории разговоров](#Меню_в_истории_разговоров)
 * [1.7 Статусбар в полнотекстовом поиске](#Статусбар_в_полнотекстовом_поиске)
 * [1.8 Нормальная закладка при потере фокуса](#Нормальная_закладка_при_потере_фокуса)
 * [1.9 ГУЙ для метаконтактов](#ГУЙ_для_метаконтактов)
 * [1.10 Сделать сохранение положения ростера (свернут-развернут) (Fixer)](#Сделать_сохранение_положения_ростера_свернут-развернут_Fixer)
 * [1.11 Добавить возможность сохранять пароль в md5 виде для автологина  (Fixer)](#Добавить_возможность_сохранять_пароль_в_md5_виде_для_автологина__Fixer)
 * [1.12 Встроить плагин autoconnect (борьба с "№;%:\*" транспортами) (сомнительно)](#Встроить_плагин_autoconnect_борьба_с_№%_транспортами_сомнительно)
 * [1.13 Нумерация закладок](#Нумерация_закладок)
 * [1.14 Поиск в диско и т.д.](#Поиск_в_диско_и_т.д.)
 * [1.15 Звуки к играм](#Звуки_к_играм)
 * [1.16 Доработать кое-какие игры](#Доработать_кое-какие_игры)
 * [1.17 <s>Кэш новостей</s>](#sКэш_новостей_s)
 * [1.18 <s>Игнор в выпадающем меню на JID</s>](#sИгнор_в_выпадающем_меню_на_JID_s)
 * [1.19 Подтверждения](#Подтверждения)
  * [1.19.1 <s>Сделать хотя бы в виде патча</s>](#sСделать_хотя_бы_в_виде_патча_s)
  * [1.19.2 <s>Довести их до уровня плагина</s>](#sДовести_их_до_уровня_плагина_s)
 * [1.20 Чебуратор](#Чебуратор)
 * [1.21 Закладки](#Закладки)
  * [1.21.1 Автоматическая установка](#Автоматическая_установка)
  * [1.21.2 Выборочное удаление](#Выборочное_удаление)
 * [1.22 Управление ткаббером через командную строку](#Управление_ткаббером_через_командную_строку)
 * [1.23 Доделать мультилогин](#Доделать_мультилогин)
 * [1.24 Анти SPIM](#Анти_SPIM)
 * [1.25 Плагин "Whiteboard" aka "Грифельная доска"](#Плагин_Whiteboard_aka_Грифельная_доска)
 * [1.26 Отправка сообщения нескольким контактам](#Отправка_сообщения_нескольким_контактам)
 * [1.27 <s>Озвучить бы Spy</s>](#sОзвучить_бы_Spy_s)
 * [1.28 <s>!Пофиксить! цвет в Spy</s>](#sПофиксить_цвет_в_Spy_s)
 * [1.29 <s>!Пофиксить! цвет по адресу "История разговоров - логи" под темой дарк (Fixer)</s>](#sПофиксить_цвет_по_адресу_История_разговоров_-_логи_под_темой_дарк_Fixer_s)
 * [1.30 Довести до ума XHTML](#Довести_до_ума_XHTML)
 * [1.31 Мои ожидания от Attline (Attention Line) plugin'а](#Мои_ожидания_от_Attline_Attention_Line_pluginа)
 * [1.32 Плагин для взятия ресурса из файла](#Плагин_для_взятия_ресурса_из_файла)
 * [1.33 Кнопки быстрого доступа к нужным функциям некоторых плагинов](#Кнопки_быстрого_доступа_к_нужным_функциям_некоторых_плагинов)
 * [1.34 Показ во всплывающем окне (тултипе) посетителя конфы всех его ников в данной конфе](#Показ_во_всплывающем_окне_тултипе_посетителя_конфы_всех_его_ников_в_данной_конфе)
* [2 Known Issues](#Known_Issues)
* [3 По Вики](#По_Вики)
 * [3.1 Структура вики](#Структура_вики)
 * [3.2 Перевод на английский](#Перевод_на_английский)
 * [3.3 Перевод на испанский](#Перевод_на_испанский)
 * [3.4 Статья "Файл конфигурации"](#Статья_Файл_конфигурации)
 * [3.5 <s>Каталанский язык</s>](#sКаталанский_язык_s)
 * [3.6 Написать статьи](#Написать_статьи)
 * [3.7 Галереи](#Галереи)
  * [3.7.1 <s>Глюки</s>](#sГлюки_s)
  * [3.7.2 Перезалить их](#Перезалить_их)
 * [3.8 Обновить скриншоты к статьям](#Обновить_скриншоты_к_статьям)
 * [3.9 Разобраться с многоязычным интерфейсом](#Разобраться_с_многоязычным_интерфейсом)
 * [3.10 Ссылки xmpp:](#Ссылки_xmpp)
 * [3.11 Интервики на  JaWiki](#Интервики_на__JaWiki)
 * [3.12 Проблемы, найденные в вики при осмотре Ткаббера 0.10.0-svn-20070521(tcl/tk 8.4.11)](#Проблемы_найденные_в_вики_при_осмотре_Ткаббера_0.10.0-svn-20070521tcl_tk_8.4.11)

# <a id="Разработка"></a>Разработка
Этот раздел представляет собой что-то вроде feature request. Если у вас есть какие-то идеи относительно улучшения Ткаббера, можете оставлять тут свои пожелания. Просьба быть лаконичными и писать ясно, чтобы любой мог себе уяснить вашу идею. Если у вас чешутся руки чего-то попрограммировать, но нет идей — вот они перед вами :) 





 _Имейте, однако, в виду, что эта статья — не более, чем сборник пожеланий: сюда кто угодно может писать свои "хотелки", и это совершенно не означает, что их кто-либо когда-либо возьмётся реализовывать. Если вам интересны **намерения разработчиков** (то есть тех, кто активно пишет код для Ткаббера), читайте ["TODO разработчиков"](../en/TODO.md). Писать туда не надо. И опять же имейте в виду, что появление чего-либо в том TODO не означает, что это что-либо **точно** будет реализовано; это всё — типичные [WIBNIs](http://foldoc.org/foldoc.cgi?WIBNI)._ 








## <a id="Удаленное_управление"></a>Удаленное управление

<s>[http://www.jabber.org/jeps/jep-0146.html](http://www.jabber.org/jeps/jep-0146.html). С маленькими переделками ткаббера задача постепенно [решается](http://forum.jrudevels.org/viewtopic.php?t=1014). (c) feez </s> 



[Kostix](Участник_Kostix.md) 21:11, 18 сентября 2006 (MSD) первый вариант уже в транке! :) 

## <a id="sКонтакты_онлайн_-_отображать_вверху_списка_s"></a><s>Контакты онлайн - отображать вверху списка</s>

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








[kostix](Участник_Kostix.md) 22:17, 23 апреля 2008 (MSD) -- два возражения: 

*  Как это средство должно взаимодействовать с группами ростера? Отдельная сортировка для каждой группы? Но в чём смысл тогда? -- при большом ростере с открытыми группами всё равно не избежать прокрутки. 


*  В Ткаббере есть возможность переключать ростер в режим показа только тех, кто в онлайне. Это делается с тулбара или главного меню, а также может легко навешиваться на комбинацию клавиш, о чём рассказано в статье [Нетривиальные настройки](Нетривиальные_настройки.md). 



*  Наконец, в Ткаббере уже есть фильтрация ростера по буквам ника контакта. 

---

**Gooseman:** Контраргументы: согласен, функциональность добавляется очень небольшая, но все таки добавляется. Необходимость в прокрутке как раз - убирается, потому что онлайн-контакты группируются вверху, а группы можно сворачивать/разворачивать. Второй аргумент: готов проставить автору ясчик пива.:) Или, скорее, денежный его эквивалент каким-нить электронным способом. 

---

[ycbl](Участник_Bigote.md) 14:16, 20 июня 2009 (MSD) 









По-моему, товарищ [Jet](Участник_Jet.md) [заработал себе](Патчи.md#Отображение_доступных_контактов_сверху_списка) пресловутый ясчик пива ;) 


## <a id="MUC._Пресеты_для_причин_kick_ban"></a>MUC. Пресеты для причин kick/ban

<s>Добавить выбор причины кика или бана из списка, определяемым пользователем. Возможны варианты как через меню, т.е. дополнительное подменю, либо после клика на команду - окно.</s> 




См. этот [кусок в конфиг](Нетривиальные_настройки.md#Собственное_меню_для_киков_в_групчате). 

Впрочем, возможно, реализация этой штуки в виде плагина с визуальным редактором пресетов (на манер [customstatus](Плагины.md#customstatus)) имеет смысл. 

## <a id="Ъ_положение_Ткаббера_на_раб._столе"></a>Ъ положение Ткаббера на раб. столе

Сделать так шоб ткаббер сам рассчитывал размеры и положение окна в зависимости от разрешения, точно по центру экрана и определенное соотношение сторон, + <s>возможность сохранить положение для будущих сеансов!</s> Вторая часть пожелания реализована в svn-версии (приблизительно февраль 2009). 








## <a id="Шрефты_@%&"></a>Шрефты @;%&!

<s>Добавить наконец полноценную настройку шрифтов, допилить диалоги поиска...</s> 


## <a id="Меню_в_истории_разговоров"></a>Меню в истории разговоров

Добавить по всем закоулкам истории разговоров меню с пунктами типа "копировать, гугл, блабла" (Fixer) 


## <a id="Статусбар_в_полнотекстовом_поиске"></a>Статусбар в полнотекстовом поиске

Добавить в полнотекстовом поиске правее кнопок "Поиск" и "Отменить" показ статуса - идет поиск/найдено Н слов/приостановлено. (Fixer) 


## <a id="Нормальная_закладка_при_потере_фокуса"></a>Нормальная закладка при потере фокуса

<s>Сделать закладку в виде линии при потере фокуса</s> (Fixer) 

Начиная с версии 0.11.0 имеется встроенный плагин attline. 

## <a id="ГУЙ_для_метаконтактов"></a>ГУЙ для метаконтактов

<s>Сделать нормальный гуй для создания метаконтактов, т.е. объединения нескольких контактов в один.</s> (Fixer) 


Реализовано в svn-версии (февраль или март 2009). 

## <a id="Сделать_сохранение_положения_ростера_свернут-развернут_Fixer"></a>Сделать сохранение положения ростера (свернут-развернут) (Fixer)

## <a id="Добавить_возможность_сохранять_пароль_в_md5_виде_для_автологина__Fixer"></a>Добавить возможность сохранять пароль в md5 виде для автологина  (Fixer)

MD5 хакнут уж несколько лет как. Где-то тут даже на вики мы про это написали. 

[ycbl](Участник_Bigote.md) 01:30, 8 мая 2007 (MSD) 

BTW, для целей "чтоб не читали пароль, когда флэшку с Ткаббером кому-то отдаёшь" MD5 "хватило бы за глаза и за уши". Эту фичу нельзя реализовать по теоретическим соображениям, т.к. Ткабберу нужен чистый и ничем не замутнённый пароль для аутентификации на сервере, а любой крипто-хэш по определению (в теории) нереверсивен. 





[kostix](Участник_Kostix.md) 18:59, 8 мая 2007 (MSD) 

Хм, по словам kostix данную фичу реализовать не удастся, имхо, попробовать написать скрипт и статью по gnupg и config.tcl?  


[Fixer](Участник_Fixer.md) 17:54, 8 мая 2007 (MSD) 





Рабочую флэшку с Ткаббером (то есть которой вы сами пользуетесь) я бы вообще порекомендовал никому не давать, особенно если вы не шарите в тикле. Да если и шарите, будете каждый раз проверять, наизменял ли ваш заклятый друг в шутку или всерьёз какой-нибудь тихий закоулок кода? А уж сохранить себе "на память" зашифрованный конфиг такого доброго дяди и вообще сам бог велел. 

[ycbl](Участник_Bigote.md) надевает чёрные очки и удаляется, незаметно оглядываясь по сторонам. 


Как ни странно, после случая с модом "Pandora" для Bombus'а такая паранойя не выглядит чересчур излишней. 


[kostix](Участник_Kostix.md) 14:42, 9 мая 2007 (MSD) 

Tkabber на флешке? А starpack для чего придумали? :) 

[Fixer](Участник_Fixer.md) 23:45, 9 мая 2007 (MSD) 

## <a id="Встроить_плагин_autoconnect_борьба_с_№%_транспортами_сомнительно"></a>Встроить плагин autoconnect (борьба с "№;%:\*" транспортами) (сомнительно)

Довести до ума транспорт и добавить в официальную сборку? Слишком часто отпадает аськотранспорт %) .\_. 


[Fixer](Участник_Fixer.md) 18:02, 8 мая 2007 (MSD) 

## <a id="Нумерация_закладок"></a>Нумерация закладок

<s>Довести до состояния Plugin нумерацию закладок. (c) lknight</s> 
 **Добавил в [Плагины](Плагины.md#Tab_number). [eXire](Участник_EXire.md)** 






## <a id="Поиск_в_диско_и_т.д."></a>Поиск в диско и т.д.

<s>Поиск регэкспы или просто строкой в browse/discovery окне. (искать конференции) и RSS неплохо бы, а в идеале - заточить под любой элемент Дискавери (с) bigote (похоже, что RSS в Дискавери уже так и работает, жаль только, что полный список они убрали - он там совсем не лишний).</s> 

 [Kostix](Участник_Kostix.md) 03:17, 7 сентября 2006 (MSD) Поиск диско есть в SVN начиная с  

2006-08-17, поиск в RawXML — с 2006-08-18. Не хватает поиска в Headlines и Message Archive. 


## <a id="Звуки_к_играм"></a>Звуки к играм

<s>Как-нибудь надо прикрутить звуковое оповещение к играм (желательно, чтобы можно было выбрать свой звук, т.е. чтобы он отличался от стандартных).</s> Ещё можно попробовать сделать шахматные часы, которые вполне могут служить и для других игровых плагинов. (c) bigote 




Первая часть реализована, причём уже давно (не то в 0.10.0, не то в 0.11.0). 

## <a id="Доработать_кое-какие_игры"></a>Доработать кое-какие игры

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





*  Можно ли сделать оповещение о закрытии таба в принципе? Это всё равно, что позвонить в милицию после того, как тебя застрелили :) Но вдруг??? 

*  Хорошо бы приделать сохранение состояния игры на диск, чтобы по крайней мере иметь возможность восстанавливать её после перезапуска клиента (а в идеале — и после падения). (c) bigote 





## <a id="sКэш_новостей_s"></a><s>Кэш новостей</s>

<s>Кстати, очень бы не помешало переделать сохранение кэша новостей в реальном времени, а не при закрытии Ткаббера — любое вынужденное его прибивание убивает и текущее состояние окна новостей — в кэше хранятся старые новости (возможно, недельной давности). (c) bigote</s> 




**Добавил в [Плагины.](Плагины.md#Rsssaver) [eXire.](Участник_EXire.md)** 

## <a id="sИгнор_в_выпадающем_меню_на_JID_s"></a><s>Игнор в выпадающем меню на JID</s>

<s>Сделать (если вдруг это не сделает **Teo**) в выпадающем на Jid'е по правой кнопке мышке меню возможность добавить/убрать из игнор списка. (с) lknight</s> 


**Оказывается, давно уже это дело реализовано :)** 

## <a id="Подтверждения"></a>Подтверждения

### <a id="sСделать_хотя_бы_в_виде_патча_s"></a><s>Сделать хотя бы в виде патча</s>

<s>Добавить подтверждения закрытия табов. О закрытии единичного таба - не обязательно, но до кучи можно. А вот про "Закрыть остальные вкладки" и "Закрыть все вкладки" - надо бы. Я уже разок закрыл "остальные вкладки"... :) (c) bigote</s> 




**Добавил в [Патчи](Патчи.md). [eXire](Участник_EXire.md)** 

### <a id="sДовести_их_до_уровня_плагина_s"></a><s>Довести их до уровня плагина</s>

<s>Сделать плагином, плюс добавить подтверждение на закрытие Ткаббера, плюс добавить опции в Настройки.</s> 


 **Добавил в [Плагины.](Плагины.md#Confirm) [eXire](Участник_EXire.md).** 

## <a id="Чебуратор"></a>Чебуратор

Сделать конфигуратор к Ткабберу. Описание выложено **[отдельной статьёй](Чебуратор.md).** Обсуждать конфигуратор давайте там же, в отдельной статье (подробности на месте). 




## <a id="Закладки"></a>Закладки

### <a id="Автоматическая_установка"></a>Автоматическая установка

<s>Был тут разговор про них... Идея такая: при переходе в автоэвей в каждой открытой конференции автоматом устанавливается закладка в последней строке.</s> 


<s>Новые идеи: сделать, чтобы закладки самостоятельно втыкались при ручной смене статуса и потере фокуса окном Ткаббера. Причём, при потере фокуса должна вставляться закладка другого цвета (добавить другой пиксмап, например, ту же закладку, только зелёного цвета). Добавить раздельные настройки для включения каждого вида закладок, потому что потеря фокуса - частое явление, и не всем может понравиться наблюдать у себя кучи зелёных закладок.</s> 






**Добавил в [Плагины](Плагины.md#Bookmarks). [eXire](Участник_EXire.md).** 

### <a id="Выборочное_удаление"></a>Выборочное удаление

На данный момент удалять можно только все закладки в окне чата. Хорошо бы иметь возможность удалять ту, которую хочется (через контекстное меню, как и расставляем). 



## <a id="Управление_ткаббером_через_командную_строку"></a>Управление ткаббером через командную строку

Цель: чтобы при нажатии на ссылку вида `xmpp:user@jabber.ru` открывался Ткаббер с нужными параметрами и выполнял нужное действие. xmppmime.tcl содержит похожую функциональность но только для уже устаревших [xmpp-mime файлов](http://www.jabber.org/jeps/jep-0081.html). 




Сюда же чтобы можно было изменять PEP-стостояния через вызов Ткаббера с определенными параметрами.  

**[Более подробное изложение мыслей](ТЗ_по_управлению_через_параметры_командной_строки.md)** 

## <a id="Доделать_мультилогин"></a>Доделать мультилогин

Не хватает: 

*  автоматическое подключение нескольких профилей и настройка соответствующая. 
*  выбор содинения в окне disco/browser (или перед открытием) с которого должны отправлятся запросы 

*  выбор аккаунта для редактирования личной информации 


[Kostix](Участник_Kostix.md) 17:09, 27 октября 2006 (MSD) советует смотреть [сюда](Tkabber.md#Лёгкий_в_использовании_мультилогин). То, чего не хватает, и так известно прекрасно. Выработка разумного решения проблемы — вопрос более сложный и более интересный. 



## <a id="Анти_SPIM"></a>Анти SPIM

Реализация антиспама с капчами, а то спама из асечного транспорта все больше и больше. Идея взята  из отложенного протокола [JEP-0159 Spim blocking](http://www.jabber.org/jeps/jep-0159.html) 



**[Подробнее ...](Плагины/AntiSPIM.md)** 

## <a id="Плагин_Whiteboard_aka_Грифельная_доска"></a>Плагин "Whiteboard" aka "Грифельная доска"

Я тут поковырял плагин "whiteboard", ничего особенного - добавил окружность, многоугольник, цвет заливки... Хотелось бы узнать, я фигнёй страдаю и этим и так кто-то занимается?  



Вообщем есть там планы развития какие? 

Просто код для многоугольника в svgrender.tcl уже был. Да и с tcl/tk я всего два дня знаком, ковыряюсь "just for fun". 


[Zakon](Участник_Zakon.md) 02:06, 27 октября 2006 (MSD) 

---

Нет, не фигнёй. Там бы ещё очень не помешал экспорт нарисованного во что-то удобоваримое, например .svg (сейчас есть экспорт в .ps, но это не комильфо, в векторном редакторе это не отредактируешь), а также .gif или .png (только рабочей области). И очень не помешал бы импорт из svg нарисованных ранее рисунков. Правда, специалисты говорят, что это затруднительно, но у кого-то проскакивала и мысль насчёт сохранения рисунка в своём формате (где будет храниться не сам рисунок, а станцы, с помощью которых всё отрисовывалось), тогда при открытии такого файла Ткаббер просто выполнит сценарий и отошлёт результат всем собеседникам, с кем эта доска открыта. Думаю, **такая** доска была бы архиудобной для чего хочешь: хоть дорогу на <s>пьянку</s> линуксовку рисуй, хоть совещание с клиентом или с сотрудниками устраивай, хоть проекты разрабатывай в UML. 














[ycbl](Участник_Bigote.md) 14:57, 22 августа 2009 (MSD) 

## <a id="Отправка_сообщения_нескольким_контактам"></a>Отправка сообщения нескольким контактам

Добавить в окно чата возможность отослать сообщение нескольким контактам с возможностью выбора из ростера. 


## <a id="sОзвучить_бы_Spy_s"></a><s>Озвучить бы Spy</s>

Давно мечтаю о такой фигне: чтобы Spy не просто шпиёнил за кем-нибудь из ростера, но и извещал звуком (желательно, чтобы можно было задать индивидуальный звук для каждого, за кем шпиёним) о появлении этого товарища в онлайне. И чтоб можно было настраивать степень надоедливости: пищать всегда; пищать, когда я сам онлайн; пищать, когда я в эвее (не в XA); пищать, когда окно Ткаббера в фокусе или вне фокуса. И чтоб эта настройка была независимой от просто звуков Ткаббера. То есть, допустим, у меня просто звуки отключаются, когда окно Ткаббера в ростере и когда я в эвее. А вот извещения о присутствии кого-нибудь мне бы хотелось получать всегда. А можно присобачить к нему его собственный тайм-аут, независимый от тайм-аута автоэвея. Отходишь, например, от компа дела поделать, а неплохо бы знать, что некий нужный чел появился. Если привязывать озвучку к тайм-ауту автоэвея, то она вскоре перестанет работать, а если включить её на постоянку, она будет зря надоедать окружающим, когда я ухожу на работу. А так настроил ему часа полтора-два — и хватит. 














[ycbl](Участник_Bigote.md) 04:32, 27 января 2007 (MSK) 

P.S. Что-то сумбурно написал, но если чего непонятно, ловите в конфе или спрашивайте напрямую. 


* Вот [тут](Патчи.md#Звук_на_установленные_к_наблюдению_в_Шпионе_jidы) немного сделано. Звук срабатывающий вместе с всплывающим окошком. (BrennendeR~) 


## <a id="sПофиксить_цвет_в_Spy_s"></a><s>!Пофиксить! цвет в Spy</s>

Под темой dark синие надписи практически нечитабельны .\_. (Fixer) 

* В \*.xrdb добавить что-то вроде 

    *Spy.timestampforeground:       white
    *Spy.nickforeground:            yellow
    *Spy.jidforeground:             white
    *Spy.presenceforeground:        red
    *Spy.reasonforeground:          #9953d9

(BrennendeR~) 

## <a id="sПофиксить_цвет_по_адресу_История_разговоров_-_логи_под_темой_дарк_Fixer_s"></a><s>!Пофиксить! цвет по адресу "История разговоров - логи" под темой дарк (Fixer)</s>

Бо ужоснах. 

* Аналогично предыдущему: крутится за .\*xrdb примерно так 

    *JDisco.fill:			   	white
    *JDisco.activefill:		    	#020d61
    *JDisco.border:	       		#fcff00
    *JDisco.featurecolor:		    	#37cf45
    *JDisco.identitycolor:		    	#ffff00
    *JDisco.optioncolor:		    	mediumorchid3
    *JDisco.cbackground:                	#ff0000
    *JDisco.foreground:                 	#ffff00
    *Tree*background:		    	#111111
    *fill:                   		#ffffff
    *linesfill:			    	#ff0000
    *crossfill:			    	#ffff00

(BrennendeR~) 

## <a id="Довести_до_ума_XHTML"></a>Довести до ума XHTML

Можете не принимать, но вот мой "официальный" feature request по доведению до ума поддержки XHTML. 


1) Убрать жёстко прошитую helvetica из кода, пускай всё рисуется дефолтным фонтом. 

2) Убрать изменение размера шрифта (вроде, 12 там жёстко прошито), пускай всё рисуется дефолтным размером, тем более что огромные "ПРИВЕТ, ДРУЖИЩЕ" по утрам никому и не нужны. 



3) Убрать жуткие вертикальные пробелы до и после сообщения, зачем они задуманы? 

4) "Полечить" установку weight и underline, не рисует их вообще. 

Таким образом неплохо бы оставить bold/normal, italic/roman и foreground color. 

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


## <a id="Мои_ожидания_от_Attline_Attention_Line_pluginа"></a>Мои ожидания от Attline (Attention Line) plugin'а

Версия от JID:timur@a-cube.vsi.ru aka [mailto:timur.davletshin@gmail.com](mailto:timur.davletshin@gmail.com) по просьбе kostix. 



В Ткаббере из trunk'а появился новый весьма полезный plugin. Но его поведение немного отличается от того, что мне хотелось бы видеть как простому пользователю. 



Т.к. имеется всего одна настройка, меняющая поведение модуля, то разделим всё на два случая. 


1) Когда plugins::atline::options(remove\_expired) 0 

Окна чата, когда они открываюся мною: 

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


Окна чата, когда приходит сообщение: 

Я ожидаю, что я увижу вкладку с сообщениями, где непрочитанные сообщения будут отчерны до тех пор, пока я их не прочитаю, после этого линия-разделитель сползёт вниз. 



Окна групчата: 

Я ожидаю, что во вновь открытом окне линия будет находиться внизу. Вновь появившиеся сообщения будут отчёркиваться, после прочтения линия-разделитель сползёт вниз. 



 2) Когда plugins::atline::options(remove\_expired) 1 

Окна чата, когда они открываюся мною: 

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


Окна чата, когда приходит сообщение: 

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


Окна групчата: 

Я ожидаю, что во вновь открытом окне не будет никаких линий, а отчёркиваться будут лишь непрочитанные сообщения, притом, после прочтения линия-разделитель исчезнет. 



## <a id="Плагин_для_взятия_ресурса_из_файла"></a>Плагин для взятия ресурса из файла

    [19:17]<j2a> можещь в ткаббере плаг сделать, чтобы он брал ресурс из файла?
    [19:17]<j2a> т.е. я ему говорю: ресурс возьми из файла /etc/roaming/place
    [19:17]<j2a> и он считает оттуда, home, work, например
    [19:18]<j2a> а то на буке автоматом меняются сетевые профили, хочу чтобы ткаббер тож ловил их

[kostix](Участник_Kostix.md) 19:42, 20 августа 2007 (MSD) 

## <a id="Кнопки_быстрого_доступа_к_нужным_функциям_некоторых_плагинов"></a>Кнопки быстрого доступа к нужным функциям некоторых плагинов

[Tue Feb 09 16:44]\<bigote> эх, к некоторым плагинам надо бы для удобства кнопки на тулбар прикрутить. ощущаю острую нехватку включения/выключения антиспама и включения/выключения разных режимов в floatinglog. [Tue Feb 09 16:45]\<bigote> иногда надо на короткое время врубить показ сообщений во время dnd. приходится лазить в настройки каждый раз. 






## <a id="Показ_во_всплывающем_окне_тултипе_посетителя_конфы_всех_его_ников_в_данной_конфе"></a>Показ во всплывающем окне (тултипе) посетителя конфы всех его ников в данной конфе

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





# <a id="Known_Issues"></a>Known Issues
== Beryl + ATI r300 oss driver + Ubuntu edgy == [Fixer](Участник_Fixer.md) 

1) Медленная прорисовка 

2) Смазывается текст в окне настроек 

3) Значок в трее отображается некорректно - становится белым. (возможно проблема с одним из модулей Х.орг) 


== Compiz + ATI r300 oss driver + Ubuntu feisty == [Fixer](Участник_Fixer.md) 

1) Значок в трее отображается некорректно - становится белым. 

# <a id="По_Вики"></a>По Вики
Планы пока просты: 

## <a id="Структура_вики"></a>Структура вики

<s>Довести до ума структуру.</s> Будем считать, что доведено ;) 

## <a id="Перевод_на_английский"></a>Перевод на английский

Когда она утрясётся, заняться переводить то, что уже есть, на English. _(Процесс пошёл.)_ 


## <a id="Перевод_на_испанский"></a>Перевод на испанский




Когда будет что-нибудь по-английски готово, покалякать с испанцами, вдруг у них есть желание сделать испанскую версию. Если нет - потихоньку переводить и на Spanish. _(Можно начинать пинать ;))_ 

## <a id="Статья_Файл_конфигурации"></a>Статья "Файл конфигурации"


Приткнуть куда-нибудь статью **[Файл конфигурации](Файл_конфигурации.md)** и дописать её или перекроить (или вообще выкинуть). 

## <a id="sКаталанский_язык_s"></a><s>Каталанский язык</s>

<s>Спросить у lknight, нельзя ли добавить каталанский язык, а то в списке его что-то не вижу. Вроде бы **ca** он должен быть? С другой стороны, уже в полный рост используются домены .cat - то есть, можно сделать и так: название\_статьи\_(cat)</s> 




**Добавлено - расширение (ca)** 

## <a id="Написать_статьи"></a>Написать статьи

Надо бы написать статьи Меню, Настройки 

## <a id="Галереи"></a>Галереи

### <a id="sГлюки_s"></a><s>Глюки</s>

<s>Разобраться с галереями, почему они глючат - это пинать lknigt'a.</s> 

**Разобрались. Поставил в Помощь ссылку на образец работающего кода.** 

### <a id="Перезалить_их"></a>Перезалить их

Надо перезалить галереи в соответствующие статьи (Быстрый старт и куда-то там ещё). 


## <a id="Обновить_скриншоты_к_статьям"></a>Обновить скриншоты к статьям

Вообще неплохо бы обновить скриншоты - я делал их по версии 0.9.7, а там интерфейс был совсем другой. 


## <a id="Разобраться_с_многоязычным_интерфейсом"></a>Разобраться с многоязычным интерфейсом

<s>Работает только русский интерфейс, однако вроде есть возможность сделать, чтобы и остальные работали. Подсказал вариант, который можно попробовать, `xmpp:michael@wensley.org.uk` - дать почитать его lknight'у.</s> В связи с переходом на доменную систему неактуально. 




## <a id="Ссылки_xmpp"></a>Ссылки xmpp:

Подправить wiki движок, чтобы надпись вида xmpp:user@jabber.ru превращалась в ссылку, как это сделано для mailto: 


## <a id="Интервики_на__JaWiki"></a>Интервики на  JaWiki

Сделайте плиз интервики на wiki.jrudevels.org. Ключевое слово, если можно, jawiki. :) 


 Там уже [сделали](http://wiki.jrudevels.org/index.php/Sandbox) интервики на ru.tkabber.ru 


## <a id="Проблемы_найденные_в_вики_при_осмотре_Ткаббера_0.10.0-svn-20070521tcl_tk_8.4.11"></a>Проблемы, найденные в вики при осмотре Ткаббера 0.10.0-svn-20070521(tcl/tk 8.4.11)

1) Описание настроек домашней директории устарело. Везде надо поменять старое использование переменных окружения HOME/HOMEPATH итп, на **TKABBER\_HOME** 


2) Описание настроек домашней директории устарело. Везде надо поменять старую запись вида ~/.tkabber/ на новую **$configdir** 


3) В разделе "_нетривиальные настройки_", порции "_Команды удаления текста_", допущена ошибка в названии клавиши  Back**S**pace. Её называли там  Back**s**pace. Там поправил, но боюсь где-нибудь ещё так. А если использовать указанный код - ткаббер ругается :) 




---

Простейший поиск показал, что это слово встречается только в той статье, и уже исправлено. Будем надеяться, что больше его нигде нет. [ycbl](Участник_Bigote.md) 14:55, 12 июня 2007 (MSD)  



4) Изменился путь к цветовым схемам, надо бы в вики его тоже поправить (добавилась поддиректория xrdb) 


Changes to wiki/ru/Практика.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82

83
84
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Практика/index.html)


# Практика

Материал из Tkabber Wiki

Здесь, как нетрудно догадаться, неутомимые исследователи возможностей Ткаббера
могут найти практические советы по устранению неполадок, а также по расширению
существующего функционала. Иными словами, этот раздел написан для тех, кто не
прочь засучить рукава и, вооружившись напильником, превратить подводную лодку в
самолёт ;)

## <a id="toc"></a>Содержание

* [1 Часто задаваемые вопросы (ЧаВо)](#Часто_задаваемые_вопросы_ЧаВо)
* [2 Хохлома](#Хохлома)
   * [2.1 Смайлики и аватары](#Смайлики_и_аватары)
   * [2.2 Цветовые темы и прочая графика](#Цветовые_темы_и_прочая_графика)
   * [2.3 Звуковое сопровождение](#Звуковое_сопровождение)
* [3 Нетривиальные ковыряния конфига](#Нетривиальные_ковыряния_конфига)
* [4 Ковыряния программного кода](#Ковыряния_программного_кода)
   * [4.1 Разработка Ткаббера](#Разработка_Ткаббера)
   * [4.2 Плагины / Штепсели](#Плагины___Штепсели)
   * [4.3 Патчи / Заплатки](#Патчи___Заплатки)
* [5 Разное](#Разное)

## <a id="Часто_задаваемые_вопросы_ЧаВо"></a>Часто задаваемые вопросы (ЧаВо)

[**Маленькие хитрости, или Tkabber F.A.Q.**](Ткаббер_ЧаВо.md)

## <a id="Хохлома"></a>Хохлома

Украшательства и финтифлюшки. Тут будут даны ссылки на готовые цветовые /
звуковые схемы и наборы смайликов, а также на советы по их "прикручиванию" к
Ткабберу.

### <a id="Смайлики_и_аватары"></a>Смайлики и аватары

[**Смайлики (эмоциконки) и аватары**](Смайлики_и_аватары.md) — для тех, кто не
насмотрелся "Весёлых картинок" в детстве.

### <a id="Цветовые_темы_и_прочая_графика"></a>Цветовые темы и прочая графика

[**Цветовые темы и прочая графика**](Цветовые_темы_и_пиктограммы.md) — раздел
для практикующих эстетов.

### <a id="Звуковое_сопровождение"></a>Звуковое сопровождение

[**Звуковые схемы**](Звуковые_схемы.md) — музыканты, ау!

[**Проблемы со звуком**](Проблемы_со_звуком.md) — в эту статью перенесена
информация из соответствующих разделов [**ЧаВо**](Ткаббер_ЧаВо.md).

## <a id="Нетривиальные_ковыряния_конфига"></a>Нетривиальные ковыряния конфига

Рассказы про изменения, вносимые в **config.tcl**, более сложные, чем установка
переменных, нанесение боевой раскраски или прикручивание свистелок и
<s>перделок</s> колокольчиков.

[**Нетривиальные настройки**](Нетривиальные_настройки.md)

## <a id="Ковыряния_программного_кода"></a>Ковыряния программного кода

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

### <a id="Разработка_Ткаббера"></a>Разработка Ткаббера

[**Разработка**](Разработка.md) — список страниц, посвящённых различным
проблемам, касающимся разработки Ткаббера.

### <a id="Плагины___Штепсели"></a>Плагины / Штепсели

[**Плагины**](Плагины.md) — самописные плагины, пока ещё не обретшие
официальный статус.

### <a id="Патчи___Заплатки"></a>Патчи / Заплатки

[**Патчи**](Патчи.md) — обработка напильником исходного кода с целью получения
новых возможностей.

## <a id="Разное"></a>Разное


[**Сборка Старпака в домашних условиях**](Tkabber_starpack.md) — в помощь Самоделкиным.

>





|
<
<
<
<





|
|
|


|
|
|


|
<
|

|
<
|
<
<

|

<
|

|

|
<

|

|

|
<

|
<
|
<
<

|

|
<
|
<

|

|
<

|

|
<

|

|
<

|
>

|
1
2
3
4
5
6
7
8




9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

25
26
27

28


29
30
31

32
33
34
35
36

37
38
39
40
41
42

43
44

45


46
47
48
49

50

51
52
53
54

55
56
57
58

59
60
61
62

63
64
65
66
67
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Практика/index.html)


# Практика

Материал из Tkabber Wiki

 Здесь, как нетрудно догадаться, неутомимые исследователи возможностей Ткаббера могут найти практические советы по устранению неполадок, а также по расширению существующего функционала. Иными словами, этот раздел написан для тех, кто не прочь засучить рукава и, вооружившись напильником, превратить подводную лодку в самолёт ;) 





## <a id="toc"></a>Содержание

* [1 Часто задаваемые вопросы (ЧаВо)](#Часто_задаваемые_вопросы_ЧаВо)
* [2 Хохлома](#Хохлома)
 * [2.1 Смайлики и аватары](#Смайлики_и_аватары)
 * [2.2 Цветовые темы и прочая графика](#Цветовые_темы_и_прочая_графика)
 * [2.3 Звуковое сопровождение](#Звуковое_сопровождение)
* [3 Нетривиальные ковыряния конфига](#Нетривиальные_ковыряния_конфига)
* [4 Ковыряния программного кода](#Ковыряния_программного_кода)
 * [4.1 Разработка Ткаббера](#Разработка_Ткаббера)
 * [4.2 Плагины / Штепсели](#Плагины___Штепсели)
 * [4.3 Патчи / Заплатки](#Патчи___Заплатки)
* [5 Разное](#Разное)

# <a id="Часто_задаваемые_вопросы_ЧаВо"></a>Часто задаваемые вопросы (ЧаВо)

[Маленькие хитрости, или Tkabber F.A.Q.](Ткаббер_ЧаВо.md) 

# <a id="Хохлома"></a>Хохлома

Украшательства и финтифлюшки. Тут будут даны ссылки на готовые цветовые / звуковые схемы и наборы смайликов, а также на советы по их "прикручиванию" к Ткабберу. 



## <a id="Смайлики_и_аватары"></a>Смайлики и аватары


[Смайлики (эмоциконки) и аватары](Смайлики_и_аватары.md) — для тех, кто не насмотрелся "Весёлых картинок" в детстве. 

## <a id="Цветовые_темы_и_прочая_графика"></a>Цветовые темы и прочая графика

[Цветовые темы и прочая графика](Цветовые_темы_и_пиктограммы.md) — раздел для практикующих эстетов. 


## <a id="Звуковое_сопровождение"></a>Звуковое сопровождение

[Звуковые схемы](Звуковые_схемы.md) — музыканты, ау! 

[Проблемы со звуком](Проблемы_со_звуком.md) — в эту статью перенесена информация из соответствующих разделов [ЧаВо](Ткаббер_ЧаВо.md). 


# <a id="Нетривиальные_ковыряния_конфига"></a>Нетривиальные ковыряния конфига

Рассказы про изменения, вносимые в **config.tcl**, более сложные, чем установка переменных, нанесение боевой раскраски или прикручивание свистелок и <s>перделок</s> колокольчиков. 



[Нетривиальные настройки](Нетривиальные_настройки.md) 

# <a id="Ковыряния_программного_кода"></a>Ковыряния программного кода

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


## <a id="Разработка_Ткаббера"></a>Разработка Ткаббера

[Разработка](Разработка.md) — список страниц, посвящённых различным проблемам, касающимся разработки Ткаббера. 


## <a id="Плагины___Штепсели"></a>Плагины / Штепсели

[Плагины](Плагины.md) — самописные плагины, пока ещё не обретшие официальный статус. 


## <a id="Патчи___Заплатки"></a>Патчи / Заплатки

[Патчи](Патчи.md) — обработка напильником исходного кода с целью получения новых возможностей. 


# <a id="Разное"></a>Разное
*  [Сборка Старпака в домашних условиях](Tkabber_starpack.md) — в помощь Самоделкиным. 


Changes to wiki/ru/Проблемы_X_Window_и_TTF.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Проблемы_X_Window_и_TTF/index.html)


# Проблемы X Window и TTF

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Симптомы](#Симптомы)
* [2 Причины](#Причины)
* [3 Лечение](#Лечение)
   * [3.1 Шрифты?](#Шрифты)
   * [3.2 Сервер шрифтов?](#Сервер_шрифтов)
* [4 Дополнительные ссылки по проблеме](#Дополнительные_ссылки_по_проблеме)

## <a id="Симптомы"></a>Симптомы

Ткаббер, работающий под "иксами", падает при попытке показать какой-либо символ
из "верхней части" [Unicode](http://www.unicode.org).

Для начала включите отладочный лог, запустив Ткаббер примерно так:

    $ tkabber 2>&1 >/tmp/tkabber.log

(на самом деле, достаточно запустить Ткаббер из X-терминала, без всякого
перенаправления его потоков вывода, тогда ошибка будет просто видна в
терминале).

Вызовите падение Ткаббера, затем смотрите получившийся лог. Если вы видите
нечто вроде:

    X Error of failed request: BadValue (integer parameter out of range for operation)
    Major opcode of failed request: 45 (X_OpenFont)
    Value in failed request:  0x22000ef
    Serial number of failed request:  2263
    Current serial number in output stream:  2264

то вам повезло (относительно), так как корень зла в данном случае известен —
_неправильная работа одного из компонентов X Window с TrueType-шрифтами._

Сразу стоит оговориться, что ни Ткаббер, ни Tk не имеют к происходящему
никакого отношения, так как приведённая выше ошибка — это ошибка,
сгенерированная в "недрах" Xlib.

## <a id="Причины"></a>Причины

Причин, судя по всему, две:

* "кривые" шрифты в системе;
* "кривая" работа сервера шрифтов c "прямыми" шрифтами.

## <a id="Лечение"></a>Лечение

К сожалению, из-за многообразия комбинаций "X-сервер + сервер шрифтов" и их
настроек однозначно работающее решение привести сложно. Поэтому ниже дана
информация, которую вам понадобится:

*  осмыслить,
*  проверить на себе.

В конце концов, "спасение утопающих — дело рук самих утопающих" ©.

### <a id="Шрифты"></a>Шрифты?

В FAQ юниксового клона MSN Messenger — aMSN
[сказано](http://amsn.sourceforge.net/wiki/tiki-index.php?page=Frequently+Asked+Questions#faq-4-24),
что проблема, скорее всего, в том, что в системе установлены шрифты, содержащие
ошибки, и они выбираются сервером шрифтов раньше "правильных" шрифтов (в
предположении что они есть) согласно сконфигурированной вами или стоящей по
умолчанию схеме приоритетов.

Перевод этой информации:

1. Проблема может быть в шрифте: попробуйте запустить aMSN с другим шрифтом
   (Tools → Preferences → Appearance).<sup>1</sup>
1. Можете попробовать запустить aMSN с другой кодировкой (снова Tools →
   Preferences → Appearance, и utf-8 как самое безопасное решение).<sup>2</sup>
1. Попробуйте очистить ваш кэш фонтов командой **fc-cache -fv**. Затем
   убедитесь, что ваша локаль (ваши переменные окружения LC\_ALL или LC\_CTYPE)
   установлены в системе (**set | grep LC\_**) и удостоверьтесь, что
   соответствующие директории (что выводятся после **=**) имеются в каталоге
   **/usr/lib/locale**. Если их там нет, установите их в соответствии с
   требованиями вашей системы.
1. Если же ничего из посоветованного не помогает, попробуйте выключать пути к
   фонтам (**FontPath**) в конфигах **/etc/X11/XF86Config** или
   **/etc/X11/Xorg.conf**, пока не выясните, какой путь ведёт к "кривому" шрифту,
   и затем пересоздайте файлы **fonts.cache**, **fonts.dir** и **fonts.scale** в
   том директории.

 Примечания:

1. *Один из пользователей сообщил, что для него оказалось достаточным выбрать в
   качестве шрифтов Ткаббера **Arial Monotype** (из Microsoft Core Fonts), а
   ошибки у него были со шрифтом **Tahoma**.*
1. *Естественно, в случае с Ткаббером шрифты и кодировки надо менять в его
   конфиге. [**Читайте в ЧаВо**](Ткаббер_ЧаВо.md#Шрифты).*

### <a id="Сервер_шрифтов"></a>Сервер шрифтов?

А в этом архиве рассылки про [exmh](http://www.beedub.com/exmh/)
[описывается](http://www.mercea.net/~exmh/html/exmh-users/2005-01/msg00019.html)
решение проблемы, вызванной неправильной работой с TTF-шрифтами, реализованной
в некоторых версиях _X-серверов_ (по видимому, X11R6, если принять во внимание
дату документа), _которые сконфигурированы на раздачу шрифтов._

Предложенное решение — поставить специализированный сервер TrueType-шрифтов и
сообщить об этом X-серверу.

Приведём конфигурацию:

*  Поставить xfs-ttf + xfs;
*  Прописать в конфигурационный файл X-сервера:

        FontPath "unix/:7100" # XFS
        FontPath "unix/:7110" # XFS-TTF

*  Закомментировать там все остальные вхождения **FontPath**.

**Примечания:**

* По-видимому, вместо связки xfs-ttf + xfs вполне можно использовать один
  xfs-xtt;
* Проверьте, чтобы сокет, на котором слушает ваш сервер шрифтов, совпадал с
  тем, что вы прописали в конфигурации X-сервера, не надо слепо копировать
  приведённый пример. Получить список активных сокетов можно, запустив
  **netstat -l**.

## <a id="Дополнительные_ссылки_по_проблеме"></a>Дополнительные ссылки по проблеме

Если ничего не помогло, придётся вам отправиться в долгое странствие по
интернету. Вот вам от нас на дорожку
[гуглюшка хлеба](http://www.google.com/search?as_q=X+Error+of+failed+request:++BadValue+Tk).

>



|






|
|




|
<

|



|
<
<

|
<







|
<

|
<
<



|

|
|



|
<
<

|
|

|



<
|
<
<
<
<

|

|
<
|
<
|
<
<
<
<
<
|
<
<
<
<

|

|
<
<
|
<



|
<
<
<
<

|
<

|

|
|

|
|

|

|

|
<
|
<
<
<



|
|
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

20
21
22
23
24
25


26
27

28
29
30
31
32
33
34
35

36
37


38
39
40
41
42
43
44
45
46
47
48


49
50
51
52
53
54
55
56

57




58
59
60
61

62

63





64




65
66
67
68


69

70
71
72
73




74
75

76
77
78
79
80
81
82
83
84
85
86
87
88
89

90



91
92
93
94
95
96
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Проблемы_X_Window_и_TTF/index.html)


# Проблемы X Window и TTF

Материал из Tkabber Wiki.

## <a id="toc"></a>Содержание

* [1 Симптомы](#Симптомы)
* [2 Причины](#Причины)
* [3 Лечение](#Лечение)
 * [3.1 Шрифты?](#Шрифты)
 * [3.2 Сервер шрифтов?](#Сервер_шрифтов)
* [4 Дополнительные ссылки по проблеме](#Дополнительные_ссылки_по_проблеме)

## <a id="Симптомы"></a>Симптомы

Ткаббер, работающий под "иксами", падает при попытке показать какой-либо символ из "верхней части" [Unicode](http://www.unicode.org). 


Для начала включите отладочный лог, запустив Ткаббер примерно так: 

    $ tkabber 2>&1 >/tmp/tkabber.log

(на самом деле, достаточно запустить Ткаббер из X-терминала, без всякого перенаправления его потоков вывода, тогда ошибка будет просто видна в терминале). 



Вызовите падение Ткаббера, затем смотрите получившийся лог. Если вы видите нечто вроде: 


    X Error of failed request: BadValue (integer parameter out of range for operation)
    Major opcode of failed request: 45 (X_OpenFont)
    Value in failed request:  0x22000ef
    Serial number of failed request:  2263
    Current serial number in output stream:  2264

то вам повезло (относительно), так как корень зла в данном случае известен — _неправильная работа одного из компонентов X Window с TrueType-шрифтами._ 


Сразу стоит оговориться, что ни Ткаббер, ни Tk не имеют к происходящему никакого отношения, так как приведённая выше ошибка — это ошибка, сгенерированная в "недрах" Xlib. 



## <a id="Причины"></a>Причины

Причин, судя по всему, две: 

*  "кривые" шрифты в системе; 
*  "кривая" работа сервера шрифтов c "прямыми" шрифтами. 

## <a id="Лечение"></a>Лечение

К сожалению, из-за многообразия комбинаций "X-сервер + сервер шрифтов" и их настроек однозначно работающее решение привести сложно. Поэтому ниже дана информация, которую вам понадобится: 



*  осмыслить, 
*  проверить на себе. 

В конце концов, "спасение утопающих — дело рук самих утопающих" ©. 

### <a id="Шрифты"></a>Шрифты?


В FAQ юниксового клона MSN Messenger — aMSN [сказано](http://amsn.sourceforge.net/wiki/tiki-index.php?page=Frequently+Asked+Questions#faq-4-24), что проблема, скорее всего, в том, что в системе установлены шрифты, содержащие ошибки, и они выбираются сервером шрифтов раньше "правильных" шрифтов (в предположении что они есть) согласно сконфигурированной вами или стоящей по умолчанию схеме приоритетов. 





Перевод этой информации: 

1.  Проблема может быть в шрифте: попробуйте запустить aMSN с другим шрифтом (Tools → Preferences → Appearance). <sup>1</sup> 

1.  Можете попробовать запустить aMSN с другой кодировкой (снова Tools → Preferences → Appearance, и utf-8 как самое безопасное решение). <sup>2</sup> 

1.  Попробуйте очистить ваш кэш фонтов командой **fc-cache -fv**. Затем убедитесь, что ваша локаль (ваши переменные окружения LC\_ALL или LC\_CTYPE) установлены в системе (**set | grep LC\_**) и удостоверьтесь, что соответствующие директории (что выводятся после **=** ) имеются в каталоге **/usr/lib/locale**. Если их там нет, установите их в соответствии с требованиями вашей системы. 





1.  Если же ничего из посоветованного не помогает, попробуйте выключать пути к фонтам (**FontPath**) в конфигах **/etc/X11/XF86Config** или **/etc/X11/Xorg.conf**, пока не выясните, какой путь ведёт к "кривому" шрифту, и затем пересоздайте файлы **fonts.cache**, **fonts.dir** и **fonts.scale** в том директории.  





 Примечания: 

1.  _Один из пользователей сообщил, что для него оказалось достаточным выбрать в качестве шрифтов Ткаббера **Arial Monotype** (из Microsoft Core Fonts), а ошибки у него были со шрифтом **Tahoma**._ 


1.  _Естественно, в случае с Ткаббером шрифты и кодировки надо менять в его конфиге. [Читайте в ЧаВо.](Ткаббер_ЧаВо.md#Шрифты)_ 


### <a id="Сервер_шрифтов"></a>Сервер шрифтов?

А в этом архиве рассылки про [exmh](http://www.beedub.com/exmh/) [описывается](http://www.mercea.net/~exmh/html/exmh-users/2005-01/msg00019.html) решение проблемы, вызванной неправильной работой с TTF-шрифтами, реализованной в некоторых версиях _X-серверов_ (по видимому, X11R6, если принять во внимание дату документа), _которые сконфигурированы на раздачу шрифтов._ 





Предложенное решение — поставить специализированный сервер TrueType-шрифтов и сообщить об этом X-серверу. 


Приведём конфигурацию: 

*  Поставить xfs-ttf + xfs; 
*  Прописать в конфигурационный файл X-сервера: 

    FontPath "unix/:7100" # XFS
    FontPath "unix/:7110" # XFS-TTF

*  Закомментировать там все остальные вхождения **FontPath**. 

**Примечания:** 

*  По-видимому, вместо связки xfs-ttf + xfs вполне можно использовать один xfs-xtt; 

*  Проверьте, чтобы сокет, на котором слушает ваш сервер шрифтов, совпадал с тем, что вы прописали в конфигурации X-сервера, не надо слепо копировать приведённый пример. Получить список активных сокетов можно, запустив **netstat -l**. 




## <a id="Дополнительные_ссылки_по_проблеме"></a>Дополнительные ссылки по проблеме

Если ничего не помогло, придётся вам отправиться в долгое странствие по интернету. Вот вам от нас на дорожку  [гуглюшка хлеба](http://www.google.com/search?as_q=X+Error+of+failed+request:++BadValue+Tk). 


Changes to wiki/ru/Проблемы_со_звуком.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109


[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Проблемы_со_звуком/index.html)


# Проблемы со звуком

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 В старпаке/старките нет звука](#В_старпаке_старките_нет_звука)
* [2 Изменение громкости звуковых оповещений](#Изменение_громкости_звуковых_оповещений)
   * [2.1 При помощи файла **config.tcl**](#При_помощи_файла_config.tcl)
   * [2.2 Во время работы Ткаббера](#Во_время_работы_Ткаббера)
   * [2.3 Делаем опцию в настройках Ткаббера](#Делаем_опцию_в_настройках_Ткаббера)
* [3 Не работает звук под линуксом в ALSA](#Не_работает_звук_под_линуксом_в_ALSA)

## <a id="В_старпаке_старките_нет_звука"></a>В старпаке/старките нет звука
Официальные старкиты и старпаки не содержат пакета
[Snack](http://www.speech.kth.se/snack/), который обычно играет звук в
Ткаббере.

(Далее мы будем говорить про старпак для краткости, но всё сказанное относится
в равной мере и к старкитам.)

Решение: Возьмите один из готовых
[**старкитов**](Дистрибутивы__которые_мы_выбираем.md#Tclkit_starkits_и_starpacks_немного_теории)
пакета **Snack**, доступных в [архиве старкитов](http://www.tcl.tk/starkits/) и
положите его в тот же каталог, где у вас находится старпак Ткаббера.

При старте старпак Ткаббера ищет файлы, подходящие под маску `snack*.kit` и
лежащие там же, где сам старпак, и загружает первый найденный.

В настоящий момент в архиве старкитов есть три версии старкита Snack:

* "виндовый" ([snack-win.kit](http://www.tcl.tk/starkits/bin/snack-win.kit)) —
  содержит библиотеки только для Windows;
* "полный" ([snack.kit](http://www.equi4.com/pub/om/sdarchive/snack.kit) или
  [*локально*](../files/Snack.kit)) — содержит библиотеки для всех трёх платформ,
  на которых работает Tcl/Tk — при его загрузке будет выбрана нужная;
* "линуксовый"
  ([snack-lin.kit](http://www.equi4.com/pub/om/sdarchive/snack-lin.kit) или
  [*локально*](../files/Snack-lin.kit)) — для Linux x86.

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

**Внимание!** Кажущаяся разумной альтернатива — использовать внешнюю программу
для проигрывания звука — _работать не будет,_ так как звуковые файлы находятся
на виртуальной файловой системе старпака и недоступны для внешних программ.

## <a id="Изменение_громкости_звуковых_оповещений"></a>Изменение громкости звуковых оповещений
Дальнейшие советы касаются только случая использования встроенной звуковой
библиотеки **snack**.

### <a id="При_помощи_файла_config.tcl"></a>При помощи файла **config.tcl**

В раздел **hook::add finload\_hook { ... }** нужно добавить следующие строки:

    if {$sound::snack} {
         ::snack::audio scaling 0.4
    }

Здесь 0.4 означает, что звуки в Ткаббере будут проигрываться в 4/10 от общей
громкости системы. Значение может меняться от 0.0 до 1.0.

### <a id="Во_время_работы_Ткаббера"></a>Во время работы Ткаббера

Открываем консоль через меню **Помощь → Показать консоль**. В ней вводим:

         ::snack::audio scaling 0.4

### <a id="Делаем_опцию_в_настройках_Ткаббера"></a>Делаем опцию в настройках Ткаббера

В файле **tkabber/plugins/general/sound.tcl** находим строчку:

       custom::defvar options(mute) 0 \

сразу перед ней вставляем строки:

       custom::defvar options(volume) 100 \
             [::msgcat::mc "Sound volume (from 0 to 100)"] \
             -command [list [namespace current]::volume_set] \
             -type integer -group Sound

потом находим строчку:

    proc ::sound::load_sound_file {name args} {

сразу перед ней вставляем строки:

    proc ::sound::volume_set {args} {
              variable options
              if {$options(volume) < 0 } {set options(volume) 0}
              if {$options(volume) > 100 } {set options(volume) 100}
              ::snack::audio scaling [expr {$options(volume) / 100.0}]
    }

В опциях звука появится ещё один параметр **Sound volume (from 0 to 100)**.
Громкость меняется от минимальной (0) до максимальной (100). Если собираетесь
использовать этот вариант настройки, то не забудьте убрать из **config.tcl**
последствия настройки согласно первому пункту.

[**Archimed**](Участник_Archimed.md)

## <a id="Не_работает_звук_под_линуксом_в_ALSA"></a>Не работает звук под линуксом в ALSA

[2009-12-22 13:52:00]\<teo> kostix\_: libsnack2-alsa не рекомендуется к
использованию. libsnack2 и настройка эмуляции oss в alsa рекомендуется.

Также можно подключить внешнюю программу. Например, mplayer играет за милую душу.



>









|
|
|


|
|
<
<

|
<

<
|
<
<

|
<

|

|
<
<
|
<
<
|
<

|
<

|
<
<

|
|
<

|

|





|
<

|

|



|

|



|






|



|








|
<
<
<

|

|
<
|
<

|
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18


19
20

21

22


23
24

25
26
27
28


29


30

31
32

33
34


35
36
37

38
39
40
41
42
43
44
45
46
47

48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81



82
83
84
85

86

87
88
89
90
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Проблемы_со_звуком/index.html)


# Проблемы со звуком

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 В старпаке/старките нет звука](#В_старпаке_старките_нет_звука)
* [2 Изменение громкости звуковых оповещений](#Изменение_громкости_звуковых_оповещений)
 * [2.1 При помощи файла **config.tcl**](#При_помощи_файла_config.tcl)
 * [2.2 Во время работы Ткаббера](#Во_время_работы_Ткаббера)
 * [2.3 Делаем опцию в настройках Ткаббера](#Делаем_опцию_в_настройках_Ткаббера)
* [3 Не работает звук под линуксом в ALSA](#Не_работает_звук_под_линуксом_в_ALSA)

# <a id="В_старпаке_старките_нет_звука"></a>В старпаке/старките нет звука
Официальные старкиты и старпаки не содержат пакета [Snack](http://www.speech.kth.se/snack/), который обычно играет звук в Ткаббере. 



(Далее мы будем говорить про старпак для краткости, но всё сказанное относится в равной мере и к старкитам.) 



Решение: Возьмите один из готовых [старкитов](Дистрибутивы__которые_мы_выбираем.md#Tclkit_starkits_и_starpacks_немного_теории) пакета **Snack**, доступных в [архиве старкитов](http://www.tcl.tk/starkits/) и положите его в тот же каталог, где у вас находится старпак Ткаббера. 



При старте старпак Ткаббера ищет файлы, подходящие под маску `snack*.kit` и лежащие там же, где сам старпак, и загружает первый найденный. 


В настоящий момент в архиве старкитов есть три версии старкита Snack: 

*  "виндовый" ([snack-win.kit](http://www.tcl.tk/starkits/bin/snack-win.kit)) — содержит библиотеки только для Windows; 


*  "полный" ([snack.kit](http://www.equi4.com/pub/om/sdarchive/snack.kit) или [локально](../files/Snack.kit)) — содержит библиотеки для всех трёх платформ, на которых работает Tcl/Tk — при его загрузке будет выбрана нужная; 


*  "линуксовый" ([snack-lin.kit](http://www.equi4.com/pub/om/sdarchive/snack-lin.kit) или [локально](../files/Snack-lin.kit)) — для Linux x86. 


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


**Внимание!** Кажущаяся разумной альтернатива — использовать внешнюю программу для проигрывания звука — _работать не будет,_ так как звуковые файлы находятся на виртуальной файловой системе старпака и недоступны для внешних программ. 



# <a id="Изменение_громкости_звуковых_оповещений"></a>Изменение громкости звуковых оповещений
Дальнейшие советы касаются только случая использования встроенной звуковой библиотеки **snack**. 


## <a id="При_помощи_файла_config.tcl"></a>При помощи файла **config.tcl**

В раздел **hook::add finload\_hook { ... }** нужно добавить следующие строки: 

    if {$sound::snack} {
         ::snack::audio scaling 0.4
    }

Здесь 0.4 означает, что звуки в Ткаббере будут проигрываться в 4/10 от общей громкости системы. Значение может меняться от 0.0 до 1.0. 


## <a id="Во_время_работы_Ткаббера"></a>Во время работы Ткаббера

Открываем консоль через меню **Помощь → Показать консоль**. В ней вводим: 

         ::snack::audio scaling 0.4

## <a id="Делаем_опцию_в_настройках_Ткаббера"></a>Делаем опцию в настройках Ткаббера

В файле **tkabber\\plugins\\general\\sound.tcl** находим строчку: 

       custom::defvar options(mute) 0 \

сразу перед ней вставляем строки: 

       custom::defvar options(volume) 100 \
             [::msgcat::mc "Sound volume (from 0 to 100)"] \
             -command [list [namespace current]::volume_set] \
             -type integer -group Sound

потом находим строчку: 

    proc ::sound::load_sound_file {name args} {

сразу перед ней вставляем строки: 

    proc ::sound::volume_set {args} {
              variable options
              if {$options(volume) < 0 } {set options(volume) 0}
              if {$options(volume) > 100 } {set options(volume) 100}
              ::snack::audio scaling [expr {$options(volume) / 100.0}]
    }

В опциях звука появится ещё один параметр **Sound volume (from 0 to 100)**. Громкость меняется от минимальной (0) до максимальной (100). Если собираетесь использовать этот вариант настройки, то не забудьте убрать из **config.tcl** последствия настройки согласно первому пункту. 




[Archimed](Участник_Archimed.md) 

# <a id="Не_работает_звук_под_линуксом_в_ALSA"></a>Не работает звук под линуксом в ALSA

[2009-12-22 13:52:00]\<teo> kostix\_: libsnack2-alsa не рекомендуется к использованию. libsnack2 и настройка эмуляции oss в alsa рекомендуется. 


Также можно подключить внешнюю программу. Например, mplayer играет за милую душу. 


Changes to wiki/ru/Проверка_сертификата_сервера.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169

170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Проверка_сертификата_сервера/index.html)


# Проверка сертификата сервера

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Теория](#Теория)
   * [1.1 Для чего?](#Для_чего)
   * [1.2 Как это работает?](#Как_это_работает)
   * [1.3 Что значит "самоподписанный сертификат в цепочке сертификатов"?](#Что_значит_самоподписанный_сертификат_в_цепочке_сертификатов)
* [2 Практика](#Практика)
   * [2.1 Получение сертификата доверенного ЦС](#Получение_сертификата_доверенного_ЦС)
   * [2.2 Настройка Ткаббера](#Настройка_Ткаббера)
   * [2.3 Добавление доверенных сертификатов ЦС в хранилище](#Добавление_доверенных_сертификатов_ЦС_в_хранилище)
      * [2.3.1 Приватное хранилище](#Приватное_хранилище)
      * [2.3.2 Системное хранилище](#Системное_хранилище)

## <a id="Теория"></a>Теория

Вы можете перейти прямо к разделу "Практика", однако лучше сначала осилить
теорию. А ещё лучше сначала прочитать
[**вводную информацию по поводу соединения "клиент-сервер"**](Между_офлайном_и_онлайном.md#Канал_связи_клиент-сервер_в_Jabber_XMPP),
чтобы понять, какую роль в установлении соединения играют сертификаты.

### <a id="Для_чего"></a>Для чего?

Проверка сертификата сервера клиентом, о которой идёт речь, производится на
стадии установления TLS-соединения, именуемой _рукопожатием (handshake)._
Рукопожатие означает не только обмен некоторой чисто технической информацией,
но и нечто большее: как известно, традиция рукопожатия у европейцев произошла
от вполне утилитарного обряда древних людей — показывать при встрече, что у
тебя в руке нет камня. Аналогично, клиент и сервер в ходе TLS-рукопожатия
"показывают друг другу руки" — предъявляют свой _сертификат_ и исследуют чужой.

Проверка может быть полезна вот по какой причине: существует несколько
различных атак на протокол TCP/IP, которые позволяют атакующему "встроиться" в
соединение и контролировать его. Кроме того, возможны куда более банальные
атаки на аппаратном уровне: например, получив контроль над
[роутером](http://ru.wikipedia.org/wiki/роутер), через который проходят пакеты
между вашим клиентом и сервером, с которым вы хотите соединиться, можно
перенаправить трафик такого соединения на другую специально подготовленную
машину вместо "настоящего" сервера. Сертификат, предъявляемый сервером,
позволяет клиенту удостовериться в том, что сервер "настоящий", и наоборот.

Следует также заметить, что в отличие, например, от
[VPN](http://ru.wikipedia.org/wiki/VPN), XMPP-сервер в большинстве случаев не
интересуется клиентским сертификатом, и в случае соединения с публичными
серверами (такими, как jabber.ru), именно это и происходит. Однако в Ткаббере
есть возможность указать собственный сертификат и ключ к нему, если требуется.

### <a id="Как_это_работает"></a>Как это работает?

Ключевой концепцией в схеме сертификатов является _доверие_ — вы можете
доверять или не доверять конкретному сертификату, причём эта операция
производится автоматически программным обеспечением, реализующим TLS.

Реализация доверия, однако, является значительно более "хитрым" предметом, чем
хотелось бы некоторым пользователям: вы не можете доверять конкретному
сертификату сервера напрямую — вместо этого _вы должны доверять_ (возможно,
опосредованно — через цепочку других сертификатов) _**центру сертификации,**
который выдал соответствующий сертификат._

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

Когда центр сертификации (ЦС) (в оригинале: "Certification Authority (CA)")
выдаёт сертификат, он _подписывает_ сертификат своим секретным ключом,
добиваясь двух целей:

* Подписанный с помощью [ЭЦП](http://ru.wikipedia.org/wiki/ЭЦП) сертификат
  нельзя изменить физически, сохранив его связность с подписью.
* ЦС "заверяет" сертификат своей подписью, как если бы сертификат был бумажным
  заявлением, на которым ЦС написал "можно верить".

После этого любой клиент, доверяющий данному ЦС, получив в ходе рукопожатия
сертификат, выданный этим ЦС, может автоматически доверять и сертификату.

_Чтобы доверять конкретному ЦС, нужно доверять его сертификату._ Обычно это
достигается импортом такого сертификата в хранилище сертификатов доверенных ЦС.
Этот момент ставит главный барьер для многих пользователей Ткаббера, поэтому
рассмотрен в деталях ниже, в секции "Практика".

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

### <a id="Что_значит_самоподписанный_сертификат_в_цепочке_сертификатов"></a>Что значит "самоподписанный сертификат в цепочке сертификатов"?

![(!)](../images/Hammer.png) **Сделать:** дописать про self-signed + unable to
get local issuer...

## <a id="Практика"></a>Практика

Здесь мы рассмотрим, как сделать сертифкат конкретного центра сертификации
доверенным с точки зрения Ткаббера.

Существует несколько проблем, связанных с добавлением сертификата ЦС в число
доверенных:

* Разные системы имеют разные реализации TLS: например, Windows реализует его
  поддержку "нативно" при помощи собственных библиотек, API которых ни с чем не
  совместим, а большинство "остальных" систем полагаются на библиотеку
  [OpenSSL](http://www.openssl.org) и "обёртки" вокруг неё; существуют и другие
  свободные реализации, например, [GnuTLS](http://www.gnu.org/software/gnutls/)
  и [NSS](http://www.mozilla.org/projects/security/pki/nss/). Ткаббер, как и
  большинство кросс-платформенных продуктов, использует OpenSSL, и делает он
  это при помощи расширения Tcl — [tls](http://tls.sourceforge.net), которое
  экспортирует функциональность OpenSSL на уровень скриптов Tcl.
* Понятие "системное хранилище сертификатов" вообще представляется почти
  мифическим, если окинуть взором доступные системы. В частности, в Windows
  существует единое хранилище сертификатов; предполагается, что там хранятся
  вообще все сертификаты, включая клиентские и доверенные сертификаты ЦС.
  Системы, широко использующие OpenSSL (например, популярные дистрибутивы
  Linux), обычно реализуют собственные системные хранилища доверенных
  сертификатов ЦС, а клиентскими сертификатами каждая программа управляет, как
  сочтёт нужным.

Ткаббер в этом смысле равноудалён от всех решений: пакет
[tls](http://tls.sourceforge.net), который он использует, позволяет указать
путь до каталога с доверенными сертификатами ЦС или путь до файла с ними.
Ткаббер "прячет" обе эти возможности за единственной опцией конфигурации (так
как в состоянии сам разобраться — файл или каталог ему указали), а настройка
этой опции зависит от личных способностей и пожеланий пользователя.

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

### <a id="Получение_сертификата_доверенного_ЦС"></a>Получение сертификата доверенного ЦС

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

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

Подключение к jabber.ru — сертификат серверу выдан некоммерческой организацией
[CAcert.org](http://www.cacert.org). Как видно при внимательном рассмотрении,
веб-сайт "виден" в сообщении об ошибке аж дважды: в имени организации ("OU" —
"Organisational Unit") и в поле e-mail поддержки:
![Image:CAcert-verification-failed.png](../images/CAcert-verification-failed.png)
В данном случае OpenSSL проверяет сертификат, выданный непосредственно корневым
ЦС, однако этот ЦС не числится в числе доверенных.

Подключение к одному из серверов, входящих в федерацию
[xmpp.net](http://www.xmpp.net), — сертификат выдан организацией
[Startcom](http://www.startcom.org) точнее — промежуточным ЦС, занимающимся
выдачей сертификатов серверам xmpp.net):
![Image:Startcom-verification-failed.png](../images/Startcom-verification-failed.png)
В данном случае OpenSSL проверяет сертификат, выданный промежуточным ЦС,
проверка целостности сертификата удаётся (поскольку он был прислан сервером
вместе со своим сертификатом — это обычная практика для сертификатов, выданных

промежуточными ЦС, которой, впрочем, администраторы серверов придерживаться не
обязаны), но сертификат вышестоящего ЦС в цепочке недоступен.

Упомянутая смекалка позволит вам заключить, что в первом случае вам следует
посетить сайт [CAcert.org](http://www.cacert.org), а во втором —
[Startcom](http://www.startcom.org). Искать там нужно корневой (root) или
"class 1" сертификат. Если сертификат доступен в нескольких форматах, выбирайте
PEM как самый удобный.

В данных конкретных случаях этими сертификатами являются:

* Для CAcert: [http://www.cacert.org/certs/root.crt](http://www.cacert.org/certs/root.crt)
* Для Startcom: [http://cert.startcom.org/ca.crt](http://cert.startcom.org/ca.crt)

Примечание: CAcert.org также предлагает сертификат в "формате TEXT". На самом
деле такого формата не существует, а внутри там обычный PEM, предварённый
результатом вызова `openssl x509 -text -in class1.crt -noout` на исходном
сертификате. Сия схема работает благодаря тому, что OpenSSL при чтении
сертификата в формате PEM игнорирует любой мусор до строки начала сертификата
"-----BEGIN ..." и после строки его окончания (ниже подробно рассмотрено: в
каких случаях и почему это может пригодиться). Поэтому можете скачать
сертификат и в таком виде.

### <a id="Настройка_Ткаббера"></a>Настройка Ткаббера

Итак, интересующая нас опция настроек Ткаббера называется
**::loginconf(sslcacertstore)** (от **SSL** **CA** **Cert**ificate **Store**),
задаёт она путь до каталога или файла с сертификатами доверенных ЦС и удобнее
всего настраивается через **Tkabber → Настройки → Login**.

Если вы используете мультилогин на разные серверы, вам следует изменять
переменную **sslcacertstore** в соответствующих массивах **::loginconf1**,
**::loginconf2** и так далее, как описано в
[руководстве](http://tkabber.jabber.ru/files/doc/tkabber.html#s.postload-login).

### <a id="Добавление_доверенных_сертификатов_ЦС_в_хранилище"></a>Добавление доверенных сертификатов ЦС в хранилище

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

Остановимся подробнее на форматах этих разновидностей хранилищ сертификатов. О
них хорошо рассказано в
[описании функции SSL\_CTX\_load\_verify\_locations](http://www.openssl.org/docs/ssl/SSL_CTX_load_verify_locations.html)
API OpenSSL, однако здесь мы приведём вольную интерпретацию.

**Файл** сертификатов — это текстовый (ASCII) файл, который состоит из любого
числа сертификатов в формате PEM, расположенных друг за другом; между соседними
сертификатами может быть расположен произвольный текст. Это удобно для
размещения информации о сертификатах, чтобы проще было ими управлять. Пример
такого файла:

    Сертификат CAcert.org:
    -----BEGIN CERTIFICATE-----
    MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290
    IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB
    ...
    -----END CERTIFICATE-----
    Конец сертификата CAcert.org

    Сертификат Startcom:
    -----BEGIN CERTIFICATE-----
    MIIFFjCCBH+gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsDELMAkGA1UEBhMCSUwx
    DzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0
    ...
    -----END CERTIFICATE-----
    Конец сертификата Startcom.

**Каталог** сертификатов должен содержать файлы сертификатов в формате PEM,
_которые должны иметь специально сгенерированные имена._ Имя каждого файла
является хэшем, подсчитанным на основании содержимого файла по специальному
алгоритму, а расширение — номер файла с данным значением хэша, начиная с 0,
например: **9d66eef0.0**.

С OpenSSL поставляется специальная утилита **c\_rehash**, которая умеет создавать
"правильно названные" [**симлинки**](Symlinks.md) на исходные файлы сертификатов (с
человекопонятными названиями и, возможно, организованные в систему вложенных
каталогов где-то в другом месте файловой системы). Поэтому в Windows, в которой
у пользователей очень редко имеется в наличии установленные утилиты из
комплекта OpenSSL (да и сам **tls** обычно слинкован с библиотекой OpenSSL
статически), данный метод выглядит слишком сложным для реализации, и
рекомендуется использовать файл с сертификатами.

Кое-какие подсказки про **c\_rehash** в Windows:
[[1]](http://lynx.isc.org/current/README.rootcerts) (**TODO: окучить**).

Собственно, искомый хэш получается выполнением

    openssl x509 -hash -noout -in c:/tmp/root.crt

OpenSSL для виндов берётся
[тут](http://www.slproweb.com/products/Win32OpenSSL.html). Впрочем, это не
работающее решение, возможно, стоит сделать плагин.

#### <a id="Приватное_хранилище"></a>Приватное хранилище

Добавление сертификата в собственное (приватное) хранилище зависит от
выбранного формата хранилища.

Если вы используете каталог, просто скопируйте файл с новым сертификатом в
него, проследив, чтобы он не перезаписал уже существующий файл. Например,
логично переименовать CAcert'овский сертификат в **cacert-root.pem** при
копировании. После этого создайте требуемые симлинки:

    $ cd ~/path/to/mycacerts
    $ c_rehash .

Если вы поддерживаете хранилище сертификатов в виде файла, просто добавьте
содержимое файла в конец файла-хранилища, например, так:

    C:\> echo Корневой сертификат CAcert >>c:\mycacerts.pem
    C:\> type root.crt >>c:\mycacerts.pem

Переменная конфигурации **::loginconf(sslcacertstore)** должна быть установлена
в значение, соответствующее полному пути до каталога или файла с вашим
хранилищем.

#### <a id="Системное_хранилище"></a>Системное хранилище

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

В [Debian](http://www.debian.org) и [Ubuntu](http://www.ubuntu.com) процедура
такова:

1. Установите настройку **::loginconf(sslcacertstore)** в значение
   **/etc/ssl/certs** (это каталог) или **/etc/ssl/cert/ca-certificates.crt** (это файл).
1. Убедитесь, что установлен пакет
   [ca-certificates](http://packages.debian.org/ca-certificates). Дальнейшие
   действия нужно выполнять с правами суперпользователя.
1. Скопируйте нужные файлы сертификатов в каталог **/usr/share/ca-certificates**;
   этот каталог может содержать подкаталоги, поэтому можете разместить скачанные
   сертификаты по подкаталогам по своему усмотрению.
1. Запустите **update-ca-certificates**.

Теперь Ткаббер будет доверять всем сертификатам ЦС из пакета
**ca-certificates**, а также тем, которые вы добавили.

_Внимание!_ В пакете **ca-certificates**, идущем с Debian Lenny, уже есть
сертификаты как CACert, так и StartCom, — в итоге всё, что нужно сделать для
работы с jabber.ru и серверами, получившими сертификат от xmpp.net, это
пометить указанные два сертификата как доверенные при конфигурировании пакета.

>



|




|
|
|

|
|
|
|
|

|
<
|
<
<
<

|

|
<
<
<
<
<
<

|
<
<
<
<
<
<
<
<

|
<
<
<
<

|

|
<
<

|
<
<
<
<

|
|
|
<
<
<
<
<

<
<
<
<
|
<
|
<

|
<

|
<
<
<

|
<
<
<
<
<

|

|
<

|
<
|
<

|
<

|
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<

|
<
<
<
<
<

|
<
<
<
<

|

|
<
<
<
<

|
<
<

|
<
<
<
<
<
<

|
|
|
|
<
<
<
<
>
<
<

<
<
<
<
<
<
<
<
|
|

|
<
<
<
<
<
<
<

|

|
<
<
<

|
<
<
<

|

|
<

|
<
<
<

|
<
<
<
<








|








|
<
<
<
<

|
<
<
<
<
<
<
<

<
|

|



<
<
|

|

|
<

|
<
<
<




|
<




|
<
<

|

|
<
<

|
<

|
<
<
|
<
<
|
<
|

|
<

|
|
|
<
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

22



23
24
25
26






27
28








29
30




31
32
33
34


35
36




37
38
39
40





41




42

43

44
45

46
47



48
49





50
51
52
53

54
55

56

57
58

59
60








61







62
63





64
65




66
67
68
69




70
71


72
73






74
75
76
77
78




79


80








81
82
83
84







85
86
87
88



89
90



91
92
93
94

95
96



97
98




99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116




117
118







119

120
121
122
123
124
125


126
127
128
129
130

131
132



133
134
135
136
137

138
139
140
141
142


143
144
145
146


147
148

149
150


151


152

153
154
155

156
157
158
159

[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Проверка_сертификата_сервера/index.html)


# Проверка сертификата сервера

Материал из Tkabber Wiki.

## <a id="toc"></a>Содержание

* [1 Теория](#Теория)
 * [1.1 Для чего?](#Для_чего)
 * [1.2 Как это работает?](#Как_это_работает)
 * [1.3 Что значит "самоподписанный сертификат в цепочке сертификатов"?](#Что_значит_самоподписанный_сертификат_в_цепочке_сертификатов)
* [2 Практика](#Практика)
 * [2.1 Получение сертификата доверенного ЦС](#Получение_сертификата_доверенного_ЦС)
 * [2.2 Настройка Ткаббера](#Настройка_Ткаббера)
 * [2.3 Добавление доверенных сертификатов ЦС в хранилище](#Добавление_доверенных_сертификатов_ЦС_в_хранилище)
  * [2.3.1 Приватное хранилище](#Приватное_хранилище)
  * [2.3.2 Системное хранилище](#Системное_хранилище)

# <a id="Теория"></a>Теория

Вы можете перейти прямо к разделу "Практика", однако лучше сначала осилить теорию. А ещё лучше сначала прочитать [вводную информацию по поводу соединения "клиент-сервер"](Между_офлайном_и_онлайном.md#Канал_связи_клиент-сервер_в_Jabber_XMPP), чтобы понять, какую роль в установлении соединения играют сертификаты. 




## <a id="Для_чего"></a>Для чего?

Проверка сертификата сервера клиентом, о которой идёт речь, производится на стадии установления TLS-соединения, именуемой _рукопожатием (handshake)._ Рукопожатие означает не только обмен некоторой чисто технической информацией, но и нечто большее: как известно, традиция рукопожатия у европейцев произошла от вполне утилитарного обряда древних людей — показывать при встрече, что у тебя в руке нет камня. Аналогично, клиент и сервер в ходе TLS-рукопожатия "показывают друг другу руки" — предъявляют свой _сертификат_ и исследуют чужой. 







Проверка может быть полезна вот по какой причине: существует несколько различных атак на протокол TCP/IP, которые позволяют атакующему "встроиться" в соединение и контролировать его. Кроме того, возможны куда более банальные атаки на аппаратном уровне: например, получив контроль над [роутером](http://ru.wikipedia.org/wiki/роутер), через который проходят пакеты между вашим клиентом и сервером, с которым вы хотите соединиться, можно перенаправить трафик такого соединения на другую специально подготовленную машину вместо "настоящего" сервера. Сертификат, предъявляемый сервером, позволяет клиенту удостовериться в том, что сервер "настоящий", и наоборот. 









Следует также заметить, что в отличие, например, от [VPN](http://ru.wikipedia.org/wiki/VPN), XMPP-сервер в большинстве случаев не интересуется клиентским сертификатом, и в случае соединения с публичными серверами (такими, как jabber.ru), именно это и происходит. Однако в Ткаббере есть возможность указать собственный сертификат и ключ к нему, если требуется. 





## <a id="Как_это_работает"></a>Как это работает?

Ключевой концепцией в схеме сертификатов является _доверие_ — вы можете доверять или не доверять конкретному сертификату, причём эта операция производится автоматически программным обеспечением, реализующим TLS. 



Реализация доверия, однако, является значительно более "хитрым" предметом, чем хотелось бы некоторым пользователям: вы не можете доверять конкретному сертификату сервера напрямую — вместо этого _вы должны доверять_ (возможно, опосредованно — через цепочку других сертификатов) _**центру сертификации,** который выдал соответствующий сертификат._ 





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

Когда центр сертификации (ЦС) (в оригинале: "Certification Authority (CA)") выдаёт сертификат, он _подписывает_ сертификат своим секретным ключом, добиваясь двух целей: 










*  Подписанный с помощью [ЭЦП](http://ru.wikipedia.org/wiki/ЭЦП) сертификат нельзя изменить физически, сохранив его связность с подписью. 

*  ЦС "заверяет" сертификат своей подписью, как если бы сертификат был бумажным заявлением, на которым ЦС написал "можно верить". 


После этого любой клиент, доверяющий данному ЦС, получив в ходе рукопожатия сертификат, выданный этим ЦС, может автоматически доверять и сертификату. 


_Чтобы доверять конкретному ЦС, нужно доверять его сертификату._ Обычно это достигается импортом такого сертификата в хранилище сертификатов доверенных ЦС. Этот момент ставит главный барьер для многих пользователей Ткаббера, поэтому рассмотрен в деталях ниже, в секции "Практика". 




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






## <a id="Что_значит_самоподписанный_сертификат_в_цепочке_сертификатов"></a>Что значит "самоподписанный сертификат в цепочке сертификатов"?

![(!)](../images/Hammer.png) **Сделать:** дописать про self-signed + unable to get local issuer... 


# <a id="Практика"></a>Практика

Здесь мы рассмотрим, как сделать сертифкат конкретного центра сертификации доверенным с точки зрения Ткаббера. 


Существует несколько проблем, связанных с добавлением сертификата ЦС в число доверенных: 


*  Разные системы имеют разные реализации TLS: например, Windows реализует его поддержку "нативно" при помощи собственных библиотек, API которых ни с чем не совместим, а большинство "остальных" систем полагаются на библиотеку [OpenSSL](http://www.openssl.org) и "обёртки" вокруг неё; существуют и другие свободные реализации, например, [GnuTLS](http://www.gnu.org/software/gnutls/) и [NSS](http://www.mozilla.org/projects/security/pki/nss/). Ткаббер, как и большинство кросс-платформенных продуктов, использует OpenSSL, и делает он это при помощи расширения Tcl — [tls](http://tls.sourceforge.net), которое экспортирует функциональность OpenSSL на уровень скриптов Tcl. 








*  Понятие "системное хранилище сертификатов" вообще представляется почти мифическим, если окинуть взором доступные системы. В частности, в Windows существует единое хранилище сертификатов; предполагается, что там хранятся вообще все сертификаты, включая клиентские и доверенные сертификаты ЦС. Системы, широко использующие OpenSSL (например, популярные дистрибутивы Linux), обычно реализуют собственные системные хранилища доверенных сертификатов ЦС, а клиентскими сертификатами каждая программа управляет, как сочтёт нужным. 








Ткаббер в этом смысле равноудалён от всех решений: пакет [tls](http://tls.sourceforge.net), который он использует, позволяет указать путь до каталога с доверенными сертификатами ЦС или путь до файла с ними. Ткаббер "прячет" обе эти возможности за единственной опцией конфигурации (так как в состоянии сам разобраться — файл или каталог ему указали), а настройка этой опции зависит от личных способностей и пожеланий пользователя. 






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





## <a id="Получение_сертификата_доверенного_ЦС"></a>Получение сертификата доверенного ЦС

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





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



Подключение к jabber.ru — сертификат серверу выдан некоммерческой организацией [CAcert.org](http://www.cacert.org). Как видно при внимательном рассмотрении, веб-сайт "виден" в сообщении об ошибке аж дважды: в имени организации ("OU" — "Organisational Unit") и в поле e-mail поддержки: ![Image:CAcert-verification-failed.png](../images/CAcert-verification-failed.png) В данном случае OpenSSL проверяет сертификат, выданный непосредственно корневым ЦС, однако этот ЦС не числится в числе доверенных. 







Подключение к одному из серверов, входящих в федерацию [xmpp.net](http://www.xmpp.net), — сертификат выдан организацией [Startcom](http://www.startcom.org) (а точнее — промежуточным ЦС, занимающимся выдачей сертификатов серверам xmpp.net): ![Image:Startcom-verification-failed.png](../images/Startcom-verification-failed.png) В данном случае OpenSSL проверяет сертификат, выданный промежуточным ЦС, проверка целостности сертификата удаётся (поскольку он был прислан сервером вместе со своим сертификатом — это обычная практика для сертификатов, выданных промежуточными ЦС, которой, впрочем, администраторы серверов придерживаться не обязаны), но сертификат вышестоящего ЦС в цепочке недоступен. 

Упомянутая смекалка позволит вам заключить, что в первом случае вам следует посетить сайт [CAcert.org](http://www.cacert.org), а во втором — [Startcom](http://www.startcom.org). Искать там нужно корневой (root) или "class 1" сертификат. Если сертификат доступен в нескольких форматах, выбирайте PEM как самый удобный. 





В данных конкретных случаях этими сертификатами являются: 











*  Для CAcert: [http://www.cacert.org/certs/root.crt](http://www.cacert.org/certs/root.crt) 
*  Для Startcom: [http://cert.startcom.org/ca.crt](http://cert.startcom.org/ca.crt) 

Примечание: CAcert.org также предлагает сертификат в "формате TEXT". На самом деле такого формата не существует, а внутри там обычный PEM, предварённый результатом вызова `openssl x509 -text -in class1.crt -noout` на исходном сертификате. Сия схема работает благодаря тому, что OpenSSL при чтении сертификата в формате PEM игнорирует любой мусор до строки начала сертификата "-----BEGIN ..." и после строки его окончания (ниже подробно рассмотрено: в каких случаях и почему это может пригодиться). Поэтому можете скачать сертификат и в таком виде. 








## <a id="Настройка_Ткаббера"></a>Настройка Ткаббера

Итак, интересующая нас опция настроек Ткаббера называется **::loginconf(sslcacertstore)** (от **SSL** **CA** **Cert**ificate **Store**), задаёт она путь до каталога или файла с сертификатами доверенных ЦС и удобнее всего настраивается через **Tkabber → Настройки → Login**. 




Если вы используете мультилогин на разные серверы, вам следует изменять переменную **sslcacertstore** в соответствующих массивах **::loginconf1**, **::loginconf2** и так далее, как описано в [руководстве](http://tkabber.jabber.ru/files/doc/tkabber.html#s.postload-login). 




## <a id="Добавление_доверенных_сертификатов_ЦС_в_хранилище"></a>Добавление доверенных сертификатов ЦС в хранилище

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


Остановимся подробнее на форматах этих разновидностей хранилищ сертификатов. О них хорошо рассказано в [описании функции SSL\_CTX\_load\_verify\_locations](http://www.openssl.org/docs/ssl/SSL_CTX_load_verify_locations.html) API OpenSSL, однако здесь мы приведём вольную интерпретацию. 




**Файл** сертификатов — это текстовый (ASCII) файл, который состоит из любого числа сертификатов в формате PEM, расположенных друг за другом; между соседними сертификатами может быть расположен произвольный текст. Это удобно для размещения информации о сертификатах, чтобы проще было ими управлять. Пример такого файла: 





    Сертификат CAcert.org:
    -----BEGIN CERTIFICATE-----
    MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290
    IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB
    ...
    -----END CERTIFICATE-----
    Конец сертификата CAcert.org
    
    Сертификат Startcom:
    -----BEGIN CERTIFICATE-----
    MIIFFjCCBH+gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsDELMAkGA1UEBhMCSUwx
    DzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0
    ...
    -----END CERTIFICATE-----
    Конец сертификата Startcom.

**Каталог** сертификатов должен содержать файлы сертификатов в формате PEM, _которые должны иметь специально сгенерированные имена._ Имя каждого файла является хэшем, подсчитанным на основании содержимого файла по специальному алгоритму, а расширение — номер файла с данным значением хэша, начиная с 0, например: 9d66eef0.0. 





С OpenSSL поставляется специальная утилита c\_rehash, которая умеет создавать "правильно названные" [симлинки](Symlinks.md) на исходные файлы сертификатов (с человекопонятными названиями и, возможно, организованные в систему вложенных каталогов где-то в другом месте файловой системы). Поэтому в Windows, в которой у пользователей очень редко имеется в наличии установленные утилиты из комплекта OpenSSL (да и сам **tls** обычно слинкован с библиотекой OpenSSL статически), данный метод выглядит слишком сложным для реализации, и рекомендуется использовать файл с сертификатами. 









Кое-какие подсказки про c\_rehash в Windows: [[1]](http://lynx.isc.org/current/README.rootcerts) (**TODO: окучить**). 

Собственно, искомый хэш получается выполнением 

    openssl x509 -hash -noout -in c:/tmp/root.crt



OpenSSL для виндов берётся [тут](http://www.slproweb.com/products/Win32OpenSSL.html). Впрочем, это не работающее решение, возможно, стоит сделать плагин. 

### <a id="Приватное_хранилище"></a>Приватное хранилище

Добавление сертификата в собственное (приватное) хранилище зависит от выбранного формата хранилища. 


Если вы используете каталог, просто скопируйте файл с новым сертификатом в него, проследив, чтобы он не перезаписал уже существующий файл. Например, логично переименовать CAcert'овский сертификат в cacert-root.pem при копировании. После этого создайте требуемые симлинки: 




    $ cd ~/path/to/mycacerts
    $ c_rehash .

Если вы поддерживаете хранилище сертификатов в виде файла, просто добавьте содержимое файла в конец файла-хранилища, например, так: 


    C:\> echo Корневой сертификат CAcert >>c:\mycacerts.pem
    C:\> type root.crt >>c:\mycacerts.pem

Переменная конфигурации **::loginconf(sslcacertstore)** должна быть установлена в значение, соответствующее полному пути до каталога или файла с вашим хранилищем. 



### <a id="Системное_хранилище"></a>Системное хранилище

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



В [Debian](http://www.debian.org) и [Ubuntu](http://www.ubuntu.com) процедура такова: 


1.  Установите настройку **::loginconf(sslcacertstore)** в значение /etc/ssl/certs (это каталог) или /etc/ssl/cert/ca-certificates.crt (это файл). 


1.  Убедитесь, что установлен пакет [ca-certificates](http://packages.debian.org/ca-certificates). Дальнейшие действия нужно выполнять с правами суперпользователя. 


1.  Скопируйте нужные файлы сертификатов в каталог /usr/share/ca-certificates; этот каталог может содержать подкаталоги, поэтому можете разместить скачанные сертификаты по подкаталогам по своему усмотрению. 

1.  Запустите update-ca-certificates. 

Теперь Ткаббер будет доверять всем сертификатам ЦС из пакета **ca-certificates**, а также тем, которые вы добавили. 


_Внимание!_ В пакете **ca-certificates**, идущем с Debian Lenny, уже есть сертификаты как CACert, так и StartCom, — в итоге всё, что нужно сделать для работы с jabber.ru и серверами, получившими сертификат от xmpp.net, это пометить указанные два сертификата как доверенные при конфигурировании пакета. 



Changes to wiki/ru/Разработка.md.

1
2

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33


[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Разработка/index.html)


# Разработка

Материал из Tkabber Wiki

Это — список страниц, посвящённых разработке Ткаббера.

Темы для обсуждений:

* [**Wish и русская раскладка в
  Windows**](Wish_и_русская_раскладка_в_Windows.md) — проблемы non-Latin-1
  раскладок клавиатуры в системах, отличных от "иксов".
* [**MUC Ignore**](MUC_Ignore.md) — обсуждение реализации игнорирования
  участников конференций.
* [**Nick coloring**](Nick_coloring.md) — обсуждение переделки системы
  раскраски ников/сообщений.
* [**Config dir**](Config_dir.md) — обсуждение реализации новой системы выбора
  каталога для хранения настроек Ткаббера в Windows (и Mac OS X).
* [**Спамодавка списками приватности**](Спамодавка_списками_приватности.md)
* [**Новый вид Tk в 8.5**](Новый_вид_Tk_в_8.5.md)

[**Плагины**](Плагины.md):

* [**Разработка плагинов**](Разработка_плагинов.md)
* [**Чейнджлог плагина Traffic.**](Plugins/Traffic/Changelog.md)

Прочее:

* [**SVN disclaimer**](SVN_disclaimer.md) — что нужно знать чтобы начать
  <s>использовать</s> тестировать версию Ткаббера, находящуюся в разработке.
* [**Утилита "Сделай-Tkabber-Starpack-сам"**](Tkabber_starpack.md)
* [**Tk Windows keysyms bug explained**](Tk_Windows_keysyms_bug_explained.md)




>




|

|

<
|
<
|
<
|
<
<
|
|
|

|

|
|

|

<
|
|
|
>
>
1
2
3
4
5
6
7
8
9
10
11

12

13

14


15
16
17
18
19
20
21
22
23
24
25

26
27
28
29
30
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Разработка/index.html)


# Разработка

Материал из Tkabber Wiki

Это — список страниц, посвящённых разработке Ткаббера. 

Темы для обсуждений: 


*  [Wish и русская раскладка в Windows](Wish_и_русская_раскладка_в_Windows.md) — проблемы non-Latin-1 раскладок клавиатуры в системах, отличных от "иксов". 

*  [MUC Ignore](MUC_Ignore.md) — обсуждение реализации игнорирования участников конференций. 

*  [Nick coloring](Nick_coloring.md) — обсуждение переделки системы раскраски ников/сообщений. 


*  [Config dir](Config_dir.md) — обсуждение реализации новой системы выбора каталога для хранения настроек Ткаббера в Windows (и Mac OS X). 
*  [Спамодавка списками приватности](Спамодавка_списками_приватности.md) 
*  [Новый вид Tk в 8.5](Новый_вид_Tk_в_8.5.md) 

[Плагины](Плагины.md): 

*  [Разработка плагинов](Разработка_плагинов.md) 
*  [Чейнджлог плагина Traffic.](Plugins/Traffic/Changelog.md) 

Прочее: 


*  [SVN disclaimer](SVN_disclaimer.md) — что нужно знать чтобы начать <s>использовать</s> тестировать версию Ткаббера, находящуюся в разработке. 
*  [Утилита "Сделай-Tkabber-Starpack-сам"](Tkabber_starpack.md) 
*  [Tk Windows keysyms bug explained](Tk_Windows_keysyms_bug_explained.md) 


Changes to wiki/ru/Разработка_плагинов.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22




23
24
25
26
27
28
29
30
31
32
33
34


35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404

405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767


[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Разработка_плагинов/index.html)


# Разработка плагинов

Материал из Tkabber Wiki

В этой статье будет сделана попытка раскрыть волнующую многих тему написания
собственного плагина. Автор практического пособия (первых двух разделов статьи)
— ещё <s>плохой охотник</s> неопытный плагинописатель, зато его набитые шишки и
взгляд на вещи глазами новичка может помочь таким же начинающим. Впрочем,
поправки принимаются.

## <a id="toc"></a>Содержание

* [1 С чего начать](#С_чего_начать)
   * [1.1 Учите матчасть](#Учите_матчасть)
      * [1.1.1 Выучите вы уже этот тикль, не бойтесь — он несложный](#Выучите_вы_уже_этот_тикль_не_бойтесь_-_он_несложный)
      * [1.1.2 Изучите документацию и исходники](#Изучите_документацию_и_исходники)
* [2 Практические советы](#Практические_советы)
   * [2.1 Структура плагина](#Структура_плагина)
      * [2.1.1 Структура каталога](#Структура_каталога)
      * [2.1.2 Структура файла скрипта](#Структура_файла_скрипта)




   * [2.2 Анализируйте чужой код и не бойтесь экспериментировать](#Анализируйте_чужой_код_и_не_бойтесь_экспериментировать)
      * [2.2.1 Закончим анализ разбиравшегося плагина](#Закончим_анализ_разбиравшегося_плагина)
   * [2.3 Отладка](#Отладка)
      * [2.3.1 Спешка нужна лишь при ловле блох](#Спешка_нужна_лишь_при_ловле_блох)
      * [2.3.2 Консоль Ткаббера — наше всё](#Консоль_Ткаббера_-_наше_всё)
      * [2.3.3 Побольше тестируйте](#Побольше_тестируйте)
      * [2.3.4 Научитесь пользоваться системой управления версиями](#Научитесь_пользоваться_системой_управления_версиями)
   * [2.4 Тонкости](#Тонкости)
      * [2.4.1 Хуки и return stop](#Хуки_и_return_stop)
   * [2.5 Делаем плагин динамически подключаемым](#Делаем_плагин_динамически_подключаемым)
      * [2.5.1 Добавляем в namespace код для запуска процедур загрузки и выгрузки](#Добавляем_в_namespace_код_для_запуска_процедур_загрузки_и_выгрузки)
      * [2.5.2 Создаём эти самые процедуры загрузки и выгрузки](#Создаём_эти_самые_процедуры_загрузки_и_выгрузки)


      * [2.5.3 Возможна ли полная выгрузка плагина из памяти?](#Возможна_ли_полная_выгрузка_плагина_из_памяти)
   * [2.6 Не бойтесь задавать вопросы](#Не_бойтесь_задавать_вопросы)
* [3 Общие сведения о репозитории](#Общие_сведения_о_репозитории)
* [4 Как получить доступ к репозиторию](#Как_получить_доступ_к_репозиторию)
* [5 В заключение](#В_заключение)

## <a id="С_чего_начать"></a>С чего начать

Прежде всего, вам необходимо желание написать плагин. Без этого никак. Если вы
вообще тикль видите впервые, а плагин хочется (и никто его не пишет), то вам
нужно **огромное желание.**

### <a id="Учите_матчасть"></a>Учите матчасть

#### <a id="Выучите_вы_уже_этот_тикль_не_бойтесь_-_он_несложный"></a>Выучите вы уже этот тикль, не бойтесь — он несложный

Первым практическим шагом станет изучение основ этого самого тикля. В статье
[**Ссылки**](Ссылки.md#Tcl_Tk) есть немало линков на различные ресурсы (в том числе
и русскоязычные) по этому языку. В принципе, чтения книги самого Аустерхаута,
дополненное занятиями, предложенными на [этом сайте,](http://tclstudy.narod.ru/index.html) должно хватить, чтобы начать
мало-мальски в нём разбираться. Ещё один ценный источник информации, который
всегда под рукой — мануалы: например, `man 3tcl if` и `man 3tk frame` (маны
доступны и в интернете, но xterm всё же ближе). Могу вас успокоить — это вам не
си-плюс-плюс, не перл и не питон (не знаю ни одного из этих языков, но могу
голову дать на отсечение — тикль вы выучите на порядок быстрее любого из них).
Спорим, что двух недель вам хватит? ;-P

#### <a id="Изучите_документацию_и_исходники"></a>Изучите документацию и исходники

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

* В принципе, этого уже достаточно, но было бы совсем неплохо пробежаться
  глазами по списку наличествующих ткабберовских скриптов, а также бегло
  проглядеть их внутренности, обращая внимание на названия процедур —
  например, процедура `proc muc::join_group` обрабатывает вход в конференцию,
  а идущая за ней `muc::leave_group` — выход из неё. Не забудьте и про хуки.

* Не знаю, насколько это верно, но мне кажется, что почти любой плагин можно
  написать, надёргав кода из самого Ткаббера и/или других плагинов, развесив
  этот код по своему скрипту и связав его небольшим количеством продуктов
  своей мозговой деятельности, поэтому чем лучше вы ориентируетесь в
  исходниках, тем проще для вас. Если вы не пишете что-нибудь из ряда вон
  выходящее вроде поддержки jingle, скорее всего, так оно и будет. Более того,
  так и надо делать. Зачем изобретать свои детали к велосипеду, когда к вашим
  услугам целый склад? Но чтобы воспользоваться этими деталями, надо знать,
  где они лежат. Для этого надо твёрдо знать, что именно вы хотите сделать,
  каким будет ваш плагин.

* Например, плагин [**Bldjid**](Плагины.md#Bldjid) для забанивания пользователя по
  джиду во всех конференциях, где я админю, я хотел реализовать как команду в
  стиле IRC: /bldjid vasya@pupkin.ru. Если точнее, то сначала я хотел сделать
  диалог вроде того, который появляется, когда вы хотите послать кому-то
  приглашение в конференцию. Но, подумав, что это без подготовки будет
  чересчур геморройно, я выбрал более простой и более эффективный путь.
  Механизм работы IRC-style-команд я взял в плагине
  [**Urlcmd**](Плагины.md#Urlcmd). Поскольку баны тесно связаны с работой в
  конференции, мне понадобилось довольно плотно изучить файл muc.tcl. Не
  обошлось и без заимствований оттуда.

## <a id="Практические_советы"></a>Практические советы

### <a id="Структура_плагина"></a>Структура плагина

#### <a id="Структура_каталога"></a>Структура каталога

Про это коротко, но ясно [**рассказано здесь**](Плагины.md#Анатомия_плагина).

#### <a id="Структура_файла_скрипта"></a>Структура файла скрипта

##### <a id="Информация_о_плагине"></a>Информация о плагине

В самом начале обычно пишутся некоторые данные о плагине и его авторе, в виде
комментариев. Если вы не планируете делать развёрнутое описание плагина в
отдельном файле, можете здесь же вкратце указать, как им пользоваться. Я
поначалу так и сделал. Не забудьте дать свою контактную информацию (мыло,
джаббер).

##### <a id="Задание_пространства_имён"></a>Задание пространства имён

"Во первы́х строка́х письма" [© В. С. В.](http://www.world-art.ru/lyric/lyric.php?id=598)
желательно определить
пространство имён для процедур и переменных плагина, на случай, если вам
взбредёт в голову назвать одну из процедур, к примеру, join\_group (в muc.tcl
есть такая процедура, и, чтобы не возникло путаницы и непонятно откуда
берущихся ошибок, лучше это пресечь уже сейчас). Более того, как советуют
[**знающие люди**](Участник_Kostix.md), если вы точно не знаете зачем вам поступать
по-другому, все процедуры и переменные вашего плагина должны быть в своём
пространстве имён. Также следует помнить, что загрузка плагинов делается кодом,
который выполняется внутри `namespace eval ::plugins`, поэтому 1) собственное
пространство имён не должно быть абсолютным (без веской причины) 2) надо везде
использовать `[namespace current]`, если требуется получить полное имя
переменной/процедуры. Чтобы не ходить далеко за примером, разберу свой плагин.

    namespace eval bldjid {
       ::msgcat::mcload [file join [file dirname [info script]] msgs]
       hook::add generate_completions_hook \
           [namespace current]::command_comps
       hook::add chat_send_message_hook \
           [namespace current]::handle_commands 17
    }

Как видите, для задания пространства имён нужна команда **namespace**. Внутри
фигурных скобок пишется то, что будет действовать в пределах этого
пространства. Например, можно задавать хуки, устанавливать переменные или
подгружать файлы сообщений, как во второй строчке примера. Немного подробнее о
хуках можно почитать [**тут**](Загрузка_настроек.md#Хуки). Обратите внимание, имена
хуков и их обработчиков я стырил из плагина-донора, но, чтобы мои обработчики
не перепутались с оригинальными, к ним спереди прибавляется текущее
пространство имён: при выполнении скрипта <s>`[namespace current]` заместится
на bldjid и получится `bldjid::command_comps`</s> (см. объяснение ниже).

Строго говоря, в том плагине они тоже работают внутри своего пространства,
поэтому с нашими не перепутаются, но лучше сделать всё по-человечески. С
пространствами имён надо быть осторожнее и лучше перестраховываться, добавляя
[namespace current]:: перед именем вызываемой процедуры. Дело в том, что
пространство имён плагина само становится "отпрыском" пространства
имён ::plugins — Это означает, что если вызывать процедуру вот так:

    bldjid::command_comps

мы получим ошибку о неправильном имени этой команды. Так что если быть точнее,
то при выполнении скрипта **`[namespace current]` заместится
на ::plugins::bldjid**. Или можно ещё вызывать процедуру безо всяких
неймспейсов, если вы уверены, что это имя уникально. _Если же вы использовали
какую-то чужую процедуру и не поменяли ей имя, не забудьте про пространство
имён!_

##### <a id="Настройки_плагина"></a>Настройки плагина

Если вы планируете делать плагин настраиваемым, после объявления неймспейса
добавьте необходимые настройки. Вот пара настроек из плагина reversi:

       custom::defgroup Plugins [::msgcat::mc "Plugins options."] -group Tkabber
       custom::defgroup Reversi [::msgcat::mc "Reversi plugin options."] -group Plugins
       custom::defvar options(theme) Checkers \
       [::msgcat::mc "Reversi figures theme."] -group Reversi \
       -type options -values $values \
       -command [namespace current]::load_stored_theme

Смело копируйте эти или другие настройки себе и модифицируйте под свои нужды.

##### <a id="Тело_плагина"></a>Тело плагина

Далее идут процедуры. Как минимум должны иметься процедуры-обработчики ваших
хуков. Нужны ли вам другие — решать вам в зависимости от ваших потребностей,
возможностей и стиля программирования. Вот для примера маленькая
процедура-обработчик, которую я взял из urlcmd и адаптировал под себя:

    proc bldjid::command_comps {chatid compsvar wordstart line} {
       upvar 0 $compsvar comps
       if {!$wordstart} {
           lappend comps {/bldjid } {/unbldjid } {/banjid }
       }
    }

Обратите внимание на пространство имён bldjid, которое идёт перед именем
процедуры (и отделяется от имени двумя двоеточиями). Его надо добавлять ко всем
именам процедур скрипта, которые должны относиться к объявленному неймспейсу.
Почувствуйте разницу: в utils.tcl имена процедур пишутся без пространства,
потому что это базовые процедуры, и они выполняются в базовом пространстве
Ткаббера — :: — и вызываются потом из других скриптов напрямую. Ещё обратите
внимание на команды {/bldjid } {/unbldjid } {/banjid }, которые добавляются в
список comps. Поначалу у меня были только две первые. Когда они заработали, я
решил добавить бан по джиду в текущей комнате. Процедуру-то соответствующую
дописал, а сюда команду добавить забыл и потом долго удивлялся, почему она не
работает :)

Структура стандартного плагина примерно такова, но иногда <s>(например, в плагине
custom-urls.tcl)</s> в самом конце снова объявляется пространство имён, но уже с
другой начинкой.

![(!)](../images/Hammer.png) **Сделать:** Уточнить и рассказать про это.

### <a id="Анализируйте_чужой_код_и_не_бойтесь_экспериментировать"></a>Анализируйте чужой код и не бойтесь экспериментировать

#### <a id="Закончим_анализ_разбиравшегося_плагина"></a>Закончим анализ разбиравшегося плагина

Вторая процедура — `bldjid::handle_commands` — тоже обработчик хука (помните
объявление пространства имён?). Её начало я тоже слямзил из urlcmd.tcl, а
остальное — из muc.tcl. В процессе допиливания чужого кода выяснилось, что мне
нужны ещё процедуры. Для команды /unbldjid мне идеально подошла внешняя:
`muc::unban`, и я просто вызываю её в цикле. Так что разбанивание у меня
заработало раньше забанивания :)

С баном вышло посложнее: я не знал, как лучше всё сделать, и поначалу пошёл по
неправильному пути — начал изучать процедуры запроса, получения и отсылки
чёрного списка (последняя из них — `muc::send_list`). Процедуры большие и
выглядят довольно кошмарно (для новичка), но самое главное, что мне не
нравилось — это необходимость вытягивать весь список только для того, чтобы
прибавить к нему своего пациента и отправить весь список снова на сервер. Очень
нерационально! И тут мне случайно на глаза попался такой комментарий в
процедуре-обработчике `muc::change_item_param`, который обрабатывает команды
Ткаббера /ban, /kick, /admin и другие: _For unknown reason banning request MUST
be based on user's bare JID (which may be not known by admin)._ "Опа, — подумал
я, — так значит, серверу всё-таки шлётся реальный джид пользователя, а не
room@conference.jabber.ru/nick". Так что я просто забрал остатки кода после
этого комментария и сделал из него свою процедуру, выкинув ненужное. Также мне
пришлось наприсать свою процедуру проверки на ошибку, основывающуюся на
`muc::test_error_res`, потому что оригинальная меня не устраивала. Процедура
отсылки бана вызывается один раз, если у нас команда /banjid (её я добавил
позже, когда всё заработало), и в цикле, если команда — /bldjid. Вот,
собственно, и всё.

Ну или почти всё. Плагин работает, но его можно чуть-чуть доделать. Сейчас он
шлёт запросы на бан тупо во все комнаты, где я нахожусь. Но админю-то я не во
всех. Это означает лишний трафик для меня и лишнюю нагрузку на сервер. Значит,
мне надо как-то отфильтровать те комнаты, где я имею права админа. Тут, как
может показаться, заколдованный круг: чтобы узнать, админю ли я в комнате, надо
спросить у сервера. А это как раз лишний трафик и лишний пинок серверу. Но если
подумать хорошо, то мы ведь уже знаем, что если я в ростере комнаты сижу в
группе "Модераторы", то значит, и права тут имею модераторские. Так что надо
проверить ростер каждой конференции и выбрать лишь нужные. Вот и обозначилось
направление для поисков — найти, где рисуется ростер конференции, и выдрать
оттуда нужный код :) На самом деле всё немного сложнее, потому что я могу быть
не админом, а модератором — я буду находиться в группе модеров, но банить не
смогу. Небольшие издержки, но соотношение "количество работы/результат"
получается неплохое. Ещё потребуется добавить исключение комнат вида
`channel%irc.server1.ru@irc.server2.com`, чтобы запросы не слались в комнаты,
не поддерживающие стандарт MUC. Тут уже, скорее всего, придётся писать свой
парсер.

### <a id="Отладка"></a>Отладка

#### <a id="Спешка_нужна_лишь_при_ловле_блох"></a>Спешка нужна лишь при ловле блох

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

![(!)](../images/Hammer.png) **Сделать:** Развить, если необходимо.

![(!)](../images/Hammer.png) **Сделать:** Вкратце написать про ::plugins::debug.

#### <a id="Консоль_Ткаббера_-_наше_всё"></a>Консоль Ткаббера — наше всё

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

    source "/путь/содержащий пробелы/к/вашему/плагину/coolplugin.tcl"

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

    namespace exists ::bldjid

Если ответ — 1, всё должно быть в порядке. Если 0, где-то косяки (<s>в ДНК</s>
в коде, скорее всего — может, вы ошиблись в имени команды, и теперь Ткаббер "не
узнаёт" то, что вы ему подсовываете; при этом, кстати, команда выведется в
чате, как простое сообщение).

На первых порах очень неплохо быть в курсе того, что у вас попадает в
переменные. Воспользуйтесь командой puts. Например, мы хотим узнать,
действительно ли все конференции попали в список.

       foreach tmpchatid [lsort [lfilter chat::is_groupchat [chat::opened $xlib]]] {
           lappend groupjids [chat::get_jid $tmpchatid]
       }
       puts $groupjids

Результат действия этой команды будет выведен прямо в консоли. Ничто не мешает
вам трассировать таким образом состояние переменных других скриптов Ткаббера.
Просто добавьте печать нужной переменной в нужном месте, сохраните файл и не
забудьте подгрузить его. Ещё одна удобная для тестирования команда — return
stop. Если её поставить в вышеприведённом примере после puts, то дальнейшее
выполнение кода прекратится. Полезно, когда сначала хочется отладить один кусок
кода, не заморачиваясь на другом.

**Внимание:** _Команда puts полезна, но не забудьте перед релизом их все
убрать, иначе их вывод будет валиться в .xsession-errors пользователей плагина,
что вряд ли кого-то обрадует._

Хоть консоль Ткаббера и является отличным отладочным инструментом, живого
тестирования она заменить не может. Ваш покорный слуга погонял свой плагин,
загруженный в Ткаббер через консоль, радостно выложил его сюда на вики, но
когда через несколько дней дело дошло до реального масштабного бана, выскочила
ошибка. В результате у автора плагина прибавилось ума, и он решил развить тему
пространства имён (наверное, вы уже про это прочитали выше).

![(!)](../images/Hammer.png) **Сделать:** Рассказать про return -code break

#### <a id="Побольше_тестируйте"></a>Побольше тестируйте

Прежде чем выкладывать плагин на общее обозрение, погоняйте его самостоятельно.
Проверьте его работу в нескольких версиях Ткаббера (svn и хотя бы одной-двух из
последних стабильных) и на разных тиклях (8.5, 8.4 как минимум). Возможно, вы
воткнули где-то команду, которая есть в одной версии языка или Ткаббера и нет в
других. Решайте сами, что вам нужно: совместимость с ними или более продвинутый
программинг/функциональность. В случае сомнений посоветуйтесь со
[**знающими**](Участник_Kostix.md) [**людьми**](Участник_Teo.md). Скорее всего, можно и
рыбку съесть, и на ёлку влезть, то есть, разрулить ситуацию так, что и
совместимость не пострадает, и работать всё будет хорошо.

Пробуйте вводить нестандартные параметры, левые символы, и вообще создавать
экстремальные условия для вашего скрипта. Например, для отсеивания каналов IRC
я в проверочном условии использовал поиск вхождения в имя символа процента,
поскольку такие комнаты работают через транспорт:
`somechannel%someserver.ru@irc.server.org`. Однако потом я подумал (и это
подтвердилось на практике), что и обычная MUC-комната может иметь знак процента
в имени. Поэтому я доработал проверку таким образом:

       foreach tmpchatid [lsort [lfilter chat::is_groupchat [chat::opened $xlib]]] {
           set tmpgrp [chat::get_jid $tmpchatid]
           if {([lindex [bldjid::whoami $xlib $tmpgrp] 1] == "admin" \
           || [lindex [bldjid::whoami $xlib $tmpgrp] 1] == "owner") \
           && ![string match *%*@*irc* $tmpgrp]} {
               lappend groupjids $tmpgrp
           }
       }

Предполагается, что в имени транспорта обязательно должно присутствовать слово
irc (иначе мы просто не догадаемся, что это IRC-транспорт), то есть, в
теперешнем виде скрипт пропустит комнату `mirc%room@conference.jabber.ru` и не
пропустит комнату `channel%someserver.org@irc.putyourserverhere.ru`. Кстати,
скрипт в этом виде тормознёт и комнату `mirc%room@conference.mirc.com`
(представим себе на мгновение, что на этом сайте есть джаббер-сервер), поэтому
проверку следует изменить на \*%\*@irc\* (точку после слова irc вылавливать не
надо, на случай, если транспорт называется irctransport.server.org). Теперь
максимум, что может случиться — если имя транспорта _не начинается_ на "irc"
(что очень маловероятно), то тогда, отправив запрос на бан в эту комнату, мы
получим сообщение об ошибке.

Это лишь один пример. Напрягите фантазию, думайте за дурака-пользователя,
предполагайте, что он может сморозить.

#### <a id="Научитесь_пользоваться_системой_управления_версиями"></a>Научитесь пользоваться системой управления версиями

Не поленитесь поставить и освоить что-нибудь вроде
[subversion](http://subversion.tigris.org/). Эта штука избавит вас от великой
головной боли на тему "Блин, как уж я там позавчера эту хрень сделал? Сейчас бы
мне этот кусок сюда, да потёр и не сохранил ту версию". Совсем не обязательно
сходу просить допуск к репозиторию на xmpp.ru (особенно если у вас нет опыта
работы с svn). Устройте себе локальный сервер: и от головной боли избавитесь, и
работать с сабвершеном научитесь. Если вы считаете, что ваше творение должно
находиться в общем репозитории [svn.xmpp.ru](http://svn.xmpp.ru), читайте
дальше — там рассказано о его устройстве и о том, как получить к нему доступ.
Врочем, ради одного плагина не стоит сильно заморачиваться. Выложите его на
вики — делов-то.

([**kostix**](Участник_Kostix.md) замечает, что для _локальной_ работы над проектом
значительно удобнее Subversion использовать какого-нибудь представителя
семейства
[распределённых систем управления версиями (DVCS)](http://en.wikipedia.org/wiki/Distributed_Version_Control_System),
например, [Bazaar](http://bazaar-vcs.org/),
[Mercurial](http://www.selenic.com/mercurial), [Git](http://git.or.cz),
[Darcs](http://darcs.net), [Monotone](http://monotone.ca) и т.п. — они
позволяют лихо жонглировать кодом, не завися от центрального сервера.)

([**bigote**](Участник_Bigote.md) восторженно соглашается — не так давно
освоенный им в минимальных количествах Git значительно упростил мышиную возню с
кодом на десктопе. Но если вы планируете в конце концов поместить свой плагин в
репозиторий tkabber-3rd-party-plugins, то лучше сразу вести разработку под svn
или на крайний случай сделать это перед его публикацией туда, сначала
экспортнув код из локального репозитория. Конечно, есть обвязки, позволяющие

публиковать из git в svn, к примеру, но они не про нас, простых смертных
начинающих плагинописателей ;). Вот, кстати,
[интересная притча](http://edward13.livejournal.com/26550.html)
(во всех переводах названная почему-то басней), простыми словами рассказывающая
о мощи git.)

### <a id="Тонкости"></a>Тонкости

Здесь я попытаюсь рассказать о некоторых подводных камнях, на которые будет
частенько находить ваша коса в процессе доведения плагина до ума. Моя, во
всяком случае, на них натыкается преизрядно.

#### <a id="Хуки_и_return_stop"></a>Хуки и return stop

Есть тонкая разница между командами `return` и `return stop` — первая не
прерывает выполнения хука, если процедура, в которой она встретилась, является
его обработчиком. Поясню на примере того же плагина Bldjid. Он разросся, и
теперь там есть процедура smart\_enter\_exit\_message, которая обрабатывает хук
client\_presence\_hook (который срабатывает, когда кто-нибудь меняет своё
состояние либо заходит в комнату). Я по незнанию понаставил в некоторые
проверки внутри этой процедуры `return stop` вместо `return`, и в результате
при определённых условиях перестал показываться ростер конференции, да и другие
странности в работе Ткаббера появились. Дело было как раз в том, что вместо
того, чтобы мирно завершить свою работу и отдать бразды правления другим
обработчикам, эта процедура обрывала хук, и само собой, никто уже не заполнял
ростер группы.

Сложно дать готовый рецепт на все случаи жизни, но можно посоветовать подходить
с осторожностью к использованию `return stop` в обработчиках хуков. В обычных
процедурах наоборот, лучше перестраховаться. Я только что попробовал позаменять
все стопы на обычные return в теле простых процедур — результат плачевный:
команды-то выполняются, но потом их текст выводится в общий чат, что нам
совершенно не нужно.

### <a id="Делаем_плагин_динамически_подключаемым"></a>Делаем плагин динамически подключаемым

С появлением в Ткаббере Менеджера плагинов жизнь пользователя стала намного
проще. Чтобы подключить нужный плагин, достаточно сделать несколько кликов
(**Настройки → Plugins Management → отметить галочкой нужный плагин → сохранить
настройку**). Естественно, сам плагин перед этим всё равно должен быть помещён
в соответствующее место, но согласитесь, что это значительный шаг вперёд, тем
более, что, сняв эту галочку, плагин можно _частично_ из памяти выгрузить.
Почему частично? Не буду забегать вперёд, начну по порядку.

#### <a id="Добавляем_в_namespace_код_для_запуска_процедур_загрузки_и_выгрузки"></a>Добавляем в namespace код для запуска процедур загрузки и выгрузки

    if {![::plugins::is_registered bldjid]} {
        ::plugins::register bldjid \
                -namespace [namespace current] \
                -source [info script] \
                -description [::msgcat::mc "Whether the Bldjid plugin is loaded."] \
                -loadcommand [namespace code load] \
                -unloadcommand [namespace code unload]
        return
    }

Помещать его следует в самом начале неймспейса, но _после
строки_ ::msgcat::mcload [file join [file dirname [info script]] msgs], если
таковая у вас имеется, иначе не загрузится локализованный текст пояснительной
строчки. Как видите, тут всё просто. Вам надо только поменять слово bldjid на
название вашего плагина (должно совпадать с именем его каталога).

#### <a id="Создаём_эти_самые_процедуры_загрузки_и_выгрузки"></a>Создаём эти самые процедуры загрузки и выгрузки

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

* Почти наверняка ваш плагин использует хуки. _Все_ хуки плагина (не только из
  неймспейса, но и из его тела тоже) должны быть собраны в процедуре загрузки.
* Скорее всего у вас есть и парочка глобальных переменных. Их тоже имеет смысл
  засунуть сюда.
* Если плагин использует сочетания клавиш (как, например, Ctrl-m в Bldjid для
  показа/скрытия монитора), их тоже стоит перенести сюда.
* Редко, но иногда может понадобиться выполнить какие-то действия. Смотрите
  пример чуть ниже.

##### <a id="Процедура_загрузки"></a>Процедура загрузки

Рассмотрим разбираемый в этой статье плагин Bldjid:

    proc bldjid::load {} {
    # A variable where the last query result is stored.
           variable user_list
    # An array where all user entrances are stored.
           global jids_by_chats
           variable ent_cntr 1
           event add <<ToggleMonitor>> <Control-m>

           hook::add generate_completions_hook \
           [namespace current]::visitors_compls
           hook::add chat_send_message_hook \
           [namespace current]::handle_commands 17
           ::hook::add open_chat_post_hook [namespace current]::setup_bindings
           hook::add client_presence_hook \
           [namespace current]::smart_enter_exit_message 69
           hook::add room_nickname_changed_hook \
           [namespace current]::smart_enter_exit_message 51
    }

* Как видите, здесь присутствуют все три упомянутых элемента: и хуки, и
  переменные, и привязка сочетания клавиш к событию.

    ![(!)](../images/Hammer.png) **Сделать:** Пояснить, как всё это работает
    (надо мало-мало разобраться в этом самому).
  
    Какие именно переменные
    переносить сюда — решать вам. Имеет смысл переносить глобальные (которые
    объявлены с помощью global и variable). Также можно грузить здесь
    переменные, находящиеся в процедуре объявления неймспейса, установленные
    командой set (чтобы потом при выгрузке прибить их командой unset, которую мы
    увидим ниже):

        set verbosity [list min [::msgcat::mc "Minimum:\
        Log each entrance or nick change of a unique pair nick/jid only once per room\
        (less memory used)."]\
        max [::msgcat::mc "Maximum: All entrances of each user will be logged."]]

        set matching_rules [list \
        exact [::msgcat::mc "Exact match."]\
        loose [::msgcat::mc "Loose match."]]

* В моём плагине нет действий, которые имеет смысл делать во время процедуры
  загрузки, но такое дело есть в плагине attline, откуда я привожу следующий
  кусочек кода, идущий после объявления хуков:

        foreach chatid [chat::opened] {
            setup_chat_win $chatid ""
        }

##### <a id="Теперь_о_процедуре_выгрузки"></a>Теперь о процедуре выгрузки

    proc bldjid::unload {} {
           variable user_list
           global jids_by_chats
           variable ent_cntr
           event delete <<ToggleMonitor>> <Control-m>

           hook::remove generate_completions_hook \
           [namespace current]::visitors_compls
           hook::remove chat_send_message_hook \
           [namespace current]::handle_commands 17
           ::hook::remove open_chat_post_hook [namespace current]::setup_bindings
           hook::remove client_presence_hook \
           [namespace current]::smart_enter_exit_message 69
           hook::remove room_nickname_changed_hook \
           [namespace current]::smart_enter_exit_message 51

           catch {unset ent_cntr}
           catch {unset user_list}
           catch {unset jids_by_chats}

           foreach chatid [chat::opened] {
                   clear_monitor $chatid
                   set ccw [::chat::winid $chatid]
                   if {![catch {pack info $ccw.mon} res]} {
                           pack forget $ccw.mon $ccw.vsb
                   }
           }
    }

* В её начале, как и в начале любой процедуры, снова объявляются глобальные
  переменные. Нам их надо потом будет прибить, и если мы их не объявим, они
  _не будут удалены командой unset,_ хотя и ошибки никакой не выскочит —
  можете сами в этом убедиться, закомментировав объявление variable ent\_cntr
  и запустив Ткаббер. Убедитесь, что плагин включен, зайдите в какую-нибудь
  населённую комнату, откройте консоль Ткаббера и наберите в ней `puts
  $plugins::bldjid::ent_cntr` — вы увидите число участников, увеличенное на
  единицу. Теперь выгрузите плагин с помощью Менеджера и снова проверьте
  состояние переменной. Она содержит всё то же число. Если бы она была
  объявлена, вы получили бы сообщение об ошибке, что этой переменной не
  существует (что означало бы, что она стёрта из памяти). Я расписываю это так
  подробно потому, что не так давно в конференции как раз задавались вопросы
  на тему "зачем объявлять переменные, если мы сейчас их убьём".
   * Удаление некоторых переменных, возможно, большого выигрыша не даст
     (кроме, разве что, морального удовлетворения), но, например, переменная
     jids\_by\_chats при параноидальных настройках за несколько дней сидения в
     людных комнатах может изрядно распухнуть.

* Затем я поместил удаление привязки горячих клавиш к событию (в данном
  примере: копируем строчку `event add <<ToggleMonitor>> <Control-m>` из
  процедуры загрузки и меняем add на delete).
* Далее идёт удаление хуков. Копируем хуки из процедуры load и заменяем add на
  remove.
* После этого идёт удаление переменных, на всякий случай обёрнутое в catch {}
* И в самом конце я делаю последнюю проверку на случай, если в какой-то
  конференции осталось открытым окошко монитора (его надо закрыть программно,
  ведь сочетание клавиш мы отключаем, и если где-нибудь останется болтаться
  окошко монитора, пользователь хороших слов о вас не подумает). Для этой
  проверки у нас есть цикл foreach, в котором мы сначала принудительно чистим
  окошки монитора (некоторые могут быть закрытыми, но содержать текст), а
  затем смотрим, есть ли открытый монитор, и если да — закрываем его.
  Финальные действия могут быть и сложнее. Например, в игровых плагинах
  процедура выгрузки закрывает окно с партией игры, если оно было открыто, и
  прибивает все загруженные в память элементы доски (всю графику) и делает
  много других подобных вещей.

Естественно, вам лучше знать, что ваш плагин делает и что нет. Соответственно,
в зависимости от его сложности могут упроститься или усложниться процедуры
загрузки и выгрузки.

#### <a id="Возможна_ли_полная_выгрузка_плагина_из_памяти"></a>Возможна ли полная выгрузка плагина из памяти?

На сегодняшний день выгрузка плагина из памяти ограничена лишь хуками,
переменными и событиями, о чём я уже написал. Однако в памяти остаётся ещё
немало:

* Настройки плагина (выключите какой-нибудь в Менеджере плагинов и сходите в
  раздел Plugins — его настройки продолжают болтаться там!
* Код плагина (если разработчик позаботился и запихал всё в свой неймспейс,
  задача его удаления переводится из разряда невозможных в разряд
  трудновыполнимых).
* На диске могут остаться временные файлы.
* Прочие ресурсы, созданные кодом во время выполнения (а не определённые
  статически в тексте плагина).

Из беседы с разработчиками мне удалось узнать следующее (цитирую):

* _По-моему, выгрузка есть полное изничтожение плагина, включая `namespace
  delete ::plugins::pluginname`._
* _Переменные в настройках регистрируются через `custom::defvar` — Ткаббер же
  не святым духом про них узнаёт._
* _Прибить настройки, наверное, можно, если есть
  `custom::противоположное_defvar` :)_
* _Тебе ничего не мешает убить свой неймспейс (как автору плагина), но грох
  неймспейса с живыми переменными кастомайза в нём может дать интересный
  эффект._
* _Вообще, плагин должен знать, что он наделал, и уметь отнаделывать это
  обратно. Это ж стандартно. Например, плагин receipts создаёт несколько
  картинок (из файлов) и лепит их в окна. При выгрузке логично чтобы он
  сначала удалял свои картинки из всех чатов, а потом грохал их._

Так что если обозначить планы для дальнейших исследований, их можно свести к
четырём рекомендациям:

1. Изучить механизм `custom::defvar` и попробовать написать
   `custom::противоположное_defvar`.
1. Если заниматься этим ломает, можно попробовать провести эксперимент: сделать
   `namespace delete ::plugins::pluginname` при живых переменных кастомайза и
   посмотреть, что получится; при этом подразумевается, что весь код плагина
   упрятан в его неймспейс;
1. Если плагин создавал какие-то свои временные файлы на диске, не забывать
   удалять их при выгрузке (не путайте это с логами, которые создаются для
   пользователя! если ему надо будет их убить, он убьёт их сам).
1. Не забывать про открытые окна и прочие ресурсы, создаваемые плагином — я уже
   показал, как делается проверка на предмет забытых окошек монитора; кроме того,
   вы можете изучить процедуры выгрузки игровых плагинов: chess, reversi и т. д. —
   если выключить плагин, когда открыта партия, её окно закроется (сначала плагин
   удаляет из памяти всю свою графику, как об этом уже было сказано выше).

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

Вот, собственно, и всё. Если у меня появятся результаты исследований описанных
выше проблем, я непременно их здесь выложу. Призываю сделать то же самое и вас.

### <a id="Не_бойтесь_задавать_вопросы"></a>Не бойтесь задавать вопросы

Один вопрос специалисту сэкономил мне несколько часов напрасной работы. Камрад
[**kostix**](Участник_Kostix.md) подсказал мне простое решение проблемы, как
узнать, в какой комнате я админю. А ещё через минуту и процедурку сваял:

    proc whoami {xlib where} {
       set chatid [chat::chatid $xlib $where]
       set jid $where/[get_our_groupchat_nick $chatid]
       list $muc::users(role,$xlib,$jid) $muc::users(affiliation,$xlib,$jid)
    }

Конечно, задавая вопросы, следует помнить о простых правилах, изложенных в
[**этой статье**](Остров_посланных_на....md). На всякий случай напомню основные:

* Попробуйте решить проблему самостоятельно и в вопросе изложите шаги, вами
  предпринятые. Потенциальный помощник это оценит.
* Спешка нужна лишь при ловле блох. Это ведь не горящий проект, так? Да если и
  горящий, кому до этого какое дело? У всех свои заботы — кризис на дворе. От
  этого плагина не зависит судьба человечества? (Если зависит, какого чёрта вы
  сами столько с ним тянули?) Так что если вам не отвечают сразу, наберитесь
  терпения.
* В комментариях к коду не забудьте выразить благодарность этому человеку.
  Если он, помогая вам, написал половину или даже хотя бы треть плагина,
  можете смело включать его в соавторы.

## <a id="Общие_сведения_о_репозитории"></a>Общие сведения о репозитории

Для разработки неофициальных проектов, имеющих отношение к Ткабберу (и в том
числе — плагинов), был создан специальный репозиторий
[Subversion](http://subversion.tigris.org):

    svn.xmpp.ru/repos/tkabber-3rd-party/

то есть он расположен "рядом" с официальным репозиторием Ткаббера и
поддерживает такие же две схемы доступа: **http** и **https**.

Основная структура репозитория на данный момент такова:

    svn.xmpp.ru/repos/tkabber-3rd-party/
      trunk/
        plugins/
      tags/
      branches/

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

    svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins

а их "ветки" делаться где-то под

    svn.xmpp.ru/repos/tkabber-3rd-party/branches/

Формат веток, в принципе, не важен. Например, юзер vasya может делать ветки в

     svn.xmpp.ru/repos/tkabber-3rd-party/branches/vasya/mycoolplugin/testing-stuff

а может — в

    svn.xmpp.ru/repos/tkabber-3rd-party/branches/plugins/mycoolplugin/testing-other-stuff

Можно и весь "куст" под **trunk'**ом копировать под **branches** —
[ветки в Subversion дёшевы](http://svnbook.red-bean.com/en/1.2/svn.branchmerge.using.html#svn.branchmerge.using.create)
и не зависят от формального объёма копируемой части дерева.

Идея состоит в том, чтобы _не_ иметь "побочных" каталогов в каталогах с
плагинами. Это позволит любому пользователю выполнить

    svn co https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins .

и получить себе полный набор "готовых к употреблению" плагинов.

## <a id="Как_получить_доступ_к_репозиторию"></a>Как получить доступ к репозиторию

1. Заиметь некий готовый код или хотя бы внятную идею, которые можно будет
   предъявить в качестве доказательства стремления быть допущеным к репозиторию;
1. Связаться с [**Kostix**](Участник_Kostix.md);
1. Выбрать себе имя пользователя и пароль. Пароль можно сообщить "открытым
   текстом" (как есть) или сгенерировать на нём "хэш для htpasswd". Сие делается
   либо при помощи программы **htpasswd** из комплекта Web-сервера
   [Apache](http://www.apache.org) путём запуска её в виде

        htpasswd -n USERNAME

    или при помощи
    [этой Web-формы](http://tkabber.jabber.ru/files/tkabber-contribs/htpasswd.php);
1. Подождать, пока вас не допустят к телу репозитория, о чём
[**Kostix**](Участник_Kostix.md) вам сообщит;
1. Сделать, к примеру,
   
        svn --username myusername mkdir https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/myplugin

    и убедиться в том, что репозиторий позволил вам сделать изменение в нём, то
    есть аккаунт создан правильно.

## <a id="В_заключение"></a>В заключение

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

Удачи вам! И ничего не бойтесь :)



>





|
<
<
<
<




|
|
|

|
|
|
>
>
>
>
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|




|
<
|
<
<

|

|

|
<
<
<
<
<
<
<
<
<

|

<
|
<
<
<
<
<
<
<

|
<
<
<
<

|
<
<
<
<
<
<
<
<
<

<
|
<
<
<
<
<
<
<
<

|
<
|

|

|

|

|

|
<
<
<
<

|

|
<
<
<
<
<
<
<
<
<
<
<
<









|
<
<
<
<
<
<
<
<

|
<
<
<
<
<



|
<
<
<
<
<

|

|
<








|

|

|
<
<
<








|
<
<
<
<
<
<
<
<
<
<

|
<
<

<
<
|

|

|
<
<
<
<
<

|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<

|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<

|

|

|
<
<
<
<
<
<

<
<
|

|

|
<
<
<



|
<
<
<
<



|
<
<
<

|
<
<






|
<
<
<
<
<
<

|
<
<

|
<
<
<
<
<

|

|

|
<
<
<
<
<
<
<
<

|
<
<
<
<
<
<










|
<
<
<
<
<
<
<
<
<
<

|
<

|

|
<
<
<
<
<
<
<
<
<
<

|
<
<
<
<
<
<
<

<
|
|
<
<
<
>
<
<
<
<
<

<
<
|
<
<

|

|
<
<
<
<
<
<
<
<
<
<
<

|
<
<
<
<
<

|

|
<
<
<
<
<
<

|











|
<
<
<
<

|

|
<
<

|
<
|
<
|
<
|
<

|

|








|











|
<

<
<
<
<
<
<
<
<
<
<
|
|
|
|
|
|
|
|

|
<
<

|
|
|

|






|









|



|









|
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<
|
|
<
<
|
<
|
|
<
<
<
<
<
<
<
<
<
<

|
<
<

|

|
<
<

|
<
|
<
<
|
|
<

|
|
|
<
|
<
|
<
|
<
<
|
<
<
<
|
|
<

|
<
<
|
<
<
|
<
<
|
<
<
<
<

|
<
<
<
<

|
<

|

|
<
<







|
<

|
<
|
<
<
<
<
|
<
<

|
<
|
<
<



|
<

|







|



|



|



|



|
<
<

|
<



|

|
<
|
<
|
|
<
<
<
<
|
<
<
|
|
<
|
<
|
<
|
<

|
<
|
<
<
<
<

|
>
>
1
2
3
4
5
6
7
8




9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

45


46
47
48
49
50
51









52
53
54

55







56
57




58
59









60

61








62
63

64
65
66
67
68
69
70
71
72
73
74




75
76
77
78












79
80
81
82
83
84
85
86
87
88








89
90





91
92
93
94





95
96
97
98

99
100
101
102
103
104
105
106
107
108
109
110
111



112
113
114
115
116
117
118
119
120










121
122


123


124
125
126
127
128





129
130

















131
132
















133
134
135
136
137
138






139


140
141
142
143
144



145
146
147
148




149
150
151
152



153
154


155
156
157
158
159
160
161






162
163


164
165





166
167
168
169
170
171








172
173






174
175
176
177
178
179
180
181
182
183
184










185
186

187
188
189
190










191
192







193

194
195



196





197


198


199
200
201
202











203
204





205
206
207
208






209
210
211
212
213
214
215
216
217
218
219
220
221
222




223
224
225
226


227
228

229

230

231

232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256

257










258
259
260
261
262
263
264
265
266
267


268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304












305



306
307


308

309
310










311
312


313
314
315
316


317
318

319


320
321

322
323
324
325

326

327

328


329



330
331

332
333


334


335


336




337
338




339
340

341
342
343
344


345
346
347
348
349
350
351
352

353
354

355




356


357
358

359


360
361
362
363

364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389


390
391

392
393
394
395
396
397

398

399
400




401


402
403

404

405

406

407
408

409




410
411
412
413
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Разработка_плагинов/index.html)


# Разработка плагинов

Материал из Tkabber Wiki

В этой статье будет сделана попытка раскрыть волнующую многих тему написания собственного плагина. Автор практического пособия (первых двух разделов статьи) — ещё <s>плохой охотник</s> неопытный плагинописатель, зато его набитые шишки и взгляд на вещи глазами новичка может помочь таким же начинающим. Впрочем, поправки принимаются. 





## <a id="toc"></a>Содержание

* [1 С чего начать](#С_чего_начать)
 * [1.1 Учите матчасть](#Учите_матчасть)
  * [1.1.1 Выучите вы уже этот тикль, не бойтесь — он несложный](#Выучите_вы_уже_этот_тикль_не_бойтесь_-_он_несложный)
  * [1.1.2 Изучите документацию и исходники](#Изучите_документацию_и_исходники)
* [2 Практические советы](#Практические_советы)
 * [2.1 Структура плагина](#Структура_плагина)
  * [2.1.1 Структура каталога](#Структура_каталога)
  * [2.1.2 Структура файла скрипта](#Структура_файла_скрипта)
   * [2.1.2 Информация о плагине](#Информация_о_плагине)
   * [2.1.2 Задание пространства имён](#Задание_пространства_имён)
   * [2.1.2 Настройки плагина](#Настройки_плагина)
   * [2.1.2 Тело плагина](#Тело_плагина)
 * [2.2 Анализируйте чужой код и не бойтесь экспериментировать](#Анализируйте_чужой_код_и_не_бойтесь_экспериментировать)
  * [2.2.1 Закончим анализ разбиравшегося плагина](#Закончим_анализ_разбиравшегося_плагина)
 * [2.3 Отладка](#Отладка)
  * [2.3.1 Спешка нужна лишь при ловле блох](#Спешка_нужна_лишь_при_ловле_блох)
  * [2.3.2 Консоль Ткаббера — наше всё](#Консоль_Ткаббера_-_наше_всё)
  * [2.3.3 Побольше тестируйте](#Побольше_тестируйте)
  * [2.3.4 Научитесь пользоваться системой управления версиями](#Научитесь_пользоваться_системой_управления_версиями)
 * [2.4 Тонкости](#Тонкости)
  * [2.4.1 Хуки и return stop](#Хуки_и_return_stop)
 * [2.5 Делаем плагин динамически подключаемым](#Делаем_плагин_динамически_подключаемым)
  * [2.5.1 Добавляем в namespace код для запуска процедур загрузки и выгрузки](#Добавляем_в_namespace_код_для_запуска_процедур_загрузки_и_выгрузки)
  * [2.5.2 Создаём эти самые процедуры загрузки и выгрузки](#Создаём_эти_самые_процедуры_загрузки_и_выгрузки)
   * [2.5.2 Процедура загрузки](#Процедура_загрузки)
   * [2.5.2 Теперь о процедуре выгрузки](#Теперь_о_процедуре_выгрузки)
  * [2.5.3 Возможна ли полная выгрузка плагина из памяти?](#Возможна_ли_полная_выгрузка_плагина_из_памяти)
 * [2.6 Не бойтесь задавать вопросы](#Не_бойтесь_задавать_вопросы)
* [3 Общие сведения о репозитории](#Общие_сведения_о_репозитории)
* [4 Как получить доступ к репозиторию](#Как_получить_доступ_к_репозиторию)
* [5 В заключение](#В_заключение)

# <a id="С_чего_начать"></a>С чего начать

Прежде всего, вам необходимо желание написать плагин. Без этого никак. Если вы вообще тикль видите впервые, а плагин хочется (и никто его не пишет), то вам нужно **огромное желание.** 



## <a id="Учите_матчасть"></a>Учите матчасть

### <a id="Выучите_вы_уже_этот_тикль_не_бойтесь_-_он_несложный"></a>Выучите вы уже этот тикль, не бойтесь — он несложный

Первым практическим шагом станет изучение основ этого самого тикля. В статье [Ссылки](Ссылки.md#Tcl_Tk) есть немало линков на различные ресурсы (в том числе и русскоязычные) по этому языку. В принципе, чтения книги самого Аустерхаута, дополненное занятиями, предложенными на [этом сайте,](http://tclstudy.narod.ru/index.html) должно хватить, чтобы начать мало-мальски в нём разбираться. Ещё один ценный источник информации, который всегда под рукой — мануалы: например, `man 3tcl if` и `man 3tk frame` (маны доступны и в интернете, но xterm всё же ближе). Могу вас успокоить — это вам не си-плюс-плюс, не перл и не питон (не знаю ни одного из этих языков, но могу голову дать на отсечение — тикль вы выучите на порядок быстрее любого из них). Спорим, что двух недель вам хватит? ;-P 










### <a id="Изучите_документацию_и_исходники"></a>Изучите документацию и исходники


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








*  В принципе, этого уже достаточно, но было бы совсем неплохо пробежаться глазами по списку наличествующих ткабберовских скриптов, а также бегло проглядеть их внутренности, обращая внимание на названия процедур — например, процедура `proc muc::join_group` обрабатывает вход в конференцию, а идущая за ней `muc::leave_group` — выход из неё. Не забудьте и про хуки. 





*  Не знаю, насколько это верно, но мне кажется, что почти любой плагин можно написать, надёргав кода из самого Ткаббера и/или других плагинов, развесив этот код по своему скрипту и связав его небольшим количеством продуктов своей мозговой деятельности, поэтому чем лучше вы ориентируетесь в исходниках, тем проще для вас. Если вы не пишете что-нибудь из ряда вон выходящее вроде поддержки jingle, скорее всего, так оно и будет. Более того, так и надо делать. Зачем изобретать свои детали к велосипеду, когда к вашим услугам целый склад? Но чтобы воспользоваться этими деталями, надо знать, где они лежат. Для этого надо твёрдо знать, что именно вы хотите сделать, каким будет ваш плагин. 











*  Например, плагин [Bldjid](Плагины.md#Bldjid) для забанивания пользователя по джиду во всех конференциях, где я админю, я хотел реализовать как команду в стиле IRC: /bldjid vasya@pupkin.ru. Если точнее, то сначала я хотел сделать диалог вроде того, который появляется, когда вы хотите послать кому-то приглашение в конференцию. Но, подумав, что это без подготовки будет чересчур геморройно, я выбрал более простой и более эффективный путь. Механизм работы IRC-style-команд я взял в плагине [Urlcmd](Плагины.md#urlcmd). Поскольку баны тесно связаны с работой в конференции, мне понадобилось довольно плотно изучить файл muc.tcl. Не обошлось и без заимствований оттуда. 









# <a id="Практические_советы"></a>Практические советы

## <a id="Структура_плагина"></a>Структура плагина

### <a id="Структура_каталога"></a>Структура каталога

Про это коротко, но ясно [рассказано здесь](Плагины.md#Анатомия_плагина). 

### <a id="Структура_файла_скрипта"></a>Структура файла скрипта

#### <a id="Информация_о_плагине"></a>Информация о плагине

В самом начале обычно пишутся некоторые данные о плагине и его авторе, в виде комментариев. Если вы не планируете делать развёрнутое описание плагина в отдельном файле, можете здесь же вкратце указать, как им пользоваться. Я поначалу так и сделал. Не забудьте дать свою контактную информацию (мыло, джаббер). 





#### <a id="Задание_пространства_имён"></a>Задание пространства имён

"Во первы́х строка́х письма" [© В. С. В.](http://www.world-art.ru/lyric/lyric.php?id=598) желательно определить пространство имён для процедур и переменных плагина, на случай, если вам взбредёт в голову назвать одну из процедур, к примеру, join\_group (в muc.tcl есть такая процедура, и, чтобы не возникло путаницы и непонятно откуда берущихся ошибок, лучше это пресечь уже сейчас). Более того, как советуют [знающие люди](Участник_Kostix.md), если вы точно не знаете зачем вам поступать по-другому, все процедуры и переменные вашего плагина должны быть в своём пространстве имён. Также следует помнить, что загрузка плагинов делается кодом, который выполняется внутри `namespace eval ::plugins`, поэтому 1) собственное пространство имён не должно быть абсолютным (без веской причины) 2) надо везде использовать `[namespace current]`, если требуется получить полное имя переменной/процедуры. Чтобы не ходить далеко за примером, разберу свой плагин. 













    namespace eval bldjid {
       ::msgcat::mcload [file join [file dirname [info script]] msgs]
       hook::add generate_completions_hook \
           [namespace current]::command_comps
       hook::add chat_send_message_hook \
           [namespace current]::handle_commands 17
    }

Как видите, для задания пространства имён нужна команда **namespace**. Внутри фигурных скобок пишется то, что будет действовать в пределах этого пространства. Например, можно задавать хуки, устанавливать переменные или подгружать файлы сообщений, как во второй строчке примера. Немного подробнее о хуках можно почитать [тут](Загрузка_настроек.md#Хуки). Обратите внимание, имена хуков и их обработчиков я стырил из плагина-донора, но, чтобы мои обработчики не перепутались с оригинальными, к ним спереди прибавляется текущее пространство имён: при выполнении скрипта <s>`[namespace current]` заместится на bldjid и получится `bldjid::command_comps`</s> (см. объяснение ниже). 









Строго говоря, в том плагине они тоже работают внутри своего пространства, поэтому с нашими не перепутаются, но лучше сделать всё по-человечески. С пространствами имён надо быть осторожнее и лучше перестраховываться, добавляя [namespace current]:: перед именем вызываемой процедуры. Дело в том, что пространство имён плагина само становится "отпрыском" пространства имён ::plugins — Это означает, что если вызывать процедуру вот так: 






    bldjid::command_comps

мы получим ошибку о неправильном имени этой команды. Так что если быть точнее, то при выполнении скрипта **`[namespace current]` заместится на ::plugins::bldjid**. Или можно ещё вызывать процедуру безо всяких неймспейсов, если вы уверены, что это имя уникально. _Если же вы использовали какую-то чужую процедуру и не поменяли ей имя, не забудьте про пространство имён!_ 






#### <a id="Настройки_плагина"></a>Настройки плагина

Если вы планируете делать плагин настраиваемым, после объявления неймспейса добавьте необходимые настройки. Вот пара настроек из плагина reversi: 


       custom::defgroup Plugins [::msgcat::mc "Plugins options."] -group Tkabber
       custom::defgroup Reversi [::msgcat::mc "Reversi plugin options."] -group Plugins
       custom::defvar options(theme) Checkers \
       [::msgcat::mc "Reversi figures theme."] -group Reversi \
       -type options -values $values \
       -command [namespace current]::load_stored_theme

Смело копируйте эти или другие настройки себе и модифицируйте под свои нужды. 

#### <a id="Тело_плагина"></a>Тело плагина

Далее идут процедуры. Как минимум должны иметься процедуры-обработчики ваших хуков. Нужны ли вам другие — решать вам в зависимости от ваших потребностей, возможностей и стиля программирования. Вот для примера маленькая процедура-обработчик, которую я взял из urlcmd и адаптировал под себя: 




    proc bldjid::command_comps {chatid compsvar wordstart line} {
       upvar 0 $compsvar comps
       if {!$wordstart} {
           lappend comps {/bldjid } {/unbldjid } {/banjid }
       }
    }

Обратите внимание на пространство имён bldjid, которое идёт перед именем процедуры (и отделяется от имени двумя двоеточиями). Его надо добавлять ко всем именам процедур скрипта, которые должны относиться к объявленному неймспейсу. Почувствуйте разницу: в utils.tcl имена процедур пишутся без пространства, потому что это базовые процедуры, и они выполняются в базовом пространстве Ткаббера — :: — и вызываются потом из других скриптов напрямую. Ещё обратите внимание на команды {/bldjid } {/unbldjid } {/banjid }, которые добавляются в список comps. Поначалу у меня были только две первые. Когда они заработали, я решил добавить бан по джиду в текущей комнате. Процедуру-то соответствующую дописал, а сюда команду добавить забыл и потом долго удивлялся, почему она не работает :) 











Структура стандартного плагина примерно такова, но иногда (например, в плагине custom-urls.tcl) в самом конце снова объявляется пространство имён, но уже с другой начинкой. ![(!)](../images/Hammer.png) **Сделать:** Рассказать про это. 





## <a id="Анализируйте_чужой_код_и_не_бойтесь_экспериментировать"></a>Анализируйте чужой код и не бойтесь экспериментировать

### <a id="Закончим_анализ_разбиравшегося_плагина"></a>Закончим анализ разбиравшегося плагина

Вторая процедура — `bldjid::handle_commands` — тоже обработчик хука (помните объявление пространства имён?). Её начало я тоже слямзил из urlcmd.tcl, а остальное — из muc.tcl. В процессе допиливания чужого кода выяснилось, что мне нужны ещё процедуры. Для команды /unbldjid мне идеально подошла внешняя: `muc::unban`, и я просто вызываю её в цикле. Так что разбанивание у меня заработало раньше забанивания :) 






С баном вышло посложнее: я не знал, как лучше всё сделать, и поначалу пошёл по неправильному пути — начал изучать процедуры запроса, получения и отсылки чёрного списка (последняя из них — `muc::send_list`). Процедуры большие и выглядят довольно кошмарно (для новичка), но самое главное, что мне не нравилось — это необходимость вытягивать весь список только для того, чтобы прибавить к нему своего пациента и отправить весь список снова на сервер. Очень нерационально! И тут мне случайно на глаза попался такой комментарий в процедуре-обработчике `muc::change_item_param`, который обрабатывает команды Ткаббера /ban, /kick, /admin и другие: _For unknown reason banning request MUST be based on user's bare JID (which may be not known by admin)._ "Опа, — подумал я, — так значит, серверу всё-таки шлётся реальный джид пользователя, а не room@conference.jabber.ru/nick". Так что я просто забрал остатки кода после этого комментария и сделал из него свою процедуру, выкинув ненужное. Также мне пришлось наприсать свою процедуру проверки на ошибку, основывающуюся на `muc::test_error_res`, потому что оригинальная меня не устраивала. Процедура отсылки бана вызывается один раз, если у нас команда /banjid (её я добавил позже, когда всё заработало), и в цикле, если команда — /bldjid. Вот, собственно, и всё. 


















Ну или почти всё. Плагин работает, но его можно чуть-чуть доделать. Сейчас он шлёт запросы на бан тупо во все комнаты, где я нахожусь. Но админю-то я не во всех. Это означает лишний трафик для меня и лишнюю нагрузку на сервер. Значит, мне надо как-то отфильтровать те комнаты, где я имею права админа. Тут, как может показаться, заколдованный круг: чтобы узнать, админю ли я в комнате, надо спросить у сервера. А это как раз лишний трафик и лишний пинок серверу. Но если подумать хорошо, то мы ведь уже знаем, что если я в ростере комнаты сижу в группе "Модераторы", то значит, и права тут имею модераторские. Так что надо проверить ростер каждой конференции и выбрать лишь нужные. Вот и обозначилось направление для поисков — найти, где рисуется ростер конференции, и выдрать оттуда нужный код :) На самом деле всё немного сложнее, потому что я могу быть не админом, а модератором — я буду находиться в группе модеров, но банить не смогу. Небольшие издержки, но соотношение "количество работы/результат" получается неплохое. Ещё потребуется добавить исключение комнат вида `channel%irc.server1.ru@irc.server2.com`, чтобы запросы не слались в комнаты, не поддерживающие стандарт MUC. Тут уже, скорее всего, придётся писать свой парсер. 

















## <a id="Отладка"></a>Отладка

### <a id="Спешка_нужна_лишь_при_ловле_блох"></a>Спешка нужна лишь при ловле блох

При отлове багов торопиться не надо. Вот вы получили сообщение об ошибке. Прочитайте его внимательно: там дана практически вся необходимая для отладки информация. Если виной всему опечатка в имени команды или аргумента, так и будет сказано (имя команды не существует или что-то в этом духе). Если вы позабыли где-то скобку, об этом тоже будет сказано начистоту. Вам дадут ссылку на ошибку вплоть до седьмого колена: в какой строке какой процедуры, вызванной кем и откуда находится источник проблем. ![(!)](../images/Hammer.png) **Сделать:** Развить, если необходимо. 









![(!)](../images/Hammer.png) **Сделать:** Вкратце написать про ::plugins::debug. 

### <a id="Консоль_Ткаббера_-_наше_всё"></a>Консоль Ткаббера — наше всё

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




    source "/путь/содержащий пробелы/к/вашему/плагину/coolplugin.tcl"

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





    namespace exists ::bldjid

Если ответ — 1, всё должно быть в порядке. Если 0, где-то косяки (<s>в ДНК</s> в коде, скорее всего — может, вы ошиблись в имени команды, и теперь Ткаббер "не узнаёт" то, что вы ему подсовываете; при этом, кстати, команда выведется в чате, как простое сообщение). 




На первых порах очень неплохо быть в курсе того, что у вас попадает в переменные. Воспользуйтесь командой puts. Например, мы хотим узнать, действительно ли все конференции попали в список. 



       foreach tmpchatid [lsort [lfilter chat::is_groupchat [chat::opened $xlib]]] {
           lappend groupjids [chat::get_jid $tmpchatid]
       }
       puts $groupjids

Результат действия этой команды будет выведен прямо в консоли. Ничто не мешает вам трассировать таким образом состояние переменных других скриптов Ткаббера. Просто добавьте печать нужной переменной в нужном месте, сохраните файл и не забудьте подгрузить его. Ещё одна удобная для тестирования команда — return stop. Если её поставить в вышеприведённом примере после puts, то дальнейшее выполнение кода прекратится. Полезно, когда сначала хочется отладить один кусок кода, не заморачиваясь на другом. 







**Внимание:** _Команда puts полезна, но не забудьте перед релизом их все убрать, иначе их вывод будет валиться в .xsession-errors пользователей плагина, что вряд ли кого-то обрадует._ 



Хоть консоль Ткаббера и является отличным отладочным инструментом, живого тестирования она заменить не может. Ваш покорный слуга погонял свой плагин, загруженный в Ткаббер через консоль, радостно выложил его сюда на вики, но когда через несколько дней дело дошло до реального масштабного бана, выскочила ошибка. В результате у автора плагина прибавилось ума, и он решил развить тему пространства имён (наверное, вы уже про это прочитали выше). 






![(!)](../images/Hammer.png) **Сделать:** Рассказать про return -code break 

### <a id="Побольше_тестируйте"></a>Побольше тестируйте

Прежде чем выкладывать плагин на общее обозрение, погоняйте его самостоятельно. Проверьте его работу в нескольких версиях Ткаббера (svn и хотя бы одной-двух из последних стабильных) и на разных тиклях (8.5, 8.4 как минимум). Возможно, вы воткнули где-то команду, которая есть в одной версии языка или Ткаббера и нет в других. Решайте сами, что вам нужно: совместимость с ними или более продвинутый программинг/функциональность. В случае сомнений посоветуйтесь со [знающими](Участник_Kostix.md) [людьми](Участник_Teo.md). Скорее всего, можно и рыбку съесть, и на ёлку влезть, то есть, разрулить ситуацию так, что и совместимость не пострадает, и работать всё будет хорошо. 









Пробуйте вводить нестандартные параметры, левые символы, и вообще создавать экстремальные условия для вашего скрипта. Например, для отсеивания каналов IRC я в проверочном условии использовал поиск вхождения в имя символа процента, поскольку такие комнаты работают через транспорт: `somechannel%someserver.ru@irc.server.org`. Однако потом я подумал (и это подтвердилось на практике), что и обычная MUC-комната может иметь знак процента в имени. Поэтому я доработал проверку таким образом: 







       foreach tmpchatid [lsort [lfilter chat::is_groupchat [chat::opened $xlib]]] {
           set tmpgrp [chat::get_jid $tmpchatid]
           if {([lindex [bldjid::whoami $xlib $tmpgrp] 1] == "admin" \
           || [lindex [bldjid::whoami $xlib $tmpgrp] 1] == "owner") \
           && ![string match *%*@*irc* $tmpgrp]} {
               lappend groupjids $tmpgrp
           }
       }

Предполагается, что в имени транспорта обязательно должно присутствовать слово irc (иначе мы просто не догадаемся, что это IRC-транспорт), то есть, в теперешнем виде скрипт пропустит комнату `mirc%room@conference.jabber.ru` и не пропустит комнату `channel%someserver.org@irc.putyourserverhere.ru`. Кстати, скрипт в этом виде тормознёт и комнату `mirc%room@conference.mirc.com` (представим себе на мгновение, что на этом сайте есть джаббер-сервер), поэтому проверку следует изменить на \*%\*@irc\* (точку после слова irc вылавливать не надо, на случай, если транспорт называется irctransport.server.org). Теперь максимум, что может случиться — если имя транспорта _не начинается_ на "irc" (что очень маловероятно), то тогда, отправив запрос на бан в эту комнату, мы получим сообщение об ошибке. 











Это лишь один пример. Напрягите фантазию, думайте за дурака-пользователя, предполагайте, что он может сморозить. 


### <a id="Научитесь_пользоваться_системой_управления_версиями"></a>Научитесь пользоваться системой управления версиями

Не поленитесь поставить и освоить что-нибудь вроде [subversion](http://subversion.tigris.org/). Эта штука избавит вас от великой головной боли на тему "Блин, как уж я там позавчера эту хрень сделал? Сейчас бы мне этот кусок сюда, да потёр и не сохранил ту версию". Совсем не обязательно сходу просить допуск к репозиторию на xmpp.ru (особенно если у вас нет опыта работы с svn). Устройте себе локальный сервер: и от головной боли избавитесь, и работать с сабвершеном научитесь. Если вы считаете, что ваше творение должно находиться в общем репозитории [svn.xmpp.ru](http://svn.xmpp.ru), читайте дальше — там рассказано о его устройстве и о том, как получить к нему доступ. Врочем, ради одного плагина не стоит сильно заморачиваться. Выложите его на вики — делов-то. 











([kostix](Участник_Kostix.md) замечает, что для _локальной_ работы над проектом значительно удобнее Subversion использовать какого-нибудь представителя семейства [распределённых систем управления версиями (DVCS)](http://en.wikipedia.org/wiki/Distributed_Version_Control_System), например, [Bazaar](http://bazaar-vcs.org/), [Mercurial](http://www.selenic.com/mercurial), [Git](http://git.or.cz), [Darcs](http://darcs.net), [Monotone](http://monotone.ca) и т.п. — они позволяют лихо жонглировать кодом, не завися от центрального сервера.) 









([bigote](Участник_Bigote.md) восторженно соглашается — не так давно освоенный им в минимальных количествах Git значительно упростил мышиную возню с кодом на десктопе. Но если вы планируете в конце концов поместить свой плагин в репозиторий tkabber-3rd-party-plugins, то лучше сразу вести разработку под svn или на крайний случай сделать это перед его публикацией туда, сначала экспортнув код из локального репозитория. Конечно, есть обвязки, позволяющие публиковать из git в svn, к примеру, но они не про нас, простых смертных начинающих плагинописателей ;)). Вот, кстати, [интересная притча](http://edward13.livejournal.com/26550.html) (во всех переводах названная почему-то басней), простыми словами рассказывающая о мощи git. 




## <a id="Тонкости"></a>Тонкости








Здесь я попытаюсь рассказать о некоторых подводных камнях, на которые будет частенько находить ваша коса в процессе доведения плагина до ума. Моя, во всяком случае, на них натыкается преизрядно. 



### <a id="Хуки_и_return_stop"></a>Хуки и return stop

Есть тонкая разница между командами `return` и `return stop` — первая не прерывает выполнения хука, если процедура, в которой она встретилась, является его обработчиком. Поясню на примере того же плагина Bldjid. Он разросся, и теперь там есть процедура smart\_enter\_exit\_message, которая обрабатывает хук client\_presence\_hook (который срабатывает, когда кто-нибудь меняет своё состояние либо заходит в комнату). Я по незнанию понаставил в некоторые проверки внутри этой процедуры `return stop` вместо `return`, и в результате при определённых условиях перестал показываться ростер конференции, да и другие странности в работе Ткаббера появились. Дело было как раз в том, что вместо того, чтобы мирно завершить свою работу и отдать бразды правления другим обработчикам, эта процедура обрывала хук, и само собой, никто уже не заполнял ростер группы. 












Сложно дать готовый рецепт на все случаи жизни, но можно посоветовать подходить с осторожностью к использованию `return stop` в обработчиках хуков. В обычных процедурах наоборот, лучше перестраховаться. Я только что попробовал позаменять все стопы на обычные return в теле простых процедур — результат плачевный: команды-то выполняются, но потом их текст выводится в общий чат, что нам совершенно не нужно. 






## <a id="Делаем_плагин_динамически_подключаемым"></a>Делаем плагин динамически подключаемым

С появлением в Ткаббере Менеджера плагинов жизнь пользователя стала намного проще. Чтобы подключить нужный плагин, достаточно сделать несколько кликов (**Настройки → Plugins Management → отметить галочкой нужный плагин → сохранить настройку**). Естественно, сам плагин перед этим всё равно должен быть помещён в соответствующее место, но согласитесь, что это значительный шаг вперёд, тем более, что, сняв эту галочку, плагин можно _частично_ из памяти выгрузить. Почему частично? Не буду забегать вперёд, начну по порядку. 







### <a id="Добавляем_в_namespace_код_для_запуска_процедур_загрузки_и_выгрузки"></a>Добавляем в namespace код для запуска процедур загрузки и выгрузки

    if {![::plugins::is_registered bldjid]} {
        ::plugins::register bldjid \
                -namespace [namespace current] \
                -source [info script] \
                -description [::msgcat::mc "Whether the Bldjid plugin is loaded."] \
                -loadcommand [namespace code load] \
                -unloadcommand [namespace code unload]
        return
    }

Помещать его следует в самом начале неймспейса, но _после строки_ ::msgcat::mcload [file join [file dirname [info script]] msgs], если таковая у вас имеется, иначе не загрузится локализованный текст пояснительной строчки. Как видите, тут всё просто. Вам надо только поменять слово bldjid на название вашего плагина (должно совпадать с именем его каталога). 





### <a id="Создаём_эти_самые_процедуры_загрузки_и_выгрузки"></a>Создаём эти самые процедуры загрузки и выгрузки

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



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

*  Скорее всего у вас есть и парочка глобальных переменных. Их тоже имеет смысл засунуть сюда. 

*  Если плагин использует сочетания клавиш (как, например, Ctrl-m в Bldjid для показа/скрытия монитора), их тоже стоит перенести сюда. 

*  Редко, но иногда может понадобиться выполнить какие-то действия. Смотрите пример чуть ниже. 


#### <a id="Процедура_загрузки"></a>Процедура загрузки

Рассмотрим разбираемый в этой статье плагин Bldjid: 

    proc bldjid::load {} {
    # A variable where the last query result is stored.
           variable user_list
    # An array where all user entrances are stored.
           global jids_by_chats
           variable ent_cntr 1
           event add <<ToggleMonitor>> <Control-m>
    
           hook::add generate_completions_hook \
           [namespace current]::visitors_compls
           hook::add chat_send_message_hook \
           [namespace current]::handle_commands 17
           ::hook::add open_chat_post_hook [namespace current]::setup_bindings
           hook::add client_presence_hook \
           [namespace current]::smart_enter_exit_message 69
           hook::add room_nickname_changed_hook \
           [namespace current]::smart_enter_exit_message 51
    }

*  Как видите, здесь присутствуют все три упомянутых элемента: и хуки, и переменные, и привязка сочетания клавиш к событию. ![(!)](../images/Hammer.png) **Сделать:** Пояснить, как всё это работает (надо мало-мало разобраться в этом самому). Какие именно переменные переносить сюда — решать вам. Имеет смысл переносить глобальные (которые объявлены с помощью global и variable). Также можно грузить здесь переменные, находящиеся в процедуре объявления неймспейса, установленные командой set (чтобы потом при выгрузке прибить их командой unset, которую мы увидим ниже): 












    set verbosity [list min [::msgcat::mc "Minimum:\
    Log each entrance or nick change of a unique pair nick/jid only once per room\
    (less memory used)."]\
    max [::msgcat::mc "Maximum: All entrances of each user will be logged."]]
    
    set matching_rules [list \
    exact [::msgcat::mc "Exact match."]\
    loose [::msgcat::mc "Loose match."]]

*  В моём плагине нет действий, которые имеет смысл делать во время процедуры загрузки, но такое дело есть в плагине attline, откуда я привожу следующий кусочек кода, идущий после объявления хуков: 



       foreach chatid [chat::opened] {
           setup_chat_win $chatid ""
       }

#### <a id="Теперь_о_процедуре_выгрузки"></a>Теперь о процедуре выгрузки

    proc bldjid::unload {} {
           variable user_list
           global jids_by_chats
           variable ent_cntr
           event delete <<ToggleMonitor>> <Control-m>
    
           hook::remove generate_completions_hook \
           [namespace current]::visitors_compls
           hook::remove chat_send_message_hook \
           [namespace current]::handle_commands 17
           ::hook::remove open_chat_post_hook [namespace current]::setup_bindings
           hook::remove client_presence_hook \
           [namespace current]::smart_enter_exit_message 69
           hook::remove room_nickname_changed_hook \
           [namespace current]::smart_enter_exit_message 51
    
           catch {unset ent_cntr}
           catch {unset user_list}
           catch {unset jids_by_chats}
    
           foreach chatid [chat::opened] {
                   clear_monitor $chatid
                   set ccw [::chat::winid $chatid]
                   if {![catch {pack info $ccw.mon} res]} {
                           pack forget $ccw.mon $ccw.vsb
                   }
           }
    }

*  В её начале, как и в начале любой процедуры, снова объявляются глобальные переменные. Нам их надо потом будет прибить, и если мы их не объявим, они _не будут удалены командой unset,_ хотя и ошибки никакой не выскочит — можете сами в этом убедиться, закомментировав объявление variable ent\_cntr и запустив Ткаббер. Убедитесь, что плагин включен, зайдите в какую-нибудь населённую комнату, откройте консоль Ткаббера и наберите в ней `puts $plugins::bldjid::ent_cntr` — вы увидите число участников, увеличенное на единицу. Теперь выгрузите плагин с помощью Менеджера и снова проверьте состояние переменной. Она содержит всё то же число. Если бы она была объявлена, вы получили бы сообщение об ошибке, что этой переменной не существует (что означало бы, что она стёрта из памяти). Я расписываю это так подробно потому, что не так давно в конференции как раз задавались вопросы на тему "зачем объявлять переменные, если мы сейчас их убьём". 












 *  Удаление некоторых переменных, возможно, большого выигрыша не даст (кроме, разве что, морального удовлетворения), но, например, переменная jids\_by\_chats при параноидальных настройках за несколько дней сидения в людных комнатах может изрядно распухнуть. 



 
*  Затем я поместил удаление привязки горячих клавиш к событию (в данном примере: копируем строчку `event add <<ToggleMonitor>> <Control-m>` из процедуры загрузки и меняем add на delete). 


*  Далее идёт удаление хуков. Копируем хуки из процедуры load и заменяем add на remove. 

*  После этого идёт удаление переменных, на всякий случай обёрнутое в catch {} 
*  И в самом конце я делаю последнюю проверку на случай, если в какой-то конференции осталось открытым окошко монитора (его надо закрыть программно, ведь сочетание клавиш мы отключаем, и если где-нибудь останется болтаться окошко монитора, пользователь хороших слов о вас не подумает). Для этой проверки у нас есть цикл foreach, в котором мы сначала принудительно чистим окошки монитора (некоторые могут быть закрытыми, но содержать текст), а затем смотрим, есть ли открытый монитор, и если да — закрываем его. Финальные действия могут быть и сложнее. Например, в игровых плагинах процедура выгрузки закрывает окно с партией игры, если оно было открыто, и прибивает все загруженные в память элементы доски (всю графику) и делает много других подобных вещей. 











Естественно, вам лучше знать, что ваш плагин делает и что нет. Соответственно, в зависимости от его сложности могут упроститься или усложниться процедуры загрузки и выгрузки. 



### <a id="Возможна_ли_полная_выгрузка_плагина_из_памяти"></a>Возможна ли полная выгрузка плагина из памяти?

На сегодняшний день выгрузка плагина из памяти ограничена лишь хуками, переменными и событиями, о чём я уже написал. Однако в памяти остаётся ещё немало: 



*  Настройки плагина (выключите какой-нибудь в Менеджере плагинов и сходите в раздел Plugins — его настройки продолжают болтаться там! 

*  Код плагина (если разработчик позаботился и запихал всё в свой неймспейс, задача его удаления переводится из разряда невозможных в разряд трудновыполнимых). 


*  На диске могут остаться временные файлы. 
*  Прочие ресурсы, созданные кодом во время выполнения (а не определённые статически в тексте плагина). 


Из беседы с разработчиками мне удалось узнать следующее (цитирую): 
_ 
*  По-моему, выгрузка есть полное изничтожение плагина, включая `namespace delete ::plugins::pluginname`. 

*  Переменные в настройках регистрируются через `custom::defvar` — Ткаббер же не святым духом про них узнаёт. 

*  Прибить настройки, наверное, можно, если есть `custom::противоположное_defvar` :) 

*  Тебе ничего не мешает убить свой неймспейс (как автору плагина), но грох неймспейса с живыми переменными кастомайза в нём может дать интересный эффект. 


*  Вообще, плагин должен знать, что он наделал, и уметь отнаделывать это обратно. Это ж стандартно. Например, плагин receipts создаёт несколько картинок (из файлов) и лепит их в окна. При выгрузке логично чтобы он сначала удалял свои картинки из всех чатов, а потом грохал их. 



 _
Так что если обозначить планы для дальнейших исследований, их можно свести к четырём рекомендациям: 


1.  Изучить механизм `custom::defvar` и попробовать написать `custom::противоположное_defvar`. 


1.  Если заниматься этим ломает, можно попробовать провести эксперимент: сделать `namespace delete ::plugins::pluginname` при живых переменных кастомайза и посмотреть, что получится; при этом подразумевается, что весь код плагина упрятан в его неймспейс; 


1.  Если плагин создавал какие-то свои временные файлы на диске, не забывать удалять их при выгрузке (не путайте это с логами, которые создаются для пользователя! если ему надо будет их убить, он убьёт их сам). 


1.  Не забывать про открытые окна и прочие ресурсы, создаваемые плагином — я уже показал, как делается проверка на предмет забытых окошек монитора; кроме того, вы можете изучить процедуры выгрузки игровых плагинов: chess, reversi и т. д. — если выключить плагин, когда открыта партия, её окно закроется (сначала плагин удаляет из памяти всю свою графику, как об этом уже было сказано выше). 





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





Вот, собственно, и всё. Если у меня появятся результаты исследований описанных выше проблем, я непременно их здесь выложу. Призываю сделать то же самое и вас. 


## <a id="Не_бойтесь_задавать_вопросы"></a>Не бойтесь задавать вопросы

Один вопрос специалисту сэкономил мне несколько часов напрасной работы. Камрад [kostix](Участник_Kostix.md) подсказал мне простое решение проблемы, как узнать, в какой комнате я админю. А ещё через минуту и процедурку сваял: 



    proc whoami {xlib where} {
       set chatid [chat::chatid $xlib $where]
       set jid $where/[get_our_groupchat_nick $chatid]
       list $muc::users(role,$xlib,$jid) $muc::users(affiliation,$xlib,$jid)
    }

Конечно, задавая вопросы, следует помнить о простых правилах, изложенных в [этой статье](Остров_посланных_на....md). На всякий случай напомню основные: 


*  Попробуйте решить проблему самостоятельно и в вопросе изложите шаги, вами предпринятые. Потенциальный помощник это оценит. 

*  Спешка нужна лишь при ловле блох. Это ведь не горящий проект, так? Да если и горящий, кому до этого какое дело? У всех свои заботы — кризис на дворе. От этого плагина не зависит судьба человечества? (Если зависит, какого чёрта вы сами столько с ним тянули?) Так что если вам не отвечают сразу, наберитесь терпения. 




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



# <a id="Общие_сведения_о_репозитории"></a>Общие сведения о репозитории

Для разработки неофициальных проектов, имеющих отношение к Ткабберу (и в том числе — плагинов), был создан специальный репозиторий [Subversion](http://subversion.tigris.org): 



    svn.xmpp.ru/repos/tkabber-3rd-party/

то есть он расположен "рядом" с официальным репозиторием Ткаббера и поддерживает такие же две схемы доступа: **http** и **https**. 


Основная структура репозитория на данный момент такова: 

    svn.xmpp.ru/repos/tkabber-3rd-party/
      trunk/
        plugins/
      tags/
      branches/

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

    svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins

а их "ветки" делаться где-то под 

    svn.xmpp.ru/repos/tkabber-3rd-party/branches/

Формат веток, в принципе, не важен. Например, юзер vasya может делать ветки в  

     svn.xmpp.ru/repos/tkabber-3rd-party/branches/vasya/mycoolplugin/testing-stuff

а может — в 

    svn.xmpp.ru/repos/tkabber-3rd-party/branches/plugins/mycoolplugin/testing-other-stuff

Можно и весь "куст" под **trunk'**ом копировать под **branches** — [ветки в Subversion дёшевы](http://svnbook.red-bean.com/en/1.2/svn.branchmerge.using.html#svn.branchmerge.using.create) и не зависят от формального объёма копируемой части дерева. 



Идея состоит в том, чтобы _не_ иметь "побочных" каталогов в каталогах с плагинами. Это позволит любому пользователю выполнить 


    svn co https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins .

и получить себе полный набор "готовых к употреблению" плагинов. 

# <a id="Как_получить_доступ_к_репозиторию"></a>Как получить доступ к репозиторию

1.  Заиметь некий готовый код или хотя бы внятную идею, которые можно будет предъявить в качестве доказательства стремления быть допущеным к репозиторию; 

1.  Связаться с [Kostix](Участник_Kostix.md); 
1.  Выбрать себе имя пользователя и пароль. Пароль можно сообщить "открытым текстом" (как есть) или сгенерировать на нём "хэш для htpasswd". Сие делается либо при помощи программы **htpasswd** из комплекта Web-сервера [Apache](http://www.apache.org) путём запуска её в виде 




    htpasswd -n USERNAME


 или при помощи [этой Web-формы](http://tkabber.jabber.ru/files/tkabber-contribs/htpasswd.php); 
1.  Подождать, пока вас не допустят к телу репозитория, о чём [Kostix](Участник_Kostix.md) вам сообщит; 

1.  Сделать, к примеру, 

    svn --username myusername mkdir https://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/myplugin

 и убедиться в том, что репозиторий позволил вам сделать изменение в нём, то есть аккаунт создан правильно. 


# <a id="В_заключение"></a>В заключение

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





Удачи вам! И ничего не бойтесь :) 


Changes to wiki/ru/Служебная/Все_страницы.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

21
22
23
24
25
26
27
28
29
30
31
32
33
34

35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# Служебная/Все страницы

Материал из Tkabber Wiki

## Все страницы

* [$::configdir](../$__configdir.md) (11 ссылок)
* [0.10.x/Шрифты](../0.10.x/Шрифты.md) (3 ссылки)
* [0.9.x/ЧаВо](../0.9.x/ЧаВо.md) (4 ссылки)
* [0.9.x/Эмоциконки](../0.9.x/Эмоциконки.md) (4 ссылки)
* [Config.tcl](../Config.tcl.md) (17 ссылок)
* [Config.tcl для начинающих](../Config.tcl_для_начинающих.md) (14 ссылок)
* [Config dir](../Config_dir.md) (8 ссылок)
* [Google Talk](../Google_Talk.md) (5 ссылок)
* [Low traffic HOWTO](../Low_traffic_HOWTO.md) (12 ссылок, 1 со страниц на других языках)
* [MUC Ignore](../MUC_Ignore.md) (7 ссылок)
* [Nick coloring](../Nick_coloring.md) (5 ссылок)
* [Pages](../Pages.md) (2 ссылки)
* [Plugins/Alarm/Changelog](../Plugins/Alarm/Changelog.md) (2 ссылки)
* [Plugins/Traffic/Changelog](../Plugins/Traffic/Changelog.md) (2 ссылки)

* [SVN disclaimer](../SVN_disclaimer.md) (7 ссылок)
* [Sandbox](../Sandbox.md) (4 ссылки)
* [Symlinks](../Symlinks.md) (4 ссылки)
* [Testimonials, Antimonials, And Eternal Questions](../Testimonials__Antimonials__And_Eternal_Questions.md) (2 ссылки)
* [Tk Windows keysyms bug explained](../Tk_Windows_keysyms_bug_explained.md) (2 ссылки)
* [Tkabber](../Tkabber.md) (4 ссылки)
* [Tkabber Wiki:Справка](../Tkabber_Wiki_Справка.md) (5 ссылок)
* [Tkabber Windows Mini HOWTO](../Tkabber_Windows_Mini_HOWTO.md) (6 ссылок, 1 со страниц на других языках)
* [Tkabber starpack](../Tkabber_starpack.md) (8 ссылок)
* [Tkinactive](../Tkinactive.md) (2 ссылки)
* [Wish и русская раскладка в Windows](../Wish_и_русская_раскладка_в_Windows.md) (6 ссылок)
* [XRDB](../XRDB.md) (22 ссылки)
* [База данных опций Tk](../База_данных_опций_Tk.md) (19 ссылок)
* [Блокировка MRIM-спама](../Блокировка_MRIM-спама.md) (7 ссылок)

* [Гейты во вражеские сети](../Гейты_во_вражеские_сети.md) (4 ссылки)
* [Дистрибутивы, которые мы выбираем](../Дистрибутивы__которые_мы_выбираем.md) (15 ссылок, 1 со страниц на других языках)
* [Заглавная страница](../Заглавная_страница.md) (4 ссылки, 1 со страниц на других языках)
* [Загрузка настроек](../Загрузка_настроек.md) (8 ссылок)
* [Звуковые схемы](../Звуковые_схемы.md) (5 ссылок)
* [История вики](../История_вики.md) (3 ссылки, 1 со страниц на других языках)
* [История разговоров](../История_разговоров.md) (2 ссылки)
* [Команды](../Команды.md) (1 ссылка)
* [Культ личности Ткаббера](../Культ_личности_Ткаббера.md) (3 ссылки)
* [Между офлайном и онлайном](../Между_офлайном_и_онлайном.md) (11 ссылок)
* [Настроения](../Настроения.md) (1 ссылка)
* [Настройка Ткаббера: азы и глубже](../Настройка_Ткаббера__азы_и_глубже.md) (11 ссылок)
* [Настройки](../Настройки.md) (3 ссылки)
* [Начинающим](../Начинающим.md) (13 ссылок, 1 со страниц на других языках)
* [Нетривиальные настройки](../Нетривиальные_настройки.md) (28 ссылок, 1 со страниц на других языках)
* [Новый вид Tk в 8.5](../Новый_вид_Tk_в_8.5.md) (4 ссылки)
* [Особенности реализации](../Особенности_реализации.md) (6 ссылок)
* [Остров посланных на...](../Остров_посланных_на....md) (5 ссылок)
* [Палитра цветов](../Палитра_цветов.md) (3 ссылки)
* [Патчи](../Патчи.md) (21 ссылка, 2 со страниц на других языках)
* [Пересылка файлов: теория](../Пересылка_файлов__теория.md) (10 ссылок, 2 со страниц на других языках)
* [Плагины](../Плагины.md) (57 ссылок, 3 со страниц на других языках)
* [Плагины/AntiSPIM](../Плагины/AntiSPIM.md) (4 ссылки)
* [Плагины/Juick](../Плагины/Juick.md) (4 ссылки)
* [Планы на будущее](../Планы_на_будущее.md) (10 ссылок, 1 со страниц на других языках)
* [Практика](../Практика.md) (4 ссылки)
* [Проблемы X Window и TTF](../Проблемы_X_Window_и_TTF.md) (4 ссылки, 1 со страниц на других языках)
* [Проблемы со звуком](../Проблемы_со_звуком.md) (12 ссылок, 2 со страниц на других языках)
* [Проверка сертификата сервера](../Проверка_сертификата_сервера.md) (5 ссылок)
* [Разработка](../Разработка.md) (4 ссылки)
* [Разработка плагинов](../Разработка_плагинов.md) (3 ссылки)
* [Служебная/Все страницы](../Служебная/Все_страницы.md) (2 ссылки)
* [Служебная/Отсутствующие ссылки](../Служебная/Отсутствующие_ссылки.md) (1 ссылка)
* [Смайлики и аватары](../Смайлики_и_аватары.md) (13 ссылок, 1 со страниц на других языках)
* [Спамодавка списками приватности](../Спамодавка_списками_приватности.md) (5 ссылок)
* [Сравнение XMPP-клиентов](../Сравнение_XMPP-клиентов.md) (2 ссылки)
* [Ссылки](../Ссылки.md) (6 ссылок)
* [Старпак и сжатие](../Старпак_и_сжатие.md) (4 ссылки)
* [ТЗ по управлению через параметры командной строки](../ТЗ_по_управлению_через_параметры_командной_строки.md) (5 ссылок)
* [Теория](../Теория.md) (7 ссылок)
* [Терминология](../Терминология.md) (16 ссылок)
* [Тестирование TLS](../Тестирование_TLS.md) (1 ссылка)
* [Ткаббер - чемпион?](../Ткаббер_-_чемпион_.md) (6 ссылок)
* [Ткаббер ЧаВо](../Ткаббер_ЧаВо.md) (35 ссылок)
* [Ткаббер ЧаВо/Внешний вид и звук](../Ткаббер_ЧаВо/Внешний_вид_и_звук.md) (16 ссылок)
* [Ткаббер ЧаВо/Глюки](../Ткаббер_ЧаВо/Глюки.md) (44 ссылки)
* [Ткаббер ЧаВо/Как мне...?](../Ткаббер_ЧаВо/Как_мне..._.md) (46 ссылок)
* [Ткаббер ЧаВо/Разное](../Ткаббер_ЧаВо/Разное.md) (25 ссылок)
* [Ткаббер и DNS](../Ткаббер_и_DNS.md) (5 ссылок)
* [Ткаббер на КПК](../Ткаббер_на_КПК.md) (4 ссылки)
* [Ткаббер наизнанку](../Ткаббер_наизнанку.md) (4 ссылки)
* [Токены](../Токены.md) (3 ссылки)
* [Удалённое управление с помощью send](../Удалённое_управление_с_помощью_send.md) (10 ссылок, 2 со страниц на других языках)
* [Установка tklib в *nix](../Установка_tklib_в__nix.md) (2 ссылки)
* [Установка и настройка в Ubuntu](../Установка_и_настройка_в_Ubuntu.md) (2 ссылки)
* [Участник:ART](../Участник_ART.md) (8 ссылок)
* [Участник:Archimed](../Участник_Archimed.md) (12 ссылок)
* [Участник:Bigote](../Участник_Bigote.md) (37 ссылок, 3 со страниц на других языках)
* [Участник:Brennende](../Участник_Brennende.md) (4 ссылки)
* [Участник:EXire](../Участник_EXire.md) (19 ссылок)
* [Участник:Feez](../Участник_Feez.md) (13 ссылок, 2 со страниц на других языках)
* [Участник:Gebb](../Участник_Gebb.md) (8 ссылок)
* [Участник:Gman](../Участник_Gman.md) (2 ссылки)
* [Участник:Kostix](../Участник_Kostix.md) (97 ссылок, 7 со страниц на других языках)
* [Участник:Lknight](../Участник_Lknight.md) (18 ссылок, 5 со страниц на других языках)
* [Участник:Mellon](../Участник_Mellon.md) (3 ссылки)
* [Участник:Teo](../Участник_Teo.md) (23 ссылки)
* [Файл конфигурации](../Файл_конфигурации.md) (9 ссылок, 1 со страниц на других языках)
* [Формат логов 0.10.0](../Формат_логов_0.10.0.md) (1 ссылка)
* [Цветовые темы и пиктограммы](../Цветовые_темы_и_пиктограммы.md) (8 ссылок)
* [Чебуратор](../Чебуратор.md) (4 ссылки)
* [Шифрование в Ткаббере](../Шифрование_в_Ткаббере.md) (10 ссылок, 1 со страниц на других языках)
* [Шрифты](../Шрифты.md) (11 ссылок)









|



|

|


<


>




|


|
|

|

|

>
|
|





|




|
|
|


|
|
|
|
|



|
|
|

|
|
|
|
|



|

|
|




|
|

|



|

<


|


|
|

|
|

|
|



|
|

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89

90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# Служебная/Все страницы

Материал из Tkabber Wiki

## Все страницы

* [$::configdir](../$__configdir.md) (11 ссылок)
* [0.10.x/Шрифты](../0.10.x/Шрифты.md) (3 ссылки)
* [0.9.x/ЧаВо](../0.9.x/ЧаВо.md) (5 ссылок)
* [0.9.x/Эмоциконки](../0.9.x/Эмоциконки.md) (4 ссылки)
* [Config.tcl](../Config.tcl.md) (17 ссылок)
* [Config.tcl для начинающих](../Config.tcl_для_начинающих.md) (14 ссылок)
* [Config dir](../Config_dir.md) (9 ссылок)
* [Google Talk](../Google_Talk.md) (5 ссылок)
* [Low traffic HOWTO](../Low_traffic_HOWTO.md) (14 ссылок)
* [MUC Ignore](../MUC_Ignore.md) (7 ссылок)
* [Nick coloring](../Nick_coloring.md) (5 ссылок)

* [Plugins/Alarm/Changelog](../Plugins/Alarm/Changelog.md) (2 ссылки)
* [Plugins/Traffic/Changelog](../Plugins/Traffic/Changelog.md) (2 ссылки)
* [Redirects](../Redirects.md) (2 ссылки)
* [SVN disclaimer](../SVN_disclaimer.md) (7 ссылок)
* [Sandbox](../Sandbox.md) (4 ссылки)
* [Symlinks](../Symlinks.md) (4 ссылки)
* [Testimonials, Antimonials, And Eternal Questions](../Testimonials__Antimonials__And_Eternal_Questions.md) (2 ссылки)
* [Tk Windows keysyms bug explained](../Tk_Windows_keysyms_bug_explained.md) (3 ссылки)
* [Tkabber](../Tkabber.md) (4 ссылки)
* [Tkabber Wiki:Справка](../Tkabber_Wiki_Справка.md) (5 ссылок)
* [Tkabber Windows Mini HOWTO](../Tkabber_Windows_Mini_HOWTO.md) (5 ссылок)
* [Tkabber starpack](../Tkabber_starpack.md) (9 ссылок)
* [Tkinactive](../Tkinactive.md) (2 ссылки)
* [Wish и русская раскладка в Windows](../Wish_и_русская_раскладка_в_Windows.md) (7 ссылок)
* [XRDB](../XRDB.md) (22 ссылки)
* [База данных опций Tk](../База_данных_опций_Tk.md) (22 ссылки)
* [Блокировка MRIM-спама](../Блокировка_MRIM-спама.md) (7 ссылок)
* [Быстрая настройка шрифтов](../Быстрая_настройка_шрифтов.md) (2 ссылки)
* [Гейты во вражеские сети](../Гейты_во_вражеские_сети.md) (5 ссылок)
* [Дистрибутивы, которые мы выбираем](../Дистрибутивы__которые_мы_выбираем.md) (17 ссылок)
* [Заглавная страница](../Заглавная_страница.md) (4 ссылки, 1 со страниц на других языках)
* [Загрузка настроек](../Загрузка_настроек.md) (8 ссылок)
* [Звуковые схемы](../Звуковые_схемы.md) (5 ссылок)
* [История вики](../История_вики.md) (3 ссылки, 1 со страниц на других языках)
* [История разговоров](../История_разговоров.md) (2 ссылки)
* [Команды](../Команды.md) (24 ссылки)
* [Культ личности Ткаббера](../Культ_личности_Ткаббера.md) (3 ссылки)
* [Между офлайном и онлайном](../Между_офлайном_и_онлайном.md) (11 ссылок)
* [Настроения](../Настроения.md) (1 ссылка)
* [Настройка Ткаббера: азы и глубже](../Настройка_Ткаббера__азы_и_глубже.md) (11 ссылок)
* [Настройки](../Настройки.md) (7 ссылок)
* [Начинающим](../Начинающим.md) (12 ссылок)
* [Нетривиальные настройки](../Нетривиальные_настройки.md) (29 ссылок)
* [Новый вид Tk в 8.5](../Новый_вид_Tk_в_8.5.md) (4 ссылки)
* [Особенности реализации](../Особенности_реализации.md) (6 ссылок)
* [Остров посланных на...](../Остров_посланных_на....md) (4 ссылки)
* [Палитра цветов](../Палитра_цветов.md) (4 ссылки)
* [Патчи](../Патчи.md) (20 ссылок, 1 со страниц на других языках)
* [Пересылка файлов: теория](../Пересылка_файлов__теория.md) (9 ссылок)
* [Плагины](../Плагины.md) (56 ссылок)
* [Плагины/AntiSPIM](../Плагины/AntiSPIM.md) (4 ссылки)
* [Плагины/Juick](../Плагины/Juick.md) (4 ссылки)
* [Планы на будущее](../Планы_на_будущее.md) (10 ссылок, 1 со страниц на других языках)
* [Практика](../Практика.md) (6 ссылок)
* [Проблемы X Window и TTF](../Проблемы_X_Window_и_TTF.md) (3 ссылки)
* [Проблемы со звуком](../Проблемы_со_звуком.md) (10 ссылок)
* [Проверка сертификата сервера](../Проверка_сертификата_сервера.md) (5 ссылок)
* [Разработка](../Разработка.md) (6 ссылок)
* [Разработка плагинов](../Разработка_плагинов.md) (4 ссылки)
* [Служебная/Все страницы](../Служебная/Все_страницы.md) (1 ссылка)
* [Служебная/Отсутствующие ссылки](../Служебная/Отсутствующие_ссылки.md) (**0** ссылок)
* [Смайлики и аватары](../Смайлики_и_аватары.md) (12 ссылок)
* [Спамодавка списками приватности](../Спамодавка_списками_приватности.md) (5 ссылок)
* [Сравнение XMPP-клиентов](../Сравнение_XMPP-клиентов.md) (2 ссылки)
* [Ссылки](../Ссылки.md) (6 ссылок)
* [Старпак и сжатие](../Старпак_и_сжатие.md) (3 ссылки)
* [ТЗ по управлению через параметры командной строки](../ТЗ_по_управлению_через_параметры_командной_строки.md) (5 ссылок)
* [Теория](../Теория.md) (11 ссылок)
* [Терминология](../Терминология.md) (17 ссылок)
* [Тестирование TLS](../Тестирование_TLS.md) (1 ссылка)
* [Ткаббер - чемпион?](../Ткаббер_-_чемпион_.md) (6 ссылок)
* [Ткаббер ЧаВо](../Ткаббер_ЧаВо.md) (35 ссылок)
* [Ткаббер ЧаВо/Внешний вид и звук](../Ткаббер_ЧаВо/Внешний_вид_и_звук.md) (16 ссылок)
* [Ткаббер ЧаВо/Глюки](../Ткаббер_ЧаВо/Глюки.md) (45 ссылок)
* [Ткаббер ЧаВо/Как мне...?](../Ткаббер_ЧаВо/Как_мне..._.md) (48 ссылок)
* [Ткаббер ЧаВо/Разное](../Ткаббер_ЧаВо/Разное.md) (25 ссылок)
* [Ткаббер и DNS](../Ткаббер_и_DNS.md) (6 ссылок)
* [Ткаббер на КПК](../Ткаббер_на_КПК.md) (4 ссылки)
* [Ткаббер наизнанку](../Ткаббер_наизнанку.md) (4 ссылки)
* [Токены](../Токены.md) (3 ссылки)
* [Удалённое управление с помощью send](../Удалённое_управление_с_помощью_send.md) (8 ссылок)
* [Установка tklib в *nix](../Установка_tklib_в__nix.md) (2 ссылки)

* [Участник:ART](../Участник_ART.md) (8 ссылок)
* [Участник:Archimed](../Участник_Archimed.md) (12 ссылок)
* [Участник:Bigote](../Участник_Bigote.md) (35 ссылок)
* [Участник:Brennende](../Участник_Brennende.md) (4 ссылки)
* [Участник:EXire](../Участник_EXire.md) (19 ссылок)
* [Участник:Feez](../Участник_Feez.md) (11 ссылок)
* [Участник:Gebb](../Участник_Gebb.md) (10 ссылок)
* [Участник:Gman](../Участник_Gman.md) (2 ссылки)
* [Участник:Kostix](../Участник_Kostix.md) (97 ссылок, 3 со страниц на других языках)
* [Участник:Lknight](../Участник_Lknight.md) (13 ссылок)
* [Участник:Mellon](../Участник_Mellon.md) (3 ссылки)
* [Участник:Teo](../Участник_Teo.md) (22 ссылки)
* [Файл конфигурации](../Файл_конфигурации.md) (8 ссылок)
* [Формат логов 0.10.0](../Формат_логов_0.10.0.md) (1 ссылка)
* [Цветовые темы и пиктограммы](../Цветовые_темы_и_пиктограммы.md) (8 ссылок)
* [Чебуратор](../Чебуратор.md) (4 ссылки)
* [Шифрование в Ткаббере](../Шифрование_в_Ткаббере.md) (9 ссылок)
* [Шрифты](../Шрифты.md) (20 ссылок)

Changes to wiki/ru/Служебная/Отсутствующие_ссылки.md.

1
2
3
4
5
6
7
8
9





10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29




30
31
32
33































34
35




36
37
38
39
40
41
42
43
44
45
46
47


48

49
50
51
52





53
54
55
56
57
58








59
60
61

62
63
64

65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81

82




83
84
85
86
87
88
89
# Служебная/Отсутствующие ссылки

Материал из Tkabber Wiki

## Отсутствующие ссылки

#### [0.10.x/Шрифты](../0.10.x/Шрифты.md)

* ../../images/Warning.gif






#### [0.9.x/Эмоциконки](../0.9.x/Эмоциконки.md)

* ../../images/36\_10\_20.gif

#### [Config dir](../Config_dir.md)

* Участник\_Juriks.md

#### [Google Talk](../Google_Talk.md)

* ../images/180px-Tkabber-GTalk-creds.png
* ../images/180px-Tkabber-Login-SSL.png
* ../images/Tkabber-gmail-proxy-SSL.png
* ../images/Tkabber-gmail-proxy-auth.png
* ../images/Tkabber-gmail-proxy-conn.png
* ../images/Tkabber-gmail-proxy-creds.png
* ../images/Tkabber-gmail-proxy-http-polling.png
* ../images/Tkabber-gmail-proxy-proxy.png





#### [Nick coloring](../Nick_coloring.md)

* Участник\_Hypersw.md
































#### [Sandbox](../Sandbox.md)





* Шаблон\_Button.md
* Шаблон\_File.md
* Шаблон\_Fixme.md
* Шаблон\_Program.md
* Шаблон\_Quote.md
* Шаблон\_Todo.md
* Шаблон\_Todo2.md
* Шаблон\_Warn.md

#### [Tkabber Wiki:Справка](../Tkabber_Wiki_Справка.md)

* MediaWiki\_Monobook.css.md


* Служебная\_RecentChanges.md


#### [Tkabber starpack](../Tkabber_starpack.md)

* ../files/Tkabber\_win32\_starpack\_template.rar






#### [Блокировка MRIM-спама](../Блокировка_MRIM-спама.md)

* ../images/Mrim-allow-only-contacts.png
* ../images/Mrim-lists.png
* ../images/Mrim-opts.png









#### [Заглавная страница](../Заглавная_страница.md)


* Служебная/Статистика.md
* Служебная/Требуется.md
* Служебная/Участники.md


#### [Звуковые схемы](../Звуковые_схемы.md)

* ../files/3rd-version\_final.zip
* ../files/Acoustic.theme\_2nd.version.zip
* ../files/New\_default\_theme\_11k-22k\_stereo.zip
* ../files/New\_default\_theme\_44100.zip
* ../files/New\_default\_tkabber\_sound\_theme.zip
* ../images/180px-Acoustic\_sound\_scheme\_instruments.jpg

#### [Культ личности Ткаббера](../Культ_личности_Ткаббера.md)

* ../images/0day-tkabber.png
* ../images/180px-Sneg\_01.jpg
* ../images/180px-Tkabber-master.jpg
* ../images/180px-Tkabber\_jingle.jpg
* ../images/Psycho.jpg

* Участник\_Hypersw.md





#### [Начинающим](../Начинающим.md)

* ../images/116px-Discovery\_conference\_1\_ru.png
* ../images/120px-Discovery\_conference\_2\_ru.png
* ../images/120px-Discovery\_ru.png
* ../images/Adding\_user\_2roster\_1\_ru.png









>
>
>
>
>




















>
>
>
>




>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>


>
>
>
>












>
>

>




>
>
>
>
>






>
>
>
>
>
>
>
>



>
|
|
|
>

















>

>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# Служебная/Отсутствующие ссылки

Материал из Tkabber Wiki

## Отсутствующие ссылки

#### [0.10.x/Шрифты](../0.10.x/Шрифты.md)

* ../../images/Warning.gif
* ../Шрифты.md\#Быстрое\_тестирование\_настроек

#### [0.9.x/ЧаВо](../0.9.x/ЧаВо.md)

* ../Low\_traffic\_HOWTO.md\#Старпак\_Ткаббера\_Win32

#### [0.9.x/Эмоциконки](../0.9.x/Эмоциконки.md)

* ../../images/36\_10\_20.gif

#### [Config dir](../Config_dir.md)

* Участник\_Juriks.md

#### [Google Talk](../Google_Talk.md)

* ../images/180px-Tkabber-GTalk-creds.png
* ../images/180px-Tkabber-Login-SSL.png
* ../images/Tkabber-gmail-proxy-SSL.png
* ../images/Tkabber-gmail-proxy-auth.png
* ../images/Tkabber-gmail-proxy-conn.png
* ../images/Tkabber-gmail-proxy-creds.png
* ../images/Tkabber-gmail-proxy-http-polling.png
* ../images/Tkabber-gmail-proxy-proxy.png

#### [Low traffic HOWTO](../Low_traffic_HOWTO.md)

* Проблемы\_со\_звуком.md\#\_В\_старпаке\_старките\_нет\_звука

#### [Nick coloring](../Nick_coloring.md)

* Участник\_Hypersw.md

#### [Redirects](../Redirects.md)

* Beginners.md
* Color-pics.md
* Dist.md
* Emoticons.md
* Faq-appearance-sound.md
* Faq-glitches.md
* Faq-howto.md
* Faq-misc.md
* Faq.md
* Filetransfer.md
* Fonts.md
* Gates.md
* Gtalk.md
* Login.md
* Mrim-spam.md
* Pages.md
* Patches.md
* Plugins.md
* Remote-control.md
* Sound-themes.md
* Sound.md
* Todo.md
* Topic.md
* Traffic.md
* Tuning.md
* Tweaks.md
* Win-howto.md
* X-ttf.md

#### [Sandbox](../Sandbox.md)

* mailto:liam@htmlhelp.com
* mailto:some.user@nowhere.land
* mailto:vasya@gde.to
* news:dejagnu.com
* Шаблон\_Button.md
* Шаблон\_File.md
* Шаблон\_Fixme.md
* Шаблон\_Program.md
* Шаблон\_Quote.md
* Шаблон\_Todo.md
* Шаблон\_Todo2.md
* Шаблон\_Warn.md

#### [Tkabber Wiki:Справка](../Tkabber_Wiki_Справка.md)

* MediaWiki\_Monobook.css.md
* http://tkabber.jabe.ru
* Служебная\_AllPages.md
* Служебная\_RecentChanges.md
* Терминология.md\#транк

#### [Tkabber starpack](../Tkabber_starpack.md)

* ../files/Tkabber\_win32\_starpack\_template.rar
* Tkabber\_starpack.md\#Как\_скачать\_последнюю\_SVN-версию\_Tkabber

#### [Wish и русская раскладка в Windows](../Wish_и_русская_раскладка_в_Windows.md)

* Плагины.md\#Postpone\_text

#### [Блокировка MRIM-спама](../Блокировка_MRIM-спама.md)

* ../images/Mrim-allow-only-contacts.png
* ../images/Mrim-lists.png
* ../images/Mrim-opts.png

#### [Быстрая настройка шрифтов](../Быстрая_настройка_шрифтов.md)

* Установка\_и\_настройка\_в\_Ubuntu.md

#### [Дистрибутивы, которые мы выбираем](../Дистрибутивы__которые_мы_выбираем.md)

* Low\_traffic\_HOWTO.md\#Старпак\_Ткаббера\_Win32

#### [Заглавная страница](../Заглавная_страница.md)

* Pages.md
* Служебная\_AllPages.md
* Служебная\_ListUsers.md
* Служебная\_Statistics.md
* Служебная\_WantedPages.md

#### [Звуковые схемы](../Звуковые_схемы.md)

* ../files/3rd-version\_final.zip
* ../files/Acoustic.theme\_2nd.version.zip
* ../files/New\_default\_theme\_11k-22k\_stereo.zip
* ../files/New\_default\_theme\_44100.zip
* ../files/New\_default\_tkabber\_sound\_theme.zip
* ../images/180px-Acoustic\_sound\_scheme\_instruments.jpg

#### [Культ личности Ткаббера](../Культ_личности_Ткаббера.md)

* ../images/0day-tkabber.png
* ../images/180px-Sneg\_01.jpg
* ../images/180px-Tkabber-master.jpg
* ../images/180px-Tkabber\_jingle.jpg
* ../images/Psycho.jpg
* Topic.md
* Участник\_Hypersw.md

#### [Настройки](../Настройки.md)

* Плагины.md\#customstatus

#### [Начинающим](../Начинающим.md)

* ../images/116px-Discovery\_conference\_1\_ru.png
* ../images/120px-Discovery\_conference\_2\_ru.png
* ../images/120px-Discovery\_ru.png
* ../images/Adding\_user\_2roster\_1\_ru.png
105
106
107
108
109
110
111








112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132

133
134
135
136
137
138
139
* ../images/Tkabber-Login-06-Proxy-Server.png
* ../images/Tkabber-New-Account-Creation-Query.png
* ../images/Tkabber-Quick-Help.png
* ../images/Tkabber-Roster-Tooltip-Subscribed-To.png
* ../images/Tkabber-Stoat-headlines-Search.png
* ../images/Tkabber-Stoat-headlines-summary.png
* ../images/Tkabber-Toolbar.png









#### [Остров посланных на...](../Остров_посланных_на....md)

* ../images/180px-2faq.gif

#### [Палитра цветов](../Палитра_цветов.md)

* Цветовые\_темы\_и\_пиктограммы.md\#Цветовые\_темы

#### [Патчи](../Патчи.md)

* ../files/Aniavatars.zip
* ../files/Chatstatectl.zip
* ../files/Highlight.zip
* ../files/Iroster.zip
* ../files/Muc\_exception\_groups4gen\_enter\_exit\_msgs.zip
* ../files/Sound\_patches.tar.gz
* ../files/Spy-rev.1925.zip
* ../files/Spy.zip
* ../files/Systray.zip
* ../files/Tkabber-MRIM.zip

* Участник\_Ancestor.md
* Участник\_Den\_po.md
* Участник\_Jet.md
* Участник\_Nicktian.md

#### [Плагины](../Плагины.md)








>
>
>
>
>
>
>
>

















|



>







172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
* ../images/Tkabber-Login-06-Proxy-Server.png
* ../images/Tkabber-New-Account-Creation-Query.png
* ../images/Tkabber-Quick-Help.png
* ../images/Tkabber-Roster-Tooltip-Subscribed-To.png
* ../images/Tkabber-Stoat-headlines-Search.png
* ../images/Tkabber-Stoat-headlines-summary.png
* ../images/Tkabber-Toolbar.png
* Установка\_и\_настройка\_в\_Ubuntu.md

#### [Нетривиальные настройки](../Нетривиальные_настройки.md)

* Патчи.md\#\_Отправка\_сообщений\_по\_нажатию\_Ctrl-Enter
* Плагины.md\#autoanswer
* Плагины.md\#customstatus
* Плагины.md\#unixkeys

#### [Остров посланных на...](../Остров_посланных_на....md)

* ../images/180px-2faq.gif

#### [Палитра цветов](../Палитра_цветов.md)

* Цветовые\_темы\_и\_пиктограммы.md\#Цветовые\_темы

#### [Патчи](../Патчи.md)

* ../files/Aniavatars.zip
* ../files/Chatstatectl.zip
* ../files/Highlight.zip
* ../files/Iroster.zip
* ../files/Muc\_exception\_groups4gen\_enter\_exit\_msgs.zip
* ../files/Sound\_patches.tar.gz
* ../files/Spy(rev.1925
* ../files/Spy.zip
* ../files/Systray.zip
* ../files/Tkabber-MRIM.zip
* Планы\_на\_будущее.md\#Контакты\_онлайн\_-\_отображать\_вверху\_списка
* Участник\_Ancestor.md
* Участник\_Den\_po.md
* Участник\_Jet.md
* Участник\_Nicktian.md

#### [Плагины](../Плагины.md)

166
167
168
169
170
171
172

173
174
175
176
177
178
179
180
181
182
183
184
185
186
187


188
189
190
191
192
193
194
195




196
197
198
199
200
201
202
203
204

205
206
207
208
209
210
211
* ../files/Server\_info.tar.gz
* ../files/Stripes.zip
* ../files/Tab\_number-0.1.2.tar.gz
* ../files/Tkabber-khim.zip
* ../files/Vcardavatars.zip
* ../files/Wintweaks.zip
* ../images/1112349.png

* Участник\_Alfix.md
* Участник\_Ancestor.md
* Участник\_HEKP0MAHT.md
* Участник\_Jet.md
* Участник\_Kellin.md
* Участник\_Sceptik.md
* Участник\_Totktonada.md
* Участник\_Yegor.md

#### [Плагины/Juick](../Плагины/Juick.md)

* ../Участник\_Totktonada.md

#### [Планы на будущее](../Планы_на_будущее.md)



* Участник\_Fixer.md
* Участник\_Jet.md
* Участник\_Zakon.md

#### [Проблемы со звуком](../Проблемы_со_звуком.md)

* ../files/Snack-lin.kit
* ../files/Snack.kit





#### [Смайлики и аватары](../Смайлики_и_аватары.md)

* ../files/Emoticons-bombusmod.zip
* ../files/Emoticons-tz.zip
* ../files/Tkabber\_smiles.zip
* ../files/Ultimate\_emoticon\_pack.zip
* ../files/Ultimate\_emoticons\_pack.zip
* ../images/180px-Teh\_ultimate\_smile.png

* Участник\_Русский.md

#### [ТЗ по управлению через параметры командной строки](../ТЗ_по_управлению_через_параметры_командной_строки.md)

* xmpp

#### [Теория](../Теория.md)







>















>
>








>
>
>
>









>







242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
* ../files/Server\_info.tar.gz
* ../files/Stripes.zip
* ../files/Tab\_number-0.1.2.tar.gz
* ../files/Tkabber-khim.zip
* ../files/Vcardavatars.zip
* ../files/Wintweaks.zip
* ../images/1112349.png
* Плагины/Notes.md
* Участник\_Alfix.md
* Участник\_Ancestor.md
* Участник\_HEKP0MAHT.md
* Участник\_Jet.md
* Участник\_Kellin.md
* Участник\_Sceptik.md
* Участник\_Totktonada.md
* Участник\_Yegor.md

#### [Плагины/Juick](../Плагины/Juick.md)

* ../Участник\_Totktonada.md

#### [Планы на будущее](../Планы_на_будущее.md)

* mailto:timur.davletshin@gmail.com
* Плагины.md\#customstatus
* Участник\_Fixer.md
* Участник\_Jet.md
* Участник\_Zakon.md

#### [Проблемы со звуком](../Проблемы_со_звуком.md)

* ../files/Snack-lin.kit
* ../files/Snack.kit

#### [Разработка плагинов](../Разработка_плагинов.md)

* Плагины.md\#urlcmd

#### [Смайлики и аватары](../Смайлики_и_аватары.md)

* ../files/Emoticons-bombusmod.zip
* ../files/Emoticons-tz.zip
* ../files/Tkabber\_smiles.zip
* ../files/Ultimate\_emoticon\_pack.zip
* ../files/Ultimate\_emoticons\_pack.zip
* ../images/180px-Teh\_ultimate\_smile.png
* Патчи.md\#Расширенная\_поддержка\_аватаров\_в\_окне\_чата
* Участник\_Русский.md

#### [ТЗ по управлению через параметры командной строки](../ТЗ_по_управлению_через_параметры_командной_строки.md)

* xmpp

#### [Теория](../Теория.md)
249
250
251
252
253
254
255




256
257
258
259
260
261
262
* ../files/Status\_tokens.diff

#### [Участник:Feez](../Участник_Feez.md)

* Служебная\_ListUsers.md
* Служебная\_Statistics.md
* Служебная\_WantedPages.md





#### [Участник:Kostix](../Участник_Kostix.md)

* Служебная\_Contributions/Kostix.md

#### [Участник:Mellon](../Участник_Mellon.md)








>
>
>
>







333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
* ../files/Status\_tokens.diff

#### [Участник:Feez](../Участник_Feez.md)

* Служебная\_ListUsers.md
* Служебная\_Statistics.md
* Служебная\_WantedPages.md

#### [Участник:Gebb](../Участник_Gebb.md)

* mailto:ge\_b\_b@ngs.ru?subject=wiki

#### [Участник:Kostix](../Участник_Kostix.md)

* Служебная\_Contributions/Kostix.md

#### [Участник:Mellon](../Участник_Mellon.md)

Changes to wiki/ru/Смайлики_и_аватары.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200

201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333


[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Смайлики_и_аватары/index.html)


# Смайлики и аватары

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Предупреждение](#Предупреждение)
* [2 Смайлики](#Смайлики)
   * [2.1 Работа с эмоциконками](#Работа_с_эмоциконками)
   * [2.2 Управление эмоциконками](#Управление_эмоциконками)
   * [2.3 Готовые комплекты смайликов](#Готовые_комплекты_смайликов)
      * [2.3.1 Комплекты анимированных смайликов](#Комплекты_анимированных_смайликов)
      * [2.3.2 Комплект emoticons-bombusmod](#Комплект_emoticons-bombusmod)
      * [2.3.3 Исправленный набор смайликов "от пуза"](#Исправленный_набор_смайликов_от_пуза)
      * [2.3.4 Комплект в стиле "колобки": Big Pack](#Комплект_в_стиле_колобки_Big_Pack)
      * [2.3.5 Комплект окончательный](#Комплект_окончательный)
   * [2.4 Полное искоренение смайликов](#Полное_искоренение_смайликов)
   * [2.5 Клонирование смайликов](#Клонирование_смайликов)
      * [2.5.1 Массовое клонирование](#Массовое_клонирование)
   * [2.6 Анимированные смайлы](#Анимированные_смайлы)
* [3 Аватары](#Аватары)
   * [3.1 Подключение своей аватары](#Подключение_своей_аватары)
   * [3.2 Просмотр аватары собеседника](#Просмотр_аватары_собеседника)
   * [3.3 Ссылки](#Ссылки)

# <a id="Предупреждение"></a>Предупреждение

> Информация в этом разделе написана, исходя из возможностей Ткаббера 0.10.0 и
  выше; если у вас более старая версия, — вам [сюда](0.9.x/Эмоциконки.md).

# <a id="Смайлики"></a>Смайлики

> *40iN\_KoS Нет в русском языке слов,  
> которые могут передать мое настроение..*

> *40iN\_KoS но есть идеаматика..*

> *40iN\_KoS* _\*CRAZY\*_

> *AmeNO нет у меня в клиенте смайлов,  
> которые могут передать твое настроение..*

> _[Цитата с башорга.](http://bash.org.ru/quote.php?num=93914)_

> "Официальное" название этих "улыбаек" в XMPP — "эмоциконки" (от EMOTion
  ICONs), посему везде, где используется термин "эмоциконка", можно читать
  "смайлик"; обратное также верно.

## <a id="Работа_с_эмоциконками"></a>Работа с эмоциконками

Комбинация `<Alt-E>` в окне ввода чата открывает менюшку, в которой можно
выбрать любой смайлик из подключённой схемы. Об этом и о многом другом, кстати,
рассказано в пункте меню **Помощь → Краткая справка.**

Примечание: На самом деле есть по меньшей мере три аргумента против такого
подхода:

* "руками" смайлики набирать ощутимо быстрее, стоит только немного
  потренироваться;
* имейте в виду, что "стандартных" (то есть всем понятных) смайликов не так уж
  и много (не более четырёх), а схемы у всех стоят разные, с разным
  количеством смайликов, поэтому зачастую ваш распрекрасный смайлик будет
  увиден читающим в виде чего-нибудь наподобие **:BEER:**, __\*THUMBS UP\*__
  или **(Y)** — неужели это действительно то, что вы хотели? ;-)
* многие вообще отключают смайлики; поразмыслите над этим, имея в виду
  предыдущий пункт.

## <a id="Управление_эмоциконками"></a>Управление эмоциконками

Наборы эмоциконок можно менять на лету при помощи графического интерфейса
настроек — так же как это делается для наборов иконок интерфейса (pixmaps
themes): настройка находится в группе **Chat → Emoticons** и называется
**::plugins::emoticons::options(theme)**.

Всегда присутствует одна специальная тема с названием "Нет" ("None") — её выбор
(с сохранением) отключает показ смайликов.

Ткаббер _при запуске_ ищет наборы иконок в двух местах:

1. Каталоге `emoticons`, находящемся в каталоге с кодом Ткаббера;
1. Каталоге `emoticons`, находящемся в
   [**каталоге настроек Ткаббера**](Config.tcl_для_начинающих.md#Где).

Поэтому для добавления своего набора эмоциконок в Ткаббер:

* Положите каталог с этим набором в один из каталогов указанных выше
  (предпочтительнее — в пользовательский);
* Перезапустите Ткаббер;
* Зайдите в настройки, выберите появившийся в выпадающем списке новый набор,
  сохраните эту настройку.

Во-вторых, можно подключать наборы эмоциконок "по старинке": при помощи
соответствующей команды в [**файле конфигурации**](Config.tcl_для_начинающих.md).
Этот способ _не_ приветствуется, особенно — для использования новичками.
Команда указывается, например, так:

    hook::add postload_hook {
        ::plugins::emoticons::load_dir "Путь_до_каталога_с_набором_иконок"
    }

Обратите внимание, что начиная с версии 0.10.0 пространство имён
`::plugins::emoticons`, содержащее команды для работы с эмоциконками,
"потеряло" лишнюю букву "e", которую оно имело в более ранних версиях, когда
называлось <code>::plugins::emot<em>e</em>icons</code>. В настоящее время
Ткаббер поддерживает старое название для совместимости, но в следующем
релизе этот "костылёк" будет выброшен, поэтому подумайте об этом заранее.

Имейте в виду, что если вам нужно сослаться в файле конфигурации на
[**каталог настроек Ткаббера**](Config.tcl_для_начинающих.md#Где), наиболее
разумно использовать специальную переменную Ткаббера —
[**$::configdir**]($__configdir.md).

Заодно ответим на пару других достаточно часто возникающих вопросов:

1. Нет, Ткаббер не может увидеть новый набор без перезапуска. В качестве "хака"
   можете попробовать выполнить в [**консоли Ткаббера**](Ткаббер_ЧаВо.md#Консоль_Ткаббера) команду

        ::plugins::emoticons::enable_subsystem

    которая, помимо всего прочего, пересканирует каталоги с наборами
    эмоциконок, но желаемое действие этой команды, естественно, не
    гарантируется.
1. Нет, выбрать набор эмоциконок "руками" из произвольного места нельзя (так
   же, как и набор иконок интерфейса, к примеру). Если всё же вам это очень нужно,
   можете либо указать прямую команду загрузки набора эмоциконок в файле
   конфиурации, либо можете попробовать использовать символические ссылки,
   "линкуя" каталоги с наборами эмоциконок из произвольного каталога в один из
   известных ткабберу, например, в Unix:

        ln -s /usr/local/share/my-smile-packs/uglyfaces ~/.tkabber/emoticons/uglyfaces

    Ситуация в Windows несколько сложнее; подробности изложены [**тут**](Symlinks.md).
1. Стабильный ткаббер 0.10.0 не умеет грузить ".jisp"-файлы напрямую. Сначала
   их нужно распаковать — на самом деле это обычные zip-архивы.

## <a id="Готовые_комплекты_смайликов"></a>Готовые комплекты смайликов

### <a id="Комплекты_анимированных_смайликов"></a>Комплекты анимированных смайликов

1) [*Emoticons-tz.zip*](../files/Emoticons-tz.zip) (202 kB)

Исходник: игра [Timezero](http://www.timezero.ru).

Количество: 90.

Автор комплекта: `xmpp:roz@jabber.ru`.

2) [Big pack.zip](http://kellin.at.tut.by/jabber/tkabb_anim_icons.zip) (520 kB)

Количество: 132.

Автор комплекта: `xmpp:kellin@jabber.ru`.

**Примечание:** смайлики анимированные, и ощутимо забивают процессор даже когда
не используются (просто запущена программа с подключёнными смайликами). При
вызове же окна по `<Alt-E>` процессор забивается на все 100%. Просьба знающим людям
посмотреть, что там такое может быть.

При использовании патча для улучшенной поддержки GIF (см. ниже) забивание
процессора замечено не было.

[**Archimed**](Участник_Archimed.md)

### <a id="Комплект_emoticons-bombusmod"></a>Комплект emoticons-bombusmod

[*Эти смайлики*](../files/Emoticons-bombusmod.zip) от бомбуса перепакованы для
Ткаббера камрадом SnAkE (`xmpp:3XXL@jabber.ru`).

93 штуки, 39 Кб.

### <a id="Исправленный_набор_смайликов_от_пуза"></a>Исправленный набор смайликов "от пуза"

[**Исправленная версия**](../files/Emoticons-puz179_lkpatched.zip)
комплекта ["puzazBox"](http://www.jabber.ru/Members/puz/).

[**Lknight**](Участник_Lknight.md) исправил ошибки в **icondef.xml** и добавил
мнемонику `:-E`, которая ссылается на **devil.gif**.

66 штук, 38 Кб.

### <a id="Комплект_в_стиле_колобки_Big_Pack"></a>Комплект в стиле "колобки": Big Pack

[*Big Pack*](../files/Tkabber_smiles.zip) — большой пак смайлов в стиле
"колобки" также перепакован из "бомбусмодовских" смайлов aka Tasha.

Очень симпатично вышло, на мой взгляд. Эмоций много: 136 штук. Пак весит 162
кб.

Идея создания: `xmpp:artru@jabber.ru`; и, собственно, человек, который долго не
соглашался их подточить для Ткаббера и после длительных уговоров таки
согласился. Спасибо ему: `xmpp:CSander@xmpp.ru`.

Пак выложил [*Русский*](Участник_Русский.md).

### <a id="Комплект_окончательный"></a>Комплект окончательный

![](../images/180px-Teh_ultimate_smile.png)


[*Teh ultimate emoticon pack*](../files/Ultimate_emoticon_pack.zip) — пак с блекджеком
и пр. Выполнен в духе минимализма и любви к литературному русскому языку.

[*Набор из черного и белого шрифта*](../files/Ultimate_emoticons_pack.zip) (как на
скрине) + немного поправлен icondef.xml.

## <a id="Полное_искоренение_смайликов"></a>Полное искоренение смайликов

Выберите тему смайликов с названием "Нет" ("None" в англ. варианте) и сохраните
настройку — смайлики начнут показываться "как есть" — в виде своих текстовых
мнемоник.

## <a id="Клонирование_смайликов"></a>Клонирование смайликов

**Задача: сделать так, чтобы некоторые смайлики, для которых в любимом наборе
нет картинок, всё-таки рисовались  картинками.**

**Решение:** "мнемоники" смайлов связаны с соответствующими картинками при
помощи массива `::emoticons::emoticons`. Ключом (индексом) массива является
мнемоника смайлика, а значением — его картинка. Знание этого позволит нам
"клонировать" смайлики. Помещаем в **config.tcl** такой код:

    hook::add finload_hook {
        namespace eval ::emoticons {
            variable emoticons
            set orig :-)
            set dest =)
            set emoticons($dest) $emoticons($orig)
        }
    }

Сие заклинание связывает мнемонику `=)` с картинкой от мнемоники `:-)`.

**Внимание:** если у вас в конфиге прописана загрузка своего смайл-пака, то
обсуждаемый код должен идти _после_ команды загрузки (т.к. она меняет
содержимое массива со смайликами). Можно поместить их в один `finload_hook`,
лишь бы "клонирование" шло последним.

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

**Внимание** в версиях 0.9.x везде вместо "emoticons" нужно писать
"emoteicons".

### <a id="Массовое_клонирование"></a>Массовое клонирование

Данный подход был изобретён для 0.9.x с целью обрабатывать "ROTFL/LOL" смайлики
типа `:-)))))))))))))))`.

Начиная с 0.10.0 данная проблема решается проще — путём включения опции
**::plugins::emoticons::options(handle\_lol)** в настройках эмоциконок.

Если у вас 0.9.x, читайте [**здесь**](0.9.x/Эмоциконки.md#Массовое_клонирование_эмоциконок).

## <a id="Анимированные_смайлы"></a>Анимированные смайлы

Поддержка анимированных эмоциконок всегда была и является "нелюбимым ребёнком"
в Ткаббере (наравне с аватарами). Причина в том, что анимированные картинки
очень сильно затрудняют их обработку, поскольку на самом деле они значительно
ближе к видеопотокам, чем к картинкам. Поскольку поддержка анимированных гифов
отсутствует в библиотеках **Tk** и **Img**, которые Ткаббер использует для
поддержки изображений, обработка анигифов требует достаточно извращённых
приседаний со стороны разработчиков. До тех пор, пока кто-нибудь не напишет для
Ткаббера спец. код для работы с картинками, который будет _прозрачно_
обрабатывать анигифы так же, как и нормальные картинки, ситуация навряд ли
изменится.

С другой стороны, поддержка анигифов в Ткаббере, в принципе, есть — она
реализована в виде стандартного внешнего плагина **aniemoticons**. Если вы не
знаете как устанавливать плагины Ткаббера, почитайте начало
[**этой статьи**](Плагины.md).

# <a id="Аватары"></a>Аватары
## <a id="Подключение_своей_аватары"></a>Подключение своей аватары

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

    if {[file exists  $::configdir/avatar.gif]} {
        avatar::load_file $::configdir/avatar.gif
    } else {
        avatar::load_file $::rootdir/pixmaps/default/tkabber/tkabber-logo.gif
    }

Как нетрудно заметить, этот код проверяет, имеется ли файл **avatar.gif** в
директории, имя которой содержится в переменной [**$::configdir**]($__configdir.md),
и если его не находит, грузит логотип Ткаббера. Конечно, никто вас не
заставляет называть ваш аватар именно так и класть именно туда. Но не забудьте
написать путь в соответствии с местоположением вашего файла.

При выборе своей аватары помните, что графический файл может быть только
формата gif. Не делайте аватару больших размеров — это не фотография.
Постарайтесь уложиться в 5 килобайт, такие картинки и так будут грузится долго.
И вообще, берите пример с аватары [**Bigote**](Участник_Bigote.md).

Если конфиг у вас был изначально пустым, необходимо заключить строчку, грузящую
аватару (ну или весь вышеприведённый код), в хук:

    hook::add finload_hook {
        avatar::load_file $::configdir/avatar.gif
    }

Теперь, объявив аватару (**Службы → Расширения → Аватара → Объявление**), вы
можете быть уверенным, что клиент, поддерживающий её просмотр, её увидит.
Проверить это можно, заглянув в собственную персональную информацию, находясь в
какой-нибудь конференции (при редактировании персональной инфы аватара не
видна). Помимо прочих должна появиться вкладка "Аватара".

Объявление и "расшаривание" аватары можно тоже прописать в конфиг:

    set avatar::options(announce)   1
    set avatar::options(share)      1

Но вот вопрос: а сам Ткаббер может показывать нам чужие аватары? Краткий ответ:
может. Длинный: надо немного
[**потрудиться**](Патчи.md#Добавление_аватары_в_окно_чата_старый_хак_Badlopа).

## <a id="Просмотр_аватары_собеседника"></a>Просмотр аватары собеседника

Если у человека подключена аватара, то её можно увидеть в персональной инфе.

Если же вы хотите видеть аватару собеседника в окне чата, то:

1. [**Хак от Badlop**](Патчи.md#Добавление_аватары_в_окно_чата_старый_хак_Badlopа).
   Небольшое изменение файла **chat.tcl** покажет аватару в окне чата.
1. [**Патч от Archimed**](Патчи.md#Расширенная_поддержка_аватар_в_окне_чата) —
   расширение возможностей хака от Badlope. Аватары автоматически
   масштабируются под размер выделенной области, поддержка прозрачности,
   поддержка анимированных аватаров.

## <a id="Ссылки"></a>Ссылки

*  [Аватары](http://allavatars.ru/)



>









|
|
|
|
|
|
|
|
|
|
|
|

|
|
|


<
|
<



|
|

|

|

|
|

|

<
|
<



<
|
<

|
<

|
<
|
<
<
<
<
|
<



|
<
<
<

|
<

|

|
|
<

|

|
<
|
|
<

|
<
<
<


|


<
|
<
<
<
<

|
<
<
<

|

|
<
<
|
<
|
<
<
|
<
<
<
<
<
<
|
<
|
|
<





|

|

|

|

|

|

|

|
<
<
<

|
<

|



|
<

|



<
|

|
<

|



<
|

|
<

|
<
<

|





>
|
|

<
|



|
<
<



|
<

|
<
<
<


|
|
|
|
|
|


|

|
<
<
<

|
<
<

|
<



|
<

|
<

|



|
<
<
<
<
<
<
<
<
<

|
<
<
<




|


|

|


|
<
<
<
<

|
<
<
<

|
<


|


|
<
<
<
<

|




|
<
<



|

|

<
|
<
|
<
<



|
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

30

31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

46

47
48
49

50

51
52

53
54

55




56

57
58
59
60



61
62

63
64
65
66
67

68
69
70
71

72
73

74
75



76
77
78
79
80

81




82
83



84
85
86
87


88

89


90






91

92
93

94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113



114
115

116
117
118
119
120
121

122
123
124
125
126

127
128
129

130
131
132
133
134

135
136
137

138
139


140
141
142
143
144
145
146
147
148
149
150

151
152
153
154
155


156
157
158
159

160
161



162
163
164
165
166
167
168
169
170
171
172
173
174



175
176


177
178

179
180
181
182

183
184

185
186
187
188
189
190









191
192



193
194
195
196
197
198
199
200
201
202
203
204
205




206
207



208
209

210
211
212
213
214
215




216
217
218
219
220
221
222


223
224
225
226
227
228
229

230

231


232
233
234
235
236
237
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Смайлики_и_аватары/index.html)


# Смайлики и аватары

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Предупреждение](#Предупреждение)
* [2 Смайлики](#Смайлики)
 * [2.1 Работа с эмоциконками](#Работа_с_эмоциконками)
 * [2.2 Управление эмоциконками](#Управление_эмоциконками)
 * [2.3 Готовые комплекты смайликов](#Готовые_комплекты_смайликов)
  * [2.3.1 Комплекты анимированных смайликов](#Комплекты_анимированных_смайликов)
  * [2.3.2 Комплект emoticons-bombusmod](#Комплект_emoticons-bombusmod)
  * [2.3.3 Исправленный набор смайликов "от пуза"](#Исправленный_набор_смайликов_от_пуза)
  * [2.3.4 Комплект в стиле "колобки": Big Pack](#Комплект_в_стиле_колобки_Big_Pack)
  * [2.3.5 Комплект окончательный](#Комплект_окончательный)
 * [2.4 Полное искоренение смайликов](#Полное_искоренение_смайликов)
 * [2.5 Клонирование смайликов](#Клонирование_смайликов)
  * [2.5.1 Массовое клонирование](#Массовое_клонирование)
 * [2.6 Анимированные смайлы](#Анимированные_смайлы)
* [3 Аватары](#Аватары)
 * [3.1 Подключение своей аватары](#Подключение_своей_аватары)
 * [3.2 Просмотр аватары собеседника](#Просмотр_аватары_собеседника)
 * [3.3 Ссылки](#Ссылки)

# <a id="Предупреждение"></a>Предупреждение

 Информация в этом разделе написана, исходя из возможностей Ткаббера 0.10.0 и выше; если у вас более старая версия, — вам [сюда](0.9.x/Эмоциконки.md). 


# <a id="Смайлики"></a>Смайлики

40iN\_KoS Нет в русском языке слов,
 которые могут передать мое настроение.. 

40iN\_KoS но есть идеаматика.. 

40iN\_KoS \*CRAZY\* 

AmeNO нет у меня в клиенте смайлов,
 которые могут передать твое настроение.. 

[Цитата с башорга.](http://bash.org.ru/quote.php?num=93914) 


 "Официальное" название этих "улыбаек" в XMPP — "эмоциконки" (от EMOTion ICONs), посему везде, где используется термин "эмоциконка", можно читать "смайлик"; обратное также верно. 


## <a id="Работа_с_эмоциконками"></a>Работа с эмоциконками


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


Примечание: На самом деле есть по меньшей мере три аргумента против такого подхода: 


*  "руками" смайлики набирать ощутимо быстрее, стоит только немного потренироваться; 

*  имейте в виду, что "стандартных" (то есть всем понятных) смайликов не так уж и много (не более четырёх), а схемы у всех стоят разные, с разным количеством смайликов, поэтому зачастую ваш распрекрасный смайлик будет увиден читающим в виде чего-нибудь наподобие **:BEER:**, **\*THUMBS UP\*** или **(Y)** — неужели это действительно то, что вы хотели? ;-) 




*  многие вообще отключают смайлики; поразмыслите над этим, имея в виду предыдущий пункт. 


## <a id="Управление_эмоциконками"></a>Управление эмоциконками

Наборы эмоциконок можно менять на лету при помощи графического интерфейса настроек — так же как это делается для наборов иконок интерфейса (pixmaps themes): настройка находится в группе **Chat → Emoticons** и называется **::plugins::emoticons::options(theme)**. 




Всегда присутствует одна специальная тема с названием "Нет" ("None") — её выбор (с сохранением) отключает показ смайликов. 


Ткаббер _при запуске_ ищет наборы иконок в двух местах: 

1.  Каталоге `emoticons`, находящемся в каталоге с кодом Ткаббера; 
1.  Каталоге `emoticons`, находящемся в [каталоге настроек Ткаббера](Config.tcl_для_начинающих.md#Где). 


Поэтому для добавления своего набора эмоциконок в Ткаббер: 

*  Положите каталог с этим набором в один из каталогов указанных выше (предпочтительнее — в пользовательский); 

*  Перезапустите Ткаббер; 
*  Зайдите в настройки, выберите появившийся в выпадающем списке новый набор, сохраните эту настройку. 


Во-вторых, можно подключать наборы эмоциконок "по старинке": при помощи соответствующей команды в [файле конфигурации](Config.tcl_для_начинающих.md). Этот способ _не_ приветствуется, особенно — для использования новичками. Команда указывается, например, так: 




    hook::add postload_hook {
      ::plugins::emoticons::load_dir "Путь_до_каталога_с_набором_иконок"
    }


Обратите внимание, что начиная с версии 0.10.0 пространство имён `::plugins::emoticons`, содержащее команды для работы с эмоциконками, "потеряло" лишнюю букву "e", которую оно имело в более ранних версиях, когда называлось `::plugins::emot_e_icons`. В настоящее время Ткаббер поддерживает старое название для совместимости, но в следующем релизе этот "костылёк" будет выброшен, поэтому подумайте об этом заранее. 





Имейте в виду, что если вам нужно сослаться в файле конфигурации на [каталог настроек Ткаббера](Config.tcl_для_начинающих.md#Где), наиболее разумно использовать специальную переменную Ткаббера — `[configdir]($__configdir.md).` 




Заодно ответим на пару других достаточно часто возникающих вопросов: 

1.  Нет, Ткаббер не может увидеть новый набор без перезапуска. В качестве "хака" можете попробовать выполнить в [консоли Ткаббера](Ткаббер_ЧаВо.md#Консоль_Ткаббера) команду 


    ::plugins::emoticons::enable_subsystem

 которая, помимо всего прочего, пересканирует каталоги с наборами эмоциконок, но желаемое действие этой команды, естественно, не гарантируется. 


1.  Нет, выбрать набор эмоциконок "руками" из произвольного места нельзя (так же, как и набор иконок интерфейса, к примеру). Если всё же вам это очень нужно, можете либо указать прямую команду загрузки набора эмоциконок в файле конфиурации, либо можете попробовать использовать символические ссылки, "линкуя" каталоги с наборами эмоциконок из произвольного каталога в один из известных ткабберу, например, в Unix: 






    ln -s /usr/local/share/my-smile-packs/uglyfaces ~/.tkabber/emoticons/uglyfaces

 Ситуация в Windows несколько сложнее; подробности изложены [тут](Symlinks.md). 
1.  Стабильный ткаббер 0.10.0 не умеет грузить ".jisp"-файлы напрямую. Сначала их нужно распаковать — на самом деле это обычные zip-архивы. 


## <a id="Готовые_комплекты_смайликов"></a>Готовые комплекты смайликов

### <a id="Комплекты_анимированных_смайликов"></a>Комплекты анимированных смайликов

1) [Emoticons-tz.zip](../files/Emoticons-tz.zip) (202 kB) 

Исходник: игра [Timezero](http://www.timezero.ru). 

Количество: 90. 

Автор комплекта: `xmpp:roz@jabber.ru`. 

2) [Big pack.zip](http://kellin.at.tut.by/jabber/tkabb_anim_icons.zip) (520 kB) 

Количество: 132. 

Автор комплекта: `xmpp:kellin@jabber.ru`. 

 Примечание: смайлики анимированные, и ощутимо забивают процессор даже когда не используются (просто запущена программа с подключёнными смайликами). При вызове же окна по Alt-E процессор забивается на все 100%. Просьба знающим людям посмотреть, что там такое может быть. 




При использовании патча для улучшенной поддержки GIF (см. ниже) забивание процессора замечено не было. 


[Archimed](Участник_Archimed.md) 

### <a id="Комплект_emoticons-bombusmod"></a>Комплект emoticons-bombusmod

[Эти смайлики](../files/Emoticons-bombusmod.zip) от бомбуса перепакованы для Ткаббера камрадом SnAkE (`xmpp:3XXL@jabber.ru`). 


93 штуки, 39 Кб. 

### <a id="Исправленный_набор_смайликов_от_пуза"></a>Исправленный набор смайликов "от пуза"


[Исправленная версия](../files/Emoticons-puz179_lkpatched.zip) комплекта ["puzazBox"](http://www.jabber.ru/Members/puz/). 

[Lknight](Участник_Lknight.md) исправил ошибки в **icondef.xml** и добавил мнемонику :-E, которая ссылается на **devil.gif**. 


66 штук, 38 Кб. 

### <a id="Комплект_в_стиле_колобки_Big_Pack"></a>Комплект в стиле "колобки": Big Pack


[Big Pack](../files/Tkabber_smiles.zip) — большой пак смайлов в стиле "колобки" также перепакован из "бомбусмодовских" смайлов aka Tasha. 

Очень симпатично вышло, на мой взгляд. Эмоций много: 136 штук. Пак весит 162  кб. 


Идея создания: `xmpp:artru@jabber.ru`; и, собственно, человек, который долго не соглашался их подточить для Ткаббера и после длительных уговоров таки согласился. Спасибо ему: `xmpp:CSander@xmpp.ru`. 



Пак выложил [Русский](Участник_Русский.md). 

### <a id="Комплект_окончательный"></a>Комплект окончательный

![](../images/180px-Teh_ultimate_smile.png)

![](../images/magnify-clip.png)

[Teh ultimate emoticon pack](../files/Ultimate_emoticon_pack.zip) — пак с блекджеком и пр. Выполнен в духе минимализма и любви к литературному русскому языку. 


[Набор из черного и белого шрифта](../files/Ultimate_emoticons_pack.zip) (как на скрине) + немного поправлен icondef.xml. 

## <a id="Полное_искоренение_смайликов"></a>Полное искоренение смайликов

Выберите тему смайликов с названием "Нет" ("None" в англ. варианте) и сохраните настройку — смайлики начнут показываться "как есть" — в виде своих текстовых мнемоник. 



## <a id="Клонирование_смайликов"></a>Клонирование смайликов

**Задача: сделать так, чтобы некоторые смайлики, для которых в любимом наборе нет картинок, всё-таки рисовались  картинками.** 


**Решение:** "мнемоники" смайлов связаны с соответствующими картинками при помощи массива `::emoteicons::emoteicons`. Ключом (индексом) массива является мнемоника смайлика, а значением — его картинка. Знание этого позволит нам "клонировать" смайлики. Помещаем в **config.tcl** такой код: 




    hook::add finload_hook {
      namespace eval ::emoticons {
        variable emoticons
        set orig :-)
        set dest =)
        set emoticons($dest) $emoticons($orig)
      }
    }

Сие заклинание связывает мнемонику `=)` с картинкой от мнемоники `:-)`. 

**Внимание:** если у вас в конфиге прописана загрузка своего смайл-пака, то обсуждаемый код должен идти _после_ команды загрузки (т.к. она меняет содержимое массива со смайликами). Можно поместить их в один `finload_hook`, лишь бы "клонирование" шло последним. 




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



**Внимание** в версиях 0.9.x везде вместо "emoticons" нужно писать "emoteicons". 


### <a id="Массовое_клонирование"></a>Массовое клонирование

Данный подход был изобретён для 0.9.x с целью обрабатывать "ROTFL/LOL" смайлики типа `:-)))))))))))))))`. 


Начиная с 0.10.0 данная проблема решается проще — путём включения опции **::plugins::emoticons::options(handle\_lol)** в настройках эмоциконок. 


Если у вас 0.9.x, читайте [здесь](0.9.x/Эмоциконки.md#Массовое_клонирование_эмоциконок). 

## <a id="Анимированные_смайлы"></a>Анимированные смайлы

Поддержка анимированных эмоциконок всегда была и является "нелюбимым ребёнком" в Ткаббере (наравне с аватарами). Причина в том, что анимированные картинки очень сильно затрудняют их обработку, поскольку на самом деле они значительно ближе к видеопотокам, чем к картинкам. Поскольку поддержка анимированных гифов отсутствует в библиотеках **Tk** и **Img**, которые Ткаббер использует для поддержки изображений, обработка анигифов требует достаточно извращённых приседаний со стороны разработчиков. До тех пор, пока кто-нибудь не напишет для Ткаббера спец. код для работы с картинками, который будет _прозрачно_ обрабатывать анигифы так же, как и нормальные картинки, ситуация навряд ли изменится. 










С другой стороны, поддержка анигифов в Ткаббере, в принципе, есть — она реализована в виде стандартного внешнего плагина **aniemoticons**. Если вы не знаете как устанавливать плагины Ткаббера, почитайте начало [этой статьи](Плагины.md). 




# <a id="Аватары"></a>Аватары
## <a id="Подключение_своей_аватары"></a>Подключение своей аватары

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

    if {[file exists  $::configdir/avatar.gif]} {
      avatar::load_file $::configdir/avatar.gif
    } else {
      avatar::load_file $::rootdir/pixmaps/default/tkabber/tkabber-logo.gif
    }

Как нетрудно заметить, этот код проверяет, имеется ли файл **avatar.gif** в директории, имя которой содержится в переменной `[configdir]($__configdir.md)`, и если его не находит, грузит логотип Ткаббера. Конечно, никто вас не заставляет называть ваш аватар именно так и класть именно туда. Но не забудьте написать путь в соответствии с местоположением вашего файла. 





При выборе своей аватары помните, что графический файл может быть только формата gif. Не делайте аватару больших размеров — это не фотография. Постарайтесь уложиться в 5 килобайт, такие картинки и так будут грузится долго. И вообще, берите пример с аватары [Bigote](Участник_Bigote.md). 




Если конфиг у вас был изначально пустым, необходимо заключить строчку, грузящую аватару (ну или весь вышеприведённый код), в хук: 


    hook::add finload_hook {
      avatar::load_file $::configdir/avatar.gif
    }

Теперь, объявив аватару (**Службы → Расширения → Аватара → Объявление**), вы можете быть уверенным, что клиент, поддерживающий её просмотр, её увидит. Проверить это можно, заглянув в собственную персональную информацию, находясь в какой-нибудь конференции (при редактировании персональной инфы аватара не видна). Помимо прочих должна появиться вкладка "Аватара". 





Объявление и "расшаривание" аватары можно тоже прописать в конфиг: 

    set avatar::options(announce)   1
    set avatar::options(share)      1

Но вот вопрос: а сам Ткаббер может показывать нам чужие аватары? Краткий ответ: может. Длинный: надо немного [потрудиться](Патчи.md#Добавление_аватары_в_окно_чата_старый_хак_Badlopа). 



## <a id="Просмотр_аватары_собеседника"></a>Просмотр аватары собеседника

Если у человека подключена аватара, то её можно увидеть в персональной инфе. 

Если же вы хотите видеть аватару собеседника в окне чата, то: 


1.  [Хак от Badlop](Патчи.md#Добавление_аватары_в_окно_чата_старый_хак_Badlopа). Небольшое изменение файла **chat.tcl** покажет аватару в окне чата. 

1.  [ Патч от Archimed](Патчи.md#Расширенная_поддержка_аватаров_в_окне_чата) — расширение возможностей хака от Badlope. Аватары автоматически масштабируются под размер выделенной области, поддержка прозрачности, поддержка анимированных аватаров. 



## <a id="Ссылки"></a>Ссылки

*  [Аватары](http://allavatars.ru/) 


Changes to wiki/ru/Спамодавка_списками_приватности.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64


[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Спамодавка_списками_приватности/index.html)


# Спамодавка списками приватности

Материал из Tkabber Wiki

К вопросу о реализуемости аськиной спамодавки при помощи списков приватности на
сервере...

Кратко: не работает вследствие
[бага в ejabberd](https://support.process-one.net/browse/EJAB-300).
Баг пока ещё не исправлен; исправление (формально) ожидается в версии 2.1.0.

Информация к размышлению (носит историко-ностальгический характер):

Чат на девеле с Алексеем Щепиным от 2 декабря:

[02:42]\<aleksey> йандыкс следит за тобой!

[02:43]\<kostix> приветствую! сейчас пытались решить проблему асечного спама,
который приходит с гейта в виде запросов на подписку, при помощи списков
приватности (на ёжике 1.1.2). получается так, что блокировать можно всё, кроме,
собственно, запросов на подписку, хотя в
[RFC 3921](http://tools.ietf.org/html/rfc3921) ясно написано, что, скажем,
запрещение по джиду без указания типов станц блокирует все станцы. можете
что-нибудь подсказать? станцу со списком могу предъявить ;)

[02:43]\<aleksey> а помнится там как раз про подписки небыло

[02:44]\<kostix> Server-side privacy lists enable a user to block all stanzas
from and to other entities based on the entity's JID, roster group, or
subscription status (or globally). Note that this includes subscription-related
presence stanzas, which are excluded by Blocking Inbound Presence Notifications
(Blocking Inbound Presence Notifications).

[02:44]\<kostix> пункт 10.13

[02:44]\<kostix> я вот думаю, может оно не работает из-за того, что гейт в
аську это сервис на сервере?

[02:45]\<kostix> ну так я джид указываю как icq.007spb.ru (к примеру), и запрос
приходит с from='UIN@icq.007spb.ru' type='subscribe'

[02:45]\<kostix> и там спам унутре ;)

[02:46]\<aleksey> от блин, и когда это поменять успели

[02:46]\<kostix> ну вот хрен знает, это teo следит за новостями, а я мал ещё ;)

[02:47]\<kostix> кстати, он мне вчера показал, что в IBB добавили IQ транспорт

[02:47]\<kostix> значит, он где-то про это читает. в регулярное перечитывание
джепов я не верю :)

[02:49]\<kostix> aleksey: то есть, если я правильно понял: 1) ёжик это пока не
умеет; 2) мы можем надеяться, что его научат. да?

[02:52]\<kostix> а вообще, я так думаю, что уж если блокировать всё, то -- всё.
а то ведь может и просто какой-нибудь идиот засыпАть юзера запросами на
подписку.

[02:52]\<aleksey> ага

[02:52]\<aleksey> может :)



>





|
<

<
<
|

|

|

|

|
<
<
<
<
<
<

|

|
<
<
<
<

|

|
<

|
<

|

|

|

|

|
<

|
<

|
<
<

|

|
>
>
1
2
3
4
5
6
7
8

9


10
11
12
13
14
15
16
17
18






19
20
21
22




23
24
25
26

27
28

29
30
31
32
33
34
35
36
37
38

39
40

41
42


43
44
45
46
47
48
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Спамодавка_списками_приватности/index.html)


# Спамодавка списками приватности

Материал из Tkabber Wiki

К вопросу о реализуемости аськиной спамодавки при помощи списков приватности на сервере... 




Кратко: не работает вследствие [бага в ejabberd](https://support.process-one.net/browse/EJAB-300). Баг пока ещё не исправлен; исправление (формально) ожидается в версии 2.1.0. 

Информация к размышлению (носит историко-ностальгический характер): 

Чат на девеле с Алексеем Щепиным от 2 декабря: 

[02:42]\<aleksey> йандыкс следит за тобой! 

[02:43]\<kostix> приветствую! сейчас пытались решить проблему асечного спама, который приходит с гейта в виде запросов на подписку, при помощи списков приватности (на ёжике 1.1.2). получается так, что блокировать можно всё, кроме, собственно, запросов на подписку, хотя в [RFC 3921](http://tools.ietf.org/html/rfc3921) ясно написано, что, скажем, запрещение по джиду без указания типов станц блокирует все станцы. можете что-нибудь подсказать? станцу со списком могу предъявить ;) 







[02:43]\<aleksey> а помнится там как раз про подписки небыло 

[02:44]\<kostix> Server-side privacy lists enable a user to block all stanzas from and to other entities based on the entity's JID, roster group, or subscription status (or globally). Note that this includes subscription-related presence stanzas, which are excluded by Blocking Inbound Presence Notifications (Blocking Inbound Presence Notifications). 





[02:44]\<kostix> пункт 10.13 

[02:44]\<kostix> я вот думаю, может оно не работает из-за того, что гейт в аську это сервис на сервере? 


[02:45]\<kostix> ну так я джид указываю как icq.007spb.ru (к примеру), и запрос приходит с from='UIN@icq.007spb.ru' type='subscribe' 


[02:45]\<kostix> и там спам унутре ;) 

[02:46]\<aleksey> от блин, и когда это поменять успели 

[02:46]\<kostix> ну вот хрен знает, это teo следит за новостями, а я мал ещё ;) 

[02:47]\<kostix> кстати, он мне вчера показал, что в IBB добавили IQ транспорт 

[02:47]\<kostix> значит, он где-то про это читает. в регулярное перечитывание джепов я не верю :) 


[02:49]\<kostix> aleksey: то есть, если я правильно понял: 1) ёжик это пока не умеет; 2) мы можем надеяться, что его научат. да? 


[02:52]\<kostix> а вообще, я так думаю, что уж если блокировать всё, то -- всё. а то ведь может и просто какой-нибудь идиот засыпАть юзера запросами на подписку. 



[02:52]\<aleksey> ага 

[02:52]\<aleksey> может :) 


Changes to wiki/ru/Сравнение_XMPP-клиентов.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27






























28
29
30
31
32
33
34
35
36
37
38
39
40
41

42

43

44

45

46



47

48



49



50



51




[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Сравнение_XMPP-клиентов/index.html)


# Сравнение XMPP-клиентов

Материал из Tkabber Wiki

## <a id="Черновик._Не_трогать_до_исчезновения_этого_заголовка"></a>Черновик. Не трогать до исчезновения этого заголовка

На это странице (будет) представлена сводная таблица сравнения XMPP-клиентов
перебранных рабами Культа для демонстрации всей ничтожности и убогости других
клиентов по сравнению с Ткаббер. Сравнение будет отличатся полнотой, будут
указаны все возможности клиентов включая возможности их расширений и плагинов.
За единицу сравнения будет принят (что бы вы думали?) Ткаббер.

Легенда:

*  "+" - характеристика реализована;
*  "~" - характеристика реализована частично;
*  "-" - характеристика не реализована;

Также предполагается система оценки от 0 до 1.

Схема ячейки пока выглядит так:

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































Характеристики | Ткаббер (live) | Psi+ (live) | Pidgin (2.7.3) | Gajim (0.14) | Kopete (4.4.5) | Mcabber (0.10.0)
---|---|---|---|---|---|---
:**Базовые**:|||||||
XMPP Core ([RFC3920](http://xmpp.org/rfcs/rfc3920.html)) | + | + |||||
XMPP IM ([RFC3920](http://xmpp.org/rfcs/rfc3921.html)) | + | + |||||
In-Band Registration ([XEP-0077](http://xmpp.org/extensions/xep-0077.html)) | + | + |||||
Stream Compression ([XEP-0138](http://xmpp.org/extensions/xep-0138.html)) | + ||||||
:**Криптография**:|||||||
Поддержка OpenPGP ([XEP-0027](http://xmpp.org/extensions/xep-0027.html)) | + | + |||||
[OTR](http://en.wikipedia.org/wiki/Off-the-Record_Messaging) | - ||||||
:**Поддерживаемые типы proxy**:|||||||
HTTP | + ||||||
HTTPS | + ||||||

SOCKS4a | + ||||||

SOCKS5 | + ||||||

:**Приватность**:|||||||

Privacy Lists ([XEP-0016](http://xmpp.org/extensions/xep-0016.html))  + ||||||

Запрет передачи информации о возможностях программы (CAPS) | + ||||||



:***Выборочное игнорирование IQ-запросов***:|||||||

запросы времени (jabber:iq:time) | + ||||||



запросы о времени на компьютере пользователя (urn:xmpp:time) | + ||||||



запросы версии клиента (jabber:iq:version) | + ||||||



запросы версии ОС (jabber:iq:version) | + ||||||





>





|
<
|
<
<
<
<

|

|
|
|

|

|

|
|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

<
<
<
<
<
<
<
<
<
<
<
<
|
>
|
>
|
>
|
>
|
>
|
>
>
>
|
>
|
>
>
>
|
>
>
>
|
>
>
>
|
>
>
>
>
1
2
3
4
5
6
7
8

9




10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54












55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Сравнение_XMPP-клиентов/index.html)


# Сравнение XMPP-клиентов

Материал из Tkabber Wiki

# <a id="Черновик._Не_трогать_до_исчезновения_этого_заголовка"></a>Черновик. Не трогать до исчезновения этого заголовка

На это странице (будет) представлена сводная таблица сравнения XMPP-клиентов перебранных рабами Культа для демонстрации всей ничтожности и убогости других клиентов по сравнению с Ткаббер. Сравнение будет отличатся полнотой, будут указаны все возможности клиентов включая возможности их расширений и плагинов. За единицу сравнения будет принят (что бы вы думали?) Ткаббер. 





Легенда: 

*  "+" - характеристика реализована; 
*  "~" - характеристика реализована частично; 
*  "-" - характеристика не реализована; 

Также предполагается система оценки от 0 до 1. 

Схема ячейки пока выглядит так: 

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

 ** Характеристики **** Ткаббер (live) **** Psi+ (live) **** Pidgin (2.7.3) **** Gajim (0.14) **** Kopete (4.4.5) **** Mcabber (0.10.0) **
 
 ** Базовые **
 
  XMPP Core ([RFC3920](http://xmpp.org/rfcs/rfc3920.html))  +

  +

 XMPP IM ([RFC3920](http://xmpp.org/rfcs/rfc3921.html))  +

  +

  In-Band Registration ([XEP-0077](http://xmpp.org/extensions/xep-0077.html))  +

  +

  Stream Compression ([XEP-0138](http://xmpp.org/extensions/xep-0138.html))  +

 ** Криптография **
 
  Поддержка OpenPGP ([XEP-0027](http://xmpp.org/extensions/xep-0027.html))  +

  +

  [OTR](http://en.wikipedia.org/wiki/Off-the-Record_Messaging)  -

 ** Поддерживаемые типы proxy **
 
  HTTP  +













  HTTPS  +

  SOCKS4a  +

  SOCKS5  +

 ** Приватность **
 
  Privacy Lists ([XEP-0016](http://xmpp.org/extensions/xep-0016.html))  +

  Запрет передачи информации 
о возможностях программы (CAPS) 
  +

  _**Выборочное игнорирование IQ-запросов:**_ 
 
  запросы времени 
(jabber:iq:time) 
  +

  запросы о времени на компьютере 
пользователя (urn:xmpp:time) 
  +

  запросы версии клиента 
(jabber:iq:version) 
  +

  запросы версии ОС 
(jabber:iq:version) 
  +


Changes to wiki/ru/Ссылки.md.

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81


82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190


[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Ссылки/index.html)


# Ссылки

Материал из Tkabber Wiki

На этой странице потихоньку будут собираться ссылки на внешние ресурсы,
посвящённые Ткабберу и Джабберу.

## <a id="toc"></a>Содержание

* [1 Документация и скачивание](#Документация_и_скачивание)
   * [1.1 Сайты о Ткаббере на других языках](#Сайты_о_Ткаббере_на_других_языках)
   * [1.2 Разное](#Разное)
* [2 Народное творчество](#Народное_творчество)
   * [2.1 Цветовые схемы](#Цветовые_схемы)
   * [2.2 Смайл-паки, аватары](#Смайл-паки_аватары)
   * [2.3 Звуковые схемы](#Звуковые_схемы)
   * [2.4 Сторонние плагины](#Сторонние_плагины)
* [3 Tcl/Tk](#Tcl_Tk)
   * [3.1 Документация и книги на английском языке](#Документация_и_книги_на_английском_языке)
   * [3.2 Документация и книги на русском языке](#Документация_и_книги_на_русском_языке)
   * [3.3 Больше тиклей, хороших и разных!](#Больше_тиклей_хороших_и_разных)
   * [3.4 Sources](#Sources)
      * [3.4.1 4 Linux](#4_Linux)
      * [3.4.2 4 Windows](#4_Windows)
      * [3.4.3 4 Mac](#4_Mac)
* [4 Jabber](#Jabber)
* [5 Разное](#Разное)

## <a id="Документация_и_скачивание"></a>Документация и скачивание

* [Официальный сайт Ткаббера.](http://tkabber.jabber.ru)
   * Здесь вы можете [cкачать](http://tkabber.jabber.ru/download) Ткаббер.
   * Здесь — почитать [полную документацию](http://tkabber.jabber.ru/files/doc/tkabber.html)
     (правда, на английском языке).

* [Раздел вики на сайте omsktele.com, посвящённый Ткабберу.](http://wiki.omsktele.com/index.php/Tkabber)
  У парней имеется своя сборка Ткаббера, "заточенная" для пользователей
  сервера **jabber.lan.omsk.ru**.
* [Комьюнити ЖЖ, посвящённое Ткабберу.](http://community.livejournal.com/tkabber/profile)
  Основная его идея — давать информацию о ходе разработки, для обмена идеями и
  т. п. Это **не** форум поддержки. Если вам нужна помощь (и вы не нашли ничего
  полезного здесь, на вики), идите в конференцию
  `xmpp:tkabber@conference.jabber.ru`.
* Кстати, **логи конференции** можно найти по
  [этому адресу](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru).
  Обратите внимание, что на каждую фразу из чатлога можно ссылаться с помощью
  локальной ссылки на время фразы,
  [например, вот так](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2007/07/02.html#23:38:06).
* [Tkabber-SK](http://sourceforge.net/projects/tkabber-sk/) — этакий "форк"
  от SVN-версии Ткаббера за конец декабря 2006 года. В эту версию добавлены
  разные интересные и не очень штуки. Мы пригласили автора к сотрудничеству с
  разработчиками, так как некоторые из его фич могут запросто попасть в транк.
  Да и вообще, незачем распылять силы.
* [Tkabbur](http://code.google.com/p/tkabbur) — ещё один форк.
* [Рассылка tkabber-dev](http://lists.jabber.ru/mailman/listinfo/tkabber-dev):
  если хотите быть в курсе последних фич и багфиксов, обязательно подпишитесь.

### <a id="Сайты_о_Ткаббере_на_других_языках"></a>Сайты о Ткаббере на других языках

* [Tkabber-Manía (esp.)](http://tkabber.redlibre.org/) — испанский сайт,
  посвящённый Ткабберу.

### <a id="Разное"></a>Разное

* [Сколько стоит Ткаббер?](http://www.ohloh.net/projects/3278) Оказывается,
  Ткаббер — один из самых дешёвых клиентов, причём с большим отрывом. Можете
  убедиться в этом сами, посмотрев данные по другим аналогичным программам.

## <a id="Народное_творчество"></a>Народное творчество

### <a id="Цветовые_схемы"></a>Цветовые схемы

* [Новая цветовая схема - Dark Radar](http://tkabber.jabber.ru/files/internal/darkradar-theme.tar.gz)
  (Автор: [Bobus](http://w.bo.org.ru/), скриншот:
  [смотреть](http://tkabber.jabber.ru/files/internal/tkshot002.png))

### <a id="Смайл-паки_аватары"></a>Смайл-паки, аватары

### <a id="Звуковые_схемы"></a>Звуковые схемы



### <a id="Сторонние_плагины"></a>Сторонние плагины

## <a id="Tcl_Tk"></a>Tcl/Tk

### <a id="Документация_и_книги_на_английском_языке"></a>Документация и книги на английском языке

* [Официальный сайт Tcl/Tk](http://tcl.tk)
   * [База знаний этого сайта](http://wiki.tcl.tk)
   * [Раздел этой базы, посвящённый Ткабберу](http://wiki.tcl.tk/11080)
* [J. K. Ousterhout, Tcl and the Tk Toolkit (Reading : Addison-Wesley, 1994)](http://citeseer.ist.psu.edu/ousterhout94tcl.html)
  Книга по тиклю, написанная самим его автором — Джоном Оустерхаутом.
  Безусловно, начинать стоит с неё: всё разложено по полочкам и подробно
  разжёвано. Единственный недостаток — надо читать по-английски. Впрочем, это
  относится к подавляющему большниству документации и практически ко всем
  книгам по тиклю.
* [Brent Welch, Practical Programming in Tcl and Tk](http://www.beedub.com/book/)
  Как видно из названия, эта книга предназначена для практического применения.
  Для начинающих и продвинутых тиклеводов. Ссылки как на amazon.com, так и на
  электронные версии разных изданий книги.
* [Clif Flynt, Tcl/tk A Developers Guide](http://www.amazon.co.uk/Tcl-Developers-Guide-Clif-Flynt/dp/1558608028)
  Тикль для разработчиков.
* [Clif Flynt, Tcl/Tk For Real Programmers](http://www.amazon.com/Tcl-Real-Programmers-Clif-Flynt/dp/0122612051)
  Тикль для настоящих программистов.
* [Salvatore Sanfilippo, TCLWISE. Guide to the Tcl programming language.](http://www.invece.org/tclwise/frontcover.html)
  Ещё одна книга по тиклю.

### <a id="Документация_и_книги_на_русском_языке"></a>Документация и книги на русском языке

* [Документация по тиклю на русском языке](http://www.opennet.ru/docs/RUS/tcltk/)
* [Б. Уэлш, Практическое программирование на Tcl/Tk. Изд-во "Питер".](http://www.book.ru/?page=4&book=87376)
  Перевод на русский язык вышеупомянутой книги Брента Уэлша.
* [Помощь начинающим программистам на тикле, не владеющим английским языком](http://tclstudy.narod.ru/index.html)
* [Ещё кое-что о тикле на русском (с Опеннета)](http://www.opennet.ru/links/sml/36.shtml)
* [Ещё один хороший перевод документации по тиклю.](http://jarosh.by.ru/tcltkrus/)
  На сайте есть также скрипты на тему квантовой химии, написанные автором сайта.

### <a id="Больше_тиклей_хороших_и_разных"></a>Больше тиклей, хороших и разных!

![(!)](../images/Hammer.png) **Сделать:** Развить и дополнить

### <a id="Sources"></a>Sources

[Исходники качать здесь.](http://tcl.tk/software/tcltk/download.html)

#### <a id="4_Linux"></a>4 Linux

В юниксах он обычно уже входит в состав даже минимального дистрибутива. Если же
по каким-то причинам его нет (вы работаете с каким-нибудь минималистичным
Live-CD) или хочется поставить версию посвежей, обращайтесь к вашему менеджеру
пакетов. Например, в случае с Debian это выглядит так:

    apt-cache search tcl
    apt-cache search tk

при этом найдётся что-нибудь вроде

    tcl8.5 - Tcl (the Tool Command Language) v8.5 - run-time files
    tcl8.5-dev - Tcl (the Tool Command Language) v8.5 - development files
    tcl8.5-doc - Tcl (the Tool Command Language) v8.5 - manual pages

    tk8.5 - Tk toolkit for Tcl and X11, v8.5 - run-time files
    tk8.5-dev - Tk toolkit for Tcl and X11, v8.5 - development files
    tk8.5-doc - Tk toolkit for Tcl and X11, v8.5 - manual pages

Установить надо оба пакета (не забывая, что для Ткаббера одного тикля мало,
нужны как минимум ещё tcllib и bwidget):

    sudo apt-get install tcl8.5 tk8.5

#### <a id="4_Windows"></a>4 Windows

* [ActiveState Tcl](http://www.activestate.com/Products/ActiveTcl/) — как
  уверяют авторы, в этом тикле "включены все батарейки", однако они лукавят:
  далеко не все батарейки там есть. Выкачав 21 мег дистра, вы не получите,
  например, такой элементарной вещи как tcllib.
* [wintcltk](http://sourceforge.net/projects/wintcltk) — альтернативная
  сборка под винды.
* [eTcl](http://www.evolane.com/software/etcl/) (есть сборки под все системы,
  кроме того, идёт ещё и на Windows Mobile, что позволяет осуществлять
  [**запуск Ткаббера на Pocket PC**](Ткаббер_на_КПК.md)).

#### <a id="4_Mac"></a>4 Mac

Кроме упомянутого выше eTcl, который идёт на всём и вся, имеется ещё, например,

*  mactcl, о котором лучше почитать [здесь](http://wiki.tcl.tk/2923).
*  Свежую версию TclTkAqua, упомянутой на этой странице,  можно найти
   [тут](http://sourceforge.net/project/shownotes.php?release_id=288380&group_id=86100).

## <a id="Jabber"></a>Jabber

* [Сайт одного из самых крупных российских xmpp-серверов](http://jabber.ru).
  Есть FAQ, форумы, много статей. Архиудобная (но к сожалению, не секурная)
  регистрация — используется XMPP-логин с jabber.ru. Параноикам лучше завести
  отдельный аккаунт на сайте, чтобы не засветить пароль от джаббера.
* [Русскоязычная вики по протоколу XMPP (Jabber).](http://wiki.jrudevels.org)
  Написано простым и понятным языком. Рекомендуется для прочтения новичкам в
  Jabber.
* [Русскоязычное комьюнити в ЖЖ.](http://community.livejournal.com/ru_jabber)
* [Переход с ICQ на Jabber](http://jabberworld.info/Переход_с_ICQ_на_Jabber)
  — тоже архиполезная вики в помощь перебежчикам с других протоколов и просто
  новичкам.
* Надо сюда джепов насовать, чтоб в куче лежали.

## <a id="Разное"></a>Разное

* [Jabber и Livejournal.com — теперь друзья навек :) (eng.)](http://community.livejournal.com/lj_dev/716451.html)
 * [О том же по-русски, но в общих чертах и не из официальных уст.](http://itnews.com.ua/23336.html)



>





|
<




|
|

|
|
|
|

|
|
|
|
|
|
|



|
<
|
|
|
<
|
|
<
<
<
|
<
<
<
<
|
<
<
<
<
|
<
<
<
|
<
|

|

|
<

|

<
|
<

|
<
|

|
<
<

|

|
>
>

<
<
|
<
|

|
|
|
|
|
<
<
<
<
<
|
<
<
|
<
|
<
<
|

|

|
|
<
|
|
|
<

|

|

|

|

|

|
<
<
<




|




|




|
<



|

<
|
<
<
|
<
<
|
<

|

|

|
|
<

|
<
<
|
<
<
<
|
<
|
<
|
<
|

|
<
|
|
>
>
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

32
33
34

35
36



37




38




39



40

41
42
43
44
45

46
47
48

49

50
51

52
53
54


55
56
57
58
59
60
61


62

63
64
65
66
67
68
69





70


71

72


73
74
75
76
77
78

79
80
81

82
83
84
85
86
87
88
89
90
91
92
93



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108

109
110
111
112
113

114


115


116

117
118
119
120
121
122
123

124
125


126



127

128

129

130
131
132

133
134
135
136
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Ссылки/index.html)


# Ссылки

Материал из Tkabber Wiki

На этой странице потихоньку будут собираться ссылки на внешние ресурсы, посвящённые Ткабберу и Джабберу. 


## <a id="toc"></a>Содержание

* [1 Документация и скачивание](#Документация_и_скачивание)
 * [1.1 Сайты о Ткаббере на других языках](#Сайты_о_Ткаббере_на_других_языках)
 * [1.2 Разное](#Разное)
* [2 Народное творчество](#Народное_творчество)
 * [2.1 Цветовые схемы](#Цветовые_схемы)
 * [2.2 Смайл-паки, аватары](#Смайл-паки_аватары)
 * [2.3 Звуковые схемы](#Звуковые_схемы)
 * [2.4 Сторонние плагины](#Сторонние_плагины)
* [3 Tcl/Tk](#Tcl_Tk)
 * [3.1 Документация и книги на английском языке](#Документация_и_книги_на_английском_языке)
 * [3.2 Документация и книги на русском языке](#Документация_и_книги_на_русском_языке)
 * [3.3 Больше тиклей, хороших и разных!](#Больше_тиклей_хороших_и_разных)
 * [3.4 Sources](#Sources)
  * [3.4.1 4 Linux](#4_Linux)
  * [3.4.2 4 Windows](#4_Windows)
  * [3.4.3 4 Mac](#4_Mac)
* [4 Jabber](#Jabber)
* [5 Разное](#Разное)

# <a id="Документация_и_скачивание"></a>Документация и скачивание

*  [Официальный сайт Ткаббера.](http://tkabber.jabber.ru) 
 *  Здесь вы можете [cкачать](http://tkabber.jabber.ru/download) Ткаббер. 
 *  Здесь — почитать [полную документацию](http://tkabber.jabber.ru/files/doc/tkabber.html) (правда, на английском языке). 

 
*  [Раздел вики на сайте omsktele.com, посвящённый Ткабберу.](http://wiki.omsktele.com/index.php/Tkabber) У парней имеется своя сборка Ткаббера, "заточенная" для пользователей сервера **jabber.lan.omsk.ru**. 



*  [Комьюнити ЖЖ, посвящённое Ткабберу.](http://community.livejournal.com/tkabber/profile) Основная его идея — давать информацию о ходе разработки, для обмена идеями и т. п. Это **не** форум поддержки. Если вам нужна помощь (и вы не нашли ничего полезного здесь, на вики), идите в конференцию `xmpp:tkabber@conference.jabber.ru`. 




*  Кстати, **логи конференции** можно найти по [этому адресу](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru). Обратите внимание, что на каждую фразу из чатлога можно ссылаться с помощью локальной ссылки на время фразы, [например, вот так](http://chatlogs.jabber.ru/tkabber@conference.jabber.ru/2007/07/02.html#23:38:06). 




*  [Tkabber-SK](http://sourceforge.net/projects/tkabber-sk/) — этакий "форк" от SVN-версии Ткаббера за конец декабря 2006 года. В эту версию добавлены разные интересные и не очень штуки. Мы пригласили автора к сотрудничеству с разработчиками, так как некоторые из его фич могут запросто попасть в транк. Да и вообще, незачем распылять силы. 



*  [Tkabbur](http://code.google.com/p/tkabbur) — ещё один форк. 

*  [Рассылка tkabber-dev](http://lists.jabber.ru/mailman/listinfo/tkabber-dev): если хотите быть в курсе последних фич и багфиксов, обязательно подпишитесь. 

## <a id="Сайты_о_Ткаббере_на_других_языках"></a>Сайты о Ткаббере на других языках

*  [Tkabber-Manía (esp.)](http://tkabber.redlibre.org/) — испанский сайт, посвящённый Ткабберу. 


## <a id="Разное"></a>Разное


*  [Сколько стоит Ткаббер?](http://www.ohloh.net/projects/3278) Оказывается, Ткаббер — один из самых дешёвых клиентов, причём с большим отрывом. Можете убедиться в этом сами, посмотрев данные по другим аналогичным программам. 


# <a id="Народное_творчество"></a>Народное творчество

## <a id="Цветовые_схемы"></a>Цветовые схемы

*  [Новая цветовая схема - Dark Radar](http://tkabber.jabber.ru/files/internal/darkradar-theme.tar.gz) (Автор: [Bobus](http://w.bo.org.ru/), скриншот: [смотреть](http://tkabber.jabber.ru/files/internal/tkshot002.png)) 



## <a id="Смайл-паки_аватары"></a>Смайл-паки, аватары

## <a id="Звуковые_схемы"></a>Звуковые схемы

## <a id="Сторонние_плагины"></a>Сторонние плагины



# <a id="Tcl_Tk"></a>Tcl/Tk

## <a id="Документация_и_книги_на_английском_языке"></a>Документация и книги на английском языке

*  [Официальный сайт Tcl/Tk](http://tcl.tk) 
 *  [База знаний этого сайта](http://wiki.tcl.tk) 
 *  [Раздел этой базы, посвящённый Ткабберу](http://wiki.tcl.tk/11080) 
 
*  [J. K. Ousterhout, Tcl and the Tk Toolkit (Reading : Addison-Wesley, 1994)](http://citeseer.ist.psu.edu/ousterhout94tcl.html) Книга по тиклю, написанная самим его автором — Джоном Оустерхаутом. Безусловно, начинать стоит с неё: всё разложено по полочкам и подробно разжёвано. Единственный недостаток — надо читать по-английски. Впрочем, это относится к подавляющему большниству документации и практически ко всем книгам по тиклю. 





*  [Brent Welch, Practical Programming in Tcl and Tk](http://www.beedub.com/book/) Как видно из названия, эта книга предназначена для практического применения. Для начинающих и продвинутых тиклеводов. Ссылки как на amazon.com, так и на электронные версии разных изданий книги. 


*  [Clif Flynt, Tcl/tk A Developers Guide](http://www.amazon.co.uk/Tcl-Developers-Guide-Clif-Flynt/dp/1558608028) Тикль для разработчиков. 

*  [Clif Flynt, Tcl/Tk For Real Programmers](http://www.amazon.com/Tcl-Real-Programmers-Clif-Flynt/dp/0122612051) Тикль для настоящих программистов. 


*  [Salvatore Sanfilippo, TCLWISE. Guide to the Tcl programming language.](http://www.invece.org/tclwise/frontcover.html) Ещё одна книга по тиклю. 

## <a id="Документация_и_книги_на_русском_языке"></a>Документация и книги на русском языке

*  [Документация по тиклю на русском языке](http://www.opennet.ru/docs/RUS/tcltk/) 
*  [Б. Уэлш, Практическое программирование на Tcl/Tk. Изд-во "Питер".](http://www.book.ru/?page=4&book=87376) Перевод на русский язык вышеупомянутой книги Брента Уэлша. 

*  [Помощь начинающим программистам на тикле, не владеющим английским языком](http://tclstudy.narod.ru/index.html) 
*  [Ещё кое-что о тикле на русском (с Опеннета)](http://www.opennet.ru/links/sml/36.shtml) 
*  [Ещё один хороший перевод документации по тиклю.](http://jarosh.by.ru/tcltkrus/) На сайте есть также скрипты на тему квантовой химии, написанные автором сайта. 


## <a id="Больше_тиклей_хороших_и_разных"></a>Больше тиклей, хороших и разных!

![(!)](../images/Hammer.png) **Сделать:** Развить и дополнить 

## <a id="Sources"></a>Sources

[Исходники качать здесь.](http://tcl.tk/software/tcltk/download.html) 

### <a id="4_Linux"></a>4 Linux

В юниксах он обычно уже входит в состав даже минимального дистрибутива. Если же по каким-то причинам его нет (вы работаете с каким-нибудь минималистичным Live-CD) или хочется поставить версию посвежей, обращайтесь к вашему менеджеру пакетов. Например, в случае с Debian это выглядит так: 




    apt-cache search tcl
    apt-cache search tk

при этом найдётся что-нибудь вроде 

    tcl8.5 - Tcl (the Tool Command Language) v8.5 - run-time files
    tcl8.5-dev - Tcl (the Tool Command Language) v8.5 - development files
    tcl8.5-doc - Tcl (the Tool Command Language) v8.5 - manual pages
    
    tk8.5 - Tk toolkit for Tcl and X11, v8.5 - run-time files
    tk8.5-dev - Tk toolkit for Tcl and X11, v8.5 - development files
    tk8.5-doc - Tk toolkit for Tcl and X11, v8.5 - manual pages

Установить надо оба пакета (не забывая, что для Ткаббера одного тикля мало, нужны как минимум ещё tcllib и bwidget): 


    sudo apt-get install tcl8.5 tk8.5

### <a id="4_Windows"></a>4 Windows


*  [ActiveState Tcl](http://www.activestate.com/Products/ActiveTcl/) — как уверяют авторы, в этом тикле "включены все батарейки", однако они лукавят: далеко не все батарейки там есть. Выкачав 21 мег дистра, вы не получите, например, такой элементарной вещи как tcllib. 


*  [wintcltk](http://sourceforge.net/projects/wintcltk) — альтернативная сборка под винды. 


*  [eTcl](http://www.evolane.com/software/etcl/) (есть сборки под все системы, кроме того, идёт ещё и на Windows Mobile, что позволяет осуществлять [запуск Ткаббера на Pocket PC](Ткаббер_на_КПК.md)). 


### <a id="4_Mac"></a>4 Mac

Кроме упомянутого выше eTcl, который идёт на всём и вся, имеется ещё, например, 

*  mactcl, о котором лучше почитать [здесь.](http://wiki.tcl.tk/2923) 
*  Свежую версию TclTkAqua, упомянутой на этой странице,  можно найти [тут.](http://sourceforge.net/project/shownotes.php?release_id=288380&group_id=86100) 


# <a id="Jabber"></a>Jabber


*  [Сайт одного из самых крупных российских xmpp-серверов](http://jabber.ru). Есть FAQ, форумы, много статей. Архиудобная (но к сожалению, не секурная) регистрация — используется XMPP-логин с jabber.ru. Параноикам лучше завести отдельный аккаунт на сайте, чтобы не засветить пароль от джаббера. 



*  [Русскоязычная вики по протоколу XMPP (Jabber).](http://wiki.jrudevels.org) Написано простым и понятным языком. Рекомендуется для прочтения новичкам в Jabber. 

*  [Русскоязычное комьюнити в ЖЖ.](http://community.livejournal.com/ru_jabber) 

*  [Переход с ICQ на Jabber](http://jabberworld.info/Переход_с_ICQ_на_Jabber) — тоже архиполезная вики в помощь перебежчикам с других протоколов и просто новичкам. 

*  Надо сюда джепов насовать, чтоб в куче лежали. 

# <a id="Разное"></a>Разное

*  [Jabber и Livejournal.com — теперь друзья навек :) (eng.)](http://community.livejournal.com/lj_dev/716451.html) 
 *  [О том же по-русски, но в общих чертах и не из официальных уст.](http://itnews.com.ua/23336.html) 


Changes to wiki/ru/ТЗ_по_управлению_через_параметры_командной_строки.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/ТЗ_по_управлению_через_параметры_командной_строки/index.html)


# ТЗ по управлению через параметры командной строки

Материал из Tkabber Wiki.

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

## <a id="toc"></a>Содержание

* [1 Зачем это нужно](#Зачем_это_нужно)
* [2 Межпроцессное взаимодействие](#Межпроцессное_взаимодействие)
   * [2.1 Несколько соединений, несколько клиентов](#Несколько_соединений_несколько_клиентов)
* [3 Алгоритмы](#Алгоритмы)
   * [3.1 Выполнение XMPP-URI команд](#Выполнение_XMPP-URI_команд)
      * [3.1.1 Экранирование](#Экранирование)
      * [3.1.2 Кодировки](#Кодировки)
      * [3.1.3 Несколько соединений](#Несколько_соединений)
   * [3.2 Управление PEP-статусами](#Управление_PEP-статусами)
      * [3.2.1 Экранирование](#Экранирование)
      * [3.2.2 Кодировки](#Кодировки)
      * [3.2.3 Несколько соединений](#Несколько_соединений)
* [4 См. также](#См._также)

## <a id="Зачем_это_нужно"></a>Зачем это нужно

Для двух вещей:  

*  Выполнение [XMPP-URI](http://www.xmpp.org/extensions/xep-0147.html) нужно, чтобы в браузеры можно было вписать _tkabber -uri [xmpp](xmpp):\<uri-команда>_ и все ссылки вида [xmpp:tkabber@conference.jabber.ru?join](xmpp:tkabber@conference.jabber.ru?join)  заработали. 













|

|
|
|
|
|
|
|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/ТЗ_по_управлению_через_параметры_командной_строки/index.html)


# ТЗ по управлению через параметры командной строки

Материал из Tkabber Wiki.

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

## <a id="toc"></a>Содержание

* [1 Зачем это нужно](#Зачем_это_нужно)
* [2 Межпроцессное взаимодействие](#Межпроцессное_взаимодействие)
 * [2.1 Несколько соединений, несколько клиентов](#Несколько_соединений_несколько_клиентов)
* [3 Алгоритмы](#Алгоритмы)
 * [3.1 Выполнение XMPP-URI команд](#Выполнение_XMPP-URI_команд)
  * [3.1.1 Экранирование](#Экранирование)
  * [3.1.2 Кодировки](#Кодировки)
  * [3.1.3 Несколько соединений](#Несколько_соединений)
 * [3.2 Управление PEP-статусами](#Управление_PEP-статусами)
  * [3.2.1 Экранирование](#Экранирование)
  * [3.2.2 Кодировки](#Кодировки)
  * [3.2.3 Несколько соединений](#Несколько_соединений)
* [4 См. также](#См._также)

## <a id="Зачем_это_нужно"></a>Зачем это нужно

Для двух вещей:  

*  Выполнение [XMPP-URI](http://www.xmpp.org/extensions/xep-0147.html) нужно, чтобы в браузеры можно было вписать _tkabber -uri [xmpp](xmpp):\<uri-команда>_ и все ссылки вида [xmpp:tkabber@conference.jabber.ru?join](xmpp:tkabber@conference.jabber.ru?join)  заработали. 

Changes to wiki/ru/Теория.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Теория/index.html)


# Теория

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Глоссарик (словарий)](#Глоссарик_словарий)
* [2 Статьи](#Статьи)
   * [2.1 Начинающим](#Начинающим)
      * [2.1.1 О Ткаббере](#О_Ткаббере)
      * [2.1.2 Быстрый старт (с кучей скриншотов)](#Быстрый_старт_с_кучей_скриншотов)
      * [2.1.3 Настройка Ткаббера: азы и глубже](#Настройка_Ткаббера_азы_и_глубже)
   * [2.2 Продвинутым пользователям](#Продвинутым_пользователям)
      * [2.2.1 Тонкая настройка](#Тонкая_настройка)
      * [2.2.2 Меню](#Меню)
      * [2.2.3 Настройки](#Настройки)
      * [2.2.4 Config.tcl с человеческим лицом](#Config.tcl_с_человеческим_лицом)
   * [2.3 Другие статьи](#Другие_статьи)

# <a id="Глоссарик_словарий"></a>Глоссарик (словарий)
[1001 непонятное слово из тех, что вы хотели, но боялись спросить.](Терминология.md) 

# <a id="Статьи"></a>Статьи
## <a id="Начинающим"></a>Начинающим












|
|
|
|
|
|
|
|
|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Теория/index.html)


# Теория

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Глоссарик (словарий)](#Глоссарик_словарий)
* [2 Статьи](#Статьи)
 * [2.1 Начинающим](#Начинающим)
  * [2.1.1 О Ткаббере](#О_Ткаббере)
  * [2.1.2 Быстрый старт (с кучей скриншотов)](#Быстрый_старт_с_кучей_скриншотов)
  * [2.1.3 Настройка Ткаббера: азы и глубже](#Настройка_Ткаббера_азы_и_глубже)
 * [2.2 Продвинутым пользователям](#Продвинутым_пользователям)
  * [2.2.1 Тонкая настройка](#Тонкая_настройка)
  * [2.2.2 Меню](#Меню)
  * [2.2.3 Настройки](#Настройки)
  * [2.2.4 Config.tcl с человеческим лицом](#Config.tcl_с_человеческим_лицом)
 * [2.3 Другие статьи](#Другие_статьи)

# <a id="Глоссарик_словарий"></a>Глоссарик (словарий)
[1001 непонятное слово из тех, что вы хотели, но боялись спросить.](Терминология.md) 

# <a id="Статьи"></a>Статьи
## <a id="Начинающим"></a>Начинающим

Changes to wiki/ru/Терминология.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Терминология/index.html)


# Терминология

Материал из Tkabber Wiki

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

## <a id="toc"></a>Содержание

* [1 Tkabber](#Tkabber)
   * [1.1 Токен (token)](#Токен_token)
   * [1.2 Окно XML](#Окно_XML)
* [2 Сети](#Сети)
   * [2.1 SOCKS5](#SOCKS5)
* [3 Windows](#Windows)
* [4 Linux](#Linux)
* [5 Tcl/Tk](#Tcl_Tk)
* [6 Jabber](#Jabber)
   * [6.1 XML](#XML)
   * [6.2 Станца (stanza)](#Станца_stanza)
* [7 Разное](#Разное)
   * [7.1 Плагин (plugin)](#Плагин_plugin)
   * [7.2 Биндинги (bindings)](#Биндинги_bindings)
   * [7.3 Транк (trunk)](#Транк_trunk)
   * [7.4 Переменные окружения](#Переменные_окружения)

# <a id="Tkabber"></a>Tkabber
Тут мы будем рассматривать термины, относящиеся (впрочем, весьма условно) к Ткабберу. 

## <a id="Токен_token"></a>Токен (token)

Одно из значений английского слова [token](http://dictionary.reference.com/browse/token) — отличительное свойство или характеристика. В этом значении оно используется для случаев идентификации, когда человек или программа должна удостовериться в личности собеседника. Например, [session token](http://en.wikipedia.org/wiki/Session_token) или [security token](http://en.wikipedia.org/wiki/Security_token) (обе ссылки на английском). Ещё одно значение, на этот раз грамматическое — основная, простейшая, неделимая лексическая единица. В этом случае речь может идти о разбиении текста на небольшие отрывки или даже слова, чтобы было удобнее их анализировать. Смотрите [пример в Википедии](http://en.wikipedia.org/wiki/Token_(parser)) (тоже по-английски). 












|
|

|




|
|

|
|
|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Терминология/index.html)


# Терминология

Материал из Tkabber Wiki

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

## <a id="toc"></a>Содержание

* [1 Tkabber](#Tkabber)
 * [1.1 Токен (token)](#Токен_token)
 * [1.2 Окно XML](#Окно_XML)
* [2 Сети](#Сети)
 * [2.1 SOCKS5](#SOCKS5)
* [3 Windows](#Windows)
* [4 Linux](#Linux)
* [5 Tcl/Tk](#Tcl_Tk)
* [6 Jabber](#Jabber)
 * [6.1 XML](#XML)
 * [6.2 Станца (stanza)](#Станца_stanza)
* [7 Разное](#Разное)
 * [7.1 Плагин (plugin)](#Плагин_plugin)
 * [7.2 Биндинги (bindings)](#Биндинги_bindings)
 * [7.3 Транк (trunk)](#Транк_trunk)
 * [7.4 Переменные окружения](#Переменные_окружения)

# <a id="Tkabber"></a>Tkabber
Тут мы будем рассматривать термины, относящиеся (впрочем, весьма условно) к Ткабберу. 

## <a id="Токен_token"></a>Токен (token)

Одно из значений английского слова [token](http://dictionary.reference.com/browse/token) — отличительное свойство или характеристика. В этом значении оно используется для случаев идентификации, когда человек или программа должна удостовериться в личности собеседника. Например, [session token](http://en.wikipedia.org/wiki/Session_token) или [security token](http://en.wikipedia.org/wiki/Security_token) (обе ссылки на английском). Ещё одно значение, на этот раз грамматическое — основная, простейшая, неделимая лексическая единица. В этом случае речь может идти о разбиении текста на небольшие отрывки или даже слова, чтобы было удобнее их анализировать. Смотрите [пример в Википедии](http://en.wikipedia.org/wiki/Token_(parser)) (тоже по-английски). 

Changes to wiki/ru/Ткаббер_ЧаВо.md.

10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41


42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115


116
117
118
119
120
121
122
Если проблема, которая у вас возникла, здесь не освещена, заходите на `xmpp:tkabber@conference.jabber.ru?join` — подумаем вместе, и если решим — ответ появится либо здесь, либо в одной из статей этой вики. 

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

## <a id="toc"></a>Содержание

* [1 Внешний вид и звук](#Внешний_вид_и_звук)
   * [1.1 Почему Ткаббер такой страшный?](#Почему_Ткаббер_такой_страшный)
   * [1.2 Шрифты](#Шрифты)
   * [1.3 Смайлики: 1) вызов из меню; 2) не подключаются; 3) не хочу их; 4) анимированные](#Смайлики_1_вызов_из_меню_2_не_подключаются_3_не_хочу_их_4_анимированные)
   * [1.4 Не видны иконки/фото/и т.д. в JPEG/PNG](#Не_видны_иконки_фото_и_т.д._в_JPEG_PNG)
   * [1.5 Цветовые схемы](#Цветовые_схемы)
   * [1.6 Цвета сообщений "асечников"](#Цвета_сообщений_асечников)
   * [1.7 Поддерживает ли Ткаббер аватары?](#Поддерживает_ли_Ткаббер_аватары)
   * [1.8 Регулировка громкости звука](#Регулировка_громкости_звука)
   * [1.9 В старпаке/старките нет звука/поддержки JPEG,PNG](#В_старпаке_старките_нет_звука_поддержки_JPEGPNG)
* [2 Глюки, возникающие в процессе работы](#Глюки_возникающие_в_процессе_работы)
   * [2.1 Общие вопросы](#Общие_вопросы)
      * [2.1.1 Ткаббер и Ufanet](#Ткаббер_и_Ufanet)
      * [2.1.2 Долгая загрузка Ткаббера](#Долгая_загрузка_Ткаббера)
      * [2.1.3 Ткаббер "виснет" при попытке логина на сервер](#Ткаббер_виснет_при_попытке_логина_на_сервер)
      * [2.1.4 Пересылка файлов](#Пересылка_файлов)
      * [2.1.5 Ткаббер постоянно держит меня в состоянии "отошёл" ("away")](#Ткаббер_постоянно_держит_меня_в_состоянии_отошёл_away)
      * [2.1.6 Не могу приконнектиться к серверу через прокси](#Не_могу_приконнектиться_к_серверу_через_прокси)
      * [2.1.7 Keep alive в Ткаббере — возможно ли?](#Keep_alive_в_Ткаббере_-_возможно_ли)
      * [2.1.8 Что с грифельной доской?](#Что_с_грифельной_доской)
      * [2.1.9 Ткаббер в упор не видит SSL-сертификат для коннекта к серверу](#Ткаббер_в_упор_не_видит_SSL-сертификат_для_коннекта_к_серверу)
      * [2.1.10 Не могу отредактировать закладку конференции в ростере](#Не_могу_отредактировать_закладку_конференции_в_ростере)
      * [2.1.11 Ткаббер и iChat](#Ткаббер_и_iChat)
      * [2.1.12 Конфликт хоткеев в Ткаббере и puntoswitcher, gxneur, etc.](#Конфликт_хоткеев_в_Ткаббере_и_puntoswitcher_gxneur_etc.)
   * [2.2 Вопросы, связанные с Линукс](#Вопросы_связанные_с_Линукс)
      * [2.2.1 Шифрование в Ткаббере: проблемы с **gpgme/tclgpgme**](#Шифрование_в_Ткаббере_проблемы_с_gpgme_tclgpgme)


      * [2.2.2 В Ubuntu не вводятся русские буквы в Ткаббере, chto delat?](#В_Ubuntu_не_вводятся_русские_буквы_в_Ткаббере_chto_delat)
      * [2.2.3 Ткаббер под X Window падает при попытке показать "странные" символы](#Ткаббер_под_X_Window_падает_при_попытке_показать_странные_символы)
      * [2.2.4 Не работает вставка по Control-v под X Window](#Не_работает_вставка_по_Control-v_под_X_Window)
      * [2.2.5 В Gentoo не работает сворачивание в трей](#В_Gentoo_не_работает_сворачивание_в_трей)
      * [2.2.6 Fedora 8 и Tcl/Tk 8.5](#Fedora_8_и_Tcl_Tk_8.5)
      * [2.2.7 Обновил тикль до 8.5, но Ткаббер по-прежнему запускается с 8.4](#Обновил_тикль_до_8.5_но_Ткаббер_по-прежнему_запускается_с_8.4)
      * [2.2.8 Проигрывание звука в Linux](#Проигрывание_звука_в_Linux)
      * [2.2.9 Userinfo в KDE 4.x](#Userinfo_в_KDE_4.x)
      * [2.2.10 Диалоговые окна Tk на многоголовом X11-сервере](#Диалоговые_окна_Tk_на_многоголовом_X11-сервере)
   * [2.3 Вопросы, связанные с Виндовс](#Вопросы_связанные_с_Виндовс)
      * [2.3.1 В старпаке/старките нет звука/поддержки JPEG,PNG/сжатия](#В_старпаке_старките_нет_звука_поддержки_JPEGPNG_сжатия)
      * [2.3.2 Не работает браузер под виндами](#Не_работает_браузер_под_виндами)
      * [2.3.3 При клике на URL'е в Ткаббере запускается две Оперы и открывают страницу два раза](#При_клике_на_URLе_в_Ткаббере_запускается_две_Оперы_и_открывают_страницу_два_раза)
      * [2.3.4 Странное поведение прокрутки содержимого окна чата колесом мыши](#Странное_поведение_прокрутки_содержимого_окна_чата_колесом_мыши)
      * [2.3.5 Ошибка: wrong \# args: should be "zlib option data ?...?", что делать?](#Ошибка_wrong_N_args_should_be_zlib_option_data_..._что_делать)
      * [2.3.6 Windows, дистрибутив от ActiveState — "падения" при нажатии Alt-любая кнопка в главном окне](#Windows_дистрибутив_от_ActiveState_-_падения_при_нажатии_Alt-любая_кнопка_в_главном_окне)
      * [2.3.7 Windows, дистрибутив от ActiveState — "падения" при открытии в фоне окна со смайликом](#Windows_дистрибутив_от_ActiveState_-_падения_при_открытии_в_фоне_окна_со_смайликом)
      * [2.3.8 Фатальная ошибка в wish при запуске полноэкранных приложений под Windows](#Фатальная_ошибка_в_wish_при_запуске_полноэкранных_приложений_под_Windows)
* [3 А как мне...?](#А_как_мне...)
   * [3.1 Настройка Ткаббера (Не найду файл config.tcl)](#Настройка_Ткаббера_Не_найду_файл_config.tcl)
   * [3.2 Как настроить "автологин"?](#Как_настроить_автологин)
   * [3.3 Работать с RSS](#Работать_с_RSS)
   * [3.4 Отправка сообщений по Ctrl-Enter](#Отправка_сообщений_по_Ctrl-Enter)
   * [3.5 Отправка сообщений по NumPad Enter](#Отправка_сообщений_по_NumPad_Enter)
   * [3.6 Одновременная работа с несколькими аккаунтами](#Одновременная_работа_с_несколькими_аккаунтами)
   * [3.7 Как насчёт автозахода на конференции?](#Как_насчёт_автозахода_на_конференции)
   * [3.8 Сжатие трафика в Ткаббере](#Сжатие_трафика_в_Ткаббере)
   * [3.9 Выделение текста жирным, курсивом и подчёркиванием](#Выделение_текста_жирным_курсивом_и_подчёркиванием)
   * [3.10 Ввод "хитрых" юникодных символов](#Ввод_хитрых_юникодных_символов)
   * [3.11 Игнор — великая вещь!](#Игнор_-_великая_вещь)
   * [3.12 Подтверждения](#Подтверждения)
   * [3.13 Удалённое управление](#Удалённое_управление)
   * [3.14 Команды Ткаббера](#Команды_Ткаббера)
   * [3.15 Скрытие версий клиента и ОС](#Скрытие_версий_клиента_и_ОС)
   * [3.16 Как подключить плагин?](#Как_подключить_плагин)
   * [3.17 Как уменьшить трафик?](#Как_уменьшить_трафик)
   * [3.18 Самостоятельная сборка Старпака](#Самостоятельная_сборка_Старпака)
   * [3.19 "Быстрый" Copy/Paste помимо буфера Windows](#Быстрый_Copy_Paste_помимо_буфера_Windows)
   * [3.20 Проверка орфографии](#Проверка_орфографии)
   * [3.21 Как перенести ростер с сервера на сервер? Импортировать контакты ICQ?](#Как_перенести_ростер_с_сервера_на_сервер_Импортировать_контакты_ICQ)
   * [3.22 Как почитать протокол общения "в привате" с участником групчата, которого больше нет в комнате?](#Как_почитать_протокол_общения_в_привате_с_участником_групчата_которого_больше_нет_в_комнате)
   * [3.23 Указать причину кика/бана](#Указать_причину_кика_бана)
   * [3.24 Блокировать спам с MRIM-гейта](#Блокировать_спам_с_MRIM-гейта)
   * [3.25 Конфигурирование конференции](#Конфигурирование_конференции)
   * [3.26 Отключить к (нецензурные слова пропущены) splash-окно](#Отключить_к_нецензурные_слова_пропущены_splash-окно)
   * [3.27 Подключить Ткаббер через SOCKS-сервер](#Подключить_Ткаббер_через_SOCKS-сервер)
   * [3.28 Подключить Ткаббер через Tor, для анонимного использования](#Подключить_Ткаббер_через_Tor_для_анонимного_использования)
   * [3.29 Подключиться к Google Talk](#Подключиться_к_Google_Talk)
   * [3.30 Победить предупреждение о проблеме с сертификатом сервера?](#Победить_предупреждение_о_проблеме_с_сертификатом_сервера)
   * [3.31 Работать с версией из SVN](#Работать_с_версией_из_SVN)
   * [3.32 Задолбало выпадающее меню в контекстном меню MUC-юзера](#Задолбало_выпадающее_меню_в_контекстном_меню_MUC-юзера)
   * [3.33 Как мне собрать новый tclgpg с googlecode?](#Как_мне_собрать_новый_tclgpg_с_googlecode)
   * [3.34 Как настроить работу с плагином OSD?](#Как_настроить_работу_с_плагином_OSD)
   * [3.35 Включить интерфейс на другом языке?](#Включить_интерфейс_на_другом_языке)
   * [3.36 Изменить и зафиксировать ширину ростера?](#Изменить_и_зафиксировать_ширину_ростера)
   * [3.37 Изменить шрифт в окошке ввода сообщения?](#Изменить_шрифт_в_окошке_ввода_сообщения)
   * [3.38 Изменить интервал повторного подключения к серверу?](#Изменить_интервал_повторного_подключения_к_серверу)
* [4 Всякая всячина](#Всякая_всячина)
   * [4.1 Что такое...?](#Что_такое...)
      * [4.1.1 Ростер](#Ростер)
      * [4.1.2 Ресурс](#Ресурс)
      * [4.1.3 Приоритет](#Приоритет)
      * [4.1.4 Консоль Ткаббера](#Консоль_Ткаббера)
      * [4.1.5 Репозиторий teo](#Репозиторий_teo)
   * [4.2 Разное](#Разное)
      * [4.2.1 ...а мне ИГРАТЬ охота!!!](#...а_мне_ИГРАТЬ_охота)
      * [4.2.2 Старые версии Ткаббера и плагинов](#Старые_версии_Ткаббера_и_плагинов)
      * [4.2.3 Работает ли Ткаббер на КПК?](#Работает_ли_Ткаббер_на_КПК)
      * [4.2.4 Почему Ткаббер написан именно на Tcl/Tk?](#Почему_Ткаббер_написан_именно_на_Tcl_Tk)
      * [4.2.5 Кто убил Лору Палмер? ©](#Кто_убил_Лору_Палмер_©)
      * [4.2.6 У вас в конференции топик с ошибкой написан](#У_вас_в_конференции_топик_с_ошибкой_написан)
      * [4.2.7 А добавят ли когда-нибудь в Ткаббер...?](#А_добавят_ли_когда-нибудь_в_Ткаббер...)
   * [4.3 Вопросы, связанные с протоколом XMPP](#Вопросы_связанные_с_протоколом_XMPP)
      * [4.3.1 MUC](#MUC)



# <a id="Внешний_вид_и_звук"></a>Внешний вид и звук
[Ткаббер ЧаВо/Внешний вид и звук](Ткаббер_ЧаВо/Внешний_вид_и_звук.md) 

## <a id="Почему_Ткаббер_такой_страшный"></a>Почему Ткаббер такой страшный?

[Перейти к ответу](Ткаббер_ЧаВо/Внешний_вид_и_звук.md#Почему_Ткаббер_такой_страшный). 







|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>







10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
Если проблема, которая у вас возникла, здесь не освещена, заходите на `xmpp:tkabber@conference.jabber.ru?join` — подумаем вместе, и если решим — ответ появится либо здесь, либо в одной из статей этой вики. 

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

## <a id="toc"></a>Содержание

* [1 Внешний вид и звук](#Внешний_вид_и_звук)
 * [1.1 Почему Ткаббер такой страшный?](#Почему_Ткаббер_такой_страшный)
 * [1.2 Шрифты](#Шрифты)
 * [1.3 Смайлики: 1) вызов из меню; 2) не подключаются; 3) не хочу их; 4) анимированные](#Смайлики_1_вызов_из_меню_2_не_подключаются_3_не_хочу_их_4_анимированные)
 * [1.4 Не видны иконки/фото/и т.д. в JPEG/PNG](#Не_видны_иконки_фото_и_т.д._в_JPEG_PNG)
 * [1.5 Цветовые схемы](#Цветовые_схемы)
 * [1.6 Цвета сообщений "асечников"](#Цвета_сообщений_асечников)
 * [1.7 Поддерживает ли Ткаббер аватары?](#Поддерживает_ли_Ткаббер_аватары)
 * [1.8 Регулировка громкости звука](#Регулировка_громкости_звука)
 * [1.9 В старпаке/старките нет звука/поддержки JPEG,PNG](#В_старпаке_старките_нет_звука_поддержки_JPEGPNG)
* [2 Глюки, возникающие в процессе работы](#Глюки_возникающие_в_процессе_работы)
 * [2.1 Общие вопросы](#Общие_вопросы)
  * [2.1.1 Ткаббер и Ufanet](#Ткаббер_и_Ufanet)
  * [2.1.2 Долгая загрузка Ткаббера](#Долгая_загрузка_Ткаббера)
  * [2.1.3 Ткаббер "виснет" при попытке логина на сервер](#Ткаббер_виснет_при_попытке_логина_на_сервер)
  * [2.1.4 Пересылка файлов](#Пересылка_файлов)
  * [2.1.5 Ткаббер постоянно держит меня в состоянии "отошёл" ("away")](#Ткаббер_постоянно_держит_меня_в_состоянии_отошёл_away)
  * [2.1.6 Не могу приконнектиться к серверу через прокси](#Не_могу_приконнектиться_к_серверу_через_прокси)
  * [2.1.7 Keep alive в Ткаббере — возможно ли?](#Keep_alive_в_Ткаббере_-_возможно_ли)
  * [2.1.8 Что с грифельной доской?](#Что_с_грифельной_доской)
  * [2.1.9 Ткаббер в упор не видит SSL-сертификат для коннекта к серверу](#Ткаббер_в_упор_не_видит_SSL-сертификат_для_коннекта_к_серверу)
  * [2.1.10 Не могу отредактировать закладку конференции в ростере](#Не_могу_отредактировать_закладку_конференции_в_ростере)
  * [2.1.11 Ткаббер и iChat](#Ткаббер_и_iChat)
  * [2.1.12 Конфликт хоткеев в Ткаббере и puntoswitcher, gxneur, etc.](#Конфликт_хоткеев_в_Ткаббере_и_puntoswitcher_gxneur_etc.)
 * [2.2 Вопросы, связанные с Линукс](#Вопросы_связанные_с_Линукс)
  * [2.2.1 Шифрование в Ткаббере: проблемы с **gpgme/tclgpgme**](#Шифрование_в_Ткаббере_проблемы_с_gpgme_tclgpgme)
   * [2.2.1 Не могу скомпилировать tclgpgme](#Не_могу_скомпилировать_tclgpgme)
   * [2.2.1 Ткаббер валится при вводе gpg-пароля](#Ткаббер_валится_при_вводе_gpg-пароля)
  * [2.2.2 В Ubuntu не вводятся русские буквы в Ткаббере, chto delat?](#В_Ubuntu_не_вводятся_русские_буквы_в_Ткаббере_chto_delat)
  * [2.2.3 Ткаббер под X Window падает при попытке показать "странные" символы](#Ткаббер_под_X_Window_падает_при_попытке_показать_странные_символы)
  * [2.2.4 Не работает вставка по Control-v под X Window](#Не_работает_вставка_по_Control-v_под_X_Window)
  * [2.2.5 В Gentoo не работает сворачивание в трей](#В_Gentoo_не_работает_сворачивание_в_трей)
  * [2.2.6 Fedora 8 и Tcl/Tk 8.5](#Fedora_8_и_Tcl_Tk_8.5)
  * [2.2.7 Обновил тикль до 8.5, но Ткаббер по-прежнему запускается с 8.4](#Обновил_тикль_до_8.5_но_Ткаббер_по-прежнему_запускается_с_8.4)
  * [2.2.8 Проигрывание звука в Linux](#Проигрывание_звука_в_Linux)
  * [2.2.9 Userinfo в KDE 4.x](#Userinfo_в_KDE_4.x)
  * [2.2.10 Диалоговые окна Tk на многоголовом X11-сервере](#Диалоговые_окна_Tk_на_многоголовом_X11-сервере)
 * [2.3 Вопросы, связанные с Виндовс](#Вопросы_связанные_с_Виндовс)
  * [2.3.1 В старпаке/старките нет звука/поддержки JPEG,PNG/сжатия](#В_старпаке_старките_нет_звука_поддержки_JPEGPNG_сжатия)
  * [2.3.2 Не работает браузер под виндами](#Не_работает_браузер_под_виндами)
  * [2.3.3 При клике на URL'е в Ткаббере запускается две Оперы и открывают страницу два раза](#При_клике_на_URLе_в_Ткаббере_запускается_две_Оперы_и_открывают_страницу_два_раза)
  * [2.3.4 Странное поведение прокрутки содержимого окна чата колесом мыши](#Странное_поведение_прокрутки_содержимого_окна_чата_колесом_мыши)
  * [2.3.5 Ошибка: wrong \# args: should be "zlib option data ?...?", что делать?](#Ошибка_wrong_N_args_should_be_zlib_option_data_..._что_делать)
  * [2.3.6 Windows, дистрибутив от ActiveState — "падения" при нажатии Alt-любая кнопка в главном окне](#Windows_дистрибутив_от_ActiveState_-_падения_при_нажатии_Alt-любая_кнопка_в_главном_окне)
  * [2.3.7 Windows, дистрибутив от ActiveState — "падения" при открытии в фоне окна со смайликом](#Windows_дистрибутив_от_ActiveState_-_падения_при_открытии_в_фоне_окна_со_смайликом)
  * [2.3.8 Фатальная ошибка в wish при запуске полноэкранных приложений под Windows](#Фатальная_ошибка_в_wish_при_запуске_полноэкранных_приложений_под_Windows)
* [3 А как мне...?](#А_как_мне...)
 * [3.1 Настройка Ткаббера (Не найду файл config.tcl)](#Настройка_Ткаббера_Не_найду_файл_config.tcl)
 * [3.2 Как настроить "автологин"?](#Как_настроить_автологин)
 * [3.3 Работать с RSS](#Работать_с_RSS)
 * [3.4 Отправка сообщений по Ctrl-Enter](#Отправка_сообщений_по_Ctrl-Enter)
 * [3.5 Отправка сообщений по NumPad Enter](#Отправка_сообщений_по_NumPad_Enter)
 * [3.6 Одновременная работа с несколькими аккаунтами](#Одновременная_работа_с_несколькими_аккаунтами)
 * [3.7 Как насчёт автозахода на конференции?](#Как_насчёт_автозахода_на_конференции)
 * [3.8 Сжатие трафика в Ткаббере](#Сжатие_трафика_в_Ткаббере)
 * [3.9 Выделение текста жирным, курсивом и подчёркиванием](#Выделение_текста_жирным_курсивом_и_подчёркиванием)
 * [3.10 Ввод "хитрых" юникодных символов](#Ввод_хитрых_юникодных_символов)
 * [3.11 Игнор — великая вещь!](#Игнор_-_великая_вещь)
 * [3.12 Подтверждения](#Подтверждения)
 * [3.13 Удалённое управление](#Удалённое_управление)
 * [3.14 Команды Ткаббера](#Команды_Ткаббера)
 * [3.15 Скрытие версий клиента и ОС](#Скрытие_версий_клиента_и_ОС)
 * [3.16 Как подключить плагин?](#Как_подключить_плагин)
 * [3.17 Как уменьшить трафик?](#Как_уменьшить_трафик)
 * [3.18 Самостоятельная сборка Старпака](#Самостоятельная_сборка_Старпака)
 * [3.19 "Быстрый" Copy/Paste помимо буфера Windows](#Быстрый_Copy_Paste_помимо_буфера_Windows)
 * [3.20 Проверка орфографии](#Проверка_орфографии)
 * [3.21 Как перенести ростер с сервера на сервер? Импортировать контакты ICQ?](#Как_перенести_ростер_с_сервера_на_сервер_Импортировать_контакты_ICQ)
 * [3.22 Как почитать протокол общения "в привате" с участником групчата, которого больше нет в комнате?](#Как_почитать_протокол_общения_в_привате_с_участником_групчата_которого_больше_нет_в_комнате)
 * [3.23 Указать причину кика/бана](#Указать_причину_кика_бана)
 * [3.24 Блокировать спам с MRIM-гейта](#Блокировать_спам_с_MRIM-гейта)
 * [3.25 Конфигурирование конференции](#Конфигурирование_конференции)
 * [3.26 Отключить к (нецензурные слова пропущены) splash-окно](#Отключить_к_нецензурные_слова_пропущены_splash-окно)
 * [3.27 Подключить Ткаббер через SOCKS-сервер](#Подключить_Ткаббер_через_SOCKS-сервер)
 * [3.28 Подключить Ткаббер через Tor, для анонимного использования](#Подключить_Ткаббер_через_Tor_для_анонимного_использования)
 * [3.29 Подключиться к Google Talk](#Подключиться_к_Google_Talk)
 * [3.30 Победить предупреждение о проблеме с сертификатом сервера?](#Победить_предупреждение_о_проблеме_с_сертификатом_сервера)
 * [3.31 Работать с версией из SVN](#Работать_с_версией_из_SVN)
 * [3.32 Задолбало выпадающее меню в контекстном меню MUC-юзера](#Задолбало_выпадающее_меню_в_контекстном_меню_MUC-юзера)
 * [3.33 Как мне собрать новый tclgpg с googlecode?](#Как_мне_собрать_новый_tclgpg_с_googlecode)
 * [3.34 Как настроить работу с плагином OSD?](#Как_настроить_работу_с_плагином_OSD)
 * [3.35 Включить интерфейс на другом языке?](#Включить_интерфейс_на_другом_языке)
 * [3.36 Изменить и зафиксировать ширину ростера?](#Изменить_и_зафиксировать_ширину_ростера)
 * [3.37 Изменить шрифт в окошке ввода сообщения?](#Изменить_шрифт_в_окошке_ввода_сообщения)
 * [3.38 Изменить интервал повторного подключения к серверу?](#Изменить_интервал_повторного_подключения_к_серверу)
* [4 Всякая всячина](#Всякая_всячина)
 * [4.1 Что такое...?](#Что_такое...)
  * [4.1.1 Ростер](#Ростер)
  * [4.1.2 Ресурс](#Ресурс)
  * [4.1.3 Приоритет](#Приоритет)
  * [4.1.4 Консоль Ткаббера](#Консоль_Ткаббера)
  * [4.1.5 Репозиторий teo](#Репозиторий_teo)
 * [4.2 Разное](#Разное)
  * [4.2.1 ...а мне ИГРАТЬ охота!!!](#...а_мне_ИГРАТЬ_охота)
  * [4.2.2 Старые версии Ткаббера и плагинов](#Старые_версии_Ткаббера_и_плагинов)
  * [4.2.3 Работает ли Ткаббер на КПК?](#Работает_ли_Ткаббер_на_КПК)
  * [4.2.4 Почему Ткаббер написан именно на Tcl/Tk?](#Почему_Ткаббер_написан_именно_на_Tcl_Tk)
  * [4.2.5 Кто убил Лору Палмер? ©](#Кто_убил_Лору_Палмер_©)
  * [4.2.6 У вас в конференции топик с ошибкой написан](#У_вас_в_конференции_топик_с_ошибкой_написан)
  * [4.2.7 А добавят ли когда-нибудь в Ткаббер...?](#А_добавят_ли_когда-нибудь_в_Ткаббер...)
 * [4.3 Вопросы, связанные с протоколом XMPP](#Вопросы_связанные_с_протоколом_XMPP)
  * [4.3.1 MUC](#MUC)
   * [4.3.1 Кто есть кто в конференции?](#Кто_есть_кто_в_конференции)
   * [4.3.1 Не работают инвайты](#Не_работают_инвайты)

# <a id="Внешний_вид_и_звук"></a>Внешний вид и звук
[Ткаббер ЧаВо/Внешний вид и звук](Ткаббер_ЧаВо/Внешний_вид_и_звук.md) 

## <a id="Почему_Ткаббер_такой_страшный"></a>Почему Ткаббер такой страшный?

[Перейти к ответу](Ткаббер_ЧаВо/Внешний_вид_и_звук.md#Почему_Ткаббер_такой_страшный). 

Changes to wiki/ru/Ткаббер_ЧаВо/Внешний_вид_и_звук.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Ткаббер_ЧаВо/Внешний_вид_и_звук/index.html)


# Ткаббер ЧаВо/Внешний вид и звук

Материал из Tkabber Wiki

[Ткаббер ЧаВо](../Ткаббер_ЧаВо.md) разделился на несколько статей. В этой статье рассматриваются вопросы касательно внешнего вида Ткаббера (шрифты, цветовые схемы, иконки, аватары) и его работы со звуком. Для удобства даны ссылки на другие тематические страницы ЧаВо. 

## <a id="toc"></a>Содержание

* [1 Внешний вид и звук](#Внешний_вид_и_звук)
   * [1.1 Почему Ткаббер такой страшный?](#Почему_Ткаббер_такой_страшный)
   * [1.2 Шрифты](#Шрифты)
      * [1.2.1 Ввод западноевропейских символов](#Ввод_западноевропейских_символов)
   * [1.3 Смайлики: 1) вызов из меню; 2) не подключаются; 3) не хочу их; 4) анимированные](#Смайлики_1_вызов_из_меню_2_не_подключаются_3_не_хочу_их_4_анимированные)
   * [1.4 Не видны иконки/фото/и т.д. в JPEG/PNG](#Не_видны_иконки_фото_и_т.д._в_JPEG_PNG)
   * [1.5 Цветовые схемы](#Цветовые_схемы)
   * [1.6 Цвета сообщений "асечников"](#Цвета_сообщений_асечников)
   * [1.7 Поддерживает ли Ткаббер Tile?](#Поддерживает_ли_Ткаббер_Tile)
   * [1.8 Поддерживает ли Ткаббер аватары?](#Поддерживает_ли_Ткаббер_аватары)
   * [1.9 Регулировка громкости звука](#Регулировка_громкости_звука)
   * [1.10 Проигрывание звука в Linux](#Проигрывание_звука_в_Linux)
   * [1.11 В старпаке/старките нет звука/поддержки JPEG,PNG](#В_старпаке_старките_нет_звука_поддержки_JPEGPNG)
* [2 Глюки, возникающие в процессе работы](#Глюки_возникающие_в_процессе_работы)
* [3 А как мне...?](#А_как_мне...)
* [4 Всякая всячина](#Всякая_всячина)

# <a id="Внешний_вид_и_звук"></a>Внешний вид и звук
## <a id="Почему_Ткаббер_такой_страшный"></a>Почему Ткаббер такой страшный?













|
|
|
|
|
|
|
|
|
|
|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Ткаббер_ЧаВо/Внешний_вид_и_звук/index.html)


# Ткаббер ЧаВо/Внешний вид и звук

Материал из Tkabber Wiki

[Ткаббер ЧаВо](../Ткаббер_ЧаВо.md) разделился на несколько статей. В этой статье рассматриваются вопросы касательно внешнего вида Ткаббера (шрифты, цветовые схемы, иконки, аватары) и его работы со звуком. Для удобства даны ссылки на другие тематические страницы ЧаВо. 

## <a id="toc"></a>Содержание

* [1 Внешний вид и звук](#Внешний_вид_и_звук)
 * [1.1 Почему Ткаббер такой страшный?](#Почему_Ткаббер_такой_страшный)
 * [1.2 Шрифты](#Шрифты)
  * [1.2.1 Ввод западноевропейских символов](#Ввод_западноевропейских_символов)
 * [1.3 Смайлики: 1) вызов из меню; 2) не подключаются; 3) не хочу их; 4) анимированные](#Смайлики_1_вызов_из_меню_2_не_подключаются_3_не_хочу_их_4_анимированные)
 * [1.4 Не видны иконки/фото/и т.д. в JPEG/PNG](#Не_видны_иконки_фото_и_т.д._в_JPEG_PNG)
 * [1.5 Цветовые схемы](#Цветовые_схемы)
 * [1.6 Цвета сообщений "асечников"](#Цвета_сообщений_асечников)
 * [1.7 Поддерживает ли Ткаббер Tile?](#Поддерживает_ли_Ткаббер_Tile)
 * [1.8 Поддерживает ли Ткаббер аватары?](#Поддерживает_ли_Ткаббер_аватары)
 * [1.9 Регулировка громкости звука](#Регулировка_громкости_звука)
 * [1.10 Проигрывание звука в Linux](#Проигрывание_звука_в_Linux)
 * [1.11 В старпаке/старките нет звука/поддержки JPEG,PNG](#В_старпаке_старките_нет_звука_поддержки_JPEGPNG)
* [2 Глюки, возникающие в процессе работы](#Глюки_возникающие_в_процессе_работы)
* [3 А как мне...?](#А_как_мне...)
* [4 Всякая всячина](#Всякая_всячина)

# <a id="Внешний_вид_и_звук"></a>Внешний вид и звук
## <a id="Почему_Ткаббер_такой_страшный"></a>Почему Ткаббер такой страшный?

Changes to wiki/ru/Ткаббер_ЧаВо/Глюки.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26


27
28
29
30
31
32
33
34
35
36
37
38
39

40
41
42
43
44
45
46
47
48
49
50
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Ткаббер_ЧаВо/Глюки/index.html)


# Ткаббер ЧаВо/Глюки

Материал из Tkabber Wiki.

[Ткаббер ЧаВо](../Ткаббер_ЧаВо.md) разделился на несколько статей. В этой статье разбираются глюки и баги, терзающие Ткаббер и его пользователей. Для удобства даны ссылки на другие тематические страницы ЧаВо. 

## <a id="toc"></a>Содержание

* [1 Глюки, возникающие в процессе работы](#Глюки_возникающие_в_процессе_работы)
   * [1.1 Общие вопросы](#Общие_вопросы)
      * [1.1.1 Ткаббер и Ufanet](#Ткаббер_и_Ufanet)
      * [1.1.2 Долгая загрузка Ткаббера](#Долгая_загрузка_Ткаббера)
      * [1.1.3 Ткаббер "виснет" при попытке логина на сервер](#Ткаббер_виснет_при_попытке_логина_на_сервер)
      * [1.1.4 Пересылка файлов](#Пересылка_файлов)
      * [1.1.5 Ткаббер постоянно держит меня в состоянии "отошёл" ("away")](#Ткаббер_постоянно_держит_меня_в_состоянии_отошёл_away)
      * [1.1.6 Не могу приконнектиться к серверу через прокси](#Не_могу_приконнектиться_к_серверу_через_прокси)
      * [1.1.7 Keep alive в Ткаббере — возможно ли?](#Keep_alive_в_Ткаббере_-_возможно_ли)
      * [1.1.8 Что с грифельной доской?](#Что_с_грифельной_доской)
      * [1.1.9 Ткаббер в упор не видит SSL-сертификат для коннекта к серверу](#Ткаббер_в_упор_не_видит_SSL-сертификат_для_коннекта_к_серверу)
      * [1.1.10 Не могу отредактировать закладку конференции в ростере](#Не_могу_отредактировать_закладку_конференции_в_ростере)
      * [1.1.11 Ткаббер и iChat](#Ткаббер_и_iChat)
   * [1.2 Вопросы, связанные с Линукс](#Вопросы_связанные_с_Линукс)
      * [1.2.1 Шифрование в Ткаббере: проблемы с **gpgme/tclgpgme**](#Шифрование_в_Ткаббере_проблемы_с_gpgme_tclgpgme)


      * [1.2.2 В Ubuntu не вводятся русские буквы в Ткаббере, chto delat?](#В_Ubuntu_не_вводятся_русские_буквы_в_Ткаббере_chto_delat)
      * [1.2.3 Ткаббер под X Window падает при попытке показать "странные" символы](#Ткаббер_под_X_Window_падает_при_попытке_показать_странные_символы)
      * [1.2.4 Не работает вставка по Control-v под X Window](#Не_работает_вставка_по_Control-v_под_X_Window)
      * [1.2.5 В Gentoo не работает сворачивание в трей](#В_Gentoo_не_работает_сворачивание_в_трей)
      * [1.2.6 Fedora 8 и Tcl/Tk 8.5](#Fedora_8_и_Tcl_Tk_8.5)
      * [1.2.7 Обновил тикль до 8.5, но Ткаббер по-прежнему запускается с 8.4](#Обновил_тикль_до_8.5_но_Ткаббер_по-прежнему_запускается_с_8.4)
      * [1.2.8 Userinfo в KDE 4.x](#Userinfo_в_KDE_4.x)
      * [1.2.9 Диалоговые окна Tk на многоголовом X11-сервере](#Диалоговые_окна_Tk_на_многоголовом_X11-сервере)
   * [1.3 Вопросы, связанные с Виндовс](#Вопросы_связанные_с_Виндовс)
      * [1.3.1 В старпаке/старките нет звука/поддержки JPEG,PNG/сжатия](#В_старпаке_старките_нет_звука_поддержки_JPEGPNG_сжатия)
      * [1.3.2 Не работает браузер под виндами](#Не_работает_браузер_под_виндами)
      * [1.3.3 При клике на URL'е в Ткаббере запускается две Оперы и открывают страницу два раза](#При_клике_на_URLе_в_Ткаббере_запускается_две_Оперы_и_открывают_страницу_два_раза)
      * [1.3.4 Странное поведение прокрутки содержимого окна чата колесом мыши](#Странное_поведение_прокрутки_содержимого_окна_чата_колесом_мыши)

      * [1.3.5 Ошибка: wrong \# args: should be "zlib option data ?...?", что делать?](#Ошибка_wrong_N_args_should_be_zlib_option_data_..._что_делать)
      * [1.3.6 Windows, дистрибутив от ActiveState — "падения" при нажатии Alt-любая кнопка в главном окне](#Windows_дистрибутив_от_ActiveState_-_падения_при_нажатии_Alt-любая_кнопка_в_главном_окне)
      * [1.3.7 Windows, дистрибутив от ActiveState — "падения" при открытии в фоне окна со смайликом](#Windows_дистрибутив_от_ActiveState_-_падения_при_открытии_в_фоне_окна_со_смайликом)
      * [1.3.8 Фатальная ошибка в wish при запуске полноэкранных приложений под Windows](#Фатальная_ошибка_в_wish_при_запуске_полноэкранных_приложений_под_Windows)
* [2 Внешний вид и звук](#Внешний_вид_и_звук)
* [3 А как мне...?](#А_как_мне...)
* [4 Всякая всячина](#Всякая_всячина)

# <a id="Глюки_возникающие_в_процессе_работы"></a>Глюки, возникающие в процессе работы
## <a id="Общие_вопросы"></a>Общие вопросы













|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Ткаббер_ЧаВо/Глюки/index.html)


# Ткаббер ЧаВо/Глюки

Материал из Tkabber Wiki.

[Ткаббер ЧаВо](../Ткаббер_ЧаВо.md) разделился на несколько статей. В этой статье разбираются глюки и баги, терзающие Ткаббер и его пользователей. Для удобства даны ссылки на другие тематические страницы ЧаВо. 

## <a id="toc"></a>Содержание

* [1 Глюки, возникающие в процессе работы](#Глюки_возникающие_в_процессе_работы)
 * [1.1 Общие вопросы](#Общие_вопросы)
  * [1.1.1 Ткаббер и Ufanet](#Ткаббер_и_Ufanet)
  * [1.1.2 Долгая загрузка Ткаббера](#Долгая_загрузка_Ткаббера)
  * [1.1.3 Ткаббер "виснет" при попытке логина на сервер](#Ткаббер_виснет_при_попытке_логина_на_сервер)
  * [1.1.4 Пересылка файлов](#Пересылка_файлов)
  * [1.1.5 Ткаббер постоянно держит меня в состоянии "отошёл" ("away")](#Ткаббер_постоянно_держит_меня_в_состоянии_отошёл_away)
  * [1.1.6 Не могу приконнектиться к серверу через прокси](#Не_могу_приконнектиться_к_серверу_через_прокси)
  * [1.1.7 Keep alive в Ткаббере — возможно ли?](#Keep_alive_в_Ткаббере_-_возможно_ли)
  * [1.1.8 Что с грифельной доской?](#Что_с_грифельной_доской)
  * [1.1.9 Ткаббер в упор не видит SSL-сертификат для коннекта к серверу](#Ткаббер_в_упор_не_видит_SSL-сертификат_для_коннекта_к_серверу)
  * [1.1.10 Не могу отредактировать закладку конференции в ростере](#Не_могу_отредактировать_закладку_конференции_в_ростере)
  * [1.1.11 Ткаббер и iChat](#Ткаббер_и_iChat)
 * [1.2 Вопросы, связанные с Линукс](#Вопросы_связанные_с_Линукс)
  * [1.2.1 Шифрование в Ткаббере: проблемы с **gpgme/tclgpgme**](#Шифрование_в_Ткаббере_проблемы_с_gpgme_tclgpgme)
   * [1.2.1 Не могу скомпилировать tclgpgme](#Не_могу_скомпилировать_tclgpgme)
   * [1.2.1 Ткаббер валится при вводе gpg-пароля](#Ткаббер_валится_при_вводе_gpg-пароля)
  * [1.2.2 В Ubuntu не вводятся русские буквы в Ткаббере, chto delat?](#В_Ubuntu_не_вводятся_русские_буквы_в_Ткаббере_chto_delat)
  * [1.2.3 Ткаббер под X Window падает при попытке показать "странные" символы](#Ткаббер_под_X_Window_падает_при_попытке_показать_странные_символы)
  * [1.2.4 Не работает вставка по Control-v под X Window](#Не_работает_вставка_по_Control-v_под_X_Window)
  * [1.2.5 В Gentoo не работает сворачивание в трей](#В_Gentoo_не_работает_сворачивание_в_трей)
  * [1.2.6 Fedora 8 и Tcl/Tk 8.5](#Fedora_8_и_Tcl_Tk_8.5)
  * [1.2.7 Обновил тикль до 8.5, но Ткаббер по-прежнему запускается с 8.4](#Обновил_тикль_до_8.5_но_Ткаббер_по-прежнему_запускается_с_8.4)
  * [1.2.8 Userinfo в KDE 4.x](#Userinfo_в_KDE_4.x)
  * [1.2.9 Диалоговые окна Tk на многоголовом X11-сервере](#Диалоговые_окна_Tk_на_многоголовом_X11-сервере)
 * [1.3 Вопросы, связанные с Виндовс](#Вопросы_связанные_с_Виндовс)
  * [1.3.1 В старпаке/старките нет звука/поддержки JPEG,PNG/сжатия](#В_старпаке_старките_нет_звука_поддержки_JPEGPNG_сжатия)
  * [1.3.2 Не работает браузер под виндами](#Не_работает_браузер_под_виндами)
  * [1.3.3 При клике на URL'е в Ткаббере запускается две Оперы и открывают страницу два раза](#При_клике_на_URLе_в_Ткаббере_запускается_две_Оперы_и_открывают_страницу_два_раза)
  * [1.3.4 Странное поведение прокрутки содержимого окна чата колесом мыши](#Странное_поведение_прокрутки_содержимого_окна_чата_колесом_мыши)
   * [1.3.4 Конкретные мыши и их настройки](#Конкретные_мыши_и_их_настройки)
  * [1.3.5 Ошибка: wrong \# args: should be "zlib option data ?...?", что делать?](#Ошибка_wrong_N_args_should_be_zlib_option_data_..._что_делать)
  * [1.3.6 Windows, дистрибутив от ActiveState — "падения" при нажатии Alt-любая кнопка в главном окне](#Windows_дистрибутив_от_ActiveState_-_падения_при_нажатии_Alt-любая_кнопка_в_главном_окне)
  * [1.3.7 Windows, дистрибутив от ActiveState — "падения" при открытии в фоне окна со смайликом](#Windows_дистрибутив_от_ActiveState_-_падения_при_открытии_в_фоне_окна_со_смайликом)
  * [1.3.8 Фатальная ошибка в wish при запуске полноэкранных приложений под Windows](#Фатальная_ошибка_в_wish_при_запуске_полноэкранных_приложений_под_Windows)
* [2 Внешний вид и звук](#Внешний_вид_и_звук)
* [3 А как мне...?](#А_как_мне...)
* [4 Всякая всячина](#Всякая_всячина)

# <a id="Глюки_возникающие_в_процессе_работы"></a>Глюки, возникающие в процессе работы
## <a id="Общие_вопросы"></a>Общие вопросы

Changes to wiki/ru/Ткаббер_ЧаВо/Как_мне..._.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Ткаббер_ЧаВо/Как_мне...?)


# Ткаббер ЧаВо/Как мне...?

Материал из Tkabber Wiki

[Ткаббер ЧаВо](../Ткаббер_ЧаВо.md) разделился на несколько статей. В этой статье мы поговорим о "затачивании" Ткаббера под конкретные нужды пользователя. Для удобства даны ссылки на другие тематические страницы ЧаВо. 

## <a id="toc"></a>Содержание

* [1 А как мне...?](#А_как_мне...)
   * [1.1 Настройка Ткаббера (Не найду файл config.tcl)](#Настройка_Ткаббера_Не_найду_файл_config.tcl)
   * [1.2 Как настроить "автологин"?](#Как_настроить_автологин)
   * [1.3 Работать с RSS](#Работать_с_RSS)
   * [1.4 Отправка сообщений по Ctrl-Enter](#Отправка_сообщений_по_Ctrl-Enter)
   * [1.5 Отправка сообщений по NumPad Enter](#Отправка_сообщений_по_NumPad_Enter)
   * [1.6 Одновременная работа с несколькими аккаунтами](#Одновременная_работа_с_несколькими_аккаунтами)
   * [1.7 Как насчёт автозахода на конференции?](#Как_насчёт_автозахода_на_конференции)
   * [1.8 Сжатие трафика в Ткаббере](#Сжатие_трафика_в_Ткаббере)
   * [1.9 Выделение текста жирным, курсивом и подчёркиванием](#Выделение_текста_жирным_курсивом_и_подчёркиванием)
   * [1.10 Ввод "хитрых" юникодных символов](#Ввод_хитрых_юникодных_символов)
   * [1.11 Игнор — великая вещь!](#Игнор_-_великая_вещь)
   * [1.12 Подтверждения](#Подтверждения)
   * [1.13 Удалённое управление](#Удалённое_управление)
   * [1.14 Команды Ткаббера](#Команды_Ткаббера)
   * [1.15 Скрытие версий клиента и ОС](#Скрытие_версий_клиента_и_ОС)
   * [1.16 Как подключить плагин?](#Как_подключить_плагин)
   * [1.17 Как уменьшить трафик?](#Как_уменьшить_трафик)
   * [1.18 Самостоятельная сборка Старпака](#Самостоятельная_сборка_Старпака)
   * [1.19 "Быстрый" Copy/Paste помимо буфера Windows](#Быстрый_Copy_Paste_помимо_буфера_Windows)
   * [1.20 Проверка орфографии](#Проверка_орфографии)
   * [1.21 Как перенести ростер с сервера на сервер? Импортировать контакты ICQ?](#Как_перенести_ростер_с_сервера_на_сервер_Импортировать_контакты_ICQ)
   * [1.22 Как почитать протокол общения "в привате" с участником групчата, которого больше нет в комнате?](#Как_почитать_протокол_общения_в_привате_с_участником_групчата_которого_больше_нет_в_комнате)
   * [1.23 Указать причину кика/бана](#Указать_причину_кика_бана)
   * [1.24 Блокировать спам с MRIM-гейта](#Блокировать_спам_с_MRIM-гейта)
   * [1.25 Конфигурирование конференции](#Конфигурирование_конференции)
   * [1.26 Отключить к (нецензурные слова пропущены) splash-окно](#Отключить_к_нецензурные_слова_пропущены_splash-окно)
   * [1.27 Подключить Ткаббер через SOCKS-сервер](#Подключить_Ткаббер_через_SOCKS-сервер)
   * [1.28 Подключить Ткаббер через Tor, для анонимного использования](#Подключить_Ткаббер_через_Tor_для_анонимного_использования)
   * [1.29 Подключиться к Google Talk](#Подключиться_к_Google_Talk)
   * [1.30 Победить предупреждение о проблеме с сертификатом сервера](#Победить_предупреждение_о_проблеме_с_сертификатом_сервера)
   * [1.31 Работать с версией из SVN](#Работать_с_версией_из_SVN)
   * [1.32 Задолбало выпадающее меню в контекстном меню MUC-юзера](#Задолбало_выпадающее_меню_в_контекстном_меню_MUC-юзера)
   * [1.33 Как мне собрать новый tclgpg с googlecode?](#Как_мне_собрать_новый_tclgpg_с_googlecode)
   * [1.34 Как настроить работу с плагином OSD?](#Как_настроить_работу_с_плагином_OSD)
   * [1.35 Включить другой язык интерфейса?](#Включить_другой_язык_интерфейса)
   * [1.36 Изменить и зафиксировать ширину ростера?](#Изменить_и_зафиксировать_ширину_ростера)
   * [1.37 Изменить шрифт в окошке ввода сообщения?](#Изменить_шрифт_в_окошке_ввода_сообщения)
   * [1.38 Изменить интервал повторного подключения к серверу?](#Изменить_интервал_повторного_подключения_к_серверу)
* [2 Внешний вид и звук](#Внешний_вид_и_звук)
* [3 Глюки, возникающие в процессе работы](#Глюки_возникающие_в_процессе_работы)
* [4 Всякая всячина](#Всякая_всячина)

# <a id="А_как_мне..."></a>А как мне...?
## <a id="Настройка_Ткаббера_Не_найду_файл_config.tcl"></a>Настройка Ткаббера (Не найду файл config.tcl)













|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Ткаббер_ЧаВо/Как_мне...?)


# Ткаббер ЧаВо/Как мне...?

Материал из Tkabber Wiki

[Ткаббер ЧаВо](../Ткаббер_ЧаВо.md) разделился на несколько статей. В этой статье мы поговорим о "затачивании" Ткаббера под конкретные нужды пользователя. Для удобства даны ссылки на другие тематические страницы ЧаВо. 

## <a id="toc"></a>Содержание

* [1 А как мне...?](#А_как_мне...)
 * [1.1 Настройка Ткаббера (Не найду файл config.tcl)](#Настройка_Ткаббера_Не_найду_файл_config.tcl)
 * [1.2 Как настроить "автологин"?](#Как_настроить_автологин)
 * [1.3 Работать с RSS](#Работать_с_RSS)
 * [1.4 Отправка сообщений по Ctrl-Enter](#Отправка_сообщений_по_Ctrl-Enter)
 * [1.5 Отправка сообщений по NumPad Enter](#Отправка_сообщений_по_NumPad_Enter)
 * [1.6 Одновременная работа с несколькими аккаунтами](#Одновременная_работа_с_несколькими_аккаунтами)
 * [1.7 Как насчёт автозахода на конференции?](#Как_насчёт_автозахода_на_конференции)
 * [1.8 Сжатие трафика в Ткаббере](#Сжатие_трафика_в_Ткаббере)
 * [1.9 Выделение текста жирным, курсивом и подчёркиванием](#Выделение_текста_жирным_курсивом_и_подчёркиванием)
 * [1.10 Ввод "хитрых" юникодных символов](#Ввод_хитрых_юникодных_символов)
 * [1.11 Игнор — великая вещь!](#Игнор_-_великая_вещь)
 * [1.12 Подтверждения](#Подтверждения)
 * [1.13 Удалённое управление](#Удалённое_управление)
 * [1.14 Команды Ткаббера](#Команды_Ткаббера)
 * [1.15 Скрытие версий клиента и ОС](#Скрытие_версий_клиента_и_ОС)
 * [1.16 Как подключить плагин?](#Как_подключить_плагин)
 * [1.17 Как уменьшить трафик?](#Как_уменьшить_трафик)
 * [1.18 Самостоятельная сборка Старпака](#Самостоятельная_сборка_Старпака)
 * [1.19 "Быстрый" Copy/Paste помимо буфера Windows](#Быстрый_Copy_Paste_помимо_буфера_Windows)
 * [1.20 Проверка орфографии](#Проверка_орфографии)
 * [1.21 Как перенести ростер с сервера на сервер? Импортировать контакты ICQ?](#Как_перенести_ростер_с_сервера_на_сервер_Импортировать_контакты_ICQ)
 * [1.22 Как почитать протокол общения "в привате" с участником групчата, которого больше нет в комнате?](#Как_почитать_протокол_общения_в_привате_с_участником_групчата_которого_больше_нет_в_комнате)
 * [1.23 Указать причину кика/бана](#Указать_причину_кика_бана)
 * [1.24 Блокировать спам с MRIM-гейта](#Блокировать_спам_с_MRIM-гейта)
 * [1.25 Конфигурирование конференции](#Конфигурирование_конференции)
 * [1.26 Отключить к (нецензурные слова пропущены) splash-окно](#Отключить_к_нецензурные_слова_пропущены_splash-окно)
 * [1.27 Подключить Ткаббер через SOCKS-сервер](#Подключить_Ткаббер_через_SOCKS-сервер)
 * [1.28 Подключить Ткаббер через Tor, для анонимного использования](#Подключить_Ткаббер_через_Tor_для_анонимного_использования)
 * [1.29 Подключиться к Google Talk](#Подключиться_к_Google_Talk)
 * [1.30 Победить предупреждение о проблеме с сертификатом сервера](#Победить_предупреждение_о_проблеме_с_сертификатом_сервера)
 * [1.31 Работать с версией из SVN](#Работать_с_версией_из_SVN)
 * [1.32 Задолбало выпадающее меню в контекстном меню MUC-юзера](#Задолбало_выпадающее_меню_в_контекстном_меню_MUC-юзера)
 * [1.33 Как мне собрать новый tclgpg с googlecode?](#Как_мне_собрать_новый_tclgpg_с_googlecode)
 * [1.34 Как настроить работу с плагином OSD?](#Как_настроить_работу_с_плагином_OSD)
 * [1.35 Включить другой язык интерфейса?](#Включить_другой_язык_интерфейса)
 * [1.36 Изменить и зафиксировать ширину ростера?](#Изменить_и_зафиксировать_ширину_ростера)
 * [1.37 Изменить шрифт в окошке ввода сообщения?](#Изменить_шрифт_в_окошке_ввода_сообщения)
 * [1.38 Изменить интервал повторного подключения к серверу?](#Изменить_интервал_повторного_подключения_к_серверу)
* [2 Внешний вид и звук](#Внешний_вид_и_звук)
* [3 Глюки, возникающие в процессе работы](#Глюки_возникающие_в_процессе_работы)
* [4 Всякая всячина](#Всякая_всячина)

# <a id="А_как_мне..."></a>А как мне...?
## <a id="Настройка_Ткаббера_Не_найду_файл_config.tcl"></a>Настройка Ткаббера (Не найду файл config.tcl)

Changes to wiki/ru/Ткаббер_ЧаВо/Разное.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28


29
30
31
32
33
34
35
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Ткаббер_ЧаВо/Разное/index.html)


# Ткаббер ЧаВо/Разное

Материал из Tkabber Wiki

[Ткаббер ЧаВо](../Ткаббер_ЧаВо.md) разделился на несколько статей. Здесь рассматриваются вопросы разного (подчас совершенно странного) характера. Для удобства даны ссылки на другие тематические страницы ЧаВо. 

## <a id="toc"></a>Содержание

* [1 Всякая всячина](#Всякая_всячина)
   * [1.1 Что такое...?](#Что_такое...)
      * [1.1.1 Ростер](#Ростер)
      * [1.1.2 Ресурс](#Ресурс)
      * [1.1.3 Приоритет](#Приоритет)
      * [1.1.4 Консоль Ткаббера](#Консоль_Ткаббера)
      * [1.1.5 Репозиторий teo](#Репозиторий_teo)
   * [1.2 Разное](#Разное)
      * [1.2.1 ...а мне ИГРАТЬ охота!!!](#...а_мне_ИГРАТЬ_охота)
      * [1.2.2 Старые версии Ткаббера и плагинов](#Старые_версии_Ткаббера_и_плагинов)
      * [1.2.3 Работает ли Ткаббер на КПК?](#Работает_ли_Ткаббер_на_КПК)
      * [1.2.4 Почему Ткаббер написан именно на Tcl/Tk?](#Почему_Ткаббер_написан_именно_на_Tcl_Tk)
      * [1.2.5 Кто убил Лору Палмер? ©](#Кто_убил_Лору_Палмер_©)
      * [1.2.6 У вас в конференции топик с ошибкой написан](#У_вас_в_конференции_топик_с_ошибкой_написан)
      * [1.2.7 А добавят ли когда-нибудь в Ткаббер...?](#А_добавят_ли_когда-нибудь_в_Ткаббер...)
   * [1.3 Вопросы, связанные с протоколом XMPP](#Вопросы_связанные_с_протоколом_XMPP)
      * [1.3.1 MUC](#MUC)


* [2 Внешний вид и звук](#Внешний_вид_и_звук)
* [3 Глюки, возникающие в процессе работы](#Глюки_возникающие_в_процессе_работы)
* [4 А как мне...?](#А_как_мне...)

# <a id="Всякая_всячина"></a>Всякая всячина
## <a id="Что_такое..."></a>Что такое...?













|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Ткаббер_ЧаВо/Разное/index.html)


# Ткаббер ЧаВо/Разное

Материал из Tkabber Wiki

[Ткаббер ЧаВо](../Ткаббер_ЧаВо.md) разделился на несколько статей. Здесь рассматриваются вопросы разного (подчас совершенно странного) характера. Для удобства даны ссылки на другие тематические страницы ЧаВо. 

## <a id="toc"></a>Содержание

* [1 Всякая всячина](#Всякая_всячина)
 * [1.1 Что такое...?](#Что_такое...)
  * [1.1.1 Ростер](#Ростер)
  * [1.1.2 Ресурс](#Ресурс)
  * [1.1.3 Приоритет](#Приоритет)
  * [1.1.4 Консоль Ткаббера](#Консоль_Ткаббера)
  * [1.1.5 Репозиторий teo](#Репозиторий_teo)
 * [1.2 Разное](#Разное)
  * [1.2.1 ...а мне ИГРАТЬ охота!!!](#...а_мне_ИГРАТЬ_охота)
  * [1.2.2 Старые версии Ткаббера и плагинов](#Старые_версии_Ткаббера_и_плагинов)
  * [1.2.3 Работает ли Ткаббер на КПК?](#Работает_ли_Ткаббер_на_КПК)
  * [1.2.4 Почему Ткаббер написан именно на Tcl/Tk?](#Почему_Ткаббер_написан_именно_на_Tcl_Tk)
  * [1.2.5 Кто убил Лору Палмер? ©](#Кто_убил_Лору_Палмер_©)
  * [1.2.6 У вас в конференции топик с ошибкой написан](#У_вас_в_конференции_топик_с_ошибкой_написан)
  * [1.2.7 А добавят ли когда-нибудь в Ткаббер...?](#А_добавят_ли_когда-нибудь_в_Ткаббер...)
 * [1.3 Вопросы, связанные с протоколом XMPP](#Вопросы_связанные_с_протоколом_XMPP)
  * [1.3.1 MUC](#MUC)
   * [1.3.1 Кто есть кто в конференции?](#Кто_есть_кто_в_конференции)
   * [1.3.1 Не работают инвайты](#Не_работают_инвайты)
* [2 Внешний вид и звук](#Внешний_вид_и_звук)
* [3 Глюки, возникающие в процессе работы](#Глюки_возникающие_в_процессе_работы)
* [4 А как мне...?](#А_как_мне...)

# <a id="Всякая_всячина"></a>Всякая всячина
## <a id="Что_такое..."></a>Что такое...?

Changes to wiki/ru/Ткаббер_и_DNS.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Ткаббер_и_DNS/index.html)


# Ткаббер и DNS

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Место и роль DNS в процессе соединения с сервером](#Место_и_роль_DNS_в_процессе_соединения_с_сервером)
* [2 Первая проблема: "TCP vs UDP"](#Первая_проблема_TCP_vs_UDP)
* [3 Вторая проблема: UDP блокируется файрволом](#Вторая_проблема_UDP_блокируется_файрволом)
* [4 Ручное разрешение записей DNS](#Ручное_разрешение_записей_DNS)
   * [4.1 A-записи](#A-записи)
   * [4.2 SRV-записи](#SRV-записи)
   * [4.3 TXT-записи для HTTP-poll](#TXT-записи_для_HTTP-poll)

# <a id="Место_и_роль_DNS_в_процессе_соединения_с_сервером"></a>Место и роль DNS в процессе соединения с сервером
Согласно [RFC \#3920](http://www.xmpp.org/rfcs/rfc3920.html), Ткаббер начинает долгую дорогу в дюнах своего соединения, пытаясь выполнить [SRV](ftp://ftp.isi.edu/in-notes/rfc2782.txt)-запрос к DNS. Запрос этот служит, чтобы выяснить, какой именно компьютер обслуживает _XMPP-домен,_ в котором вы владеете учётной записью. Другими словами, `jabber.ru` в JID'е `vasya@jabber.ru` означает не сервер, а домен. Сервер может иметь совершенно другое имя в DNS, и самих серверов у домена может быть несколько (у jabber.ru, например, их два). 

Далее Ткабберу может понадобиться выполнить ещё минимум один запрос, чтобы разрешить полученное на первом этапе имя сервера в его IP-адрес. 

Здесь могут возникнуть две проблемы: 













|
|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Ткаббер_и_DNS/index.html)


# Ткаббер и DNS

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 Место и роль DNS в процессе соединения с сервером](#Место_и_роль_DNS_в_процессе_соединения_с_сервером)
* [2 Первая проблема: "TCP vs UDP"](#Первая_проблема_TCP_vs_UDP)
* [3 Вторая проблема: UDP блокируется файрволом](#Вторая_проблема_UDP_блокируется_файрволом)
* [4 Ручное разрешение записей DNS](#Ручное_разрешение_записей_DNS)
 * [4.1 A-записи](#A-записи)
 * [4.2 SRV-записи](#SRV-записи)
 * [4.3 TXT-записи для HTTP-poll](#TXT-записи_для_HTTP-poll)

# <a id="Место_и_роль_DNS_в_процессе_соединения_с_сервером"></a>Место и роль DNS в процессе соединения с сервером
Согласно [RFC \#3920](http://www.xmpp.org/rfcs/rfc3920.html), Ткаббер начинает долгую дорогу в дюнах своего соединения, пытаясь выполнить [SRV](ftp://ftp.isi.edu/in-notes/rfc2782.txt)-запрос к DNS. Запрос этот служит, чтобы выяснить, какой именно компьютер обслуживает _XMPP-домен,_ в котором вы владеете учётной записью. Другими словами, `jabber.ru` в JID'е `vasya@jabber.ru` означает не сервер, а домен. Сервер может иметь совершенно другое имя в DNS, и самих серверов у домена может быть несколько (у jabber.ru, например, их два). 

Далее Ткабберу может понадобиться выполнить ещё минимум один запрос, чтобы разрешить полученное на первом этапе имя сервера в его IP-адрес. 

Здесь могут возникнуть две проблемы: 

Changes to wiki/ru/Удалённое_управление_с_помощью_send.md.

14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Для tkabber-а идентификатором будет "tkabber" для первого клиента и "tkabber \#N" для остальных. 

## <a id="toc"></a>Содержание

* [1 Управление клиентом локально](#Управление_клиентом_локально)
* [2 Управление клиентом удаленно](#Управление_клиентом_удаленно)
* [3 Определение основных переменных](#Определение_основных_переменных)
   * [3.1 $myconnid](#$myconnid)
   * [3.2 $mychatid](#$mychatid)
* [4 Выполнение основных действий](#Выполнение_основных_действий)
   * [4.1 смена профиля](#смена_профиля)
   * [4.2 Login (подключится к серверу)](#Login_подключится_к_серверу)
   * [4.3 Logout (оборвать соединение)](#Logout_оборвать_соединение)
   * [4.4 Join (войти в конференцию)](#Join_войти_в_конференцию)
   * [4.5 Leave (выйти из конференции)](#Leave_выйти_из_конференции)
   * [4.6 смена ника](#смена_ника)
   * [4.7 отправка сообщения](#отправка_сообщения)
   * [4.8 смена статуса](#смена_статуса)
   * [4.9 смена состояния](#смена_состояния)
* [5 Управление клиентом из скрипта](#Управление_клиентом_из_скрипта)
* [6 См. также](#См._также)

## <a id="Управление_клиентом_локально"></a>Управление клиентом локально

Если клиент запущен на тех же Иксах что и терминал c wish, то все просто:  








|
|

|
|
|
|
|
|
|
|
|







14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Для tkabber-а идентификатором будет "tkabber" для первого клиента и "tkabber \#N" для остальных. 

## <a id="toc"></a>Содержание

* [1 Управление клиентом локально](#Управление_клиентом_локально)
* [2 Управление клиентом удаленно](#Управление_клиентом_удаленно)
* [3 Определение основных переменных](#Определение_основных_переменных)
 * [3.1 $myconnid](#$myconnid)
 * [3.2 $mychatid](#$mychatid)
* [4 Выполнение основных действий](#Выполнение_основных_действий)
 * [4.1 смена профиля](#смена_профиля)
 * [4.2 Login (подключится к серверу)](#Login_подключится_к_серверу)
 * [4.3 Logout (оборвать соединение)](#Logout_оборвать_соединение)
 * [4.4 Join (войти в конференцию)](#Join_войти_в_конференцию)
 * [4.5 Leave (выйти из конференции)](#Leave_выйти_из_конференции)
 * [4.6 смена ника](#смена_ника)
 * [4.7 отправка сообщения](#отправка_сообщения)
 * [4.8 смена статуса](#смена_статуса)
 * [4.9 смена состояния](#смена_состояния)
* [5 Управление клиентом из скрипта](#Управление_клиентом_из_скрипта)
* [6 См. также](#См._также)

## <a id="Управление_клиентом_локально"></a>Управление клиентом локально

Если клиент запущен на тех же Иксах что и терминал c wish, то все просто:  

Deleted wiki/ru/Установка_и_настройка_в_Ubuntu.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Установка_и_настройка_в_Ubuntu/index.html)

# Установка и настройка в Ubuntu

Материал из Tkabber Wiki

## Быстрая настройка шрифтов

    echo 'deb     http://people.debian.org/~sgolovan/debian/ lenny main'  |  sudo tee -a /etc/apt/sources.list
    echo 'deb-src http://people.debian.org/~sgolovan/debian/ lenny main'  |  sudo tee -a /etc/apt/sources.list && sudo apt-get update

введите пароль и продолжайте

    sudo apt-get install tkabber tkabber-plugins tk8.5 libsnack2 tktray msttcorefonts

и это

    sudo update-alternatives --config wish

нажмите цифорку соответствующую пункту "/usr/bin/wish8.5" а потом на Enter и
используем.

теперь ваш tkabber установлен и в убунте у него нормальные шрифты. и вам почти
не пришлось ничего  читать :)

Если вам не помогло это руководство, или у вас возникли вопросы, то смело
нажимайте на "Обсуждение" вверху страницы. и опишите в чём именно у вас
возникли трудности.
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
























































Changes to wiki/ru/Участник_Bigote.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Участник:Bigote/index.html)


# Участник:Bigote

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 По-русски](#По-русски)
   * [1.1 Краткие биографические сведения](#Краткие_биографические_сведения)
   * [1.2 Языки](#Языки)
   * [1.3 Компьютерный опыт](#Компьютерный_опыт)
   * [1.4 Творчество и хобби](#Творчество_и_хобби)
   * [1.5 Контакты](#Контакты)
* [2 In English](#In_English)
   * [2.1 Short Bio](#Short_Bio)
   * [2.2 Languages](#Languages)
   * [2.3 Computer experience](#Computer_experience)
   * [2.4 Creativity and Hobbies](#Creativity_and_Hobbies)
   * [2.5 Contacts](#Contacts)
* [3 En español](#En_español)
   * [3.1 Nota biográfica](#Nota_biográfica)
   * [3.2 Idiomas](#Idiomas)
   * [3.3 Experiencia con los ordenadores](#Experiencia_con_los_ordenadores)
   * [3.4 Creatividad y hobby](#Creatividad_y_hobby)
   * [3.5 Contactos](#Contactos)

# <a id="По-русски"></a>По-русски
## <a id="Краткие_биографические_сведения"></a>Краткие биографические сведения

*  Ф.И.О.: Юдин Сергей Анатольевич. 
*  Дата рождения: 9 ноября 1969 года. 
*  Место рождения: г. Курганинск Краснодарского края. 










|
|
|
|
|

|
|
|
|
|

|
|
|
|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Участник:Bigote/index.html)


# Участник:Bigote

Материал из Tkabber Wiki

## <a id="toc"></a>Содержание

* [1 По-русски](#По-русски)
 * [1.1 Краткие биографические сведения](#Краткие_биографические_сведения)
 * [1.2 Языки](#Языки)
 * [1.3 Компьютерный опыт](#Компьютерный_опыт)
 * [1.4 Творчество и хобби](#Творчество_и_хобби)
 * [1.5 Контакты](#Контакты)
* [2 In English](#In_English)
 * [2.1 Short Bio](#Short_Bio)
 * [2.2 Languages](#Languages)
 * [2.3 Computer experience](#Computer_experience)
 * [2.4 Creativity and Hobbies](#Creativity_and_Hobbies)
 * [2.5 Contacts](#Contacts)
* [3 En español](#En_español)
 * [3.1 Nota biográfica](#Nota_biográfica)
 * [3.2 Idiomas](#Idiomas)
 * [3.3 Experiencia con los ordenadores](#Experiencia_con_los_ordenadores)
 * [3.4 Creatividad y hobby](#Creatividad_y_hobby)
 * [3.5 Contactos](#Contactos)

# <a id="По-русски"></a>По-русски
## <a id="Краткие_биографические_сведения"></a>Краткие биографические сведения

*  Ф.И.О.: Юдин Сергей Анатольевич. 
*  Дата рождения: 9 ноября 1969 года. 
*  Место рождения: г. Курганинск Краснодарского края. 

Changes to wiki/ru/Участник_Feez.md.

8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
*  JID: [http://jabber.autocom.pl/estatus.php?jid=feez@jabber.ru&iconset=c1&.png](http://jabber.autocom.pl/estatus.php?jid=feez@jabber.ru&iconset=c1&.png) feez@jabber.ru 
*  LJ: [http://oc\_feez.livejournal.com/profile/](http://oc_feez.livejournal.com/profile/) 
*  Языки: Русский, Esperanto, English 

## <a id="toc"></a>Содержание

* [1 Содержание](#Содержание)
   * [1.1 Теория](#Теория)
   * [1.2 Статьи](татьи)
   * [1.3 Разработка](#Разработка)
   * [1.4 Практика](#Практика)
   * [1.5 Запчасти](#Запчасти)
   * [1.6 Обсуждения](#Обсуждения)
   * [1.7 Cлужебные](#Cлужебные)

## <a id="Содержание"></a>Содержание

(для быстрого поиска) 

### <a id="Теория"></a>[Теория](Теория.md)
 
*  [Терминология](Терминология.md) 
*  [о Ткаббере](Ткаббер_-_чемпион_.md) 
 
*  [Начинающим](Начинающим.md) 
*  [Настройка Ткаббера: азы и глубже](Настройка_Ткаббера__азы_и_глубже.md) 
  
### <a id="Статьи"></a>[Статьи](Теория.md#Другие_статьи)
 
*  [Пересылка файлов: теория](Пересылка_файлов__теория.md) 
*  [Удалённое управление с помощью send](Удалённое_управление_с_помощью_send.md) 
*  [Шифрование в Ткаббере](Шифрование_в_Ткаббере.md) 
*  [Ткаббер наизнанку](Ткаббер_наизнанку.md) 
  
### <a id="Разработка"></a>[Разработка](Разработка.md)
 
*  [Wish и русская раскладка в Windows](Wish_и_русская_раскладка_в_Windows.md) 
*  [MUC Ignore](MUC_Ignore.md) 
*  [Nick coloring](Nick_coloring.md) 
*  [Config dir](Config_dir.md) 
*  [Спамодавка списками приватности](Спамодавка_списками_приватности.md) 
*  [Новый вид Tk в 8.5](Новый_вид_Tk_в_8.5.md) 

### <a id="Практика"></a>[Практика](Практика.md)
 
*  [Ткаббер ЧаВо](Ткаббер_ЧаВо.md) 
*  [Смайлики и аватары](Смайлики_и_аватары.md) 
*  [Цветовые темы и пиктограммы](Цветовые_темы_и_пиктограммы.md) 
*  [Проблемы со звуком](Проблемы_со_звуком.md) 
*  [Нетривиальные настройки](Нетривиальные_настройки.md) 
  







|
|
|
|
|
|
|





|







|






|








|







8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
*  JID: [http://jabber.autocom.pl/estatus.php?jid=feez@jabber.ru&iconset=c1&.png](http://jabber.autocom.pl/estatus.php?jid=feez@jabber.ru&iconset=c1&.png) feez@jabber.ru 
*  LJ: [http://oc\_feez.livejournal.com/profile/](http://oc_feez.livejournal.com/profile/) 
*  Языки: Русский, Esperanto, English 

## <a id="toc"></a>Содержание

* [1 Содержание](#Содержание)
 * [1.1 [Теория](Теория.md)](#ТеорияТеория.md)
 * [1.2 [Статьи](Теория.md#Другие_статьи)](#СтатьиТеория.mdNДругие_статьи)
 * [1.3 [Разработка](Разработка.md)](#РазработкаРазработка.md)
 * [1.4 [Практика](Практика.md)](#ПрактикаПрактика.md)
 * [1.5 Запчасти](#Запчасти)
 * [1.6 Обсуждения](#Обсуждения)
 * [1.7 Cлужебные](#Cлужебные)

## <a id="Содержание"></a>Содержание

(для быстрого поиска) 

### <a id="ТеорияТеория.md"></a>[Теория](Теория.md)
 
*  [Терминология](Терминология.md) 
*  [о Ткаббере](Ткаббер_-_чемпион_.md) 
 
*  [Начинающим](Начинающим.md) 
*  [Настройка Ткаббера: азы и глубже](Настройка_Ткаббера__азы_и_глубже.md) 
  
### <a id="СтатьиТеория.mdNДругие_статьи"></a>[Статьи](Теория.md#Другие_статьи)
 
*  [Пересылка файлов: теория](Пересылка_файлов__теория.md) 
*  [Удалённое управление с помощью send](Удалённое_управление_с_помощью_send.md) 
*  [Шифрование в Ткаббере](Шифрование_в_Ткаббере.md) 
*  [Ткаббер наизнанку](Ткаббер_наизнанку.md) 
  
### <a id="РазработкаРазработка.md"></a>[Разработка](Разработка.md)
 
*  [Wish и русская раскладка в Windows](Wish_и_русская_раскладка_в_Windows.md) 
*  [MUC Ignore](MUC_Ignore.md) 
*  [Nick coloring](Nick_coloring.md) 
*  [Config dir](Config_dir.md) 
*  [Спамодавка списками приватности](Спамодавка_списками_приватности.md) 
*  [Новый вид Tk в 8.5](Новый_вид_Tk_в_8.5.md) 

### <a id="ПрактикаПрактика.md"></a>[Практика](Практика.md)
 
*  [Ткаббер ЧаВо](Ткаббер_ЧаВо.md) 
*  [Смайлики и аватары](Смайлики_и_аватары.md) 
*  [Цветовые темы и пиктограммы](Цветовые_темы_и_пиктограммы.md) 
*  [Проблемы со звуком](Проблемы_со_звуком.md) 
*  [Нетривиальные настройки](Нетривиальные_настройки.md) 
  

Changes to wiki/ru/Файл_конфигурации.md.

8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
![(!)](../images/Hammer.png) **Сделать:** потихоньку прибить эту статью или по крайней мере заставить шагать в ногу с сегодняшним днём (например, заменить все вхождения **~/.tkabber** на **[$::configdir]($__configdir.md)**) 

Если рабочие программные файлы можно сравнить с мотором Ткаббера, то файл конфигурации - это его рулевая система. В нём хранятся все настройки, мыслимые и немыслимые (если вы хорошо знаете "тикль", то можете сами дописывать что-нибудь новое, и пределы ограничиваются лишь возможностями языка и вашими усердием, знаниями и фантазией). Вы можете написать свой собственный конфиг, а можете использовать опыт других. В этой статье мы рассмотрим четыре конфига, доступные в директории примеров **/usr/share/tkabber/examples**: config.tcl, teo-config.tcl, mtr-config.tcl, badlop-config.tcl. Порядок выбран именно такой - от простого к сложному, хотя возможно, Windows-пользователям захочется побыстрее прочитать про конфиг от **badlop** - он не только "кросс-платформенный", но и вообще весьма разработан. Но если вы новичок, и все эти непонятные строчки в конфигах вас пугают, советуем двигаться постепенно. 

## <a id="toc"></a>Содержание

* [1 Config.tcl](#Config.tcl)
   * [1.1 Настройка параметров логина](#Настройка_параметров_логина)
   * [1.2 Внешний вид](#Внешний_вид)
      * [1.2.1 Цветовые схемы](#Цветовые_схемы)
      * [1.2.2 Всплывающие подсказки](#Всплывающие_подсказки)
      * [1.2.3 Работа с ссылками](#Работа_с_ссылками)
      * [1.2.4 Аватары и смайлики](#Аватары_и_смайлики)
* [2 Teo-config.tcl](#Teo-config.tcl)
* [3 MTR-config.tcl](#MTR-config.tcl)
* [4 Badlop-config.tcl](#Badlop-config.tcl)
   * [4.1 Badlop-config-home.tcl](#Badlop-config-home.tcl)
   * [4.2 Собственно badlop-config.tcl](#Собственно_badlop-config.tcl)
* [5 Попытка объяснить конфигурирование Tkabber'a с другой стороны](#Попытка_объяснить_конфигурирование_Tkabbera_с_другой_стороны)

# <a id="Config.tcl"></a>Config.tcl
Этот конфиг создан автором Ткаббера - Алексеем Щепиным (**[xmpp:aleksey@jabber.ru](xmpp:aleksey@jabber.ru)**). Он довольно простой и содержит только основные настройки. Для начала в самый раз. 

## <a id="Настройка_параметров_логина"></a>Настройка параметров логина








|
|
|
|
|
|



|
|







8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
![(!)](../images/Hammer.png) **Сделать:** потихоньку прибить эту статью или по крайней мере заставить шагать в ногу с сегодняшним днём (например, заменить все вхождения **~/.tkabber** на **[$::configdir]($__configdir.md)**) 

Если рабочие программные файлы можно сравнить с мотором Ткаббера, то файл конфигурации - это его рулевая система. В нём хранятся все настройки, мыслимые и немыслимые (если вы хорошо знаете "тикль", то можете сами дописывать что-нибудь новое, и пределы ограничиваются лишь возможностями языка и вашими усердием, знаниями и фантазией). Вы можете написать свой собственный конфиг, а можете использовать опыт других. В этой статье мы рассмотрим четыре конфига, доступные в директории примеров **/usr/share/tkabber/examples**: config.tcl, teo-config.tcl, mtr-config.tcl, badlop-config.tcl. Порядок выбран именно такой - от простого к сложному, хотя возможно, Windows-пользователям захочется побыстрее прочитать про конфиг от **badlop** - он не только "кросс-платформенный", но и вообще весьма разработан. Но если вы новичок, и все эти непонятные строчки в конфигах вас пугают, советуем двигаться постепенно. 

## <a id="toc"></a>Содержание

* [1 Config.tcl](#Config.tcl)
 * [1.1 Настройка параметров логина](#Настройка_параметров_логина)
 * [1.2 Внешний вид](#Внешний_вид)
  * [1.2.1 Цветовые схемы](#Цветовые_схемы)
  * [1.2.2 Всплывающие подсказки](#Всплывающие_подсказки)
  * [1.2.3 Работа с ссылками](#Работа_с_ссылками)
  * [1.2.4 Аватары и смайлики](#Аватары_и_смайлики)
* [2 Teo-config.tcl](#Teo-config.tcl)
* [3 MTR-config.tcl](#MTR-config.tcl)
* [4 Badlop-config.tcl](#Badlop-config.tcl)
 * [4.1 Badlop-config-home.tcl](#Badlop-config-home.tcl)
 * [4.2 Собственно badlop-config.tcl](#Собственно_badlop-config.tcl)
* [5 Попытка объяснить конфигурирование Tkabber'a с другой стороны](#Попытка_объяснить_конфигурирование_Tkabbera_с_другой_стороны)

# <a id="Config.tcl"></a>Config.tcl
Этот конфиг создан автором Ткаббера - Алексеем Щепиным (**[xmpp:aleksey@jabber.ru](xmpp:aleksey@jabber.ru)**). Он довольно простой и содержит только основные настройки. Для начала в самый раз. 

## <a id="Настройка_параметров_логина"></a>Настройка параметров логина

Changes to wiki/ru/Цветовые_темы_и_пиктограммы.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Цветовые_темы_и_пиктограммы/index.html)


# Цветовые темы и пиктограммы

Материал из Tkabber Wiki.

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

## <a id="toc"></a>Содержание

* [1 Пиктограммы](#Пиктограммы)
   * [1.1 Quote](#Quote)
   * [1.2 Classic](#Classic)
   * [1.3 Quake 3 Arena (q3a)](#Quake_3_Arena_q3a)
   * [1.4 2Stars](#2Stars)
   * [1.5 Lamps](#Lamps)
   * [1.6 Stars](#Stars)

# <a id="Пиктограммы"></a>Пиктограммы
Чтобы использовать наборы иконок, надо распаковать их в каталог ~/.tkabber/pixmaps  (или его аналог в Windows %APPDATA%\\Tkabber\\pixmaps). Затем перезапустите Ткаббер и идите в **Настройки → Main Interface**. Опция выбора текущей темы находится почти в самом низу. Выбирайте нужную и применяйте изменения — иконки сразу поменяются на выбранные. 

Если вы собираетесь использовать пиктограммы, выполненные в формате, отличном от [GIF](http://ru.wikipedia.org/wiki/GIF), то у вас должен стоять пакет [Img](http://wiki.tcl.tk/Img). Это не проблема, если у вас установлена полная версия интерпретатора Tcl/Tk, если же вы счастливый обладатель старпака, то вам [сюда](0.9.x/ЧаВо.md#В_старпаке_старките_нет_звука_поддержки_JPEGPNG_сжатия); 

## <a id="Quote"></a>Quote












|
|
|
|
|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[//]: # (Generated from ../selected/ru.tkabber.jabe.ru/index.php/Цветовые_темы_и_пиктограммы/index.html)


# Цветовые темы и пиктограммы

Материал из Tkabber Wiki.

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

## <a id="toc"></a>Содержание

* [1 Пиктограммы](#Пиктограммы)
 * [1.1 Quote](#Quote)
 * [1.2 Classic](#Classic)
 * [1.3 Quake 3 Arena (q3a)](#Quake_3_Arena_q3a)
 * [1.4 2Stars](#2Stars)
 * [1.5 Lamps](#Lamps)
 * [1.6 Stars](#Stars)

# <a id="Пиктограммы"></a>Пиктограммы
Чтобы использовать наборы иконок, надо распаковать их в каталог ~/.tkabber/pixmaps  (или его аналог в Windows %APPDATA%\\Tkabber\\pixmaps). Затем перезапустите Ткаббер и идите в **Настройки → Main Interface**. Опция выбора текущей темы находится почти в самом низу. Выбирайте нужную и применяйте изменения — иконки сразу поменяются на выбранные. 

Если вы собираетесь использовать пиктограммы, выполненные в формате, отличном от [GIF](http://ru.wikipedia.org/wiki/GIF), то у вас должен стоять пакет [Img](http://wiki.tcl.tk/Img). Это не проблема, если у вас установлена полная версия интерпретатора Tcl/Tk, если же вы счастливый обладатель старпака, то вам [сюда](0.9.x/ЧаВо.md#В_старпаке_старките_нет_звука_поддержки_JPEGPNG_сжатия); 

## <a id="Quote"></a>Quote

Changes to wiki/ru/Чебуратор.md.

10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Теперь о том, как можно строить обсуждение и вносить предложения тут. Каждая фича этого конфигуратора сделана в виде отдельного раздела. Если кому-то надо чего-то добавить, в разделе пусть создаёт подраздел и туда пишет пожелания. Новый участник - новые пожелания. Не забывайте также об "Обсуждении" статьи (ссылка наверху, рядом с "Править"). 

## <a id="toc"></a>Содержание

* [1 Из чего состоит](#Из_чего_состоит)
* [2 Идея работы конфигуратора](#Идея_работы_конфигуратора)
* [3 Как выглядит](#Как_выглядит)
   * [3.1 Цветовая схема](#Цветовая_схема)
      * [3.1.1 Fixer](#Fixer)
      * [3.1.2 Bigote](#Bigote)
      * [3.1.3 Kostix](#Kostix)
      * [3.1.4 Bigote](#Bigote)
   * [3.2 Набор иконок ростера](#Набор_иконок_ростера)
      * [3.2.1 Fixer](#Fixer)
      * [3.2.2 Bigote](#Bigote)
      * [3.2.3 Archimed](#Archimed)
      * [3.2.4 Bigote](#Bigote)
   * [3.3 Звуковая схема](#Звуковая_схема)
      * [3.3.1 Fixer](#Fixer)
      * [3.3.2 Bigote](#Bigote)
   * [3.4 Выбор шрифта](#Выбор_шрифта)
   * [3.5 Подтверждение](#Подтверждение)
      * [3.5.1 Fixer](#Fixer)
      * [3.5.2 Bigote](#Bigote)
      * [3.5.3 Archimed](#Archimed)
      * [3.5.4 Bigote](#Bigote)
   * [3.6 Параметры логина](#Параметры_логина)
   * [3.7 Параметры передачи файлов](#Параметры_передачи_файлов)
   * [3.8 Показ аватар](#Показ_аватар)
* [4 Завершение](#Завершение)
      * [4 Archimed](#Archimed)
* [5 "Умный" конфигуратор](#Умный_конфигуратор)
      * [5 Archimed](#Archimed)
      * [5 Kostix](#Kostix)
      * [5 Bigote](#Bigote)
* [6 Остальным участникам обсуждения](#Остальным_участникам_обсуждения)
* [7 Конфигуратор на основе xml](#Конфигуратор_на_основе_xml)
      * [7 Kostix](#Kostix)
      * [7 Archimed](#Archimed)
* [8 Переконфигуратор на основе плагинов****](#Переконфигуратор_на_основе_плагинов)

# <a id="Из_чего_состоит"></a>Из чего состоит
*  Файл: configurator.tcl 
*  Подкаталог к нему — для скриншотов, файлов мессаджей на разных языках и прочего барахла; может, сам файл имеет смысл в этот каталог засунуть). 

# <a id="Идея_работы_конфигуратора"></a>Идея работы конфигуратора







|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|

|
|
|


|
|







10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Теперь о том, как можно строить обсуждение и вносить предложения тут. Каждая фича этого конфигуратора сделана в виде отдельного раздела. Если кому-то надо чего-то добавить, в разделе пусть создаёт подраздел и туда пишет пожелания. Новый участник - новые пожелания. Не забывайте также об "Обсуждении" статьи (ссылка наверху, рядом с "Править"). 

## <a id="toc"></a>Содержание

* [1 Из чего состоит](#Из_чего_состоит)
* [2 Идея работы конфигуратора](#Идея_работы_конфигуратора)
* [3 Как выглядит](#Как_выглядит)
 * [3.1 Цветовая схема](#Цветовая_схема)
  * [3.1.1 Fixer](#Fixer)
  * [3.1.2 Bigote](#Bigote)
  * [3.1.3 [Kostix](Участник_Kostix.md)](#KostixУчастник_Kostix.md)
  * [3.1.4 Bigote](#Bigote)
 * [3.2 Набор иконок ростера](#Набор_иконок_ростера)
  * [3.2.1 Fixer](#Fixer)
  * [3.2.2 Bigote](#Bigote)
  * [3.2.3 Archimed](#Archimed)
  * [3.2.4 Bigote](#Bigote)
 * [3.3 Звуковая схема](#Звуковая_схема)
  * [3.3.1 Fixer](#Fixer)
  * [3.3.2 Bigote](#Bigote)
 * [3.4 Выбор шрифта](#Выбор_шрифта)
 * [3.5 Подтверждение](#Подтверждение)
  * [3.5.1 Fixer](#Fixer)
  * [3.5.2 Bigote](#Bigote)
  * [3.5.3 Archimed](#Archimed)
  * [3.5.4 Bigote](#Bigote)
 * [3.6 Параметры логина](#Параметры_логина)
 * [3.7 Параметры передачи файлов](#Параметры_передачи_файлов)
 * [3.8 Показ аватар](#Показ_аватар)
* [4 Завершение](#Завершение)
  * [4 Archimed](#Archimed)
* [5 "Умный" конфигуратор](#Умный_конфигуратор)
  * [5 Archimed](#Archimed)
  * [5 [Kostix](Участник_Kostix.md)](#KostixУчастник_Kostix.md)
  * [5 Bigote](#Bigote)
* [6 Остальным участникам обсуждения](#Остальным_участникам_обсуждения)
* [7 Конфигуратор на основе xml](#Конфигуратор_на_основе_xml)
  * [7 [Kostix](Участник_Kostix.md)](#KostixУчастник_Kostix.md)
  * [7 Archimed](#Archimed)
* [8 Переконфигуратор на основе плагинов****](#Переконфигуратор_на_основе_плагинов)

# <a id="Из_чего_состоит"></a>Из чего состоит
*  Файл: configurator.tcl 
*  Подкаталог к нему — для скриншотов, файлов мессаджей на разных языках и прочего барахла; может, сам файл имеет смысл в этот каталог засунуть). 

# <a id="Идея_работы_конфигуратора"></a>Идея работы конфигуратора
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80

После недавнего откровения kostix об tk, windows и tkabber я его полностью поддержал в плане тем. Дефолтная - Windows и \*nix системы (для \*nix возможно подойдет dark и моя почти готовая тема, требует обсуждения).  Остальные темы, что имеются в наличии я бы отправил в биореактор =), ибо часть из них имеет очень отвратительную цветовую гамму ;)) 

### <a id="Bigote"></a>Bigote

А почему для \*nix тёмную? Типа пусть глаза ломают? Я ведь светлую тему не просто так выбрал, а из соображений эргономики ;) 

### <a id="Kostix"></a>[Kostix](Участник_Kostix.md)

Никаких тем по дефолту! 

Повторю ещё раз: 

 _никаких тем по дефолту!_ 








|







66
67
68
69
70
71
72
73
74
75
76
77
78
79
80

После недавнего откровения kostix об tk, windows и tkabber я его полностью поддержал в плане тем. Дефолтная - Windows и \*nix системы (для \*nix возможно подойдет dark и моя почти готовая тема, требует обсуждения).  Остальные темы, что имеются в наличии я бы отправил в биореактор =), ибо часть из них имеет очень отвратительную цветовую гамму ;)) 

### <a id="Bigote"></a>Bigote

А почему для \*nix тёмную? Типа пусть глаза ломают? Я ведь светлую тему не просто так выбрал, а из соображений эргономики ;) 

### <a id="KostixУчастник_Kostix.md"></a>[Kostix](Участник_Kostix.md)

Никаких тем по дефолту! 

Повторю ещё раз: 

 _никаких тем по дефолту!_ 

201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
# <a id="Умный_конфигуратор"></a>"Умный" конфигуратор
Добавит много работы этот пункт, но по уму надо бы осуществить: конфигуратор может быть **пере**конфигуратором, то есть при старте он ищет в домашнем каталоге юзверя конфиг, и если он есть, считывает интересующие данные, которые и отображает в качестве установленных по умолчанию. При сохранении конфига переписывает лишь изменившиеся опции. Таким образом к переконфигурации можно возвращаться несколько раз. 

### <a id="Archimed"></a>Archimed

Нужно условно структурировать файл **config.tcl**, например, как конфиг от Badlop. Для простоты, если опция будет находится не на своём месте - нещадно её комментировать. В комментариях проставлять идентификатор опции. 

### <a id="Kostix"></a>[Kostix](Участник_Kostix.md)

Господа! Забудьте уже про **config.tcl**! 

У Ткаббера есть механизм Customize, который: 

*  хранит свои настройки в **custom.tcl**, который является Большим Тиклевым Списком (то есть его можно прочитать не сложнее чем `
    set options [read [open custom.tcl r]]







|







201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
# <a id="Умный_конфигуратор"></a>"Умный" конфигуратор
Добавит много работы этот пункт, но по уму надо бы осуществить: конфигуратор может быть **пере**конфигуратором, то есть при старте он ищет в домашнем каталоге юзверя конфиг, и если он есть, считывает интересующие данные, которые и отображает в качестве установленных по умолчанию. При сохранении конфига переписывает лишь изменившиеся опции. Таким образом к переконфигурации можно возвращаться несколько раз. 

### <a id="Archimed"></a>Archimed

Нужно условно структурировать файл **config.tcl**, например, как конфиг от Badlop. Для простоты, если опция будет находится не на своём месте - нещадно её комментировать. В комментариях проставлять идентификатор опции. 

### <a id="KostixУчастник_Kostix.md"></a>[Kostix](Участник_Kostix.md)

Господа! Забудьте уже про **config.tcl**! 

У Ткаббера есть механизм Customize, который: 

*  хранит свои настройки в **custom.tcl**, который является Большим Тиклевым Списком (то есть его можно прочитать не сложнее чем `
    set options [read [open custom.tcl r]]
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
       </values>
    </option>

И так для каждой опции. Интерфейс конфигуратора генерится автоматически при запуске. Соответственно, появляется гибкая система настройки конфигуратора. Например можно сделать несколько уровней (beginner, intermediate, advanced) с разным количеством опций. Конечно протокол еще требует обсуждения, но зачатки я здесь указал. Готов приступит к работе при одобрении данной идеи. 

P.S.: Если где накосячил с xml, не пинайте сильно. :) Я мало с ним знаком. [eXire](Участник_EXire.md) 

### <a id="Kostix"></a>[Kostix](Участник_Kostix.md)

Вспоминаем старика Оккама и идём читать [эту статью](http://www.defmacro.org/ramblings/lisp.html), имея в виду, что тикль умеет всё то же самое, что и LISP, только его код не является S-expressions, а в остальном — позволяет натурально реализовать все идеи, изложенные в статье. 

Однако, см. про Customize в разделе "Умный" конфигуратор. 

[Занятная статья](http://users.pandora.be/koen.vandamme1/papers/tcl_fileformats/tcl_fileformats.html) — к вопросу о хранении данных для Tcl. 








|







249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
       </values>
    </option>

И так для каждой опции. Интерфейс конфигуратора генерится автоматически при запуске. Соответственно, появляется гибкая система настройки конфигуратора. Например можно сделать несколько уровней (beginner, intermediate, advanced) с разным количеством опций. Конечно протокол еще требует обсуждения, но зачатки я здесь указал. Готов приступит к работе при одобрении данной идеи. 

P.S.: Если где накосячил с xml, не пинайте сильно. :) Я мало с ним знаком. [eXire](Участник_EXire.md) 

### <a id="KostixУчастник_Kostix.md"></a>[Kostix](Участник_Kostix.md)

Вспоминаем старика Оккама и идём читать [эту статью](http://www.defmacro.org/ramblings/lisp.html), имея в виду, что тикль умеет всё то же самое, что и LISP, только его код не является S-expressions, а в остальном — позволяет натурально реализовать все идеи, изложенные в статье. 

Однако, см. про Customize в разделе "Умный" конфигуратор. 

[Занятная статья](http://users.pandora.be/koen.vandamme1/papers/tcl_fileformats/tcl_fileformats.html) — к вопросу о хранении данных для Tcl. 

Changes to wiki/ru/Шрифты.md.

11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

## <a id="toc"></a>Содержание

* [1 Предисловие](#Предисловие)
* [2 Где и как Ткаббер получает шрифты](#Где_и_как_Ткаббер_получает_шрифты)
* [3 Что настраивать](#Что_настраивать)
* [4 Как настраивать](#Как_настраивать)
   * [4.1 Настройка системы](#Настройка_системы)
      * [4.1.1 Windows](#Windows)
      * [4.1.2 Xft/fontconfig](#Xft_fontconfig)
      * [4.1.3 XRDB](#XRDB)
   * [4.2 Настройка Ткаббера](#Настройка_Ткаббера)
      * [4.2.1 Опции конфигурации](#Опции_конфигурации)
      * [4.2.2 База данных опций Tk](#База_данных_опций_Tk)
   * [4.3 Спецификации шрифтов Tk](#Спецификации_шрифтов_Tk)
      * [4.3.1 "Программное имя" шрифта](#Программное_имя_шрифта)
      * [4.3.2 Имя системного шрифта](#Имя_системного_шрифта)
      * [4.3.3 "Иксовый" формат](#Иксовый_формат)
      * [4.3.4 "Свободный" формат](#Свободный_формат)
      * [4.3.5 Формат "пары опция/значение"](#Формат_пары_опция_значение)
   * [4.4 Проблемы не-XLFD спецификаций в X Window](#Проблемы_не-XLFD_спецификаций_в_X_Window)
   * [4.5 Тонкая настройка шрифта интерфейса](#Тонкая_настройка_шрифта_интерфейса)
   * [4.6 Быстрый подбор шрифтов](#Быстрый_подбор_шрифтов)
      * [4.6.1 Шрифт интерфейса](#Шрифт_интерфейса)
      * [4.6.2 Шрифт окон чата и ростера](#Шрифт_окон_чата_и_ростера)
      * [4.6.3 Немножко хардкора](#Немножко_хардкора)
   * [4.7 Другие полезные средства](#Другие_полезные_средства)
* [5 Подводные камни](#Подводные_камни)
* [6 Примечания](#Примечания)
   * [6.1 Борьба с антиалиасингом в Xft](#Борьба_с_антиалиасингом_в_Xft)

# <a id="Предисловие"></a>Предисловие
[Tk](http://en.wikipedia.org/wiki/Tk (framework)), который используется Ткаббером для создания GUI, является жертвой "true-unix-way" гибкости, которую в него вложили, глядя на [Xt](http://en.wikipedia.org/wiki/Intrinsics), — _настраивать у него можно практически **любые аспекты интерфейса** по отдельности, включая их шрифты._ К сожалению, бесплатно такие вещи не даются, и для владения этим предметом нужно понимать, как работает [база данных опций Tk](База_данных_опций_Tk.md) (и родственная ей [XRDB](XRDB.md) в X Window System). 

Масла в огонь подливает и тот факт, что у большого количества пользователей систем, основанных на X Window (Linux, xBSD и т.п.), возникают проблемы со шрифтами в Ткаббере, поскольку они (пользователи) запускают его в окружениях, сплошь основанных на [GTK](http://www.gtk.org/) ([GNOME](http://www.gnome.org)) или [Qt](http://trolltech.com/products/qt) ([KDE](http://www.kde.org)), которые имеют свои собственные, глобальные в пределах "десктопа", системы управления шрифтами, "вражеские" для всех других систем поддержки GUI. Здесь мы не будем развивать эту тему — за подробностями обращайтесь к статье [Особенности реализации](Особенности_реализации.md). 

Ещё немного усложняет проблему со шрифтами в "иксах" то, что начиная с версии 8.5 Tk поддерживает Xft/fontconfig, который реализует другой подход к управлению шрифтами, нежели тот, который работал в версиях Tk \<= 8.4. 







|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|


|







11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

## <a id="toc"></a>Содержание

* [1 Предисловие](#Предисловие)
* [2 Где и как Ткаббер получает шрифты](#Где_и_как_Ткаббер_получает_шрифты)
* [3 Что настраивать](#Что_настраивать)
* [4 Как настраивать](#Как_настраивать)
 * [4.1 Настройка системы](#Настройка_системы)
  * [4.1.1 Windows](#Windows)
  * [4.1.2 Xft/fontconfig](#Xft_fontconfig)
  * [4.1.3 XRDB](#XRDB)
 * [4.2 Настройка Ткаббера](#Настройка_Ткаббера)
  * [4.2.1 Опции конфигурации](#Опции_конфигурации)
  * [4.2.2 База данных опций Tk](#База_данных_опций_Tk)
 * [4.3 Спецификации шрифтов Tk](#Спецификации_шрифтов_Tk)
  * [4.3.1 "Программное имя" шрифта](#Программное_имя_шрифта)
  * [4.3.2 Имя системного шрифта](#Имя_системного_шрифта)
  * [4.3.3 "Иксовый" формат](#Иксовый_формат)
  * [4.3.4 "Свободный" формат](#Свободный_формат)
  * [4.3.5 Формат "пары опция/значение"](#Формат_пары_опция_значение)
 * [4.4 Проблемы не-XLFD спецификаций в X Window](#Проблемы_не-XLFD_спецификаций_в_X_Window)
 * [4.5 Тонкая настройка шрифта интерфейса](#Тонкая_настройка_шрифта_интерфейса)
 * [4.6 Быстрый подбор шрифтов](#Быстрый_подбор_шрифтов)
  * [4.6.1 Шрифт интерфейса](#Шрифт_интерфейса)
  * [4.6.2 Шрифт окон чата и ростера](#Шрифт_окон_чата_и_ростера)
  * [4.6.3 Немножко хардкора](#Немножко_хардкора)
 * [4.7 Другие полезные средства](#Другие_полезные_средства)
* [5 Подводные камни](#Подводные_камни)
* [6 Примечания](#Примечания)
 * [6.1 Борьба с антиалиасингом в Xft](#Борьба_с_антиалиасингом_в_Xft)

# <a id="Предисловие"></a>Предисловие
[Tk](http://en.wikipedia.org/wiki/Tk (framework)), который используется Ткаббером для создания GUI, является жертвой "true-unix-way" гибкости, которую в него вложили, глядя на [Xt](http://en.wikipedia.org/wiki/Intrinsics), — _настраивать у него можно практически **любые аспекты интерфейса** по отдельности, включая их шрифты._ К сожалению, бесплатно такие вещи не даются, и для владения этим предметом нужно понимать, как работает [база данных опций Tk](База_данных_опций_Tk.md) (и родственная ей [XRDB](XRDB.md) в X Window System). 

Масла в огонь подливает и тот факт, что у большого количества пользователей систем, основанных на X Window (Linux, xBSD и т.п.), возникают проблемы со шрифтами в Ткаббере, поскольку они (пользователи) запускают его в окружениях, сплошь основанных на [GTK](http://www.gtk.org/) ([GNOME](http://www.gnome.org)) или [Qt](http://trolltech.com/products/qt) ([KDE](http://www.kde.org)), которые имеют свои собственные, глобальные в пределах "десктопа", системы управления шрифтами, "вражеские" для всех других систем поддержки GUI. Здесь мы не будем развивать эту тему — за подробностями обращайтесь к статье [Особенности реализации](Особенности_реализации.md). 

Ещё немного усложняет проблему со шрифтами в "иксах" то, что начиная с версии 8.5 Tk поддерживает Xft/fontconfig, который реализует другой подход к управлению шрифтами, нежели тот, который работал в версиях Tk \<= 8.4. 

Changes to wiki/uk/Tkabber_Wiki_Довідка.md.

13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34



35
36
37
38
39
40
41

Отже, почнемо. 

## <a id="toc"></a>Зміст

* [1 Якщо ви не працювали з вікі раніше](#Якщо_ви_не_працювали_з_вікі_раніше)
* [2 Тепер про оформлення](#Тепер_про_оформлення)
   * [2.1 Для авторів нових статей](#Для_авторів_нових_статей)
      * [2.1.1 Застосування відбою пробілом](#Застосування_відбою_пробілом)
      * [2.1.2 Застосування HTML](#Застосування_HTML)
      * [2.1.3 Застосування тега **\<tt>**](#Застосування_тега_tt)
      * [2.1.4 Застосування жирного шрифту](#Застосування_жирного_шрифту)
      * [2.1.5 Застосування похилого шрифту](#Застосування_похилого_шрифту)
      * [2.1.6 Вживання смайликів у тексті](#Вживання_смайликів_у_тексті)
      * [2.1.7 Інші елементи оформлення](#Інші_елементи_оформлення)
      * [2.1.8 Пісочниця](#Пісочниця)
   * [2.2 Перекладачам](#Перекладачам)
      * [2.2.1 Що треба робити при перекладі на нову мову з нуля](#Що_треба_робити_при_перекладі_на_нову_мову_з_нуля)
      * [2.2.2 Переклад на рідну мову](#Переклад_на_рідну_мову)
      * [2.2.3 Переклад на чужу мову](#Переклад_на_чужу_мову)
      * [2.2.4 Переклад меню](#Переклад_меню)
      * [2.2.5 Локалізація Ткаббера](#Локалізація_Ткаббера)




# <a id="Якщо_ви_не_працювали_з_вікі_раніше"></a>Якщо ви не працювали з вікі раніше
*  Докладна й дуже пристойна [справка](http://ru.wikipedia.org/wiki/Wiki-разметка) по розмітці WikiPedia. На тій сторінці є посилання на більше конкретні теми: "зображення", "як почати нову статтю" та інше. Як теоретична база — ідеальне місце. 
*  Для створення галерей, однак, зручніше скористатися [посиланням на відповідний розділ MediaWiki](http://www.mediawiki.org/w/index.php?title=Sites_using_MediaWiki/gallery&action=submit), що відразу показує правильний приклад коду (на wikipedia.org чомусь про галереї сказано мимохіть, і працюючий код не продемонстрований, а щоб обчислити його самому, треба або довго експеремтувати, або бути генієм ;)) 
*  Подивіться також [документацію по настроюванню інтерфейсу](http://meta.wikipedia.org/wiki/MediaWiki_i18n) і [Мануал користувача](http://meta.wikipedia.org/wiki/MediaWiki_User's_Guide) по використанню й настроюванню довідкової системи. 

# <a id="Тепер_про_оформлення"></a>Тепер про оформлення







|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
>







13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

Отже, почнемо. 

## <a id="toc"></a>Зміст

* [1 Якщо ви не працювали з вікі раніше](#Якщо_ви_не_працювали_з_вікі_раніше)
* [2 Тепер про оформлення](#Тепер_про_оформлення)
 * [2.1 Для авторів нових статей](#Для_авторів_нових_статей)
  * [2.1.1 Застосування відбою пробілом](#Застосування_відбою_пробілом)
  * [2.1.2 Застосування HTML](#Застосування_HTML)
  * [2.1.3 Застосування тега **\<tt>**](#Застосування_тега_tt)
  * [2.1.4 Застосування жирного шрифту](#Застосування_жирного_шрифту)
  * [2.1.5 Застосування похилого шрифту](#Застосування_похилого_шрифту)
  * [2.1.6 Вживання смайликів у тексті](#Вживання_смайликів_у_тексті)
  * [2.1.7 Інші елементи оформлення](#Інші_елементи_оформлення)
  * [2.1.8 Пісочниця](#Пісочниця)
 * [2.2 Перекладачам](#Перекладачам)
  * [2.2.1 Що треба робити при перекладі на нову мову з нуля](#Що_треба_робити_при_перекладі_на_нову_мову_з_нуля)
  * [2.2.2 Переклад на рідну мову](#Переклад_на_рідну_мову)
  * [2.2.3 Переклад на чужу мову](#Переклад_на_чужу_мову)
  * [2.2.4 Переклад меню](#Переклад_меню)
  * [2.2.5 Локалізація Ткаббера](#Локалізація_Ткаббера)
   * [2.2.5 Обновляємо існуючі повідомлення](#Обновляємо_існуючі_повідомлення)
   * [2.2.5 Створення нової версії](#Створення_нової_версії)
   * [2.2.5 Що ще перекладати?](#Що_ще_перекладати)

# <a id="Якщо_ви_не_працювали_з_вікі_раніше"></a>Якщо ви не працювали з вікі раніше
*  Докладна й дуже пристойна [справка](http://ru.wikipedia.org/wiki/Wiki-разметка) по розмітці WikiPedia. На тій сторінці є посилання на більше конкретні теми: "зображення", "як почати нову статтю" та інше. Як теоретична база — ідеальне місце. 
*  Для створення галерей, однак, зручніше скористатися [посиланням на відповідний розділ MediaWiki](http://www.mediawiki.org/w/index.php?title=Sites_using_MediaWiki/gallery&action=submit), що відразу показує правильний приклад коду (на wikipedia.org чомусь про галереї сказано мимохіть, і працюючий код не продемонстрований, а щоб обчислити його самому, треба або довго експеремтувати, або бути генієм ;)) 
*  Подивіться також [документацію по настроюванню інтерфейсу](http://meta.wikipedia.org/wiki/MediaWiki_i18n) і [Мануал користувача](http://meta.wikipedia.org/wiki/MediaWiki_User's_Guide) по використанню й настроюванню довідкової системи. 

# <a id="Тепер_про_оформлення"></a>Тепер про оформлення

Changes to wiki/uk/Дистрибутиви__які_ми_обираємо.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[//]: # (Generated from ../selected/uk.tkabber.jabe.ru/index.php/Дистрибутиви,_які_ми_обираємо/index.html)


# Дистрибутиви, які ми обираємо

Матеріал з Tkabber Wiki

## <a id="toc"></a>Зміст

* [1 Начните работу с нажатия этой кнопки (c) Windows](#Начните_работу_с_нажатия_этой_кнопки_c_Windows)
* [2 "Самодостаточные" дистрибутивы Ткаббера](#Самодостаточные_дистрибутивы_Ткаббера)
   * [2.1 Tclkit, starkits и starpacks: немного теории](#Tclkit_starkits_и_starpacks_немного_теории)
      * [2.1.1 Тиклькит](#Тиклькит)
      * [2.1.2 Старкиты](#Старкиты)
      * [2.1.3 Старпаки](#Старпаки)
   * [2.2 Назад, к Ткабберу!](#Назад_к_Ткабберу)
      * [2.2.1 Tkabber-pack — особая песня](#Tkabber-pack_-_особая_песня)
* [3 Быстрее! Выше! Сильнее!](#Быстрее_Выше_Сильнее)
* [4 Прилавок](#Прилавок)
   * [4.1 Рукоделие](#Рукоделие)
* [5 Кто сильнее: кит или пак? (Что выбрать?)](#Кто_сильнее_кит_или_пак_Что_выбрать)
   * [5.1 "Каноническая" установка: Tcl/Tk + Ткаббер](#Каноническая_установка_Tcl_Tk_+_Ткаббер)
      * [5.1.1 Осевой вариант](#Осевой_вариант)
      * [5.1.2 Windows: не бейсиком единым...](#Windows_не_бейсиком_единым...)
      * [5.1.3 Дистрибутив Tcl/Tk в системе: pros et contras](#Дистрибутив_Tcl_Tk_в_системе_pros_et_contras)
   * [5.2 Всё своё ношу с собой](#Всё_своё_ношу_с_собой)
      * [5.2.1 Ткаббер-пак опять идёт не в ногу](#Ткаббер-пак_опять_идёт_не_в_ногу)

# <a id="Начните_работу_с_нажатия_этой_кнопки_c_Windows"></a>Начните работу с нажатия этой кнопки (c) Windows

Куда ставить-то?! 

© х/ф "Посторонним вход воспрещается" 












|
|
|
|
|
|


|

|
|
|
|
|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[//]: # (Generated from ../selected/uk.tkabber.jabe.ru/index.php/Дистрибутиви,_які_ми_обираємо/index.html)


# Дистрибутиви, які ми обираємо

Матеріал з Tkabber Wiki

## <a id="toc"></a>Зміст

* [1 Начните работу с нажатия этой кнопки (c) Windows](#Начните_работу_с_нажатия_этой_кнопки_c_Windows)
* [2 "Самодостаточные" дистрибутивы Ткаббера](#Самодостаточные_дистрибутивы_Ткаббера)
 * [2.1 Tclkit, starkits и starpacks: немного теории](#Tclkit_starkits_и_starpacks_немного_теории)
  * [2.1.1 Тиклькит](#Тиклькит)
  * [2.1.2 Старкиты](#Старкиты)
  * [2.1.3 Старпаки](#Старпаки)
 * [2.2 Назад, к Ткабберу!](#Назад_к_Ткабберу)
  * [2.2.1 Tkabber-pack — особая песня](#Tkabber-pack_-_особая_песня)
* [3 Быстрее! Выше! Сильнее!](#Быстрее_Выше_Сильнее)
* [4 Прилавок](#Прилавок)
 * [4.1 Рукоделие](#Рукоделие)
* [5 Кто сильнее: кит или пак? (Что выбрать?)](#Кто_сильнее_кит_или_пак_Что_выбрать)
 * [5.1 "Каноническая" установка: Tcl/Tk + Ткаббер](#Каноническая_установка_Tcl_Tk_+_Ткаббер)
  * [5.1.1 Осевой вариант](#Осевой_вариант)
  * [5.1.2 Windows: не бейсиком единым...](#Windows_не_бейсиком_единым...)
  * [5.1.3 Дистрибутив Tcl/Tk в системе: pros et contras](#Дистрибутив_Tcl_Tk_в_системе_pros_et_contras)
 * [5.2 Всё своё ношу с собой](#Всё_своё_ношу_с_собой)
  * [5.2.1 Ткаббер-пак опять идёт не в ногу](#Ткаббер-пак_опять_идёт_не_в_ногу)

# <a id="Начните_работу_с_нажатия_этой_кнопки_c_Windows"></a>Начните работу с нажатия этой кнопки (c) Windows

Куда ставить-то?! 

© х/ф "Посторонним вход воспрещается" 

Changes to wiki/uk/Плагіни.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[//]: # (Generated from ../selected/uk.tkabber.jabe.ru/index.php/Плагіни/index.html)


# Плагіни

Матеріал з Tkabber Wiki

 ЗРОБИТИ ПОСИЛАННЯ НА ФАЙЛИ З РОС. ВІКІ І ПОФІКСИТИ УЧАСНИКІВ НА КОРИСТУВАЧІВ (З посиланням на рос. вікі чи зробити їх на цій?) 

## <a id="toc"></a>Зміст

* [1 Офіційні плагіни для Ткаббера](#Офіційні_плагіни_для_Ткаббера)
* [2 Неофіційні плагині для Ткаббера](#Неофіційні_плагині_для_Ткаббера)
   * [2.1 Alarm](#Alarm)
   * [2.2 Autoconnect](#Autoconnect)
   * [2.3 Tab number](#Tab_number)
   * [2.4 Confirm](#Confirm)
   * [2.5 Rsssaver](#Rsssaver)
   * [2.6 Bookmarks](#Bookmarks)
   * [2.7 Meebo me](#Meebo_me)

# <a id="Офіційні_плагіни_для_Ткаббера"></a>Офіційні плагіни для Ткаббера
У цьому розділі нічого принципово нового не буде — зведення по існуючим плагінам і коротка допомога для бажаючих завантажити їх. 

Отже, на сьогоднішній день на [офіційній сторінці плагінів](http://tkabber.jabber.ru/tkabber-plugins) налічується 12 розширень до Ткаббера: bc, checkers, chess, cyrillize, ejabberd, georoster, mute, osd, reversi, socials, spy і whiteboard. Двома словами про кожний: 

*  bc — гра "Бики і корови". 













|
|
|
|
|
|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[//]: # (Generated from ../selected/uk.tkabber.jabe.ru/index.php/Плагіни/index.html)


# Плагіни

Матеріал з Tkabber Wiki

 ЗРОБИТИ ПОСИЛАННЯ НА ФАЙЛИ З РОС. ВІКІ І ПОФІКСИТИ УЧАСНИКІВ НА КОРИСТУВАЧІВ (З посиланням на рос. вікі чи зробити їх на цій?) 

## <a id="toc"></a>Зміст

* [1 Офіційні плагіни для Ткаббера](#Офіційні_плагіни_для_Ткаббера)
* [2 Неофіційні плагині для Ткаббера](#Неофіційні_плагині_для_Ткаббера)
 * [2.1 Alarm](#Alarm)
 * [2.2 Autoconnect](#Autoconnect)
 * [2.3 Tab number](#Tab_number)
 * [2.4 Confirm](#Confirm)
 * [2.5 Rsssaver](#Rsssaver)
 * [2.6 Bookmarks](#Bookmarks)
 * [2.7 Meebo me](#Meebo_me)

# <a id="Офіційні_плагіни_для_Ткаббера"></a>Офіційні плагіни для Ткаббера
У цьому розділі нічого принципово нового не буде — зведення по існуючим плагінам і коротка допомога для бажаючих завантажити їх. 

Отже, на сьогоднішній день на [офіційній сторінці плагінів](http://tkabber.jabber.ru/tkabber-plugins) налічується 12 розширень до Ткаббера: bc, checkers, chess, cyrillize, ejabberd, georoster, mute, osd, reversi, socials, spy і whiteboard. Двома словами про кожний: 

*  bc — гра "Бики і корови". 

Changes to wiki/uk/Посилання.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[//]: # (Generated from ../selected/uk.tkabber.jabe.ru/index.php/Посилання/index.html)


# Посилання

Матеріал з Tkabber Wiki

На цій сторінці будуть потихеньку збиратися посилання на зовнішні ресурси, присвячені Ткабберу і Джабберу. 

## <a id="toc"></a>Зміст

* [1 Документація і завантаження](#Документація_і_завантаження)
   * [1.1 Сайти про Ткаббер на інших мовах](#Сайти_про_Ткаббер_на_інших_мовах)
* [2 Народна творчість](#Народна_творчість)
   * [2.1 Кольорові схеми](#Кольорові_схеми)
   * [2.2 Смайл-паки, аватари](#Смайл-паки_аватари)
   * [2.3 Звукові схеми](#Звукові_схеми)
   * [2.4 Сторонні плагіни](#Сторонні_плагіни)
* [3 Tcl/Tk](#Tcl_Tk)
* [4 Jabber](#Jabber)
* [5 Різне](#Різне)

# <a id="Документація_і_завантаження"></a>Документація і завантаження
*  [Офіційний сайт Ткаббера.](http://tkabber.jabber.ru) 
 *  Тут ви можете [завантажити](http://tkabber.jabber.ru/download) Ткаббер. 












|

|
|
|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[//]: # (Generated from ../selected/uk.tkabber.jabe.ru/index.php/Посилання/index.html)


# Посилання

Матеріал з Tkabber Wiki

На цій сторінці будуть потихеньку збиратися посилання на зовнішні ресурси, присвячені Ткабберу і Джабберу. 

## <a id="toc"></a>Зміст

* [1 Документація і завантаження](#Документація_і_завантаження)
 * [1.1 Сайти про Ткаббер на інших мовах](#Сайти_про_Ткаббер_на_інших_мовах)
* [2 Народна творчість](#Народна_творчість)
 * [2.1 Кольорові схеми](#Кольорові_схеми)
 * [2.2 Смайл-паки, аватари](#Смайл-паки_аватари)
 * [2.3 Звукові схеми](#Звукові_схеми)
 * [2.4 Сторонні плагіни](#Сторонні_плагіни)
* [3 Tcl/Tk](#Tcl_Tk)
* [4 Jabber](#Jabber)
* [5 Різне](#Різне)

# <a id="Документація_і_завантаження"></a>Документація і завантаження
*  [Офіційний сайт Ткаббера.](http://tkabber.jabber.ru) 
 *  Тут ви можете [завантажити](http://tkabber.jabber.ru/download) Ткаббер. 

Changes to wiki/uk/Початківцям.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[//]: # (Generated from ../selected/uk.tkabber.jabe.ru/index.php/Початківцям/index.html)


# Початківцям

Матеріал з Tkabber Wiki

## <a id="toc"></a>Зміст

* [1 Встановлення і швидкий старт](#Встановлення_і_швидкий_старт)
   * [1.1 Вікно логіна](#Вікно_логіна)
   * [1.2 Створення нового акаунта](#Створення_нового_акаунта)
   * [1.3 Дискавери. Первые шаги](#Дискавери._Первые_шаги)
   * [1.4 Добавление контактов в ростер](#Добавление_контактов_в_ростер)
   * [1.5 Некоторые полезные команды](#Некоторые_полезные_команды)
   * [1.6 Дискавери. Добавляем контакты из "асек" и прочих "ирок", добавляем фиды RSS.](#Дискавери._Добавляем_контакты_из_асек_и_прочих_ирок_добавляем_фиды_RSS.)
* [2 Локализация Tkabber](#Локализация_Tkabber)

# <a id="Встановлення_і_швидкий_старт"></a>Встановлення і швидкий старт
Вибір [дистрибутива](http://tkabber.jabber.ru/download) залежить від операційної системи, в котрій ви працюєте. Інсталяція Ткаббера в середовищі Linux докладно [описана](http://tkabber.jabber.ru/tuto-install-tkabber) на форумі сайта tkabber.jabber.ru і проблем викликати не повинна. Під Windows інсталяція теж проходить гладко. Єдине, що ми б порадили — це не ставити Tkabber-Starpack версії 0.9.8 і нижче — там немає файла підтримки кодування Windows-1251, тому такий Ткаббер не може розмовляти українською. Але починаючи з версії 0.9.9 ця помилка в старпаці була виправлена. 

## <a id="Вікно_логіна"></a>Вікно логіна











|
|
|
|
|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[//]: # (Generated from ../selected/uk.tkabber.jabe.ru/index.php/Початківцям/index.html)


# Початківцям

Матеріал з Tkabber Wiki

## <a id="toc"></a>Зміст

* [1 Встановлення і швидкий старт](#Встановлення_і_швидкий_старт)
 * [1.1 Вікно логіна](#Вікно_логіна)
 * [1.2 Створення нового акаунта](#Створення_нового_акаунта)
 * [1.3 Дискавери. Первые шаги](#Дискавери._Первые_шаги)
 * [1.4 Добавление контактов в ростер](#Добавление_контактов_в_ростер)
 * [1.5 Некоторые полезные команды](#Некоторые_полезные_команды)
 * [1.6 Дискавери. Добавляем контакты из "асек" и прочих "ирок", добавляем фиды RSS.](#Дискавери._Добавляем_контакты_из_асек_и_прочих_ирок_добавляем_фиды_RSS.)
* [2 Локализация Tkabber](#Локализация_Tkabber)

# <a id="Встановлення_і_швидкий_старт"></a>Встановлення і швидкий старт
Вибір [дистрибутива](http://tkabber.jabber.ru/download) залежить від операційної системи, в котрій ви працюєте. Інсталяція Ткаббера в середовищі Linux докладно [описана](http://tkabber.jabber.ru/tuto-install-tkabber) на форумі сайта tkabber.jabber.ru і проблем викликати не повинна. Під Windows інсталяція теж проходить гладко. Єдине, що ми б порадили — це не ставити Tkabber-Starpack версії 0.9.8 і нижче — там немає файла підтримки кодування Windows-1251, тому такий Ткаббер не може розмовляти українською. Але починаючи з версії 0.9.9 ця помилка в старпаці була виправлена. 

## <a id="Вікно_логіна"></a>Вікно логіна

Changes to wiki/uk/Практика.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[//]: # (Generated from ../selected/uk.tkabber.jabe.ru/index.php/Практика/index.html)


# Практика

Матеріал з Tkabber Wiki

 Тут, як неважко здогадатися, невтомні дослідники можливостей Ткаббера можуть знайти практичні поради по усуненню неполадок, а також по розширенню існуючого функціонала. Іншими словами, цей розділ написаний для тих, хто не проти озброїтися напилком і перетворити підводний човен у літак ;) 

## <a id="toc"></a>Зміст

* [1 Часто запитувані питання (ЧЗП)](#Часто_запитувані_питання_ЧЗП)
* [2 Хохлома](#Хохлома)
   * [2.1 Смайлики й аватари](#Смайлики_й_аватари)
   * [2.2 Кольорові теми та інша графіка](#Кольорові_теми_та_інша_графіка)
   * [2.3 Звуковий супровід](#Звуковий_супровід)
* [3 Нетривіальні колупання конфіга](#Нетривіальні_колупання_конфіга)
* [4 Колупання програмного коду](#Колупання_програмного_коду)
   * [4.1 Плагіни / Штепселі](#Плагіни___Штепселі)
   * [4.2 Патчі / Заплатки](#Патчі___Заплатки)

# <a id="Часто_запитувані_питання_ЧЗП"></a>Часто запитувані питання (ЧЗП)
[Маленькі хитрості, або Tkabber F.A.Q.](Ткаббер_ЧЗП.md) 

# <a id="Хохлома"></a>Хохлома
Тут будуть дані посилання на готові кольорові / звукові схеми і набори смайликів, а також поради по їх "прикручуванню" до Ткаббера. 














|
|
|


|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[//]: # (Generated from ../selected/uk.tkabber.jabe.ru/index.php/Практика/index.html)


# Практика

Матеріал з Tkabber Wiki

 Тут, як неважко здогадатися, невтомні дослідники можливостей Ткаббера можуть знайти практичні поради по усуненню неполадок, а також по розширенню існуючого функціонала. Іншими словами, цей розділ написаний для тих, хто не проти озброїтися напилком і перетворити підводний човен у літак ;) 

## <a id="toc"></a>Зміст

* [1 Часто запитувані питання (ЧЗП)](#Часто_запитувані_питання_ЧЗП)
* [2 Хохлома](#Хохлома)
 * [2.1 Смайлики й аватари](#Смайлики_й_аватари)
 * [2.2 Кольорові теми та інша графіка](#Кольорові_теми_та_інша_графіка)
 * [2.3 Звуковий супровід](#Звуковий_супровід)
* [3 Нетривіальні колупання конфіга](#Нетривіальні_колупання_конфіга)
* [4 Колупання програмного коду](#Колупання_програмного_коду)
 * [4.1 Плагіни / Штепселі](#Плагіни___Штепселі)
 * [4.2 Патчі / Заплатки](#Патчі___Заплатки)

# <a id="Часто_запитувані_питання_ЧЗП"></a>Часто запитувані питання (ЧЗП)
[Маленькі хитрості, або Tkabber F.A.Q.](Ткаббер_ЧЗП.md) 

# <a id="Хохлома"></a>Хохлома
Тут будуть дані посилання на готові кольорові / звукові схеми і набори смайликів, а також поради по їх "прикручуванню" до Ткаббера. 

Changes to wiki/uk/Службова/Всі_сторінки.md.

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
* [Головна стаття](../Головна_стаття.md) (3 посилання, 1 зі сторінок на інших мовах)
* [Дистрибутиви, які ми обираємо](../Дистрибутиви__які_ми_обираємо.md) (6 посилань)
* [Користувач:Fixer](../Користувач_Fixer.md) (2 посилання)
* [Плагіни](../Плагіни.md) (10 посилань)
* [Посилання](../Посилання.md) (2 посилання)
* [Початківцям](../Початківцям.md) (5 посилань)
* [Практика](../Практика.md) (3 посилання)
* [Службова/Всі сторінки](../Службова/Всі_сторінки.md) (**0** посилань)
* [Службова/Відсутні посилання](../Службова/Відсутні_посилання.md) (1 посилання)
* [Теорія](../Теорія.md) (3 посилання)
* [Термінологія](../Термінологія.md) (6 посилань)
* [Ткаббер - чемпіон?](../Ткаббер_-_чемпіон_.md) (4 посилання)
* [Ткаббер ЧЗП](../Ткаббер_ЧЗП.md) (8 посилань)
* [Ткаббер ЧЗП/Зовнішній вигляд і звук](../Ткаббер_ЧЗП/Зовнішній_вигляд_і_звук.md) (1 посилання)
* [Учасник:bigote](../Учасник_bigote.md) (4 посилання)
* [Учасник:kostix](../Учасник_kostix.md) (2 посилання)
* [Учасник:lknight](../Учасник_lknight.md) (5 посилань)








|
|






|


9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
* [Головна стаття](../Головна_стаття.md) (3 посилання, 1 зі сторінок на інших мовах)
* [Дистрибутиви, які ми обираємо](../Дистрибутиви__які_ми_обираємо.md) (6 посилань)
* [Користувач:Fixer](../Користувач_Fixer.md) (2 посилання)
* [Плагіни](../Плагіни.md) (10 посилань)
* [Посилання](../Посилання.md) (2 посилання)
* [Початківцям](../Початківцям.md) (5 посилань)
* [Практика](../Практика.md) (3 посилання)
* [Службова/Всі сторінки](../Службова/Всі_сторінки.md) (1 посилання)
* [Службова/Відсутні посилання](../Службова/Відсутні_посилання.md) (**0** посилань)
* [Теорія](../Теорія.md) (3 посилання)
* [Термінологія](../Термінологія.md) (6 посилань)
* [Ткаббер - чемпіон?](../Ткаббер_-_чемпіон_.md) (4 посилання)
* [Ткаббер ЧЗП](../Ткаббер_ЧЗП.md) (8 посилань)
* [Ткаббер ЧЗП/Зовнішній вигляд і звук](../Ткаббер_ЧЗП/Зовнішній_вигляд_і_звук.md) (1 посилання)
* [Учасник:bigote](../Учасник_bigote.md) (4 посилання)
* [Учасник:kostix](../Учасник_kostix.md) (3 посилання)
* [Учасник:lknight](../Учасник_lknight.md) (5 посилань)

Changes to wiki/uk/Службова/Відсутні_посилання.md.

18
19
20
21
22
23
24


25
26
27



28
29
30
31
32
33
34

* Sandbox.md
* http://tkabber.jabe.ru
* Службова\_Allpages.md
* Службова\_Recentchanges.md
* Термінологія.md\#транк
* Ткаббер\_НЗП.md



#### [Головна стаття](../Головна_стаття.md)




* Користувач\_Archimed.md

#### [Дистрибутиви, які ми обираємо](../Дистрибутиви__які_ми_обираємо.md)

* Low\_traffic\_HOWTO.md
* Tkabber\_starpack.md
* Дистрибутивы\_\_которые\_мы\_выбираем.md







>
>



>
>
>







18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

* Sandbox.md
* http://tkabber.jabe.ru
* Службова\_Allpages.md
* Службова\_Recentchanges.md
* Термінологія.md\#транк
* Ткаббер\_НЗП.md
* Учасник\_Bigote.md
* Учасник\_Lknight.md

#### [Головна стаття](../Головна_стаття.md)

* ../ru/Участник\_bigote.md
* ../ru/Участник\_kostix.md
* ../ru/Участник\_lknight.md
* Користувач\_Archimed.md

#### [Дистрибутиви, які ми обираємо](../Дистрибутиви__які_ми_обираємо.md)

* Low\_traffic\_HOWTO.md
* Tkabber\_starpack.md
* Дистрибутивы\_\_которые\_мы\_выбираем.md
57
58
59
60
61
62
63

64
65
66
67
68
69
70
* Нетривіальні\_налаштування.md
* Патчі.md
* Проблеми\_зі\_звуком.md
* Смайлики\_й\_аватари.md

#### [Теорія](../Теорія.md)


* Віддалене\_керування\_за\_допомогою\_send.md
* Відправка\_файлів\_\_теорія.md
* Меню.md
* Налаштування.md
* Налаштування\_Ткаббера\_\_ази\_і\_глибше.md
* Налаштування\_Ткаббера\_\_базис\_та\_глибше.md
* Ткаббер\_зсередини.md







>







62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
* Нетривіальні\_налаштування.md
* Патчі.md
* Проблеми\_зі\_звуком.md
* Смайлики\_й\_аватари.md

#### [Теорія](../Теорія.md)

* ../ru/Участник\_feez.md
* Віддалене\_керування\_за\_допомогою\_send.md
* Відправка\_файлів\_\_теорія.md
* Меню.md
* Налаштування.md
* Налаштування\_Ткаббера\_\_ази\_і\_глибше.md
* Налаштування\_Ткаббера\_\_базис\_та\_глибше.md
* Ткаббер\_зсередини.md
88
89
90
91
92
93
94
95

96











* Проблеми\_X\_Window\_і\_TTF.md
* Проблеми\_зі\_звуком.md
* Смайлики\_й\_аватари.md
* Тим\_\_хто\_починає.md
* Файл\_конфигурации.md
* Файл\_конфигурації.md
* Шифрування\_в\_Ткаббері.md






















>

>
>
>
>
>
>
>
>
>
>
>
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
* Проблеми\_X\_Window\_і\_TTF.md
* Проблеми\_зі\_звуком.md
* Смайлики\_й\_аватари.md
* Тим\_\_хто\_починає.md
* Файл\_конфигурации.md
* Файл\_конфигурації.md
* Шифрування\_в\_Ткаббері.md

#### [Учасник:bigote](../Учасник_bigote.md)

* ../ru/Участник\_bigote.md

#### [Учасник:kostix](../Учасник_kostix.md)

* ../ru/Участник\_kostix.md

#### [Учасник:lknight](../Учасник_lknight.md)

* ../ru/Участник\_lknight.md


Changes to wiki/uk/Теорія.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[//]: # (Generated from ../selected/uk.tkabber.jabe.ru/index.php/Теорія/index.html)


# Теорія

Матеріал з Tkabber Wiki

## <a id="toc"></a>Зміст

* [1 Глосарій (словарій)](#Глосарій_словарій)
* [2 Статті](#Статті)
   * [2.1 Початківцям](#Початківцям)
      * [2.1.1 Про Ткаббер](#Про_Ткаббер)
      * [2.1.2 Швидкий старт (з купою скриншотів)](#Швидкий_старт_з_купою_скриншотів)
      * [2.1.3 Налаштування Ткаббера: базис та глибше](#Налаштування_Ткаббера_базис_та_глибше)
   * [2.2 Вмілим користувачам](#Вмілим_користувачам)
      * [2.2.1 Тонке налаштування](#Тонке_налаштування)
      * [2.2.2 Меню](#Меню)
      * [2.2.3 Налаштування](#Налаштування)
      * [2.2.4 Config.tcl з людським обличчям](#Config.tcl_з_людським_обличчям)
   * [2.3 Інші статті](#Інші_статті)

# <a id="Глосарій_словарій"></a>Глосарій (словарій)
[1001 невідоме слово з тих, що ви хотіли, але боялися спитати.](Термінологія.md) 

# <a id="Статті"></a>Статті
## <a id="Початківцям"></a>Початківцям












|
|
|
|
|
|
|
|
|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[//]: # (Generated from ../selected/uk.tkabber.jabe.ru/index.php/Теорія/index.html)


# Теорія

Матеріал з Tkabber Wiki

## <a id="toc"></a>Зміст

* [1 Глосарій (словарій)](#Глосарій_словарій)
* [2 Статті](#Статті)
 * [2.1 Початківцям](#Початківцям)
  * [2.1.1 Про Ткаббер](#Про_Ткаббер)
  * [2.1.2 Швидкий старт (з купою скриншотів)](#Швидкий_старт_з_купою_скриншотів)
  * [2.1.3 Налаштування Ткаббера: базис та глибше](#Налаштування_Ткаббера_базис_та_глибше)
 * [2.2 Вмілим користувачам](#Вмілим_користувачам)
  * [2.2.1 Тонке налаштування](#Тонке_налаштування)
  * [2.2.2 Меню](#Меню)
  * [2.2.3 Налаштування](#Налаштування)
  * [2.2.4 Config.tcl з людським обличчям](#Config.tcl_з_людським_обличчям)
 * [2.3 Інші статті](#Інші_статті)

# <a id="Глосарій_словарій"></a>Глосарій (словарій)
[1001 невідоме слово з тих, що ви хотіли, але боялися спитати.](Термінологія.md) 

# <a id="Статті"></a>Статті
## <a id="Початківцям"></a>Початківцям

Changes to wiki/uk/Термінологія.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[//]: # (Generated from ../selected/uk.tkabber.jabe.ru/index.php/Термінологія/index.html)


# Термінологія

Матеріал з Tkabber Wiki

У цьому розділі ми спробуємо роз'ясняти деякі терміни, звичайні для одних і незрозумілі для інших. Пояснення будуть дані дуже коротенько — часу в нас не вагон. Коротка розшифровка, щоб можна було зрозуміти зміст статті, де зустрічається хитре слово, і посилання на джерело докладної інформації. 

## <a id="toc"></a>Зміст

* [1 Tkabber](#Tkabber)
   * [1.1 Токен (token)](#Токен_token)
* [2 Windows](#Windows)
* [3 Linux](#Linux)
* [4 Tcl/Tk](#Tcl_Tk)
* [5 Jabber](#Jabber)
   * [5.1 XML](#XML)
   * [5.2 Станца (stanza)](#Станца_stanza)
* [6 Різне](#Різне)
   * [6.1 Плагін (plugin)](#Плагін_plugin)
   * [6.2 Біндінги (bindings)](#Біндінги_bindings)
   * [6.3 Транк (trunk)](#Транк_trunk)
   * [6.4 Змінні оточення](#Змінні_оточення)

# <a id="Tkabber"></a>Tkabber
Тут ми будемо розглядати терміни, що відносяться (втім, дуже умовно) до Ткаббера. 

## <a id="Токен_token"></a>Токен (token)

Одне зі значень англійського слова [token](http://dictionary.reference.com/browse/token) — характерна особливість чи характеристика. У цьому значенні воно використовується для випадків ідентифікації, коли людина чи програма повинна упевнитися в особистості співрозмовника. Наприклад, [session token](http://en.wikipedia.org/wiki/Session_token) чи [security token](http://en.wikipedia.org/wiki/Security_token) (обидва посилання на англійську). Ще одне значення, цього разу граматичне — основна, найпростіша, неподільна лексична одиниця. У цьому випадку мова може йти про розбивку тексту на невеликі уривки чи навіть слова, щоб було зручніше їх аналізувати. Дивіться [приклад у Вікіпедії](http://en.wikipedia.org/wiki/Token_(parser)) (теж англійською). 












|




|
|

|
|
|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[//]: # (Generated from ../selected/uk.tkabber.jabe.ru/index.php/Термінологія/index.html)


# Термінологія

Матеріал з Tkabber Wiki

У цьому розділі ми спробуємо роз'ясняти деякі терміни, звичайні для одних і незрозумілі для інших. Пояснення будуть дані дуже коротенько — часу в нас не вагон. Коротка розшифровка, щоб можна було зрозуміти зміст статті, де зустрічається хитре слово, і посилання на джерело докладної інформації. 

## <a id="toc"></a>Зміст

* [1 Tkabber](#Tkabber)
 * [1.1 Токен (token)](#Токен_token)
* [2 Windows](#Windows)
* [3 Linux](#Linux)
* [4 Tcl/Tk](#Tcl_Tk)
* [5 Jabber](#Jabber)
 * [5.1 XML](#XML)
 * [5.2 Станца (stanza)](#Станца_stanza)
* [6 Різне](#Різне)
 * [6.1 Плагін (plugin)](#Плагін_plugin)
 * [6.2 Біндінги (bindings)](#Біндінги_bindings)
 * [6.3 Транк (trunk)](#Транк_trunk)
 * [6.4 Змінні оточення](#Змінні_оточення)

# <a id="Tkabber"></a>Tkabber
Тут ми будемо розглядати терміни, що відносяться (втім, дуже умовно) до Ткаббера. 

## <a id="Токен_token"></a>Токен (token)

Одне зі значень англійського слова [token](http://dictionary.reference.com/browse/token) — характерна особливість чи характеристика. У цьому значенні воно використовується для випадків ідентифікації, коли людина чи програма повинна упевнитися в особистості співрозмовника. Наприклад, [session token](http://en.wikipedia.org/wiki/Session_token) чи [security token](http://en.wikipedia.org/wiki/Security_token) (обидва посилання на англійську). Ще одне значення, цього разу граматичне — основна, найпростіша, неподільна лексична одиниця. У цьому випадку мова може йти про розбивку тексту на невеликі уривки чи навіть слова, щоб було зручніше їх аналізувати. Дивіться [приклад у Вікіпедії](http://en.wikipedia.org/wiki/Token_(parser)) (теж англійською). 

Changes to wiki/uk/Ткаббер_ЧЗП.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
[//]: # (Generated from ../selected/uk.tkabber.jabe.ru/index.php/Ткаббер_ЧЗП/index.html)


# Ткаббер ЧЗП

Матеріал з Tkabber Wiki

 Якщо проблема, що виникла у вас, тут не освітлена, заходите на `xmpp:tkabber@conference.jabber.ru` — поміркуємо разом, і якщо вирішимо — відповідь з'явиться або тут, або в одній зі статей цієї вікі. 

## <a id="toc"></a>Зміст

* [1 Що таке...?](#Що_таке...)
   * [1.1 Ростер](#Ростер)
   * [1.2 Ресурс](#Ресурс)
   * [1.3 Пріоритет](#Пріоритет)
   * [1.4 Консоль Ткаббера](#Консоль_Ткаббера)
* [2 Зовнішній вигляд і звук](#Зовнішній_вигляд_і_звук)
   * [2.1 Шрифти](#Шрифти)
   * [2.2 Не підключаються нові смайлики (звукові схеми)](#Не_підключаються_нові_смайлики_звукові_схеми)
   * [2.3 Як вставляти смайлики "з меню"?](#Як_вставляти_смайлики_з_меню)
   * [2.4 чи Можна смайлики **відключити**?](#чи_Можна_смайлики_відключити)
   * [2.5 Не бачу іконки/фото/і т.д. в PNG](#Не_бачу_іконки_фото_і_т.д._в_PNG)
   * [2.6 Колірні схеми](#Колірні_схеми)
   * [2.7 чи Підтримує Ткаббер аватари?](#чи_Підтримує_Ткаббер_аватари)
   * [2.8 Проблема зі звуковою схемою](#Проблема_зі_звуковою_схемою)
   * [2.9 Регулювання гучності звуку](#Регулювання_гучності_звуку)
* [3 Глюки, що виникають у процесі роботи](#Глюки_що_виникають_у_процесі_роботи)
   * [3.1 Довге завантаження Ткаббера](#Довге_завантаження_Ткаббера)
   * [3.2 Пересилання файлів](#Пересилання_файлів)
   * [3.3 Шифрування в Ткаббері: проблеми з **gpgme/tclgpgme**](#Шифрування_в_Ткаббері_проблеми_з_gpgme_tclgpgme)
   * [3.4 Проблема з новим релізом Ткаббера 0.9.9-1.2](#Проблема_з_новим_релізом_Ткаббера_0.9.9-1.2)
   * [3.5 Ткаббер під X Window падає при спробі показати "дивні" символи](#Ткаббер_під_X_Window_падає_при_спробі_показати_дивні_символи)
   * [3.6 Не працює вставка по Control-v під X Window](#Не_працює_вставка_по_Control-v_під_X_Window)
   * [3.7 Tkabber постійно тримає мене в стані "відійшов" ("away")](#Tkabber_постійно_тримає_мене_в_стані_відійшов_away)
   * [3.8 У старпаку/старкиті немає звуку](#У_старпаку_старкиті_немає_звуку)
   * [3.9 Пропадає вміст ростера](#Пропадає_вміст_ростера)
   * [3.10 Не можу приєднатися до сервера через проксі](#Не_можу_приєднатися_до_сервера_через_проксі)
* [4 А як мені зробити...?](#А_як_мені_зробити...)
   * [4.1 Відправлення повідомлень по Ctrl-Enter](#Відправлення_повідомлень_по_Ctrl-Enter)
   * [4.2 Чи можна додати в ростер самого себе?](#Чи_можна_додати_в_ростер_самого_себе)
   * [4.3 Одночасна робота з декількома аккаунтами](#Одночасна_робота_з_декількома_аккаунтами)
   * [4.4 Як щодо автозаходу на конференції?](#Як_щодо_автозаходу_на_конференції)
   * [4.5 Стискання трафіка в Ткаббері](#Стискання_трафіка_в_Ткаббері)
   * [4.6 Виділення тексту жирним, курсивом і підкресленням](#Виділення_тексту_жирним_курсивом_і_підкресленням)
   * [4.7 Уведення "хитрих" юнікодових символів](#Уведення_хитрих_юнікодових_символів)
   * [4.8 Ігнор — велика річ!](#Ігнор_-_велика_річ)
   * [4.9 Підтвердження](#Підтвердження)
   * [4.10 Віддалене керування](#Віддалене_керування)
   * [4.11 Команди Ткаббера](#Команди_Ткаббера)
   * [4.12 Приховування версій клієнта і OS](#Приховування_версій_клієнта_і_OS)
* [5 Різне](#Різне)
   * [5.1 ...а мені ГРАТИ хочеться!!!](#...а_мені_ГРАТИ_хочеться)
   * [5.2 Старі версії Ткаббера і плагинів](#Старі_версії_Ткаббера_і_плагинів)

# <a id="Що_таке..."></a>Що таке...?
## <a id="Ростер"></a>Ростер

Відповідь: Ростер (по-англійському roster) — це "Список контактів". У версіях Ткаббера починаючи з 0.9.8 термін "ростер" зник, чим спантеличив звиклих до англізованої назви ветеранів Jabber. 

## <a id="Ресурс"></a>Ресурс












|
|
|
|

|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|

|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
[//]: # (Generated from ../selected/uk.tkabber.jabe.ru/index.php/Ткаббер_ЧЗП/index.html)


# Ткаббер ЧЗП

Матеріал з Tkabber Wiki

 Якщо проблема, що виникла у вас, тут не освітлена, заходите на `xmpp:tkabber@conference.jabber.ru` — поміркуємо разом, і якщо вирішимо — відповідь з'явиться або тут, або в одній зі статей цієї вікі. 

## <a id="toc"></a>Зміст

* [1 Що таке...?](#Що_таке...)
 * [1.1 Ростер](#Ростер)
 * [1.2 Ресурс](#Ресурс)
 * [1.3 Пріоритет](#Пріоритет)
 * [1.4 Консоль Ткаббера](#Консоль_Ткаббера)
* [2 Зовнішній вигляд і звук](#Зовнішній_вигляд_і_звук)
 * [2.1 Шрифти](#Шрифти)
 * [2.2 Не підключаються нові смайлики (звукові схеми)](#Не_підключаються_нові_смайлики_звукові_схеми)
 * [2.3 Як вставляти смайлики "з меню"?](#Як_вставляти_смайлики_з_меню)
 * [2.4 чи Можна смайлики **відключити**?](#чи_Можна_смайлики_відключити)
 * [2.5 Не бачу іконки/фото/і т.д. в PNG](#Не_бачу_іконки_фото_і_т.д._в_PNG)
 * [2.6 Колірні схеми](#Колірні_схеми)
 * [2.7 чи Підтримує Ткаббер аватари?](#чи_Підтримує_Ткаббер_аватари)
 * [2.8 Проблема зі звуковою схемою](#Проблема_зі_звуковою_схемою)
 * [2.9 Регулювання гучності звуку](#Регулювання_гучності_звуку)
* [3 Глюки, що виникають у процесі роботи](#Глюки_що_виникають_у_процесі_роботи)
 * [3.1 Довге завантаження Ткаббера](#Довге_завантаження_Ткаббера)
 * [3.2 Пересилання файлів](#Пересилання_файлів)
 * [3.3 Шифрування в Ткаббері: проблеми з **gpgme/tclgpgme**](#Шифрування_в_Ткаббері_проблеми_з_gpgme_tclgpgme)
 * [3.4 Проблема з новим релізом Ткаббера 0.9.9-1.2](#Проблема_з_новим_релізом_Ткаббера_0.9.9-1.2)
 * [3.5 Ткаббер під X Window падає при спробі показати "дивні" символи](#Ткаббер_під_X_Window_падає_при_спробі_показати_дивні_символи)
 * [3.6 Не працює вставка по Control-v під X Window](#Не_працює_вставка_по_Control-v_під_X_Window)
 * [3.7 Tkabber постійно тримає мене в стані "відійшов" ("away")](#Tkabber_постійно_тримає_мене_в_стані_відійшов_away)
 * [3.8 У старпаку/старкиті немає звуку](#У_старпаку_старкиті_немає_звуку)
 * [3.9 Пропадає вміст ростера](#Пропадає_вміст_ростера)
 * [3.10 Не можу приєднатися до сервера через проксі](#Не_можу_приєднатися_до_сервера_через_проксі)
* [4 А як мені зробити...?](#А_як_мені_зробити...)
 * [4.1 Відправлення повідомлень по Ctrl-Enter](#Відправлення_повідомлень_по_Ctrl-Enter)
 * [4.2 Чи можна додати в ростер самого себе?](#Чи_можна_додати_в_ростер_самого_себе)
 * [4.3 Одночасна робота з декількома аккаунтами](#Одночасна_робота_з_декількома_аккаунтами)
 * [4.4 Як щодо автозаходу на конференції?](#Як_щодо_автозаходу_на_конференції)
 * [4.5 Стискання трафіка в Ткаббері](#Стискання_трафіка_в_Ткаббері)
 * [4.6 Виділення тексту жирним, курсивом і підкресленням](#Виділення_тексту_жирним_курсивом_і_підкресленням)
 * [4.7 Уведення "хитрих" юнікодових символів](#Уведення_хитрих_юнікодових_символів)
 * [4.8 Ігнор — велика річ!](#Ігнор_-_велика_річ)
 * [4.9 Підтвердження](#Підтвердження)
 * [4.10 Віддалене керування](#Віддалене_керування)
 * [4.11 Команди Ткаббера](#Команди_Ткаббера)
 * [4.12 Приховування версій клієнта і OS](#Приховування_версій_клієнта_і_OS)
* [5 Різне](#Різне)
 * [5.1 ...а мені ГРАТИ хочеться!!!](#...а_мені_ГРАТИ_хочеться)
 * [5.2 Старі версії Ткаббера і плагинів](#Старі_версії_Ткаббера_і_плагинів)

# <a id="Що_таке..."></a>Що таке...?
## <a id="Ростер"></a>Ростер

Відповідь: Ростер (по-англійському roster) — це "Список контактів". У версіях Ткаббера починаючи з 0.9.8 термін "ростер" зник, чим спантеличив звиклих до англізованої назви ветеранів Jabber. 

## <a id="Ресурс"></a>Ресурс