Browse Source

Merge branch 'master' of git.juliobiason.me:random

master
Julio Biason 3 years ago
parent
commit
2cee6b68b8
  1. 11
      bitcount.rs
  2. 9
      defaultoption.rs
  3. 1
      dieseltest/.env
  4. 102
      dieseltest/Cargo.lock
  5. 10
      dieseltest/Cargo.toml
  6. 3
      dieseltest/README.md
  7. 5
      dieseltest/diesel.toml
  8. 0
      dieseltest/migrations/.gitkeep
  9. 6
      dieseltest/migrations/00000000000000_diesel_initial_setup/down.sql
  10. 36
      dieseltest/migrations/00000000000000_diesel_initial_setup/up.sql
  11. 2
      dieseltest/migrations/2021-11-24-125522_assets/down.sql
  12. 9
      dieseltest/migrations/2021-11-24-125522_assets/up.sql
  13. 8
      dieseltest/src/main.rs
  14. 7
      dieseltest/src/models.rs
  15. 7
      dieseltest/src/schema.rs
  16. 86
      drag-and-drop.html
  17. 13
      exename.rs
  18. 358
      ms/Cargo.lock
  19. 9
      ms/Cargo.toml
  20. 5
      ms/README.md
  21. 15
      ms/server/Cargo.toml
  22. 65
      ms/server/src/main.rs
  23. 10
      ms/shared/Cargo.toml
  24. 19
      ms/shared/src/lib.rs
  25. 16
      ms/txtclient/Cargo.toml
  26. 20
      ms/txtclient/src/main.rs
  27. 69
      nng/Cargo.lock
  28. 5
      nng/Cargo.toml
  29. 8
      nng/client/Cargo.toml
  30. 3
      nng/client/src/main.rs
  31. 9
      nng/server/Cargo.toml
  32. 8
      nng/server/src/main.rs
  33. 1315
      notifytest/Cargo.lock
  34. 13
      notifytest/Cargo.toml
  35. 3
      notifytest/README.md
  36. 50
      notifytest/migrations/202201281050_initial.sql
  37. 29
      notifytest/migrations/202201281127_fix_function.sql
  38. 28
      notifytest/migrations/202201281128_fix2.sql
  39. 26
      notifytest/migrations/202201281133_fix3.sql
  40. 29
      notifytest/migrations/202201281134_fix4.sql
  41. 57
      notifytest/src/main.rs
  42. 10
      specgen.rs
  43. 16
      spmc-test/Cargo.lock
  44. 7
      spmc-test/Cargo.toml
  45. 24
      spmc-test/src/main.rs
  46. 10
      spongebob.rs
  47. 98
      tokioselect/Cargo.lock
  48. 7
      tokioselect/Cargo.toml
  49. 46
      tokioselect/src/main.rs
  50. 9
      while.rs

11
bitcount.rs

@ -0,0 +1,11 @@
fn count(bits: usize) -> u32 {
let num_bits = usize::BITS;
num_bits as u32 - bits.leading_zeros() + 1
}
fn main() {
println!("{}", count(0b111));
println!("{}", count(0b1111_1111));
println!("{}", count(64)); // 1000000
println!("{}", 1 >> 1);
}

9
defaultoption.rs

@ -0,0 +1,9 @@
#[derive(Debug, Default)]
struct Example {
exists: Option<u8>,
}
fn main() {
let e = Example::default();
println!("Herro: {:?}", e);
}

1
dieseltest/.env

@ -0,0 +1 @@
DATABASE_URL=postgres://consig:config@localhost/candles

102
dieseltest/Cargo.lock generated

@ -0,0 +1,102 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "bitflags"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "byteorder"
version = "1.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
[[package]]
name = "diesel"
version = "1.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b28135ecf6b7d446b43e27e225622a038cc4e2930a1022f51cdb97ada19b8e4d"
dependencies = [
"bitflags",
"byteorder",
"diesel_derives",
"pq-sys",
]
[[package]]
name = "diesel_derives"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "45f5098f628d02a7a0f68ddba586fb61e80edec3bdc1be3b921f4ceec60858d3"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "dieseltest"
version = "0.1.0"
dependencies = [
"diesel",
"dotenv",
]
[[package]]
name = "dotenv"
version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f"
[[package]]
name = "pq-sys"
version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ac25eee5a0582f45a67e837e350d784e7003bd29a5f460796772061ca49ffda"
dependencies = [
"vcpkg",
]
[[package]]
name = "proc-macro2"
version = "1.0.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba508cc11742c0dc5c1659771673afbab7a0efab23aa17e854cbab0837ed0b43"
dependencies = [
"unicode-xid",
]
[[package]]
name = "quote"
version = "1.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05"
dependencies = [
"proc-macro2",
]
[[package]]
name = "syn"
version = "1.0.81"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2afee18b8beb5a596ecb4a2dce128c719b4ba399d34126b9e4396e3f9860966"
dependencies = [
"proc-macro2",
"quote",
"unicode-xid",
]
[[package]]
name = "unicode-xid"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
[[package]]
name = "vcpkg"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"

10
dieseltest/Cargo.toml

@ -0,0 +1,10 @@
[package]
name = "dieseltest"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
diesel = { version = "1.4.8", features = ["postgres"] }
dotenv = "0.15.0"

3
dieseltest/README.md

@ -0,0 +1,3 @@
# DieselTest
Testing Diesel.

5
dieseltest/diesel.toml

@ -0,0 +1,5 @@
# For documentation on how to configure this file,
# see diesel.rs/guides/configuring-diesel-cli
[print_schema]
file = "src/schema.rs"

0
dieseltest/migrations/.gitkeep

6
dieseltest/migrations/00000000000000_diesel_initial_setup/down.sql

@ -0,0 +1,6 @@
-- This file was automatically created by Diesel to setup helper functions
-- and other internal bookkeeping. This file is safe to edit, any future
-- changes will be added to existing projects as new migrations.
DROP FUNCTION IF EXISTS diesel_manage_updated_at(_tbl regclass);
DROP FUNCTION IF EXISTS diesel_set_updated_at();

36
dieseltest/migrations/00000000000000_diesel_initial_setup/up.sql

@ -0,0 +1,36 @@
-- This file was automatically created by Diesel to setup helper functions
-- and other internal bookkeeping. This file is safe to edit, any future
-- changes will be added to existing projects as new migrations.
-- Sets up a trigger for the given table to automatically set a column called
-- `updated_at` whenever the row is modified (unless `updated_at` was included
-- in the modified columns)
--
-- # Example
--
-- ```sql
-- CREATE TABLE users (id SERIAL PRIMARY KEY, updated_at TIMESTAMP NOT NULL DEFAULT NOW());
--
-- SELECT diesel_manage_updated_at('users');
-- ```
CREATE OR REPLACE FUNCTION diesel_manage_updated_at(_tbl regclass) RETURNS VOID AS $$
BEGIN
EXECUTE format('CREATE TRIGGER set_updated_at BEFORE UPDATE ON %s
FOR EACH ROW EXECUTE PROCEDURE diesel_set_updated_at()', _tbl);
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION diesel_set_updated_at() RETURNS trigger AS $$
BEGIN
IF (
NEW IS DISTINCT FROM OLD AND
NEW.updated_at IS NOT DISTINCT FROM OLD.updated_at
) THEN
NEW.updated_at := current_timestamp;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

2
dieseltest/migrations/2021-11-24-125522_assets/down.sql

@ -0,0 +1,2 @@
-- This file should undo anything in `up.sql`
DROP TABLE assets;

9
dieseltest/migrations/2021-11-24-125522_assets/up.sql

@ -0,0 +1,9 @@
CREATE TABLE assets (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
source TEXT NOT NULL
-- extras?
);
CREATE INDEX source_idx on assets (source);
SELECT diesel_manage_updated_at('assets');

8
dieseltest/src/main.rs

@ -0,0 +1,8 @@
use diesel::prelude::*;
mod models;
mod schema;
fn main() {
println!("Hello, world!");
}

7
dieseltest/src/models.rs

@ -0,0 +1,7 @@
use diesel::Queryable;
#[derive(Queryable)]
pub struct Asset {
pub name: String,
pub source: String,
}

7
dieseltest/src/schema.rs

@ -0,0 +1,7 @@
table! {
assets (id) {
id -> Int4,
name -> Text,
source -> Text,
}
}

86
drag-and-drop.html

@ -0,0 +1,86 @@
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<table>
<thread>
<tr>
<th>Cell</th>
<th>Cell</th>
<th>Cell</th>
<th>Cell</th>
</tr>
</thead>
<tbody>
<tr draggable="true" class="dropzone">
<td draggable="false">1</td>
<td draggable="false">1</td>
<td draggable="false">1</td>
<td draggable="false">1</td>
</tr>
<tr draggable="true" class="dropzone">
<td draggable="false">2</td>
<td draggable="false">2</td>
<td draggable="false">2</td>
<td draggable="false">2</td>
</tr>
<tr draggable="true" class="dropzone">
<td draggable="false">3</td>
<td draggable="false">3</td>
<td draggable="false">3</td>
<td draggable="false">3</td>
</tr>
</tbody>
</table>
</body>
<script>
(function() {
let dragged = null;
document.addEventListener("dragstart", function(event) {
dragged = event.target;
event.target.style.opacity = .5;
});
document.addEventListener("dragenter", function(event) {
const parent = event.target.parentNode;
if (parent.className == "dropzone") {
event.target.parentNode.style.background = "#7f7f7f";
}
});
document.addEventListener("dragleave", function(event) {
const parent = event.target.parentNode;
if (parent.className == "dropzone") {
event.target.parentNode.style.background = "#ffffff";
}
});
document.addEventListener("dragover", function(event) {
// Necessário para que o "drop" funcione.
event.preventDefault();
});
document.addEventListener("drop", function(event) {
dragged.style.opacity = 1;
event.preventDefault();
const row = event.target.parentNode;
const table = row.parentNode;
if (row.className == "dropzone") {
row.style.background = "#ffffff";
const movement = dragged.compareDocumentPosition(row);
console.log('Movement: ', movement);
if (movement === Node.DOCUMENT_POSITION_PRECEDING) {
table.insertBefore(dragged, row);
} else {
table.insertBefore(dragged, row.nextSibling);
}
}
});
})();
</script>
</html>

13
exename.rs

@ -0,0 +1,13 @@
use std::env;
use std::path::Path;
fn main() {
let execution_name = env::args().nth(0).unwrap_or("???".to_string());
let parser = Path::new(&execution_name)
.file_name()
.map(|x| x.to_str())
.flatten()
.unwrap_or("???");
println!("I am {}", execution_name);
println!("And the name is {}", parser);
}

358
ms/Cargo.lock generated

@ -0,0 +1,358 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "aho-corasick"
version = "0.7.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f"
dependencies = [
"memchr",
]
[[package]]
name = "atty"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
dependencies = [
"hermit-abi",
"libc",
"winapi",
]
[[package]]
name = "autocfg"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
[[package]]
name = "bincode"
version = "1.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"
dependencies = [
"serde",
]
[[package]]
name = "bytes"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8"
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "chrono"
version = "0.4.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73"
dependencies = [
"libc",
"num-integer",
"num-traits",
"serde",
"time",
"winapi",
]
[[package]]
name = "env_logger"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3"
dependencies = [
"atty",
"humantime",
"log",
"regex",
"termcolor",
]
[[package]]
name = "hermit-abi"
version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
dependencies = [
"libc",
]
[[package]]
name = "humantime"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
[[package]]
name = "libc"
version = "0.2.107"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fbe5e23404da5b4f555ef85ebed98fb4083e55a00c317800bc2a50ede9f3d219"
[[package]]
name = "log"
version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710"
dependencies = [
"cfg-if",
]
[[package]]
name = "memchr"
version = "2.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a"
[[package]]
name = "mio"
version = "0.7.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc"
dependencies = [
"libc",
"log",
"miow",
"ntapi",
"winapi",
]
[[package]]
name = "miow"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21"
dependencies = [
"winapi",
]
[[package]]
name = "ntapi"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44"
dependencies = [
"winapi",
]
[[package]]
name = "num-integer"
version = "0.1.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db"
dependencies = [
"autocfg",
"num-traits",
]
[[package]]
name = "num-traits"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
dependencies = [
"autocfg",
]
[[package]]
name = "pin-project-lite"
version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443"
[[package]]
name = "proc-macro2"
version = "1.0.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba508cc11742c0dc5c1659771673afbab7a0efab23aa17e854cbab0837ed0b43"
dependencies = [
"unicode-xid",
]
[[package]]
name = "quote"
version = "1.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05"
dependencies = [
"proc-macro2",
]
[[package]]
name = "regex"
version = "1.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax",
]
[[package]]
name = "regex-syntax"
version = "0.6.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b"
[[package]]
name = "serde"
version = "1.0.130"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.130"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "server"
version = "0.1.0"
dependencies = [
"bincode",
"chrono",
"env_logger",
"log",
"serde",
"shared",
"tokio",
]
[[package]]
name = "shared"
version = "0.1.0"
dependencies = [
"chrono",
"serde",
]
[[package]]
name = "syn"
version = "1.0.81"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2afee18b8beb5a596ecb4a2dce128c719b4ba399d34126b9e4396e3f9860966"
dependencies = [
"proc-macro2",
"quote",
"unicode-xid",
]
[[package]]
name = "termcolor"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4"
dependencies = [
"winapi-util",
]
[[package]]
name = "time"
version = "0.1.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255"
dependencies = [
"libc",
"wasi",
"winapi",
]
[[package]]
name = "tokio"
version = "1.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70e992e41e0d2fb9f755b37446f20900f64446ef54874f40a60c78f021ac6144"
dependencies = [
"autocfg",
"bytes",
"libc",
"memchr",
"mio",
"pin-project-lite",
"tokio-macros",
"winapi",
]
[[package]]
name = "tokio-macros"
version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c9efc1aba077437943f7515666aa2b882dfabfbfdf89c819ea75a8d6e9eaba5e"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "txtclient"
version = "0.1.0"
dependencies = [
"bincode",
"env_logger",
"log",
"serde",
"shared",
"tokio",
]
[[package]]
name = "unicode-xid"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
[[package]]
name = "wasi"
version = "0.10.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
[[package]]
name = "winapi"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
dependencies = [
"winapi-i686-pc-windows-gnu",
"winapi-x86_64-pc-windows-gnu",
]
[[package]]
name = "winapi-i686-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-util"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
dependencies = [
"winapi",
]
[[package]]
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"

9
ms/Cargo.toml

@ -0,0 +1,9 @@
[workspace]
members = [
"shared",
"server",
"txtclient",
]
[profile.release]
lto = true

5
ms/README.md

@ -0,0 +1,5 @@
Stupid microservices architecture.
What I wanted was to make a pubsub-like architecture, in which the clients,
once connected, receive the data, and we could plug as many clients as we
need.

15
ms/server/Cargo.toml

@ -0,0 +1,15 @@
[package]
name = "server"
description = "A server that keeps producing content and sends them to connected clients"
version = "0.1.0"
edition = "2021"
[dependencies]
bincode = "1.3.3"
chrono = { version = "0.4.19", features = ["serde"] }
env_logger = "0.9.0"
log = "0.4.14"
serde = { version = "1.0.130", features = ["derive"] }
tokio = { version = "1.14.0", features = ["rt", "net", "macros", "sync", "time", "io-util"] }
shared = { path = "../shared" }

65
ms/server/src/main.rs

@ -0,0 +1,65 @@
use std::net::SocketAddr;
use tokio::io::AsyncWriteExt;
use tokio::net::TcpListener;
use tokio::net::TcpStream;
use tokio::sync::broadcast;
use tokio::time::sleep;
use tokio::time::Duration;
use shared::Message;
#[tokio::main(flavor = "current_thread")]
async fn main() {
env_logger::init();
let (tx, rx) = broadcast::channel::<Message>(30);
tokio::join!(consumer(rx), producer(tx.clone()), listener(tx));
}
/// Produtor de conteúdo
async fn producer(sink: broadcast::Sender<Message>) {
let messages = ["Hello world", "Goodbye Earth", "See you later alligator"];
for message in messages.iter().cycle() {
match sink.send(Message::new(message)) {
Ok(_) => {} // log::debug!("Send: {}", message),
Err(err) => log::error!("Error sending message: {:?}", err),
}
// Como o sink não tem await, o runtime não consegue escutar pelas portas
sleep(Duration::from_millis(1)).await;
}
}
/// Aguada conexões de clientes
async fn listener(connector: broadcast::Sender<Message>) {
let listener = TcpListener::bind("127.0.0.1:4435")
.await
.expect("Failed binding");
loop {
if let Ok((socket, addr)) = listener.accept().await {
log::debug!("Got new client: {:?}", addr);
let new_receiver = connector.subscribe();
tokio::spawn(async move { worker(new_receiver, socket, addr).await });
}
}
}
/// Worker que envia as mensagens para os clientes
async fn worker(mut source: broadcast::Receiver<Message>, mut stream: TcpStream, addr: SocketAddr) {
loop {
let message = source.recv().await.expect("No message");
log::debug!("Sending {:?} to {:?}", message, addr);
stream
.write_all(&bincode::serialize(&message).unwrap())
.await
.expect("Failed to send");
}
}
/// Consumidor interno
/// Essa função existe porque o sender do broadcast precisa de pelo menos um listener.
async fn consumer(mut receiver: broadcast::Receiver<Message>) {
loop {
let _message = receiver.recv().await.expect("Invalid message");
// log::debug!("Message: {:?}", message);
}
}

10
ms/shared/Cargo.toml

@ -0,0 +1,10 @@
[package]
name = "shared"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
chrono = { version = "0.4.19", features = ["serde"] }
serde = { version = "1.0.130", features = ["derive"] }

19
ms/shared/src/lib.rs

@ -0,0 +1,19 @@
use chrono::offset::Utc;
use chrono::DateTime;
use serde::Deserialize;
use serde::Serialize;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Message {
received: DateTime<Utc>,
message: String,
}
impl Message {
pub fn new(message: &str) -> Self {
Self {
received: Utc::now(),
message: message.into(),
}
}
}

16
ms/txtclient/Cargo.toml

@ -0,0 +1,16 @@
[package]
name = "txtclient"
description = "A client that keeps listened to whatever the server is producing and shows on stdout"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
bincode = "1.3.3"
env_logger = "0.9.0"
log = "0.4.14"
serde = { version = "1.0.130", features = ["derive"] }
tokio = { version = "1.14.0", features = ["rt", "net", "macros", "io-util"] }
shared = { path = "../shared" }

20
ms/txtclient/src/main.rs

@ -0,0 +1,20 @@
use tokio::io::AsyncReadExt;
use tokio::net::TcpStream;
use shared::Message;
#[tokio::main(flavor = "current_thread")]
async fn main() {
env_logger::init();
let mut stream = TcpStream::connect("127.0.0.1:4435")
.await
.expect("Failed to connect to server");
loop {
let mut buffer = [0; 1024];
let bytes = stream.read(&mut buffer).await.expect("Failed to read data");
let decoded: Message =
bincode::deserialize(&buffer[..bytes]).expect("Failed to convert message");
log::info!("Got {:?}", decoded);
}
}

69
nng/Cargo.lock generated

@ -0,0 +1,69 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "cc"
version = "1.0.72"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee"
[[package]]
name = "client"
version = "0.1.0"
[[package]]
name = "cmake"
version = "0.1.48"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8ad8cef104ac57b68b89df3208164d228503abbdce70f6880ffa3d970e7443a"
dependencies = [
"cc",
]
[[package]]
name = "gcc"
version = "0.3.55"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2"
[[package]]
name = "libc"
version = "0.2.113"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eef78b64d87775463c549fbd80e19249ef436ea3bf1de2a1eb7e717ec7fab1e9"
[[package]]
name = "nanomsg"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "617e0160fba522f8667df7bc79f3b4a74a0e3968d08023ebb3ce717a5f3bd3ac"
dependencies = [
"libc",
"nanomsg-sys",
]
[[package]]
name = "nanomsg-sys"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78aa3ccb6d007dfecb4f7070725c4b1670a87677babb6621cb0c8cce9cfdc004"
dependencies = [
"cmake",
"gcc",
"libc",
"pkg-config",
]
[[package]]
name = "pkg-config"
version = "0.3.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe"
[[package]]
name = "server"
version = "0.1.0"
dependencies = [
"nanomsg",
]

5
nng/Cargo.toml

@ -0,0 +1,5 @@
[workspace]
members = [
"server",
"client",
]

8
nng/client/Cargo.toml

@ -0,0 +1,8 @@
[package]
name = "client"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

3
nng/client/src/main.rs

@ -0,0 +1,3 @@
fn main() {
println!("Hello, world!");
}

9
nng/server/Cargo.toml

@ -0,0 +1,9 @@
[package]
name = "server"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
nanomsg = "0.7.2"

8
nng/server/src/main.rs

@ -0,0 +1,8 @@
use nanomsg::Protocol;
use nanomsg::Socket;
fn main() {
println!("Starting server...");
let mut socket = Socket::new(Protocol::Sub).unwrap();
}

1315
notifytest/Cargo.lock generated

File diff suppressed because it is too large Load Diff

13
notifytest/Cargo.toml

@ -0,0 +1,13 @@
[package]
name = "notifytest"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
clap = { version = "3.0.13", features = ["derive", "env"] }
env_logger = "0.9.0"
log = "0.4.14"
sqlx = { version = "0.5.10", features = ["runtime-tokio-rustls", "postgres", "migrate", "macros"] }
tokio = { version = "1.16.1", features = ["rt", "net", "macros", "io-util"] }

3
notifytest/README.md

@ -0,0 +1,3 @@
# NotifyTest
Testing Postgres notification features

50
notifytest/migrations/202201281050_initial.sql

@ -0,0 +1,50 @@
CREATE TABLE targets (
level_1 TEXT,
level_2 TEXT,
channel_name TEXT,
UNIQUE (level_1, level_2)
);
CREATE TABLE commands (
id SERIAL PRIMARY KEY,
level_1 TEXT,
level_2 TEXT,
payload TEXT,
channel_name TEXT,
channel_failure BOOLEAN
);
CREATE OR REPLACE FUNCTION notify_channel()
RETURNS TRIGGER
LANGUAGE PLPGSQL
AS
$$
DECLARE
target_channel TEXT;
BEGIN
SELECT channel_name
INTO target_channel
FROM targets
WHERE level_1 = NEW.level_1
AND level_2 = NEW.level_2;
if found then
SELECT pg_notify(target_channel, NEW.playload);
UPDATE commands
SET channel_name = channel_name, channel_failure = false
WHERE id = NEW.id;
else
UPDATE commands
SET channel_failure = true
WHERE id = NEW.id;
end if;
RETURN NEW;
END;
$$;
CREATE TRIGGER notify_channel
AFTER INSERT
ON commands
FOR EACH ROW
EXECUTE PROCEDURE notify_channel();

29
notifytest/migrations/202201281127_fix_function.sql

@ -0,0 +1,29 @@
CREATE OR REPLACE FUNCTION notify_channel()
RETURNS TRIGGER
LANGUAGE PLPGSQL
AS
$$
DECLARE
target_channel TEXT;
BEGIN
SELECT channel_name
INTO target_channel
FROM targets
WHERE level_1 = NEW.level_1
AND level_2 = NEW.level_2;
if found then
SELECT pg_notify(target_channel, NEW.payload);
UPDATE commands
SET channel_name = channel_name, channel_failure = false
WHERE id = NEW.id;
else
UPDATE commands
SET channel_failure = true
WHERE id = NEW.id;
end if;
RETURN NEW;
END;
$$;

28
notifytest/migrations/202201281128_fix2.sql

@ -0,0 +1,28 @@
CREATE OR REPLACE FUNCTION notify_channel()
RETURNS TRIGGER
LANGUAGE PLPGSQL
AS
$$
DECLARE
target_channel TEXT;
BEGIN
SELECT channel_name
INTO target_channel
FROM targets
WHERE level_1 = NEW.level_1
AND level_2 = NEW.level_2;
if found then
SELECT pg_notify(target_channel, NEW.payload);
UPDATE commands
SET channel_name = channel_name, channel_failure = false
WHERE id = NEW.id;
else
UPDATE commands
SET channel_failure = true
WHERE id = NEW.id;
end if;
END;
$$;

26
notifytest/migrations/202201281133_fix3.sql

@ -0,0 +1,26 @@
CREATE OR REPLACE FUNCTION notify_channel()
RETURNS TRIGGER
LANGUAGE PLPGSQL
AS
$$
DECLARE
target_channel TEXT;
BEGIN
SELECT channel_name
INTO target_channel
FROM targets
WHERE level_1 = NEW.level_1
AND level_2 = NEW.level_2;
if found then
PERFORM pg_notify(target_channel, NEW.payload);
UPDATE commands
SET channel_name = channel_name, channel_failure = false
WHERE id = NEW.id;
else
UPDATE commands
SET channel_failure = true
WHERE id = NEW.id;
end if;
END;
$$;

29
notifytest/migrations/202201281134_fix4.sql

@ -0,0 +1,29 @@
CREATE OR REPLACE FUNCTION notify_channel()
RETURNS TRIGGER
LANGUAGE PLPGSQL
AS
$$
DECLARE
target_channel TEXT;
BEGIN
SELECT channel_name
INTO target_channel
FROM targets
WHERE level_1 = NEW.level_1
AND level_2 = NEW.level_2;
if found then
PERFORM pg_notify(target_channel, NEW.payload);
UPDATE commands
SET channel_name = channel_name, channel_failure = false
WHERE id = NEW.id;
else
UPDATE commands
SET channel_failure = true
WHERE id = NEW.id;
end if;
RETURN NEW;
END;
$$;

57
notifytest/src/main.rs

@ -0,0 +1,57 @@
use clap::Parser;
use sqlx::postgres::PgListener;
use sqlx::postgres::PgPoolOptions;
use sqlx::postgres::Postgres;
use sqlx::Pool;
async fn connect(url: &str) -> Pool<Postgres> {
PgPoolOptions::new()
.max_connections(3)
.connect(url)
.await
.expect("Failed to connect to the database")
}
async fn create_listener(channel: &str, url: &str) {
let mut listener = PgListener::connect(&url)
.await
.expect("Failed to connect listener {channel}");
listener
.listen(channel)
.await
.expect("Failed to listen to channel {channel}");
log::info!("Listener on {channel} ready...");
loop {
let notification = listener
.recv()
.await
.expect("Failed to receive data from channel {channel}");
log::info!("Notification: {:?}", notification);
}
}
#[derive(Parser)]
#[clap(version, about)]
struct Args {
/// URL for the database connection.
#[clap(short, long, env = "DATABASE_URL")]
database: String,
}
#[tokio::main]
async fn main() {
env_logger::init();
let args = Args::parse();
let pool = connect(&args.database).await;
sqlx::migrate!()
.run(&pool)
.await
.expect("Migration failure");
let listener_type_1 = create_listener("type_1", &args.database);
let listener_type_2 = create_listener("type_2", &args.database);
let listener_type_3 = create_listener("type_3", &args.database);
tokio::join!(listener_type_1, listener_type_2, listener_type_3);
}

10
specgen.rs

@ -0,0 +1,10 @@
//! Test if one can create a generic and a specific impl for the same trait.
trait SomeTrait {
fn say(&self) -> String;
}
struct SomeStruct<T> {}
impl<T> for SomeStruct<T>
where T: SomeTrait

16
spmc-test/Cargo.lock generated

@ -0,0 +1,16 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "spmc"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02a8428da277a8e3a15271d79943e80ccc2ef254e78813a166a08d65e4c3ece5"
[[package]]
name = "spmctest"
version = "0.1.0"
dependencies = [
"spmc",
]

7
spmc-test/Cargo.toml

@ -0,0 +1,7 @@
[package]
name = "spmctest"
version = "0.1.0"
edition = "2021"
[dependencies]
spmc = "0.3"

24
spmc-test/src/main.rs

@ -0,0 +1,24 @@
use std::thread;
fn main() {
let (mut tx, rx) = spmc::channel();
let mut handles = Vec::new();
for n in 0..5 {
let rx = rx.clone();
handles.push(thread::spawn(move || {
while let Ok(msg) = rx.recv() {
// println!("Hello");
println!("worker {} recvd: {}", n, msg);
}
}));
}
for i in 0..15 {
tx.send(i).unwrap();
}
for handle in handles {
handle.join().unwrap();
}
}

10
spongebob.rs

@ -0,0 +1,10 @@
fn main() {
let phrase = std::env::args().skip(1).collect::<Vec<String>>().join(" ");
let mapper = [
Box::new(|x: char| x.to_uppercase()),
Box::new(|x: char| x.to_lowercase()),
]
.iter()
.cycle();
println!("{}", phrase.chars().map(mapper.next()).collect().join(""));
}

98
tokioselect/Cargo.lock generated

@ -0,0 +1,98 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "hermit-abi"
version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
dependencies = [
"libc",
]
[[package]]
name = "libc"
version = "0.2.117"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e74d72e0f9b65b5b4ca49a346af3976df0f9c61d550727f349ecd559f251a26c"
[[package]]
name = "num_cpus"
version = "1.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1"
dependencies = [
"hermit-abi",
"libc",
]
[[package]]
name = "pin-project-lite"
version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c"
[[package]]
name = "proc-macro2"
version = "1.0.36"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029"
dependencies = [
"unicode-xid",
]
[[package]]
name = "quote"
version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "864d3e96a899863136fc6e99f3d7cae289dafe43bf2c5ac19b70df7210c0a145"
dependencies = [
"proc-macro2",
]
[[package]]
name = "syn"
version = "1.0.86"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b"
dependencies = [
"proc-macro2",
"quote",
"unicode-xid",
]
[[package]]
name = "tokio"
version = "1.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c27a64b625de6d309e8c57716ba93021dccf1b3b5c97edd6d3dd2d2135afc0a"
dependencies = [
"num_cpus",
"pin-project-lite",
"tokio-macros",
]
[[package]]
name = "tokio-macros"
version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "tokioselect"
version = "0.1.0"
dependencies = [
"tokio",
]
[[package]]
name = "unicode-xid"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"

7
tokioselect/Cargo.toml

@ -0,0 +1,7 @@
[package]
name = "tokioselect"
version = "0.1.0"
edition = "2021"
[dependencies]
tokio = { version = "1.16.1", features = ["rt", "rt-multi-thread", "macros", "time", "sync"] }

46
tokioselect/src/main.rs

@ -0,0 +1,46 @@
use tokio::sync::mpsc::channel;
use tokio::time::sleep;
use tokio::time::Duration;
#[tokio::main]
async fn main() {
let (tx1, mut rx1) = channel(100);
let (tx2, mut rx2) = channel(100);
tokio::spawn(async move {
println!("I'm worker 1");
let mut loop_id = 1;
let sleep_time = Duration::from_millis(200);
loop {
let message = format!("This is loop 1-{loop_id}");
tx1.send(message).await.unwrap();
sleep(sleep_time).await;
loop_id += 1;
}
});
tokio::spawn(async move {
println!("I'm worker 2");
let mut loop_id = 1;
let sleep_time = Duration::from_millis(300);
loop {
let message = format!("This is loop 2-{loop_id}");
tx2.send(message).await.unwrap();
sleep(sleep_time).await;
loop_id += 1;
}
});
// This is main
loop {
tokio::select! {
Some(msg) = rx1.recv() => {
println!("Worker 1 said \"{}\"", msg);
}
Some(msg) = rx2.recv() => {
println!("Worker 2 said \"{}\"", msg);
}
else => { break }
};
}
}

9
while.rs

@ -0,0 +1,9 @@
fn main() {
let data = [0b1000_0001u8, 0b0000_0010, 0b1000_0011];
let mut main_iter = data.iter();
let mut simple_iter = main_iter.take_while(|x| *x & 0b1000_000 != 0b1000_0000);
println!("{:?}", simple_iter);
let mut next_iter = main_iter.take_while(|x| *x & 0b1000_000 != 0b1000_0000);
println!("{:?}", next_iter);
}
Loading…
Cancel
Save