Run this notebook

Use Livebook to open this notebook and explore new ideas.

It is easy to get started, on your machine or the cloud.

Click below to open and run it in your Livebook at .

(or change your Livebook location)

# 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}} -->
See source

Have you already installed Livebook?

If you already installed Livebook, you can configure the default Livebook location where you want to open notebooks.
Livebook up Checking status We can't reach this Livebook (but we saved your preference anyway)
Run notebook

Not yet? Install Livebook in just a minute

Livebook is open source, free, and ready to run anywhere.

Run on your machine

with Livebook Desktop

Run in the cloud

on select platforms

To run on Linux, Docker, embedded devices, or Elixir’s Mix, check our README.

PLATINUM SPONSORS
SPONSORS
Code navigation with go to definition of modules and functions Read More ×