<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://menshikov.org/feed.xml" rel="self" type="application/atom+xml" /><link href="https://menshikov.org/" rel="alternate" type="text/html" /><updated>2026-09-29T01:11:17+00:00</updated><id>https://menshikov.org/feed.xml</id><title type="html">Maxim Menshikov</title><subtitle>Cybersecurity expert and static analysis researcher in Porto, Portugal. I build static analysis, security and developer tools that find real bugs and vulnerabilities in production code.</subtitle><author><name>Maxim Menshikov</name><email>maxim@menshikov.org</email></author><entry><title type="html">Full Unlock sources are public</title><link href="https://menshikov.org/2026/09/29/full-unlock-open-source/" rel="alternate" type="text/html" title="Full Unlock sources are public" /><published>2026-09-29T00:00:00+00:00</published><updated>2026-09-29T00:00:00+00:00</updated><id>https://menshikov.org/2026/09/29/full-unlock-open-source</id><content type="html" xml:base="https://menshikov.org/2026/09/29/full-unlock-open-source/"><![CDATA[<p>I published the sources of <a href="/project/full-unlock/">Full Unlock</a> v4.0. It was my unlock for Windows Phone 7, released in 2012. It let the phone run unsigned native code and gave root access to the apps you chose. Custom ROMs shipped it, and some of my own tools could not work without it: the Opera Mobile and Opera Mini ports, Native Debugger, WPBackup, the WMDC launcher.</p>

<p>All repositories are in one GitHub list: <a href="https://github.com/stars/maximmenshikov/lists/full-unlock">Full Unlock</a>.</p>

<!--more-->

<h2 id="how-it-worked">How it worked</h2>

<p>WP7 verifies every module before it loads. When an app wants something protected, the OS asks a policy engine. Full Unlock replaced both of them and hid the replacement.</p>

<ul>
  <li><a href="https://github.com/maximmenshikov/clkflt">clkflt</a> is a file-system filter. When the OS opens a stock system module, clkflt serves a patched copy instead. The modified files stay hidden from the kernel, so Windows Update kept working. It also caches file contents in memory, which made the phone a bit faster.</li>
  <li><a href="https://github.com/maximmenshikov/ulv">ulv</a> stands in for <code class="language-plaintext highlighter-rouge">\Windows\mslvmod.dll</code>, the loader verifier. It calls the original and then overrides the verdict. Every module gets permission to execute.</li>
  <li><a href="https://github.com/maximmenshikov/upl">upl</a> stands in for the policy engine. If the caller’s account is privileged, the request passes. If not, upl denies it and posts a record to a message queue.</li>
  <li><a href="https://github.com/maximmenshikov/uplhlp">uplhlp</a> reads that queue and shows a toast that offers to unlock the app.</li>
  <li><a href="https://github.com/maximmenshikov/accman">accman</a> moves accounts into the privileged group. It takes the list from <code class="language-plaintext highlighter-rouge">HKLM\Software\OEM\Accman</code>. A <code class="language-plaintext highlighter-rouge">FULL_TRUST</code> value there opens the whole system to every app.</li>
  <li><a href="https://github.com/maximmenshikov/StringLoader">StringLoader</a> is a small library that loads localized strings for uplhlp.</li>
</ul>

<p>I described the whole chain in detail back in 2014: <a href="/2014/02/01/how-it-works-full-unlock/">How it works: Full Unlock</a> (in English) and <a href="/2014/02/01/how-it-works-full-unlock-russian/">Как это работает: Full Unlock</a> (in Russian). In 2019 I gave a talk on the same topic at SPISOK-2019: <a href="/paper/windows-phone-7-full-unlock-architecture/">Windows Phone 7 full unlock architecture</a>.</p>

<h2 id="building-it">Building it</h2>

<p>You need Visual Studio 2008, the Windows Mobile 6 Professional SDK and the WP7 SDK. Every project targets ARMv4I. <a href="https://github.com/maximmenshikov/constellation-wp7">constellation-wp7</a> is a workspace: <code class="language-plaintext highlighter-rouge">basis install</code> clones all six components side by side.</p>

<p>Microsoft ended WP7 support in 2014, so the code is here for reading. The project pages on this site now link to the sources: <a href="/project/cloaking-filter-fsperf/">Cloaking Filter</a>, <a href="/project/loaderverifier-ulv/">LoaderVerifier</a>, <a href="/project/upolicyengine-upl/">uPolicyEngine</a>, <a href="/project/account-manager/">Account Manager</a>.</p>]]></content><author><name>Maxim Menshikov</name></author><category term="Announcements" /><category term="wp7" /><category term="reverse-engineering" /><category term="sources" /><summary type="html"><![CDATA[I published the sources of Full Unlock v4.0, the Windows Phone 7 unlock from 2012. Six components, what each of them replaced in the OS, and how to build them.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://menshikov.org/images/L-3541.jpg" /><media:content medium="image" url="https://menshikov.org/images/L-3541.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Changing landscape</title><link href="https://menshikov.org/2024/10/21/changing-landscape/" rel="alternate" type="text/html" title="Changing landscape" /><published>2024-10-21T20:49:12+00:00</published><updated>2024-10-21T20:49:12+00:00</updated><id>https://menshikov.org/2024/10/21/changing-landscape</id><content type="html" xml:base="https://menshikov.org/2024/10/21/changing-landscape/"><![CDATA[<p>Imagine, you wake up in 2008, make coffee, spin up your Windows laptop and start developing. Back in 2008, the best you could have was Visual Studio. No other comparable environments.</p>

<!--more-->

<p>In 2024, there are tens of IDEs, text editors that work better than IDEs, all of them use Language Server Protocols, there are many static analyzers, testing tools, whatever.</p>

<p>Did the development process become better? If you never coded before, it feels like yes. Endless choices of libraries, ways to show off your skills, Docker containers, Kubernetes deployments. You can literally start coding with AI (badly but still).</p>

<p>The truth is that the process didn’t become any better. These features harm you in many ways. Two important aspects below.</p>

<h2 id="you-no-longer-own-what-you-develop">You no longer own what you develop.</h2>

<p>Many parts of your app stay in the cloud. Most parts are developed by someone else. To use all of that, you have to pay someone directly or indirectly.</p>

<blockquote>
  <p>Cut off Docker, your app is dead. Cut off AWS, how does your cloud service work?</p>
</blockquote>

<p>If I were to destroy the entire world’s IT, I would hit connectivity to any of these services. This is so fragile.</p>

<h2 id="you-no-longer-get-hands-on-experience">You no longer get hands-on experience.</h2>

<p>I like containers as daily life simplifier. I simplify setups a lot with them. However, do you fully understand what happens inside the container?</p>

<p>Do you understand the underlying technology behind Docker, like Linux itself, security hardeners (seccomp, apparmor, whatever), OverlayFS, uid maps, etc. I doubt so. Moreover, package installation becomes a mystery: you just take the easiest image with a simple setup, and you never care what happens inside.</p>

<p>This sparkles the whole generation of fast enablers. Cool for the economy of IT fast food, terrible for proper high-tech industry where you have to actually innovate.</p>

<h2 id="no-conclusion">No conclusion</h2>

<p>The progress is unstoppable. However, we must have some ways to stop <em>intellectual property</em> and actual <em>knowledge</em> from spreading across different parties.</p>]]></content><author><name>Maxim Menshikov</name></author><category term="Thoughts" /><category term="c" /><category term="cloud" /><summary type="html"><![CDATA[We have more tools than ever — IDEs, language servers, containers, clouds, AI. But more choice did not make development better. Two ways it quietly works against you.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://menshikov.org/images/L-3541.jpg" /><media:content medium="image" url="https://menshikov.org/images/L-3541.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">CMake to Microchip Studio project file generation</title><link href="https://menshikov.org/2021/10/01/cast/" rel="alternate" type="text/html" title="CMake to Microchip Studio project file generation" /><published>2021-10-01T20:49:12+00:00</published><updated>2021-10-01T20:49:12+00:00</updated><id>https://menshikov.org/2021/10/01/cast</id><content type="html" xml:base="https://menshikov.org/2021/10/01/cast/"><![CDATA[<p>One big issue with refactorings of projects used in companies is that people get used to some software. There are many people who stick to Windows 7 when Windows 10/11 is quite a good replacement. I liked Visual Studio 2008 way more than Visual Studio 2010 back in time because it was way faster.
If you want to replace the build system, the problem is even harder. How to promote a new build system, while keeping the benefits of older IDE?</p>

<!--more-->

<p>I’ve seen the need to support <strong>Microchip (Atmel) Studio</strong> project generation for CMake projects. I’ve tested alternatives like a third-party generator for CMake, but it was hard to deploy in practice.</p>

<p>Is there anything easier to deploy than a small Python script? I doubt so. So, I’ve created a simple Python project called <a href="/project/cast">Cast (Compile Commands to Atmel Studio converter)</a>. As the tool’s name suggests, it can be used for any project producing <code class="language-plaintext highlighter-rouge">compile_commands.json</code>, not only CMake ones.</p>

<p>If you add a <code class="language-plaintext highlighter-rouge">Makefile</code> wrapper for your build system, you will be able to build from within Microchip Studio as well.</p>

<p>Help improve the tool if you feel it is handy for you!</p>]]></content><author><name>Maxim Menshikov</name></author><category term="Announcements" /><category term="embedded" /><category term="ide" /><category term="logging" /><summary type="html"><![CDATA[One big issue with refactorings of projects used in companies is that people get used to some software. There are many people who stick to Windows 7 when Windows 10/11 is quite a good replacement. I liked Visual Studio 2008 way more than Visual Studio 2010 back in time because it was way faster. If you want to replace the build system, the problem is even harder. How to promote a new build system, while keeping the benefits of older IDE?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://menshikov.org/images/L-3541.jpg" /><media:content medium="image" url="https://menshikov.org/images/L-3541.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">A library for parsing printf format</title><link href="https://menshikov.org/2021/11/06/fmtparser/" rel="alternate" type="text/html" title="A library for parsing printf format" /><published>2021-10-01T20:49:12+00:00</published><updated>2021-10-01T20:49:12+00:00</updated><id>https://menshikov.org/2021/11/06/fmtparser</id><content type="html" xml:base="https://menshikov.org/2021/11/06/fmtparser/"><![CDATA[<p>Once I needed to parse <code class="language-plaintext highlighter-rouge">printf</code> format string. Surprisingly, I haven’t found
any decent library to do this. Most sources suggest using regular expressions,
but I wanted a more elegant solution for my future projects.</p>

<!--more-->

<p>Here it is: pure C library for parsing the format. Its usage is as simple as:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>#include "fmt_parser.h"
#include "fmt_util.h"
#include &lt;stdio.h&gt;

int main()
{
    fmt_status  rc;
    fmt_spec    spec;
    const char *str = "Hello, %157$02ld test %*s world!";
    const char *tmp = str;

    do
    {
        fmt_spec_init(&amp;spec);
        rc = fmt_read_one(&amp;tmp, &amp;spec);
        if (rc == FMT_EOK)
        {
            fmt_spec_print(&amp;spec, stdout);
            printf("\n");
        }
    } while (fmt_read_is_ok(rc));

    return 0;
}
</code></pre></div></div>

<p>Additionally, it doesn’t allocate memory, so it is safe in that aspect.</p>

<h2 id="specifier-api">Specifier API</h2>

<p>If you use it from other languages, the specifier API might be handy for you as
it provided some wrappers for string and specifier allocation (you should not
need to know the compile-time size of structures then).
This API can be disabled using <code class="language-plaintext highlighter-rouge">-DENABLE_SPEC_API=OFF</code>.</p>

<h2 id="custom-char-type">Custom char type</h2>

<p>Some projects might use a custom char type. The library doesn’t support runtime
change of char type as of now, but it provides an option to set up type in
compile time. See <code class="language-plaintext highlighter-rouge">-DCHAR_TYPE</code>.</p>

<h2 id="future-directions">Future directions</h2>

<p>The library doesn’t support custom specifiers. Moreover, it doesn’t support de-facto standard specifiers from Microsoft, Linux, etc. I will improve the library as I see the need for it (I will).</p>

<p>Contributions are always welcome! The MIT license allows reusing the library in other projects pretty freely.</p>]]></content><author><name>Maxim Menshikov</name></author><category term="Announcements" /><category term="c" /><category term="printf" /><summary type="html"><![CDATA[Once I needed to parse printf format string. Surprisingly, I haven’t found any decent library to do this. Most sources suggest using regular expressions, but I wanted a more elegant solution for my future projects.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://menshikov.org/images/L-3541.jpg" /><media:content medium="image" url="https://menshikov.org/images/L-3541.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Cognitive load reduction as a debugging aid</title><link href="https://menshikov.org/2021/04/07/cognitive-load-reduction-as-a-debugging-aid/" rel="alternate" type="text/html" title="Cognitive load reduction as a debugging aid" /><published>2021-04-07T11:38:33+00:00</published><updated>2021-04-07T11:38:33+00:00</updated><id>https://menshikov.org/2021/04/07/cognitive-load-reduction-as-a-debugging-aid</id><content type="html" xml:base="https://menshikov.org/2021/04/07/cognitive-load-reduction-as-a-debugging-aid/"><![CDATA[<p>What are the biggest issues when debugging large projects?</p>

<p>At some point, you notice that these projects don’t obey to rules. It is often impossible to run these tools under a debugger to get a meaningful result. You get unreadable hundred millions log lines. Reverse debuggers are not useful either: the place where the bug appears is so far from the crash point that you might never really find it.</p>

<!--more-->

<p>My advice in such cases is:</p>

<ol>
  <li>Spend time and try to think of a possible error.</li>
  <li>Narrow the log down to the domain which, as you think, might be buggy. If possible, disable all other logging so it doesn’t consume priceless time.</li>
  <li>Simplify log: print inputs, outputs and actions done.</li>
  <li>Repeat until you find the error in function output.</li>
</ol>

<p>This reduces cognitive load down to a minimum and allows you to finally read all the important actions.</p>

<div class="callout">
  <p>This works best if the final execution takes under 1 second, or at most 10 seconds.</p>
</div>]]></content><author><name>Maxim Menshikov</name></author><category term="Thoughts" /><category term="cognitive load" /><category term="debugging" /><category term="logging" /><summary type="html"><![CDATA[Some bugs live in projects too large to run under a debugger, where the logs are millions of lines long. The fix is not a smarter tool — it is reducing how much you have to hold in your head at once.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://menshikov.org/images/L-3541.jpg" /><media:content medium="image" url="https://menshikov.org/images/L-3541.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Implicit knowledge breaks your software</title><link href="https://menshikov.org/2021/03/21/implicit-knowledge-breaks-your-software/" rel="alternate" type="text/html" title="Implicit knowledge breaks your software" /><published>2021-03-21T12:33:56+00:00</published><updated>2021-03-21T12:33:56+00:00</updated><id>https://menshikov.org/2021/03/21/implicit-knowledge-breaks-your-software</id><content type="html" xml:base="https://menshikov.org/2021/03/21/implicit-knowledge-breaks-your-software/"><![CDATA[<p>Software engineering practices is what built the industry we know. It is always critical to acquire locks in order, to unlock the spinlock at all, etc.</p>

<!--more-->

<p>So, you know the technology. You think you may code more efficiently than best practices suggest, and it is often true. But what happens when you make exceptions for best practices?</p>

<h2 id="think-ahead">Think ahead</h2>

<p>A junior software engineer comes to the company. The person (hopefully) reads outdated policies and understands nothing about the development process in your company. The more tickets are assigned, the more code this person writes. How to write it? Of course, by looking into existing examples. Now, terrible things happen in the background, e.g. memory leaks start occurring… You review the code and miss bugs because a big part of the code looks familiar to what you write. The <em>implicit</em> knowledge of yours is lost.</p>

<blockquote>
  <p>The software consisting of implicit knowledge is broken since the beginning.</p>
</blockquote>

<h2 id="takeaway">Takeaway</h2>

<div class="callout">
  <p>Enforce semantically correct API usage even if it looks redundant. It is better to repeat some function call and leave it to the optimization pass to decide about exclusion than to introduce delayed errors in the future.</p>
</div>

<h2 id="exceptions-from-exceptions">Exceptions from exceptions</h2>

<p>Of course, there can be exceptions. If you think that following API usage is not efficient, write it as a comment. That will work and will teach junior engineers that <em>explicit</em> knowledge.</p>]]></content><author><name>Maxim Menshikov</name></author><category term="Thoughts" /><category term="code review" /><category term="engineering" /><category term="reviewboard" /><summary type="html"><![CDATA[The most dangerous knowledge on a team is the kind nobody wrote down. When experienced engineers bend best practices, the unwritten reasons leave with them — and the code breaks.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://menshikov.org/images/L-3541.jpg" /><media:content medium="image" url="https://menshikov.org/images/L-3541.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">How learning Linux makes you a better programmer</title><link href="https://menshikov.org/2021/02/28/how-learning-linux-makes-you-a-better-programmer/" rel="alternate" type="text/html" title="How learning Linux makes you a better programmer" /><published>2021-02-28T13:47:02+00:00</published><updated>2021-02-28T13:47:02+00:00</updated><id>https://menshikov.org/2021/02/28/how-learning-linux-makes-you-a-better-programmer</id><content type="html" xml:base="https://menshikov.org/2021/02/28/how-learning-linux-makes-you-a-better-programmer/"><![CDATA[<p>From time to time I hear complaints from newcomers that nobody needs Linux since most developers use Windows. That’s true, Windows remains the most used operating system, however, I argue that Linux is more useful for them.</p>

<!--more-->
<p>Linux is open-source, as well as the most components from Linux distributions. If you hit an issue, it is usually trivial (but not always) to narrow it down to the specific module and/or configuration. If you need to understand how to do advanced things, you can look up source code and you will understand it.</p>

<p>The main problem with Windows is a space comprising barely understandable layers. That’s it – a typical Windows user manages complexity pretty well, but only as long as internals are not concerned. The internal side is a big black box, and even if you have a complete Windows source code, it remains hardly understandable.</p>

<p>Instead, in Linux, there are no black boxes. How does it help new programmers?</p>

<ul class="checklist">
  <li>Every day you deal with a well-designed and well-decomposed operating system. You learn how to decompose problems. You learn to solve them efficiently. It doesn’t happen with Windows/proprietary toolchain as you only hit the tip of the iceberg.</li>
  <li>During an everyday routine, you learn how layers are bound together. You see the commands which can be used. You notice that building applications is not about hitting “Build” in IDE, but it is an invocation of compilers and linkers.</li>
  <li>You fix issues happening in your Linux distribution. Sometimes they can be searched for, sometimes you have to dig in logs. Efficient problem-solving skills won’t appear with time, they only appear if you solve (many) issues over time.</li>
  <li>In the end, your expertise improves with a larger coverage of all domains your work is made of.</li>
</ul>

<div class="callout">
  <p><strong>Takeaway.</strong> Don’t stick with operating systems, IDEs and other tools that simplify your daily routine. Learn your toolchain and make greater use of applications made by the community. Your development process will eventually become simple, and along the way you will learn how to work more efficiently.</p>
</div>]]></content><author><name>Maxim Menshikov</name></author><category term="Thoughts" /><category term="efficiency" /><category term="linux" /><category term="tips" /><summary type="html"><![CDATA[Windows is still the most used operating system, but for someone learning to program, Linux teaches the things that actually matter — decomposition, the toolchain, and how the layers fit together.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://menshikov.org/images/L-3541.jpg" /><media:content medium="image" url="https://menshikov.org/images/L-3541.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Does programming have anything to do with mathematics?</title><link href="https://menshikov.org/2021/02/24/does-programming-have-anything-to-do-with-mathematics/" rel="alternate" type="text/html" title="Does programming have anything to do with mathematics?" /><published>2021-02-24T13:10:59+00:00</published><updated>2021-02-24T13:10:59+00:00</updated><id>https://menshikov.org/2021/02/24/does-programming-have-anything-to-do-with-mathematics</id><content type="html" xml:base="https://menshikov.org/2021/02/24/does-programming-have-anything-to-do-with-mathematics/"><![CDATA[<p>Mathematics was very different centuries ago due to another widespread notation. The notation changed over time, e.g. a significant part of today’s notation was contributed by Rene Descartes. But the question today is how programming languages &amp; pure math notations relate to each other. I argue that they relate to the same concept, and here’s why.</p>

<!--more-->
<h2 id="what-is-mathematics">What is mathematics?</h2>

<p>First of all, it is a science about abstract objects and their relations. Numbers are one sort of these abstract objects. Usually, numbers have no boundaries, so it is possible to represent ((-\infty, \infty)). The discrete mathematics adds some limitations to numbers, say, numbers can only be integral (it is a very “rough” definition: actually, discrete mathematics is about discreteness as opposed to continuity, but most people will only consider the part about “integral” vs “any” numbers). Then, there are lattices: partially ordered sets with infimums and supremums.</p>

<p>Numbers are not the only abstract objects, but surely among the most important ones. The presence of abstract objects is an important property of mathematics. Now, how are the numbers represented?</p>

<h2 id="point-1-types">Point 1: types.</h2>

<p>How are programming languages different from mathematics? In almost every language the user deals with strongly typed numbers that can have minimum and maximum value. Say, 8-bit integer has range ([0, 255]). To sum up two such integers, there must be an overflow rule which maps the sum to the ([0, 255]) range. So, types allow making mathematical objects having specific constraints. In many ways, it is similar to lattices, and it is an essential part of mathematics.</p>

<h2 id="point-2-the-abstractness-of-expressions">Point 2: the abstractness of expressions.</h2>

<p>Why should (x = 5) be mathematical when written on a paper and not when written in C program? Why is (z = f(x, y)), (x,y \in [0, 255]), (f(x, y) = (x + y) \bmod 256) mathematical, but (z = x + y) is not? I would argue that programming language term is even more abstract, because it builds upon the axiomatic knowledge of types and their relations.</p>

<h2 id="point-3-programs-are-not-instructions-for-computers-when-executed-not-by-the-computer-they-were-built-for">Point 3: programs are not “instructions for computers” when executed not by the computer they were built for.</h2>

<p>As one may say, programming languages allow creating programs, essentially scripts for computers, so these programs are not mathematics, they are instructions for computers to execute. The latter is true for imperative languages as long as you execute them. Once you analyze the program, it is no longer instruction, it is a purely mathematical object.</p>

<p>Languages such as Coq make it possible to prove real-world theorems. Z3 and CVC4 languages deal with a significant part of math mechanics and can be used for proving statements. There are also declarative languages. Programs written in these languages don’t have a single instruction for the computer.</p>

<h2 id="conclusion-but-there-are-a-lot-more-arguments">Conclusion, but there are a lot more arguments.</h2>

<p>These days programming languages represent modern mathematical notation. It lacks a lot of “magic” of pure Descartes notation, but it was a huge effort to unite mathematics and engineering.</p>

<blockquote>
  <p>Everything that can be written mathematically can be written in code.</p>
</blockquote>

<p>It is not only boolean logic. The language mightn’t have all features needed to represent the special notations, but it is up to the user to choose the right language.</p>]]></content><author><name>Maxim Menshikov</name></author><category term="Thoughts" /><category term="computer science" /><category term="languages" /><category term="programming" /><summary type="html"><![CDATA[Programming languages and pure mathematical notation are often treated as separate worlds. I argue they describe the same thing — and modern code is simply modern mathematical notation.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://menshikov.org/images/L-3541.jpg" /><media:content medium="image" url="https://menshikov.org/images/L-3541.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Faulty keyboard joins scientific index</title><link href="https://menshikov.org/2021/02/08/faulty-keyboard-joins-scientific-index/" rel="alternate" type="text/html" title="Faulty keyboard joins scientific index" /><published>2021-02-08T06:12:10+00:00</published><updated>2021-02-08T06:12:10+00:00</updated><id>https://menshikov.org/2021/02/08/faulty-keyboard-joins-scientific-index</id><content type="html" xml:base="https://menshikov.org/2021/02/08/faulty-keyboard-joins-scientific-index/"><![CDATA[<p>Keyboard on my laptop often misses “E” keypress, so I have to be extra careful when writing. I’ve got used to it.
<!--more-->
<img src="/images/2021/02/20200512_142820_2.jpg" alt="Keyboard button" /></p>

<p>And now I see that my research paper in <a href="https://elibrary.ru/item.asp?id=43100348">Russian Scientific Citation Index</a> is called “Effective Translation Of <span class="has-inline-color has-brand-color-color">Directd</span> Acyclic Graphs To Intermediate Representation”. End of story.</p>]]></content><author><name>Maxim Menshikov</name></author><category term="Life" /><category term="fail" /><category term="life" /><summary type="html"><![CDATA[Keyboard on my laptop often misses “E” keypress, so I have to be extra careful when writing. I’ve got used to it.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://menshikov.org/images/2021/02/20200512_142820_2-200x200.jpg" /><media:content medium="image" url="https://menshikov.org/images/2021/02/20200512_142820_2-200x200.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Dell XPS 15 9560 and Samsung 980 Pro SSD</title><link href="https://menshikov.org/2021/02/07/dell-xps-15-9560-and-samsung-980-pro-ssd/" rel="alternate" type="text/html" title="Dell XPS 15 9560 and Samsung 980 Pro SSD" /><published>2021-02-07T15:02:15+00:00</published><updated>2021-02-07T15:02:15+00:00</updated><id>https://menshikov.org/2021/02/07/dell-xps-15-9560-and-samsung-980-pro-ssd</id><content type="html" xml:base="https://menshikov.org/2021/02/07/dell-xps-15-9560-and-samsung-980-pro-ssd/"><![CDATA[<p>Just a friendly reminder that XPS 15 9560 (2017) works great with Samsung 980 Pro SSD albeit the laptop has PCIE 3.0 interface versus recommended PCIE 4.0.</p>

<!--more-->

<p>The performance reported by Magician is around 3256MB/s for reading and 2939 MB/s for writing.</p>

<p><img src="/images/2021/02/Performance-Benchmark_20210206.png" alt="Performance benchmark" /></p>]]></content><author><name>ultrashot</name></author><summary type="html"><![CDATA[Just a friendly reminder that XPS 15 9560 (2017) works great with Samsung 980 Pro SSD albeit the laptop has PCIE 3.0 interface versus recommended PCIE 4.0.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://menshikov.org/images/L-3541.jpg" /><media:content medium="image" url="https://menshikov.org/images/L-3541.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>