Irina’s Weblog

9/8/2022

JVM in action

Filed under: Computers — Izida @ 10:22 pm

A visualization I have prepared today for our weekly team knowledge sharing session. Displayed is the Java Virtual Machine as it executes the code of a simple sum() function. I have used the javap disassembler to generate the readable bytecode instructions which are highlighted with the current instruction pointer.


The Local Variables contains the function arguments and all local variables declared in the function. Since the function is not static, the first argument is “this”.
The JVM is a stack-oriented abstract machine – if an instruction needs an input, this input should be put on the Operand Stack before calling the instruction itself.
Each JVM instruction is a single byte. For example, iload_0 means “load local variable with index 0 as int in the Operand Stack”. So the “i” in the “iload_0” means “int”. This instruction is part of a group of int operations: iload_0, iload_1, iload_2, iload_3 for which you don’t need to supply an index as it is part of the instruction itself. When you need to access Local Variable with index more than 3, you need to use the generic iload instruction and supply the index as a second byte that follows the byte of the instruction. JVM provides also lload, fload, dload, aload for the other primitive types. Each of these operations has additional 4 instructions for manipulation of the first 4 Local Variables as iload does.

Big thanks to Alexander Shopov for his inspiring presentations: https://lnkd.in/dYpgkKfK & https://lnkd.in/dZQy8S5H

8/8/2022

Brain Modes and Pair Programming

Filed under: Computers — Izida @ 8:18 pm

Pair Programming is a famous XP technique with both devoted supporters and strong opposers. It is also quite well known. Still recently I read in the book “Pragmatic Thinking and Learning” an interesting opinion from the author what exactly are the biggest pluses of Pair Programming:

Our brain can be in one of two modes: linear (logical, verbal, conscious) and rich (intuitive, non-verbal, unconscious). While writing code we are verbal, thus forcing our brain to enter linear mode. Unfortunately, this brings a serious disadvantage – since rich mode is off, and rich mode is responsible for creativity, we loose the chance to come up with the most original and beautiful ideas. That is why we need to regularly step away from the keyboard to be able to process the problem from another perspective. What I usually do is to prepare myself a cup of herbal tea, go on the terrace, take a walk outside, or even, with home office, do some laundry. When one does something routine, the linear brain mode seems to get bored and switches off. Then the subconscious processing of your problem starts. When you go back to the keyboard after a while, the solutions is present without you having searched intentionally for it.

Pair Programming allows us to eliminate the need of such breaks since there is a second programmer next to us. He is free from writing code, from verbality, so his mind is able to turn on its rich mode. This way he is able to see the big picture, to search for patterns, to identify repetitions. Instead of a single programmer switching between linear and rich brain mode, there are now two programmers working one in linear, another in rich mode. The two complement each other. We have both brain modes simultaneously instead of sequentially.

The Driver drives the car and stays focused, the Navigator looks at the whole picture and offers suggestions and advice.

8/9/2017

Java: JVM 8 Memory Model

Filed under: Computers — Izida @ 2:28 pm

During investigation of chapter 2.5 Run-Time Data Areas of “The Java® Virtual Machine Specification, Java SE 8 Edition”, I created the following Mind map to help myself visualize the types of areas in the JVM memory. Click on thumbnail to see the full image.

JVM 8 Memory Model

Any comments are welcome.

Mind map created with FreeMind.

24/7/2017

Under the hood: assert in Java

Filed under: Daily — Izida @ 6:12 pm

How does pre-Java8 compilers/JVMs handle assert? It is not a function, it is a keyword instead, and has a special semantics of executing its test only if asserts are allowed in the JVM (JVM flag “-ea”).

My goal is to create a simple Java assertFunc() method, which like the assert keyword acts only when the -ea flag of the JVM is set, generates the same error when assertion fails and does nothing in case the assertion are disabled at runtime.

First let’s analyze what Java bytecode is generated when asserts are used. The following simple Java class would suffice our needs:

The System.out’s are there to show the deferred execution of the message concatenation – the second getMax() is only called if the condition of the assert fails (for test – change i to 1). If you run the program with “-ea” VM flag, only then the code for the assert (and the calculation of its arguments) gets executed.

What happens under the hood can be understood by looking at the decompiled byte code:

Here we see that once the compiler sees the “assert” keyword in a class, it generates a static final boolean field (“$assertionsDisabled”) which holds the negated value of Class.desiredAssertionStatus() method call.

How is this field used? We need to look at the main() method itself:

The main() starts with the assertion flag check – if assertions are disabled (flag is true), a jump (instruction 6) is made to the line just after the assert statement, this way skipping the test. The statement after the assert in this case is the return statement (instruction 45). If assertions are enabled, the getMax() function is called and the test gets executed. If the test fails, a java.lang.AssertionError with the given message is created and thrown, calling getMax() for the second time.

A possible Java 8 equivalent is:

I have introduced lambdas for the parameters of the assertFunc to take advantage of the deferred execution. If I simply expected a boolean and a string as parameters to the function assertFunc(), they would always get calculated – even if the asserts were disabled.

Conclusion: Assertions in Java are always present in the bytecode (.class file) and modify the structure of the classes that use them.

26/6/2017

find-sec-bugs & redirect warnings

Filed under: Computers — Izida @ 5:10 pm

A colleague asked me why is SonarQube complaining about HttpServletResponse redirects so much. It seems to come from FindSecBugs plugin for FindBugs. In the description Unvalidated Redirect) the explanation is the following:

Unvalidated redirects occur when an application redirects a user to a destination URL specified by a user supplied parameter that is not validated. Such vulnerabilities can be used to facilitate phishing attacks.

This is the famous “Unvalidated Redirects and Forwards” OWASP Top 10 vulnerability.

But the issue is that the code in mention was making a simple redirect to a path defined in class level a constant – no variables were ever added to the URL. Definitely a false-positive. The question was: how to re-write the code for Sonar to stop complaining?

First thing to do: check the proposed solutions.

Solution/Countermeasures:
– Don’t accept redirection destinations from users
– Accept a destination key, and use it to look up the target (legal) destination
– Accept only relative paths
– White list URLs (if possible)
– Validate that the beginning of the URL is part of a white list

I realized some of the solutions (like white-listing) are a bit too much for a static analyzer to check. The following crossed my mind: security issues are too important so maybe the creators of find-sec-bugs have decided to mark ALL redirects as vulnerabilities in order for the code author to check all of them with care and mark the false positives.

Next step: Check the implementation, which in our case is class find-sec-bugs/plugin/src/main/java/com/h3xstream/findsecbugs/injection/redirect/RedirectionSource.java

My guess was correct! All redirects are marked as vulnerabilities, as well as all additions of “Location” headers.

So only option for now – manual ignore with comment.

It seems there is a long-going discussion on the topic in their issue tracker: “findsecbugs:UNVALIDATED_REDIRECT and context path”

20/2/2017

Throwing Java checked exception, not declared in the method declaration

Filed under: Computers — Izida @ 5:49 pm

As I was browsing through JVM 8.0 Specification, I saw the following in chapter 4.7.5. The Exceptions Attribute:

A method should throw an exception only if at least one of the following three criteria is met:

  1. The exception is an instance of RuntimeException or one of its subclasses.
  2. The exception is an instance of Error or one of its subclasses.
  3. The exception is an instance of one of the exception classes specified in the exception_index_table just described, or one of their subclasses.(Irina’s note: it is listed in the “throws” clause of the method)

These requirements are not enforced in the Java Virtual Machine; they are enforced only at compile time.

I decided to check how would Oracle’s JVM act in case a method throws checked exception, not listed in the “throws” clause. What I needed was a method that throws one checked exception like this:

import java.io.IOException;
public class ThrowsTest {
public void f(int a) throws IOException {
if (a < 0) throw new IOException(); } public static void main(String[] args) throws NumberFormatException, IOException { new ThrowsTest().f(Integer.valueOf(args[0])); } }

After compiling at the command line with "javac ThrowsTest.java", one could easily test that negative command-line argument causes an IOException:

>java ThrowsTest -2
Exception in thread "main" java.io.IOException
at ThrowsTest.f(ThrowsTest.java:7)
at ThrowsTest.main(ThrowsTest.java:17)

What I would try to do is replace in the class file the construction of java.io.IOException with another checked exception - for example, java.lang.Exception, without updating the "throws" clause, and check if the JVM really throws it. To do so it would be easier if I simply change the bytes in the class file to point to an exception, which is already known to the class file. I.e. it is part of the Static Pool of the class. I am adding another method:
public void g(int a, int b) throws Exception {
if (a + b < 0) { throw new Exception(); } }

The key here is to have exactly the same exception constructor - in this case, I have chosen one with zero parameters.

I could simply open the ThrowsTest.class in a HEX editor. To identify the method I used also a helper tool: Java Class File Editor. In it I was able to inspect the correct indexes of the old exception and the new exception in the Constant Pool:

Byte Code Analysis

Then I looked at the Byte code of the method. It is located in an Attribute with name "Code" for the method void (int):
Method

It is visible that the "new" instruction creates an instance of java.io.IOException (index 2 in the Constant Pool above) , and "invokespecial" finishes the construction by calling the constructor (index 3 in the Constant Pool above). That are the two values I need to change. The new values should be java.lang.Exception with index 4 and the constructor ()V with index 5. To identify the location in the binary file, I opened it in HEX and found the first occurrence of "invocespecial" - bytecode b7. Right after it the value was 3, now changed to 5. Two instructions back is the "new" instruction with operand 2, now changed to 4:

Byte Code - modified

When I now run the same test, I have the following result:

>java ThrowsTest -2
Exception in thread "main" java.lang.Exception
at ThrowsTest.f(ThrowsTest.java:7)
at ThrowsTest.main(ThrowsTest.java:17)

Decompilation of the class with CFR - another java decompiler shows the following non-compilable code:
/*
* Decompiled with CFR 0_119.
*/
import java.io.IOException;
public class ThrowsTest {
public void f(int n) throws IOException {
if (n < 0) { throw new Exception(); } } public void g(int n, int n2) throws Exception { if (n + n2 < 0) { throw new Exception(); } } public static void main(String[] arrstring) throws NumberFormatException, IOException { new ThrowsTest().f(Integer.valueOf(arrstring[0])); } }

So indeed Oracle's JVM did allow an inconsistent class to run - it throws checked exception not listed in its "Exceptions" attribute of the method.

21/9/2011

Електронните учебници на Просвета

Filed under: Books,Computers,Граждански — Izida @ 5:41 pm

Докато преглеждах сайта на Просвета попаднах на следното:

За пръв път в България Prosveta Libri Magici – учебниците на бъдещето!

Изгледах клипчето, прегледах примерните уроци по Математика и Български език. Интересно е, увлекателно е, има филмчета и звуци. Но ме подразниха няколко изказвания от клипа:

  • “Тебеширите, черната дъска, огромните прашни карти и дебели атласи остават в миналото!”
  • “… друго основно предимство: освобождава учителя от необходимостта непрекъснато да търси и осигурява допълнителни материали, да се грижи за набавянето на информация. Всичко, от което се нуждае, е събрано в интерактивния учебник, който може да се допълва и обновява много по-лесно и бързо от традиционното издание на хартиен носител.”

По отношение на аргумента за премахването на черната дъска ще цитирам сентенция от сайта на Просвета:

Човек запомня ………
10 % от това, което чете;
20 % от това, което чува;
30 % от това, което вижда;
50 % от това, което чува и вижда;
70 % от това, което казва;
90 % от това, което казва и прави.

Съвсем друго е като ученик се изправи пред черната дъска и реши някаква задача – попада в последните 90%, защото го прави сам. А и както самите Просвета твърдят – електронният учебник не замества класическия, а го допълва. Така според мен и интерактивната дъска не замества “черната”, а отново само я допълва.

По отношение на “основното предимство” коментарът е излишен.

8/6/2011

Sting’s concert stinks!*

Filed under: Daily — Izida @ 3:55 pm

TicketPro и Sofia Music Enterprises (SME) дружно се погрижиха да не усетя нищо позитивно на концерта вчера! Бях си купила билет за 150 лв още през февруари за да си осигуря добро място – 5ти сектор, 1во място до централната пътека в седящите места на терена, като секторът бе разположен пред пулта за управление с цел да не ми пречи на гледката. На място обаче видяхме, че всъщност пултът е наместен точно между пети и шести сектор вместо между следващите два по-задни сектора. В следствие на това аз не бях на централната пътека срещу центъра на сцената, а доста вляво.

Може би щях да преглътна това. Но … от началото, до самия край, бях оградена от правостоящи. Играх си на пъдар няколко пъти – да напомням на наредилите се пред мен, че не съм платила да гледам тях. Потърсихме охраната. Този до пулта обясни, че пази само пулта и не сме му в сектора. След което се скри. Друг едвам намерих! Трябваше да ида назад чак на края на секторите за седящи на терена за да се добера до двама, които контролираха входа към тази зона. Човекът вдигна рамене : “Аз как да ги накарам да седнат? Сигурно си търсят местата”. Реално на терена при седалките нямаше никакви охранители. Как не ги намериха тези места през цялото време! Но не са виновни – тарикати има навсякъде. За това и всяко стадо има нужда от овчарски кучета и като ги няма става хаос. Аз съм си платила за да ми осигурят определена емоция и да не позволяват на другите да ми пречат. Но това не бе изпълнено. Била съм на достатъчно концерти. И друг път съм била седяща на терена. За пример давам концерта на Сър Елтън Джон – оставиха правостоящите да повдигнат духа на изпълнителите за една-две песни, след което излязоха едни едри охранители и за минута изчистиха пътеките и всички си седнаха кротко по местата. Станахме прави всички дружно чак накрая за да аплодираме последните изпълнения.

Мисля да си искам парите обратно.

*В превод: Концертът на Стинг вони!

26/3/2011

Рекламно

Filed under: Humor — Izida @ 6:16 pm

За щастлив край!

Закриваща фраза в рекламата на Панадол за бебета и малки деца. Доста време мина преди да го свържа с това, че рекламата започва с “Имало едно време…”

Друг интересен цитат за мен е рекламата на Каменица:

… С нова безопасна капачка!

А аз си мислех, че бирата е за мъжаги – “безопасна капачка” звучи като за женчовци.

1/11/2010

За числата и цифрите

Filed under: Books — Izida @ 1:04 pm

Замисляли ли сте се, че цифрите са изобретени много след като хората започват за използват числа? Спомнете си римските числа – там има символи за 1, 5, 10, 50, 100, 500, 1000. Така че колкото по-големи числа им трябват, толкова повече нови символи се налагало да въвеждат за тяхното означаване. Докато ние с нашите 10 цифри и позиционна система можем да опишем произволни числа. Или обобщено: числата обозначават количества, цифрите съставляват самите числа. Повече в книжката: “Математиката: диалог с дъщеря ми”.

Препоръчвам ви да разгледате и другите малки книжки от тази поредица – например “Европа да се запознаем” и “Средновековието. Как да го обясним на децата”. Последните две са написани от именития медиевист Жак Льо Гоф, с който лично аз се запознах от есетата му за Средновековието и историята на средновековна Европа. Но в тези малки книжки той отговаря на някои много важни и основни въпроси, които понякога прескачаме, дълбаейки в детайли. Точно чрез неговото име попаднах на тази поредица малки книжки – удивително е как големите умове успяват да синтезират толкова знание в малко страници!

28/10/2010

Лекарска тайна 3

Filed under: Граждански — Izida @ 3:54 pm

От почти три години (Лекарска тайна 1, Лекарска тайна 2) се чудя как така лекарите дават толкова информация за състояние на пациенти пред медиите.

Ето, че и съпругата на Христо Мутафчиев възразява срещу тази практика : bTV: Елица Мутафчиева: Не желая никой да дава информация за състоянието на Христо

Според мен обаче се е насочила в грешна посока – просто да подаде жалби с конкретни имена на доктори, които са общували с медиите. Тя и без това ги е изброила. Не са виновни медиите, че питат, нито обществото, че иска хляб и зрелища. А докторите, че си позволяват да дават лична здравословна информация без разрешение! В цял свят това е строго пазена тайна, тук слушаме постоянно навсякъде за поредния случай в детайли.

26/9/2010

Луксът да боледуваш

Filed under: Daily — Izida @ 9:59 pm

Достатъчно е да си гледал реклами последните няколко години за да си наясно, че естествената храна е лукс. Магазините са пълни с какви ли не храни, но по етикетите им обикновено е изброена менделеевата таблица.

Напоследък се замислям, че да изкараш един обикновен вирус естествено също е лукс! Всяка реклама на лекарство обяснява как не можем да си позволим да отсъстваме от работа, не можем да останем няколко дни на легло.

Кога стигнахме до тук?

21/9/2010

Пазаруване от Великобритания

Filed under: Daily — Izida @ 12:42 pm

Обичам да пазарувам от Великобритания! Преди време се зарадвах, че Amazon.co.uk вече доставя не само книги и дискове до България. Наскоро обаче открих начин да пазарувам и от други магазини във Великобритания, които нямат доставка до нашата страна. И я тествах – сега държа първия си пакет, получен чрез услугата за закупуване на стоки от UK на Еконт Експрес, част от кампанията им “Да изкупим Британия”. Поръчах си стоки от английски онлайн магазин, платих с личната си кредитна карта, за адрес на доставка дадох адреса на техния офис в Лондон. Те ме уведомиха веднага щом стоките пристигнаха, изчислиха ми цената за доставката и ми ги пратиха към България.

При следващите разпродажби смятам да се възползвам отново!

P.S. По отношение на алтернативни превозвачи, предлагащи ниски цени – нямам доверие на коя да е фирма. Искам професионален куриер с опция за онлайн проследяване. Все пак говорим за моте пари тук, които вече са били дадени на търговеца. Дори не съм наясно законни ли са услугите, предоставяни от тях и какви права бих имала ако нещо се обърка.

13/9/2010

Кити се намери

Filed under: Daily,Граждански — Izida @ 10:47 am

След като в събота успях и аз да се включа лично в търсенето, котето най-накрая се обади! Оказа се две къщи по-надолу от тази, в която бе настанено, в едно изоставено мазе. Тъкмо щях да се откажа и да си ходя след около час безуспешно обикаляне и приканване, когато Кити най-накрая реши да измяука и да ни позволи да я хванем.

Сега е при ветеринаря за няколко дни надзор. Ето в какъв вид се е крила две и половина денонощия навън:

Kitty 3
Kitty 4

10/9/2010

София, ж.к. Бъкстон: издирва се току що оперирано коте

Filed under: Граждански — Izida @ 8:52 am

Котето се намери. Благодаря на всички заинтересували се!

Котето в беда, което си търси дом, реши да го търси само. Буквално!

Операцията в сряда мина успешно, котката получи своя приемен дом, в който да се възстанови. Взехме я вечерта след операцията – посрещна ни замаяна, с обръснато бедро, дълъг шев на него, и яка на главата за да не стига раната и да не я ближе.

За съжаление обаче, на следващата сутрин (т.е. вчера), котката успяла да избяга от приемния дом в ж.к. “Бъкстон”, София.

Моля ако някой от вас забележи котка с медицинска яка и шев на крака, да пише тук или да звънне на сдружение “На ти с природата” – телефонът им го има на страницата с контактите. Животното има нужда от антибиотици.

7/9/2010

Коте в беда си търси дом

Filed under: Граждански — Izida @ 5:52 pm

Днес сутринта случайно попаднах на малко коте в безпомощно състояние, свито до гумата на една кола. Благодарение на сдружение “На Ти с природата” получих контакти на ветеринарни клиники, в които могат да се погрижат за него. Консултацията показа счупване на дясната бедрена кост. Това изправя котето пред неизбежна операция, която ще бъде извършена утре по обяд. Днес следобед го оставих в клиниката където ще се грижат за него до утре. Средства за операцията са осигурени. Според хирурга котето има отлични шансове за пълно възстановяване – и поради възрастта си, и поради “късмета” типа на травмата да не е особено сериозен.

Котето е оцеляло въпреки травмата си, освен това успя да се справи и с нападение на две едри улични кучета (които го бяха намерили докато аз организирам помощ). Което означаваше, че после аз и една служителка в банка дружно го измъквахме от пространството между акумулатора и двигателя на един автомобил. За щастие, собственичката на автомобила бе наблизо и помогна да издирим мъника. Както виждате борец е, младо е, женско. И спешно има нужда от стопани.

Ако някой от вас има възможност – нека пише тук или на електронната ми поща (blog <at> marudina.net).

Kitty 1
Kitty 2

19/8/2010

Неправомерно искане на лична карта на упълномощител при приемане на колет

Filed under: Права на потребителите — Izida @ 8:52 am

Днес попаднах на следната статия :

КРС срещу Български пощи 1:0

Трябва да призная, че и аз много се изненадах на Български пощи когато преди време поръчах мои книги на адрес на приятел и за да ги взема ми искаха неговата лична карта въпреки написаното на бележката пълномощно и представянето на моята лична карта. Все пак не е редно аз да разнасям чужд документ за самоличност! После си казах : И все пак ако не искат личната карта на оригиналния получател, всеки, който намери бележката за колета на пода пред входа (случва се), може да попълни отзад пълномощно до себе си и да вземе колета ми.”
Като се обаче замисля, всеки, който взима колет, представя лична карта. Така че ако някой се опита да вземе моя пратка, ще трябва да бъде записан като приел пакета в пощата и да се подпише. И ако аз след време потърся колета, ще има точен запис кой го е взел. Оттук нататък полицията може да си свърши работата.

4/8/2010

Услуга срещу услуга

Filed under: Daily — Izida @ 3:09 pm

Много съм се чудила над очевидната разлика в качеството на обслужването в България спрямо страните от Западна Европа. И при нас се намират сервитьори-професионалисти, които се стараят да ти е комфортно, и продавач-консултанти, за които работата им не се изчерпва с това да ти сложат кутията със стоката в количката.

Започвам да вярвам, че проблемът е в мисленето и дори – в езика ни. Англичаните например имат думата “service” за услуга в смисъла на обслужване – например търговска услуга, ресторантьорска услуга, и думата “favour” като услуга в смисъла на “правя някому услуга от добро сърце”. За нас думата и в двата случая е една – услуга. Така че ако аз си купя услуга “хранене в ресторант”, излиза, че имам право на маса, стол и храна. А сервитьорът просто ми върши услуга…

1/7/2010

Дознание за убийство на куче – вече и в България

Filed under: Граждански — Izida @ 1:17 pm

Според новина на сайта на фондация “На ТИ с природата” сме свидетели на първото в България образувано дознание за убийство на куче. Престъплението е по чл.325 ал.1 от НК – хулиганство. За разлика от други случаи, потресли обществото, този е срещу конкретен извършител – 24 годишен мъж от Шумен, който пребил до смърт бездомно куче пред жилищен блок, пред очите на деца и майки.

Ако Николай Каменов-Коко стигне до съд и бъде признат за виновен по този член чл.325 ал.1 от НК, може да отнесе затвор до 2 години, пробация или обществено порицание.

30/6/2010

Публични статистики за фирмите, предоставящи шофьорски курсове

Filed under: Граждански — Izida @ 3:30 pm

Винаги съм била убедена, че най-правилният начин да избереш услуга/стока е като сравниш алтернативи на база показатели, важни за теб – в електронна таблица или на лист хартия.

По отношение на фирмите, предоставящи шофьорски курсове, основен показател за мен би бил не цената, която е публично обявена обикновено, а статистика каква е успеваемостта при изпитите за придобиване на книжка за всяка от фирмите. Т.е. интересува ме процента от курсистите, които успяват да вземат книжка от първо явяване на изпит, съответно – от второ, колко не взимат книжка в тази фирма изобщо (което ще рече, че са се отказали или са сменили фирмата).

За съжаление не намирам подобна информация.

Чудех се, не може ли Изпълнителна агенция “Автомобилна администрация” да предостави подобна публична информация?

Next Page »
п»ї