Compare commits

...

91 Commits

Author SHA1 Message Date
571d36439c Update mitmproxy/README.md 2025-12-04 20:57:28 +09:00
adecd40bdf Add x11 2025-11-11 02:38:21 +09:00
dda5bf848c backup fedora 2025-10-14 15:47:47 +09:00
16d0303780 update 2025-09-30 20:06:52 +09:00
f6dedfad2d update bash_aliases 2025-09-30 20:01:29 +09:00
292feef557 update ls 2025-09-30 19:01:54 +09:00
47dcfe0514 major update of bashrc 2025-09-30 19:00:33 +09:00
d14b0b1f09 Add security/README.md 2025-09-28 01:38:35 +09:00
8fb7320998 Add golang/README.md 2025-09-28 01:06:12 +09:00
0df62464c6 Add beej/telnot.go 2025-09-26 19:04:24 +09:00
87fce8bab5 Add golang/tcpproxy.go 2025-09-24 09:32:20 +09:00
33ce2061dd clean bashrc 2025-09-18 09:16:05 +09:00
46f2576e50 Update fedora/README.md 2025-09-13 08:35:00 +09:00
2f262324d0 Update fedora/README.md 2025-09-10 11:26:12 +09:00
c4169937fe Update fedora/README.md 2025-09-08 10:39:57 +09:00
75b9a35d5a Update fedora/README.md 2025-09-08 10:35:24 +09:00
de2fb4472f Update fedora/README.md 2025-09-08 09:28:03 +09:00
a9336a95a0 Update fedora/README.md 2025-09-08 09:23:49 +09:00
39d9839d1d Update fedora/README.md 2025-09-08 09:04:06 +09:00
a36238ddd6 Add fedora/README.md 2025-09-08 08:48:22 +09:00
4efaffaa1c wsl 2025-09-08 06:29:38 +09:00
eae6fc2d21 Update wsl-docker/README.md 2025-08-31 09:42:29 +09:00
81e8098350 Update wsl-docker/README.md 2025-08-09 16:02:19 +09:00
540b45f23d Update wsl-docker/README.md 2025-07-07 14:16:07 +09:00
b670123442 Update README.md 2025-07-04 20:16:25 +09:00
0afdea949c Update README.md 2025-07-04 01:13:46 +09:00
9260cd2645 Update supervisor/README.md 2025-05-05 22:57:35 +09:00
89d5f4a30d Add supervisor/README.md 2025-05-05 22:44:25 +09:00
9ae3a5e2a2 Add cron/README.md 2025-04-01 13:47:53 +00:00
ee0b955168 Update color/README.md 2025-03-23 14:18:13 +00:00
271a724cc8 Add schtasks/README.md 2025-03-19 22:35:46 +00:00
b496bfdc1d Update llama.cpp/README.md 2025-03-17 20:08:41 +00:00
a19a255803 Update README.md 2025-03-17 15:49:12 +00:00
6bb479ca63 Update README.md 2025-03-17 15:48:35 +00:00
fc1a3db03c Update README.md 2025-03-17 15:14:25 +00:00
41f003ed92 Update README.md 2025-03-17 15:10:12 +00:00
61323ee24b Update README.md 2025-03-17 15:01:16 +00:00
5b0c81a9e4 Update README.md 2025-03-17 14:59:37 +00:00
c8bde849c8 Update README.md 2025-03-17 14:58:37 +00:00
9d7db43261 Add llama.cpp/README.md 2025-03-14 04:29:14 +00:00
25310c4ffc Update windows-C++/README.md 2025-03-07 02:54:56 +00:00
66ab28c118 Add windows-C++/README.md 2025-03-07 02:46:55 +00:00
02db41e938 Update mitmproxy/README.md 2025-03-02 00:53:37 +00:00
0a991253b0 Update mitmproxy/README.md 2025-03-02 00:53:29 +00:00
d5fac9d904 Update mitmproxy/README.md 2025-03-02 00:53:08 +00:00
faf2f674d0 Update README.md 2025-03-01 14:54:15 +00:00
3e2d74afcd Update nest-asyncio/README.md 2025-03-01 14:52:43 +00:00
95f1476958 Update nest-asyncio/README.md 2025-03-01 14:44:00 +00:00
40d60edc24 Update playwright/README.md 2025-03-01 04:44:52 +00:00
091e80e53a Update playwright/README.md 2025-03-01 04:34:15 +00:00
5e34ec00ef Update playwright/README.md 2025-03-01 04:32:04 +00:00
b1c15a30f8 Add powershell/README.md 2025-02-28 18:31:32 +00:00
163d67efca Add nssm/README.md 2025-02-24 10:19:38 +00:00
56fe41c806 Update README.md 2025-02-22 19:00:01 +00:00
02b206c216 Update README.md 2025-02-22 10:47:08 +00:00
083e52ac94 Add thread-python/README.md 2025-02-22 10:46:48 +00:00
054cdf6d31 Update README.md 2025-02-22 10:45:19 +00:00
cc968b637d Update README.md 2025-02-22 10:43:43 +00:00
92d228ed63 Update README.md 2025-02-21 18:20:02 +00:00
60dee8d6d4 Add parallel/README.md 2025-02-16 04:21:55 +00:00
3f220f1811 Update chrome/README.md 2025-02-05 03:26:55 +00:00
df64161e57 Update chrome/README.md 2025-02-05 03:13:13 +00:00
52a000a172 Add chrome/README.md 2025-02-05 02:03:21 +00:00
1113030566 Update mobile/README.md 2025-02-04 01:20:46 +00:00
61c2567206 Update mobile/README.md 2025-02-04 01:18:28 +00:00
546249fd92 Update mobile/README.md 2025-02-04 01:18:17 +00:00
d97a6e0e32 Update mobile/README.md 2025-02-04 00:18:09 +00:00
2d549e3c54 Update mobile/README.md 2025-02-04 00:17:49 +00:00
fb87983212 Update mobile/README.md 2025-02-04 00:14:56 +00:00
6546e9b26d Add mobile/README.md 2025-02-04 00:14:31 +00:00
9a3ae8ed67 Update playwright/README.md 2025-02-03 21:16:39 +00:00
ff70df1b4b Add asyncio-threading/README.md 2025-02-03 20:44:16 +00:00
bf60c268a2 Update adb/README.md 2025-02-01 11:07:10 +00:00
832f33bd7d Add User-Agent Client Hints/REAMDE.md 2025-01-31 05:22:44 +00:00
099ef4f252 Update color/README.md 2025-01-31 03:06:48 +00:00
8cc0e5b8bc Update adb/README.md 2025-01-31 00:07:07 +00:00
3ba6c6b35a Update adb/README.md 2025-01-31 00:01:24 +00:00
aada5c1253 Add adb/README.md 2025-01-31 00:01:10 +00:00
cf80f44edc Add browser/README.md 2025-01-27 02:16:16 +00:00
3c2509dac3 Update mitmproxy/README.md 2025-01-27 01:27:33 +00:00
ea164fd94f Update mitmproxy/README.md 2025-01-27 01:24:29 +00:00
ff5a4c7051 Update mitmproxy/README.md 2025-01-27 01:03:19 +00:00
ff3ae6488c Update mitmproxy/README.md 2025-01-27 00:06:01 +00:00
2a098f418f Update mitmproxy/README.md 2025-01-26 23:35:24 +00:00
15f9dd41cb Update mitmproxy/README.md 2025-01-26 22:19:10 +00:00
e772505866 Update mitmproxy/README.md 2025-01-26 21:53:02 +00:00
7a1f203ea9 Add mitmproxy/README.md 2025-01-26 21:26:57 +00:00
75e81fa11e Update windows-libzmq/README.md 2025-01-24 23:54:32 +00:00
784012e781 Update windows-libzmq/README.md 2025-01-24 23:52:57 +00:00
3f8a13dc77 Add windows-libzmq/README.md 2025-01-24 23:45:13 +00:00
eae9c91e2a Add windows-gcc/README.md 2025-01-24 13:23:22 +00:00
50 changed files with 3619 additions and 308 deletions

3
.gitignore vendored
View File

@@ -1,2 +1,3 @@
.ipynb_checkpoints .ipynb_checkpoints
__pycache__ __pycache__
cpu-bench/*.png

110
README.md
View File

@@ -1,29 +1,53 @@
## ThreadPoolExecutor ## Debian
```py ```sh
__import__('concurrent').futures.ThreadPoolExecutor().submit( sudo apt update && sudo apt upgrade -y
lambda x: (print(x * 2) or x ** 2 / 0), 3).result() sudo apt install -y curl python3-venv
curl -fsSL https://code-server.dev/install.sh | sh
mkdir -p ~/.config/code-server
tee ~/.config/code-server/config.yaml <<EOF
bind-addr: 0.0.0.0:8888
auth: none
cert: false
EOF
sudo systemctl enable --now code-server@$USER
about:config
dom.events.testing.asyncClipboard
true
python3 -m venv .venv
tee -a ~/.bash_aliases <<EOF
export PATH=~/.venv/bin:\$PATH
EOF
source .bashrc
pip install ipykernel jupyterlab mitmproxy
``` ```
## sqlite3 ## sqlite3 [25-03-17]
```py ```py
def SQL(): import sqlite3, os, json
def File(blob): class SQL:
try: import zmq; File.sock.send_pyobj(blob); return File.sock.recv_pyobj() def __init__(sql, db='.db'):
except (AttributeError, zmq.Again): if not os.path.exists(db): os.makedirs(db); SQL(db).con.executescript(
(sock := zmq.Context().socket(zmq.REQ)).connect('tcp://localhost:6106') "PRAGMA journal_mode=WAL; CREATE TABLE kv(k,v,t DEFAULT CURRENT_TIMESTAMP);"
sock.RCVTIMEO = 1000; File.sock = sock; return File(blob) "CREATE INDEX idx_kv_v ON kv(v); CREATE INDEX idx_kv_k_t ON kv(k,t DESC);")
import sqlite3, os; init = not os.path.exists('.db') (con := sqlite3.connect(f'{db}/sql', check_same_thread=False,
(con := sqlite3.connect('.db', isolation_level=None)).row_factory = sqlite3.Row isolation_level=None)).execute(f"PRAGMA busy_timeout={1e9}")
if init: con.executescript(""" sql.con, sql.db = con, db
PRAGMA journal_mode=WAL; def __call__(sql, q, *p): return [*sql.con.execute(q, p)]
CREATE TABLE kv(k, v, t DEFAULT CURRENT_TIMESTAMP); def __setitem__(sql, k, v): return sql("INSERT INTO kv(k,v) VALUES(?,?)",
CREATE INDEX index_kv_v ON kv(v); k, v if type(v) is bytes else json.dumps(v, ensure_ascii=False))
CREATE INDEX index_kv_k_t ON kv(k, t DESC);""") def __getitem__(sql, k):
return type('', (), dict(__call__=lambda _, q, *p: list(map(dict, con.execute(q, p))), if (v := sql("SELECT v FROM kv WHERE k=? ORDER BY t DESC LIMIT 1", k)):
__setitem__=lambda sql, k, v: sql('INSERT INTO kv(k,v) VALUES(?,?)', k, File(v)), return json.loads(v) if type(v := v[0][0]) is str else v
__getitem__=lambda sql, k: File(v[0]['v']) if (v := sql( def __delitem__(sql, rows):
'SELECT v FROM kv WHERE k=? ORDER BY t DESC LIMIT 1', k)) else None, for row in rows: sql("DELETE FROM kv WHERE k=? AND v=? AND t=?", *row)
__contains__=lambda sql, k: bool(sql('SELECT 1 FROM kv WHERE k=?', k))))() def __contains__(sql, k): return bool(sql("SELECT 1 FROM kv WHERE k=?", k))
def __eq__(sql, query): return sql("SELECT * FROM kv WHERE k LIKE ?", query)
def __ne__(sql, query): return sql("SELECT * FROM kv WHERE k NOT LIKE ?", query)
def __repr__(sql): return f"SQL(db={sql.db})"
sql = SQL() sql = SQL()
``` ```
@@ -48,28 +72,36 @@ async def main(): print('hello'); return 'world'
main() main()
``` ```
## playwright ## playwright [25-03-01]
```py ```python
@(sync := lambda coro: __import__('nest_asyncio').apply() or def Page():
__import__('functools').wraps(coro)(lambda *args, **kwargs: def sync(obj):
__import__('asyncio').run(coro(*args, **kwargs)))) import asyncio, functools
async def Page(): if asyncio.iscoroutine(coro := obj):
loop, future = asyncio.get_event_loop(), asyncio.ensure_future(coro)
while not future.done():
loop._process_events(loop._selector.select(0))
if (ready := loop._ready) and not (handle := ready.popleft())._cancelled:
task = (tasks := asyncio.tasks._current_tasks).pop(loop, None)
handle._run()
tasks[loop] = task
return future.result()
if asyncio.iscoroutinefunction(func := obj): return functools.wraps(func)(
lambda *args, **kwargs: sync(func(*args, **kwargs)))
for attr in dir(obj):
if asyncio.iscoroutinefunction(method := getattr(obj, attr)):
setattr(obj, attr, sync(method))
return obj
from playwright.async_api import async_playwright from playwright.async_api import async_playwright
browser = await (await async_playwright().start()).chromium.launch() browser = sync(sync(async_playwright().start()).firefox.launch())
(context := await browser.new_context()).set_default_timeout(0) page = sync(sync(browser.new_page()))
for attr in dir(page := await context.new_page()):
if attr[0] != '_' and callable(method := getattr(page, attr)):
setattr(page, attr, sync(method))
page._repr_png_ = page.screenshot page._repr_png_ = page.screenshot
page.goto = lambda url, goto=page.goto: goto(url)
page.soup = lambda: __import__('bs4').BeautifulSoup(page.content(), 'lxml')
return page return page
''
page = Page() page = Page()
page.goto('https://naver.com') page.goto('https://naver.com')
page page
''
page.soup()
``` ```
# wireguard # wireguard

View File

@@ -0,0 +1,8 @@
# User-Agent보다 정밀하게 Browser를 Fingerprinting 하는 기능
- https://github.com/ungoogled-software/ungoogled-chromium/issues/1422
- firefox에서는 Off / Chrome/Chromium에서는 끌수 없음 `--disable-features=UserAgentClientHint`
# Test
https://browserleaks.com/client-hints

46
adb/README.md Normal file
View File

@@ -0,0 +1,46 @@
# Android Studio
- https://developer.android.com/studio
- Disable AVD during installation
- Blank project
- Permit USB from Phone
# User env
`%LOCALAPPDATA%\Android\sdk\platform-tools`
```shell
adb devices
List of devices attached
R3CW70RGJMW device
adb forward tcp:8080 tcp:8080
pkg update && pkg upgrade -y
# netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8080 connectaddress=127.0.0.1 connectport=8080
```
# proot
```shell
proot-distro list
proot-distro install debian
proot-distro login debian
apt updtate
apt install -y mitmdump
mitmdump -q
curl -x localhost:8080 ip.yauk.tv
```
https://m.blog.naver.com/wonjinho81/222597996987
# KeepAlive
```shell
adb -a nodaemon server start # blocking
adb forward tcp:8080 tcp:8080 # reentrant
adb shell svc data disable
adb shell svc data enable
```

View File

@@ -0,0 +1,68 @@
```python
"""
This gist shows how to run asyncio loop in a separate thread.
It could be useful if you want to mix sync and async code together.
Python 3.7+
"""
import asyncio
from datetime import datetime
from threading import Thread
from typing import Tuple, List, Iterable
import httpx
URLS = [
"https://pypi.org",
"https://python.org",
"https://google.com",
"https://amazon.com",
"https://reddit.com",
"https://stackoverflow.com",
"https://ubuntu.com",
"https://github.com",
"https://microsoft.com",
]
def start_background_loop(loop: asyncio.AbstractEventLoop) -> None:
asyncio.set_event_loop(loop)
loop.run_forever()
async def fetch(url: str) -> Tuple[str, int]:
"""Does HTTP get on url and returns url and status code"""
async with httpx.AsyncClient() as session:
response = await session.get(url)
return url, response.status_code
async def fetch_all_urls(urls: Iterable[str]) -> List[Tuple[str, int]]:
"""Fetch all urls from the list of urls
It is done concurrently and combined into a single coroutine"""
tasks = [asyncio.create_task(fetch(url)) for url in urls]
results = await asyncio.gather(*tasks)
return results
def main() -> None:
loop = asyncio.new_event_loop()
t = Thread(target=start_background_loop, args=(loop,), daemon=True)
t.start()
start_time = datetime.now()
task = asyncio.run_coroutine_threadsafe(fetch_all_urls(URLS), loop)
for url, status_code in task.result():
print(f"{url} -> {status_code}")
exec_time = (datetime.now() - start_time).total_seconds()
print(f"It took {exec_time:,.2f} seconds to run")
loop.stop()
if __name__ == "__main__":
main()
```
CREDIT: https://gist.githubusercontent.com/dmfigol/3e7d5b84a16d076df02baa9f53271058/raw/dd7f9acf7afcc3c68b2b363d2e17ff6393dbde43/asyncio_loop_in_thread.py

18
beej/telnot.go Normal file
View File

@@ -0,0 +1,18 @@
package main
import ("fmt";"io";"log";"net";"os")
func main() {
if len(os.Args) != 3 {
log.Fatal("usage: telnot hostname port")
}
hostname, port := os.Args[1], os.Args[2]
if conn, err := net.Dial("tcp", net.JoinHostPort(hostname, port)); err != nil {
log.Fatal("failed to connect:", err)
} else {
defer conn.Close()
fmt.Printf("Connected to %s port %s\nHit ^C to exit\n", hostname, port)
go io.Copy(conn, os.Stdin)
io.Copy(os.Stdout, conn)
}
}

58
browser/README.md Normal file
View File

@@ -0,0 +1,58 @@
```python
def Browser(cdp='localhost:9222', browser=type('', (), {})):
import os, json, requests, websocket
try: requests.get(f'http://{cdp}/json/version', timeout=0.1)
except requests.exceptions.RequestException:
os.popen('wsl chromium --proxy-server=172.17.112.1:8080 --ignore-certificate-errors --remote-debugging-port=9222 --remote-allow-origins=* --user-agent="Mozilla/5.0 (Linux; Android 15) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.6834.122 Mobile Safari/537.36"')
browser.url = requests.get(
f'http://{cdp}/json/version').json()['webSocketDebuggerUrl']
def send(url, request):
ws = websocket.create_connection(url)
try: ws.send(json.dumps(request)); return json.loads(ws.recv())
finally: ws.close()
def Page(page=type('', (), {})):
page.url = f'ws://{cdp}/devtools/page/' + send(browser.url, {
"id": 1,
"method": "Target.createTarget",
"params": {
"url": "about:blank",
"newWindow": True,
"background": False
}
})['result']['targetId']
def goto(url):
if '://' not in url: url = f'https://{url}'
send(page.url, {
"id": 1,
"method": "Page.navigate",
"params": {
"url": url
}
})
def evaluate(javascript):
result = send(page.url, {
"id": 1,
"method": "Runtime.evaluate",
"params": {
"expression": javascript,
"returnByValue": True
}
})
if 'result' in result and 'result' in result['result']:
return result['result']['result'].get('value')
elif 'exceptionDetails' in result['result']:
raise Exception(f"JavaScript execution failed: {result['result']['exceptionDetails']}")
page.goto = goto
page.evaluate = evaluate
return page
browser.new_page = Page
return browser
browser = Browser()
page = browser.new_page()
page.goto('example.org')
page.evaluate('console.log("hello, world")')
```

54
chrome/README.md Normal file
View File

@@ -0,0 +1,54 @@
```python
def Chrome(agent=None, proxy=None, cookies=[], headless=True):
import requests, subprocess, base64
try: requests.get(f'http://localhost:9222', timeout=.1)
except: subprocess.Popen(['chrome', f'--remote-debugging-port={9222}',
*([f'--user-agent={agent}'] if agent else []), *(['--headless=new'] if headless else []),
*([f'--proxy-server={proxy}'] if proxy else []), '--disable-web-security',
'--disable-translate', '--ignore-certificate-errors', '--remote-allow-origins=*',
'--disable-backgrounding-occluded-windows',])
browser = requests.get(f'http://localhost:9222/json/version').json()['webSocketDebuggerUrl']
def Page():
def send(url, request):
try: import json, websocket; (ws := websocket.create_connection(url)
).send(json.dumps(request)); return json.loads(ws.recv())
finally: ws.close()
page = 'ws://localhost:9222/devtools/page/' + (targetId := send(browser,
dict(id=1, method='Target.createTarget',
params=dict(url='about:blank', newWindow=True)))['result']['targetId'])
def evaluate(self, javascript):
try: return (res := self('Runtime.evaluate',
expression=javascript, returnByValue=True)['result'])['value']
except: raise Exception(res)
def wait_element(self, selector, timeout=30, check_interval=0.5):
import time; start_time = time.time()
while time.time() - start_time < timeout:
if self.evaluate(f"!!(document.querySelector('{selector}'))"): return
self.sleep(check_interval)
raise TimeoutError(f"Element '{selector}' not found within {timeout} seconds")
def cookies(self, cookies=None):
if cookies is None: return self('Network.getAllCookies')['cookies']
self('Network.clearBrowserCookies')
for cookie in cookies: self('Network.setCookie', **cookie)
def screenshot(self):
from IPython.display import HTML; display(HTML(
f'<img src="data:image/png;base64,{self('Page.captureScreenshot')['data']}">'))
def goto(self, url):
self('Page.navigate', url=url if '://' in url else f'https://{url}')
while self.evaluate('document.readyState') != 'complete': self.sleep(0.1)
Soup = lambda html: __import__('bs4').BeautifulSoup(html, 'lxml')
return Soup(self.source())
return type('', (), dict(__call__=lambda _, method, **params:
send(page, {"id": 1, "method": method, "params": params})['result'],
close=lambda self: self('Target.closeTarget', targetId=targetId)['success'],
sleep=lambda _, seconds: __import__('time').sleep(seconds), goto=goto,
evaluate=evaluate, wait_element=wait_element, cookies=cookies, screenshot=screenshot,
source=lambda self: self.evaluate('document.documentElement.outerHTML')))()
(page := Page()).cookies(cookies); return page
page = Chrome()
print(page.goto('naver.com').title) # <title>NAVER</title>
page.wait_element('img')
page.screenshot()
page.evaluate('2 + 2'), page.evaluate('window.location.href') # (5, 'https://www.naver.com/')
```

View File

@@ -1,5 +1,17 @@
```python ```python
for i,x in enumerate('RGYBMC'):globals()[x]=lambda s,i=i:f'\x1b[{91+i}m{s}\x1b[0m'
for i,x in enumerate('rgybmcRGYBMC'):globals()[x]=lambda s,i=i:f'\x1b[{31+i//6*60+i%6}m{s}\x1b[0m' for i,x in enumerate('rgybmcRGYBMC'):globals()[x]=lambda s,i=i:f'\x1b[{31+i//6*60+i%6}m{s}\x1b[0m'
print(r('hello'), R('hello')) print(r('hello'), R('hello'))
def color(text, code=None):
if code: code = int(__import__('hashlib').sha1(code.encode()).hexdigest(), 16)
else: code = int(__import__('random').random() * 214)
return f'\x1b[38;5;{code % 214 + 17}m{text}\x1b[0m'
print(color('hello'))
print(color('world'))
print(color('fixed', 'fixed'))
``` ```

View File

@@ -1,43 +1,55 @@
#!/usr/bin/env python FROM python:slim
def ensure(*packages): RUN apt update && apt install -y sysbench fastfetch
for pkg in packages:
try: __import__(pkg) RUN pip install tqdm pandas tabulate
except: import os; os.system(f'pip install -q {pkg}')
ensure('pandas', 'tabulate') RUN tee bench.py <<EOF
#!/usr/bin/env python
import subprocess, multiprocessing as mp, warnings, pandas as pd
from tqdm.auto import tqdm def ensure(*packages):
from tabulate import tabulate for pkg in packages:
warnings.filterwarnings("ignore") try: __import__(pkg)
R, G, B, W = (f'\x1b[{x}m' for x in (31, 32, 34, 0)) except: import os; os.system(f'pip install -q {pkg}')
subprocess.run('clear') ensure('pandas', 'tabulate')
subprocess.run('neofetch')
import subprocess, multiprocessing as mp, warnings, pandas as pd
command = lambda core: f'sysbench cpu --cpu-max-prime=20000 --time=1 --threads={core} run | grep second' from tqdm.auto import tqdm
from tabulate import tabulate
print(f'{G}$ {command("$(nproc)")}{W}', flush=True) warnings.filterwarnings("ignore")
R, G, B, W = (f'\x1b[{x}m' for x in (31, 32, 34, 0))
subprocess.run('clear')
def speed(core): subprocess.run('fastfetch')
output = subprocess.run(
command(core), shell=True, capture_output=True, text=True command = lambda core: f'sysbench cpu --cpu-max-prime=20000 --time=1 --threads={core} run | grep second'
).stdout.split()[-1]
return float(output) print(f'{G}$ {command("$(nproc)")}{W}', flush=True)
df = []
for core in range(1, mp.cpu_count()+1): def speed(core):
s = speed(core) output = subprocess.run(
row = { command(core), shell=True, capture_output=True, text=True
'#Threads': core, ).stdout.split()[-1]
'Throughput(/s)': s, return float(output)
'(per-core)': s/core
} df = []
df.append(row) prev = 0
df = pd.DataFrame(df) for core in range(1, mp.cpu_count()+1):
df.to_csv('result.csv', index=False) s = speed(core)
row = {
df.iloc[:, 0] = df.iloc[:, 0].apply(lambda s: f'{R}{s}{W}') '#Threads': core,
df.iloc[:, 1] = df.iloc[:, 1].apply(lambda s: f'{G}{int(s)}{W}') 'Throughput(/s)': s,
df.iloc[:, 2] = df.iloc[:, 2].apply(lambda s: f'{B}{int(s)}{W}') '(per-core)': s - prev
print(tabulate(df, headers='keys', tablefmt='rounded_outline', showindex=False)) }
prev = s
df.append(row)
df = pd.DataFrame(df)
df.to_csv('result.csv', index=False)
df.iloc[:, 0] = df.iloc[:, 0].apply(lambda s: f'{R}{s}{W}')
df.iloc[:, 1] = df.iloc[:, 1].apply(lambda s: f'{G}{int(s)}{W}')
df.iloc[:, 2] = df.iloc[:, 2].apply(lambda s: f'{B}{int(s)}{W}')
print(tabulate(df, headers='keys', tablefmt='rounded_outline', showindex=False))
EOF
ENTRYPOINT ["python", "bench.py"]

4
cpu-bench/Makefile Normal file
View File

@@ -0,0 +1,4 @@
all: build
docker run yauk.tv/bench
build:
sudo docker build . -t yauk.tv/bench

19
cron/README.md Normal file
View File

@@ -0,0 +1,19 @@
compose.yml
```yml
services:
cron:
build:
dockerfile_inline: |
FROM alpine
RUN apk add --no-cache openssh
volumes: [$HOME/.ssh:/root/.ssh]
network_mode: host
entrypoint: ssh $USER@localhost
stop_grace_period: 0s
restart: unless-stopped
command:
- |
cd /Users/w/dock/public/radiology.yauk.tv
/Users/w/.venv/bin/python main.py
tail -f /dev/null
```

75
fedora/README.md Normal file
View File

@@ -0,0 +1,75 @@
# 한글
- Fedora 42에서 별도 프로그램 설치 없이 한영키=RAlt로 쉽게 설정 가능 Korean(한글)
- RAlt가 한박자 느리게 작동하는 문제 (KeyDown이 아니라 KeyUp에서 반응하는 느낌)
# 설치
```sh
curl -fsSL https://code-server.dev/install.sh | sh
sudo systemctl enable --now code-server@$USER
vi .config/code-server/config.yaml
sudo dnf install -y golang nodejs npm
go version
node -v
go install github.com/wailsapp/wails/v2/cmd/wails@latest
pip install mitmproxy
tee -a .bashrc <<'EOF'
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
sudo dnf install cmake
sudo dnf config-manager addrepo --from-repofile https://developer.download.nvidia.com/compute/cuda/repos/fedora42/x86_64/cuda-fedora42.repo
sudo dnf clean all
sudo dnf -y install cuda-toolkit-13-0
EOF
```
# Firefox developer edition
```sh
#!/bin/bash
# Download Firefox Developer Edition
cd ~/Downloads
wget -O firefox-developer-edition.tar.bz2 "https://download.mozilla.org/?product=firefox-devedition-latest-ssl&os=linux64&lang=en-GB"
# Extract to ~/.local/opt
mkdir -p ~/.local/opt
tar -xf firefox-developer-edition.tar.bz2 -C ~/.local/opt/
mv ~/.local/opt/firefox ~/.local/opt/firefox-developer-edition
# Create symlink in ~/.local/bin
mkdir -p ~/.local/bin
ln -sf ~/.local/opt/firefox-developer-edition/firefox ~/.local/bin/firefox-dev
# Create desktop entry
mkdir -p ~/.local/share/applications
cat > ~/.local/share/applications/firefox-developer-edition.desktop << EOF
[Desktop Entry]
Name=Firefox Developer Edition
GenericName=Web Browser
Comment=Browse the World Wide Web
Keywords=Internet;WWW;Browser;Web;Explorer
Exec=$HOME/.local/bin/firefox-dev %u
Terminal=false
Type=Application
Icon=$HOME/.local/opt/firefox-developer-edition/browser/chrome/icons/default/default128.png
Categories=Network;WebBrowser;
MimeType=text/html;text/xml;application/xhtml+xml;x-scheme-handler/http;x-scheme-handler/https;
StartupNotify=true
EOF
# Update desktop database
update-desktop-database ~/.local/share/applications/
# Update KDE cache
kbuildsycoca5 2>/dev/null || true
# Clean up
rm ~/Downloads/firefox-developer-edition.tar.bz2
echo "Firefox Developer Edition installed successfully!"
```

23
frontend/.gitignore vendored Normal file
View File

@@ -0,0 +1,23 @@
node_modules
# Output
.output
.vercel
.netlify
.wrangler
/.svelte-kit
/build
# OS
.DS_Store
Thumbs.db
# Env
.env
.env.*
!.env.example
!.env.test
# Vite
vite.config.js.timestamp-*
vite.config.ts.timestamp-*

1
frontend/.npmrc Normal file
View File

@@ -0,0 +1 @@
engine-strict=true

38
frontend/README.md Normal file
View File

@@ -0,0 +1,38 @@
# sv
Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli).
## Creating a project
If you're seeing this, you've probably already done this step. Congrats!
```sh
# create a new project in the current directory
npx sv create
# create a new project in my-app
npx sv create my-app
```
## Developing
Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:
```sh
npm run dev
# or start the server and open the app in a new browser tab
npm run dev -- --open
```
## Building
To create a production version of your app:
```sh
npm run build
```
You can preview the production build with `npm run preview`.
> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment.

13
frontend/jsconfig.json Normal file
View File

@@ -0,0 +1,13 @@
{
"extends": "./.svelte-kit/tsconfig.json",
"compilerOptions": {
"allowJs": true,
"checkJs": false,
"moduleResolution": "bundler"
}
// Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias
// except $lib which is handled by https://svelte.dev/docs/kit/configuration#files
//
// If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes
// from the referenced tsconfig.json - TypeScript does not merge them in
}

2161
frontend/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

24
frontend/package.json Normal file
View File

@@ -0,0 +1,24 @@
{
"name": "frontend",
"private": true,
"version": "0.0.1",
"type": "module",
"scripts": {
"dev": "vite dev",
"build": "vite build",
"preview": "vite preview",
"prepare": "svelte-kit sync || echo ''"
},
"devDependencies": {
"@sveltejs/adapter-auto": "^6.1.0",
"@sveltejs/kit": "^2.43.2",
"@sveltejs/vite-plugin-svelte": "^6.2.0",
"@tailwindcss/vite": "^4.1.13",
"svelte": "^5.39.5",
"tailwindcss": "^4.1.13",
"vite": "^7.1.7"
},
"dependencies": {
"pretendard": "^1.3.9"
}
}

6
frontend/src/app.css Normal file
View File

@@ -0,0 +1,6 @@
@import 'tailwindcss';
@import 'pretendard/dist/web/variable/pretendardvariable.css';
body {
font-family: 'Pretendard Variable', -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
}

11
frontend/src/app.html Normal file
View File

@@ -0,0 +1,11 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
%sveltekit.head%
</head>
<body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div>
</body>
</html>

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="107" height="128" viewBox="0 0 107 128"><title>svelte-logo</title><path d="M94.157 22.819c-10.4-14.885-30.94-19.297-45.792-9.835L22.282 29.608A29.92 29.92 0 0 0 8.764 49.65a31.5 31.5 0 0 0 3.108 20.231 30 30 0 0 0-4.477 11.183 31.9 31.9 0 0 0 5.448 24.116c10.402 14.887 30.942 19.297 45.791 9.835l26.083-16.624A29.92 29.92 0 0 0 98.235 78.35a31.53 31.53 0 0 0-3.105-20.232 30 30 0 0 0 4.474-11.182 31.88 31.88 0 0 0-5.447-24.116" style="fill:#ff3e00"/><path d="M45.817 106.582a20.72 20.72 0 0 1-22.237-8.243 19.17 19.17 0 0 1-3.277-14.503 18 18 0 0 1 .624-2.435l.49-1.498 1.337.981a33.6 33.6 0 0 0 10.203 5.098l.97.294-.09.968a5.85 5.85 0 0 0 1.052 3.878 6.24 6.24 0 0 0 6.695 2.485 5.8 5.8 0 0 0 1.603-.704L69.27 76.28a5.43 5.43 0 0 0 2.45-3.631 5.8 5.8 0 0 0-.987-4.371 6.24 6.24 0 0 0-6.698-2.487 5.7 5.7 0 0 0-1.6.704l-9.953 6.345a19 19 0 0 1-5.296 2.326 20.72 20.72 0 0 1-22.237-8.243 19.17 19.17 0 0 1-3.277-14.502 17.99 17.99 0 0 1 8.13-12.052l26.081-16.623a19 19 0 0 1 5.3-2.329 20.72 20.72 0 0 1 22.237 8.243 19.17 19.17 0 0 1 3.277 14.503 18 18 0 0 1-.624 2.435l-.49 1.498-1.337-.98a33.6 33.6 0 0 0-10.203-5.1l-.97-.294.09-.968a5.86 5.86 0 0 0-1.052-3.878 6.24 6.24 0 0 0-6.696-2.485 5.8 5.8 0 0 0-1.602.704L37.73 51.72a5.42 5.42 0 0 0-2.449 3.63 5.79 5.79 0 0 0 .986 4.372 6.24 6.24 0 0 0 6.698 2.486 5.8 5.8 0 0 0 1.602-.704l9.952-6.342a19 19 0 0 1 5.295-2.328 20.72 20.72 0 0 1 22.237 8.242 19.17 19.17 0 0 1 3.277 14.503 18 18 0 0 1-8.13 12.053l-26.081 16.622a19 19 0 0 1-5.3 2.328" style="fill:#fff"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1 @@
// place files you want to import through the `$lib` alias in this folder.

View File

@@ -0,0 +1,12 @@
<script>
import '../app.css';
import favicon from '$lib/assets/favicon.svg';
let { children } = $props();
</script>
<svelte:head>
<link rel="icon" href={favicon} />
</svelte:head>
{@render children?.()}

View File

@@ -0,0 +1 @@
/home/j/venv/todo.yauk.tv/+page.svelte

View File

@@ -0,0 +1,3 @@
# allow crawling everything by default
User-agent: *
Disallow:

13
frontend/svelte.config.js Normal file
View File

@@ -0,0 +1,13 @@
import adapter from '@sveltejs/adapter-auto';
/** @type {import('@sveltejs/kit').Config} */
const config = {
kit: {
// adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list.
// If your environment is not supported, or you settled on a specific environment, switch out the adapter.
// See https://svelte.dev/docs/kit/adapters for more information about adapters.
adapter: adapter()
}
};
export default config;

8
frontend/vite.config.js Normal file
View File

@@ -0,0 +1,8 @@
import tailwindcss from '@tailwindcss/vite';
import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vite';
export default defineConfig({
plugins: [tailwindcss(), sveltekit()],
server: {allowedHosts: true}
});

5
golang/README.md Normal file
View File

@@ -0,0 +1,5 @@
# Hot reload
```bash
go install github.com/air-verse/air@latest
air
```

60
golang/tcpproxy.go Normal file
View File

@@ -0,0 +1,60 @@
// Example usage:
// Terminal 1: python -m http.server 8000
// Terminal 2: go run tcpproxy.go 9000 localhost:8000
// Terminal 3: curl localhost:9000
package main
import (
"fmt"
"io"
"net"
"os"
)
func main() {
if len(os.Args) != 3 {
fmt.Println("Usage: go run tcpproxy.go <listen_port> <target_host:port>")
os.Exit(1)
}
listenPort := os.Args[1] // port to listen on
targetAddr := os.Args[2] // target server address
// create TCP listener on specified port
listener, err := net.Listen("tcp", ":"+listenPort)
if err != nil {
fmt.Printf("Failed to listen on port %s: %v\n", listenPort, err)
os.Exit(1)
}
defer listener.Close()
fmt.Printf("TCP proxy listening on port %s, forwarding to %s\n", listenPort, targetAddr)
// accept incoming connections
for {
clientConn, err := listener.Accept()
if err != nil {
fmt.Printf("Failed to accept connection: %v\n", err)
continue
}
// handle each client connection concurrently
go handleConnection(clientConn, targetAddr)
}
}
func handleConnection(clientConn net.Conn, targetAddr string) {
defer clientConn.Close() // ensure client connection is closed
// connect to target server
serverConn, err := net.Dial("tcp", targetAddr)
if err != nil {
fmt.Printf("Failed to connect to target %s: %v\n", targetAddr, err)
return
}
defer serverConn.Close() // ensure server connection is closed
// start bidirectional data copying
go io.Copy(serverConn, clientConn) // client -> server
io.Copy(clientConn, serverConn) // server -> client (blocks until done)
}

View File

@@ -1,226 +1,94 @@
alias x=pnpx # >>>> PATH
export CLOUDFLARE_API_TOKEN=Pah8Q6hBUsQsKnKhaMJB2QvL-LHAWCcU8xti66Q3 export CEF_PATH="$HOME/.local/share/cef"
dive(){ docker exec -it "$@" sh; } export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$CEF_PATH"
alias reboot='sudo reboot' export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./build/bin
alias restart='docker restart' export PATH="/Users/w/.venv/bin:$PATH:$HOME/go/bin"
export HOMEBREW_NO_ENV_HINTS=true export PATH="$HOME/hub/llama.cpp/build/bin:$PATH"
alias wg="sudo wg" export LD_LIBRARY_PATH="/usr/local/cuda/lib64:/usr/local/lib:$LD_LIBRARY_PATH:$CEF_PATH:./build/bin"
# alias wg="docker exec wg wg " export GOPATH=$HOME/go
# alias caddy="docker exec -w /etc/caddy caddy caddy fmt --overwrite; docker exec -w /etc/caddy caddy caddy reload" export PATH="/usr/local/cuda/bin:$HOME/hub/depot_tools:$HOME/.venv/bin:$HOME/hub/llama.cpp/build/bin::$PATH:$HOME/go/bin:."
# alias caddy-passwd="docker exec -w /etc/caddy caddy caddy hash-password -p"
alias up="docker compose down; docker compose up -d --remove-orphans; docker compose logs -f"
alias vite="npm run dev -- --host 0.0.0.0"
alias cls="clear"
alias nginx="docker exec -it nginx bash"
export GGML_CUDA=1
export LLAMA_CURL=1
export LLAMA_ARG_N_GPU_LAYERS=99
export LLAMA_ARG_FLASH_ATTN=1
export LLAMA_ARG_HOST="0.0.0.0"
export LLAMA_ARG_HF_REPO="bartowski/Phi-3-medium-128k-instruct-GGUF"
export LLAMA_ARG_HF_FILE="Phi-3-medium-128k-instruct-Q4_K_S.gguf"
export LLAMA_ARG_CTX_SIZE=65536
export HOMEBREW_NO_AUTO_UPDATE=1 export HOMEBREW_NO_AUTO_UPDATE=1
export HOMEBREW_NO_ENV_HINTS=true
# export LANG=C.UTF-8 export LLAMA_ARG_HF_REPO=unsloth/gemma-3n-E4B-it-GGUF:Q4_K_XL
# export LC_ALL=C.UTF-8 export LLAMA_ARG_N_GPU_LAYERS=99
export LLAMA_ARG_HOST="0.0.0.0"
export LLAMA_ARG_CTX_SIZE=16384
# export LANG=ko_KR.UTF-8
# export LC_CTYPE=ko_KR.UTF-8
alias rerun="docker compose down && docker compose up -d --build && docker compose logs -f" # >>> Super useful
export PATH="/Users/w/hub/wireguard-go/:/Users/w/.venv/bin:/usr/local/bin:/home/w/.cache/ms-playwright/chromium-1129/chrome-linux:$PATH" vite() {
# export OLLAMA_HOST=host.docker.internal:11434 ln -sf "$(pwd)/+page.svelte" "$HOME/wiki/frontend/src/routes/+page.svelte"
(cd "$HOME/wiki/frontend" && npm run dev -- --host 0.0.0.0)
alias rp=runpodctl
export PATH="/home/w/hub/llama.cpp/build/bin:/usr/local/bin:/home/w/.cache/ms-playwright/chromium-1129/chrome-linux:$PATH"
export COMPOSE_STOP_GRACE_PERIOD=0
export PATH=/usr/bin:$PATH
alias prune="docker system prune -f"
alias rc="vi ~/.bash_aliases && tail ~/.bash_aliases && source ~/.bash_aliases"
# alias up="down && docker compose up --remove-orphans"
alias down="docker compose down"
pkill() { pkill -f "$@" ; ps ux ; }
inspect() { docker image inspect "$@" | jq ; }
alias d="docker"
alias c="docker compose"
alias i="sudo apt-get install -y"
alias run="docker build . -t temp && docker run --network host --rm temp"
alias debian="docker run -it --rm --gpus all pytorch/pytorch:2.4.0-cuda12.4-cudnn9-devel bash"
check() { curl -x "localhost:$1" -k https://httpbin.org/ip; }
redis-lastsave() { redis-cli "$@" --raw lastsave | xargs -I{} date -d @{} "+%Y-%m-%d %H:%M:%S"; }
redis-dump() { sudo rsync -a /var/lib/redis/dump.rdb ~/.backup/dump.rdb-$(date +%Y%m%d); }
alias systemctl="sudo systemctl"
# cd() { clear; echo "$(pwd)/$*"; echo; command cd "$@" && ls -lh --color=auto; echo; }
alias ip="ip -4"
alias py="python"
alias p="python"
alias my="sudo chown -R $(id -u):$(id -g)"
alias l="clear; pwd; echo; command ls -lh --color=auto"
alias ls="clear; pwd; echo; command ls -alh --color=auto"
export PATH=$PATH:$HOME/minio-binaries/
alias make="make -j"
alias ns="watch -n 0.1 nvidia-smi"
log() {
if [ $# -eq 0 ]; then
docker compose logs -f
else
docker logs -f "$@"
fi
} }
alias l='clear; echo -e "\x1b[92m$(pwd)\x1b[0m"; command ls -alh --color=auto'
alias download="huggingface-cli download" alias nmap="nmap -p1-65535"
alias journal="sudo journalctl -u" alias rc="vi ~/.bash_aliases && source ~/.bash_aliases && echo OK"
alias c="clear"
export LIBGL_ALWAYS_INDIRECT=1 alias mac="ssh w@10.0.0.2"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:/usr/local/lib:$LD_LIBRARY_PATH"
export PATH="/home/w/.venv/bin:/home/w/hub/llama.cpp:/usr/local/cuda/bin:$PATH"
alias rsync="rsync -avPh"
alias dpkg="sudo dpkg"
alias service="sudo service"
alias apt="sudo apt-get"
alias chwon="sudo chown"
alias bsah="bash" # common typing error
alias pyhton="python" # common typing error
alias soruce="source"
alias stauts="status"
alias stuats="status"
dash() { sudo docker run -it --rm --gpus all --entrypoint=bash "$1"; }
alpine() {
docker run -it --rm alpine
}
dsh() { sudo docker run -it --rm "$1" sh; }
alias nuc="ssh w@192.168.12.5"
# alias mac="ssh jaewooklee@192.168.12.45"
alias mac="ssh w@192.168.12.2"
alias ip="ip -4"
alias ping="ping -c 2" alias ping="ping -c 2"
alias i="sudo dnf install -y"
alias ip="ip -4"
alias rsync="rsync -avPh"
alias ns="watch -n 0.1 nvidia-smi"
dive(){ docker exec -it "$@" sh; }
alias up="docker compose down; docker compose up -d --remove-orphans && docker compose logs -f"
alias down="docker compose down"
alias restart='docker restart'
youtube(){
cd ~/Videos/+youtube
channel=$(basename "$1")
mkdir "$channel"
cd "$channel"
yt-dlp --cookies-from-browser chrome "$1"
}
# alias less="less -SEX" pkill() { sudo command pkill -f "$@" && ps ux; }
log() { if [ $# -eq 0 ]; then docker compose logs -f; else docker logs -f "$@"; fi; }
build(){ git pull && rm -rf build && cmake -B build -DBUILD_SHARED_LIBS=ON -DGGML_CUDA=ON -DLLAMA_CURL=ON && cmake --build build --config Release -j ; }
docker() { docker() {
if [[ "$1" == "ps" ]]; then case "$1" in
command docker ps | less -SEX ps) command docker ps --format 'table {{.Names}}\t{{.RunningFor}}\t{{.Networks}}\t{{.Ports}}\t{{.Image}}\t{{.Command}}\t{{.ID}}' | less -SEX;;
elif [[ "$1" == "images" ]]; then rm) command docker "$@" -f;;
command docker images | less -SEX *) command docker "$@";;
elif [[ "$1" == "rm" ]]; then esac
command docker "$@" -f
else
command docker "$@"
fi
} }
alias ..="cd .." # 상위 디렉토리로 이동
alias ...="cd ../.." # 두 단계 위로 이동
alias ~="cd ~" # 홈 디렉토리로 이동
alias mkdir="mkdir -p"
alias myip="curl ifconfig.me" # 내 IP 주소 확인
alias ports="netstat -tuln" # 열려 있는 포트 확인
alias free="free -h --si"
alias df="df -h"
# alias diff="git diff --staged"
alias status="git status ."
alias push="git push"
alias pull="git pull"
alias fetch="git fetch"
add() {
if [ $# -eq 0 ]; then
git add .
else
git add $@
fi
git status
}
parallel() {
if [ $# -lt 2 ]; then
echo "Usage: parallel <number_of_instances> <command>"
return 1
fi
count=$1
shift
command="$@"
for i in $(seq 1 $count); do
eval "$command" &
done
wait
}
# repeat() {
# if [ $# -lt 2 ]; then
# echo "Usage: repeat <interval>[s|m|h] <command>"
# return 1
# fi
# interval=$(echo $1 | sed 's/[smh]$//')
# unit=${1##*[0-9]}
# command="${@:2}"
# case $unit in
# s|'') seconds=$interval;;
# m) seconds=$((interval * 60));;
# h) seconds=$((interval * 3600));;
# *) echo "Invalid time unit. Use 's' for seconds, 'm' for minutes, 'h' for hours, or no unit for seconds."; return 1;;
# esac
# while true; do
# eval $command
# sleep $seconds
# done
# }
alias remote="git remote -v"
alias stash="git stash"
alias branch="git branch"
alias checkout="git checkout"
alias vimrc="vi ~/.vimrc"
commit() {
git commit -m "$*" && git push
}
git() {
if [[ "$1" == "remote" ]]; then
shift
command git remote -v "$@"
elif [[ "$1" == "status" ]]; then
command git status .
command git diff --staged --stat
else
command git "$@"
fi
}
alias weather="curl ko.wttr.in"
alias sudo="sudo "
alias dryblack="clear; black --check --diff --color ."
alias compose="docker compose"
alias compsoe="compose"
alias ps="ps ux" alias ps="ps ux"
clone() { git clone "https://git.yauk.tv/$@"; } alias mkdir="mkdir -p"
ign() { alias push="git push"
for item in "$@"; do alias pull="git pull"
if [ -d "$item" ]; then alias clone="git clone"
echo "$item/" >> .gitignore alias status="git status"
echo "Added directory: $item/ to .gitignore" alias add="git add"
elif [ -f "$item" ]; then commit() { git commit -m "$*" && git push; }
echo "$item" >> .gitignore
echo "Added file: $item to .gitignore" git() {
else case "$1" in
echo "Warning: $item does not exist" remote) shift; command git remote -v "$@";;
fi status) command git status . && git diff --staged --stat;;
done add) shift; command git add ${@:-.}; command git status;;
*) command git "$@";;
esac
} }
# >>> sudos
alias sudo="sudo "
alias r="redis-cli" alias wg="sudo wg"
q() { "$@" > /dev/null 2>&1 & } alias dnf="sudo dnf"
alias dpkg="sudo dpkg"
alias apt="sudo apt-get"
alias reboot="sudo reboot"
alias service="sudo service"
alias wg-quick="sudo wg-quick"
alias systemctl="sudo systemctl"
alpine() { docker run -it --rm alpine; }
# >>> SECRET
export HF_TOKEN=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
export CLOUDFLARE_API_TOKEN=Pah8Q6hBUsQsKnKhaMJB2QvL-LHAWCcU8xti66Q3
export ANTHROPIC_API_KEY=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

15
llama.cpp/README.md Normal file
View File

@@ -0,0 +1,15 @@
# Gemma3:12b:Q4 on CUDA
```sh
docker run -p 1032:8080 -v $HOME/.cache/llama.cpp:/root/.cache/llama.cpp --gpus all ghcr.io/ggml-org/llama.cpp:server-cuda -t 2 --prio 3 -ngl 99 -fa --temp 0 -hf ggml-org/gemma-3-12b-it-GGUF:Q4_K_M
```
```python
import subprocess
subprocess.Popen(['llama-server', '-t', '2', '--prio', '2', '-ngl', '99', '-fa',
'-hf', 'ggml-org/gemma-3-4b-it-GGUF'], stderr=subprocess.DEVNULL)
def en2ko(en):
import json, requests; return json.loads(requests.post('http://localhost:8080/v1/chat/completions', json=dict(messages=[dict(role='user', content=f"{ {'en-US': en}}")],response_format={'type': 'json_object', 'schema': {'type': 'object', 'properties': {'ko-KR': {'type': 'string'}}}})).json()['choices'][0]['message']['content'])['ko-KR']
en2ko('Hello') # '안녕하세요
```
```

49
mitmproxy/README.md Normal file
View File

@@ -0,0 +1,49 @@
# `dump.py`
```python
I = lambda module: __import__('importlib').import_module(module)
def request(flow):
with I('dbm.sqlite3').open('dbm.sql') as db:
if (url := flow.request.url) in db:
flow.response = I('mitmproxy.http').Response.make(200, db[url])
def response(flow):
if flow.response.status_code == 200:
with I('dbm.sqlite3').open('dbm.sql', 'c') as db:
db[flow.request.url] = flow.response.content
if __name__ == '__main__':
I('subprocess').run(['mitmdump', '-s', __file__])
```
# Retries if failed
```python
def response(flow):
retries = 0
while flow.response.status_code != 206:
retries += 1
flow.response = flow.replay().response
print(f"재시도 {retries}: 상태 코드 {flow.response.status_code}")
```
```python
for idx, line in enumerate(open('m3u8').readlines()):
os.system(f"ffmpeg -y -http_proxy http://localhost:8080 -i '{line.strip()}' -c:v copy -c:a copy {idx+1:02}.mp4")
```
---
```shell
mitmweb
```
```shell
playwright ff --proxy-server http://localhost:8080 --ignore-https-errors
```
```shell
chromium --proxy-server=localhost:8080 --ignore-certificate-errors --disable-backgrounding-occluded-windows
```
```shell
chromium --proxy-server=172.17.112.1:8080 --ignore-certificate-errors --remote-debugging-port=9222 --remote-allow-origins=* --user-agent="Mozilla/5.0 (Linux; Android 15) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.6834.122 Mobile Safari/537.36"
```
```shell
chrome --proxy-server=localhost:8080 --ignore-certificate-errors --disable-backgrounding-occluded-windows --user-agent="Mozilla/5.0 (Linux; Android 15) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.6834.122 Mobile Safari/537.36"
```

31
mobile/README.md Normal file
View File

@@ -0,0 +1,31 @@
# iOS
## Wireguard
## Server: iSH shell
```
apk add openssh tinyproxy
/etc/ssh/sshd_config
Port 2222
PermitRootLogin yes
AllowTcpForwarding yes
GatewayPorts yes
killall sshd
/usr/sbin/sshd
tee tinyproxy.conf <<EOF
Port 8888
Listen 0.0.0.0
Timeout 600
Allow 10.0.0.1
EOF
tinyproxy -d -c tinyproxy.conf
```
## Client
```
curl -x 10.0.0.2:8888 ip.yauk.tv
mitmweb -q --ssl-insecure -s proxy.py --mode upstream:http://10.0.0.2:8888@8079
```

View File

@@ -1,3 +1,33 @@
```python
def sync(obj):
import asyncio, functools
if asyncio.iscoroutine(coro := obj):
loop, future = asyncio.get_event_loop(), asyncio.ensure_future(coro)
while not future.done():
loop._process_events(loop._selector.select(0))
if (ready := loop._ready) and not (handle := ready.popleft())._cancelled:
task = (tasks := asyncio.tasks._current_tasks).pop(loop, None)
handle._run()
tasks[loop] = task
return future.result()
if asyncio.iscoroutinefunction(func := obj): return functools.wraps(func)(
lambda *args, **kwargs: sync(func(*args, **kwargs)))
for attr in dir(obj):
if asyncio.iscoroutinefunction(method := getattr(obj, attr)):
setattr(obj, attr, sync(method))
return obj
async def foo(): return 42
print(sync(foo()), sync(foo)())
from playwright.async_api import async_playwright
browser = sync(sync(async_playwright().start()).firefox.launch())
page = sync(sync(browser.new_page()))
page._repr_png_ = page.screenshot
page.goto('https://naver.com')
page
```
```python ```python
def sync(coro): def sync(coro):
import asyncio, functools import asyncio, functools

6
nssm/README.md Normal file
View File

@@ -0,0 +1,6 @@
```
nssm install +adb adb -a nodaemon server start
nssm install +dlna rclone serve dlna Y:
nssm install +blob python -u blob.py
nssm install +proxy python proxy.py
```

13
parallel/README.md Normal file
View File

@@ -0,0 +1,13 @@
```python
def worker(x):
__import__('time').sleep(1)
print(x, end=' ')
return x ** 3
with __import__('concurrent').futures.ThreadPoolExecutor(64) as T:
y = list(T.map(worker, range(100)))
# 64개 worker로 100개의 1초 소요되는 작업: 2초후 종료
# x는 순서대로 호출 안되지만 y는 순서대로 나옴
print(y)
```

View File

@@ -1,3 +1,17 @@
# IPython on Linux
```python
def run(coro): __import__('nest_asyncio').apply(); return __import__('asyncio').run(coro)
def sync(func): return lambda *args, **kwargs: run(func(*args, **kwargs))
from playwright.async_api import async_playwright
browser = run(run(async_playwright().start()).firefox.launch())
for attr in dir(page := run(browser.new_page())):
if attr[0] != '_' and callable(method := getattr(page, attr)):
setattr(page, attr, sync(method))
page._repr_png_ = page.screenshot
page.goto('https://naver.com')
```
```python ```python
""" """
Linux (WSL Debian) Linux (WSL Debian)
@@ -29,4 +43,27 @@ def Page():
page = Page() page = Page()
page.goto('google.com') page.goto('google.com')
page page
```
# IPython on Windows
```python
def thread(func):
import asyncio, concurrent
asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())
return lambda: concurrent.futures.ThreadPoolExecutor().submit(func).result()
def handle(route):
print(route.request.url)
route.continue_()
@thread
def main():
from playwright.sync_api import sync_playwright
with sync_playwright() as playwright:
(page := playwright.firefox.launch().new_page()).set_default_timeout(0)
page.route('**/*', handle)
page.goto('https://google.com')
main()
``` ```

3
powershell/README.md Normal file
View File

@@ -0,0 +1,3 @@
```powershell
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force; if(!(Test-Path $PROFILE)){New-Item $PROFILE -Force}; Add-Content $PROFILE "'curl','iwr','wget'|ForEach-Object{Remove-Item alias:`$_ -EA 0}"
```

4
schtasks/README.md Normal file
View File

@@ -0,0 +1,4 @@
```cmd
schtasks /create /tn "+ahk" /tr "\"C:\Program Files\AutoHotkey\AutoHotkeyU64.exe\" \"D:/run.ahk\"" /sc onlogon /rl highest /f
schtasks /query /tn "+ahk" /xml
```

24
security/README.md Normal file
View File

@@ -0,0 +1,24 @@
# DNS 0x20 인코딩 (DNS Case Randomization)
```
캐시 포이즈닝 공격 방어
DNS 쿼리 ID는 16비트(65,536개)로 예측 가능
공격자가 가짜 응답을 보내서 DNS 캐시를 오염시킬 수 있음
대소문자 랜덤화로 추가 엔트로피 제공 (2^도메인길이)
쿼리 고유성 증가
원본: worker.yauk.tv
랜덤화: workER.YAuK.TV, WORker.yauk.TV, etc.
같은 도메인이라도 매번 다른 대소문자로 쿼리
공격자가 정확한 케이스를 맞추기 어려워짐
RFC 문서
RFC 1035: DNS는 case-insensitive
RFC 5452: DNS 0x20 보안 확장 표준
실제 구현체들
Cloudflare, Google DNS: 기본적으로 0x20 사용
BIND: use-v4-udp-ports, use-v6-udp-ports 옵션
Unbound: use-caps-for-id 옵션
그래서 DNS 서버는 항상 case-insensitive하게 처리해야 합니다. 이는 보안 기능이 아니라 DNS 표준 준수입니다.
```

71
supervisor/README.md Normal file
View File

@@ -0,0 +1,71 @@
## Run
```sh
sudo apt install -y supervisor
supervisord -c supervisord.conf -n
```
## `supervisord.conf`
```toml
[supervisord]
nodaemon=true
logfile=/dev/null
loglevel=critical
[program:process1]
command=sh -c "while true; do echo hello; sleep 2; done"
autostart=true
autorestart=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
[program:process2]
command=sh -c "while true; do echo world; sleep 3; done"
autostart=true
autorestart=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
```
## compose.yml
```yaml
services:
chrome:
image: yauk.tv/python
build:
dockerfile_inline: |
FROM debian
RUN apt-get update && apt-get install -y chromium supervisor
RUN pip install mitmproxy
COPY <<EOF /supervisord.conf
[supervisord]
nodaemon=true
logfile=/dev/null
loglevel=critical
[program:process1]
command=sh -c "while true; do echo hello; sleep 2; done"
autostart=true
autorestart=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
[program:process2]
command=sh -c "while true; do echo world; sleep 3; done"
autostart=true
autorestart=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
EOF
CMD ["/usr/bin/supervisord"]
```

13
thread-python/README.md Normal file
View File

@@ -0,0 +1,13 @@
```python
def worker(x):
__import__('time').sleep(1)
print(x, end=' ')
return x ** 3
with __import__('concurrent').futures.ThreadPoolExecutor(64) as T:
y = list(T.map(worker, range(100)))
# 64개 worker로 100개의 1초 소요되는 작업: 2초후 종료
# x는 순서대로 호출 안되지만 y는 순서대로 나옴
print(y)
```

8
windows-C++/README.md Normal file
View File

@@ -0,0 +1,8 @@
# MSYS2 UCRT64
https://www.msys2.org/docs/environments/
```sh
pacman -Syu --noconfirm mingw-w64-ucrt-x86_64-toolchain
```
```
pacman -Sy --noconfirm --needed base-devel mingw-w64-x86_64-gcc mingw-w64-x86_64-toolchain mingw-w64-x86_64-windows-default-manifest mingw-w64-x86_64-headers-git
```

15
windows-gcc/README.md Normal file
View File

@@ -0,0 +1,15 @@
# Install MSYS2 from https://www.msys2.org/
```
msys2-x86_64-20241208.exe
```
# Install gcc
```
pacman -S mingw-w64-ucrt-x86_64-gcc
```
# Add PATH using cmd
```
setx /M PATH "%PATH%;C:\msys64\ucrt64\bin"
```
1024자가 넘어서 안된다;

182
windows-libzmq/README.md Normal file
View File

@@ -0,0 +1,182 @@
# msys2 ucrt64 gcc 설치
# go 프로젝트 폴더로 복사
```
C:\Users\j\+win\vcpkg\packages\zeromq_x64-windows\bin\libzmq-mt-4_3_5.dll
```
```cmd
set CGO_ENABLED=1
go run server.go
```
# server.go
```go
package main
/*
#cgo CFLAGS: -IC:/Users/j/+win/vcpkg/packages/zeromq_x64-windows/include
#cgo LDFLAGS: -LC:/Users/j/+win/vcpkg/packages/zeromq_x64-windows/lib -lzmq-mt-4_3_5
#include <zmq.h>
*/
import "C"
import (
"fmt"
"unsafe"
)
func main() {
context := C.zmq_ctx_new()
defer C.zmq_ctx_term(context)
socket := C.zmq_socket(context, C.ZMQ_REP)
defer C.zmq_close(socket)
C.zmq_bind(socket, C.CString("tcp://*:5555"))
for {
msg := C.zmq_msg_t{}
C.zmq_msg_init(&msg)
defer C.zmq_msg_close(&msg)
C.zmq_msg_recv(&msg, socket, 0)
size := C.zmq_msg_size(&msg)
data := C.zmq_msg_data(&msg)
goData := C.GoBytes(data, C.int(size))
fmt.Printf("Received: %s\n", string(goData))
C.zmq_send(socket, unsafe.Pointer(&goData[0]), C.size_t(len(goData)), 0)
}
}
```
# client.py
```py
import zmq
import time
context = zmq.Context()
print("Connecting to server...")
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")
for request in range(10):
print(f"Sending request {request} ...")
socket.send(f"Hello {request}".encode())
# Get the reply.
message = socket.recv()
print(f"Received reply {request} [ {message.decode()} ]")
# Wait for a second before next request
time.sleep(1)
```
# wrapper server.go
```go
package main
/*
#cgo CFLAGS: -IC:/Users/j/+win/vcpkg/packages/zeromq_x64-windows/include
#cgo LDFLAGS: -LC:/Users/j/+win/vcpkg/packages/zeromq_x64-windows/lib -lzmq-mt-4_3_5
#include <zmq.h>
#include <stdlib.h>
*/
import "C"
import (
"fmt"
"unsafe"
)
// 타입 별칭
type (
ZmqContext unsafe.Pointer
ZmqSocket unsafe.Pointer
ZmqMsg C.zmq_msg_t
)
// 상수
const (
ZMQ_REP = C.ZMQ_REP
)
// 래퍼 함수들
func zmq_ctx_new() ZmqContext {
return ZmqContext(C.zmq_ctx_new())
}
func zmq_ctx_term(context ZmqContext) {
C.zmq_ctx_term(unsafe.Pointer(context))
}
func zmq_socket(context ZmqContext, typ int) ZmqSocket {
return ZmqSocket(C.zmq_socket(unsafe.Pointer(context), C.int(typ)))
}
func zmq_close(socket ZmqSocket) {
C.zmq_close(unsafe.Pointer(socket))
}
func zmq_bind(socket ZmqSocket, endpoint string) {
cEndpoint := C.CString(endpoint)
defer C.free(unsafe.Pointer(cEndpoint))
C.zmq_bind(unsafe.Pointer(socket), cEndpoint)
}
func zmq_msg_init(msg *ZmqMsg) {
C.zmq_msg_init((*C.zmq_msg_t)(msg))
}
func zmq_msg_close(msg *ZmqMsg) {
C.zmq_msg_close((*C.zmq_msg_t)(msg))
}
func zmq_msg_recv(msg *ZmqMsg, socket ZmqSocket, flags int) {
C.zmq_msg_recv((*C.zmq_msg_t)(msg), unsafe.Pointer(socket), C.int(flags))
}
func zmq_msg_size(msg *ZmqMsg) int {
return int(C.zmq_msg_size((*C.zmq_msg_t)(msg)))
}
func zmq_msg_data(msg *ZmqMsg) unsafe.Pointer {
return C.zmq_msg_data((*C.zmq_msg_t)(msg))
}
func zmq_send(socket ZmqSocket, data []byte, flags int) {
C.zmq_send(unsafe.Pointer(socket), unsafe.Pointer(&data[0]), C.size_t(len(data)), C.int(flags))
}
// 새로운 래퍼 함수: ZmqMsg에서 Go 바이트 슬라이스로 변환
func zmq_msg_to_bytes(msg *ZmqMsg) []byte {
size := zmq_msg_size(msg)
data := zmq_msg_data(msg)
return C.GoBytes(data, C.int(size))
}
func main() {
context := zmq_ctx_new()
defer zmq_ctx_term(context)
socket := zmq_socket(context, ZMQ_REP)
defer zmq_close(socket)
zmq_bind(socket, "tcp://*:5555")
for {
msg := ZmqMsg{}
zmq_msg_init(&msg)
defer zmq_msg_close(&msg)
zmq_msg_recv(&msg, socket, 0)
goData := zmq_msg_to_bytes(&msg)
fmt.Printf("Received: %s\n", string(goData))
zmq_send(socket, goData, 0)
}
}
```

View File

@@ -60,17 +60,15 @@ https://apps.microsoft.com/detail/9n0dx20hk701?hl=en-US&gl=US
## 5. WSL background 실행 ## 5. WSL background 실행
WSL는 기본적으로 실행중인 터미널이 하나도 없으면 WSL 자체가 종료되도록 되어 있어서 서버를 굴릴수가 없다. WSL는 기본적으로 실행중인 터미널이 하나도 없으면 WSL 자체가 종료되도록 되어 있어서 서버를 굴릴수가 없다.
- https://www.autohotkey.com/ - Windows에 python은 설치되어 있어야 한다.
- AHK v2 설치
- Win+R > `shell:startup` : `시작프로그램` 폴더가 열린다. - Win+R > `shell:startup` : `시작프로그램` 폴더가 열린다.
- 메모장으로 아래의 `wsl.ahk` 파일을 생성하여 `시작프로그램` 폴더에 저장 - 메모장으로 아래의 `wsl.pyw` 파일을 생성하여 `시작프로그램` 폴더에 저장
```ahk ```python
Run "wsl.exe",,"Hide" while True: (S := __import__('subprocess')).run(['wsl'], creationflags=S.CREATE_NO_WINDOW)
``` ```
- 이 `wsl.ahk` 파일을 더블클릭해서 실행해보아도 눈에 보이는 것은 없지만, 백그라운드 터미널 하나가 실행되어, wsl이 꺼지지 않게 된다. - 이 `wsl.pyw` 파일을 더블클릭해서 실행해보아도 눈에 보이는 것은 없지만, 백그라운드 터미널 하나가 실행되어, wsl이 꺼지지 않게 된다.
- 컴퓨터를 재시작 할 경우에도 항상 하나가 켜져 있을 것이다. - 컴퓨터를 재시작 할 경우에도 항상 하나가 켜져 있을 것이다.
- 예외: 본인이 `wsl --shutdown`으로 강제 종료하면 눈에 안보이는 이것도 꺼지므로 그때는 저걸 다시 켜주어야 함) - 주의 `wsl --shutdown`으로 강제종료하여도 계속 wsl을 시작할 것이기 때문에 완전한 종료를 원할 경우에는, 저 파일을 지우고 재부팅하는 것이 제일 간단할 것이다.
# Docker에 NVIDIA 설치 # Docker에 NVIDIA 설치
@@ -80,15 +78,16 @@ WSL는 기본적으로 실행중인 터미널이 하나도 없으면 WSL 자체
## (추가) CUDA 12.6 설치 ## (추가) CUDA 12.6 설치
- WSL에서 설치하는 CUDA는 12.4인데 CUDA 12.6을 필요로 하는 경우 아래와 같이 설치한다. - WSL에서 설치하는 CUDA는 12.4인데 CUDA 12.9을 필요로 하는 경우 아래와 같이 설치한다.
https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Debian&target_version=12&target_type=deb_local https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Debian&target_version=12&target_type=deb_local
```sh ```sh
wget https://developer.download.nvidia.com/compute/cuda/12.6.1/local_installers/cuda-repo-debian12-12-6-local_12.6.1-560.35.03-1_amd64.deb wget https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-repo-debian12-12-6-local_12.6.1-560.35.03-1_amd64.deb sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo cp /var/cuda-repo-debian12-12-6-local/cuda-*-keyring.gpg /usr/share/keyrings/ sudo apt-get update
sudo add-apt-repository contrib && sudo apt-get update && sudo apt-get -y install cuda-toolkit-12-6 sudo apt-get -y install cuda-toolkit-12-9
nvidia-smi nvidia-smi
``` ```

87
x11/ahk.py Executable file
View File

@@ -0,0 +1,87 @@
#!/usr/bin/env python3
import os, sys, subprocess
os.environ['DISPLAY'] = ':0'
def cmd(*args): return subprocess.run([str(a) for a in args], capture_output=True, text=True).stdout.strip()
def tile_window(position):
window_id = subprocess.run(['xdotool', 'getactivewindow'],
capture_output=True, text=True).stdout.strip()
cmd('wmctrl', '-i', '-r', window_id, '-b', 'remove,maximized_vert,maximized_horz')
if position == 'maximize':
cmd('wmctrl', '-i', '-r', window_id, '-b', 'add,maximized_vert,maximized_horz')
return
SCREEN_WIDTH, SCREEN_HEIGHT, TASKBAR = 3840, 2160, 48
work_height = SCREEN_HEIGHT - TASKBAR
quarter = SCREEN_WIDTH // 4
positions = {
'left': (0, 0, quarter, work_height),
'center': (quarter, 0, quarter * 2, work_height),
'right': (quarter * 3, 0, quarter, work_height),
}
x, y, width, height = positions[position]
if 'xfce4-terminal' in cmd('xprop', '-id', window_id, 'WM_CLASS').lower():
height -= 10
cmd('xdotool', 'windowsize', window_id, width, height)
cmd('xdotool', 'windowmove', window_id, x, y)
def XButton1():
for line in cmd('xdotool', 'getmouselocation', '--shell').splitlines():
if 'WINDOW=' in line:
window = line.split('=')[1]
cmd('xdotool', 'windowactivate', '--sync', window)
classname = cmd('xdotool', 'getwindowclassname', window)
name = cmd('xdotool', 'getwindowname', window)
if classname == 'Xfce4-terminal': key = 'alt+F4'
elif name.startswith('New tab - obsidian'): key = 'alt+F4'
else: key = 'ctrl+w'
cmd('xdotool', 'key', key)
def popup(message): cmd("zenity", "--info", f"--text={message}", "--timeout=1")
def F1():
import random,time
SCREEN_WIDTH, SCREEN_HEIGHT, TASKBAR = 3840, 2160, 48
work_height = SCREEN_HEIGHT - TASKBAR
quarter = SCREEN_WIDTH // 4
x, y, w, h = 0, 0, quarter, work_height
cmd("chromium-browser",
"--disable-features=ExtensionManifestV2Unsupported,ExtensionManifestV2Disabled", "--new-window", "https://yauk.net")
time.sleep(0.1)
window_id = cmd('xdotool', 'getactivewindow')
cmd('xdotool', 'windowsize', window_id, w, h)
cmd('xdotool', 'windowmove', window_id, x, y)
def F12():
if ret := subprocess.run(['wmctrl', '-x', '-a', 'obsidian']).returncode:
cmd('dbus-launch', 'flatpak', 'run', 'md.obsidian.Obsidian')
def F10():
cmd('killall', 'xbindkeys')
cmd('xbindkeys')
popup('Reload')
def Win():
cmd('xfce4-popup-whiskermenu')
def Win_1():
cmd("chromium-browser",
"--disable-features=ExtensionManifestV2Unsupported,ExtensionManifestV2Disabled")
if __name__ == '__main__':
match sys.argv[1]:
case 'Win+Up': tile_window('maximize')
case 'Win+Left': tile_window('left')
case 'Win+Down': tile_window('center')
case 'Win+Right': tile_window('right')
case 'Win': Win()
case 'Win+1': Win_1()
case 'F1': F1()
case "XButton1": XButton1()
case "XButton2": cmd("xdotool", "key", "ctrl+Tab")
case "F10": F10()
case "F12": F12()

35
x11/xbindkeysrc Normal file
View File

@@ -0,0 +1,35 @@
"ahk.py XButton1"
b:8
"ahk.py XButton2"
b:9
"xte 'keydown Control_L' 'keydown Shift_L' 'key Tab' 'keyup Shift_L' 'keyup Control_L'"
Shift + b:9
"ahk.py F12"
F12
"ahk.py F1"
F1
"ahk.py F10"
F10
"ahk.py Win+1"
Mod4 + 1
"ahk.py Win+Up"
Mod4 + Up
"ahk.py Win+Left"
Mod4 + Left
"ahk.py Win+Down"
Mod4 + Down
"ahk.py Win+Right"
Mod4 + Right
"ahk.py Win"
Alt + F1

33
zmq-sqlite/README.md Normal file
View File

@@ -0,0 +1,33 @@
# Server
```python
def SQL():
import sqlite3, hashlib, os; con = sqlite3.connect('.db', isolation_level=None)
sql = lambda q, *p: list(con.execute(q, p))
if not os.path.exists('.db-blob') and os.mkdir('.db-blob') is None:
con.executescript('''PRAGMA journal_mode=WAL;
CREATE TABLE kv(k, v, t DEFAULT CURRENT_TIMESTAMP);
CREATE INDEX idx_kv_v ON kv(v); CREATE INDEX idx_kv_k_t ON kv(k,t DESC)''')
def setitem(_, filename, blob):
if not sql('SELECT 1 FROM kv WHERE v=?', sha1 := hashlib.sha1(blob).hexdigest()):
with open(f'.db-blob/{sha1}', 'xb') as f: f.write(blob)
sql('INSERT INTO kv(k,v) VALUES(?,?)', filename, sha1)
def getitem(_, filename):
if sha1 := sql('SELECT v FROM kv WHERE k=? ORDER BY t DESC', filename):
return open(f'.db-blob/{sha1[0][0]}', 'rb').read()
return type('', (), dict(__setitem__=setitem, __getitem__=getitem))()
sql = SQL()
import zmq; (socket := zmq.Context().socket(zmq.REP)).bind('tcp://*:5555')
while True:
filename, blob = socket.recv_pyobj()
sql[filename] = blob
socket.send_string('OK')
```
# Client
```python
def put(filename, blob, addr='tcp://localhost:5555'):
import zmq; (socket := zmq.Context().socket(zmq.REQ)).connect(addr)
assert socket.send_pyobj((filename, blob)) or socket.recv_string() == 'OK'
put('hello', b'world')
```