Гном 2.30 је изашао. Покушаћу укратко да резимирам оно што је тим за превод Гнома урадио, као и шта сам ја покушавао да урадим за ово издање.

Програми

Пошто смо од издања 2.26 на 2.28 направили стварно огроман скок са 81% на 91% преведности, били поменути као један од најбољих тимова за 2.28 и вратили српски превод Гнома на стазе старе славе, сада смо само одржавали исти ритам. Не би смело да нам се опет деси да се онако опустимо, а за ово издање смо чак и повећали преведеност на 92%. Сви главни програми су потпуно преведени, као и још много програма који нису део скупа основних модула. Још једина два непреведена модула су Орка читач за особе са посебним потребама и Анјута — интегрисано окружење за развој, тј. IDE. Дефинитивно ова два програма не спадају у приоритетне, али ћу гледати да за Гном 3.0 (пошто је следеће издање 3.0) пробам да преведем Анјуту (мада искрено не верујем да ће домаћи програмери користити тај превод, осим можда неких нових клинаца који тек упадају у програмерске воде, па ће им можда бити лакше тако). Такође, има још доста програма „са стране“ који заслужују да буду преведени пре ова два, а сад имамо времена и за њих. И наравно, највећи приоритет је дефинитивно одржавање ових постојећих превода. То је, по мени, правац у коме ће се кретати даљи развој превода за Гноме, али далеко од тога да ће бити по пароли „на западу ништа ново“ јер, већ у Гному 3.0 ће вас сачекати једна лепа промена — свако појављивање речи „умножи“ (тј. на енглеском copy, када се садржај пребацује у клипборд) ће бити замењено са de facto коришћенијим у разговору „копирај“.

Друга ствар која ме јако брине је што на преводу Гнома сада практично раде само два човека — Милош Поповић и ја. Мало је тужно и несхватљиво да једно од најкоришћенијих окружења за линукс нема више преводиоца, а да, са друге стране на Убунту преводу за српски ради мала армија. Требало би овде мало погурати, видети има ли заинтересованих људи; у првој категорији, тј. најпожељнији су они који већ користе локализовано окружење. Верујем да таквих људи има, али наравно, не по цену квантитета да изгубимо квалитет. Честитке Милошу за изгурани 2.30, урадио је лавовски посао, али већ је постало монотоно да нас двојица честитамо један другоме више, треба нам свеже крви:)

Документација

Гном 2.30 је посебан по томе што је по први пут започет рад на превођењу документације. Све то је почело овде. Дакле, после изласка 2.28 сам започео превођење Гном документације, чисто да видим куда ће ме то одвести. Сада могу да кажем да је добро испало. Гном је добио превод документације свих игара на српски језик, што му дође негде око 9% превода целе документације. Добра ствар је што се ови преводи документације не мењају често тако да неће представљати велики проблем одржавати их касније, али, са друге стране, да се не лажемо – основни, изворни текст документације (на енглеском) и није нешто претерано од помоћи (а и лош је зато што је написан једном и ретко кад се и мења). Ево како то лепо изгледа на крају на проклетим лажима:

Када добијете нови Гном 2.30, погледајте Помоћ->Садржај за неку игрицу, требало би да у свим дистрибуцијама добијете документацију на српском.

Не планирам да стајем овде, план за 3.0 ми је да одржавам ове преводе и да преведем још пар модула из истих група, а то су GNOME applets, gnome-media, а ако стигнем и gnome-utils и неко конкретно програмче (најприоритетније, типа калкулатор и сл.). То би повећало проценат преведности за још оволико, тј. до 20%, а мени би дало потребно искуство за превод највеће и најважније документације за издање после 3.0, а то је корисничка документација (наравно, не за Гном 2, него за Гном 3). Уколико се појави још неко за превођење документације, тим боље. Толико од мене за Гном 2.30.

, , , , , ,

Gnome have nifty little feature to show warning icon in the right part of entry box when CAPS LOCK key is on. Actually, it’s part of GtkEntry widget. Warning icon is shown when widget gain focus and disappear when focus is lost. You can see how that looks like:

gnome_warning


This is my take to replicate this behavior in Java:


public class WarningPasswordField extends JPasswordField {
	private static final long serialVersionUID = -4334432525061916434L;
 
	private final int verticalInsets = 5;
	private final int rightOffset = 4;
 
	private BufferedImage warning = null;
 
	public WarningPasswordField() {
		super();
		try {
			InputStream is = this.getClass()
					.getResourceAsStream("/warning.png");
			if (is != null) {
				warning = ImageIO.read(is);
			}
		} catch (IOException e) {
		}
	}
 
	@Override
	public void paint(Graphics g) {
		super.paint(g);
		if (warning == null) {
			/* image is not loaded, behave like a normal password field */
			return;
		}
		if (!this.isFocusOwner()) {
			/* don't paint warning icon if we don't have focus */
			return;
		}
 
		boolean capsLockOn = false;
		try {
			capsLockOn = Toolkit.getDefaultToolkit().getLockingKeyState(
					KeyEvent.VK_CAPS_LOCK);
		} catch (UnsupportedOperationException e) {
			/* workaround sun java bug 5100701 when using XToolkit */
		}
 
		if (capsLockOn) {
			int width = this.getWidth();
			int height = this.getHeight();
			int iconSize = height - 2 * verticalInsets;
			int dx1 = width - (iconSize + rightOffset);
			int dy1 = verticalInsets;
			/*
			 * fill white rectangle where image will be, so password stars are
			 * not visible if image is transparent
			 */
			g.setColor(Color.WHITE);
			g.fillRect(dx1, dy1, iconSize, iconSize);
			/* draw warning image */
			g.drawImage(warning, dx1, dy1, dx1 + iconSize, dy1 + iconSize, 0,
					0, warning.getWidth(), warning.getHeight(), null);
		}
	}
}

As you can see, paint method is overridden and that’s basically it.  Because warning icon’s position is dependent on used look & feel, I left two constants so you can tweak its position. If warning icon can’t be loaded, this code fails silently. I used warning icon from Gnome project, but it could (obviously) be any icon. So here is how it looks (this is nimbus L&F):

java_warning

Hope you like it and hope it will integrate quickly and nicely into your code;)

Note: RTL languages are not supported, icon there should probably go to the left!

, , , , , ,

Увод

Гном 2.28 је скоро изашао, превод се стишао, превели смо шта смо превели, о томе ћу неки други пут. Пред нама који преводимо Гном су се сад отвориле неке нове могућности јер смо добили више времена. Прва опција је била преводити основни скуп Гномових модула до краја. Од непреведених програма из главног скупа Гномових модула су остали само Анјута (C/C++ IDE) и Орка (читач екрана са особе са посебним потребама). Не треба рећи да су ово програми најнижег приоритета. Поред њих, има доста „великих“ непреведених програма који нису део главних модула Гнома, али се налазе на Гномовом сајту. Примери су Диа и Tracker. Трећа опција је била само поправљати постојеће преводе, а четврта превођење документације. Документацију за Гном програме немамо преведену и ту нико никад није ништа радио (осим документације за 2 програма која је рађена пре пар година и која од тад није ни дирана и практично није ни употребљива више). Расправљало се шта радити даље. Кључно питање је било: да ли је, гледано са корисничке стране, битније да имамо преведену Анјуту, Диу или документацију за нпр. Калкулатор или уређивач текста, тачније како максимизовати постојеће ресурсе које имамо, а да се то највише осети и буде од највеће користи код крајњих корисника. Милош Поповић је био за превођење додатних програма из Гном пакета, док сам ја кренуо на документацију. Наравно, ови избори нису стриктни ни искључиви, свако од нас ту ради све.

Анализа превођења документације

Ово што сам одабрао је практично посао без краја и немам никаквих сумњи да он неће бити завршен наредних пар година (нарочито ако останемо са овим бројем преводиоца). Пре искустава са превођењем Гном документације, прво бих ставио на папир све предности и мане превођења документације. Па идемо, предности су:

  • Јасно су дефинисане целине и редослед превођења (кренемо од превођења документације најважнијих програма ка мање значајним).
  • Много је лакше проверавати и прегледати ове преводе (своди се на превођење .po датотеке, изградњу .xml датотеке и њено покретање у `yelp`-у).
  • Колико се мени чини, документационе ниске се много ређе мењају од ниски за превођење из програма (оне две горепоменуте преведене документације рађене у 2.14 и даље имају доста ниски које се нису мењале, што не верујем да би ниске из програма могле да постигну – толико да се држе), мада је ово можда и варка.
  • Превођењем документације ћемо добити прилику да прођемо и кроз преводе програма и исправимо грешке које тамо нађемо).

Мане код превођења документације су:

  • Документација је огроман залогај и не треба улазити у њу са жељом да се преведе све. Треба је разбити у мање целине и тако је радити; другим речима, не треба ниједног тренутка помислити да ће она икад бити готова.
  • Превођење документације је тотално другачији посао од превођења програма – много је тежа, већа, мора се пазити на термине коришћене у програмима, морају се радити слике..

Ово разлагање на предности и мане сам писао за потребе образлагања на дописној листи пре него што сам започео превођење и нешто сам погодио, нешто не, видећемо касније шта је стварност, а шта сам лоше претпоставио.

У интерном договору са Милошем, ухватио сам се да радим превођење игрица, тј. Гном пакета gnome-games. Он је већ разбијен на документацију за сваку игрицу посебно, оне су релативно мале, а завршавање тога би заокружило једну целину. Кренуо сам тако да преводим игрице, једну по једну, крећући од оних са најмање ниски за превођење – Слагалицу, Клотски, Гном Исто-исто, Гном тетрис… У тренутку писања овог текста, ни пола игрица није преведено, али циљ који сам задао сам себи је да се за Гном 2.30 заврше бар игрице, ако не и још нешто. Ево шта сам притом закључио.

Искуства

Све наредно што напишем за моја искуства је везано искључиво за превођење игрица, али верујем да је ситуација иста или слична и за превођење документације и осталих програма. Прво морам да кажем – превођење документације није тако тешко као што се мени чинило пре него што сам почео. Штавише, лакше је од превођења програма. Наиме, ниске су дугачке, чине потпуне реченице и јасан је контекст у коме се јављају. Ово није случај са превођењем програма где често имате само једну реч коју треба превести, па морате да се довијате да видите где се та реч види, на ком је дијалогу, да гледате изворни код, да изградите новије издање програма да бисте схватили „шта је писац хтео да каже“… Друго, у свакој .po датотеци имате 20-30 ниски које можете да умножите/убаците одмах из других програма – то су углавном ствари везане за лиценце (ту ми је помогао превод постојеће документације где је лиценца већ била преведена), аутори програма и документације који се не преводе, брдо ствари везаних за пријављивање грешака које су увек исте, а углавном се деси и да треба само превести обичне арапске бројеве. 20-30 не делује као много, али пошто преводи за игрице имају у просеку 100-150 ниски, ово је солидан проценат, а и значи, гледано са психолошке стране.

Оно што није једноставно, а што сам ја мислио да ће бити једноставно је прегледање готових превода са `yelp`-ом. Наиме, никако нисам успео да натерам програм `po2xml` да од .po датотеке изгенерише .xml. Вероватно је до мене, да не давим, проблем сам решио користећи jhbuild који ионако имам за потребе превођења програма. Дакле, овде сам омануо, преглед превода није једноставан. Наравно, вреди наместити jhbuild јер гледање превода у `yelp`-у не може да се мери са гледањем превода у програму за превођење – одмах се виде све грешке у куцању! Био сам у праву да ће превод документације да поправи преводе програма, нашао сам на једном месту да је „Score“ преведен као „Разултат“ (и ту ниску нажалост тренутно користе све игрице на 2.28!) уместо „Резултат“ и то се видело на снимку екрана. Одмах је послат печ на проклете лажи.

Кад смо код снимака екрана, могу рећи да је то најзанимљивији део :-) . Снимци екрана које сам до сада радио су некад захтевали снимке екрана решених игрица, па човек мора да се довија како да реши игрицу – или да научи да је игра, или да се снађе. За неке игрице сам морао да их решавам да бих добио жељени снимак (ух, како сам се у том тренутку глупо осећао :-) , за неке сам варао, па сам ишао на „Савет“ или „Помоћ“ :-) ). Такође, за разлику од превода, слике морају да се раде и за ћирилицу и за латиницу, јер се не могу аутоматизовано транслитерализовати, тако да је до оног ко ради снимке да уради паралелно снимке и за ћирилицу и за латиницу. Углавном, кад се превод заврши, ово му дође као неки мали одмор и шлаг на торту, завршна тачка на ваш превод. Једна ствар на коју се мора пазити при превођењу ниски које имају референце на слике (и остале референце уосталом) је да референце морају да буду у номинативу. Нпр. превод следеће ниске:

Starting <application>GNOME Tetravex</application> opens the <interface>Main window</interface>, shown in <xref linkend=”mainwindow-fig”/>.

не може да буде:

Покретањем <application>Гномове слагалице</application> се отвара <interface>Главни прозор</interface>, који је приказан на <xref linkend=”mainwindow-fig”/>.

јер би то завршило као:

Покретањем Гномове слагалице се отвара Главни прозор, који је приказан на Слика 1.

Ту или мора да се мења конструкција реченице („који приказује Слика 1“) или, што је још боље Милош предложио, а ја усвојио као најбоље решење, да такве реченице референцу имају у загради, што би на овом примеру гласило:

Покретањем Гномове слагалице се отвара Главни прозор (Слика 1).

Још неке мање битне ствари које могу да поменем су да треба пазити код превода низводно. Иако Гномов превод има једну ниску на један начин преведену, преводиоци низводно (нпр. Убунту тим) могу да је измене, па је тако Гномов тим превео игрицу „Tetravex“ као „Слагалица“, а у Убунтуу је то некако постало „Тетравекс“, тако да је то мало незгодно приликом превођења и приликом прављења снимка екрана (ако користите Убунту, наравно). Ово ми се само десило на овом примеру и ниједном више, али треба пазити дефинитивно. Такође, слање превода на проклете лажи је мало теже јер се поред .po датотека шаљу и слике. Проклете лажи имају могућност да приказују разлике превода одмах на сајту, али не и када се .po датотека и слике спакују заједно, тако да смо се договорили да се посебно шаље .po датотека, да бисмо могли да прегледамо разлике, а посебно спаковане слике јер нам за њих прегледање разлика није битно.

За крај

Дугачак текст, ако сте га целог прочитали – свака част. Пошто вероватно нећете ручно градити цео Гном да бисте видели превод документације на делу, а као награду што сте прочитали све довде (правићемо се да нико није варао и само клизао до краја текста :-) ), ево и снимка како превод документације изгледа на делу. Уживајте!

klotski-doc-serbian

, , , , , , , , ,

Playing with canvas element

There are a lot of examples with canvas tag these days. As if world as a whole is preparing for imminent arrival of HTML5;) I’m not going to talk about canvas element – if you are a designer or developer and you still didn’t heard for it, then you will…soon. Anyway, there were nice post I found on DZone which summarizes some great examples of canvas usage, you can find it here (examples are at the bottom, if you’re not interested in theory). Another great summary post emerged few days after with a lot of cool examples (some of those examples are useless to open in anything other then Chrome, even if you turn TraceMonkey in Firefox). What caught my attention was something I saw a lot earlier with a experiment done a long ago (“long ago”  is funny term when speaking in technology context). It’s example of waving image, imitating water reflection. You can see original here. At the end of that page, you can read that that guy won’t add fading effect. This is where I jump in.

canvas

I took that code thinking that it will be easy. Long story short, with a complete rewrite, I managed to add fade out opacity. It turned harder then I thought it will be. Principle is the same – draw start image once and then refresh lower part every 25ms to make animation effect. In every frame, we go top down and for every row, new value of offset is calculated based on sin function. Frequency is set so one complete sine period is always shown.

Interesting thing is, I also managed to slow down complete animation by factor of 5-10x. Why is that? Original example uses drawImage() function and draws row-by-row. Because I use alpha channel, I had to resolve to putImageData() function (is this can be done with drawImage()?) and use it for every pixel! Basically, if image is 250×50, original example have 50 drawings (for every row) and I have 12,500 pixel putting in image data. Needless to say, bigger images will hardly be of any value for this effect with this approach.

Once again, you can see it for yourself and look at the code here.

, , , ,

Wallpaper
I have TFT monitor with 1280×1024 resolution and TV connected in nvidia twin view configuration with TV’s resolution of 800×600. Whenever I want to set up a desktop wallpaper on Gnome, I must adjust it, because Gnome “sees” my desktop as one large 2080×1024 desktop. So, I must manually open wallpaper in Gimp and create another picture that contains two wallpaper next to each other, one with 1280×1024 dimension, and another one, with 800×600 dimensions right of the first one. So, I decided that that’s enough. So I utilized imagemagick to accomplish this and put convinient function in my .bashrc file. Here it is:

make_wallpaper(){
    convert -background white "$1" -resize 1280x1024 \( "$1" -resize 800x600 \) +append "$2";
}

Of course, background color isn’t neccesary since it is not visible, I just put it as a reminder. All I have to do now is to call:

make_wallpaper original.png my.png

Sweet, ain’t it;)

, ,

How often do you use power button to shut down your computer? I never use it, and, even if I would have need to shutdown or restart my computer, I would use GUI way to do it (simply because, it is something that is rarely used, I never remember I could use power button in that split second when I want to shut it down)

But, if you (like me) don’t have keyboards with fancy shortcut buttons, why not use that same power button for some shortcut. Or, you can make fun of your Windows friends just by showing what power and mind-boggling functionality Linux have and just waits for yours ideas to unleash it. I think this is great example of that.

I will use Ubuntu to set it up, but, with minor (or even none) modification, this should work on any distro. First you will need, is to remove annoying gnome log-off screen that shows up when you press power button. For this, we will need to change two keys in gconf. Start gconf-editor and change those two keys:

  • /apps/gnome-power-manager/action_button_power
  • /apps/gnome-power-manager/buttons/power

to “nothing” (without quotes). This will disable log-off screen. Now, it’s all about editing /etc/acpi/powerbtn.sh to suit your needs. I will give you two possible scenarios, and there are no limits what you can do.

Enable/disable internet (forwarding)

I already had two little script to enable or disable internet to some users I am routing internet to. These are some iptables stuff (something like `iptables -I FORWARD -p ALL -s 192.168.0.122 -j DROP`) and I had to open console, execute it and later enable it. This can be done with this in /etc/acpi/powerbtn.sh:

#! /bin/sh
if [ -f /var/tmp/internet_off ]; then
    /etc/rc.start_internet
    rm /var/tmp/internet_off
else
    /etc/rc.stop_internet
    touch /var/tmp/internet_off
fi

This is stupid script. It checks for existence of file /var/tmp/internet_off that signalizes if forwarding is on. It then executes appropriate scripts. If you have someone dumb enough, you can tell them that they have no internet because your computer is turned off, and what they see on monitor is just a picture, or drop them a story about virtual (wau!) machine that run even when computer is off (everyone heard of vmware) – something like that:) You can even confirm this by pressing button in front of them to enable or disable their internet access.

Starting firefox

I use firefox all day. If I ever want to dedicate any button to any program, that is certainly firefox. But to start GUI program in shell script that is run as root, we need some workarounds. For example, you need to set DISPLAY and XAUTHORITY environment variable.

#! /bin/sh
export DISPLAY=:0
export XAUTHORITY=/home/your_username/.Xauthority
sudo -u your_username firefox

But, this script have few defects. If firefox is running, it will launch another windows, and we see ‘yourusername’ is all around. This is improved version:

#! /bin/sh
USERNAME=your_username
export DISPLAY=:0
export XAUTHORITY=/home/$USERNAME/.Xauthority
 
if ps -U $USERNAME -u $USERNAME|grep firefox; then
    sudo -u $USERNAME firefox -new-tab about:blank
else
    sudo -u $USERNAME firefox
fi

If firefox is running, it will just open new empty tab, otherwise it will launch it normally. Also, your username is pulled up as variable, so you just need to change second line to your username and this script will work. Have fun!

Further ideas

Only one function for button is nothing. Maybe we can split two different functionality by defining click and double-click on power button. Simple creating file on first click, and checking if file was created 2 seconds before current time (I will not go into details here). Also, you could use that button to open CD tray, why not:) Like anything in Linux, your creativity is your only limit. Do you have any ideas what to do else with this button? What would you put in /etc/acpi/powerbtn.sh?

, , ,

Увод

Пре него што изнесем рецепт, само да кажем да ово није за људе који се не разумеју добро у Линукс, iptables и apache. Да бисте ово извели код своје куће, потребно је да разумете шта радите, не само преписујете јер, у супротном нећете далеко догурати. Овај текст треба да Вам да генералну идеју и да Вас погура у правом правцу, неће урадити све за Вас. Не покушавам да Вас уплашим, само да скренем пажњу да нисам водио много рачуна о детаљима. Такође, ово је текст о Линуксу који ради као рутер и користи iptables и apache, тако да, ако то немате при руци, можете само да читате, али не и да испробате. Наравно, ако сте гуру, вероватно можете постићи сличне резултате и са другим алатима (поред iptables и apache-а), али сте онда сами на своме. Па да кренемо.

КОРИШЋЕЊЕ

Имате Линукс који ради као рутер, и док неким корисницима желите забранити приступ интернету, желите да им прикажете обавештење о о томе. Или желите да забраните приступ одређеним сајтовима, и, уместо жељеног сајта да прикажете Вашу страну са Вашег сервера о томе како корисник није био добар када је ишао на тај и тај сајт, или да је тај сајт забрањен…Свакакве остале идеје које могу одавде да изникну…

ОСНОВНЕ СТВАРИ

ОК, у згради имамо мали сервер који (углавном) служи као рутер за око 20так комшија који деле нет. Сви скупљамо паре и делимо конекцију. Проблем се јавља када неко не жели интернет за следећи месец, или није ту, или заборави да плати…До сада, имали смо просто решење са iptables алатом – REJECT-уј све пакете и дозволи да прођу само пакети са ИП адреса које су платиле за интернет, које би изгледало некако овако:

iptables -I FORWARD -i ext0 -o ext1 -j DROP
iptables -I FORWARD -p ALL -s 192.168.0.XX -j ACCEPT
iptables -I FORWARD -p ALL -d 192.168.0.XX -j ACCEPT

Онда смо комшија и ја дошли на идеју да онај ко није платио за интернет, када посети неки страну, добије страну на којој пише да није платио и сл. До сада му се интернет прегледач куцао при разрешавању ИП адресе хоста (јер ни DNS пакети нису могли да прођу).

Прва идеја која нам је пала на памет је хаковање нашег DNS сервера, али, иако универзално, ово решење је много зајебано за урадити, није проширљиво, тешко се мења и углавном…срање, тако да сам се одлучио за ово друго, изузетно ефикасно решење изложено даље.

Основна идеја је преусмерити све ХТТП захтеве од корисника који нису платили ка нашем серверу и приказати им једноставну страну обавештења. Решење се може поделити на два дела: део са iptables-има и део са apache-ом. Прво нам треба iptables део.

IPTABLES ДЕО

Проста линија која преусмерава одређеног корисника би била:

iptables -t nat -I PREROUTING -s 192.168.0.XX -p tcp --dport 80 -j REDIRECT --to-ports 3001

Објашњење на брзину је да се сви TCP пакети корисника са ИП адресом 192.168.0.XX који су намењени за порт 80 преусмеравају на порт 3001 нашег сервера. Ту ћемо ставити да наш сервер слуша. Овај, чек мало…па ово не ради! Зашто? Просто, када корисник затражи неку страну, на пример http://www.mozilla.com/en-US/firefox, прво треба разрешити ИП адресу, па се тек онда конектовати, тј. пре него што је иједан пакет за порт 80 послат, прво корисник шаље и прима пакете ка DNS серверу. А, ако имамо (као што је горе написано):

iptables -I FORWARD -i ext0 -o ext1 -j DROP

име хоста не може бити разрешено, па неће бити ни HTTP пакета. Дакле, морамо дозволити DNS пакете тамо и овамо са нечим оваквим:

iptables -I FORWARD -s 192.168.0.XX -p udp --dport 53 -j ACCEPT
iptables -I FORWARD -d 192.168.0.XX -p udp --sport 53 -j ACCEPT
iptables -t nat -I PREROUTING -s 192.168.0.XX -p tcp --dport 80 -j REDIRECT --to-ports 3001

Ово је у неку руку trade-off (српски речено: буџење) јер сада наш корисник није комплетно изолован од интернета – има приступ DNS серверима. ОК, први део са преусмеравањем је готов, сада да наместимо apache.

APACHE ДЕО

Све што треба урадити је направити нови виртуелни хост на apache-у. Иако је наша конфигурација жестоко измењена у односу на конфигурацију по инсталацији, све је било јако просто. Можда код Вас овај рецепт неће радити, али додавање следећих линија на крај httpd.conf-а је све што је било потребно:

Listen 192.168.0.1:3001
Listen 127.0.0.1:3001
NameVirtualHost *:3001
 
    ServerName 
    DocumentRoot /var/www/no_net/
    RewriteEngine On
    RewriteRule   ^.* /index.html

Када сте додали ово на крај, сада само направите нови htdocs корени директоријум (овде је /var/www/no_net/) са index.html-ом који ће садржати обавештење које ћемо приказати корисницима који нису платили интернет. Порт на коме ће овај виртуелни хост слушати (3001) је исти као онај дефинисан код iptables дела. Као што видите, Listen директива је само за localhost и за наш ЛАН, тако да хост није видљив са интернета. Ако погледате пажљиво у VirtualHost директиву, примећите две чудне линије:

RewriteEngine On
RewriteRule   ^.* /index.html

Ове линије раде замену свега у УРЛ-у са “/index.html”. Зашто? Па, хајде да претпоставимо да је наш корисник хтео да оде на сајт http://www.mozilla.com/en-US/firefox/. После тога се преусмерава на порт 3001. Одатле, корисников интернет прегледач тражи /en-US/firefox/ страну која, наравно, не постоји код нас. Најједноставније решење овог проблема је са apache-овим mod_rewrite модулом који ће замењивати све GET захтеве. Друга линија ради управо то – уз помоћ регуларних израза, замењује било шта са “/index.html”. Све што Вам је сада преостало да урадите је да направите фину index.html страну и то је то.

Али, чекај, ово је много просто да би било (geek) фенси. Зато ћемо да зачинимо сад мало са мало Bash магије.

НАПРЕДНЕ СТВАРИ

Пошто је наша мрежа на подмрежи 192.168.0.0/24, имамо 253 могућих ИП адреса и око 20 корисника. Генерално, у скрипти за подешавање iptables-а ћемо морати да поновимо 253-20 пута део:

iptables -I FORWARD -s 192.168.0.XX -p udp --dport 53 -j ACCEPT
iptables -I FORWARD -d 192.168.0.XX -p udp --sport 53 -j ACCEPT
iptables -t nat -I PREROUTING -s 192.168.0.XX -p tcp --dport 80 -j REDIRECT --to-ports 3001

и 20 пута део:

iptables -I FORWARD -p ALL -s 192.168.0.XX -j ACCEPT
iptables -I FORWARD -p ALL -d 192.168.0.XX -j ACCEPT

Хух…Или да унајмимо црнца или да научимо Bash.
Дакле, ево како сам то извео. Ово није никакво елеганци решење, али ће Вам дати идеју. Направите фајл /etc/allowed_ips и, у њему, ставите последње октете ИП адреса које имају интернет – један октет по линији. Дакле, ако 192.168.0.12 и 192.168.0.34 имају интернет, овај фајл би изгледао овако некако:

1
12
34

Наша подмрежа има фиксне адресе, и због једноставности, не пишемо целу ИП адресу (зато само последњи октет). Такође, приметите да је у овом фајлу наведен и сâм сервер (који има адресу 192.168.0.1). Сада, направите скрипту ip_allowing (ставите је где год Вам је згодно) са следећим садржајем:

#!/bin/bash
 
FILE=/etc/allowed_ips
ip_listing=`cat $FILE`
 
function check_exist {
    for i in $ip_listing; do
        if [ ${i:0:1} != "#" ]; then
            if [ "$i" = "$1" ]; then
                return 1
            fi
        fi
    done
    return 0
}
 
for ip in `seq 1 254`; do
    check_exist $ip
    if [ $? -eq 1 ]; then
        #ip exist
        iptables -I FORWARD -p ALL -s 192.168.0.$ip -j ACCEPT
        iptables -I FORWARD -p ALL -d 192.168.0.$ip -j ACCEPT
        echo allowing 192.168.0.$ip
    else
        #ip doesn't exist
        iptables -I FORWARD -s 192.168.0.$ip -p udp --dport 53 -j ACCEPT
        iptables -I FORWARD -d 192.168.0.$ip -p udp --sport 53 -j ACCEPT iptables -t nat -I PREROUTING -s 192.168.0.$ip -p tcp --dport 80 -j REDIRECT --to-ports 3001
    fi
done

Нема овде никакве вуду магије. Функција check_exist узима број (последњи октет) као први аргумент и проверава да је треба пустити ту ИП адресу и враћа 1 ако је у листингу, 0 ако није. Главни део иде у петљи од 1 до 254 и, или дозвољава приступ DNS серверима и ради преусмеравање, или дозвољава све пакете. Ако сте загледали, можда сте приметили линију:

if [ ${i:0:1} != "#" ]; then

Овом линијом смо дозволили да имамо (нешто што личи на) коментаре у нашем /etc/allowed_ips фајлу и да их игноришемо, тако да овај фајл сад може изгледати нпр. овако:

#server
1
#pera
12
#zika
34

Згодно, зар не. Све што нам је сада остало је да позовемо нашу скрипту (и да јој дамо exec привилегије, али то знате, иначе не бисте читали довде) одакле год да подешавате Ваше iptables-е. Пример би био:

iptables -I FORWARD -i ext0 -o ext1 -j DROP
/etc/rc.d/ip_allowing

Шта даље?

Као прво, ово је просто решење. Има две мане, а то су: корисници имају приступ DNS серверу и друга, ако корисник затражи непостојећу адресу (нпр. www.blabla-tucmuc-nemaovog.com), добиће страну у интернет прегледачу да она не постоји, тј. наше обавештење ће добити само ако је разрешавање успело. Ово су ситнице преко којих ја могу да прођем, а ако Ви не можете – решење лежи у подешавању DNS сервиса на серверу.
Осим ових мана, има много ствари које се могу унапредити. На пример, можда желите да забрањујете кориснике по MAC адреси, не по ИП адресама. Или, ако имате већу subnet маску, ово може бити споро, па треба размислити о томе да Ваше iptables команде раде са ИП опсезима. Или, можда желите да вучете дозвољене ИП адресе из неког другог извора, нпр. LDAP-а или MySQL-а, а не из фајла. Такође, уз избацивање одређених ствари, можете преусмерити кориснике само када траже одређени сајт, тако што би се у iptables команди користила и одредишна ИП адреса (-d), не само изворна. Што се тиче apache дела, приметите да је rewrite директива код виртуелног хоста гладна, тј. гута све и замењује у једну ствар. Ово нам не дозвољава да имамо више страна на том хосту. Ако бисте желели да имате две стране (на пример, index.html и contact.html), морали бисте да се играте са регуларним изразима и да замењујете било шта осим “/contact.html” у /index.html.

Могућности су неограничене. као и са свим у вези Линукса. Само треба да знате шта хоћете и како да то урадите – simple as that.

, , , , ,

Е, да сам јуче умро, не бих знао. Па јел то GCC много кул or what:)

Радим једно програмче и убијам се да провалим зашто ми “step over” у debug-у скакуће горе-доле по линијама кода, тотално хаотично, збуњујући ме и исписујући погрешне вредности…Кад, оно, ја укључио оптимизацију (и то ону -O2)…Ево и исечка из документације:

Unlike most other C compilers, GCC allows you to use -g with -O. The shortcuts taken by optimized code may occasionally
produce surprising results: some variables you declared may not exist at all; flow of control may briefly move where you
did not expect it; some statements may not be executed because they compute constant results or their values were already
at hand; some statements may execute in different places because they were moved out of loops.

, , ,

KDE and Cyrillic filenames

I just found out what I have been looking for a long time now – how to setup KDE to show Cyrillic filenames on ext2/ext3 partitions. As I later found out (in hard way) it has nothing to do with filesystem itself, e.g. ext2/ext3 partitions support UTF-8 – problem was in KDE (e.g. Linux) setup. One has to set locale, e.g. just put these few lines in your profile.d (at my slack it is in /etc/profile.d/), make new script in it and type this:

#!/bin/sh
 
LANG=en_US.UTF-8
LANGUAGE=$LANG
LC_ALL=$LANG
 
export LC_ALL LANGUAGE LANG

Although my KDE is in Cyrillic and my locale should be Serbian (sr_CS.UTF-8), I still used en_US (it doesn’t matter for KDE, it uses its own locale setup, this is only for terminal locale), the thing that matter in this script is that you should tell every program that you use UTF-8. Just login again and try to rename any file – it should be working now.

Although my KDE is in Cyrillic and my locale should be Serbian (sr_CS.UTF-8), I still used en_US (it doesn’t matter for KDE, it uses its own locale setup, this is only for terminal locale), the thing that matter in this script is that you should tell every program that you use UTF-8. Just login again and try to rename any file – it should be working now.
, ,