This works most of the time
def handle(data) do
with {:ok, product} <- Jason.decode!(data),
{:ok, category} <- Category.load(data.category_id)
do
# todo
end
end
# see https://www.openmymind.net/Elixir-Without-Ecto/ | |
defmodule A.DB do | |
defmacro __using__(_) do | |
quote location: :keep do | |
@name __MODULE__ | |
def child_spec(opts) do | |
%{ | |
id: __MODULE__, |
const std = @import("std"); | |
const net = std.net; | |
const Queue = std.atomic.Queue; | |
const ArenaAllocator = std.heap.ArenaAllocator; | |
// THIS _MUST_ be placed in your main.zig file | |
pub const io_mode = .evented; | |
pub fn main() anyerror!void { |
# WAFs are a waste of time. False positives negatively impact actual users. | |
# And for what? Protection against vulnerabilities that, if you still have | |
# in this day in age, you're in more trouble than you think. | |
# Still, to keep my logs clean, I like to run something like the follwoing: | |
location ~ \.php$ { access_log off; return 444; } | |
location ~ \.asp$ { access_log off; return 444; } | |
location ~ \.aspx$ { access_log off; return 444; } | |
location ~ /Admincenter/ { access_log off; return 444; } | |
location /console/ { access_log off; return 444; } |
var Util util | |
type util struct{} | |
func (_ util) PadLeft(s string, n int) string { | |
//... | |
} | |
// ... |
This works most of the time
def handle(data) do
with {:ok, product} <- Jason.decode!(data),
{:ok, category} <- Category.load(data.category_id)
do
# todo
end
end
timestamp | method | uri | ip | |
---|---|---|---|---|
Oct 18, 2019 @ 09:41:02.000 | - | - | 61.219.11.153 | |
Oct 18, 2019 @ 09:34:37.000 | GET | / | 164.52.24.162 | |
Oct 18, 2019 @ 09:33:12.000 | - | - | 61.219.11.153 | |
Oct 18, 2019 @ 09:32:28.000 | - | - | 61.219.11.153 | |
Oct 18, 2019 @ 09:26:41.000 | GET | /otsmobile/app/mgs/mgw.htm | 110.105.80.110 | |
Oct 18, 2019 @ 09:23:42.000 | GET | /ftpsync.settings | 185.234.216.20 | |
Oct 18, 2019 @ 09:23:41.000 | GET | /deployment-config.json | 185.234.216.20 | |
Oct 18, 2019 @ 09:23:40.000 | GET | /.vscode/ftp-sync.json | 185.234.216.20 | |
Oct 18, 2019 @ 09:23:40.000 | GET | /.vscode/sftp.json | 185.234.216.20 |
loadArticle (res, req) -> | |
article = yield findArticlebyId(...) | |
return res.notFound() unless artilce? | |
res.ok(article) | |
findArticleById (id) -> | |
conn = yield conn.Open(). | |
row = yield conn.QueryAsync("....", id) | |
new Article(row) |
func LoadArticle(res http.ResponseWriter, req *http.Request) { | |
if article, err := FindArticleById(...) | |
if err != nil { | |
handleError(res, err) | |
return | |
} | |
if article == nil { | |
handleNotFound(res, err) | |
} | |
} |
/* | |
bolt 5000 277963 ns/op | |
redis 30000 48081 ns/op | |
pg 10000 149691 ns/op | |
Yes, the Bolt transactions could be batched. But so too could the PG transactions, | |
and the Redis work could be pipelined. And that isn't always a workable solution. | |
*/ | |
import ( |
# place this in your init.coffee | |
atom.workspace.observeTextEditors (e) -> | |
editor = atom.views.getView(e) | |
clone = editor.querySelector('.wrap-guide').cloneNode() | |
clone.style.left = (editor.getDefaultCharacterWidth() * 120) + "px" | |
editor.querySelector('.underlayer').appendChild(clone) |