原本拿來在 blog 貼 code 的 syntax highlighter http://tohtml.com/ 好像爛掉了...
目前用這個當作替代品,配色可能會有點不習慣,抱歉 <(_ _)>
http://markup.su/highlighter/
Monday, January 7, 2013
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
昨天有空 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
以下是跟 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
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
Tuesday, December 18, 2012
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
以字移動
上下左右
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
行首行尾
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
search
M-q C-s forward search
M-q C-r backward search
delete
C-d delete-char
M-d kill-word
delete
C-d delete-char
M-d kill-word
C-k kill-line
M-k kill-sentence
yank
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
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
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 1 delete-other-windows
C-x 2 split window vertically
C-x 3 split window horizontally
C-x o other-window
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-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 去抓他
btw, 背景是君君 >///<
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 還是在 @@"
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
sudo yaourt -S google-talkplugin
if there's no video, then add this
sudo echo "O3D_OVERRIDE_RENDER_MODE=2D" >> /opt/google/talkplugin/envvars
Subscribe to:
Posts (Atom)