# Slink notes
```elixir
Mix.install([
{:kino, "~> 0.16.0"},
{:kino_db, "~> 0.3.0"},
{:postgrex, "~> 0.18"},
{:kino_explorer, "~> 0.1.20"},
{:merquery, "~> 0.3.0"}
])
```
## Knonw bugs
* Unspport non chrome-extension://xxxx like non-http links in code
## Test accounts
ref test/support/fixtures.ex
* a1@b.c / 123456123456
## DB
```elixir
opts = [
hostname: "localhost",
port: 5432,
username: "postgres",
password: "postgres",
database: "slink_dev"
]
{:ok, conn} = Kino.start_child({Postgrex, opts})
Kino.nothing()
```
<!-- livebook:{"attrs":"eyJjYWNoZV9xdWVyeSI6dHJ1ZSwiY29ubmVjdGlvbiI6eyJ0eXBlIjoicG9zdGdyZXMiLCJ2YXJpYWJsZSI6ImNvbm4ifSwiZGF0YV9mcmFtZV9hbGlhcyI6IkVsaXhpci5FeHBsb3Jlci5EYXRhRnJhbWUiLCJxdWVyeSI6InNlbGVjdCAqIGZyb20gdXNlcnMgb3JkZXIgYnkgaWQgYXNjIiwicmVzdWx0X3ZhcmlhYmxlIjoicmVzdWx0IiwidGltZW91dCI6bnVsbH0","chunks":null,"kind":"Elixir.KinoDB.SQLCell","livebook_object":"smart_cell"} -->
```elixir
result = Postgrex.query!(conn, ~S"select * from users order by id asc", [])
```
<!-- livebook:{"attrs":"eyJjYWNoZV9xdWVyeSI6dHJ1ZSwiY29ubmVjdGlvbiI6eyJ0eXBlIjoicG9zdGdyZXMiLCJ2YXJpYWJsZSI6ImNvbm4ifSwiZGF0YV9mcmFtZV9hbGlhcyI6IkVsaXhpci5FeHBsb3Jlci5EYXRhRnJhbWUiLCJxdWVyeSI6InNlbGVjdCAqIGZyb20gdXNlcnNfdG9rZW5zIG9yZGVyIGJ5IGlkIGRlc2MgbGltaXQgNSIsInJlc3VsdF92YXJpYWJsZSI6InJlc3VsdDIiLCJ0aW1lb3V0IjpudWxsfQ","chunks":null,"kind":"Elixir.KinoDB.SQLCell","livebook_object":"smart_cell"} -->
```elixir
result2 =
Postgrex.query!(conn, ~S"select * from users_tokens order by id desc limit 5", [])
```
## Node info
```elixir
%{
node: Node.self,
cookie: Node.get_cookie(),
nodes: Node.list
} |> Kino.Tree.new()
```
## Local app links
### Remote execution
<!-- livebook:{"break_markdown":true} -->
in slink project run:
```
task node6
```
<!-- livebook:{"attrs":"eyJhc3NpZ25fdG8iOiIiLCJjb2RlIjoiU2xpbmsuTGlua3MuTGluay5maXJzdCIsImNvb2tpZV9zb3VyY2UiOiJ0ZXh0IiwiY29va2llX3RleHQiOiJzbGluayIsIm5vZGVfc291cmNlIjoidGV4dCIsIm5vZGVfdGV4dCI6InNsaW5rQG1hYy5sb2NhbCJ9","chunks":null,"kind":"Elixir.Kino.RemoteExecutionCell","livebook_object":"smart_cell"} -->
```elixir
require Kino.RPC
node = :"slink@mac.local"
Node.set_cookie(node, :slink)
Kino.RPC.eval_string(node, ~S"Slink.Links.Link.first", file: __ENV__.file)
```
### DB explore
<!-- livebook:{"attrs":"eyJjYWNlcnRmaWxlIjoiIiwiZGF0YWJhc2UiOiJzbGlua19kZXYiLCJob3N0bmFtZSI6ImxvY2FsaG9zdCIsInBhc3N3b3JkIjoicG9zdGdyZXMiLCJwb3J0Ijo1NDMyLCJ0eXBlIjoicG9zdGdyZXMiLCJ1c2VfaXB2NiI6ZmFsc2UsInVzZV9zc2wiOmZhbHNlLCJ1c2VybmFtZSI6InBvc3RncmVzIiwidmFyaWFibGUiOiJsb2NhbF9jb25uIn0","chunks":null,"kind":"Elixir.KinoDB.ConnectionCell","livebook_object":"smart_cell"} -->
```elixir
opts = [
hostname: "localhost",
port: 5432,
username: "postgres",
password: "postgres",
database: "slink_dev"
]
{:ok, local_conn} = Kino.start_child({Postgrex, opts})
```
<!-- livebook:{"attrs":"eyJjYWNoZV9xdWVyeSI6dHJ1ZSwiY29ubmVjdGlvbiI6eyJ0eXBlIjoicG9zdGdyZXMiLCJ2YXJpYWJsZSI6ImxvY2FsX2Nvbm4ifSwiZGF0YV9mcmFtZV9hbGlhcyI6IkVsaXhpci5FeHBsb3Jlci5EYXRhRnJhbWUiLCJxdWVyeSI6InNlbGVjdCAqIGZyb20gbGlua3Mgb3JkZXIgYnkgaWQgZGVzYyBsaW1pdCA1IiwicmVzdWx0X3ZhcmlhYmxlIjoibG9jYWxfbGlua3MiLCJ0aW1lb3V0IjpudWxsfQ","chunks":null,"kind":"Elixir.KinoDB.SQLCell","livebook_object":"smart_cell"} -->
```elixir
local_links =
Postgrex.query!(local_conn, ~S"select * from links order by id desc limit 5", [])
```
## Flyio app links
* https://slink.fly.dev
* http://slink.internal:8080/api/ping
* fly dig AAAA slink.internal
<!-- livebook:{"break_markdown":true} -->
### API requests
```elixir
req =
Req.new(
method: :get,
url: "http://slink.internal:8080/api/ping",
headers: %{},
params: %{"http://slink.internal:8080/api/ping" => ""}
)
req = Req.merge(req, inet6: true)
{req, flyio_resp} = Req.request(req)
flyio_resp.body|>Kino.Tree.new()
```
### DB connection
<!-- livebook:{"break_markdown":true} -->
使用fly 6PN地址,如 shareup-db.internal
* 注意<span style="color: red;">**开启IPv6开关**</span>
<!-- livebook:{"attrs":"eyJjYWNlcnRmaWxlIjoiIiwiZGF0YWJhc2UiOiJzbGluayIsImhvc3RuYW1lIjoic2hhcmV1cC1kYi1wZzE3LmludGVybmFsIiwicGFzc3dvcmRfc2VjcmV0IjoiRkxZX1NMSU5LX0RCX1BBU1NXT1JEIiwicG9ydCI6NTQzMiwidHlwZSI6InBvc3RncmVzIiwidXNlX2lwdjYiOnRydWUsInVzZV9zc2wiOmZhbHNlLCJ1c2VybmFtZSI6InNsaW5rIiwidmFyaWFibGUiOiJmbHlpb19jb25uIn0","chunks":null,"kind":"Elixir.KinoDB.ConnectionCell","livebook_object":"smart_cell"} -->
```elixir
opts = [
hostname: "shareup-db-pg17.internal",
port: 5432,
username: "slink",
password: System.fetch_env!("LB_FLY_SLINK_DB_PASSWORD"),
database: "slink",
socket_options: [:inet6]
]
{:ok, flyio_conn} = Kino.start_child({Postgrex, opts})
```
<!-- livebook:{"attrs":"eyJjYWNoZV9xdWVyeSI6dHJ1ZSwiY29ubmVjdGlvbiI6eyJ0eXBlIjoicG9zdGdyZXMiLCJ2YXJpYWJsZSI6ImZseWlvX2Nvbm4ifSwiZGF0YV9mcmFtZV9hbGlhcyI6IkVsaXhpci5FeHBsb3Jlci5EYXRhRnJhbWUiLCJxdWVyeSI6InNlbGVjdCAqIGZyb20gbGlua3Mgb3JkZXIgYnkgdXBkYXRlZF9hdCBkZXNjIGxpbWl0IDEwIiwicmVzdWx0X3ZhcmlhYmxlIjoiZmx5aW9fbGlua3MiLCJ0aW1lb3V0IjpudWxsfQ","chunks":null,"kind":"Elixir.KinoDB.SQLCell","livebook_object":"smart_cell"} -->
```elixir
flyio_links =
Postgrex.query!(
flyio_conn,
~S"select * from links order by updated_at desc limit 10",
[]
)
```
### Remote execution
<!-- livebook:{"break_markdown":true} -->
* [http://[fdaa:2:686c:a7b:17c:2499:7edf:2]:8080/api/ping](http://[fdaa:2:686c:a7b:17c:2499:7edf:2]:8080/api/ping)
* s@fdaa:2:686c:a7b:17c:2499:7edf:2
* s@slink.internal
* e82d339f725618.vm.slink.internal
```elixir
req =
Req.new(
method: :get,
url: "http://slink.internal:8080/api/ping",
headers: %{},
params: %{"http://slink.internal:8080/api/ping" => ""}
)
req = Req.merge(req, inet6: true)
{req, flyio_resp} = Req.request(req)
flyio_resp.body |> Kino.Tree.new
```
<span style="color: red">
Below remote-execution require local livebook running in inet6 mode, like
</span>
```
node6:
env:
LIVEBOOK_DISTRIBUTION: name
# Note: should use inet6 when connect to Flyio app?
LIVEBOOK_NODE: "lv@::1"
LIVEBOOK_COOKIE: "livebook"
ERL_AFLAGS: "-proto_dist inet6_tcp -kernel shell_history enabled"
cmds:
- |
iex -S mix phx.server
```
<!-- livebook:{"attrs":"eyJhc3NpZ25fdG8iOiJzcyIsImNvZGUiOiJTbGluay5MaW5rcy5MaW5rLmxhc3QiLCJjb29raWVfc291cmNlIjoidGV4dCIsImNvb2tpZV90ZXh0IjoiaGFwcHktY29va2llLW5vdC1zZWNyZXQtYnV0LWZvci1jbHVzdGVyIiwibm9kZV9zb3VyY2UiOiJ0ZXh0Iiwibm9kZV90ZXh0Ijoic2xpbmstMDFLMkJaUlZGWlMwVFpOUlI3V0g1NldSWjZAZmRhYToyOjY4NmM6YTdiOjE3YjplYWI0OjJhOTE6MiJ9","chunks":null,"kind":"Elixir.Kino.RemoteExecutionCell","livebook_object":"smart_cell"} -->
```elixir
require Kino.RPC
node = :"slink-01K2BZRVFZS0TZNRR7WH56WRZ6@fdaa:2:686c:a7b:17b:eab4:2a91:2"
Node.set_cookie(node, :"happy-cookie-not-secret-but-for-cluster")
ss = Kino.RPC.eval_string(node, ~S"Slink.Links.Link.last", file: __ENV__.file)
```
<!-- livebook:{"offset":6868,"stamp":{"token":"XCP.ooZbN7znzZNERfD2JzVEcJlABTtqB_4zQlNXcBRoGqSp_kaLWkxqA6TnVdt9EY-yRP-tdfGn0PlJfBpyKPrTHy5811YFw5isVgqCBoqxn-HAmgV_EBLUkWz3B5pHGTSC","version":2}} -->