Видео смотреть бесплатно

Смотреть красивый видео

Официальный сайт graffitistudio 24/7/365

Смотреть видео бесплатно

18.11.10 20:22 dukeglukem

Мой рабочий стол.Минимализм, загубленный коньками

Решил поделиться своим рабочим столом, может кому что-то пригодится. Ранее частично выкладывал на русском форуме Ubuntu, но с тех пор кое-что поменялось.

Что имею:
Лаптоп HP ProBook 5310m (на обоине он же) с Ubuntu 10.10, Gnome 2.32.0
Тема GTK: Модифицированная старая human
Тема Metacity: Модифицированная mist
Значки: ubuntu-mono-dark
Шрифты: sans 8 (новый шрифт ubuntu не особо приглянулся)

Compiz не использую, композитинг в metacity тоже отключен. Поведение окон корректирует devilspie. При допиливании темы старался сделать все максимально компактным. Красная рамка для выделения активного окна, прозрачная Gnome-панель. В качестве эмулятора терминала - tilda (нет на скринах), иногда врубаю тайлинг в виде pytyle.

Рабочий стол с окнами:
окна

Голый рабочий стол с conky и стилизованной обоиной (магия GIMP):
коньки

Идея взята отсюда. Здесь, как обычно, отображаются различные системные датчики и графики. Также я добавил информацию из аудиоплеера audacious типа прогресса текущей песни и очереди воспроизведения, количество непрочитанных писем в GMail, непрочитанных сообщений в Google Reader и внешний IP адрес (на всякий случай).

Рабочий стол при отключенном conky (опять же GIMP):
без коньков

Тайлинг:
тайлинг


Как этого всего добиться? Если вам лень читать, то вконце есть ссылка на архив с нужным барахлом.
Все по порядку:

  1. Создаем в домашнем каталоге директорию .conky с файлом конфигурации conky:
    1
    2
    3
    4
    5
    cd ~
    mkdir .conky
    cd .conky
    touch 1366x768.conkyrc
    gedit 1366x768.conkyrc

    Содержимое 1366x768.conkyrc:
    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
    # -*- conf -*-
    #
    # ~/.conkyrc - Conky configuration file
    #
    # Author: Roman Krylov <[email protected]>
    # Original idea by Henrik Brix Andersen (http://blog.brixandersen.dk/?p=67)
    #
    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    # First run:
    # crontab -e
    # Then add a new cron task:
    # */3 * * * * /home/xxx/.conky/scripts/conky-helper
    # This will run every 3 minutes script for getting ip, count
    # of unread gmail messages and google reader feeds
    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    # do not fork to background
    background no

    # font settings
    use_xft yes
    font monospace-8
    uppercase no

    # update every 2 secs
    update_interval 2

    # stay running forever
    total_run_times 0

    # draw to root window
    own_window no

    # avoid flickering
    double_buffer yes

    # size
    minimum_size 1366 768
    maximum_width 1366

    # position
    alignment top_left
    gap_x 0
    gap_y 0

    # colors
    default_color white
    default_shade_color black
    default_outline_color black
    color1 33b0dc #light
    color2 207B9B #darker
    color3 144556 #dark
    color4 CA9529 #yellow
    color5 D93A36 #red

    # borders
    draw_borders no
    stippled_borders 8
    #border_margin 4
    border_width 1

    # shades
    draw_shades yes

    # outline
    draw_outline no

    # spacer
    use_spacer none

    # buffers
    no_buffers yes

    # sampling
    cpu_avg_samples 2
    net_avg_samples 2

    # bar size
    default_bar_size 130 6


    # configuration
    TEXT
    ${voffset 60}${offset 430}${color1}LED
    ${offset 430}$color3 Brightness: $color1${exec cat /proc/acpi/video/GFX0/DD02/brightness | grep current | cut -d" " -f2}%

    ${offset 950}${color1}Network (wlan0)
    ${offset 950}$color3 ESSID: ${color1}${wireless_essid wlan0} ${if_match "${wireless_essid wlan0}" != "off/any"}(${wireless_bitrate wlan0}) ${color3}Signal: ${color1}${wireless_link_qual_perc wlan0}%${endif}
    ${offset 950}$color3 IPv4: $color1${addr wlan0}
    ${offset 950}$color3 Download: $color1${downspeed wlan0}
    ${voffset -13}${offset 1090}${color3}Total: ${color1}${totaldown wlan0}
    ${offset 950}$color3 Upload: $color1${upspeed wlan0}
    ${voffset -13}${offset 1090}${color3}Total: ${color1}${totalup wlan0}
    ${offset 950}$color3 ${downspeedgraph wlan0 12,250 000000 33b0dc}
    ${offset 950}$color3 ${upspeedgraph wlan0 12,250 000000 33b0dc}

    ${voffset 20}${offset 90}${color1}CPU
    ${offset 90}$color3 Frequency: $color1${freq} MHz
    ${voffset -13}${offset 216}$color3 Temperature:$color1 $acpitemp C
    ${offset 90}$color3 Core 1 Load: $color1${cpu cpu0}%
    ${voffset -13}${offset 216}${if_match ${cpu cpu0} >= 50}${color4}${endif}${if_match ${cpu cpu0} >= 80}${color5}${endif}${cpubar cpu0 6,130}
    ${offset 90}$color3 Core 2 Load: $color1${cpu cpu1}%
    ${voffset -13}${offset 216}${if_match ${cpu cpu1} >= 50}${color4}${endif}${if_match ${cpu cpu1} >= 80}${color5}${endif}${cpubar cpu1 6,130}
    ${offset 90}$color3 ${cpugraph cpu0 12,250 000000 33b0dc}
    ${offset 90}$color3 ${cpugraph cpu1 12,250 000000 33b0dc}
    ${offset 90}$color3 Top CPU:
    ${voffset -13}${offset 216}${color1}${top name 1}
    ${voffset -13}${offset 305}${top cpu 1}%
    ${offset 216}${color2}${top name 2}
    ${voffset -13}${offset 305}${top cpu 2}%
    ${offset 216}${color3}${top name 3}
    ${voffset -13}${offset 305}${top cpu 3}%

    ${voffset 20}${offset 1100}${color1}System
    ${offset 1100} ${color3}IP: ${color1}${execi 30 cat /tmp/conky-ip}
    ${voffset -13}${offset 1226}${color3}Mail: ${color1}${execi 30 cat /tmp/conky-mail}   ${color3}RSS: ${color1}${execi 30 cat /tmp/conky-rss}
    ${offset 1100}$color3 Uptime:$color1 $uptime
    ${voffset -13}${offset 1226}${color3}Load: ${color1}$loadavg

    ${voffset 10}${offset 40}${color1}Power
    ${offset 40}$color3 Status: $color1$acpiacadapter
    ${offset 40}$color3 Battery: $color1$battery $battery_time
    ${offset 89} ${if_match ${battery_percent} <= 50}${color4}${endif}${if_match ${battery_percent} <= 20}${color5}${endif} ${battery_bar BAT0}

    ${voffset 6}${offset 1080}${color1}Disk
    ${offset 1080}$color3 I/O:$color1 $diskio
    ${offset 1080}$color3 ${diskiograph 24,250 000000 33b0dc}

    ${voffset 60}${offset 120}${color1}Network (eth0)
    ${offset 120}$color3 IPv4: $color1${addr eth0}
    ${offset 120}$color3 Download: $color1${downspeed eth0}
    ${voffset -13}${offset 260}${color3}Total: ${color1}${totaldown eth0}
    ${offset 120}$color3 Upload: $color1${upspeed eth0}
    ${voffset -13}${offset 260}${color3}Total: ${color1}${totalup eth0}
    ${offset 120}$color3 ${downspeedgraph eth0 12,250 000000 33b0dc}
    ${offset 120}$color3 ${upspeedgraph eth0 12,250 000000 33b0dc}

    ${voffset -20}${offset 600}${color1}Memory
    ${offset 600}$color3 RAM: $color1$mem ($memperc%)
    ${voffset -13}${offset 726}${membar 6,130}
    ${offset 600}$color3 Swap: $color1$swap ($swapperc%)
    ${voffset -13}${offset 726}${swapbar 6,130}

    ${voffset -120}${offset 950}${color1}Sound
    #${mixer}%
    #${exec amixer get Master | grep "Mono: Playback" | cut -d [ -f 2 | cut -d % -f 1}%
    ${offset 950} ${color3}Volume: ${color1}${exec amixer get Master | awk -F'[]%[]' '/%/ {if ($7 == "off") { print $2"% [muted]" } else { print $2"
    %" }}'}
    #Audacious2 info
    ${if_running audacious2}${offset 950} ${color3}Now playing: ${color1}${exec audtool2 --current-song}
    ${offset 950} ${color3}Progress: ${color1}${exec audtool2 --current-song-output-length}/${exec audtool2 --current-song-length}  ${color1}${execbar expr 100 \* $(audtool2 --current-song-output-length-seconds) \/ $(audtool2 --current-song-length-seconds)}
    ${offset 1074}${if_match "${exec audtool2 --playback-status}"
    != "playing"} [${exec audtool2 --playback-status}]${endif}
    ${if_match "${exec audtool2 --playqueue-get-list-position 1}" != ""}${offset 950} ${color3}Queued:
    ${voffset -13}${offset 1034}${color1}${exec audtool2 --playlist-song $(audtool2 --playqueue-get-list-position 1)}
    ${if_match "${exec audtool2 --playqueue-get-list-position 2}"
    != ""}
    ${voffset -13}${offset 1034}${color2}${exec audtool2 --playlist-song $(audtool2 --playqueue-get-list-position 2)}
    ${if_match "${exec audtool2 --playqueue-get-list-position 3}" != ""}
    ${voffset -13}${offset 1034}${color3}${exec audtool2 --playlist-song $(audtool2 --playqueue-get-list-position 3)}${endif}${endif}${endif}

    #DeaDBeef info #FIXME: Not finished
    ${else}${if_running deadbeef-main}${offset 950} ${color3}Now playing: ${color1}${exec deadbeef --nowplaying "%a - %t"}
    ${offset 950} ${color3}Progress: ${color1}${exec deadbeef --nowplaying "%e/%l"}
    #No player running
    ${else}${offset 950} ${color3}Now playing: ${color1}No song playing${endif}${endif}

    Конфигурация conky создана для разрешения 1366x768, так что учтите.
  2. Далее создаем директорию wallpapers, куда закинем обоины:
    1
    2
    3
    4
    mkdir wallpapers
    cd wallpapers
    wget http://dl.dropbox.com/u/960078/conky/1366x768-on.png
    wget http://dl.dropbox.com/u/960078/conky/1366x768-off.png

  3. Теперь скрипты. Создаем директорию scripts, а в ней скрипт для запуска conky:
    1
    2
    3
    4
    5
    cd ..
    mkdir scripts
    cd scripts
    touch conky-start
    gedit conky-start

    Содержимое conky-start:
    1
    2
    3
    4
    5
    #!/bin/bash
    gconftool-2 -t string -s /desktop/gnome/background/picture_filename ~/.conky/wallpapers/1366x768-on.png
    sleep 2
    conky -c ~/.conky/1366x768.conkyrc
    gconftool-2 -t string -s /desktop/gnome/background/picture_filename ~/.conky/wallpapers/1366x768-off.png

    Скрипт устанавливает нужную нам обоину и запускает conky с нашим конфигом. После того, как процесс conky завершится (например, через killall conky), обоина поменяется на другую.
  4. Скрипт для получения количества непрочитанных сообщений в GMail (найден в сети). Вписываем свои данные вместо USERNAME и PASSWORD.
    1
    2
    touch gmail.py
    gedit gmail.py

    Содержимое gmail.py:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    import os
    import string

    #Enter your username and password below within double quotes
    # eg. username="username" and password="password"
    username="USERNAME"
    password="PASSWORD"

    com="wget -O - https://"+username+":"+password+"@mail.google.com/mail/feed/atom --no-check-certificate"

    temp=os.popen(com)
    msg=temp.read()
    index=string.find(msg,"<fullcount>")
    index2=string.find(msg,"</fullcount>")
    fc=int(msg[index+11:index2])

    if fc==0:
       print "0"
    else:
       print str(fc)

  5. Скрипт для получения количества непрочитанных сообщений в Google Reader (взято отсюда).
    1
    2
    touch conkyGoogleReader.py
    gedit conkyGoogleReader.py

    Содержимое conkyGoogleReader.py:
    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    ###############################################################################
    # conkyEmail.py is a simple python script to gather
    # details of google reader subscriptions for use in conky.
    #
    #  Author: Kaivalagi
    # Created: 09/07/2008
    #
    #    18/05/2009    Updated to expand ~ based template paths
    #    14/12/2009    Updated to work with new authentication requirements, old method stopped working for some reason
    from datetime import datetime
    from optparse import OptionParser
    from xml.dom import minidom
    import codecs
    import socket
    import sys
    import traceback
    import urllib
    import urllib2
    import os

    class CommandLineParser:

        parser = None

        def __init__(self):

            self.parser = OptionParser()
            self.parser.add_option("-u","--username",dest="username", type="string", metavar="USERNAME", help=u"username to login with")
            self.parser.add_option("-p","--password",dest="password", type="string", metavar="PASSWORD", help=u"Password to login with")
            self.parser.add_option("-t","--template",dest="template", type="string", metavar="FILE", help=u"Template file determining the format for each rss feed summary. Use the following placeholders: [unreadcount], [name], [url]")
            self.parser.add_option("-s","--summarytemplate",dest="summarytemplate", type="string", metavar="FILE", help=u"Template file determining the format for summary output. Use the following placeholders: [totalfeedscount], [unreadfeedscount], [unreadfeeditemscount]")
            self.parser.add_option("-S","--summaryoutput",dest="summaryoutput", default=False, action="store_true", help=u"Request summary output rather than each feeds details")
            self.parser.add_option("-c","--connectiontimeout",dest="connectiontimeout", type="int", default=10, metavar="NUMBER", help=u"[default: %default] Define the number of seconds before a connection timeout can occur.")
            self.parser.add_option("-v","--verbose",dest="verbose", default=False, action="store_true", help=u"Request verbose output, no a good idea when running through conky!")
            self.parser.add_option("-V", "--version", dest="version", default=False, action="store_true", help=u"Displays the version of the script.")
            self.parser.add_option("--errorlogfile", dest="errorlogfile", type="string", metavar="FILE", help=u"If a filepath is set, the script appends errors to the filepath.")
            self.parser.add_option("--infologfile", dest="infologfile", type="string", metavar="FILE", help=u"If a filepath is set, the script appends info to the filepath.")                

        def parse_args(self):
            (options, args) = self.parser.parse_args()
            return (options, args)

        def print_help(self):
            return self.parser.print_help()

    class FeedData:
        def __init__(self, name, url, unreadcount):
            self.name = name
            self.url = url
            self.unreadcount = unreadcount

        def __cmp__(self, other):
            return cmp(int(other.unreadcount),int(self.unreadcount))
       
        def __str__(self):
            return str(self.name + " - " + self.unreadcount)
           
    class GoogleReader:

        def __init__(self,options):

            try:
               
                self.options = options
               
                self.logInfo("Initialising google reader...")
               
                socket.setdefaulttimeout(self.options.connectiontimeout)

            except Exception,e:
                self.logError("GoogleReader Initialisation:Unexpected error:" + e.__str__()+traceback.format_exc())
               
        def writeOutput(self):
           
            auth_header = self.getAuthorizationHeader()
           
            if auth_header != None:
               
                self.logInfo("Processing output...")
               
                if self.options.template == None:              
                    # create default template
                    template = "[unreadcount] [name] - [url]\n"
                else:
                    # load the template file contents
                    try:
                        #fileinput = open(self.options.template)
                        fileinput = codecs.open(os.path.expanduser(self.options.template), encoding='utf-8')
                        template = fileinput.read()
                        fileinput.close()
                        # lose the final "\n" which should always be there...
                        template = template[0:len(template)-1]
                    except:
                        self.logError("Template file no found!")
                        sys.exit(2)

                if self.options.summarytemplate == None:              
                    # create default template
                    summarytemplate = "[unreadfeeditemscount] unread feed items, [unreadfeedscount]/[totalfeedscount] feeds have unread content.\n"
                else:
                    # load the template file contents
                    try:
                        #fileinput = open(self.options.template)
                        fileinput = codecs.open(os.path.expanduser(self.options.summarytemplate), encoding='utf-8')
                        template = fileinput.read()
                        fileinput.close()
                        # lose the final "\n" which should always be there...
                        summarytemplate = summarytemplate[0:len(summarytemplate)-1]
                    except:
                        self.logError("Template file no found!")
                        sys.exit(2)
                                                       
                totalfeedscount, unreadfeedscount, unreadfeeditemscount, feeds = self.getUnreadItems(auth_header)

                output = ""
                if self.options.summaryoutput == True:
                    output = self.getOutputFromSummaryTemplate(summarytemplate, totalfeedscount, unreadfeedscount, unreadfeeditemscount)
                else:
                    for feeddata in feeds:
                        output = output + self.getOutputFromTemplate(template, feeddata.unreadcount, feeddata.name, feeddata.url)

                print output.encode("utf-8")

        def getOutputFromTemplate(self, template, unreadcount, name, url):
           
            try:
               
                output = template
       
                output = output.replace("[unreadcount]",unreadcount)
                output = output.replace("[name]",name)
                output = output.replace("[url]",url)

                return output
           
            except Exception,e:
                self.logError("getOutputFromTemplate:Unexpected error:" + e.__str__())
                return ""

        def getOutputFromSummaryTemplate(self, summarytemplate, totalfeedscount, unreadfeedscount, unreadfeeditemscount):
           
            try:
               
                output = summarytemplate
       
                output = output.replace("[totalfeedscount]",totalfeedscount)
                output = output.replace("[unreadfeedscount]",unreadfeedscount)
                output = output.replace("[unreadfeeditemscount]",unreadfeeditemscount)
               

                return output
           
            except Exception,e:
                self.logError("getOutputFromSummaryTemplate:Unexpected error:" + e.__str__())
                return ""
           
        def getAuthorizationHeader(self):
           
            # Authenticate to obtain SID
            auth_url = 'https://www.google.com/accounts/ClientLogin'
            auth_req_data = urllib.urlencode({'Email': self.options.username,
                                              'Passwd': self.options.password,
                                              'service': 'reader'})
            auth_req = urllib2.Request(auth_url, data=auth_req_data)
            auth_resp = urllib2.urlopen(auth_req)
            auth_resp_content = auth_resp.read()
            auth_resp_dict = dict(x.split('=') for x in auth_resp_content.split('\n') if x)
            AUTH = auth_resp_dict["Auth"]
           
            # Create a header using the AUTH key
            header = {"Authorization" : "GoogleLogin auth=%s"%AUTH}
           
            return header
           
        def getUnreadItems(self, auth_header):
                   
            url = "https://www.google.com/reader/api/0/unread-count?all=true"
            request = urllib2.Request(url, None, auth_header)
            response = urllib2.urlopen(request)
            unreadxml = response.read()

            url = "https://www.google.com/reader/api/0/subscription/list"
            request = urllib2.Request(url, None, auth_header)
            response = urllib2.urlopen(request)
            namesxml = response.read()
                       
            if '<object>' in unreadxml:
                feedlist = minidom.parseString(unreadxml).getElementsByTagName('string')
                namelist = minidom.parseString(namesxml).getElementsByTagName('string')

                feeds = []
                unreadcount = 0
                unreadfeedcount = 0
                unreadfeeditemscount = 0
               
                for nodeFeed in feedlist:
                   
                    feedurl = nodeFeed.firstChild.toxml()          
                       
                    # ignore user/ based nodes, only concerned with feed/ based nodes
                    if feedurl.startswith("feed/") == True:
                       
                        unreadcount = nodeFeed.nextSibling.firstChild.toxml()
                       
                        for nodeName in namelist:
                            nodeText = nodeName.firstChild.toxml()
                            if nodeText.startswith("feed/"):
                                if nodeText == feedurl:
                                    feedname = nodeName.nextSibling.firstChild.toxml()
                                    break
                                   
                        feedurl = feedurl.lstrip("feed/")
                       
                        #feeds.append((unreadcount , feedurl, feedname))
                        feedData = FeedData(feedname, feedurl, unreadcount)
                        feeds.append(feedData)
                       
                        unreadfeeditemscount = unreadfeeditemscount + int(unreadcount)
                        unreadfeedcount = unreadfeedcount + 1
                    else:
                        pass #invalid feedurl?
               
                totalfeedcount = len(namelist)
               
                feeds.sort()
                return str(totalfeedcount), str(unreadfeedcount), str(unreadfeeditemscount), feeds
            else:
                return 0        

        def logInfo(self, text):
            if self.options.verbose == True:
                print >> sys.stdout, "INFO: " + text

            if self.options.infologfile != None:
                datetimestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                fileoutput = open(self.options.infologfile, "ab")
                fileoutput.write(datetimestamp+" INFO: "+text+"\n")
                fileoutput.close()
               
        def logError(self, text):
            print >> sys.stderr, "ERROR: " + text
           
            if self.options.errorlogfile != None:
                datetimestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                fileoutput = open(self.options.errorlogfile, "ab")
                fileoutput.write(datetimestamp+" ERROR: "+text+"\n")
                fileoutput.close()
                           
    def main():

        parser = CommandLineParser()
        (options, args) = parser.parse_args()

        if options.version == True:
           
            print >> sys.stdout,"conkyGoogleReader v.1.05"
           
        else:
           
            if options.username == None or options.password == None:
                print >> sys.stdout, "A username and/or password was not given!"
                sys.exit(2)
                       
            if options.verbose == True:
                print >> sys.stdout, "username:",options.username
                print >> sys.stdout, "password:",options.password
                print >> sys.stdout, "template:",options.template
                print >> sys.stdout, "summarytemplate:",options.summarytemplate
                print >> sys.stdout, "summaryoutput:",options.summaryoutput
                print >> sys.stdout, "verbose:",options.verbose
       
            # create new google reader object
            greader = GoogleReader(options)
            greader.writeOutput()

    if __name__ == '__main__':
        main()
        sys.exit()

  6. Следующий скрипт нужен для вызова предыдущих двух скриптов и получения ip-адреса.
    1
    2
    touch conky-helper
    gedit conky-helper

    Содержимое conky-helper:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/bin/bash

    if [ "$(pidof conky)" ] ; then # Check if conky is running
            echo "conky is running, getting information..."
            cd /home/USER/.conky/scripts/
            # Gmail unread messages
            python ./gmail.py > /tmp/conky-mail
            # Google reader feeds
            python ./conkyGoogleReader.py --username=USERNAME@gmail.com --password=PASSWORD -S | head -n 1 | sed 's/\([0-9]*\).*/\1/' > /tmp/conky-rss
            # IP-address
            #wget --quiet -O - http://whatismyip.org/ | head -n 1
            #wget --quiet -O - http://www.biranchi.com/ip.php | head -n 1
            IP=$(wget --quiet -O - http://checkip.dyndns.org/ | sed -e 's/[^:]*: //' -e 's/<.*$//'); if [ -z $IP ]; then echo "Offline" > /tmp/conky-ip; else echo $IP > /tmp/conky-ip; fi;
            echo "done"
    else
            echo "conky is not running, exiting..."
    fi

    Тут мы проверяем, запущен ли процесс conky, и если да, то вытягиваем нужную нам информацию из сети и записываем в /tmp, откуда conky ее будет считывать. Этот скрипт будет вызываться планировщиком заданий cron, об этом чуть ниже. Почему не вызывать эти скрипты напрямую из конфига conky? Потому что в момент загрузки этой самой информации conky может зависнуть на некоторое время, особенно если сеть загружена торрентами. Не забываем менять USER на имя своего пользователя, USERNAME и PASSWORD на соответствующие значения для аккаунта в Google.
  7. Теперь делаем все скрипты исполняемыми:
    chmod +x *

  8. Добавляем новое задание в планировщик заданий cron:
    crontab -e

    Вписываем в самый низ новую строчку, поменяв USER на имя домашнего каталога:
    */3 * * * * /home/USER/.conky/scripts/conky-helper

    Благодаря этому заданию каждые 3 минуты будет запускаться ранее созданный скрипт conky-helper.
  9. Также есть смысл скопировать скрипт запуска conky в /usr/bin, чтобы легко можно было запускать его по Alt-F2
    sudo cp conky-start /usr/bin/

  10. И напоследок добавлю маленький скриптик, который может оказаться полезным.
    1
    2
    3
    4
    cd /usr/bin
    sudo touch noconky
    sudo chmod +x noconky
    sudo gedit noconky

    Содержимое noconky:
    1
    2
    #!/bin/bash
    killall conky & $@; conky-start

    Что он делает? Благодаря этому скрипту можно запустить приложение, на время работы которого отключается conky, а после закрытия приложения conky снова запускается. Пример запуска:
    noconky teeworlds

    А то мало ли conky будет тормозить ваши игры.

Ругайте, спрашивайте.

Тема gtk+metacity
Обоина со включенным conky
Обоина без conky
Conky (конфиг, обои, скрипты)



Daria 18.11.10 20:31 # +6
уважение тебе, за то, что нашёл в себе силу заняться коньками, но, если честно, я не хотела бы себе подобного десктопа.
dukeglukem 18.11.10 20:33 # +2
Я тоже пару лет хорошо обходился без коньков и прочих приблуд, потом решил сотворить что-то красивое.
dlis 18.11.10 21:41 # +1
Приятно видеть, что ты свою цель достиг, а не бросил на пол-пути! Молодец!
dlis 18.11.10 21:47 # +3
Хотелось бы озвучить свою мысль по поводу оформления статьи. Думаю, что последовательность действий лучше разделять на шаги при помощи нумерованного списка — будет легче читаться (ведь когда переключаешь окошки, теряешь зрительно позицию в тексте).

P.S. Но это лишь мое мнение. Причем, сказанное лишь из лучших побуждений =)
dukeglukem 18.11.10 23:16 # +1
Спасибо за замечание. Поправил.
dr_magnus 18.11.10 20:40 # +5
а этот странный красно-оранжевый цвет тебе на глаза не давит?
dukeglukem 18.11.10 20:54 # +0
Он для того и сделан красным, чтобы на глаза давить. Чтобы сразу было видно, какое окно активно.
dr_magnus 18.11.10 20:44 # +2
"голый рабочий стол" конечно прикольный получился, но, имхо, не рациональный. сворачивать все окна, что бы глянуть на показания датчиков как-то грустно.
подкидываю идейку - сделай миниатюру этого ноута, и настрой коньки таким образом, что бы они показывали данные при наведении мыши на соответствующие места. правда я не знаю, позволяют это коньки или нет - не работал с ними всерьез.
dukeglukem 18.11.10 20:56 # +2
Идея интересная, но пропадает смысл самих коньков, когда все нужное перед глазами.
mwChief 18.11.10 22:20 # +1
А разве в коньках есть смысл?
dlis 18.11.10 21:38 # +2
Кстати, необязательно все сворачивать. Вместо этого я просто перехожу на пустой рабочий стол (ctrl + alt + »).
strk 19.11.10 09:43 # +-1
+F2
sakal 18.11.10 22:35 # +1
сворачивать все окна, как и приводить к прежнему состоянию, можно сочетанием клавиш, например как это принято в Windows. У себя в KDE для KWin действия Show Desktop установил сочетание win+d - при первом нажатии наблюдаем рабочий стол, при повторном - прежнее состояние окон.
dlis 18.11.10 22:45 # +0
Согласен. Как вариант — ctrl + alt + D (в Gnome)
Uzix 18.11.10 21:00 # +0
Коньки, скринлеты, плазмоиды, сайдбары... Мне одному достаточно функционала апплетов панели? :)
strk 19.11.10 09:44 # +0
многим достаточно функционала консоли.
Я тож не нашёл для себя применения коньков.
ZED 18.11.10 21:44 # +5
В данном случае я наблюдаю сильный занос в минимализм и стилистику в ущерб эргономике. У меня схема примерно такая:
1) на панели гнома, которая всегда наверху и перед глазами только то что надо контролировать/видеть постоянно, у меня это загрузка проца, сетевая активность и активность дисков, плюс погода
2) в коньках более подробные данные по процу, памяти, видео, упсу, дискам и погоде. идея именно в том, чтобы к конькам обращаться время от времени, быстро и легко. через компиз настроил сворачивание окон на границе экрана. таким образом я трачу минимум времени на доступ к информации не прибегая к терминалу
3) ну и для детального разбора возникающих вопросов и проблем есть терминал Guake и руки

Плюсы такого распределения инфы в том, что
1) чем важнее для меня инфа, тем быстрее я могу ее увидеть
2) нужные индикаторы занимают примерно 20% длины панели гнома, коньки - примерно 15% рабочего стола (колонка у правой границы)
3) коньки сгруппированы в колонку, что позволяет использовать окна нужных приложений с максимальным размером и на максимальной области рабочего стола и при этом видеть коньки постоянно (при возникновении такой необходимости)
4) группирует взгляд в одной области, что упрощает оценку данных вместо того чтобы обходить взглядом весь экран

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

Вывод:
1) компизом пренебрегают, считая его свисто-перделкой, забывая о том, что он сильно поднимает и эргономику/юзабилити
2) все считают, что знают что такое здоровый минимализм, но никто его до сих пор не достиг
3) минимализм, убивающий юзабилити, это путь в УГ, ШГ и П

Рекомендации:
1) поставьте хакинтош, узнаете много нового
2) поставьте компиз хотя бы посмотреть эффект от отдельных, наиболее полезных плагинов, некоторый функционал компиза в отдельных легких DE говорят можно и руками доделать
3) освойте теорию цвета, почитать примерно на эту тему можно тут: http://www.aquarun.ru/psih/ct/ctpril2.html
4) гляньте тайловые DE, может вам понравится
exelens 18.11.10 22:19 # +1
Покажи скрин своего десктопа и коньки
dukeglukem 18.11.10 22:58 # +0
Считаю затемнение неактивных окон злой фичей. Иногда надо работать сразу с несколькими окнами.
Насчет низкой эргономики коньков не спорю, раньше обходился апплетами на панели. Как говорится, красота требует жертв.
С компизом особо не знаком, может как-нибудь посмотрю его функционал.
А за теорию цвета спасибо, почитаю.
На тайловые DE иногда заглядываюсь, но постоянно пользоваться тайлингом с таким разрешением экрана сложновато, и времени на освоение пока не найти. Прикупил себе монитор 24" недавно, специально чтобы подключать к лаптопу, может в ближайшем будущем приживется какой-нибудь xmonad.
Shtsh 19.11.10 00:17 # +1
Попробуй awesome — он динамический, то есть можно использовать как тайлинг, так и плавающие окна. К тому же есть такая штука, как теги — тебе же не нужно, как правило, чтобы все окна одновременно на экране показывались.
razum2um 19.11.10 15:05 # +0
а я с начала и подумал, что у него эйвсом.
заталено, одна узкая панелька сверху, шрифты в панельки (у меня) также точно.
...еще подумал, нафига только 4 тега...
ZED 19.11.10 07:47 # +0
Считаю затемнение неактивных окон злой фичей. Иногда надо работать сразу с несколькими окнами

Вот поэтому у меня затеняется только 5-е по счету окно. Там много настроек.
strk 19.11.10 09:46 # +0
Затемнение же с лёгкостью можон в[ы]ключать по хоткею. Плюс какие-то отдельные приложения (Гимп, например) можно прописать в исключения.
thoughtful_fox 18.11.10 22:48 # +0
Неплохо)

Почти оффтоп: мне вот guake нравится гораздо больше тильды
vkotovv 18.11.10 23:28 # +0

1 touch [file]
2 gedit [file]

А зачем здесь нужна первая команда?
dukeglukem 18.11.10 23:34 # +-4
Согласен, не обязательна. Но пусть новички знают, как файлы создаются. А не новички сразу скачают архив с нужными скриптами, кому что надо.
doraneko 19.11.10 00:04 # +4
разве ж это минимализм... :3
dukeglukem 19.11.10 00:55 # +0
Я верю, что при отключенных коньках мой рабочей стол будет намного минималистичнее основной массы скринов рабочих столов, выкладываемых другими пользователями. Одна панель, никаких доков и скринлетов, которые многие так любят.
ZogG 19.11.10 01:32 # +4
меньше других != минимализм, ты просто убрал нижнюю панель от стандартной бубунты.
saver 19.11.10 06:10 # +2
И не пахнет тут минимализмом, +1

Посты Комментарии
Последние посты
    Посты Комментарии
    Последние комментарии
      Посты Комментарии
      Изменения
        Посты Комментарии Изменения Черновики Избранное
        Черновики (все)
          Посты Комментарии Изменения Черновики Избранное
          Избранное (всё)
            Посты Комментарии Изменения Черновики Избранное
            Лучшие блоги (все 149)
            Топ пользователей Топ блогов
            Топ пользователей Топ блогов
            Элита (все 2979 из 222 городов)
            Топ пользователей Топ блогов
            welinux.ru

            Смотреть видео онлайн

            Онлайн видео бесплатно


            Смотреть русское с разговорами видео

            Online video HD

            Видео скачать на телефон

            Русские фильмы бесплатно

            Full HD video online

            Смотреть видео онлайн

            Смотреть HD видео бесплатно

            School смотреть онлайн