?

Log in

(This article was originally published at Blog - Alex Polozov. See Say no to source-controlled credentials: .NET + RSA encryption for more comments and better formatting.)

Let’s start with an axiom: you should never store any credentials in your source code in plain text, especially if the codebase is source-controlled. If you are doing it, there’s something seriously wrong with your architecture.1

Here’s one possible solution to this problem. Presumably you already have an OpenSSH pair of public/private keys. It will serve us nicely in this case:

  1. Generate a PEM version of your OpenSSH public key:

    $ openssl rsa -in ~/.ssh/id_rsa -pubout > ~/.ssh/id_rsa.pub.pem
    Enter pass phrase for ~/.ssh/id_rsa:
    writing RSA key
    

  2. Write your password in a plaintext file (say, admin_pass), and encrypt it (say, into admin_pass.enc):2

    cat admin_pass | openssl rsautl -encrypt -pubin -inkey ~/.ssh/id_rsa.pub.pem > admin_pass.enc
    

  3. Delete admin_pass from your hard drive.3

The resulting admin_pass.enc can be safely checked into the repository: one needs access to your private key in order to decrypt it:

cat admin_pass.enc | openssl rsautl -decrypt -inkey ~/.ssh/id_rsa

However, you probably don’t want to do even that. The best policy is to decrypt the credentials directly in your app, securely and in-memory. Presumably your favorite programming language/platform has some API for securely-stored memory objects (usually backed by the OS/hardware cryptography system). I am going to show an implementation for .NET below.

First, in order to use the OpenSSH keys in .NET infrastructure, we need to convert them both to PEM, and also generate the corresponding certificate and the PFX file. Here’s the process using my website and email as an example for the generated certificate (the exact values are not really important for our intended purpose):

$ openssl rsa -in ~/.ssh/id_rsa > ~/.ssh/id_rsa.pem
Enter pass phrase for ~/.ssh/id_rsa:
writing RSA key

$ openssl req -nodes -x509 -days 3650 -subj '/CN=www.alexpolozov.com/emailAddress=polozov@cs.washington.edu' -new -key ~/.ssh/id_rsa.pem -out ~/.ssh/certificate.crt

$ openssl pkcs12 -export -out ~/.ssh/certificate.pfx -inkey ~/.ssh/id_rsa.pem -in ~/.ssh/certificate.crt

Now let’s use this certificate to decrypt the password in C#:

public static SecureString DecryptCredentials(string certificateFile, SecureString pkPassphrase, 
                                              string encryptedFile) {
    string home = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
    string sshDir = Path.Combine(home, ".ssh");
    var cert = new X509Certificate2(Path.Combine(sshDir, certificateFile), pkPassphrase, 
                                    X509KeyStorageFlags.Exportable);
    using (var rsa = cert.PrivateKey as RSACryptoServiceProvider)
    using (var credentialStream = new FileStream(encryptedFile, FileMode.Open))
    using (var encrypted = new MemoryStream()) {
        credentialStream.CopyTo(encrypted);
        // Unfortunately, RSACryptoServiceProvider does not have a Decrypt() overload that
        // returns a SecureString (no idea why). Because of that, we have to store the decrypted
        // data briefly in a garbage-collected memory, and manually convert it into a secure 
        // representation as soon as possible.
        byte[] bytes = rsa.Decrypt(encrypted.ToArray(), false);
        var result = new SecureString();
        foreach (char c in Encoding.ASCII.GetChars(decrypted))
            result.AppendChar(c);
        GC.Collect();  // get rid of the decrypted bytes array
        return result;
    }
}

DecryptCredentials("certificate.pfx", Utils.SecurePrompt(), "admin_pass.enc");

The code uses a simple SecurePrompt function, which prompts the user for the SSH passphrase, encrypting one character at a time in a SecureString:

public static SecureString SecurePrompt(string prompt = "> ") {
    Console.Write(prompt);
    var password = new SecureString();
    while (true) {
        var input = Console.ReadKey(true);
        switch (input.Key) {
            case ConsoleKey.Enter:
                Console.WriteLine();
                return password;
            case ConsoleKey.Backspace:
                if (password.Length > 0) {
                    password.RemoveAt(password.Length - 1);
                    Console.Write("\b \b");
                }
                break;
            default:
                password.AppendChar(input.KeyChar);
                Console.Write("*");
                break;
        }
    }
}

  1. And with your undergraduate CS Security class, but I digress.
  2. rsautl has a maximum size limit on the data being encrypted, since it applies the RSA algorithm directly (as opposed to, say, AES). The limit is roughly equal to “[your key size] - [padding]”, which for common key sizes gives 200-400 bytes. Hopefully your password is pretty long, but it probably is not that long ☺
  3. Alternatively, you could avoid creating it in the first place, and simply cat the password from stdin.
Оригинал взят у leonwolf в Подробно про казус Фейсбука и "согласованные акции". Далее следует текст оригинала — для всех моих московских друзей.

Я создал ФБ-ивент "Народный сход для обсуждения приговора Алексею и Олегу Навальным" около 19.00 мск в пятницу, потратив на это примерно три минуты своего времени; ровно 24 часа спустя Фейсбук заблокировал этот ивент для всех пользователей, указавших Россию в качестве своего места жительства. На тот момент в ивенте было более 12500 отметок "я пойду" и свыше 60 тысяч приглашений было разослано. Мне, единственному администратору страницы мероприятия, никто не звонил, не писал, не предлагал каким-либо образом отредактировать контент - группу просто молча выпилили и все. Фейсбук сделал это на основании предписания Роскомнадзора, а тот, в свою очередь, выполнил предписание Генпрокуратуры, вынесенное в порядке, предусмотренном ублюдочным "законом Лугового", позволяющим Генпрокуратуре во внесудебном порядке блокировать сайты, призывающие, в том числе, "к массовым мероприятиям, проводящимся в нарушение установленного порядка", а, проще говоря, к несогласованным митингам.

Через пару часов после блокировки моего ивента стали возникать другие, и один из них - вот этот - собрал почти 15000 отметок "я пойду" за первые 16 часов - скорость роста в два раза больше, чем у первого ивента. Таким образом, Генпрокуратура, РКН и ФБ своими действиями нам явно помогли, еще раз доказав действенность эффекта Стрейзанд.

Испытывая чувство глубокой благодарности к ним всем в связи с этим, мы, однако, ни на секунду не вправе забывать о незаконности их действий. По российскому законодательству, уведомлять муниципальные органы власти о месте и времени проведения публичной акции (в форме митинга, шествия, пикетирования etc) необходимо не позднее чем за 10, но не ранее, чем за 15 дней до планируемой даты ее проведения. Таким образом, если бы мы хотели согласовать проведение народного схода 15.01.15, мы должны были бы обратиться в московскую мэрию в один из дней с 1 по 5 января. Если бы мы этого не сделали, или если бы мэрия не дала бы согласования, то, начиная с 6 января, наша акция была бы несогласованной и, хотя "закон Лугового" и антиконституционен, он мог бы к ней применяться в нынешнем исковерканном правовом поле Российской Федерации. До 6 января категория "согласованности" в отношении мероприятия, запланированного на 15 января, просто не применима. Оно не является согласованным, оно не является несогласованным, говорить о его "согласованности" - не больше смысла, чем говорить о характере не зачатого ребенка.

В сухом остатке: Генпрокуратура отдает, а РКН и ФБ исполняют, заведомо незаконные распоряжения (кто-то еще способен этому удивляться?). Работа с ФБ по разъяснению вышеуказанных тонкостей российского законодательства ведется через посредство общих друзей в ИТ-коммьюнити на самом высоком уровне. Посмотрим, сколько проживет новый ивент, а пока что - все записывайтесь в него и приглашайте друзей.

* * *

Вся эта история с ФБ и РКН, помимо того, что очень нам помогла, еще возбудила большую дискуссию на тему того, "надо ли пытаться сделать акцию согласованной?". Конечно же нет, никто ни в коем случае не будет обращаться в мэрию Москвы за какими-то согласованиями. "Народный сход" именно в том виде, в котором он предстоит 15 января, их и не требует: это форма прямой демократии, предусмотренная Конституцией. Мы не планируем ни митинга (с микрофоном, сценой, выступлениями), ни шествия, ни пикетирования. Люди вправе гулять вечером в центре города; вправе собираться мирно и без оружия. Никто не может запретить гражданину России в определенное время оказаться в определенном публичном месте Москвы, если он того хочет.

Более того, у мероприятия 15 января даже теоретически нет никаких "организаторов", которые могли бы обратиться в мэрию за этим самым согласованием. Это, мне кажется, лучше всего видно по истории с возникновением ивента после блокировки: окей, первый разместил я, его заблокировали, потом какие-то незнакомые мне люди сделали еще кучу ивентов, заблокируют их - люди сделают еще. Так это и работает с народными сходами. Я не собираюсь и не собирался ничего организовывать, я ведь только разместил в публичном доступе информацию, которую и так все знают - в случае несправедливого приговора надо встречаться вечером на Манежке. Если угодно, у этого мероприятия на данный момент около 15000 организаторов - или ни одного.

Поэтому ответ очевиден: не может быть никаких согласований, их время давно прошло.

* * *

Но, честно говоря, меня так удивляет, что этот вопрос из далекого прошлого еще возникает у кого-то в конце 2014 года, что я все-таки попробую дать необходимые методологические разъяснения.

1. Очень опасная и неправильная штука - переносить механически успешные подходы из прошлого опыта на новый опыт, руководствуясь их внешним сходством. Типа, "раньше самые успешные публичные мероприятия были согласованными, значит и в этот раз, чтобы мероприятие было успешным, надо попытаться его согласовать". Это могло бы быть верно, если бы критерии успешности были теми же, но в данном случае это не так!

2. Фактически, у сторонников согласования есть только один аргумент: "на согласованное мероприятие больше людей придет". Я не очень в этом уверен; я вот бы лично на согласованное не пошел бы (потому что не вижу в нем смысла), а на несогласованное обязательно специально прилечу. И знаю много других людей, которые так думают. Время все-таки очень сильно изменилось по сравнению с тем, что было пять лет или три года тому назад.

3. Но пусть даже этот аргумент действует. Примем на секунду: "на согласованное мероприятия больше людей придет". Окей, возможно. Чтобы что? И тут я возвращаюсь к п.1. выше: а у нас какой критерий успешности?

4. Вот у многих прошлых мероприятий была цель - показать, что нас много. Почувствовать, что мы не одни. Возьмемся за руки друзья, белые ленты, воздушные шарики, вдохновляющие речи, красивые лица, все дела. Мне и сейчас кажется, что это была важная и хорошая цель, и очень хорошо, что все эти прекрасные митинги и шествия в Москве и других городах в 2011-2012 годах были. Или вот чудесный последний, сентябрьский Марш Мира: очень круто, несмотря на "крымнаш" и "84%", мы есть и нас много. Ну ОК, мы знаем, что нас много. Сейчас-то у нас цель другая немножечко. Мы идем восстанавливать справедливость. Мы идем людей вытаскивать из тюрьмы. Нам надо, чтобы два невиновных человека не получили 10 и 8 лет тюрьмы по несуществующему уголовному делу.

5. Вопрос: может ли любая согласованная акция приблизить нас к достижению этой цели (и, таким образом, быть успешной)? Ответ: нет. Пусть придет 100 тысяч, или 200 тысяч, или невероятные 500 тысяч. На согласованную площадку (это будет не Манежка, кстати, на Манежку согласования не дают). У нас за плечами бесценный опыт 2011-12 годов, и мы знаем, что от этого стены не рухнут. Путин не сбежит в женском платье в Северную Корею. Мы постоим и, воодушевленные, разойдемся - и не произойдет ничего. Гребаное ничего.

6. Таким образом и угроза согласованной акции на 100, 200 или 500 тысяч человек не будет ничего означать для тех, кто будет принимать решения, для тех, кто будет писать приговор Алексею и Олегу Навальным. Лично я уверен, что окончательное решение будет принимать лично Путин; вы можете со мной не соглашаться; возможно, это будет какой-нибудь вшивый Володин. Так или иначе, он будет оценивать последствия своего решения: "вот я согласую 10 лет, и вечером выйдет 200 тысяч на согласованный митинг на Болотку". Или: "вот я согласую 10 лет, и вечером выйдет 50 тысяч на несогласованный народный сход на Манежку".

7. Мы, конечно, не знаем наверняка, что потом произойдет у него в голове, но точно знаем, что первая альтернатива ему абсолютно понятна и абсолютно безопасна. И на его решение заведомо никак не повлияет. А вторая - повлиять может; по крайней мере шанс такой есть. Просто потому, что они не понимают, что с этим делать; просто потому, что они никогда с таким не сталкивались. Вот он видит 50000 "я пойду" в Фейсбуке под несогласованным мероприятием, и ему надо гадать - а на самом деле все 50000 выйдут? или только 5000? Или, наоборот, еще и больше выйдет? А выйдет 50000 - и что с ними сделать? Разогнать такое невозможно. Оставить стоять - создать опаснейший (для режима) прецедент на будущее, опрокинуть всю эту псевдоправовую конструкцию, связанную с "согласованиями", с управляемым протестом. Они ж так еще и во вкус войдут, и дальше будут выходить и не расходиться, и что тогда? (В автозаках Москвы - 600 посадочных мест, в отделениях полиции - около 5000; мы не знаем ни о каком инструментарии, который позволил бы властям сделать хотя бы что-то с группой в 50000 человек, которая собралась в определенном месте и не расходится). И здесь возникает шанс, что рука дрогнет - и братья Навальные выйдут на свободу. Чего мы и добиваемся, не так ли?

8. Таким образом, с точки зрения наших целей, с точки зрения успешности нашего мероприятия, кнопочки "я пойду" под согласованным мероприятием не имеют никакой ценности, и, напротив, огромную ценность имеет каждая нажатая кнопочка "я пойду" именно в нынешней конфигурации: когда нажимающий ее понимает, что речь идет о мероприятии, которое никто согласовывать не собирается, и, тем не менее, собирается на него пойти. Именно на такое мероприятие я иду сам, приглашаю всех своих друзей, и прошу всех вас приглашать своих друзей. Делая это, вы реально помогаете Алексею и Олегу. Реально помогаете сами себе.

Я рассуждаю исключительно прагматически, как вы видите, но я не вижу ни малейшего повода рассуждать иначе и терять благоразумие.
До встречи вечером 15 января на Манежке!


Substitution mnemonics

(This article was originally published at Blog - Alex Polozov. See Substitution mnemonics for more comments and better formatting.)

(I overheard this at UW, from a graduate student who told me he doesn’t know the original author of this mnemonic either. Please do not attribute it to either of us).

In PL and formal logic, there exists a common notation, which I personally consider the worst possible notation choice of all times. Let’s say you have an expression E, in which you want to replace every occurrence of a variable x (or any other fixed subexpression, for that matter) with another variable y (again, or any other expression). This operation is called substitution1. In formal logic, λ-calculus, etc. there exists a bewildering soup of notations representing this simple transformation:

  • E[x → y] (“x is transformed into y”)
  • E[x ← y] (“x is replaced with y”)
  • E[x := y] (“assign y to every occurrence of x”)
  • E[y/x] (WTF?)

The first two (and their mirrored alternatives) are confusing on its own – you never know which substitution direction the arrow represents (is it “replace x with y” or “replace y with x”?). But the last one is notoriously ridiculous in that regard. It is too symmetric. How am I supposed to remember which variable substitutes the other one if the only thing denoting this relationship is a meaningless slash character in between? Some say this notation is the easiest to typeset – which is not true, because the third notation also doesn’t use any characters beyond standard ASCII, and it is unambiguous. Anyway, I usually tried to avoid the slash notation as much as possible whenever I could.

However, now I know a beautiful mnemonic, which breaks the “almost-symmetrical” relationship between x and y:

“Think of it as y falling over and squishing the x.”


  1. The actual formal definition of substitution is trickier, because you have to take into account which variables are free in E, and which are bound. The details are outside the scope of this post.

On performance in .NET

(This article was originally published at Blog - Alex (Oleksandr) Polozov. See On performance in .NET for more comments and better formatting.)

Formerly, when someone asked me “How to make my C# program faster?”, my go-to advice was:

  1. Improve your computational complexity.
  2. Switch to a native language.

Of these suggestions, step #1 should take care of performance in most situations, if done properly. However, sometimes it is not enough. For example, you are writing a user-facing real-time performance-critical application, such as the C# compiler, and you need to look not only at the average performance, but at the 99th percentile. This is where step #2 used to take over… but not anymore. Currently, my go-to advice looks like this:

  1. Improve your computational complexity.
  2. Read “Writing High-Performance .NET Code”, Roslyn team blog, and the rest of the links provided below.
  3. Switch to a native language.

Measurement tools

“Writing High-Performance .NET Code” should be your desk book for any performance-critical .NET application. I found the following knowledge it provides most important:

  • What profiling tools exist in the .NET world (PerfView, ETW, CLR Profiler, dotTrace, dotMemory, Windbg…), how to use each one of them, how to answer specific questions with a combination of these tools, which metrics should you look at and why.
  • How exactly .NET GC works and why you should care. How to help .NET GC by managing your allocations and object lifecycle carefully.
  • JIT mechanics, NGEN, when to use each of them, startup rates.

In other words, when you have a specific problem with your .NET application, this book will show how to use the tools to locate who exactly is responsible for the bottleneck, how often it occurs, and so on. Often you will be surprised, because (assuming you’ve already gone through step #1) your greatest bottleneck is going to be either GC, allocations, JIT, boxing, or incorrect usage of .NET API. All of these subtle engineering details are quite unobvious if you don’t train yourself to keep them in mind.

Performance-minded coding

When you know the consequence of the problem (e.g. “my app spends 20% of the time in GC”, which arises because of “there’s this pinned handle that points to a long retention path that is being walked on every gen-2 collection”), the next step is to eliminate it. The series of links below (along with the accompanying chapters in “Writing High-Performance .NET Code”) explains the techniques for doing it. If you know that this particular path in your code is going to be performance-critical up to the 99th percentile (never optimize prematurely!), you should really think of these techniques as guiding principles to keep in mind every second during your coding process.

Here are some must-read articles for any .NET programmer that works with performance-critical code:

I’m going to list some of the mentioned techniques below, briefly. Again, the book and the sources above have already done it much better than me.

Avoid allocations

For every allocation you make, the .NET GC will spend a little more time on every future collection. If this instance is relatively long-lived, it’s going to eventually move to gen-1 and gen-2, and greatly affect the future GC times. But even if it is short-lived, the performance of gen-0 collection is going to matter in your higher percentiles anyway.

Some of the common sources of hidden allocations are:

  • LINQ queries: they allocate enumerators and lambda-representing objects that capture references in a closure. Also, eventually you need to convert a query to a list/array, and it’s going to expand itself several times in the process. Instead you should allocate a list/array of a known capacity beforehand, and do all the required work directly, without allocating hidden LINQ enumerators.
  • Lambdas: if they capture any references from the outer scope, they will be rewritten to compiler-generated objects. If your lambda operates in a generic context this object will not even be cached in place, and will be re-created every time. Consider refactoring your logic in such a way that lambda becomes non-capturing (such lambdas compile down to static methods), or get rid of the lambda altogether.
  • Strings: because they are immutable, every string modification allocates a new string object. This is most subtle in calls like string.Trim(' '), which actually returns a new string. Instead use index-based arithmetic on hot paths. For case-insensitive comparison, use the corresponding string.Compare overload instead of converting all your strings to lowercase with string.ToLower. Also, string concatenation for simple cases is much faster than string formatting.
  • Invoking a method with params always allocates an array, possibly of zero length. Consider creating specialized overloads for most common numbers of parameters.

Use object pooling

If you use some objects often but temporarily, consider allocating a pool of objects of this type once, and reuse them where necessary. For example, the interface that Roslyn uses for StringBuilders look somewhat like this:

internal static class StringBuilderPool {
    public static StringBuilder Allocate() {
        return SharedPools.Default<StringBuilder>().AllocateAndClear();
    }

    public static void Free(StringBuilder builder) {
        SharedPools.Default<StringBuilder>().ClearAndFree(builder);
    }

    public static string ReturnAndFree(StringBuilder builder) {
        SharedPools.Default<StringBuilder>().ForgetTrackedObject(builder);
        return builder.ToString();
    }
}

Which is then later used in the following manner:

public override string GetTextBetween(SyntaxToken token1, SyntaxToken token2) {
    var builder = StringBuilderPool.Allocate();
    CommonFormattingHelpers.AppendTextBetween(token1, token2, builder);
    return StringBuilderPool.ReturnAndFree(builder);
}

Compile your reflection calls into delegates

Method calling through Reflection is horrendously slow. If you know the signature of your method beforehand (and for some reason cannot agree on a common interface with the third party who implements the external method), you can use LINQ Expression Trees to compile your MethodInfo to a strongly-typed delegate. This needs to be done only once, after that you can keep a reference to the delegate, and call it whenever necessary with standard C# syntax.

The technique is described at Jon Skeet’s blog. Here’s how I used it in one of my recent projects:

public static TDelegate ToDelegate<TDelegate>(this MethodInfo method) {
     var parameterTypes = method.GetParameters().Select(p => p.ParameterType).ToArray();
     MethodInfo invokeMethod = typeof (TDelegate).GetMethod("Invoke");
     var @params = invokeMethod.GetParameters()
                               .Select((p, i) => Expression.Parameter(p.ParameterType, "arg" + i))
                               .ToArray();
     MethodCallExpression methodCall = Expression.Call(method,
         @params.ZipWith(parameterTypes).Select2(Expression.Convert));
     return Expression.Lambda<TDelegate>(Expression.Convert(methodCall, invokeMethod.ReturnType), 
         @params).Compile();
 }

Avoid boxing

Apart from obvious cases where people unnecessarily convert value types into objects (such as using now deprecated System.Collections namespace), there are some subtler ones:

  • String.Format boxes its arguments
  • Structs are boxed when used through their implemented interface. In particular, this happens when you use LINQ: List<T>.Enumerator is a struct, but LINQ methods treat it as IEnumerator<T>
  • Object.Equals(object other) is the source of all evil
  • Do not ever concatenate a string with anything other than a string
  • Calling GetHashCode on an enum causes boxing. Convert the enum instance to int first.

Use specialized collections for smaller sizes

An array outperforms a dictionary up to a certain number of elements, even though its lookup is O(n). The reason is all the boilerplate overhead that accompanies a dictionary (hashtable, bucket exploration, etc.). The exact tripping point depends on your particular code and has to be measured experimentally.

Know when to use structs and when not to

Structs give better performance than classes when they are small, consist of primitive types, and when they are not copied around often. The overhead of a class vtable is noticeable during garbage collection. However, classes are copied faster, because they are represented with just a pointer. On another hand, an array of classes will cause you a nightmare of cache misses (see reference locality). An array of structs neatly lies in memory as a single block, but would be a nightmare to copy as a function result. Bottom line, know your usecase and measure everything.

Note: you should always re-implement Equals, GetHashCode, and IEquatable<T>.Equals for your structs, because the default implementations use reflection to enumerate over the fields.

Compile your regular expressions

If you are going to reuse the same regular expression often, build it with a RegexOptions.Compiled flag. Do not ever use static methods of the Regex class, they are horrendously slow.

If your regular expressions do not require non-regular features such as lookaround or backreferences, consider using re2 instead of a default regex engine. It might yield you up to a 10x speedup. There is a .NET wrapper available, called Re2.Net.


I will stop here because I cannot possibly outline all of the techniques. Again, for the complete picture read the book, watch the talk, read the articles referenced above, know your tools, and measure everything carefully. Also, feel free to comment here if you want to contribute more advice!

Random thoughts on Swift

Based on my quick skimming session through the language guide.

Kind of expected from a modern language, would be surprised if it wasn't included:
  • Closures
  • Type inference
  • First-class collections and tuples
  • Generics with all kinds of boundary restrictions
  • Interoperability with existing libraries (in this case with C and Obj-C).

Surprisingly included, and it's nice:
  • ADTs and pattern matching
  • First-class Maybe monad
  • Bret Victor-style interactive IDE (let me make a sincere bow to Apple folks at this point)
  • Opt-in mutability
  • Lots of small inspirations from D, C#, Scala, etc.

However...
  • Reference counting instead of garbage collection. Cannot detect reference cycles, ergo manual weakref management.
  • I'm not quite sure how to combine "protocols" (read: interfaces) and "extensions" (read: mixins) into full-fledged traits and typeclasses. For example, how do I define a default method implementation for an interface a protocol?
    (Also, why the heck do you need so many new names for existing concepts?!)
  • Optional types are not quite Maybe, you can force the "unwrapping" with a ! operator (naturally, with a possible runtime exception). I foresee every single iOS developer just blindly doing it with every external optional they get.
  • Extremely closed infrastructure: iOS/MacOS only, proprietary compiler, etc. Hell, you need an iTunes account to even read language documentation.
  • Absolutely no first-class concurrency treatment. Moreover, there's even no library treatment for concurrency (even though it is not enough).
  • No stream processing sugar (read: comprehensions/LINQ). Well, at least they have map and reduce in the standard library, but that's about it.

Not sure how I feel about:
  • No exceptions. If you gave us some other monadic alternative, I might've put it in the "nice" section.
  • Some magic in interoperability. Apparently, they wrote "external parameters names" for many standard library functions and forgot to show them to the legacy Objective-C programmers.

Interesting. Let's see how it flies.

Published at Alex (Oleksandr) Polozov - Blog

Om, React и все-все-все

Замечательное описание. Я по своему роду занятий стараюсь в вебдев лезть настолько редко, насколько это вообще возможно (в частности, по многим из причин, описанных в этом посте), но прочитал с удовольствием.
Особенно отмечу рассказ про персистентное дерево, которое хранит состояние документа. Идеальная иллюстрация тем нытикам, которые «а нахрен сдались вообще эти ваши алгоритмы и олимпиады во Взрослой Жизни™».

Оригинал взят у tonsky в Om, React и все-все-все. Далее идёт текст оригинала.

React.js — это библиотека, недавно перевернувшая JavaScript-мир с ног на голову одной простой идеей: давайте оперировать не настоящими DOM-елементами, а JavaScript-классами, их изображающими. Синхронизацию этого симулякра с настоящим браузером отдадим библиотеке.


Оказалось, что если не трогать DOM, работать с объектами настолько дешево, что можно их даже не хранить, а всегда дергать функцию state → pseudo-dom, генерирующую каждый раз новый псевдо-дом. Это первое достижение React-а, сделать двухстороннюю синхронизацию данные-интерфейс односторонней. Мы всегда пишем, как из данных получить UI, и никогда не пишем, как один UI перевести в другой UI. На всякий случай еще раз: подход «а вот по этой кнопке скроем панельку» был хорош до определенного предела, пока сайт был в основном статический, с немного меняющимися частями. Сейчас же то, что рисуется в браузере при загрузке, и то, что там будет через 2 минуты, может не иметь ничего общего вообще. Поэтому подход «дайвайте опишем, как эволюционирует наш DOM» работает не очень из-за комбинаторного взрыва — слишком много способов, как он может эволюционировать.


Второе достижение React-а в том, что они реализовали концепцию «всё свое ношу с собой», придав компонентам адекватную стандартизованную структуру. Грубо говоря, в момент создания компонент сам себе нужные ресурсы выделяет и сохраняет в собственный стейт (таймеры, сокеты, листенеры), а в момент удаления — прибирает. Звучит банально, но здесь важен факт, что это есть. Ситуация аналогична проблеме неймспейсов — яйца выеденного не стоит, но в JS их забыли и каждый разработчик вынужден пускаться в собственную езду на лыжах по кирпичам. DOM-листенеры тоже, кстати, крепятся к компоненту, но уже самим react-ом. Это опять же важно для highly dynamic интерфейсов — руками за всеми ресурсами следить и замаешься, и не уследишь.


Получаем, что react-овские компоненты это такие маленькие самостоятельные кирпичики, которые действительно можно складывать в стену и они сами будут работать, не захламляя приложение в неожиданных местах типа регистрации в top-level listener или создаваемых, но никем не удаляемых setInterval.


В общем, я примерно всю революцию уже описал. Можно делать самодостаточные, переиспользуемые компоненты (у них честное воткнул-и-готово), очень простой и мощный data binding (произвольная js-функция state→dom, и не надо выкручиваться в ограничениях template bindinds, и вообще html с шаблоном не нужен), быстрая синхронизация с DOM. React.js маленький-легковесный и это, в целом, opinionless библиотека, которую можно совмещать с чем угодно. Используется Фейсбуком и Инстаграмом, куча баек про то, как интерфейс, переписанный на React, избавляется от проблем со скоростью отрисовки. Но главное, что с ростом количества динамических частей на странице код не начинает катиться в говно экспоненциально. В целом, прорыв уровня jQuery.


Теперь Om. Om — это ClojureScript-биндинг к React-у от David Nolen, главного коммитера ClojureScript, и первая вещь, которую надо про него понять — это не биндинг. Да, он использует React, оборачивает его в cljs интерфейсы, но на самом деле под этой (достаточно выгодной) этикеткой продает свои, совсем другие идеи.


Первая, и очень хорошая — зачем нам рендериться на любое изменение стейта, давайте рендериться один раз на requestAnimationFrame. Мы получим те же 60 fps и еще меньшую площадь соприкосновения с DOM, чем в React. За счет этого, например, он обогнал голый React в ToDoMVC перфтесте.


Вторая — это управление состоянием всего приложения. Если React в этом смысле был достаточно нейтрален (ну, ты, это, давай там сам как-нибудь сам), то у Om насчет состояния вполне четкие планы. Дэвид постаралася сохранить переиспользуемость компонентов и добавить несколько бонусов сверху. Если коротко, то состояние всех компонентов в Om — один большой atom, персистентная структура, а все компоненты получают view в эту структуру на то место, которое относится непосредственно к ним. Т.е. они получают такой handle (в терминах om — cursor), через который они могут читать кусочек этого большого дерева и писать в него. Если компоненту нужны подкомпоненты, можно создать под-курсор из своего курсора, например.


Эта простая идея дает два бенефита:


Возможность показывать в разных местах страницы одно и то же значение буквально. То есть, например, слева у нас таблица сотрудников (компонент table), и в колонке «пол» у них или Man, или Woman. А справа у нас text input для редактирования списка полов, и мы в нем меням Man на Male и в таблице все автоматом синхронизируется. Потому что оба компонента работают с курсором на одно и то же место в атоме. Из-за особенностей реализации text inputs в React можно даже сделать так, чтобы значение в таблице менялось по мере набора букв в text input.


Второй бенефит — это возможность работать с состоянием всего приложения как с чем-то цельным. Это персистентная структура, значит можно хранить историю состояний всего на 100 (например) версий назад, каждое состояние иммутабельное и все они разделяют кусочки, которые не изменялись. Элементарно прикручивается undo, причем на любую версию: ты просто говоришь om-у (а он react-у): давай сейчас вот это состояние рисуй, и react сам вычисляет оптимальный способ его нарисовать из текущего dom: где что удалить/добавить/подвинуть, чтобы получить целевое. Палитру History в фотошопе видели? Короче, бонус в том, что управление состоянием вынесено за скобки. Можно прикрутить логику синхронизации с сервером, undo, сохранение в localStorage — и всё это будет снаружи и отдельно, а не размазано по GUI-компонентам.


Там не всё идеально — документация мутная, курсоры излишне хитрожопо сделаны и не описаны (точнее, сейчас описаны, но это я доку написал), и вообще оно alpha. Но это уже, наверное, самый востребованный GUI-фреймворк на cljs — я думаю, из-за hype вокруг React + имени создателя. Я не то чтобы рекомендую, я скорее популяризирую хорошие идеи, плюс это еще такой спасательный круг тем, кто полезет в Om разбираться.


Вот здесь можно посмотреть на мои эксперименты: игра «41 носок» вживую, исходники.


Дополнение к предыдущей записи. Недавно появился такой проект — http://stopfake.org/ Он не идеален, но многие факты лжи СМИ на нём всё-таки опровергнуты корректно («бои в Симферополе», «украинские беженцы в Россию», «гибель россиян в Крыму»). Пожалуйста, давайте знакомым ссылки — пусть не ведутся на ложь. Мнений могут быть сотни, но факты, факты и только факты спасут мир.

UPD: Ещё лучше проект того же плана: http://fakecontrol.org/
Во мне всё ещё зреет робкая надежда, что большая часть жертв информационной войны остаются восприимчивы к фактам. Поэтому я буду продолжать пытаться распространять факты (и требовать оных от своих собеседников).

(Пользуясь случаем, хочу установить своё личное отношение к обсуждениям сложившиейся ситуации. Конструктивные дискуссии с фактами и уважением приветствуются. Неадекватные высказывания с бросанием ярлыками как в сторону одной, так и другой стороны — просто игнорирую. Да, мне плевать, защищаете ли вы идеалы Майдана, Путина, масонской ложи или кого-то ещё: если вы не в состоянии вести спокойный и цивилизованный диалог без истерики и перехода на личности, с вами никто здесь не будет говорить.)

Оригинал взят у raymond_saint в российские провокаторы в Симферополе. Далее следует текст оригинала.

1. Сначала была фотография.

В абсолютном вакууме было понятно только, что это где-то в Украине.

2. Мой украинский товарищ подсказал, что номера крымские (АК=Автономия Крым?)

3. Затем был кусок "Вестей".
https://vine.co/v/MKPUve5hl5I
Симферополь. Одни российские солдаты притворяются мертвыми, пока другие лениво разглядывают крыши в прицелы. Очевидный розыгрыш.

4. Делаю пост в твиттер.


5. Сразу приходят ответы.






6. То есть приехали парни из Ялты, парк львов "Тайган" (именно это написано на автобусе, а не ЛЬВОВ-МАЙДАН)

Их сайт: http://taigan.com.ua/

7. Погуглил про ГМ-94.
Специально для ГМ-94 был разработан целый ряд 43мм унитарных выстрелов, включающих фугасные безосколочные гранаты, гранаты со слезоточивым газом, и выстрелы с резиновой "пулей".
http://world.guns.ru/grenade/rus/gm-94-r.html
It is intended mostly for various Spetsnaz elements of Russian army, FSB (Federal Security service) and MVD (Internal Affairs Ministry).
http://world.guns.ru/grenade/rus/gm-94-e.html

8. В довершение всего был найден тот самый репортаж "Вестей", для которого эти посредственные актеришки и были приглашены в Симферополь.
http://www.vesti.ru/only_video.html?vid=581456
(у напавших на оператора людей — георгиевская ленточка)

9. В качестве вишенки на торте запись 5-го канала.

Хм, может автобусы и вовсе не причем? В любом случае, никакие "бандеровцы" не могли понаехать через установленный 3 дня назад кордон беркутовцев на Перекопе.

10. И еще одна фоточка, которую я нарыл на греческом сайте.

Никакой крови под "ополченцами", очевидная подстава. Да и используй они боевые (фугасные) заряды для своих гранатометов, от российских солдат по идее должны были остаться только кишки на мостовой.

11. "Труп устал"

О Пилюлькине

Относиться к происходящему в/на Украине можно по-разному, каждый имеет право на собственное мнение, но главное — не быть скотом. Коим, к сожалению, стал когда-то прекрасный писатель Сергей Лукьяненко.
Цитаты:
Но если хоть одна из писательских "персон", славивших майдан и майданутых, пишущих при том на русском и печатающихся в России, захочет появиться на российских конвентах - я буду против. Захочет публиковаться в России - приложу все силы, дабы помешать. Будьте последовательны, мерзавцы! Я отныне в Украину не езжу, в украинских конвентах не участвую, переводить свои книги на украинский запрещаю. Рекомендую и вам придерживаться того же правила. Хорошо?

source

> Вы хоть бы погибшим с обоих сторон соболезнование высказали...
Погибшим милиционерам - легко.
Погибшим погромщикам и фашистской мрази? Пусть горят в аду.

source

Я оставлю у себя на планшете "Спектр", "Искателей неба" и первые четыре "Дозора" на память о Писателе. Всё последующее, написанное Скотом, читать (а уж тем более покупать) не собираюсь.
Оригинал взят у _adept_ в Если пропал человек с телефоном
Так как в моем родном городе пропадают люди, набросаю-ка я текстик - авось кому пригодится.

Если пропал человек с телефоном, и вы его ищете

Напишите ему SMS. Если SMS будет доставлен (то есть, вам пришел отчет о доставке) - у оператора сохранится запись с уникальным номером базовой станции, доставившей SMS. Это какая-никакая, но зацепка. Проверить, что SMS доставлен, можно только по отчету о доставке (delivery report). Если отправитель его не запросил (включается в настройках вашего телефона) - отчета не будет, равно как и уверенности, что SMS дошел.

Звонить (если там не берут трубку) - бестолку. Факт несостоявшегося разговора не фиксируется.

Дальше ищите способ добыть данные о том, что это за базовая, где она находится, и в какую сторону она вещает (базовые редко бывают всенаправленными).

Если телефон выключен, ищите способ добыть данные о месте последней регистрации в сети - там тоже будет уникальный номер базовой.

Если вы "пропали", и у вас есть телефон

Напишите SMS. Это может быть быстрее, чем звонить и ждать, возьмут там трубку или нет. Если вам удасться отправить SMS (не важно, будет он доставлен или нет), то у оператора сохранится запись с уникальным номером базовой, которая его приняла.

Для андроида есть приложения вроде этого, которые могут отправлять "тревожный SMS" с вашими кординатами. Приложение по ссылке отправит SMS после 2-5 кратного нажатия на power. Disclaimer: я видел и другие приложения, но ни одно из них не тестировал.

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

Как добыть данные о базовой

Я знаю, как это сделать в рамках закона и судебного процесса. Но с этим сейчас вы сами знаете как ... Мне приходит в голову только писать в социальных сетях просьбы о помощи - мир не без добрых людей, авось кто-то из имеющих доступ и откликнется.

Чтобы вам смогли помочь, в просьбу включите:

* Номер телефона абонента, который пропал. Если знаете, укажите также IMEI (серийник телефона) и IMSI (серийник сим-карты). Если знаете еще какие-то ID (номер контракта, например) - укажите и их. Имя-фамилия не нужны, т.к. полных тезок в базе оператора могут быть сотни.

* Дата и время звонков или СМС-ов, которые были приняты телефоном.

* Для каждого звонка или СМС-а укажите, с какого номера звонили или писали, в какое время (как можно точнее, до секнуд - убедитесь, что ваши часы идут точно)

* для СМС отдельно укажите время отправления и время получения отчета о доставке. СМС-ы без отчетов о доставке указывайте в крайнем случае.

* Укажите, как можно связаться с вами на условиях анонимности. Создайте документ на collabedit.com и укажите его ссылку. Создайте документ в google docs (google drive) и дайте права на редактирование всем желающим, и укажите его ссылку. Мониторьте правки в этом документе.

Коммутатор мобильной связи в час может обработать несколько десятков миллионов событий. Чем точнее вы опишете данные для поиска - тем больше шансов на успех.

Например
Помогите найти Ивана Иванова!

Его номер телефона: 380xxyyyzztt
В ЧЧ:ММ ДД.ММ.ГГГГ ему был отправлен смс с номера ..., в ЧЧ:ММ пришел отчет о доставке.
В ЧЧ:ММ ДД.ММ.ГГГГ мы ему дозвонились с номера такого-то. Трубку кто-то снял, но ничего не сказал. Звонок продолжался примерно Х секунд.
В ЧЧ:ММ телефон уже был выключен.

Нужны любые сведения о местонахождении телефона в это время или базовых станциях, которые обслужили эти сообщения, а также месте последней регистрации в сети. Любые сведения можно анонимно оставить на collabedit.com/xyt23v или <ссылка на google docs>

PS
А еще я интересуюсь SMS-ами о "регистрации в качестве участников массовых волнений"

UPD: уже не интересуюсь, там написано, почему

D

Александреску сегодня коммитнул свой проект на D во внутренний Facebook-репозиторий. Похоже, если на свете появилась большая компания, официально доверяющая степени зрелости D в продакшене, то можно его и поковырять-с... как время появится.

Ад рационалиста

Мне сегодня объяснили, почему у меня так туго идёт обучение вождению.
Оказывается, мой жизненный принцип «сначала думай, потом делай» за рулём, сука, не работает.

Вот как, КАК можно было придумать (и распространить по всему миру) технологию, для которой противопоказано думать, чтобы ей пользоваться?!

Метки:

Thread 69
Current frame: KERNELBASE!RaiseException+0x68
[Stacktrace:]
Child-SP RetAddr Caller, Callee
000000a6b8b36f38 00007fffae656aac KERNELBASE!RaiseException+0x68, calling ntdll!RtlRaiseException
000000a6b8b36f70 00007fffb1001cdb IMM32!ImmGetImeInfoEx+0x6b, calling IMM32!NtUserGetImeInfoEx
000000a6b8b36f80 00007fff983853a1 MSVCR120_CLR0400!getptd_noexit+0x74, calling KERNEL32!SetLastErrorStub
000000a6b8b36fb0 00007fff98386352 MSVCR120_CLR0400!getptd+0xb, calling MSVCR120_CLR0400!getptd_noexit
000000a6b8b36fe0 00007fff9838eb9c MSVCR120_CLR0400!_CxxCallCatchBlock+0x161, calling KERNEL32!RaiseExceptionStub
000000a6b8b37090 00007fff985dcee2 clr!InternalDispatchImpl_Invoke+0x1ed, calling clr!DispatchInfo::InvokeMember
000000a6b8b370b0 00007fffb122d403 ntdll!RcConsolidateFrames+0x3
000000a6b8b371b0 00007fff985dcee2 clr!InternalDispatchImpl_Invoke+0x1ed, calling clr!DispatchInfo::InvokeMember
000000a6b8b37460 00007fffb11d7917 ntdll!RtlpxLookupFunctionTable+0xcb, calling ntdll!RtlReleaseSRWLockShared
000000a6b8b37470 00007fff983853a1 MSVCR120_CLR0400!getptd_noexit+0x74, calling KERNEL32!SetLastErrorStub
000000a6b8b37490 00007fff9838e130 MSVCR120_CLR0400!_GetRangeOfTrysToCheck+0x38, calling MSVCR120_CLR0400!__StateFromControlPc
000000a6b8b374b0 00007fffb11db5fa ntdll!RtlLookupFunctionEntry+0x72, calling ntdll!RtlpSearchFunctionTable
000000a6b8b374d0 00007fff9838e0ce MSVCR120_CLR0400!_DestructExceptionObject+0x6d8, calling MSVCR120_CLR0400!_GetRangeOfTrysToCheck
000000a6b8b37520 00007fff983853a1 MSVCR120_CLR0400!getptd_noexit+0x74, calling KERNEL32!SetLastErrorStub
000000a6b8b37550 00007fff98386352 MSVCR120_CLR0400!getptd+0xb, calling MSVCR120_CLR0400!getptd_noexit
000000a6b8b37560 00007fff9838d916 MSVCR120_CLR0400!_GetEstablisherFrame+0x2e, calling MSVCR120_CLR0400!__StateFromControlPc
000000a6b8b37580 00007fff9838d74d MSVCR120_CLR0400!GetImageBase+0x9, calling MSVCR120_CLR0400!getptd
000000a6b8b37588 00007fff985dcee2 clr!InternalDispatchImpl_Invoke+0x1ed, calling clr!DispatchInfo::InvokeMember
000000a6b8b375d0 00007fffb122dddd ntdll!RtlpExecuteHandlerForUnwind+0xd
000000a6b8b37600 00007fffb11dafc5 ntdll!RtlUnwindEx+0x45d, calling ntdll!RtlRestoreContext
000000a6b8b37640 00007fff986413b5 clr!GCCoopNoDtor::Enter+0xe, calling clr!GetThread
000000a6b8b37660 00007fff9864c0e0 clr!_CxxFrameHandler3
000000a6b8b376a0 00007fff985dcee2 clr!InternalDispatchImpl_Invoke+0x1ed, calling clr!DispatchInfo::InvokeMember
000000a6b8b376d8 00007fff985dcee2 clr!InternalDispatchImpl_Invoke+0x1ed, calling clr!DispatchInfo::InvokeMember
000000a6b8b376f8 00007fff985dcee2 clr!InternalDispatchImpl_Invoke+0x1ed, calling clr!DispatchInfo::InvokeMember
000000a6b8b37708 00007fff9864c0e0 clr!_CxxFrameHandler3
000000a6b8b37740 00007fff984d2b8d clr!MethodDesc::IsInterface+0x9, calling clr!MethodDesc::GetMethodTable
000000a6b8b37750 00007fff985162ea clr!CallDescrWorkerReflectionWrapper+0x1a, calling clr!CallDescrWorkerWithHandler
000000a6b8b37770 00007fff98518b48 clr!InvokeUtil::CreateObject+0x20, calling clr!TypeHandle::GetSignatureCorElementType
000000a6b8b377a0 00007fff98516108 clr!RuntimeMethodHandle::InvokeMethod+0x548, calling clr!_security_check_cookie
000000a6b8b377d8 00007fff984cc313 clr!CallDescrWorkerInternal+0x83
000000a6b8b377f0 00007fff985705c3 clr!RtlVirtualUnwind_Wrapper+0x6b, calling ntdll!RtlVirtualUnwind
000000a6b8b37838 00007fff984cc313 clr!CallDescrWorkerInternal+0x83
000000a6b8b378c0 00007fff985dcd4c clr!InternalDispatchImpl_Invoke_CallBack+0xb2, calling clr!InternalDispatchImpl_Invoke
000000a6b8b37970 00007fff986428dc clr!ExceptionTracker::ProcessOSExceptionNotification+0x34a, calling clr!_security_check_cookie
000000a6b8b37a70 00007fff98465f40 clr!ExecutionManager::GetCodeMethodDesc+0x94
000000a6b8b37a80 00007fff98587cab clr!CLRException::SetThrowableHandle+0x27, calling clr!StressLog::LogOn
000000a6b8b37a90 00007fffb11d7917 ntdll!RtlpxLookupFunctionTable+0xcb, calling ntdll!RtlReleaseSRWLockShared
000000a6b8b37aa0 00007fff98488380 clr!VirtualCallStubManager::CacheLookup+0x1c, calling clr!DispatchCache::Lookup
000000a6b8b37ab0 00007fff983853a1 MSVCR120_CLR0400!getptd_noexit+0x74, calling KERNEL32!SetLastErrorStub
000000a6b8b37ac0 00007fff98587c7e clr!CLRException::~CLRException+0x71, calling clr!DestroyGlobalStrongHandle
000000a6b8b37ae0 00007fff983853a1 MSVCR120_CLR0400!getptd_noexit+0x74, calling KERNEL32!SetLastErrorStub
000000a6b8b37af0 00007fff98484d21 clr!MethodTable::GetMethodDescForSlotAddress+0xe, calling clr!ExecutionManager::GetCodeMethodDesc
000000a6b8b37b00 00007fff9888a74e clr!DispatchInfo::InvokeMember+0x81b, calling clr!CxxThrowException
000000a6b8b37b10 00007fff98386352 MSVCR120_CLR0400!getptd+0xb, calling MSVCR120_CLR0400!getptd_noexit
000000a6b8b37b40 00007fff9838dbf4 MSVCR120_CLR0400!_FrameUnwindToState+0x182, calling MSVCR120_CLR0400!__SetState
000000a6b8b37b60 00007fff9838d89d MSVCR120_CLR0400!_GetEstablisherFrame+0x68, calling KERNEL32!RtlLookupFunctionEntryStub
000000a6b8b37bb0 00007fff9838da62 MSVCR120_CLR0400!__FrameUnwindToEmptyState+0x81, calling MSVCR120_CLR0400!_FrameUnwindToState
000000a6b8b37bf0 00007fff9838deab MSVCR120_CLR0400!_InternalCxxFrameHandler+0x121, calling MSVCR120_CLR0400!__FrameUnwindToEmptyState
000000a6b8b37c20 00007fff98386352 MSVCR120_CLR0400!getptd+0xb, calling MSVCR120_CLR0400!getptd_noexit
000000a6b8b37c30 00007fff984cc313 clr!CallDescrWorkerInternal+0x83
000000a6b8b37c40 00007fff9888a74e clr!DispatchInfo::InvokeMember+0x81b, calling clr!CxxThrowException
000000a6b8b37c50 00007fff9838ddeb MSVCR120_CLR0400!_CxxFrameHandler+0x77, calling MSVCR120_CLR0400!_InternalCxxFrameHandler
000000a6b8b37c70 00007fffae656ae3 KERNELBASE!_GSHandlerCheck+0x13, calling KERNELBASE!_GSHandlerCheckCommon
000000a6b8b37ce0 00007fff9838ea0f MSVCR120_CLR0400!UnwindNestedFrames+0x149, calling KERNEL32!RtlUnwindExStub
000000a6b8b37cf0 00007fffb11b80ca ntdll!LdrUnloadDll+0x3e, calling ntdll!LdrpDereferenceNode
000000a6b8b37d00 00007fffae6dfa68 KERNELBASE!VerpCheckBlock32+0x38, calling KERNELBASE!StringCbLengthW
000000a6b8b37eb0 00007fff985dcee2 clr!InternalDispatchImpl_Invoke+0x1ed, calling clr!DispatchInfo::InvokeMember
000000a6b8b38160 00007fffb11d7917 ntdll!RtlpxLookupFunctionTable+0xcb, calling ntdll!RtlReleaseSRWLockShared
000000a6b8b38170 00007fff983853a1 MSVCR120_CLR0400!getptd_noexit+0x74, calling KERNEL32!SetLastErrorStub
000000a6b8b38190 00007fff9838e130 MSVCR120_CLR0400!_GetRangeOfTrysToCheck+0x38, calling MSVCR120_CLR0400!__StateFromControlPc
000000a6b8b381b0 00007fffb11db5fa ntdll!RtlLookupFunctionEntry+0x72, calling ntdll!RtlpSearchFunctionTable
000000a6b8b381d0 00007fff9838e0ce MSVCR120_CLR0400!_DestructExceptionObject+0x6d8, calling MSVCR120_CLR0400!_GetRangeOfTrysToCheck
000000a6b8b38220 00007fff983853a1 MSVCR120_CLR0400!getptd_noexit+0x74, calling KERNEL32!SetLastErrorStub
000000a6b8b38250 00007fff98386352 MSVCR120_CLR0400!getptd+0xb, calling MSVCR120_CLR0400!getptd_noexit
000000a6b8b38260 00007fff9838d916 MSVCR120_CLR0400!_GetEstablisherFrame+0x2e, calling MSVCR120_CLR0400!__StateFromControlPc
000000a6b8b38280 00007fff9838d74d MSVCR120_CLR0400!GetImageBase+0x9, calling MSVCR120_CLR0400!getptd
000000a6b8b382b0 00007fff9838e8a8 MSVCR120_CLR0400!_DestructExceptionObject+0x118, calling MSVCR120_CLR0400!UnwindNestedFrames
000000a6b8b38300 00007fff9838d74d MSVCR120_CLR0400!GetImageBase+0x9, calling MSVCR120_CLR0400!getptd
000000a6b8b38330 00007fff983e64c9 MSVCR120_CLR0400!_DestructExceptionObject+0x817, calling MSVCR120_CLR0400!_DestructExceptionObject+0x70
000000a6b8b383e0 00007fff9838e00a MSVCR120_CLR0400!_DestructExceptionObject+0x59c, calling MSVCR120_CLR0400!_DestructExceptionObject+0x5e8
000000a6b8b38400 00007fff9864c24e clr!ShouldHandleManagedFault+0x6a, calling clr!WasThrownByUs
000000a6b8b38460 00007fff9846326b clr!DecCantAllocCount+0x33, calling clr!ClrFlsGetBlock
000000a6b8b384d0 00007fff9838df18 MSVCR120_CLR0400!_InternalCxxFrameHandler+0x208, calling MSVCR120_CLR0400!_DestructExceptionObject+0x134
000000a6b8b38518 00007fff985dcee2 clr!InternalDispatchImpl_Invoke+0x1ed, calling clr!DispatchInfo::InvokeMember
000000a6b8b38530 00007fff9838ddeb MSVCR120_CLR0400!_CxxFrameHandler+0x77, calling MSVCR120_CLR0400!_InternalCxxFrameHandler
000000a6b8b38550 00007fff985dcee2 clr!InternalDispatchImpl_Invoke+0x1ed, calling clr!DispatchInfo::InvokeMember
000000a6b8b38580 00007fffb122dd5d ntdll!RtlpExecuteHandlerForException+0xd
000000a6b8b385b0 00007fffb11de653 ntdll!RtlDispatchException+0x197, calling ntdll!RtlpExecuteHandlerForException
000000a6b8b38638 00007fff985dcee2 clr!InternalDispatchImpl_Invoke+0x1ed, calling clr!DispatchInfo::InvokeMember
000000a6b8b38668 00007fff9864c0e0 clr!_CxxFrameHandler3
000000a6b8b38780 00007fff985dcd4c clr!InternalDispatchImpl_Invoke_CallBack+0xb2, calling clr!InternalDispatchImpl_Invoke
000000a6b8b387e0 00007fff98634061 clr!ReflectionInvocation::ExecuteCodeWithGuaranteedCleanup+0x145, calling clr!HelperMethodFrameRestoreState
000000a6b8b38820 00007fff9851eacc clr!REGUTIL::EnvGetString+0xa4, calling clr!_security_check_cookie
000000a6b8b38998 00007fff984cc313 clr!CallDescrWorkerInternal+0x83
000000a6b8b389a8 00007fff9851602a clr!RuntimeMethodHandle::InvokeMethod+0x46a, calling clr!CallDescrWorkerReflectionWrapper
000000a6b8b389d8 00007fff89f2f3d3 (MethodDesc 00007fff89aeb9e0 +0xd3 System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo)), calling (MethodDesc 00007fff89aebb00 +0 System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(System.Object, System.Object[], System.Object[]))
000000a6b8b389f0 00007fffb122dddd ntdll!RtlpExecuteHandlerForUnwind+0xd
000000a6b8b38ac0 00007fff9851602a clr!RuntimeMethodHandle::InvokeMethod+0x46a, calling clr!CallDescrWorkerReflectionWrapper
000000a6b8b38b10 00007fffb1203749 ntdll!RtlRaiseException+0x45, calling ntdll!RtlpCaptureContext
000000a6b8b38b20 00007fffb1203891 ntdll!RtlRaiseException+0x18d, calling ntdll!RtlDispatchException
000000a6b8b38be0 00007fff984cc313 clr!CallDescrWorkerInternal+0x83
000000a6b8b38c70 00007fffb1203749 ntdll!RtlRaiseException+0x45, calling ntdll!RtlpCaptureContext
000000a6b8b38c80 00007fffb1203891 ntdll!RtlRaiseException+0x18d, calling ntdll!RtlDispatchException
000000a6b8b38d00 00007fffb0cce774 KERNEL32!QuirkIsEnabled3Worker+0x84, calling KERNEL32!_security_check_cookie
000000a6b8b38d50 00007fff984cc313 clr!CallDescrWorkerInternal+0x83
000000a6b8b38de0 00007fffae656aac KERNELBASE!RaiseException+0x68, calling ntdll!RtlRaiseException
000000a6b8b38e40 00007fff98634061 clr!ReflectionInvocation::ExecuteCodeWithGuaranteedCleanup+0x145, calling clr!HelperMethodFrameRestoreState
000000a6b8b38e80 00007fff9851eacc clr!REGUTIL::EnvGetString+0xa4, calling clr!_security_check_cookie
000000a6b8b38e90 00007fff9851e259 clr!HndCreateHandle+0x116, calling clr!StressLog::LogOn
000000a6b8b38ed0 00007fff98587cab clr!CLRException::SetThrowableHandle+0x27, calling clr!StressLog::LogOn
000000a6b8b38fd0 00007fff9851eb0f clr!REGUTIL::GetConfigDWORD_DontUse_+0x28, calling clr!REGUTIL::GetConfigInteger
000000a6b8b39010 00007fff9851e97a clr!CLRConfig::GetConfigValue+0xf6, calling clr!_security_check_cookie
000000a6b8b39070 00007fff98588411 clr!CLRException::GetThrowableFromException+0x85, calling clr!_security_check_cookie
000000a6b8b390f0 00007fff984d55d0 clr!MethodDescCallSite::CallTargetWorker+0x264, calling clr!_security_check_cookie
000000a6b8b39170 00007fffae656aac KERNELBASE!RaiseException+0x68, calling ntdll!RtlRaiseException
000000a6b8b391a8 00007fffae656aac KERNELBASE!RaiseException+0x68, calling ntdll!RtlRaiseException
000000a6b8b39200 00007fff98462a55 clr!ClrFlsGetValue+0xe, calling clr!ClrFlsGetBlock
000000a6b8b39220 00007fff98552256 clr!ExceptionTracker::PopTrackers+0x17, calling clr!GetThread
000000a6b8b39250 00007fff9838e4c4 MSVCR120_CLR0400!CxxThrowException+0xd4, calling KERNEL32!RaiseExceptionStub
000000a6b8b392c0 00007fff9888a74e clr!DispatchInfo::InvokeMember+0x81b, calling clr!CxxThrowException
000000a6b8b392d0 00007fffae656aac KERNELBASE!RaiseException+0x68, calling ntdll!RtlRaiseException
000000a6b8b39308 00007fffae656aac KERNELBASE!RaiseException+0x68, calling ntdll!RtlRaiseException
000000a6b8b39350 00007fff983853a1 MSVCR120_CLR0400!getptd_noexit+0x74, calling KERNEL32!SetLastErrorStub
000000a6b8b39380 00007fff98386352 MSVCR120_CLR0400!getptd+0xb, calling MSVCR120_CLR0400!getptd_noexit
000000a6b8b393b0 00007fff9838eb9c MSVCR120_CLR0400!_CxxCallCatchBlock+0x161, calling KERNEL32!RaiseExceptionStub
000000a6b8b39460 00007fff985dd303 clr!DispatchInfo::InvokeMember+0x461, calling clr!DispatchInfo::InvokeMemberDebuggerWrapper
000000a6b8b39480 00007fffb122d403 ntdll!RcConsolidateFrames+0x3
000000a6b8b39580 00007fff985dd303 clr!DispatchInfo::InvokeMember+0x461, calling clr!DispatchInfo::InvokeMemberDebuggerWrapper
000000a6b8b39740 00007fff984cc313 clr!CallDescrWorkerInternal+0x83
000000a6b8b397c0 00007fff984d55d0 clr!MethodDescCallSite::CallTargetWorker+0x264, calling clr!_security_check_cookie
000000a6b8b39800 00007fff98485ba2 clr!ArgIteratorTemplate::ComputeReturnFlags+0x4a, calling clr!SigPointer::PeekElemTypeClosed
000000a6b8b39850 00007fff984d2f2e clr!MethodDescCallSite::CallTargetWorker+0xa1, calling clr!_chkstk
000000a6b8b398a0 00007fff984861c5 clr!ArgIteratorTemplate::ForceSigWalk+0xa1, calling clr!SigParser::SkipExactlyOne
000000a6b8b398f0 00007fff983853a1 MSVCR120_CLR0400!getptd_noexit+0x74, calling KERNEL32!SetLastErrorStub
000000a6b8b39920 00007fff98386352 MSVCR120_CLR0400!getptd+0xb, calling MSVCR120_CLR0400!getptd_noexit
000000a6b8b39930 00007fff9838d916 MSVCR120_CLR0400!_GetEstablisherFrame+0x2e, calling MSVCR120_CLR0400!__StateFromControlPc
000000a6b8b39950 00007fff9838d74d MSVCR120_CLR0400!GetImageBase+0x9, calling MSVCR120_CLR0400!getptd
000000a6b8b39958 00007fff985dd303 clr!DispatchInfo::InvokeMember+0x461, calling clr!DispatchInfo::InvokeMemberDebuggerWrapper
000000a6b8b399a0 00007fffb122dddd ntdll!RtlpExecuteHandlerForUnwind+0xd
000000a6b8b399d0 00007fffb11dafc5 ntdll!RtlUnwindEx+0x45d, calling ntdll!RtlRestoreContext
000000a6b8b39a00 00007fffb11de653 ntdll!RtlDispatchException+0x197, calling ntdll!RtlpExecuteHandlerForException
000000a6b8b39a70 00007fff985dd303 clr!DispatchInfo::InvokeMember+0x461, calling clr!DispatchInfo::InvokeMemberDebuggerWrapper
000000a6b8b39aa8 00007fff985dd303 clr!DispatchInfo::InvokeMember+0x461, calling clr!DispatchInfo::InvokeMemberDebuggerWrapper
000000a6b8b39ac8 00007fff985dd303 clr!DispatchInfo::InvokeMember+0x461, calling clr!DispatchInfo::InvokeMemberDebuggerWrapper
000000a6b8b39b00 00007fff98484d21 clr!MethodTable::GetMethodDescForSlotAddress+0xe, calling clr!ExecutionManager::GetCodeMethodDesc
000000a6b8b39b20 00007fff984cc313 clr!CallDescrWorkerInternal+0x83
000000a6b8b39b60 00007fff984cc39a clr!CallDescrWorkerWithHandler+0x4a, calling clr!CallDescrWorkerInternal
000000a6b8b39ba0 00007fff985162ea clr!CallDescrWorkerReflectionWrapper+0x1a, calling clr!CallDescrWorkerWithHandler
000000a6b8b39bc0 00007fff984cc313 clr!CallDescrWorkerInternal+0x83
000000a6b8b39c50 00007fff984cc313 clr!CallDescrWorkerInternal+0x83
000000a6b8b39c90 00007fff985dcee2 clr!InternalDispatchImpl_Invoke+0x1ed, calling clr!DispatchInfo::InvokeMember
000000a6b8b39d40 00007fff98634061 clr!ReflectionInvocation::ExecuteCodeWithGuaranteedCleanup+0x145, calling clr!HelperMethodFrameRestoreState
000000a6b8b39f70 00007fff984cc313 clr!CallDescrWorkerInternal+0x83
000000a6b8b39ff0 00007fff984d55d0 clr!MethodDescCallSite::CallTargetWorker+0x264, calling clr!_security_check_cookie
000000a6b8b3a030 00007fff98485ba2 clr!ArgIteratorTemplate::ComputeReturnFlags+0x4a, calling clr!SigPointer::PeekElemTypeClosed
000000a6b8b3a0b0 00007fff9838ea0f MSVCR120_CLR0400!UnwindNestedFrames+0x149, calling KERNEL32!RtlUnwindExStub
000000a6b8b3a0d0 00007fff984861c5 clr!ArgIteratorTemplate::ForceSigWalk+0xa1, calling clr!SigParser::SkipExactlyOne
000000a6b8b3a280 00007fff985dd303 clr!DispatchInfo::InvokeMember+0x461, calling clr!DispatchInfo::InvokeMemberDebuggerWrapper
000000a6b8b3a440 00007fff984cc313 clr!CallDescrWorkerInternal+0x83
000000a6b8b3a4c0 00007fff984d55d0 clr!MethodDescCallSite::CallTargetWorker+0x264, calling clr!_security_check_cookie
000000a6b8b3a500 00007fff98485ba2 clr!ArgIteratorTemplate::ComputeReturnFlags+0x4a, calling clr!SigPointer::PeekElemTypeClosed
000000a6b8b3a550 00007fff984d2f2e clr!MethodDescCallSite::CallTargetWorker+0xa1, calling clr!_chkstk
000000a6b8b3a5a0 00007fff984861c5 clr!ArgIteratorTemplate::ForceSigWalk+0xa1, calling clr!SigParser::SkipExactlyOne
000000a6b8b3a5f0 00007fff983853a1 MSVCR120_CLR0400!getptd_noexit+0x74, calling KERNEL32!SetLastErrorStub
000000a6b8b3a620 00007fff98386352 MSVCR120_CLR0400!getptd+0xb, calling MSVCR120_CLR0400!getptd_noexit
000000a6b8b3a630 00007fff9838d916 MSVCR120_CLR0400!_GetEstablisherFrame+0x2e, calling MSVCR120_CLR0400!__StateFromControlPc
000000a6b8b3a650 00007fff9838d74d MSVCR120_CLR0400!GetImageBase+0x9, calling MSVCR120_CLR0400!getptd
000000a6b8b3a680 00007fff9838e8a8 MSVCR120_CLR0400!_DestructExceptionObject+0x118, calling MSVCR120_CLR0400!UnwindNestedFrames
000000a6b8b3a6d0 00007fff9838d74d MSVCR120_CLR0400!GetImageBase+0x9, calling MSVCR120_CLR0400!getptd
000000a6b8b3a700 00007fff983e64c9 MSVCR120_CLR0400!_DestructExceptionObject+0x817, calling MSVCR120_CLR0400!_DestructExceptionObject+0x70
000000a6b8b3a7b0 00007fff9838e00a MSVCR120_CLR0400!_DestructExceptionObject+0x59c, calling MSVCR120_CLR0400!_DestructExceptionObject+0x5e8
000000a6b8b3a7d0 00007fff9899721a clr!Debugger::NotifyOfCHFFilter+0x26, calling clr!CORDebuggerAttached
000000a6b8b3a800 00007fff98643234 clr!ExceptionTracker::GetOrCreateTracker+0x34, calling clr!GetThread
000000a6b8b3a810 00007fff9864390c clr!CEHelper::SetupCorruptionSeverityForActiveException+0x44, calling clr!ThreadExceptionState::GetExceptionRecord
000000a6b8b3a860 00007fff9864c116 clr!Thread::IsStackSpaceAvailable+0x2e, calling clr!GetCurrentSP
000000a6b8b3a8a0 00007fff9838df18 MSVCR120_CLR0400!_InternalCxxFrameHandler+0x208, calling MSVCR120_CLR0400!_DestructExceptionObject+0x134
000000a6b8b3a900 00007fff9838ddeb MSVCR120_CLR0400!_CxxFrameHandler+0x77, calling MSVCR120_CLR0400!_InternalCxxFrameHandler
000000a6b8b3a950 00007fff9865c76a clr!_GSHandlerCheck_EH+0x6e, calling clr!_CxxFrameHandler3
000000a6b8b3a978 00007fff985dd303 clr!DispatchInfo::InvokeMember+0x461, calling clr!DispatchInfo::InvokeMemberDebuggerWrapper
000000a6b8b3a980 00007fffb122dd5d ntdll!RtlpExecuteHandlerForException+0xd
000000a6b8b3a9b0 00007fffb11de653 ntdll!RtlDispatchException+0x197, calling ntdll!RtlpExecuteHandlerForException
000000a6b8b3aa38 00007fff985dd303 clr!DispatchInfo::InvokeMember+0x461, calling clr!DispatchInfo::InvokeMemberDebuggerWrapper
000000a6b8b3ab50 00007fff98634061 clr!ReflectionInvocation::ExecuteCodeWithGuaranteedCleanup+0x145, calling clr!HelperMethodFrameRestoreState
000000a6b8b3ab80 00007fff985dcee2 clr!InternalDispatchImpl_Invoke+0x1ed, calling clr!DispatchInfo::InvokeMember
000000a6b8b3ad80 00007fff984cc313 clr!CallDescrWorkerInternal+0x83
000000a6b8b3ae00 00007fff984d55d0 clr!MethodDescCallSite::CallTargetWorker+0x264, calling clr!_security_check_cookie
000000a6b8b3ae40 00007fff98485ba2 clr!ArgIteratorTemplate::ComputeReturnFlags+0x4a, calling clr!SigPointer::PeekElemTypeClosed
000000a6b8b3ae90 00007fff984d2f2e clr!MethodDescCallSite::CallTargetWorker+0xa1, calling clr!_chkstk
000000a6b8b3aee0 00007fff984861c5 clr!ArgIteratorTemplate::ForceSigWalk+0xa1, calling clr!SigParser::SkipExactlyOne
000000a6b8b3b070 00007fffb1203749 ntdll!RtlRaiseException+0x45, calling ntdll!RtlpCaptureContext
000000a6b8b3b080 00007fffb1203891 ntdll!RtlRaiseException+0x18d, calling ntdll!RtlDispatchException
000000a6b8b3b1a0 00007fff984cfdfb clr!PreStubWorker+0x46b, calling KERNEL32!SetLastErrorStub
000000a6b8b3b1e0 00007fffae656aac KERNELBASE!RaiseException+0x68, calling ntdll!RtlRaiseException
000000a6b8b3b3e0 00007fff984cc39a clr!CallDescrWorkerWithHandler+0x4a, calling clr!CallDescrWorkerInternal
000000a6b8b3b420 00007fff984d55d0 clr!MethodDescCallSite::CallTargetWorker+0x264, calling clr!_security_check_cookie
000000a6b8b3b4b0 00007fff9846291a clr!ThePreStub+0x5a, calling clr!PreStubWorker
000000a6b8b3b500 00007fff89f0edb5 (MethodDesc 00007fff89a14710 +0x15 System.AppDomain.get_Flags()), calling clr!JIT_GetSharedNonGCStaticBaseNoCtor_InlineGetAppDomain
000000a6b8b3b540 00007fff8ac217db (MethodDesc 00007fff89a08918 System.Exception.InternalPreserveStackTrace())
000000a6b8b3b580 00007fff984cc313 clr!CallDescrWorkerInternal+0x83
000000a6b8b3b5c0 00007fff984cc39a clr!CallDescrWorkerWithHandler+0x4a, calling clr!CallDescrWorkerInternal
000000a6b8b3b5d0 00007fff988a7231 clr!InvokeUtil::CreateTargetExcept+0x13e, calling clr!_security_check_cookie
000000a6b8b3b600 00007fff984d55d0 clr!MethodDescCallSite::CallTargetWorker+0x264, calling clr!_security_check_cookie
000000a6b8b3b640 00007fff9851e259 clr!HndCreateHandle+0x116, calling clr!StressLog::LogOn
000000a6b8b3b660 00007fff985205ae clr!HndDestroyHandle+0x33, calling clr!StressLog::LogOn
000000a6b8b3b690 00007fff984d26c5 clr!BaseDomain::CreateHandle+0x15, calling clr!GetCurrentThreadHomeHeapNumber
000000a6b8b3b6c0 00007fff9864175d clr!Thread::SetLastThrownObject+0xa4, calling clr!BaseDomain::CreateHandle
000000a6b8b3b6d0 00007fffae656aac KERNELBASE!RaiseException+0x68, calling ntdll!RtlRaiseException
000000a6b8b3b708 00007fffae656aac KERNELBASE!RaiseException+0x68, calling ntdll!RtlRaiseException
000000a6b8b3b780 00007fff986435a4 clr!IsExceptionOfType+0x15, calling clr!Object::GetTrueMethodTable
000000a6b8b3b7b0 00007fff98643d94 clr!RaiseTheExceptionInternalOnly+0x2fe, calling KERNEL32!RaiseExceptionStub
000000a6b8b3b8b0 00007fff987e3528 clr!RaiseTheException+0xa4, calling clr!RaiseTheExceptionInternalOnly
000000a6b8b3b8e0 00007fff987e3594 clr!RealCOMPlusThrow+0x69, calling clr!RaiseTheException
000000a6b8b3b950 00007fff98919ee9 clr!ThrowInvokeMethodException+0xd1, calling clr!RealCOMPlusThrow
000000a6b8b3ba00 00007fff98af57ea clr! ?? ::FNODOBFM::`string'+0xccd2a, calling clr!ThrowInvokeMethodException
000000a6b8b3ba60 00007fff984a146c clr!HelperMethodFrame::Push+0x19, calling clr!GetThread
000000a6b8b3ba90 00007fff98515ddd clr!RuntimeMethodHandle::InvokeMethod+0x21d, calling clr!_chkstk
000000a6b8b3bc40 00007fff9852ff6b clr!COMInterfaceMarshaler::FindOrCreateObjectRefInternal+0xe7, calling clr!ClassLoader::AvailableClasses_LockHolder::~AvailableClasses_LockHolder 000000a6b8b3bd40 00007fff9852fde2 clr!GetObjectRefFromComIP+0x1cb, calling clr!_security_check_cookie
000000a6b8b3bd60 00007fff984a146c clr!HelperMethodFrame::Push+0x19, calling clr!GetThread
000000a6b8b3bd90 00007fff985dc0df clr!ReflectionInvocation::AllocateValueType+0x1df, calling clr!_security_check_cookie
000000a6b8b3be50 00007fff98464629 clr!AppX::IsAppXProcess+0x9, calling clr!AppX::IsAppXProcess+0x20
000000a6b8b3be80 00007fff984c90ad clr!ReflectionInvocation::PerformSecurityCheck+0x71, calling clr!AppX::IsAppXProcess
000000a6b8b3bec0 00007fff89f3b0ac (MethodDesc 00007fff89aebb00 +0x4c System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(System.Object, System.Object[], System.Object[])), calling 00007fff98515bc0 (stub for System.RuntimeMethodHandle.InvokeMethod(System.Object, System.Object[], System.Signature, Boolean))
000000a6b8b3bf58 00007fff98515c77 clr!RuntimeMethodHandle::InvokeMethod+0xb7, calling clr!LazyMachStateCaptureState
000000a6b8b3c000 00007fff89f3b0ac (MethodDesc 00007fff89aebb00 +0x4c System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(System.Object, System.Object[], System.Object[])), calling 00007fff98515bc0 (stub for System.RuntimeMethodHandle.InvokeMethod(System.Object, System.Object[], System.Signature, Boolean))
000000a6b8b3c070 00007fff89f2f3d3 (MethodDesc 00007fff89aeb9e0 +0xd3 System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo)), calling (MethodDesc 00007fff89aebb00 +0 System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(System.Object, System.Object[], System.Object[]))
000000a6b8b3c0f0 00007fff984cc313 clr!CallDescrWorkerInternal+0x83
000000a6b8b3c140 00007fff984cc39a clr!CallDescrWorkerWithHandler+0x4a, calling clr!CallDescrWorkerInternal
000000a6b8b3c150 00007fff984cc39a clr!CallDescrWorkerWithHandler+0x4a, calling clr!CallDescrWorkerInternal
000000a6b8b3c180 00007fff984d55bd clr!MethodDescCallSite::CallTargetWorker+0x251, calling clr!CallDescrWorkerWithHandler
000000a6b8b3c1d0 00007fff98485ba2 clr!ArgIteratorTemplate::ComputeReturnFlags+0x4a, calling clr!SigPointer::PeekElemTypeClosed
000000a6b8b3c220 00007fff984d2f2e clr!MethodDescCallSite::CallTargetWorker+0xa1, calling clr!_chkstk
000000a6b8b3c270 00007fff984861c5 clr!ArgIteratorTemplate::ForceSigWalk+0xa1, calling clr!SigParser::SkipExactlyOne
000000a6b8b3c340 00007fff985dca5e clr!DispatchInfo::InvokeMemberWorker+0xebe, calling clr!MethodDescCallSite::CallTargetWorker
000000a6b8b3c630 00007fff7c49852e mshtml!CDocument::`vector deleting destructor'+0x1a, calling mshtml!ProcessHeapFree
000000a6b8b3c7d0 00007fffae6ac4b9 KERNELBASE!ParseURLW+0x84, calling KERNELBASE!lstrlenW
000000a6b8b3c7e8 00007fff8c69971f ieframe!IEGetNameAndFlagsEx+0x1f, calling ieframe!_chkstk
000000a6b8b3c810 00007fffb0b81950 OLEAUT32!SysAllocString+0x98, calling OLEAUT32!memcpy
000000a6b8b3c830 00007fff8c6965a2 ieframe!IEGetDisplayName+0x22, calling ieframe!IEGetNameAndFlagsEx
000000a6b8b3c840 00007fff8c6fa91e ieframe!ATL::CComBSTR::operator=+0x22, calling OLEAUT32!SysAllocString
000000a6b8b3c870 00007fff8c73bfc8 ieframe!GetEventURL+0x80, calling ieframe!_security_check_cookie
000000a6b8b3c890 00007fff8c6ba662 ieframe!IEParseDisplayNameWithBCW+0x92, calling KERNEL32!LocalFreeStub
000000a6b8b3c8b0 00007fffb0b81768 OLEAUT32!APP_DATA::FreeCachedMem+0x28
000000a6b8b3c900 00007fff8c73c044 ieframe!CBaseBrowser2::PidlFromUrl+0x60, calling ieframe!_security_check_cookie
000000a6b8b3cc00 00007fff985dbdaa clr!DispatchInfo::InvokeMemberDebuggerWrapper+0x1c6, calling clr!DispatchInfo::InvokeMemberWorker
000000a6b8b3cca0 00007fff98462f3e clr!HashMap::LookupValue+0x14d, calling clr!HashMap::CompareValues
000000a6b8b3cd60 00007fff985dd374 clr!DispatchInfo::InvokeMember+0x63b, calling clr!_security_check_cookie
000000a6b8b3ce00 00007fffb0b81b0a OLEAUT32!SysAllocStringLen+0xa6, calling OLEAUT32!memcpy
000000a6b8b3cef0 00007fff985dbdaa clr!DispatchInfo::InvokeMemberDebuggerWrapper+0x1c6, calling clr!DispatchInfo::InvokeMemberWorker
000000a6b8b3cf90 00007fff98462f3e clr!HashMap::LookupValue+0x14d, calling clr!HashMap::CompareValues
000000a6b8b3d020 00007fff984d5611 clr!FrameWithCookie::FrameWithCookie+0x26, calling clr!Frame::Push
000000a6b8b3d050 00007fff985dd303 clr!DispatchInfo::InvokeMember+0x461, calling clr!DispatchInfo::InvokeMemberDebuggerWrapper
000000a6b8b3d110 00007fff7c804ec4 mshtml!CDispNode::GetLayoutTransform+0x18, calling mshtml!SDispNodeReadCursor<2>::SDispNodeReadCursor<2>
000000a6b8b3d180 00007fff7c1f4abe mshtml!CDispNode::AddPreNodeTransform+0x1368, calling mshtml!_security_check_cookie
000000a6b8b3d340 00007fff985dcee2 clr!InternalDispatchImpl_Invoke+0x1ed, calling clr!DispatchInfo::InvokeMember
000000a6b8b3d460 00007fff985dcd4c clr!InternalDispatchImpl_Invoke_CallBack+0xb2, calling clr!InternalDispatchImpl_Invoke
000000a6b8b3d4c0 00007fff985dcc8e clr!InternalDispatchImpl_Invoke_Wrapper+0xf8, calling clr!InternalDispatchImpl_Invoke_CallBack
000000a6b8b3d560 00007fff8c70572e ieframe!EnumInvokeCallback+0x7a
000000a6b8b3d5b0 00007fff8c706151 ieframe!GetConnectionPointSink+0x21
000000a6b8b3d5e0 00007fff8c7060d2 ieframe!EnumConnectionPointSinks+0xc6
000000a6b8b3d660 00007fff8c683cca ieframe!DirectUI::AutoReleasePointer::~AutoReleasePointer+0x12
000000a6b8b3d6c0 00007fff8c705fc1 ieframe!IConnectionPoint_InvokeIndirect+0xa9, calling ieframe!EnumConnectionPointSinks
000000a6b8b3d6e0 00007fff8c703e3c ieframe!CIEFrameAuto::v_InternalQueryInterface+0x34, calling SHLWAPI!QISearchStub
000000a6b8b3d740 00007fff8c705ee0 ieframe!DoInvokeParamHelper+0xe0, calling ieframe!IConnectionPoint_InvokeIndirect
000000a6b8b3d810 00007fff8c9dcc93 ieframe!CWebBrowserOC::v_InternalQueryInterface+0x2f, calling SHLWAPI!QISearchStub
000000a6b8b3d830 00007fff8c9da6c7 ieframe!CWebBrowserSB::QueryService+0x1bf, calling ieframe!CBaseBrowser2::QueryService
000000a6b8b3d840 00007fff8c705451 ieframe!CBaseBrowser2::QueryService+0x3ba
000000a6b8b3d860 00007fff8c738ccb ieframe!CIEFrameAuto::QueryService+0xa3
000000a6b8b3d870 00007fffae653100 KERNELBASE!QISearch+0x80
000000a6b8b3d890 00007fff8c9da6c7 ieframe!CWebBrowserSB::QueryService+0x1bf, calling ieframe!CBaseBrowser2::QueryService
000000a6b8b3d8d0 00007fffb0b81950 OLEAUT32!SysAllocString+0x98, calling OLEAUT32!memcpy
000000a6b8b3d900 00007fff8c752131 ieframe!FireEvent_DocumentComplete+0x1aa, calling ieframe!DoInvokeParamHelper
000000a6b8b3d960 00007fff8c6a0f08 ieframe!IsErrorUrl+0x28, calling KERNELBASE!StrCmpNW
000000a6b8b3d9b0 00007fff8c751698 ieframe!CBaseBrowser2::_FireDocumentComplete+0x64, calling ieframe!FireEvent_DocumentComplete
000000a6b8b3d9e0 00007fff8c7515e4 ieframe!CBaseBrowser2::FireDocumentComplete+0x68, calling ieframe!CBaseBrowser2::_FireDocumentComplete
000000a6b8b3da20 00007fff7c37aa33 mshtml!CWebOCEvents::DocumentComplete+0x138
000000a6b8b3da60 00007fff7c3793dc mshtml!CDocument::Fire_onreadystatechange+0x70, calling mshtml!CWindow::GetFrameSite
000000a6b8b3dad0 00007fff7c375279 mshtml!CMarkup::OnLoadStatusDone+0x2a9, calling mshtml!CWebOCEvents::DocumentComplete
000000a6b8b3db90 00007fff7c374f82 mshtml!CMarkup::OnLoadStatus+0x49, calling mshtml!CMarkup::OnLoadStatusDone
000000a6b8b3dbc0 00007fff7c374eab mshtml!CProgSink::DoUpdate+0x4e7, calling mshtml!CMarkup::OnLoadStatus
000000a6b8b3dcc0 00007fffb11c81c1 ntdll!RtlAllocateHeap+0xe1, calling ntdll!RtlpLowFragHeapAllocFromContext
000000a6b8b3dd60 00007fffb0f594fc RPCRT4!NdrClientCall2+0x1c, calling RPCRT4!NdrpClientCall2
000000a6b8b3dd90 00007fffb00f93b7 combase!CRpcResolver::RegisterWindowPropInterface+0xab, calling combase!CRpcResolver::RetryRPC
000000a6b8b3de10 00007fffb00f9301 combase!InternalRegisterWindowPropInterface+0x21, calling combase!CRpcResolver::RegisterWindowPropInterface
000000a6b8b3de20 00007fffb007ffa7 combase!FreeObjRef+0x1f, calling combase!OXIDEntry::DecRefCnt
000000a6b8b3de50 00007fffb050f47e ole32!AssignEndpointObject+0xf6, calling ole32!__security_check_cookie
000000a6b8b3df30 00007fffb050f18b ole32!CPrivDragDrop::CPrivDragDrop+0x3b
000000a6b8b3df60 00007fffb050f36f ole32!AssignDragDropEndpointProperty+0x63
000000a6b8b3df90 00007fffb050f2ef ole32!RegisterDragDropImpl+0x8f, calling ole32!AssignDragDropEndpointProperty
000000a6b8b3dfc0 00007fffb050f230 ole32!RegisterDragDrop+0x34, calling ole32!RegisterDragDropImpl
000000a6b8b3dfe0 00007fff8c9a6bdd ieframe!CDocObjectHost::GetDropTarget+0xdd, calling ieframe!IUnknown_SafeReleaseAndNullPtr
000000a6b8b3dff0 00007fff7c3ac27a mshtml!CDropTarget::Release+0x12, calling mshtml!CBase::SubRelease
000000a6b8b3e020 00007fff7c1eb1e4 mshtml!CPaintController::AttemptForcedPaint+0x14, calling iertutil!IEConfiguration_GetBool
000000a6b8b3e050 00007fff7c1eb3d2 mshtml!GlobalWndOnMethodCall+0x1da
000000a6b8b3e0e0 00007fff7c1ea6be mshtml!GlobalWndProc+0x1a1, calling mshtml!GlobalWndOnMethodCall
000000a6b8b3e160 00007fffaea927a4 USER32!UserCallWinProcCheckWow+0x140
000000a6b8b3e1f0 00007fffaea92713 USER32!UserCallWinProcCheckWow+0xb3, calling ntdll!RtlActivateActivationContextUnsafeFast
000000a6b8b3e220 00007fffaea92257 USER32!DispatchMessageWorker+0x1a7, calling USER32!UserCallWinProcCheckWow
000000a6b8b3e270 00007fff984a1075 clr!JIT_InitPInvokeFrame+0x15, calling clr!GetThread
000000a6b8b3e2a0 00007fff880c4560 (MethodDesc 00007fff87dfd7f0 +0x70 DomainBoundILStubClass.IL_STUB_PInvoke(MSG ByRef))
000000a6b8b3e2f8 00007fff880c4560 (MethodDesc 00007fff87dfd7f0 +0x70 DomainBoundILStubClass.IL_STUB_PInvoke(MSG ByRef))
000000a6b8b3e370 00007fff88041031 (MethodDesc 00007fff87e9e440 +0x681 System.Windows.Forms.Application+ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr, Int32, Int32)), calling 00007fff87fdaed8 (stub for System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG ByRef))
000000a6b8b3e390 00007fff89f426b1 (MethodDesc 00007fff89a08f18 +0x61 System.Runtime.InteropServices.Marshal.SizeOf(System.Type)), calling clr!JIT_GetSharedGCStaticBase_InlineGetAppDomain
000000a6b8b3e570 00007fff8804080f (MethodDesc 00007fff87e9b368 +0x56f System.Windows.Forms.Application+ThreadContext.RunMessageLoopInner(Int32, System.Windows.Forms.ApplicationContext))
000000a6b8b3e5e0 00007fff89e74d5d (MethodDesc 00007fff89c2f820 +0x1d System.IO.__ConsoleStream.Flush())
000000a6b8b3e690 00007fff89f1d46e (MethodDesc 00007fff89aedf28 +0x1e System.MulticastDelegate.CtorClosed(System.Object, IntPtr)), calling clr!JIT_WriteBarrier
000000a6b8b3e6c0 00007fff880401cf (MethodDesc 00007fff87ded368 +0x6f System.Windows.Forms.Application+ThreadContext.RunMessageLoop(Int32, System.Windows.Forms.ApplicationContext)),
calling 00007fff39b18040
000000a6b8b3e6e0 00007fff89f081f8 (MethodDesc 00007fff89a0a1d8 +0x18 System.Threading.Interlocked.CompareExchange[[System.__Canon, mscorlib]](System.__Canon ByRef, System.__Canon, System.__Canon)), calling 00007fff984e2c80 (stub for System.Threading.Interlocked.CompareExchange(System.Object ByRef, System.Object, System.Object))
000000a6b8b3e750 00007fff39aad6dd (MethodDesc 00007fff39add920 +0x16d QueryAnswering.WebUtils+<>c__DisplayClass15.b__f()), calling (MethodDesc 00007fff87ded878 +0
System.Windows.Forms.Application.Run())
000000a6b8b3e790 00007fff89e76b17 (MethodDesc 00007fff89c206f0 +0x17 System.Threading.ThreadHelper.ThreadStart_Context(System.Object)), calling clr!JIT_GetSharedNonGCStaticBase_InlineGetAppDomain
000000a6b8b3e7c0 00007fff89f11a55 (MethodDesc 00007fff89aee220 +0x285 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean))
000000a6b8b3e920 00007fff89f117c9 (MethodDesc 00007fff89aee210 +0x9 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)), calling (MethodDesc 00007fff89aee220 +0 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean))
000000a6b8b3e950 00007fff89f117a7 (MethodDesc 00007fff89aee200 +0x57 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)), calling (MethodDesc 00007fff89aee210 +0 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean))
000000a6b8b3e970 00007fffb0cce774 KERNEL32!QuirkIsEnabled3Worker+0x84, calling KERNEL32!_security_check_cookie
000000a6b8b3e9a0 00007fff89e76af1 (MethodDesc 00007fff89afc190 +0x51 System.Threading.ThreadHelper.ThreadStart()), calling (MethodDesc 00007fff89aee200 +0 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object))
000000a6b8b3e9f0 00007fff984cc313 clr!CallDescrWorkerInternal+0x83
000000a6b8b3ea30 00007fff984cc39a clr!CallDescrWorkerWithHandler+0x4a, calling clr!CallDescrWorkerInternal
000000a6b8b3ea70 00007fff984d55bd clr!MethodDescCallSite::CallTargetWorker+0x251, calling clr!CallDescrWorkerWithHandler
000000a6b8b3eab0 00007fff98485ba2 clr!ArgIteratorTemplate::ComputeReturnFlags+0x4a, calling clr!SigPointer::PeekElemTypeClosed
000000a6b8b3eb00 00007fff984d2f2e clr!MethodDescCallSite::CallTargetWorker+0xa1, calling clr!_chkstk
000000a6b8b3eb50 00007fff9848614d clr!ArgIteratorTemplate::ForceSigWalk+0x16a, calling clr!ArgIteratorTemplate::ComputeReturnFlags
000000a6b8b3eb90 00007fff984d341d clr!MethodDesc::GetCallTarget+0x6a, calling clr!MethodDesc::GetSingleCallableAddrOfVirtualizedCode
000000a6b8b3ec20 00007fff98620715 clr!ThreadNative::KickOffThread_Worker+0x105, calling clr!MethodDescCallSite::CallTargetWorker
000000a6b8b3ec80 00007fffb11c81c1 ntdll!RtlAllocateHeap+0xe1, calling ntdll!RtlpLowFragHeapAllocFromContext
000000a6b8b3edd0 00007fffb11c81c1 ntdll!RtlAllocateHeap+0xe1, calling ntdll!RtlpLowFragHeapAllocFromContext
000000a6b8b3ee00 00007fffb00806a0 combase!RegisterThreadCleanupCallback+0x28, calling KERNELBASE!FlsSetValue
000000a6b8b3ee30 00007fffb00808e9 combase!_CoInitializeEx+0x209, calling combase!CoVrfNotifyCoInit
000000a6b8b3ee80 00007fff9851f6a1 clr!Frame::Pop+0x8d
000000a6b8b3eea0 00007fff98386228 MSVCR120_CLR0400!control87+0x28, calling MSVCR120_CLR0400!get_fpsr
000000a6b8b3eec0 00007fff9851f628 clr!Thread::SetExposedContext+0x1dc, calling clr!Frame::Pop+0x60
000000a6b8b3eed0 00007fff984629d8 clr!ClrFlsIncrementValue+0x18, calling clr!ClrFlsGetBlock
000000a6b8b3eee0 00007fff984642fa clr!EEHeapAllocInProcessHeap+0x46, calling ntdll!RtlAllocateHeap
000000a6b8b3ef00 00007fff984629d8 clr!ClrFlsIncrementValue+0x18, calling clr!ClrFlsGetBlock
000000a6b8b3ef60 00007fff984a1575 clr!Frame::Push+0xe, calling clr!GetThread
000000a6b8b3ef90 00007fff984d5611 clr!FrameWithCookie::FrameWithCookie+0x26, calling clr!Frame::Push
000000a6b8b3efc0 00007fff9851f564 clr!Thread::SetExposedContext+0x105, calling clr!Thread::SetExposedContext+0x170
000000a6b8b3f050 00007fff9851f6df clr!Thread::SetExposedContext+0x8b, calling clr!Thread::SetExposedContext+0x90
000000a6b8b3f0b0 00007fff986205f6 clr!ThreadNative::KickOffThread+0xc6, calling clr!Thread::SetExposedContext+0x5c
000000a6b8b3f150 00007fff98675090 clr!operator delete+0x14, calling clr!EEHeapFreeInProcessHeap
000000a6b8b3f180 00007fff9851ef3a clr!Thread::intermediateThreadProc+0x7d
000000a6b8b3f1b0 00007fffae6acae6 KERNELBASE!ConsoleCallServerGeneric+0xf2, calling KERNELBASE!_security_check_cookie
000000a6b8b3f2b0 00007fff7c1d142a mshtml!PrivacieDllMain+0x5a, calling mshtml!_security_check_cookie
000000a6b8b3f370 00007fffb11c81c1 ntdll!RtlAllocateHeap+0xe1, calling ntdll!RtlpLowFragHeapAllocFromContext
000000a6b8b3f3b0 00007fffa5dd8166 mscoreei!calloc_impl+0x5d, calling ntdll!RtlAllocateHeap
000000a6b8b3f3c0 00007fffb11c8600 ntdll!RtlpLowFragHeapAllocFromContext+0x300, calling ntdll!memset
000000a6b8b3f3e0 00007fffa5dd3f83 mscoreei!initptd+0xb7, calling mscoreei!unlock
000000a6b8b3f400 00007fffb11c8600 ntdll!RtlpLowFragHeapAllocFromContext+0x300, calling ntdll!memset
000000a6b8b3f410 00007fffb11c8600 ntdll!RtlpLowFragHeapAllocFromContext+0x300, calling ntdll!memset
000000a6b8b3f490 00007fff7c1d13a0 mshtml!DllMain+0x7b, calling mshtml!PrivacieDllMain
000000a6b8b3f4d0 00007fffa5991241 msxml6!__DllMainCRTStartup+0xf5, calling msxml6!DllMain
000000a6b8b3f500 00007fffb0fa119d WLDAP32!DllMainCRTStartup+0x139, calling WLDAP32!DllMain
000000a6b8b3f580 00007fff9570576a ConEmuHk64!SetHookCallbacks+0x2224a, calling ntdll!RtlAllocateHeap
000000a6b8b3f5b0 00007fffb11b6d3b ntdll!RtlDeactivateActivationContextUnsafeFast+0xc7, calling ntdll!_security_check_cookie
000000a6b8b3f5e0 00007fffb11b6e53 ntdll!RtlActivateActivationContextUnsafeFast+0x93, calling ntdll!_security_check_cookie
000000a6b8b3f5f0 00007fff956fcdca ConEmuHk64!SetHookCallbacks+0x198aa, calling KERNEL32!GetCurrentThreadId
000000a6b8b3f600 0000000073ec32c3 MSVCR90!initptd+0xa7, calling MSVCR90!unlock
000000a6b8b3f630 00007fffa599138a msxml6!InitDllMain+0x88, calling msxml6!_DllMainCRTStartup
000000a6b8b3f650 00007fffb11d1a58 ntdll!LdrpReleaseModuleEnumLock+0x1c, calling ntdll!RtlReleaseSRWLockShared
000000a6b8b3f660 00007fffb11b6ec5 ntdll!LdrpCallInitRoutine+0x41
000000a6b8b3f680 00007fffb11d19fb ntdll!LdrpReleaseLoaderLock+0x27, calling ntdll!LdrpReleaseModuleEnumLock
000000a6b8b3f6c0 00007fffb11b6c3b ntdll!LdrpInitializeThread+0x1f3, calling ntdll!LdrpReleaseLoaderLock
000000a6b8b3f730 00007fffb11b6b7b ntdll!LdrpInitializeThread+0x133, calling ntdll!RtlActivateActivationContextUnsafeFast
000000a6b8b3f738 00007fffb11b6bae ntdll!LdrpInitializeThread+0x166, calling ntdll!RtlDeactivateActivationContextUnsafeFast
000000a6b8b3f7a0 00007fffb1203d10 ntdll!_LdrpInitialize+0xac, calling ntdll!NtTestAlert
000000a6b8b3f810 00007fffb1203c1c ntdll!LdrInitializeThunk+0x18, calling ntdll!NtContinue
000000a6b8b3fc80 00007fff9851ef23 clr!Thread::intermediateThreadProc+0x66, calling clr!_chkstk
000000a6b8b3fcc0 00007fffb0cb1331 KERNEL32!BaseThreadInitThunk+0xd
000000a6b8b3fcf0 00007fffb11f8cd5 ntdll!RtlUserThreadStart+0x1d

And so it goes

Сегодня я наблюдал наихудший переводческий грех, который может явиться на свет. Русские переводчики «Жизнь Пи» умудрились одной фразой убить весь смысл фильма. Вы понимаете, весь смысл, убить перевод кульминационного момента. Я такого никогда в жизни ещё не видел.

Господа надмозги, «And so it goes with God» — это примерно «Вот так дело обстоит и с Богом». А никак не ваше идиотское «И в ней [истории] определённо есть Бог».

Ребята, старайтесь не смотреть кино в переводе, пожалуйста. Ваши нервы того не стоят.

Google -= Jabber

FYI.
Google drops XMPP (Jabber) support soon. There won't be GTalk as a Jabber-based protocol anymore; they replace it with a new proprietary messaging service called Hangouts. It means that all our desktop/mobile Jabber clients will stop working with GTalk any time soon. Nobody knows what's going to happen with a chat window in your GMail.
I'm not going to switch to Hangouts. I don't want to support Google in their urge of replacing well-known public standards with proprietary alternatives. In practice it means that I'm likely to disappear from your contact lists any time soon, since I've been using GTalk through desktop-based Jabber client (QIP) for a while.
If you want to continue talking with me, my primary Jabber account is skiminok@qip.ru. Please authorize it in your contact list. Also, I highly recommend you to drop GTalk and switch to some other Jabber server instead, there're hundreds of them. Google lost its "the most reliable company" status irrevocably.

P.S. When I said "Please authorize skiminok@qip.ru in your account", I did NOT mean "in your GTalk account".
Your GTalk account will be replaced with Hangouts soon, and you will lose any way of communication with me. Hangouts/GTalk will not send messages to @qip.ru accounts and vice versa. I highly recommend you to choose some other Jabber server ASAP.

Profile

Skiminok
skiminog
Alex Polozov

Latest Month

Май 2015
Вс Пн Вт Ср Чт Пт Сб
     12
3456789
10111213141516
17181920212223
24252627282930
31      

Syndicate

RSS Atom

Разработано LiveJournal.com
Designed by Lilia Ahner