Programming/node.js2026. 4. 9. 22:13

lynx는 리눅스 cli 용 텍스트 브라우저 인데

과거에(한 2000년대 초반)는 그래도 첫 페이지 접속하면 정직하게(!) html이 날아와서

인터넷이 느리거나 하면 lynx로 테스트만 보곤 했는데

 

요즘에는 javascript 지원 브라우저를 통해

javascript를 처리해서 다른 url로 넘어가야 페이지가 보이게 되어있다 보니 lynx로 접속하면 이런 화면만 보게 된다.

 

                                                                                                                                                Google
   브라우저 업데이트
   이 브라우저는 더 이상 지원되지 않습니다. 계속 검색하려면 최신 버전으로 업그레이드하세요. 자세히 알아보기

 

#                                                                                                                                                 Daum
   #다음

   이 사이트의 기능을 모두 활용하기 위해서는 자바스크립트를 활성화 시킬 필요가 있습니다. 브라우저에서 자바스크립트를 활성화하는 방법을 참고 하세요.

[링크 : https://lynx.invisible-island.net/]

 

아무튼 이걸 우회하기 위해서는 자바스크립트를 지원하는 녀석이 필요한데

그때 만만(?)한게 셀레니움(selenium).

셀레니움을 통해서 접속하면 모니터 다리지 않은 가상의 브라우저에서 접속해서

자바스크립트 까지 처리된 페이지를 얻을수 있다.

 

요건 gpt 에서 생성해준 초기 기능 테스트용 코드

접속하고 body 태그 하위의 내용들을 getText()를 이용해 얻어와서 보여준다.

const { Builder, By } = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');
const readline = require('readline');

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

async function startBrowser(startUrl) {
    const options = new chrome.Options();
    options.addArguments('--headless=new');
    options.addArguments('--no-sandbox');
    options.addArguments('--disable-gpu');

    const driver = await new Builder()
        .forBrowser('chrome')
        .setChromeOptions(options)
        .build();

    let currentUrl = startUrl;

    while (true) {
        try {
            await driver.get(currentUrl);

            console.clear();

            /* ===== 본문 텍스트 출력 ===== */
            const bodyText = await driver
                .findElement(By.tagName('body'))
                .getText();

            console.log(bodyText.substring(0, 3000));
            console.log('\n---------------- LINKS ----------------');

            /* ===== 링크 수집 ===== */
            const elements = await driver.findElements(By.css('a'));
            const links = [];

            for (let i = 0; i < elements.length; i++) {
                const text = await elements[i].getText();
                const href = await elements[i].getAttribute('href');

                if (href && text.trim()) {
                    links.push({ index: links.length, text, href });
                }
            }

            links.forEach(l => {
                console.log(`[${l.index}] ${l.text}`);
            });

            console.log('\n[q] 종료');

            /* ===== 사용자 입력 ===== */
            const answer = await new Promise(resolve =>
                rl.question('\n이동할 링크 번호: ', resolve)
            );

            if (answer === 'q') break;

            const idx = parseInt(answer);
            if (!isNaN(idx) && links[idx]) {
                currentUrl = links[idx].href;
            }

        } catch (err) {
            console.error('오류 발생:', err.message);
            break;
        }
    }

    await driver.quit();
    rl.close();
}

/* 시작 URL */
startBrowser('https://example.com');

 

 

그리고 페이지 업/다운으로 페이지 이동하고

화살표로는 링크들 이동, 엔터는 해당 링크 따라가기 로 해서 구현한게 아래 코드

const blessed = require('blessed');
const { Builder } = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');

const startUrl = process.argv[2] || 'https://example.com';

let driver;
let history = [];

let lines = [];
let linkIndexes = [];
let selectedLink = 0;
let scroll = 0;

let title = '';
let currentUrl = '';

/* ================= Selenium ================= */

async function loadPage(url, pushHistory = true) {
  if (pushHistory && currentUrl) history.push(currentUrl);

  await driver.get(url);
  currentUrl = url;
  title = await driver.getTitle();

  const pageData = await driver.executeScript(() => {
    const result = [];

    function walk(node) {
      if (node.nodeType === Node.TEXT_NODE) {
        const t = node.textContent.replace(/\s+/g, ' ').trim();
        if (t) result.push({ text: t });
        return;
      }

      if (node.nodeType !== Node.ELEMENT_NODE) return;

      const tag = node.tagName.toLowerCase();

      if (tag === 'a' && node.href && node.innerText.trim()) {
        result.push({ text: node.innerText.trim(), href: node.href });
        return;
      }

      if (['script','style','noscript'].includes(tag)) return;

      if (['p','div','section','article','li','pre','blockquote',
           'h1','h2','h3','h4','h5','h6'].includes(tag)) {
        node.childNodes.forEach(walk);
        result.push({ text: '' });
        return;
      }

      node.childNodes.forEach(walk);
    }

    walk(document.body);
    return result;
  });

  lines = [];
  linkIndexes = [];

  pageData.forEach(item => {
    const idx = lines.length;
    if (item.href) {
      lines.push({ text: item.text, href: item.href, selectable: true });
      linkIndexes.push(idx);
    } else {
      lines.push({ text: item.text, selectable: false });
    }
  });

  scroll = 0;
  selectedLink = 0;
}

/* ================= Selection / Scroll ================= */

function recalcSelectionInView() {
  const top = scroll;
  const bottom = scroll + body.height - 1;

  const visible = linkIndexes.filter(i => i >= top && i <= bottom);
  if (visible.length)
    selectedLink = linkIndexes.indexOf(visible[0]);
}

function drawScrollbar() {
  const total = lines.length;
  const view = body.height;
  if (total <= view) return;

  const maxScroll = total - view;
  const barHeight = Math.max(1, Math.floor(view * view / total));
  const barTop = Math.floor(scroll * (view - barHeight) / maxScroll);

  for (let i = 0; i < barHeight; i++) {
    const line = body.getLine(barTop + i);
    if (line !== undefined) {
      body.setLine(barTop + i, line + '▐');
    }
  }
}

/* ================= TUI ================= */

const screen = blessed.screen({
  smartCSR: true,
  fullUnicode: true,
  title: 'Text Browser'
});

const header = blessed.box({ top: 0, height: 2, tags: true });

const body = blessed.box({
  top: 2,
  bottom: 2,
  tags: true
});

/* footer를 두 줄로 분리 */
const footerHelp = blessed.box({
  bottom: 1,
  height: 1,
  tags: true
});

const footerSelected = blessed.box({
  bottom: 0,
  height: 1,
  tags: true
});

screen.append(header);
screen.append(body);
screen.append(footerHelp);
screen.append(footerSelected);

function render() {
  const height = body.height;
  const visible = lines.slice(scroll, scroll + height);
  const selectedLine = linkIndexes[selectedLink];

  header.setContent(`{bold}${title}{/bold}\n${currentUrl}`);

  body.setContent(
    visible.map((l, i) => {
      const idx = scroll + i;
      if (l.selectable) {
        if (idx === selectedLine)
          return `{white-fg}{blue-bg}${l.text}{/}`;
        return `{blue-fg}{underline}${l.text}{/}`;
      }
      return l.text;
    }).join('\n')
  );

  drawScrollbar();

  footerHelp.setContent(
    `{dim}↑↓ 이동  PgUp/PgDn 페이지  Enter 열기  b 뒤로  q 종료{/dim}`
  );

  footerSelected.setContent(
    `{bold}Selected:{/bold} ${lines[selectedLine]?.href || ''}`
  );

  screen.render();
}

/* ================= Keys ================= */

function moveSelection(delta) {
  const next = selectedLink + delta;
  if (next < 0 || next >= linkIndexes.length) return;

  selectedLink = next;
  const idx = linkIndexes[selectedLink];

  if (idx < scroll) scroll = idx;
  if (idx >= scroll + body.height)
    scroll = idx - body.height + 1;

  render();
}

screen.key('up', () => moveSelection(-1));
screen.key('down', () => moveSelection(1));

screen.key('pageup', () => {
  scroll = Math.max(0, scroll - body.height);
  recalcSelectionInView();
  render();
});

screen.key('pagedown', () => {
  scroll = Math.min(
    Math.max(0, lines.length - body.height),
    scroll + body.height
  );
  recalcSelectionInView();
  render();
});

screen.key('enter', async () => {
  const line = lines[linkIndexes[selectedLink]];
  if (line?.href) {
    await loadPage(line.href);
    render();
  }
});

screen.key('b', async () => {
  if (history.length) {
    await loadPage(history.pop(), false);
    render();
  }
});

screen.key('resize', () => {
  recalcSelectionInView();
  render();
});

screen.key(['q','C-c'], async () => {
  if (driver) await driver.quit();
  process.exit(0);
});

/* ================= Init ================= */

(async () => {
  const options = new chrome.Options();
  options.addArguments('--headless=new');

  driver = await new Builder()
    .forBrowser('chrome')
    .setChromeOptions(options)
    .build();

  await loadPage(startUrl);
  render();
})();

[링크 : https://chatgpt.com/share/697b1d46-a670-800c-a520-0d6289a4391c]

'Programming > node.js' 카테고리의 다른 글

electron asar 파일  (0) 2025.08.26
node excel export  (0) 2024.07.18
web qr decoder  (0) 2024.04.04
node.js 웹소켓 채팅 서버 예제  (0) 2022.07.14
ubuntu 18.04 / nodej.s 18.x 실패  (0) 2022.05.19
Posted by 구차니

openclaw와 telegram 조합으로 동료가 쓰고 있어서

비슷하게 해보려다가 claude 도 막혔지 이래저래 귀찮아서

local LLM + telegram 으로 하려다가

이래저래 귀찮아서(!)

local LLM은 ollama로 딸깍~ 하고

python + python-telegram-bot 조합으로 메신저 통신을 뚫고

수신한 메시지를 ollama의 가벼운 모델(일단 gemma3) 로 던지고

검색이 들어간 문장이 오면 검색을 제외한 단어를 인터넷 검색후(python + selenium)

결과를 다시 약간의 프롬프트와 합쳐 ollama로 던지고

응답을 받으면 메신저로 쏴주는 식으로 구현하니 나름 이렇게 에이전트를 만드는 거구나 싶어서

다른 ai 클라이언트나 에이전트들은 어떻게 만들어졌나 뜯어보고 싶어지네.

 

selenium은 wget 등으로 다음/네이버/구글 url + query 식으로 하면

바로 이동하지 않고 javascript를 통해 추가 링크로 이동하게 되어있어서 쓸 수 없다 보니

request 패키지로는 작동하지 않아 selenium을 쓸 수 밖에 없네..

 

[링크 : https://python-telegram-bot.org/]

 

telegram bot을 이용해서 메시지 보내는 방법

import asyncio
from telegram import Update
from telegram.ext import ApplicationBuilder, ContextTypes, MessageHandler, filters
from telegram.constants import ChatAction

async def handler(update: Update, context: ContextTypes.DEFAULT_TYPE):
    chat_id = update.effective_chat.id

    # "입력 중..." 표시
    await context.bot.send_chat_action(chat_id=chat_id, action=ChatAction.TYPING)

    # 실제 작업 흉내 (지연)
    await asyncio.sleep(3)

    # 메시지 전송
    await update.message.reply_text("처리 완료!")

app = ApplicationBuilder().token("TOKEN").build()
app.add_handler(MessageHandler(filters.TEXT, handler))
app.run_polling()

[링크 : https://chatgpt.com/share/69d7a89e-0328-8322-aa93-5274cef6d386]

 

telegram bot 에 보낸 메시지 받는 방법(버전이 구버전 예제로 실행은 안됨)

from telegram.ext import Updater, MessageHandler, Filters

def handle_msg(update, context):
    print(update.message.text)

updater = Updater("BOT_TOKEN", use_context=True)
dp = updater.dispatcher

dp.add_handler(MessageHandler(Filters.text, handle_msg))

updater.start_polling()
updater.idle()

[링크 : https://chatgpt.com/share/69d7a934-835c-8320-b493-e07c126e9cd5]

 

python  에서 ollama 라이브러리를 이용하여 llama3 에게 물어보는 예제 코드

import ollama

response = ollama.chat(
    model='llama3',
    messages=[
        {
            'role': 'user',
            'content': '문제를 단계별로 생각 과정을 포함해서 풀어줘'
        }
    ]
)

print(response['message']['content'])

[링크 : https://chatgpt.com/share/69d7a89e-0328-8322-aa93-5274cef6d386]

'프로그램 사용 > ai 프로그램' 카테고리의 다른 글

python 으로 telegram + fatherbot 연동하기  (0) 2026.04.08
ollama 설치  (0) 2026.04.08
antigravity artifact  (0) 2026.03.18
agi를 느꼈다?  (0) 2026.02.24
gemini 동영상 만들기 (유료?)  (0) 2026.02.22
Posted by 구차니

서랍장 5단중에 3단 수리

회사에서 드릴 가져와서 망정... 인가? 아니면 더 힘들었나 모르겠지만

낑낑대며 1시간 걸쳐 수리함 어우..

'개소리 왈왈 > 육아관련 주저리' 카테고리의 다른 글

퇴원  (4) 2026.03.27
딸램 중고 자전거 지름  (2) 2026.03.22
무좀약  (0) 2026.03.14
약기운 때문인가  (0) 2026.03.09
약먹다 배부르겠네!!  (0) 2026.03.07
Posted by 구차니

ollama 설치

curl -fsSL https://ollama.com/install.sh | sh
ollama run gemma3:1b

 

python 라이브러리 설치

pip3 install ollama 
pip3 install python-telegram-bot

 

telegram bot 생성 및 token 얻기

[링크 : https://midoriiroplace.tistory.com/62] fatherbot 으로 텔레그램 봇 만들기(token 획득)

 

python 소스코드

import ollama
from telegram import Update
from telegram.ext import filters, MessageHandler, ApplicationBuilder, ContextTypes, CommandHandler

APIKEY='{{사용자 토큰}}'

async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE):
    response =  ollama.chat(model="gemma3:1b", messages=[{'role':'user','content':update.message.text}])
    await context.bot.send_message(chat_id=update.effective_chat.id, text=response['message']['content']
)

if __name__ == '__main__':
    application = ApplicationBuilder().token(APIKEY).build()
    
    echo_handler = MessageHandler(filters.TEXT & (~filters.COMMAND), echo)
    application.add_handler(echo_handler)

    application.run_polling()

----

 

[링크 : https://dev-astra.tistory.com/490]

[링크 : https://midoriiroplace.tistory.com/62] fatherbot 으로 텔레그램 봇 만들기(token 획득)

[링크 : https://midoriiroplace.tistory.com/63] python으로 메시지 보내기 (chatid 획득)

[링크 : https://midoriiroplace.tistory.com/70]

[링크 : https://naradora78.tistory.com/39] 구버전 api 라서 현재 사용불가

 

[링크 : https://pypi.org/project/python-telegram-bot/]

 

gpt가 짜준게 이거 기반인 것 같은디..

가장 위에 소스로는 응답이 없고, 아무튼.. echo 얘제는 아래를 참고하면된다.

그러면.. 받고 이걸 ollama에 넘겨주고 받으면 되는건가..?

import logging
from telegram import Update
from telegram.ext import filters, MessageHandler, ApplicationBuilder, ContextTypes, CommandHandler

logging.basicConfig(
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    level=logging.INFO
)

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    await context.bot.send_message(chat_id=update.effective_chat.id, text="I'm a bot, please talk to me!")

async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE):
    await context.bot.send_message(chat_id=update.effective_chat.id, text=update.message.text)


if __name__ == '__main__':
    application = ApplicationBuilder().token('USER_TOKEN').build()
    
    start_handler = CommandHandler('start', start)
    application.add_handler(start_handler)

    echo_handler = MessageHandler(filters.TEXT & (~filters.COMMAND), echo)
    application.add_handler(echo_handler)

    application.run_polling()

 

[링크 : https://github.com/python-telegram-bot/python-telegram-bot/wiki/Extensions---Your-first-Bot]

'프로그램 사용 > ai 프로그램' 카테고리의 다른 글

python + telegram + ollama + selenium  (0) 2026.04.09
ollama 설치  (0) 2026.04.08
antigravity artifact  (0) 2026.03.18
agi를 느꼈다?  (0) 2026.02.24
gemini 동영상 만들기 (유료?)  (0) 2026.02.22
Posted by 구차니

intel cpu 인데 내장 그래픽은 역시 버리는건가..(!)

 

$ curl -fsSL https://ollama.com/install.sh | sh
>>> Installing ollama to /usr/local
[sudo] minimonk 암호: 
>>> Downloading ollama-linux-amd64.tar.zst
######################################################################## 100.0%
>>> Creating ollama user...
>>> Adding ollama user to render group...
>>> Adding ollama user to video group...
>>> Adding current user to ollama group...
>>> Creating ollama systemd service...
>>> Enabling and starting ollama service...
Created symlink /etc/systemd/system/default.target.wants/ollama.service → /etc/systemd/system/ollama.service.
>>> The Ollama API is now available at 127.0.0.1:11434.
>>> Install complete. Run "ollama" from the command line.
WARNING: No NVIDIA/AMD GPU detected. Ollama will run in CPU-only mode.

 

$ ollama 
Ollama 0.20.3                                       
                                                    
  Chat with a model                                 
    Start an interactive chat with a model          
                                                    
  Launch Claude Code (not installed)                
    Anthropic's coding tool with subagents          
                                                    
  Launch Codex (not installed)                      
    OpenAI's open-source coding agent               
                                                    
  Launch OpenClaw (install)                         
    Personal AI with 100+ skills                    
                                                    
  Launch OpenCode (not installed)                   
    Anomaly's open-source coding agent              
                                                    
  Launch Droid (not installed)                      
    Factory's coding agent across terminal and IDEs 
                                                    
▸ Launch Pi (install)                               
    Press enter to install                          
                                                    
                                                    
↑/↓ navigate • enter launch • → configure • esc quit

 

$ ollama 
Select model to run: Type to filter...                                          
                                                                                
  Recommended                                                                   
  ▸ kimi-k2.5:cloud                                                             
      Multimodal reasoning with subagents                                       
    qwen3.5:cloud                                                               
      Reasoning, coding, and agentic tool use with vision                       
    glm-5:cloud                                                                 
      Reasoning and code generation                                             
    minimax-m2.7:cloud                                                          
      Fast, efficient coding and real-world productivity                        
    gemma4                                                                      
      Reasoning and code generation locally, ~16GB, (not downloaded)            
    qwen3.5                                                                     
      Reasoning, coding, and visual understanding locally, ~11GB, (not downloade
                                                                                
↑/↓ navigate • enter select • ← back                         
$ ollama 
Download gemma4?                         
                                         
   Yes    No                             
                                         
←/→ navigate • enter confirm • esc cancel

 

메모리도 작고(16GB) cpu로 돌릴거라 취소!

pulling manifest 
pulling 4c27e0f5b5ad:  40% ▕███████           ▏ 3.9 GB/9.6 GB   11 MB/s   8m11s

 

[링크 : https://goddaehee.tistory.com/]

[링크 : https://ollama.com/download]

[링크 : https://ollama.com/search]

 

+

일단 돌릴 테스트니까  1B던 3B던 상관없으니 시작

그런데 아까 위에 메뉴에서는 왜 gemma만 보이고 이제 llama는 안보이는걸까?

일단은.. updated 1 years ago 인거 봐서 최신으로만 보여주는걸려나?

$ ollama run llama3.2
pulling manifest 
pulling dde5aa3fc5ff:  70% ▕████████████      ▏ 1.4 GB/2.0 GB   20 MB/s     29s

[링크 : https://ollama.com/library/llama3.2]

 

으아아 컴퓨터 녹는다 ㅋㅋㅋ

그래도 초당 2~3 단어 정도 나오는 느낌인데 이정도만 해도 그냥 대화하는 느낌 속도라

그거보다 빠르면 읽기도 전에 말이 더 빠르게 나올 듯?

 

Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz

 

다시 실행하니 내가 받아둔 모델이 뜬다.

$ ollama 
Select model to run: Type to filter...                                            
                                                                                  
  Recommended                                                                     
    gemma4                                                                        
      Reasoning and code generation locally, ~16GB, (not downloaded)              
    qwen3.5                                                                       
      Reasoning, coding, and visual understanding locally, ~11GB, (not downloaded)
    kimi-k2.5:cloud                                                               
      Multimodal reasoning with subagents                                         
    qwen3.5:cloud                                                                 
      Reasoning, coding, and agentic tool use with vision                         
    glm-5:cloud                                                                   
      Reasoning and code generation                                               
    minimax-m2.7:cloud                                                            
      Fast, efficient coding and real-world productivity                          
                                                                                  
  More                                                                            
  ▸ llama3.2                                                                      
                                                                                  
↑/↓ navigate • enter select • ← back                  

 

 

$ ollama --help
Large language model runner

Usage:
  ollama [flags]
  ollama [command]

Available Commands:
  serve       Start Ollama
  create      Create a model
  show        Show information for a model
  run         Run a model
  stop        Stop a running model
  pull        Pull a model from a registry
  push        Push a model to a registry
  signin      Sign in to ollama.com
  signout     Sign out from ollama.com
  list        List models
  ps          List running models
  cp          Copy a model
  rm          Remove a model
  launch      Launch the Ollama menu or an integration
  help        Help about any command

Flags:
  -h, --help         help for ollama
      --nowordwrap   Don't wrap words to the next line automatically
      --verbose      Show timings for response
  -v, --version      Show version information

Use "ollama [command] --help" for more information about a command.

 

단발성으로 질문하고 속도를 보려고 하는데

음.. eval rate가 실제 체감되는 속도인가? 12 token/s

이정도 수치는 되어야 많이 지루하지 않게 읽는 속도로 말이 생성되는 듯.

$ ollama run llama3.2:latest "안녕" --verbose
안녕하세요! (Hello!) I'm here to help you. How can I assist you today?

total duration:       2.282485591s
load duration:        143.825937ms
prompt eval count:    27 token(s)
prompt eval duration: 350.162008ms
prompt eval rate:     77.11 tokens/s
eval count:           21 token(s)
eval duration:        1.73838491s
eval rate:            12.08 tokens/s

 

gemma가 핫하긴 한데 용량이 커서 안돌것 같아서 3로 시도

[링크 : https://ollama.com/library/gemma3]

[링크 : https://ollama.com/library/gemma4]

 

제법 빠르고llama 보다는 괜찮은듯?

$ ollama run gemma3:1b --verbose
>>> 안녕?
안녕하세요! 잘 지내세요? 😊 저는 오늘 당신의 도움이 필요하신 건가요? 궁금한
 게 있으신가요?

total duration:       1.695837878s
load duration:        297.67234ms
prompt eval count:    12 token(s)
prompt eval duration: 164.822603ms
prompt eval rate:     72.81 tokens/s
eval count:           28 token(s)
eval duration:        1.132524529s
eval rate:            24.72 tokens/s

 

혹시나 gemma4를 16GB 메모리에서 시도해봤는데 메모리 부족으로 실패.

$ ollama run gemma4:e2b --verbose
pulling manifest 
pulling 4e30e2665218: 100% ▕██████████████████▏ 7.2 GB                         
pulling 7339fa418c9a: 100% ▕██████████████████▏  11 KB                         
pulling 56380ca2ab89: 100% ▕██████████████████▏   42 B                         
pulling c6bc3775a3fa: 100% ▕██████████████████▏  473 B                         
verifying sha256 digest 
writing manifest 
success 
Error: 500 Internal Server Error: model requires more system memory (7.3 GiB) than is available (4.8 GiB)

 

프로세스 이것저것 죽이고 다시 시도하니 10token /s 정도 나오는 듯.

$ ollama run gemma4:e2b --verbose
>>> 안녕
안녕하세요! 😊

total duration:       1.261211464s
load duration:        302.800476ms
prompt eval count:    17 token(s)
prompt eval duration: 551.024817ms
prompt eval rate:     30.85 tokens/s
eval count:           4 token(s)
eval duration:        226.924038ms
eval rate:            17.63 tokens/s
>>> 너에 대해서 소개해봐
Thinking...
Thinking Process:

1.  **Analyze the Request:** The user asked "너에 대해서 소개해봐" (Tell 
me about yourself).
2.  **Determine Identity & Core Facts (Self-Correction/Verification):**
    *   Name: Gemma 4.
    *   Developer: Google DeepMind.
    *   Nature: Large Language Model (LLM).
    *   Type: Open weights model.
    *   Capabilities: Understands text/images, generates text.
    *   Knowledge Cutoff: (Relevant for context, but usually stated 
implicitly)
3.  **Structure the Introduction (Korean Context):** A good introduction 
should cover:
    *   Greeting.
    *   Name/Identity.
    *   Developer/Origin.
    *   Nature/Function (What I do).
    *   Capabilities (What I can process).
4.  **Draft the Response (Internal Monologue & Refinement):**
    *   *Start warmly.* (안녕하세요!)
    *   *State Identity.* (저는 Gemma 4입니다.)
    *   *State Origin.* (Google DeepMind에서 개발했습니다.)
    *   *State Nature.* (저는 대규모 언어 모델(LLM)입니다.)
    *   *State Function/Role.* (사용자의 질문에 답하고, 정보를 제공하며, 다
양한 텍스트 기반 작업을 돕는 역할을 합니다.)
    *   *State Modality/Input.* (텍스트와 이미지를 이해할 수 있습니다.)
    *   *Concluding remark/Offer help.* (어떤 것을 도와드릴까요?)
5.  **Final Output Generation (Review against constraints):** The 
generated response must adhere to the core identity (Gemma 4, LLM, Google 
DeepMind, open weights). (The draft looks good and adheres to the required 
identity.)
...done thinking.

안녕하세요! 저는 **Gemma 4**입니다.

저는 Google DeepMind에서 개발한 **대규모 언어 모델(LLM)**이며, 오픈 웨이트
(open weights) 모델로 공개되어 있습니다.

**저의 주요 특징은 다음과 같습니다:**

1. **정체성:** 저는 방대한 데이터를 학습하여 인간의 언어를 이해하고 생성하며
, 다양한 질문에 답하고 정보를 제공하는 능력을 가지고 있습니다.
2. **기능:** 텍스트 기반의 대화, 요약, 번역, 작문, 코드 생성 등 다양한 언어
 관련 작업을 수행할 수 있습니다.
3. **입력 능력:** 저는 텍스트와 이미지를 이해하고 처리할 수 있습니다. (다만
, 출력은 텍스트로만 생성합니다.)
4. **목표:** 사용자분들이 필요한 정보를 얻고, 창의적인 작업을 수행하며, 복잡
한 문제를 해결하는 데 도움을 드릴 수 있도록 설계되었습니다.

궁금한 점이 있거나 도움이 필요하시면 언제든지 말씀해주세요! 😊

total duration:       57.596689687s
load duration:        297.105521ms
prompt eval count:    35 token(s)
prompt eval duration: 482.722245ms
prompt eval rate:     72.51 tokens/s
eval count:           614 token(s)
eval duration:        56.261795129s
eval rate:            10.91 tokens/s

 

+

intel 내장 그래픽(xe 나 arc 아님)은 openCL 가속 자체를 지원하지 않나?

$ clinfo
Number of platforms                               0

[링크 : https://docs.ollama.com/gpu]

[링크 : https://dgpu-docs.intel.com/driver/client/overview.html#ubuntu-22.04]

'프로그램 사용 > ai 프로그램' 카테고리의 다른 글

python + telegram + ollama + selenium  (0) 2026.04.09
python 으로 telegram + fatherbot 연동하기  (0) 2026.04.08
antigravity artifact  (0) 2026.03.18
agi를 느꼈다?  (0) 2026.02.24
gemini 동영상 만들기 (유료?)  (0) 2026.02.22
Posted by 구차니
embeded/jetson2026. 4. 6. 21:16

음.. cp로 하니 이상하게 안되는 군

$ nvcc tt.cpp
tt.cpp: In function ‘void kernel_test(int*, int*, int*)’:
tt.cpp:14:12: error: ‘threadIdx’ was not declared in this scope
  int idx = threadIdx.x +blockIdx.x * blockDim.x + (gridDim.x * blockDim.x) * (blockIdx.y * blockDim.y + threadIdx.y);
            ^~~~~~~~~
tt.cpp:14:12: note: suggested alternative: ‘pthread_t’
  int idx = threadIdx.x +blockIdx.x * blockDim.x + (gridDim.x * blockDim.x) * (blockIdx.y * blockDim.y + threadIdx.y);
            ^~~~~~~~~
            pthread_t
tt.cpp:14:25: error: ‘blockIdx’ was not declared in this scope
  int idx = threadIdx.x +blockIdx.x * blockDim.x + (gridDim.x * blockDim.x) * (blockIdx.y * blockDim.y + threadIdx.y);
                         ^~~~~~~~
tt.cpp:14:25: note: suggested alternative: ‘clock’
  int idx = threadIdx.x +blockIdx.x * blockDim.x + (gridDim.x * blockDim.x) * (blockIdx.y * blockDim.y + threadIdx.y);
                         ^~~~~~~~
                         clock
tt.cpp:14:38: error: ‘blockDim’ was not declared in this scope
  int idx = threadIdx.x +blockIdx.x * blockDim.x + (gridDim.x * blockDim.x) * (blockIdx.y * blockDim.y + threadIdx.y);
                                      ^~~~~~~~
tt.cpp:14:38: note: suggested alternative: ‘clock’
  int idx = threadIdx.x +blockIdx.x * blockDim.x + (gridDim.x * blockDim.x) * (blockIdx.y * blockDim.y + threadIdx.y);
                                      ^~~~~~~~
                                      clock
tt.cpp:14:52: error: ‘gridDim’ was not declared in this scope
  int idx = threadIdx.x +blockIdx.x * blockDim.x + (gridDim.x * blockDim.x) * (blockIdx.y * blockDim.y + threadIdx.y);
                                                    ^~~~~~~
tt.cpp: At global scope:
tt.cpp:18:11: error: ‘::main’ must return ‘int’
 void main()
           ^
tt.cpp: In function ‘int main()’:
tt.cpp:61:15: error: expected primary-expression before ‘<’ token
  kernel_test<<<block,thread>>>(dev_a,dev_b,dev_c);
               ^
tt.cpp:61:30: error: expected primary-expression before ‘>’ token
  kernel_test<<<block,thread>>>(dev_a,dev_b,dev_c);
                              ^

 

음.. cuda는 main이 int 형이여야 하는군

$ nvcc tt.cu
tt.cu(18): warning: return type of function "main" must be "int"

tt.cu(18): warning: return type of function "main" must be "int"

tt.cu:18:11: error: ‘::main’ must return ‘int’
 void main()
           ^

[링크 : https://mangkyu.tistory.com/84]

 

싱글코어

$ ./a.out
cpu Time : 0.206937
gpu Time : 0.000106

 

어..? 멀티코어 돌리는게 왜 더 느려?!?!

$ nvcc  -Xcompiler -fopenmp tt.cu -o a.out.mp
jetson@nano-4gb-jp451:~$ ./a.out.mp
cpu Time : 0.231175
gpu Time : 0.000088

[링크 : https://forums.developer.nvidia.com/t/how-use-openmp-in-cu-file/2918/10]

 

2014.01.17 - [Programming/openCL & CUDA] - cuda + openmp 적용 예제

 

 

Posted by 구차니
embeded/jetson2026. 4. 6. 19:41

그냥 해보니 없는데 경로 따라가니 있다. 오호

jetson@nano-4gb-jp451:~$ nvcc
-bash: nvcc: command not found

jetson@nano-4gb-jp451:~$ /usr/local/cuda-10.2/bin/nvcc
nvcc fatal   : No input files specified; use option --help for more information

 

cuda로 심볼릭 링크되어있으니 이걸로 하면 편할듯

/usr/local$ ls -al
total 48
drwxr-xr-x 12 root root 4096 May 26  2021 .
drwxr-xr-x 12 root root 4096 Feb 19  2021 ..
drwxr-xr-x  3 root root 4096 Mar 30 07:22 bin
lrwxrwxrwx  1 root root    9 Feb 19  2021 cuda -> cuda-10.2
drwxr-xr-x 12 root root 4096 Feb 19  2021 cuda-10.2
drwxr-xr-x  3 root root 4096 May 26  2021 etc
drwxr-xr-x  2 root root 4096 Apr 26  2018 games
drwxr-xr-x  2 root root 4096 Apr 26  2018 include
drwxr-xr-x  2 root root 4096 May 26  2021 jetson_stats
drwxr-xr-x  4 root root 4096 Jun  4  2018 lib
lrwxrwxrwx  1 root root    9 Apr 26  2018 man -> share/man
drwxr-xr-x  2 root root 4096 Apr 26  2018 sbin
drwxr-xr-x 11 root root 4096 May 26  2021 share
drwxr-xr-x  2 root root 4096 Apr 26  2018 src

 

$ tail -2 ~/.bashrc
export PATH=/usr/local/cuda/bin${PATH:+:${PATH}}$
export LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

[링크 : https://staycool-js.tistory.com/m/23]

Posted by 구차니
Linux API/linux2026. 4. 6. 16:14

hid multitouch 드라이버 보다가 신기한(?)거 발견

간단하게(?)  /sys 경로에 show_mt 라는 파일이 생성되고 boolean 타입으로 내용을 써주면 드라이버에서

그 값을 이용해 작동하게 되는 매크로.

 

module_param(show_mt, bool, 0444);

[링크 : https://github.com/bentiss/hid-multitouch/blob/master/hid-multitouch.c]

 

[링크 :https://reakwon.tistory.com/226]

'Linux API > linux' 카테고리의 다른 글

커널 cmdline 관련 함수  (0) 2026.04.03
kernel input_event()  (1) 2025.12.23
linux 시리얼 포트 열기(termios)  (0) 2025.10.11
LD_DEBUG=libs  (0) 2025.06.02
linux device tree(dtb) 문법...?  (0) 2024.12.04
Posted by 구차니
embeded/jetson2026. 4. 5. 19:21

 

 

양산품은 2027년

 

구버전 개발킷도 이제는 단종 시키려고 하는듯.

명시하진 않았으나 도달중인.. 표현이 참..

[링크 : https://developer.nvidia.com/embedded/lifecycle]

'embeded > jetson' 카테고리의 다른 글

jetson nano nvcc 빌드  (0) 2026.04.06
jetson nvcc 실행하기  (0) 2026.04.06
jetracer에 사용할 보호회로 없는 배터리 구매  (2) 2026.04.04
jetracer ina219 배터리 모니터링 ic  (0) 2026.04.04
jetracer interactive-regression  (1) 2026.04.04
Posted by 구차니
embeded/jetson2026. 4. 4. 21:13

중고로 3개 구매함(개당 2500원, 당근 99도!)

인터넷으로 보호회로 없는걸 사기 힘드니까 어쩔수 없긴한데

아무튼 깔끔하게 조립이 가능해져서 행복 +_+

 

그 와중에 모니터링 하고 싶은데 영 방법이 안보이네

7:10 부터 9:00 까지 전진 계속 시키고 jetson 켜놨는데

뺴고 재보니 3.9V 나오는걸 봐서는 3시간 정도 어찌 버틸듯?

 

사양만 보면 25C 고방전 사양의 배터리인가?!

'embeded > jetson' 카테고리의 다른 글

jetson nvcc 실행하기  (0) 2026.04.06
jetson nano 2gb dev kit EOL 근접  (0) 2026.04.05
jetracer ina219 배터리 모니터링 ic  (0) 2026.04.04
jetracer interactive-regression  (1) 2026.04.04
imx219-160  (0) 2026.04.03
Posted by 구차니