Finding an item in an array with partial match in ArangoDB
Query
1 | LET needle = "eedl" |
Variant: Case-insensitive
1 | LET needle = "EEDL" |
1 | LET needle = "eedl" |
1 | LET needle = "EEDL" |
There are many good articles introducing how to become a full stack developer. Lots of technologies — HTML, CSS, JavaScript, Express, React are mentioned. They are really good resources. However, I think they miss some importatnt things and here are two importatnt things.
Before implementing a service, it is important to construct concrete a data model, definitions and relationships between entities. Without a concrete data model, design and implementation of service are highly likely to be changed during development, resulting in an unstable product and risk of missing feature.
To design a class diagram, you can use one of software (or others):
After designing data model, a developer needs to implement backend service provider and frontend service request. OpenAPI enables a developer to define a protocol: which paths, parameters and body contents to use, how responses will be.
To design OpenAPI, you can use one of software (or others):
Disclaimer: as per electron-boilerplate
Make webpack bundle your worker code. I’ll skip the entire code here because it’s too long.
Remeber the output path
1 | { |
Make electron-builder copy your worker bundle file .
1 | { |
This will place your worker bunlde file inside resources/app.asar
.
Adjust worker path and working directory for fork
in main.dev.ts
.
1 | const workerPath = |
This article tries to resolve an uncommon issue when you encounter the following error and it cannot be resolved automatically, e.g. behind proxy, etc.:
1 | Error: Electron failed to install correctly, please delete node_modules/electron and try installing again |
Download the right version (with consideration of package.json
) of Electron from https://github.com/electron/electron/releases
Unpack the downloaded Electron and put all files under node_modules/electron/dist
.
Create path.txt
file under node_modules/electron
with the following content:
electron.exe
electron
Electron.app/Contents/MacOS/Electron
Note: Make sure there is no whitespace characters (including a newline character) after the filename. This is a problem that I struggled for minutes and hours.
This is my note in adopting and learning ANTLR4Rust
Series
In the previous article, we implemented a parser with internal state variables. However, if a grammar is huge, it is practically impossible to manage a huge number of state variables. Alternatively, a visitor-like approach can be used.
In an exit method of the root rule in the Listener, we can grab the current context and its children and call custom parser methods:
1 | impl Listener { |
The minimal working example can be found here.
This is my note in adopting and learning ANTLR4Rust
Series
In the previous article, we built the minimal working example walking a parse tree using a listener. In this article, we are going to store a parsed CSV structure into a variable to use in the future.
Define a CSV structure:
1 | type Row = Vec<String>; |
Add fields to a listener:
1 | struct Listener { |
csv
will be a resultant CSV structure. add_to_header
and row_to_add
are internal state variables to generate a CSV structure.
Implement a listener:
1 | impl CSVListener for Listener { |
Feed an input to a parse and extract the result:
1 | fn main() { |
A tricky part is that we have to extract csv
from listener
. And to this end, we have to extract listener
with listener_id
.
The minimal working example can be found here.
This is my note in adopting and learning ANTLR4Rust
Series
Install nightly version of Rust (and make it default if you want for convenience).
1 | $ rustup toolchain install nightly |
Get ANTLR4 runtime for Rust from here:
Prepare a grammar. I will use an example grammar: https://raw.githubusercontent.com/antlr/grammars-v4/master/csv/CSV.g4
Generate a parser:
1 | $ java -jar <ANTLR4 runtime path> -Dlanguage=Rust CSV.g4 |
You will get csvlexer.rs
, csvlistener.rs
, csvparser.rs
. Place them into your project src
directory.
Add dependencies in Cargo.toml
:
1 | [dependencies] |
Add a feature and import lazy_static
macros to the root module:
1 |
|
Import common and essential things:
1 | use antlr_rust::common_token_stream::CommonTokenStream; |
Import grammar-specific things:
1 | mod csvlexer; |
Implement ParseTreeListener
, a supertraint of CSVListener
:
1 | struct Listener;impl ParseTreeListener for Listener { |
Implement CSVListener
:
1 | impl CSVListener for Listener { |
Read and parse an input. Note that csvFile
in the last line is a rule name in CSV.g4
:
1 | fn main() { |
The minimal working example can be found here.
True range multilateration is a method to determine the location of a movable vehicle or stationary point in space using multiple ranges (distances) between the vehicle/point and multiple spatially-separated known locations (often termed ‘stations’). — True range multilateration, Wikipedia
We can define a trilateration as an optimization problem to minimize a cost function \(S\) for a given estimate \(\beta\), a tuple of \((x, y, z)\)
$$\begin{aligned}
S(\beta)&=\sum_{i=1}^{N}f_i(\beta)\\
&=\sum_{i=1}^{N}\left[r_i-\sqrt{(x-X_i)^2+(y-Y_i)^2+(z-Z_i)^2}\right]^2
\end{aligned}$$
where \(r_i\) is a measured distnace between an Anchor (i), whose coordinates are \((X_i, Y_i, Z_i)\).
Levenberg-Marquardt method is defined by:
$$\beta_{k+1}=\beta_k-\left(J^TJ+\mu_kdiag\left(J^TJ\right)\right)^{-1}J^Tf(\beta_k)$$
where \(J\) is the Jacobian matrix and \(f\) is a column vector composed of \(f_i\):
$$\begin{aligned}
J&=\begin{bmatrix}
\frac{\partial f_1}{\partial x} & \frac{\partial f_1}{\partial y} & \frac{\partial f_1}{\partial z} \\
\frac{\partial f_2}{\partial x} & \frac{\partial f_2}{\partial y} & \frac{\partial f_2}{\partial z} \\
\vdots & \vdots & \vdots \\
\frac{\partial f_N}{\partial x} & \frac{\partial f_N}{\partial y} & \frac{\partial f_N}{\partial z}
\end{bmatrix}\\
&=\begin{bmatrix}
F_1(x-X_1) & F_1(y-Y_1) & F_1(z-Z_1) \\
F_2(x-X_2) & F_2(y-Y_2) & F_2(z-Z_2) \\
\vdots & \vdots & \vdots \\
F_N(x-X_N) & F_N(y-Y_N) & F_N(z-Z_N)
\end{bmatrix}
\end{aligned}$$
where \(F_i\) is a shorthand of each derivative:
$$F_i=\frac{r_i}{\sqrt{(x-X_i)^2+(y-Y_i)^2+(z-Z_i)^2}}$$
Now, we can estimate \(\beta\) by iterating the equation until it converges.
For example, it’s tricky to validate a commit with pre-commit hook if an app does not return a proper exit code. Here’s a way to validate with the stderr.
You can understand it with code snippets below:
PowerShell
1 | $errFile = New-TemporaryFile |
Unix/Linux shell
1 | errFile = $(mktemp) |
Download one of web fonts (.woff2
) from TuringFonts. Assumed Zebra is used here
Put the font to the web directory and define the below in a stylesheet:
1 | @font-face { |
Assign zebra-substitution
class to where it needs
1 | <span class="zebra-substitution">[email protected]</span> |
See how it looks.
TuringFonts also provides Encoder to get a ciphered text.