Monday, January 7, 2013

change html code highlighter for my blog

原本拿來在 blog 貼 code 的 syntax highlighter http://tohtml.com/ 好像爛掉了...

目前用這個當作替代品,配色可能會有點不習慣,抱歉 <(_ _)>

http://markup.su/highlighter/

update to awesome 3.5

最近 awesome 大改,不過前一陣子有點忙,一直沒有把它升上去

昨天有空 pacman -Syu 然後 reboot 後我的 rc.lua 就爆炸了 XDrz

(其實我幾乎每天都會 Syu 一下,只是不常 reboot)

今天稍微看了一下 release log 就順手改了一下,目前正常工作中 :D

http://awesome.naquadah.org/wiki/Awesome_3.4_to_3.5



簡結一下 3.5 的亮點

LGI (Lua GObject Introspection)

https://github.com/pavouk/lgi dynamic Lua binding to GObject based libraries.

Lua 5.2 Compatibility



設定檔語法部份比較麻煩的地方主要有兩個

Signals
    add_signal => connect_signal
    remove_signal => disconnect_signal.

Widget Library

    textbox Migrated to wibox.widget.textbox()
    imagebox Migrated to wibox.widget.imagebox()
    systray Migrated to wibox.widget.systray()


My rc.lua

https://github.com/xatier/rc-files/blob/master/rc.lua

-- Standard awesome library
local gears = require("gears")
local awful = require("awful")
awful.rules = require("awful.rules")
require("awful.autofocus")
-- Widget and layout library
local wibox = require("wibox")
-- Theme handling library
local beautiful = require("beautiful")
-- Notification library
local naughty = require("naughty")
local menubar = require("menubar")

-- vicious widgets library
local vicious = require("vicious")


-- {{{ Error handling
-- Check if awesome encountered an error during startup and fell back to
-- another config (This code will only ever execute for the fallback config)
if awesome.startup_errors then
    naughty.notify({ preset = naughty.config.presets.critical,
                     title = "Oops, there were errors during startup!",
                     text = awesome.startup_errors })
end

-- Handle runtime errors after startup
do
    local in_error = false
    awesome.connect_signal("debug::error", function (err)
        -- Make sure we don't go into an endless error loop
        if in_error then return end
        in_error = true

        naughty.notify({ preset = naughty.config.presets.critical,
                         title = "Oops, an error happened!",
                         text = err })
        in_error = false
    end)
end
-- }}}

-- {{{ Variable definitions
-- Themes define colours, icons, and wallpapers
beautiful.init("/home/xatierlike/.config/awesome/themes/default/theme.lua")

-- default terminal and editor
terminal = "urxvt"
editor = os.getenv("EDITOR") or "vim"
editor_cmd = terminal .. " -e " .. editor
-- modkey
modkey = "Mod4"





-- Table of layouts to cover with awful.layout.inc, order matters.
local layouts =
{
    -- delete useless layouts
    awful.layout.suit.tile,               -- 1 (tile.right)
    awful.layout.suit.tile.left,          -- 2
    awful.layout.suit.tile.bottom,        -- 3
    -- awful.layout.suit.tile.top,           -- 
    -- awful.layout.suit.fair,               -- 
    -- awful.layout.suit.fair.horizontal,    -- 
    -- awful.layout.suit.spiral,             -- 
    -- awful.layout.suit.spiral.dwindle,     -- 
    awful.layout.suit.max,                -- 4
    -- awful.layout.suit.max.fullscreen,     --
    -- awful.layout.suit.magnifier,          --
    awful.layout.suit.floating            -- 5
}
-- }}}

-- {{{ Wallpaper
beautiful.wallpaper = "/home/xatierlike/Pictures/goodbye.jpg"
if beautiful.wallpaper then
    for s = 1, screen.count() do
        gears.wallpaper.maximized(beautiful.wallpaper, s, true)
    end
end
-- }}}

-- {{{ Tags
-- Each screen has its own tag table.
tags = {}
for s = 1, screen.count() do
    tags[s] = awful.tag(
        {"⌨", "☠", "☢", "☣", "☮", "✈", "✍", "♺", "(._.?)"},
        s,
        { layouts[2], layouts[2], layouts[2],
          layouts[2], layouts[2], layouts[2],
          layouts[5], layouts[5], layouts[2]
        }
    )
end

-- }}}

-- {{{ Menu
-- Create a laucher widget and a main menu
myawesomemenu = {
   { "manual", terminal .. " -e man awesome" },
   { "edit config", editor_cmd .. " " .. awesome.conffile },
   { "restart", awesome.restart },
   { "quit", awesome.quit }
}

mymainmenu = awful.menu({ items = { { "awesome", myawesomemenu, beautiful.awesome_icon },
                                    { "open terminal", terminal }
                                  }
                        })

mylauncher = awful.widget.launcher({ image = beautiful.awesome_icon,
                                     menu = mymainmenu })

-- Menubar configuration
menubar.utils.terminal = terminal -- Set the terminal for applications that require it
-- }}}

-- {{{ Wibox

-- network usage
netwidget = wibox.widget.textbox()
vicious.register(netwidget, vicious.widgets.net, '<span color="#CC9090">⇩${eth0 down_kb}</span> <span color="#7F9F7F">⇧${eth0 up_kb}</span>', 3)

-- clock
mytextclock = awful.widget.textclock(" %a %b %d %H:%M:%S ", 1)

-- CPU usage
cpuwidget = wibox.widget.textbox()
vicious.register(cpuwidget, vicious.widgets.cpu, '<span color="#CC0000">$1% </span>[$2:$3:$4:$5]' , 2)

-- memory usage
memwidget = wibox.widget.textbox()
vicious.register(memwidget, vicious.widgets.mem, '$2MB/$3MB (<span color="#00EE00">$1%</span>)', 5)

-- widget separator
separator = wibox.widget.textbox()
separator.text  = " | "

-- Create a wibox for each screen and add it
mywibox = {}
mypromptbox = {}
mylayoutbox = {}
mytaglist = {}
mytaglist.buttons = awful.util.table.join(
                    awful.button({ }, 1, awful.tag.viewonly),
                    awful.button({ modkey }, 1, awful.client.movetotag),
                    awful.button({ }, 3, awful.tag.viewtoggle),
                    awful.button({ modkey }, 3, awful.client.toggletag),
                    awful.button({ }, 4, function(t) awful.tag.viewnext(awful.tag.getscreen(t)) end),
                    awful.button({ }, 5, function(t) awful.tag.viewprev(awful.tag.getscreen(t)) end)
                    )
mytasklist = {}
mytasklist.buttons = awful.util.table.join(
                     awful.button({ }, 1, function (c)
                                              if c == client.focus then
                                                  c.minimized = true
                                              else
                                                  -- Without this, the following
                                                  -- :isvisible() makes no sense
                                                  c.minimized = false
                                                  if not c:isvisible() then
                                                      awful.tag.viewonly(c:tags()[1])
                                                  end
                                                  -- This will also un-minimize
                                                  -- the client, if needed
                                                  client.focus = c
                                                  c:raise()
                                              end
                                          end),
                     awful.button({ }, 3, function ()
                                              if instance then
                                                  instance:hide()
                                                  instance = nil
                                              else
                                                  instance = awful.menu.clients({ width=250 })
                                              end
                                          end),
                     awful.button({ }, 4, function ()
                                              awful.client.focus.byidx(1)
                                              if client.focus then client.focus:raise() end
                                          end),
                     awful.button({ }, 5, function ()
                                              awful.client.focus.byidx(-1)
                                              if client.focus then client.focus:raise() end
                                          end))

for s = 1, screen.count() do
    -- Create a promptbox for each screen
    mypromptbox[s] = awful.widget.prompt()
    -- Create an imagebox widget which will contains an icon indicating which layout we're using.
    -- We need one layoutbox per screen.
    mylayoutbox[s] = awful.widget.layoutbox(s)
    mylayoutbox[s]:buttons(awful.util.table.join(
                           awful.button({ }, 1, function () awful.layout.inc(layouts, 1) end),
                           awful.button({ }, 3, function () awful.layout.inc(layouts, -1) end),
                           awful.button({ }, 4, function () awful.layout.inc(layouts, 1) end),
                           awful.button({ }, 5, function () awful.layout.inc(layouts, -1) end)))
    -- Create a taglist widget
    mytaglist[s] = awful.widget.taglist(s, awful.widget.taglist.filter.all, mytaglist.buttons)

    -- Create a tasklist widget
    mytasklist[s] = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, mytasklist.buttons)

    -- Create the wibox
    mywibox[s] = awful.wibox({ position = "top", screen = s })

    -- Widgets that are aligned to the left
    local left_layout = wibox.layout.fixed.horizontal()
    left_layout:add(mylauncher)
    left_layout:add(mytaglist[s])
    left_layout:add(mypromptbox[s])

    -- Widgets that are aligned to the right
    local right_layout = wibox.layout.fixed.horizontal()

    -- only display systray on screen 1
    if s == 1 then right_layout:add(wibox.widget.systray()) end

    -- add my widgets
    right_layout:add(netwidget)
    right_layout:add(separator)
    right_layout:add(cpuwidget)
    right_layout:add(separator)
    right_layout:add(memwidget)
    right_layout:add(separator)
    right_layout:add(mytextclock)
    right_layout:add(mylayoutbox[s])

    -- Now bring it all together (with the tasklist in the middle)
    local layout = wibox.layout.align.horizontal()
    layout:set_left(left_layout)
    layout:set_middle(mytasklist[s])
    layout:set_right(right_layout)

    mywibox[s]:set_widget(layout)
end
-- }}}

-- {{{ Mouse bindings
root.buttons(awful.util.table.join(
    awful.button({ }, 3, function () mymainmenu:toggle() end),
    awful.button({ }, 4, awful.tag.viewnext),
    awful.button({ }, 5, awful.tag.viewprev)
))
-- }}}

-- {{{ Key bindings
globalkeys = awful.util.table.join(
    awful.key({ modkey,           }, "Left",   awful.tag.viewprev       ),
    awful.key({ modkey,           }, "Right",  awful.tag.viewnext       ),
    awful.key({ modkey,           }, "Escape", awful.tag.history.restore),

    awful.key({ modkey,           }, "j",
        function ()
            awful.client.focus.byidx( 1)
            if client.focus then client.focus:raise() end
        end),
    awful.key({ modkey,           }, "k",
        function ()
            awful.client.focus.byidx(-1)
            if client.focus then client.focus:raise() end
        end),
    awful.key({ modkey,           }, "w", function () mymainmenu:show() end),

    -- Layout manipulation
    -- these two lines are useless for me XD
    -- awful.key({ modkey, "Shift"   }, "j", function () awful.client.swap.byidx(  1)    end),
    -- awful.key({ modkey, "Shift"   }, "k", function () awful.client.swap.byidx( -1)    end),

    awful.key({ modkey, "Control" }, "j", function () awful.screen.focus_relative( 1) end),
    awful.key({ modkey, "Control" }, "k", function () awful.screen.focus_relative(-1) end),
    awful.key({ modkey,           }, "u", awful.client.urgent.jumpto),
    awful.key({ modkey,           }, "Tab",
        function ()
            awful.client.focus.history.previous()
            if client.focus then
                client.focus:raise()
            end
        end),

    -- Standard program
    -- spawn a new terminal
    awful.key({ modkey,           }, "Return", function () awful.util.spawn(terminal) end),
    awful.key({ modkey, "Control" }, "r", awesome.restart),
    awful.key({ modkey, "Shift"   }, "q", awesome.quit),

    -- resize the client (on the focus)
    awful.key({ modkey,           }, "l",     function () awful.tag.incmwfact( 0.05)    end),
    awful.key({ modkey,           }, "h",     function () awful.tag.incmwfact(-0.05)    end),

    -- what the fuck?
    -- awful.key({ modkey, "Shift"   }, "h",     function () awful.tag.incnmaster( 1)      end),
    -- awful.key({ modkey, "Shift"   }, "l",     function () awful.tag.incnmaster(-1)      end),
    -- awful.key({ modkey, "Control" }, "h",     function () awful.tag.incncol( 1)         end),
    -- awful.key({ modkey, "Control" }, "l",     function () awful.tag.incncol(-1)         end),

    -- change window layouts
    awful.key({ modkey,           }, "space", function () awful.layout.inc(layouts,  1) end),
    awful.key({ modkey, "Shift"   }, "space", function () awful.layout.inc(layouts, -1) end),

    -- i can move and click my mouse with hotkeys!!
    awful.key({ modkey, "Shift"   }, "h", function () local mc = mouse.coords()
                mouse.coords({x = mc.x-15, y = mc.y}) end),
    awful.key({ modkey, "Shift"   }, "j", function () local mc = mouse.coords()
                mouse.coords({x = mc.x, y = mc.y+15}) end),
    awful.key({ modkey, "Shift"   }, "k", function () local mc = mouse.coords()
                mouse.coords({x = mc.x, y = mc.y-15}) end),
    awful.key({ modkey, "Shift"   }, "l", function () local mc = mouse.coords()
                mouse.coords({x = mc.x+15, y = mc.y}) end),
    awful.key({ modkey, "Shift"   }, "u", function () awful.util.spawn("xdotool click 1") end),
    awful.key({ modkey, "Shift"   }, "i", function () awful.util.spawn("xdotool click 3") end),

    -- restore the minimized client
    awful.key({ modkey, "Control" }, "n", awful.client.restore),

    -- Prompt
    awful.key({ modkey },            "r",     function () mypromptbox[mouse.screen]:run() end),

    -- run a piece of lua code
    awful.key({ modkey }, "x",
              function ()
                  awful.prompt.run({ prompt = "Run Lua code: " },
                  mypromptbox[mouse.screen].widget,
                  awful.util.eval, nil,
                  awful.util.getdir("cache") .. "/history_eval")
              end),

    -- Menubar
    awful.key({ modkey }, "p", function() menubar.show() end),

    -- lock my screen
    awful.key({ modkey }, "F12", function () awful.util.spawn("xscreensaver-command -lock") end),

    -- shutter as printscreen tools    http://shutter-project.org/
    awful.key({ }, "Print", function () awful.util.spawn("/opt/shutter/bin/shutter") end)

)

clientkeys = awful.util.table.join(
    awful.key({ modkey,           }, "f",      function (c) c.fullscreen = not c.fullscreen  end),
    awful.key({ modkey, "Shift"   }, "c",      function (c) c:kill()                         end),
    awful.key({ modkey, "Control" }, "space",  awful.client.floating.toggle                     ),
    awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end),
    awful.key({ modkey,           }, "o",      awful.client.movetoscreen                        ),
    awful.key({ modkey,           }, "t",      function (c) c.ontop = not c.ontop            end),
    awful.key({ modkey,           }, "n",
        function (c)
            -- The client currently has the input focus, so it cannot be
            -- minimized, since minimized clients can't have the focus.
            c.minimized = true
        end),
    awful.key({ modkey,           }, "m",
        function (c)
            c.maximized_horizontal = not c.maximized_horizontal
            c.maximized_vertical   = not c.maximized_vertical
        end)
)

-- Compute the maximum number of digit we need, limited to 9
keynumber = 0
for s = 1, screen.count() do
   keynumber = math.min(9, math.max(#tags[s], keynumber))
end

-- Bind all key numbers to tags.
-- Be careful: we use keycodes to make it works on any keyboard layout.
-- This should map on the top row of your keyboard, usually 1 to 9.
for i = 1, keynumber do
    globalkeys = awful.util.table.join(globalkeys,
        awful.key({ modkey }, "#" .. i + 9,
                  function ()
                        local screen = mouse.screen
                        if tags[screen][i] then
                            awful.tag.viewonly(tags[screen][i])
                        end
                  end),
        awful.key({ modkey, "Control" }, "#" .. i + 9,
                  function ()
                      local screen = mouse.screen
                      if tags[screen][i] then
                          awful.tag.viewtoggle(tags[screen][i])
                      end
                  end),
        awful.key({ modkey, "Shift" }, "#" .. i + 9,
                  function ()
                      if client.focus and tags[client.focus.screen][i] then
                          awful.client.movetotag(tags[client.focus.screen][i])
                      end
                  end),
        awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9,
                  function ()
                      if client.focus and tags[client.focus.screen][i] then
                          awful.client.toggletag(tags[client.focus.screen][i])
                      end
                  end))
end

clientbuttons = awful.util.table.join(
    awful.button({ }, 1, function (c) client.focus = c; c:raise() end),
    awful.button({ modkey }, 1, awful.mouse.client.move),
    awful.button({ modkey }, 3, awful.mouse.client.resize))

-- Set keys
root.keys(globalkeys)
-- }}}

-- {{{ Rules
awful.rules.rules = {
    -- All clients will match this rule.
    { rule = { },
      properties = { border_width = beautiful.border_width,
                     border_color = beautiful.border_normal,
                     focus = awful.client.focus.filter,
                     keys = clientkeys,
                     buttons = clientbuttons } },
    { rule = { class = "MPlayer" },
      properties = { floating = true } },
    { rule = { class = "pinentry" },
      properties = { floating = true } },
    { rule = { class = "gimp" },
      properties = { floating = true } },
}
-- }}}

-- {{{ Signals
-- Signal function to execute when a new client appears.
client.connect_signal("manage", function (c, startup)
    -- Enable sloppy focus
    c:connect_signal("mouse::enter", function(c)
        if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier
            and awful.client.focus.filter(c) then
            client.focus = c
        end
    end)

    if not startup then
        -- Set the windows at the slave,
        -- i.e. put it at the end of others instead of setting it master.
        -- awful.client.setslave(c)

        -- Put windows in a smart way, only if they does not set an initial position.
        if not c.size_hints.user_position and not c.size_hints.program_position then
            awful.placement.no_overlap(c)
            awful.placement.no_offscreen(c)
        end
    end

    local titlebars_enabled = false
    if titlebars_enabled and (c.type == "normal" or c.type == "dialog") then
        -- Widgets that are aligned to the left
        local left_layout = wibox.layout.fixed.horizontal()
        left_layout:add(awful.titlebar.widget.iconwidget(c))

        -- Widgets that are aligned to the right
        local right_layout = wibox.layout.fixed.horizontal()
        right_layout:add(awful.titlebar.widget.floatingbutton(c))
        right_layout:add(awful.titlebar.widget.maximizedbutton(c))
        right_layout:add(awful.titlebar.widget.stickybutton(c))
        right_layout:add(awful.titlebar.widget.ontopbutton(c))
        right_layout:add(awful.titlebar.widget.closebutton(c))

        -- The title goes in the middle
        local title = awful.titlebar.widget.titlewidget(c)
        title:buttons(awful.util.table.join(
                awful.button({ }, 1, function()
                    client.focus = c
                    c:raise()
                    awful.mouse.client.move(c)
                end),
                awful.button({ }, 3, function()
                    client.focus = c
                    c:raise()
                    awful.mouse.client.resize(c)
                end)
                ))

        -- Now bring it all together
        local layout = wibox.layout.align.horizontal()
        layout:set_left(left_layout)
        layout:set_right(right_layout)
        layout:set_middle(title)

        awful.titlebar(c):set_widget(layout)
    end
end)

client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end)
client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end)
-- }}}

-- vim:set fdm=marker:


以下是跟 default 的 /etc/xdg/awesome/rc.lua 的 diff



更動的地方如下:

vicious widgets
using urxvt and vim as default
delete useless layouts
define my wallpaper
cool tag names
move and click my mouse with keyboard hotkeys
xscreen-saver to lock the screen
shutter-porject as printscreentools




13a14,17
> -- vicious widgets library
> local vicious = require("vicious")
> 
> 
41c45
< beautiful.init("/usr/share/awesome/themes/default/theme.lua")
---
> beautiful.init("/home/xatierlike/.config/awesome/themes/default/theme.lua")
43,45c47,49
< -- This is used later as the default terminal and editor to run.
< terminal = "xterm"
< editor = os.getenv("EDITOR") or "nano"
---
> -- default terminal and editor
> terminal = "urxvt"
> editor = os.getenv("EDITOR") or "vim"
47,52c51
< 
< -- Default modkey.
< -- Usually, Mod4 is the key with a logo between Control and Alt.
< -- If you do not like this or do not have such a key,
< -- I suggest you to remap Mod4 to another key using xmodmap or other tools.
< -- However, you can use another modifier like Mod1, but it may interact with others.
---
> -- modkey
54a54,57
> 
> 
> 
> 
58,69c61,73
<     awful.layout.suit.floating,
<     awful.layout.suit.tile,
<     awful.layout.suit.tile.left,
<     awful.layout.suit.tile.bottom,
<     awful.layout.suit.tile.top,
<     awful.layout.suit.fair,
<     awful.layout.suit.fair.horizontal,
<     awful.layout.suit.spiral,
<     awful.layout.suit.spiral.dwindle,
<     awful.layout.suit.max,
<     awful.layout.suit.max.fullscreen,
<     awful.layout.suit.magnifier
---
>     -- delete useless layouts
>     awful.layout.suit.tile,               -- 1 (tile.right)
>     awful.layout.suit.tile.left,          -- 2
>     awful.layout.suit.tile.bottom,        -- 3
>     -- awful.layout.suit.tile.top,           -- 
>     -- awful.layout.suit.fair,               -- 
>     -- awful.layout.suit.fair.horizontal,    -- 
>     -- awful.layout.suit.spiral,             -- 
>     -- awful.layout.suit.spiral.dwindle,     -- 
>     awful.layout.suit.max,                -- 4
>     -- awful.layout.suit.max.fullscreen,     --
>     -- awful.layout.suit.magnifier,          --
>     awful.layout.suit.floating            -- 5
73a78
> beautiful.wallpaper = "/home/xatierlike/Pictures/goodbye.jpg"
82c87
< -- Define a tag table which hold all screen tags.
---
> -- Each screen has its own tag table.
85,86c90,97
<     -- Each screen has its own tag table.
<     tags[s] = awful.tag({ 1, 2, 3, 4, 5, 6, 7, 8, 9 }, s, layouts[1])
---
>     tags[s] = awful.tag(
>         {"⌨", "☠", "☢", "☣", "☮", "✈", "✍", "♺", "(._.?)"},
>         s,
>         { layouts[2], layouts[2], layouts[2],
>           layouts[2], layouts[2], layouts[2],
>           layouts[5], layouts[5], layouts[2]
>         }
>     )
87a99
> 
112,113c124,142
< -- Create a textclock widget
< mytextclock = awful.widget.textclock()
---
> 
> -- network usage
> netwidget = wibox.widget.textbox()
> vicious.register(netwidget, vicious.widgets.net, '<span color="#CC9090">⇩${eth0 down_kb}</span> <span color="#7F9F7F">⇧${eth0 up_kb}</span>', 3)
> 
> -- clock
> mytextclock = awful.widget.textclock(" %a %b %d %H:%M:%S ", 1)
> 
> -- CPU usage
> cpuwidget = wibox.widget.textbox()
> vicious.register(cpuwidget, vicious.widgets.cpu, '<span color="#CC0000">$1% </span>[$2:$3:$4:$5]' , 2)
> 
> -- memory usage
> memwidget = wibox.widget.textbox()
> vicious.register(memwidget, vicious.widgets.mem, '$2MB/$3MB (<span color="#00EE00">$1%</span>)', 5)
> 
> -- widget separator
> separator = wibox.widget.textbox()
> separator.text  = " | "
190a220,221
> 
>     -- only display systray on screen 1
191a223,230
> 
>     -- add my widgets
>     right_layout:add(netwidget)
>     right_layout:add(separator)
>     right_layout:add(cpuwidget)
>     right_layout:add(separator)
>     right_layout:add(memwidget)
>     right_layout:add(separator)
232,233c271,274
<     awful.key({ modkey, "Shift"   }, "j", function () awful.client.swap.byidx(  1)    end),
<     awful.key({ modkey, "Shift"   }, "k", function () awful.client.swap.byidx( -1)    end),
---
>     -- these two lines are useless for me XD
>     -- awful.key({ modkey, "Shift"   }, "j", function () awful.client.swap.byidx(  1)    end),
>     -- awful.key({ modkey, "Shift"   }, "k", function () awful.client.swap.byidx( -1)    end),
> 
245a287
>     -- spawn a new terminal
249a292
>     -- resize the client (on the focus)
252,255c295,302
<     awful.key({ modkey, "Shift"   }, "h",     function () awful.tag.incnmaster( 1)      end),
<     awful.key({ modkey, "Shift"   }, "l",     function () awful.tag.incnmaster(-1)      end),
<     awful.key({ modkey, "Control" }, "h",     function () awful.tag.incncol( 1)         end),
<     awful.key({ modkey, "Control" }, "l",     function () awful.tag.incncol(-1)         end),
---
> 
>     -- what the fuck?
>     -- awful.key({ modkey, "Shift"   }, "h",     function () awful.tag.incnmaster( 1)      end),
>     -- awful.key({ modkey, "Shift"   }, "l",     function () awful.tag.incnmaster(-1)      end),
>     -- awful.key({ modkey, "Control" }, "h",     function () awful.tag.incncol( 1)         end),
>     -- awful.key({ modkey, "Control" }, "l",     function () awful.tag.incncol(-1)         end),
> 
>     -- change window layouts
258a306,318
>     -- i can move and click my mouse with hotkeys!!
>     awful.key({ modkey, "Shift"   }, "h", function () local mc = mouse.coords()
>                 mouse.coords({x = mc.x-15, y = mc.y}) end),
>     awful.key({ modkey, "Shift"   }, "j", function () local mc = mouse.coords()
>                 mouse.coords({x = mc.x, y = mc.y+15}) end),
>     awful.key({ modkey, "Shift"   }, "k", function () local mc = mouse.coords()
>                 mouse.coords({x = mc.x, y = mc.y-15}) end),
>     awful.key({ modkey, "Shift"   }, "l", function () local mc = mouse.coords()
>                 mouse.coords({x = mc.x+15, y = mc.y}) end),
>     awful.key({ modkey, "Shift"   }, "u", function () awful.util.spawn("xdotool click 1") end),
>     awful.key({ modkey, "Shift"   }, "i", function () awful.util.spawn("xdotool click 3") end),
> 
>     -- restore the minimized client
263a324
>     -- run a piece of lua code
270a332
> 
272c334,341
<     awful.key({ modkey }, "p", function() menubar.show() end)
---
>     awful.key({ modkey }, "p", function() menubar.show() end),
> 
>     -- lock my screen
>     awful.key({ modkey }, "F12", function () awful.util.spawn("xscreensaver-command -lock") end),
> 
>     -- shutter as printscreen tools    http://shutter-project.org/
>     awful.key({ }, "Print", function () awful.util.spawn("/opt/shutter/bin/shutter") end)
> 
358,360d426
<     -- Set Firefox to always map on tags number 2 of screen 1.
<     -- { rule = { class = "Firefox" },
<     --   properties = { tag = tags[1][2] } },
428a495,496
> 
> -- vim:set fdm=marker:



Tuesday, January 1, 2013

bye, 2012



年底反省文


首先當然要感謝我的父母以及姊姊,是你們給我一個如此溫暖的家庭

讓我能一個人在新竹時有依靠,有一個能寄託思念的地方





今年談了一場轟轟烈烈(?)的戀愛,雖然結局不太如意

但也還是創造出很美妙的回憶,難過的的就不去想了吧!

謝謝妳河馬,是你陪我度過這段很棒的時光

希望你也能找到比我更適合你的另一半







感謝 NBL 的各位

老闆 Nik 和阿毓經理、正妹會計 Julia 姊姊,還有已經離職的 Memphis

是你們給我如此美好的一份工作,讓我能在新竹悲劇的高物價下養活自己

薪水水平很棒,工作內容又不會太繁重,真的非常喜歡這份工作

雖然工作難免有出差錯,你們對於我這樣一個打雜的工讀生來說

已經是很棒很棒的待遇了,希望來年能繼續在這邊努力









感謝系計中的各位前輩

今年最瘋狂的決定大概是把 SA / NA 課程修完後直接去衝系計中 TA 吧!

身為最年輕的 TA ,在系計中工作備感壓力,同時也覺得自己不足、所欠缺的太多

感謝各位前輩的容忍與指導

讓我在系上這麼棒的環境學習

特別感謝熊熊學長、凱吉學長、博明學長三位 PhD ㄉㄉ

對於一個如此初生之犢般的學弟,盡力指導、幫助我成長學習

此間受用非兩三句話能表達我內心的感激的

以後也請各位前輩多多關照了!










另外要特別感謝 jserv 學長、前輩、以及老闆

是你在今年對我的用心讓我重新對於資訊工程這條道路感到無比的希望

是你帶我認識各式各樣有趣的開源專案,也介紹了很多很棒的技術

感謝你在暑假時給我的  intern 機會,讓我買了這台我覺得不是很好用的 MBA (炸

每次跟學長談天聊聊自己的處境時,總是會帶給我動力

讓我在這條孤單的道路下能夠繼續前進












感謝 ijsung 學長

是你在今年啟發了我對於 compiler 領域的興趣

無論是在學術方面還是生涯規劃都帶給了我明確的方向

無論是噗浪上閒聊還是對於資訊領域的認真探討

各種方面學長都帶給了我許多

希望能有機會成為跟學長一樣強悍的ㄉㄉ









感謝噗浪上開源社群的夥伴以及各位 hacker 們

是你們讓我開了眼界

對於資訊安全這條孤寂的道路中給我指引明燈

無論是噗上還是聚會上的嘴砲,一起對於技術的探討以及開源專案的熱情

是你們帶給我一起學習的勇氣!

特別是今年 HIT 的四位隊友和其他共同 hacking 的夥伴

BlueT, 魏藥, TW1943 ,跟你們一起拿下今年駭客年會的亞軍真的很棒

也謝謝其他台灣資訊安全以及開源軟體社群各位的付出和努力!

希望自己以後能繼續能對於整個自由軟體和安全有所貢獻

happy hacking!











要感謝 NBA 社團的各位和交大資工的同學好友們

跟你們一起在這們悲劇的環境下學習真的很棒

雖然還是找不到真正能討論的同窗

不過有你們就不錯惹(欸







感謝 NC7U-WTF channel 的各位

一起  24 Hr 歡樂聊天、作業討論、婊人、髒髒物分享(?)

科科









最後要感謝小趴、芝芝、君君、鈉鎳、秀你們幾個學妹

有你們這些學妹陪著一位可憐的阿宅

只能用 QAQ 和 (yay) 來形容我的心情惹

我只是想要找個人討拍 QQQQ





來年加油!



xatier 20130101

Thursday, December 13, 2012

Running python in 32-bit mode for wxPython


在 Mac OS X 上面寫 wxpython 時,必須打開 32bit mode 不然他不會動 ...

解法:

加入以下環境變數

export VERSIONER_PYTHON_PREFER_32_BIT=yes


參考

http://stackoverflow.com/questions/2088569/how-do-i-force-python-to-be-32-bit-on-snow-leopard-and-other-32-bit-64-bit-quest

http://stackoverflow.com/questions/4665818/running-python-in-32-bit-more-for-wxpython

emacs beginer's notes


http://www.linux.org.tw/CLDP/OLD/Emacs-Beginner-HOWTO-2.html
http://linux.chinaitlab.com/man/newsoft/Emac/book.html



上下左右
C-p previous line
C-n next line
C-f forward
C-b backward



PageUp/Dn
C-v scroll-up

M-v scroll-down


以字移動
M-f forward-word
M-b backward-word



行首行尾

C-a move-beginning-of-line
C-e move-end-of-line



句首句尾

M-a backward-sentence
M-e forward-sentence



檔頭檔尾

M-< beginning-of-buffer
M-> end-of-buffer



search
M-q C-s forward search
M-q C-r backward search


delete
C-d delete-char
M-d kill-word
C-k kill-line
M-k kill-sentence



yank
C-y yank
M-y yank-pop



buffer
C-x C-b list-buffers

C-x b switch-to-buffer
C-x k kill buffer
C-x C-c save-buffers-kill-emacs
M-x rename-buffer



files
C-x C-f open a file

C-x C-s save
C-x C-w save as 

windows
C-x 0 delete-window
C-x 1 delete-other-windows
C-x 2 split window vertically
C-x 3 split window horizontally
C-x o other-window



misc
C-x u undo
C-x l count-lines-page
M-x execute-extended-command
M-x shell 開啟 shell
C-g keyboard-quit
C-u M-x calendar



help
C-h k describe-key

C-h i info  # 神奇說明書
C-h F Emacs FAQ
C-h b shortcut keys enabled in current buffer

Monday, December 10, 2012

geek calendar

http://technet.tw/ 是一個有趣的宅宅農民曆,於是寫出了一個 one liner 去抓他




date "+%F, %A" && w3m -dump "http://technet.tw"  | head -n 26 | sed -e '/^$/d' -e '1,3d'| sed -e '1,4{N; s/\n/ /}'




btw, 背景是君君 >///<

Thursday, December 6, 2012

我們都活在太舒服的年代







跟 jserv 信件往來的一小段節錄... 反思我們對於電腦環境的認識與了解




我們都活在太舒適的年代










jserv:


話說回來,二十年前當我剛開始接觸電腦時,那時沒有太多科技術語,而且人們探討的議題也相當局限,不外乎 BIOS、文書編輯器、繪圖程式 (你想過AutoCAD 跑在受限於 640 KB 的 DOS 環境是怎麼樣呢?)、幕後排版 (比 TeX 陽春許多)、程序導向的程式語言 (還記得 OOP/4GL 慰為風氣的年代嗎?還要再早一點) 等等。


而現在就非常可怕,我想要是把科技術語整理起來,或許都比當年的 BIOS 原始程式碼列表 (可在圖書館找到這樣的專書,全書都是程式碼,在 301 條款生效之前,把有版權保護的程式碼印列出來的盜版行為,在台灣不追究) 還長。









me:


這些更早的年代在我深入接觸電腦早已過去,但是閱讀前輩們的書籍時還是能從中體驗到那種氛圍,那個處處受現的年代,所有資源都要透過整個系統去思考,做最佳、最有效率的利用;反觀現在太多 "外殼" 將計算機內部的行為包裝起來,一般接觸電腦的人也不容易產生興趣、去明白 how it works ,太多商業化 (或是說物質)的包裝混淆了焦點。



但是值得反思的是,就拿機械工業技術來對比吧,工業革命時代下也是許多 "hackers" 想要改進蒸氣機、齒輪和傳動軸等動力機械的發展,而商業化和大量的規模生產後的現代,想要去了解各式機械的運作原理的人們也漸漸變少了。像是我們並不會想去深入探討一輛汽車或是機車如何工作、不必了解引擎運轉的種種原理等,大眾化後的結果是大家享受某項工具的的 "商品",而技術本身可能除了技術人員外就愈來愈少人想要去理解這些。



回到電腦科學的角度不也如此?我認為電腦科學中很大的概念是 abstraction ,透過更上一層的抽象角度來思考整個系統的運作,而不去鑽底層技術的牛角尖,這種學習方式未嘗不好,只是當我們在上層進行抽象、全局的思考模式時,不能因而模糊了焦點。這個時代太多過多的包裝讓電腦系統變得漂漂亮亮的商品,而想去了解他背後工作原理的人很容易被這些外部的包裝所迷惑、混淆,相較之下當年一群 geek 跟 hacker 的時代要接觸底層工作知識的途徑就顯的容易許多。我想,這是現在學生不容易對於系統產生興趣的其中一個原因吧!

Tuesday, December 4, 2012

gnutls_anon_server_credentials is deprecated

compile qemu 遇到

error: ‘gnutls_anon_server_credentials’ is deprecated 解法

基本上就是把 type 換掉即可

ref

好奇這 bug 應該很久以前就解掉了,但是我去 fetch 目前最新的 qemu 1.3 還是在 @@"


Index: qemu-kvm-1.1.rc2/ui/vnc-tls.c
===================================================================
--- qemu-kvm-1.1.rc2.orig/ui/vnc-tls.c
+++ qemu-kvm-1.1.rc2/ui/vnc-tls.c
@@ -99,9 +99,9 @@ static ssize_t vnc_tls_pull(gnutls_trans
 }
 
 
-static gnutls_anon_server_credentials vnc_tls_initialize_anon_cred(void)
+static gnutls_anon_server_credentials_t vnc_tls_initialize_anon_cred(void)
 {
-    gnutls_anon_server_credentials anon_cred;
+    gnutls_anon_server_credentials_t anon_cred;
     int ret;
 
     if ((ret = gnutls_anon_allocate_server_credentials(&anon_cred)) < 0) {
@@ -382,7 +382,7 @@ int vnc_tls_client_setup(struct VncState
             }
 
         } else {
-            gnutls_anon_server_credentials anon_cred = vnc_tls_initialize_anon_cred();
+            gnutls_anon_server_credentials_t anon_cred = vnc_tls_initialize_anon_cred();
             if (!anon_cred) {
                 gnutls_deinit(vs->tls.session);
                 vs->tls.session = NULL;


Wednesday, November 28, 2012

google hangout on Arch linux

install this aur https://aur.archlinux.org/packages.php?ID=40056

sudo yaourt -S google-talkplugin

if there's no video, then add this

sudo echo "O3D_OVERRIDE_RENDER_MODE=2D" >> /opt/google/talkplugin/envvars