911 Matching Annotations
  1. Nov 2022
    1. dsmdavid commented Mar 8, 2021 @tchakabam if you right click on the status bar, do you get many options? Might be worth not showing some of the other options (in my case the line/column was not shown because there were too many options already there) and, after unselecting one:

      Post about status bar in VS Code (visible at bottom of window by default).

      I looked for this since I couldn't figure out the column numbers of where my cursor was in the editor.

      You can toggle this setting by opening command palette and searching "View: Toggle Status Bar Visibility"

      Displays Ln & Col numbers.

    1. You can also go to the Ruby OAuth Client Library to download the source code and run: 1gem build intuit-oauth.gemspec to build your own gem if you want to modify certain functions in the library.
    1. Louis Burki 6 months ago (edited) I have make some changes to make it work, because I had a similar error. First, I have add a ":" before the "=" in the Text variable at the beginning of the script. Now it looks like that: "Text:=". Then I have put double quotes around (**your snippets**) so now it looks like this "(***your snippets***)". Then, I also changed the sort line to make it look that: Text:= sort(Text). And now it works as intended. Also, be careful not to remove the pipe symbol in your snippets.

      Someone giving a troubleshooting solution to using Joe Glines' Auto Hotkey script that inserts text from a list of the user's choosing. The problem another user had was including it in their main script file, but this was resolved with Louis Burki's answer

    1. You can then edit files in that repository and commit and push them like this: cd 0a30d52feeb3ff60f7d8636b0bde296b # Edit files here git commit -m "Edited some files" -a git push
    2. But if you want to be able to make local edits and then push them back, you need to use this recipe instead: git clone git@gist.github.com:0a30d52feeb3ff60f7d8636b0bde296b.git You can find this in the "Embed" menu, as the "Clone via SSH" option.
    3. You can clone them anonymously (read-only) just using their URL: git clone https://gist.github.com/simonw/0a30d52feeb3ff60f7d8636b0bde296b
    1. Run in WSL to return current total "word count": find /mnt/c/path/to/obsidian -type f -name "*.md" -exec cat '{}' \+ | wcThis will also count words in syntax - like the word "query" in an embedded query. In fact it probably counts anything separated by whitespace as separate words. But you could do some preprocessing between the cat and the wc if you like.

      Linux command for WSL to count all lines, words count, & character count. OP states at end -wc restricts to word count only

    1. A second problem is that once your process has exited, Bash will proceed to exit as well. If you're not being careful, Bash might exit with exit code 0, whereas your process actually crashed (0 means "all fine"; this would cause Docker restart policies to not do what you expect). What you actually want is for Bash to return the same exit code your process had.
  2. Oct 2022
    1. Several templates and tools are available to assist in formatting, such as Reflinks (documentation), reFill (documentation) and Citation bot (documentation)

      I clicked the link for reFill and thought it looked interesting. Would like to look into this further.

    1. You may need pathname2url

      (Author:: [[neurino on Stack Overflow]]) python from urllib.request import pathname2url pathname2url('dir/foo, bar.mp3')

    1. L'échelle des sanctions fixée à l'article R. 511-13 du code de l'Éducation est reproduite dans le règlement intérieur. Toutefois, le juge administratif (CE, 16 janvier 2008, MEN c/Mlle Ayse A, n° 295023) considère que, même en l'absence de toute mention dans le règlement intérieur, l'échelle des sanctions réglementaires est applicable de plein droit.
    1. Functions are much more flexible than aliases. The following would overload the usual ls with a version that always does ls -F (arguments are passed in $@, including any flags that you use), pretty much as the alias alias ls="ls -F" would do: ls () { command ls -F "$@" }
  3. Sep 2022
    1. First, to clarify - what is "code", what is "data"? In this article, when I say "code", I mean something a human has written, that will be read by a machine (another program or hardware). When I say "data", I mean something a machine has written, that may be read by a machine, a human, or both. Therefore, a configuration file where you set logging.level = DEBUG is code, while virtual machine instructions emitted by a compiler are data. Of course, code is data, but I think this over-simplified view (humans write code, machines write data) will serve us best for now...
    1. Writing Code for Humans — A Language-Agnostic Guide…because code which people can’t read and understand is easy to break and hard to maintain.
    1. I don't like the first syntax because then you have weird looking code due to all the leading whitespace, and you lose a lot of real estate.
    2. Aligning everything with however long the method name is makes every indention different. belongs_to :thing, class_name: 'ThisThing', foreign_key: :this_thing_id has_many :other_things, class_name: 'ThisOtherThing', foreign_key: :this_other_thing_id validates :field, presence: true Compared to the following, which all align nicely on the left. belongs_to :thing, class_name: 'ThisThing', foreign_key: :this_thing_id has_many :other_things, class_name: 'ThisOtherThing', foreign_key: :this_other_thing_id validates :field, presence: true
    3. This one bugs me a lot, but honestly, I don't like either style of the "normal method calls" above. I'm definitely voting to change the rule, but I'd also recommend trying to use the following syntax. In my opinion, it's the best of both worlds. a_relatively_long_method_call( :thing, :another_thing ) Or, if there are a lot or arguments, or the arguments are long: a_relatively_long_method_call( :a_long_argument, :another_long_argument, :a_third_long_argument )
    1. In collusion, writing good code not only require knowledge but also require compassion. To understand people's pain and mistakes, to think about your teammate and to help everyone achieve a better life.
    2. Think about how good it is if you can build a system at “2 half brain quality” and then people just need use 1 half of their brain to maintain it. You can fix bug in a blink of an eye, run tests and give it to tester, done. Everything will be done in a easiest way and fixing bug or refactoring can be easy like breathing. The most heavy task in programming is not about building application, but it’s about maintain them and if you wrote something you can’t understand, then you will suffer for the rest of your life.
    3. Write code for human, not for God
    1. your cognitive load increases with the level of indentation. 1 2 3 4 5 6 7 8 9 10 if r.Method == "GET" { if r.Header.Get("X-API-KEY") == key { // ok return nil }else{ return errors.New("Key is not valid") } } else { return errors.New("Invalid Method") }
    2. Any fool can write code that a computer can understand. Good programmers write code that humans can understand.
    3. To see if you are writing good code, you can question yourself. how long it will take to fully transfer this project to another person? If the answer is uff, I don’t know… a few months… your code is like a magic scroll. most people can run it, but no body understand how it works. Strangely, I’ve seen several places where the IT department consist in dark wizards that craft scrolls to magically do things. The less people that understand your scroll, the more powerfully it is. Just like if life were a video game.
    4. Avoid indentation levels, If you find yourself with more than 3, you should create a function.
    5. Code explains what and how Documentation explains why.
    6. This is so clear that you don’t even need comments to explain it.
    7. Another type of comments are the ones trying to explain a spell.
    8. Do you really need those lines? Isn’t it clear enough? Well, I still find comments like this in a lot of cases and it gets funnier when the comment is obsolete and the code is doing other things. Following the example, let’s imagine that another developer adds support for PUT method. I think that this is what would happen.
    9. The rule of thumbs is, never use code that you do not understand.
    1. For example, whereas C programmers have argued for years about where to put their brackets, and whether code should be indented with tabs or spaces, both Rust and Go eliminate such issues completely by using a standard formatting tool (gofmt for Go, rustfmt for Rust) which rewrites your code automatically using the canonical style. It’s not that this particular style is so wonderful in itself: it’s the standardisation which Rust and Go programmers appreciate.
  4. Aug 2022
    1. A review from the Technical Writing team before you merge is recommended. Reviews can happen after you merge.
    2. Each commit should meet the following criteria: Have a well-written commit message. Has all tests passing when used on its own (e.g. when using git checkout SHA). Can be reverted on its own without also requiring the revert of commit that came before it. Is small enough that it can be reviewed in isolation in under 30 minutes or so.
    1. Don’t make claims unless you can cite documentation, formalized guidelines, and coding examples to back those claims up. People need to know why they are being asked to make a change, and another developer’s personal preference isn’t a good enough argument.
    1. A recent study [25]of more than a million notebooks in public GitHub reposito-ries found many indicators of poor quality, some of whichsupport earlier criticisms of notebooks encouraging bad soft-ware engineering habits
    1. perhaps the mostfrequent motivation for adding dependencies in layer-3 soft-ware is the desire to write less code oneself
    1. This describes one of the most pleasing hacks I've ever come across. I just now tracked it down and added it to my bookmarks. (Not sure why it wasn't already there.)

      You could also conceive of going one step further. When your app (doesn't actually have to be a game, though admittedly it's much easier for you if it is) is compiled with tweak.h, it gives it the power to paint the source file on the screen—so you don't actually have to switch over to your text editor to save it, etc. Suppose you want to provide custom inputs like Bret Victor-style sliders for numeric values. You could edit it in your text editor, or you could derp around with it in-app. Tweaking the value in-app should of course both update it wrt the app runtime but also still write the file to disk, too, so if live reloading is turned on in your text editor, whatever changes you make inside the live process image gets synced out.

  5. Jul 2022
    1. because it only needs to engage a portion of the model to complete a task, as opposed to other architectures that have to activate an entire AI model to run every request.

      i don't really understand this: in z-code thre are tasks that other competitive softwares would need to restart all over again while z-code can do it without restarting...

    2. Z-code models to improve common language understanding tasks such as name entity recognition, text summarization, custom text classification and key phrase extraction across its Azure AI services. But this is the first time a company has publicly demonstrated that it can use this new class of Mixture of Experts models to power machine translation products.

      this model is what actually z-code is and what makes it special

    3. have developed called Z-code, which offer the kind of performance and quality benefits that other large-scale language models have but can be run much more efficiently.

      can do the same but much faster

    1. This opens the possibility of doing a design much better than Squeak's, both fundamentally and at the user-level, to create a model of an entire personal computer system that is extremely compact (under 20,000 lines of code)

      See: Oberon

    2. the Squeak system, which was derived from PARC Smalltalk, includes its own operating system, GUI, development tools, graphics, sound, Internet sockets, and many applications including Etoys and Croquet, yet is only about 230,000 lines of code. The executables are about 2.8MB and only half of this code is generally used.
  6. Jun 2022
    1. Difference between Map and HashMap The Map is an interface in Java used to map the key-pair values. It is used to insert, update, remove the elements. Whereas the HashMap is a class of Java collection framework. The Map interface can only be used with an implementing class. It allows to store the values in key-pair combination; it does not allow duplicate keys; however, we can store the duplicate values. Its implementing classes are as follows: HashMap Hashtable TreeMap ConcurrentHashMap LinkedHashMap HashMap is a powerful data structure in Java used to store the key-pair values. It maps a value by its associated key. It allows us to store the null values and null keys. It is a non-synchronized class of Java collection.
    1. Vous connaissez maintenant la différence entre conteneur et machine virtuelle ; vous avez ainsi pu voir les différences entre la virtualisation lourde et la virtualisation légère.Un conteneur doit être léger, il ne faut pas ajouter de contenu superflu dans celui-ci afin de le démarrer rapidement, mais il apporte une isolation moindre. À contrario, les machines virtuelles offrent une très bonne isolation, mais elle sont globalement plus lentes et bien plus lourdes.
  7. May 2022
    1. As you've probably already guessed, we've decided to replace the current Web IDE with one built on top of VS Code. In the coming milestones, we will build out custom support for the features not already available in the VS Code core, and validate that the workflows you already depend on in the Web IDE are handled in the new experience. We're working with the team that builds our amazing GitLab Workflow extension for VS Code to make it available in the browser so we can bundle it in the Web IDE, and bring all those great features along for the ride. That includes bringing merge request comments into the Web IDE for the first time ever!

      GitLab is planning to onboard VS Code web IDE

    1. Machine Tags

      A new kind of tags — machine tags — are supported now. A machine tag, e.g. meta:language=python consists of a namespace (meta), a key (language) and a value (python). Everyone can created machine tags, but the meta: namespace is protected and tags in there will be created by the site itself.

      The codesite itself uses machine tags to make various properties of recipes accessible to the search:

      • meta:language

        The programming language of the recipe, e.g. python, perl or tcl.

      • meta:min_$lang_$majorver

        Those tags describe the minimum language version. If a recipe requires Python 2.5 it would have the tag meta:min_python_2=5.

      • meta:license

        The license that was selected by the author, e.g. psf, mit or gpl.

      • meta:loc

        This tag contains a number describing the lines of code in a recipes. It counts only the number of lines in the code block but not any lines in the discussion of in comments. This makes it possible to search for short recipes with less than ten lines or very large ones.

      • meta:score

        The current score of the recipe. This is the same number that is displayed besides the recipe title and can only be influenced by voting on recipes. That way you could even search for down-voted recipes

      • meta:requires

        Stores information about additional requirements of the recipes, e.g. required python modules. You can find recipes using python's collections module that way.

      All those tags cannot be changed directly because they are generated from a recipe's properties.

    1. typeof v === "number"

      Using triple equals to check the results of typeof is totally unnecessary, and a sure sign that someone, somewhere has unthinkingly adopted some dubious advice; it's a code smell/red flag.

      A standard equality comparison (using ==) does exactly the right thing while also avoiding association with questions/doubts about the quality of the surrounding code.

  8. Apr 2022
    1. I sometimes wondered why the VS Code team put so much effort into the built-in terminal inside the editor. I tried it once on Linux and never touched it again, because the terminal window I had right next to my editor was just massively better in every way. Having used Windows terminals for a while, I now fully understand why it’s there.

      VS Code terminal is not as efficient on Linux

  9. Mar 2022
    1. If you want to organize said migrations in their purpose you'll probably have a folder for the struture ones and another for the data ones.
    2. not as good/useful as some other gem options/approaches, such as the one that adds a data method per migration, or that lets you tag with :post_deploy, etc.

    1. ○ This changes the format and structure of the code but preserves the semantics (what it does)○ Can change lots of details for optimization, as long as the overall effect is the same

      compiler 部分的流程是什么?

  10. people.csail.mit.edu people.csail.mit.edu
    1. Lesson: avoid use of this; work around by defining that

      No. Actual lesson: don't do crazy shit; if you're trying to code defensively against this, then your code is too hard to understand, anyway, and you've got bigger problems. (See also: overuse of triple equals and treating it like an amulet to ward off unwanted spirits.)

    1. tlrobinson interpreted right that codebase size should be measured in number of tokens

      Bob Nystrom is fond of avoiding LOC measurements in favor of number of semicolons.

  11. Feb 2022
    1. let zeta = getProcessControl.bind(this); Object.setPrototypeOf(zeta, Object.getPrototypeOf(this)); return zeta;

      useful pattern

        • Visual Studio Code 快捷键
      • 调出快捷键设置: Ctl + k Ctrl + s (这是代表联合一起的)

      • 当前行快速换行 : Ctrl + Enter
      • 快速删除某一行:Shift + Delete / Ctrl + Shift + K
      • 查找: Ctrl + F
      • 文件中查找: Ctrl + Shift + F
      • 替换:Ctrl + H
      • 文件中内容替换: Ctrl + Shift + H
    1. The %rip register on x86-64 is a special-purpose register that always holds the memory address of the next instruction to execute in the program's code segment.

      %rip 有什么作用?

    1. • %rax: return value• %rsp: stack pointer• %rdi: 1st argument• %rsi: 2nd argument• %rdx: 3rd argument• %rcx: 4th argument• %r8: 5th argument• %r9: 6th argument

      有那几个常用且重要的 register?

  12. Jan 2022
    1. En outre en juin 2020, l’article D. 131-3-1 du Code de l’éducation42, ajouté par le décret du 29 juin 2020, affirme que seuls les documents justifiant de l’identité de l’enfant, des personnes qui en sont responsables et de leur domicile peuvent être exigés pour appuyer leur demande d’inscription. Dans le cas où l’un de ces documents serait impossible à produire, il peut être justifié par tous moyens, y compris une attestation sur l’honneur43.
    1. If one of those two expressions couldpossibly generate an error condition or a side effect, this could lead to invalidbehavior. Such is the case for our earlier example

      有什么情况下必须使用 branching 方式,而不能使用 conditional move?

    2. It is important to recognize that the suffixes forthese instructions denote different conditions and not different operand sizes. Forexample, instructions setl and setb denote “set less” and “set below,” not “setlong word” or “set byte.”

      set 指令的后缀代表的含义是什么?

    1. let info, id
      let id = response.headers.get("X-Request-ID");
      if (id) {
        let info = this._pendingRequests.get(id);
        if (info) {
      
    2. filter = null

      This is unused.

    Tags

    Annotators

  13. Dec 2021
    1. What is an assembler language? https://en.itpedia.nl/2019/11/11/wat-is-een-assembler-taal/ An #assembler_language is a low-level programming_language designed for a specific processor type. We can produce Assembler by compiling #source_code from a high-level programming language (such as C / C ++). But we can also write #programs in this language ourselves. In turn, we can convert Assembler_code into machine_code using an assembler.

  14. Nov 2021
    1. The destination operand must be a register.

      load effective address 的 destination 需要是什么?

    2. The ability of the leaq instruction to perform addition and limited forms ofmultiplication proves useful when compiling simple arithmetic expressions suchas this example.

      leaq 在什么情况下有用?

    3. local variables such as x are often kept in registers rather thanstored in memory locations. Register access is much faster than memory access.

      local variables 通过会存在哪里,为什么?

    4. we see that whatwe call “pointers” in C are simply addresses. Dereferencing a pointer involvescopying that pointer into a register, and then using this register in a memoryreference.

      dereference pointer 在 assembly code 中如何实现?

    5. The most general form is shown at the bottomof the table with syntax Imm(rb,ri,s). Such a reference has four components: animmediate offset Imm, a base register rb, an index register ri, and a scale factors, where s must be 1, 2, 4, or 8. Both the base and index must be 64-bit registers.The effective address is computed as Imm + R[rb] + R[ri] . s.

      访问 $$Imm(r_b, r_i, s)$$ 的内存应该如何计算,有哪些限制条件?

    6. C declaration Intel data type Assembly-code suffix Size (bytes)

      不同数据类型的 size 以及在 assembly 中的后缀?

    7. A final difference is that we see two additional lines of code (lines8–9). These instructions will have no effect on the program, since they occur afterthe return instruction (line 7). They have been inserted to grow the code for thefunction to 16 bytes, enabling a better placement of the next block of code in termsof memory system performance.

      为什么有时候通过 disassembly 生成的 assembly 代码会在 ret 之后通过 nop 增加一些空格?

    8. Its main feature isthat it is in a more readable textual format, as compared to the binary format ofmachine code.

      assembly code 和 machine code 相比最大的区别是什么?

    1. To review, the Forget gate decides what is relevant to keep from prior steps. The input gate decides what information is relevant to add from the current step. The output gate determines what the next hidden state should be.Code DemoFor those of you who understand better through seeing the code, here is an example using python pseudo code.
    1. connection

      Unused. Caller can/should be passing this in so we can handle the quota check internally.

    Tags

    Annotators

    1. The type-fest package contains only types, meaning they are only used at compile-time and nothing is ever compiled into actual JavaScript code. This package contains functions that are compiled into JavaScript code and used at runtime.
  15. Oct 2021
    1. Lean Canvas

      For the builders collective, I created some tools that are open source and useful for design and social architecture. Other projects are coding challenges to experiment with what is possible on the web.

      This experiment is based on the Lean Canvas, based on the Business Model Canvas from the book Business Model Generation.

      Type in the grey box at the top of the page. Click or tap in the boxes to add the text as a box in each section of the Lean Canvas. Click on the box to delete.

      There is no save functionality, so be sure to take a screenshot. Or roll your own by using the code on Codepen and GitHub.

  16. matspike.github.io matspike.github.io
    1. Log into TopHat and select the course “Origins and Evolution of Language” Navigate to the ‘Assigned’ tab Select the relevant quiz and complete all items (note that the quiz will automatically close on Monday at 1pm)

      I logged in to Top Hat and found two courses called Origins and Evolution... both do not have any quizzes in the assigned tab. Can someone please point me to the right course? What's the join code?

  17. Sep 2021
    1. this.ontokencontent = this.ontokencontent.call(this, result)

      The implicitness that this "protocol" pushes into the implementing methods (seemingly odd return values) is undesirable. Make it explicit. The implementing methods should be able to do something like Validator.changeExpectation(this, this.onresource) (which in turn changes the target's ontokencontent handler).

    Tags

    Annotators

    1. (art. R. 421-20 du code de l’éducation)

      Le conseil d'administration est l'organe décisionnel de l'établissement. Il adopte le projet d'établissement, le budget et le compte financier de l’établissement ainsi que le règlement intérieur de l’établissement. Il donne notamment son accord sur le programme de l'association sportive, sur les principes du dialogue avec les parents d'élèves. Il délibère sur les questions relatives à l'hygiène, la santé et la sécurité. Il donne son avis sur les principes de choix des manuels et outils pédagogiques, sur la création d'options et de sections (art. R. 421-20 du code de l’éducation).

  18. Aug 2021
    1. def compare_state_dict(dict1, dict2): # compare keys for key in dict1: if key not in dict2: return False for key in dict2: if key not in dict1: return False for (k,v) in dict1.items(): if not torch.all(torch.isclose(v, dict2[k])) return False return True

      Comparing two pytorch dicts

    1. Since the reader was able to shape hand and finger as he or she saw fit, we can sometimes recognise a particular reader within a single manuscript, or even within the books of a library. The charming hands function as a kind of fingerprint of a particular reader, allowing us to assess what he or she found important about a book or a collection of books.

      I've heard the word "hand" as in the phrase "an operator's hand" used in telegraphy to indicate how an experienced telegraph operator could identify the person at the other end with whom they were communicating by the pace and timbre of the code. I've particularly heard reference to it by code breakers during wartime. It's much the same sort of information as identifying someone by their voice on the phone or in a distinctive walk as seen at a distance. I've also thought of using this idea in typing as a means of secondary confirmation for identifying someone while they input a password on a keyboard.

      I wonder if that reference predates this sort of similar "hand" use for identifying someone, if this may have come first, or if they're independent of each other?

    1. Aside to global and local scope there is also something one could call a “block” scope. This is not an “official” type of scope, but it does exist. Block scope was introduced to JavaScript as a part of the ES6 specification. It was introduced along with two new types of variables let and const.
    1. Using a flag to disable prettier for a line, the next line or until I activate it again (ESLint like syntax). // prettier-disable border: { sep: "║", topLeft: "╔", topMid: "╦", top: "═", topRight: "╗", midLeft: "╠", midMid: "╬", mid: "═", midRight: "╣", botLeft: "╚", botMid: "╩", bot: "═", botRight: "╝" }, // prettier-enable
    1. Copy and pastethe module’s code into your system and make whatever changes you find nec-essary.This is usually the right thing to do for a small component
    1. conda env update --prune --quiet --name $envname --file "$envfile"
    2. jupyter nbconvert --to notebook --execute --ExecutePreprocessor.kernel_name=python3 --output output.ipynb <path_to_ipynb>
    1. If you want more, you can do so by directly specifying TextMate theme color rules

      code

      {
        "editor.tokenColorCustomizations": {
          "[Noctis]": {
            "textMateRules": [
              {
                "scope": "markup.list",
                "settings": { "fontStyle": "" }
              },
              {
                "scope": "text.markdown.notes.tag",
                "settings": { "fontStyle": "italic" }
              }
            ]
          }
        }
      }
      

      Inspect the scope using the command "Developer: Inspect Editor Tokens and Scopes"

  19. Jul 2021
    1. body script, body style {

      This doesn't work well with scripts (and style elements) injected by the Hypothesis bookmarklet or the Wayback Machine's toolbar. On that note, it's pretty poor hygiene on their part to (a) inject this stuff in the body to begin with, and (b) not include at the very least a class attribute clearly defining the origin/role of the injected content. As I described elsewhere:

      set the class on the injected element to an abbreviated address like <style class="example.org/sidebar/2.4/injected-content/">. And then drop a page there explaining the purpose and requirements (read: assumptions) of your injected element. This is virtually guaranteed not to conflict with any other class use (e.g. CSS rules in applied style sheets), and it makes it easier for other add-ons (or the page author or end user) to avoid conflicts with you.

    2. * Monospace fonts always render at 80% of normal body text for some * reason that I don't understand but is still annoying all the same.

      Dealing with it this way is a mistake. The only reasonable thing to do is to tell the user to adjust their browser's default font settings or deal with it. (This seems to only affect Firefox's default UA stylesheet/preferences, not Chrome.)

      Check out how the most recent iteration of the w2g streamline "client" https://graph.5apps.com/LP/streamline approaches styling.

    1. this._figureElement = this._page.querySelector("script");

      Better to use querySelectorAll and then filter based on figure designation (e.g. nodeValue.startsWith(" (Fig. 1) ")).

    2. document

      Unused!

      (Caller should also probably look more like:

      let system = new SystemB(document);
      system.attach(document.querySelectorAll("script"))
      

      ... where the querySelectorAll return value's role is to act as a list of document figures, for the reasons described elsewhere https://hypothes.is/a/-n-RYt4WEeu5WIejr9cfKA.)

    1. I only allowed smaller closures in the code and refactored the rest into separate top-level functions. This is a deliberate move against the common practice of js programmers. Why? Because I noticed closures make code harder to read.
  20. Jun 2021
    1. We’ve broken our project up into three different types of packages: apps which are preact apps intended to be bundled and deployed somewhere, modules which are plain npm packages for node/browsers and do not bundle their dependencies, and workers which are either Worker or ServiceWorker scripts entirely bundled up with no imports or exports. We don’t have to keep these three types of packages separated, but it helps us navigate around.
    1. Rather than write new tooling we decided to take advantage of tooling we had in place for our unit tests. Our unit tests already used FactoryBot, a test data generation library, for building up test datasets for a variety of test scenarios. Plus, we had already built up a nice suite of helpers that we coud re-use. By using tools and libraries already a part of the backend technology’s ecosystem we were able to spend less time building additional tooling. We had less code to maintain because of this and more time to work on solving our customer’s pain points.
    1. On the security side I think code injection is still a danger. If someone does smuggle js into your js app they'll be able to read your CSRF cookie and make ajax requests using your logged-in http session, just like your own code does
    1. That means if an attacker can inject some JavaScript code that runs on the web app’s domain, they can steal all the data in localStorage. The same is true for any third-party JavaScript libraries used by the web app. Indeed, any sensitive data stored in localStorage can be compromised by JavaScript. In particular, if an attacker is able to snag an API token, then they can access the API masquerading as an authenticated user.
    1. I am not sure if this is an improvement. To me it does not seem very pretty. Of course I am biased since I also prefer () in method definitions if they have arguments; although I think it is fine that ruby does not mind omitting the (). For my brain, I like the () for visual separation.
    1. One of the consequences (although arguably not the primary motivation) of DRY is that you tend to end up with chunks of complex code expressed once, with simpler code referencing it throughout the codebase. I can't speak for anyone else, but I consider it a win if I can reduce repetition and tuck it away in some framework or initialisation code. Having a single accessor definition for a commonly used accessor makes me happy - and the new Object class code can be tested to hell and back. The upshot is more beautiful, readable code.

      new tag?:

      • extract reusable functions to reduce duplication / allow elegant patterns elsewhere
  21. May 2021
    1. You can see the implementation here: https://github.com/sveltejs/sapper/blob/339c417b24e8429d3adc9c9f196bf159a5fce874/runtime/src/server/middleware/get_page_handler.ts#L137