Skip to main content

इतिहासाची पुनरावृत्ती

1 minute

इतिहासाची पुनरावृत्ती
===========

काही वर्षापूर्वी अमेरीकेने भारताला सुपर कंप्युटर नाकारला. मग भारतीयांच्या आत्मसन्मानास ठेच पोचली.

त्यातून एक महाविनोद निर्माण झाला, ज्याला जग हसले.

आता अमेरीकेने ए०आय० तंत्रज्ञान नाकारले आहे...

आता परत भारतीयांच्या आत्मसन्मानास ठेच लागेल.

मग एखादा पुरस्कारलंपट ही जबाबदारी स्वीकारेल.

कृत्रीम ए०आय० जन्माला येण्य़ा अगोदरच मरण पावला. सर्वमचे भवितव्य फार वेगळे असेल वाटत नाही.

अमेरीका, चीन आणि इतर देश पुढे निघून जातील.

मग परत एक विनोद जन्माला येईल, ज्याची मुळे वेदांमध्ये सापडतील.

इतिहासाचे चक्र असेच चालू राहील.

Node read time
1 minute

'न'वी बाजू Fri, 19/06/2026 - 05:22

…विनोदाचा उगम वेदांमध्ये आहे.

(किंबहुना, भारताने जगाला… चुकलो, विश्वाला…दिलेल्या देणग्यांमध्ये विनोदाचा नंबर शून्याच्याही अगोदर लागतो, असा दावा ठोकून देता यावा काय?)

Rajesh188 Fri, 19/06/2026 - 14:33

भारताचा पहिला महासंगणक fail होता? महाजोक होता?

विषारी भावना, भारताला हीन समजण्या ची भावना आहे ही.

पुरावे द्या परम हा महासंगणक एक महाजोक होता.
भारताच्या बुद्धीमान लोकांन च अपमान करण्या ची परवाणगी ह्या स्थळ नी देऊ नये..

परम हा महासंगणक fail होता हे सिद्ध करण्या साठी जगातील महासंगणक क्षेत्रातील दहा लोकांचे वक्तव्य इथे मूळ source सहित प्रसिद्ध करावे.
. परम ह्या महासंगणक ला जोक म्हणून हिनवणाऱ्या ची
Calculator निर्माण करण्या ची कुवत नाही आणि परम ह्या महासंगणक ला महाजोक म्हणतं आहे.
असे बीन बुडाचे लेख प्रसिद्ध करू नका
Reality मध्ये परम महासंगणक च वापर हवामान अंदाज, सहित अनेक क्षेत्रात भारताने केला. अगदी रशिया, कॅनडा ला पण हा निर्यात झाला.

वेद सारख्या धार्मिक गोष्टी ला काही संबंध नसताना ह्या विषय शी जोडणे ही महाचूक आहे.

सुधीर Fri, 19/06/2026 - 18:39

२००० च्या सुरुवातीच्या काळात, जेव्हा भारतात इंटरनेटचा नवा काळ सुरू होत होता तेव्हा मी कॉलेजमध्ये होतो. आणि मला चांगलं आठवतं तेव्हा टाइम्स ऑफ इंडिया मध्ये इंडियाटाइम्स ईमेल कसं याहू आणि हॉटमेलला टक्कर देतंय याच्या बातम्या पहिल्या पानावर असायच्या. त्या काळात याहू आणि हॉटमेलने भारतीय बाजारपेठेवर आपला घट्ट ताबा मिळवला होता; तर दुसरीकडे इंडियाटाइम्स आणि रेडिफमेल सारख्या स्थानिक कंपन्या भारतीय संस्कृती, प्रादेशिक विषय आणि सायबर कॅफेच्या संथ इंटरनेटला पूरक ठरतील अशा सुविधा देऊन भारतीयांना आकर्षित करत होत्या. इंडियाटाइम्सने "मेरा मेल" सारखं हलकं, कमी स्पीडसाठी योग्य व्हर्जन आणलं होतं. मेलबॉक्सची क्षमता फार फार तर १–२ एमबी असायची. मग २००४ मध्ये गुगलने अवाढव्य १ जीबी स्टोरेजसह जीमेल बाजारात आणलं आणि या सगळ्याला अक्षरशः फुलस्टॉप दिला. याहू आणि हॉटमेल दोघांनाही त्याचा मोठा फटका बसला. विनर टेक्स ऑल.

सर्वम बाबत असेच होईल असे म्हणायचे नाही. पण टेक बिझनेसचा गेम वेगळाच असतो. (विनर टेक्स ऑल). सर्वम एआय भारतासाठी खास एआय मॉडेल्स बनवते. एचसीएलटेकने अलीकडेच मोठी गुंतवणूक करून तिला युनिकॉर्न बनवलं आहे. भारताच्या भाषिक विविधतेसाठी खास ट्रेन केलेली मोठी भाषा मॉडेल्स बनवण्यावर त्यांचा फोकस आहे.

चायनाने एआय डेव्हलपर्सना बाहेरच्या देशात जायला बंदी घातली आहे असे ऐकून आहे, कदाचित खरे नसेल, पण चायना टॅलेंट रोखण्यासाठी आणि टेक्नॉलॉजीवर नियंत्रण ठेवण्यासाठी कडक धोरणं वापरतो हे खरं. आजच्या घडीला हे सर्वात महागडे, सर्वाधिक मागणी असलेले रिसोर्सेस आहेत. चायनाच्या नॉन-डेमॉक्रॅटिक पॉलिटिकल मॉडेलमुळे, सोशल मीडिया बॅन करून स्वतःचे प्लॅटफॉर्म विकसित करणे इत्यादी गोष्टी त्यांना करता आल्या. भारत असं काही करेल असं वाटत नाही. सध्यातरी अमेरिकेच्या धोरणामुळे धक्का बसला. अँथ्रॉपिकच्या क्लॉड फेबल ५ मॉडेल्सवर अमेरिकेने एक्सपोर्ट बंधने लावली, त्यामुळे भारतातील अनेकांना अचानक अ‍ॅक्सेस बंद झाला. एक चांगलं मॉडेल हातात आल्या आल्या हिसकावून घेतल्यासारखं वाटलं.

तर्कतीर्थ Fri, 19/06/2026 - 20:26

>>> परम ह्या महासंगणक ला जोक म्हणून हिनवणाऱ्या ची
Calculator निर्माण करण्या ची कुवत नाही

हे आजच्या दिवसातले सर्वात विनोदी विधान वाचून विचारात पडलो - आपण Calculator बनवू शकतो का?

मग लक्षात आले मला कॅल्क्युलेटर दोन प्रकारे निर्माण करता येईल

१. अमेझॉन वर किट मिळतात (https://www.amazon.in/MERISHOPP-Electronic-Calculator-Student-Without/d…)

भारताने पण असेच सुटे भाग आयात करून सुपरकंप्युटर बनवला. पण त्यासाठी किट ऑर्डर करावे लागेल आणि "असेम्बल इन इण्डीया" करण्यात काही गंमत नाही

२. त्यापेक्षा शून्य रू खर्च करून एक कॅल्क्युलेटर तयार करता येईल आणि त्याचे कोड पण सगळ्याना फुकटात वापरता येईल.

मला निदान इतकं तरी (वयाच्या ६३ व्या वर्षी) जमतं. पण माझ्या निम्म्या वयाच्या लोकांना सुंसंबद्ध आणि शुद्ध मराठीत लिखाण आणि विचार करता येईल का?

हे कोड माझ्या मशिनवर व्यवस्थित पळते. तुमच्या मशिनवर पळवायची जबाबदारी तुमची!

library(shiny)

ui <- fluidPage(

tags$head(
tags$style(HTML("
.calcbtn {
width: 100%;
height: 60px;
font-size: 22px;
margin: 2px;
}

#display {
font-size: 28px;
text-align: right;
height: 60px;
}
"))
),

titlePanel("Calculator"),

textInput(
"display",
label = NULL,
value = "0",
width = "100%"
),

fluidRow(
column(3, actionButton("b7","7",class="calcbtn")),
column(3, actionButton("b8","8",class="calcbtn")),
column(3, actionButton("b9","9",class="calcbtn")),
column(3, actionButton("div","/",class="calcbtn"))
),

fluidRow(
column(3, actionButton("b4","4",class="calcbtn")),
column(3, actionButton("b5","5",class="calcbtn")),
column(3, actionButton("b6","6",class="calcbtn")),
column(3, actionButton("mul","*",class="calcbtn"))
),

fluidRow(
column(3, actionButton("b1","1",class="calcbtn")),
column(3, actionButton("b2","2",class="calcbtn")),
column(3, actionButton("b3","3",class="calcbtn")),
column(3, actionButton("sub","-",class="calcbtn"))
),

fluidRow(
column(3, actionButton("b0","0",class="calcbtn")),
column(3, actionButton("dot",".",class="calcbtn")),
column(3, actionButton("eq","=",class="calcbtn")),
column(3, actionButton("add","+",class="calcbtn"))
),

fluidRow(
column(12, actionButton("clr","C",class="calcbtn"))
)
)

server <- function(input, output, session) {

expr <- reactiveVal("")

append_char <- function(x) {
expr(paste0(expr(), x))
updateTextInput(session, "display", value = expr())
}

observeEvent(input$b0, append_char("0"))
observeEvent(input$b1, append_char("1"))
observeEvent(input$b2, append_char("2"))
observeEvent(input$b3, append_char("3"))
observeEvent(input$b4, append_char("4"))
observeEvent(input$b5, append_char("5"))
observeEvent(input$b6, append_char("6"))
observeEvent(input$b7, append_char("7"))
observeEvent(input$b8, append_char("8"))
observeEvent(input$b9, append_char("9"))

observeEvent(input$add, append_char("+"))
observeEvent(input$sub, append_char("-"))
observeEvent(input$mul, append_char("*"))
observeEvent(input$div, append_char("/"))
observeEvent(input$dot, append_char("."))

observeEvent(input$clr,{
expr("")
updateTextInput(session,"display",value="0")
})

observeEvent(input$eq,{

result <- tryCatch(
eval(parse(text = expr())),
error = function(e) "Error"
)

expr(as.character(result))
updateTextInput(
session,
"display",
value = as.character(result)
)
})
}

shinyApp(ui, server)

तर्कतीर्थ Fri, 19/06/2026 - 20:35

आणखी एक मॉडेल

आमचे येथे ग्राहकांच्या पसंतीनुसार Calculator निर्माण करून मिळतील. -

# Basic Electronic Calculator -- Shiny app
# Single-file app. Run with: shiny::runApp("C:/R Projects/calculator")
# Mouse + physical-keyboard input (digits, . + - * /, Enter/=, %, Backspace, Esc).

library(shiny)

# ---- helpers (pure) --------------------------------------------------------
is_bad <- function(x) length(x) == 0 || is.na(x) || is.nan(x) || is.infinite(x)

# Format a numeric result for the display: trims float noise, no padding/trailing zeros.
fmt <- function(x) if (is_bad(x)) "Error" else format(x, digits = 12, trim = TRUE)

compute <- function(a, b, op) switch(op,
"+" = a + b,
"-" = a - b,
"*" = a * b,
"/" = if (b == 0) NaN else a / b
)

sym <- function(op) switch(op, "+" = "+", "-" = "−", "*" = "×", "/" = "÷", "")

# A keypad button rendered as a Shiny action-button (any .action-button works).
key <- function(id, label, cls) tags$button(
id = id, type = "button",
class = paste("btn action-button", cls), label
)

# ---- UI --------------------------------------------------------------------
css <- "
:root{--num:#505050;--fn:#a5a5a5;--op:#ff9f0a;}
body{background:#000;}
.calc{max-width:340px;margin:24px auto;background:#000;border-radius:28px;
padding:18px 14px;box-shadow:0 12px 40px rgba(0,0,0,.6);}
.display{color:#fff;text-align:right;padding:18px 14px 6px;min-height:120px;
display:flex;flex-direction:column;justify-content:flex-end;}
.subdisplay{font-size:20px;color:#8a8a8e;min-height:24px;font-weight:300;
font-family:'Helvetica Neue',Arial,sans-serif;}
.subdisplay .shiny-text-output{display:inline;}
.maindisplay{font-size:60px;font-weight:300;line-height:1.05;overflow:hidden;
white-space:nowrap;font-family:'Helvetica Neue',Arial,sans-serif;}
.maindisplay .shiny-text-output{display:inline;}
.keys{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;padding:6px;}
.keys .btn{height:68px;border:none;border-radius:50%;font-size:28px;font-weight:400;
padding:0;color:#fff;transition:filter .08s;outline:none;box-shadow:none;}
.keys .btn:focus{outline:none;}
.keys .btn:active{filter:brightness(1.35);}
.btn-num{background:var(--num)!important;color:#fff!important;}
.btn-fn{background:var(--fn)!important;color:#000!important;}
.btn-op{background:var(--op)!important;color:#fff!important;}
.btn-zero{grid-column:span 2;border-radius:34px!important;text-align:left;
padding-left:28px!important;}
"

# JS: route physical keystrokes through a single Shiny input ('keypress').
keyjs <- "
document.addEventListener('keydown', function(e){
var k = e.key;
var ok = '0123456789.+-*/=%'.indexOf(k) >= 0 ||
['Enter','Backspace','Escape'].indexOf(k) >= 0;
if (!ok || typeof Shiny === 'undefined') return;
e.preventDefault();
Shiny.setInputValue('keypress', k + '|' + Date.now(), {priority:'event'});
});
"

ui <- fluidPage(
tags$head(tags$title("Calculator"), tags$style(HTML(css))),
div(class = "calc",
div(class = "display",
div(class = "subdisplay", textOutput("sub")),
div(class = "maindisplay", textOutput("main"))
),
div(class = "keys",
key("ac", "AC", "btn-fn"),
key("neg", "+/−", "btn-fn"),
key("pct", "%", "btn-fn"),
key("op_div", "÷", "btn-op"),

key("d7", "7", "btn-num"), key("d8", "8", "btn-num"), key("d9", "9", "btn-num"),
key("op_mul", "×", "btn-op"),

key("d4", "4", "btn-num"), key("d5", "5", "btn-num"), key("d6", "6", "btn-num"),
key("op_sub", "−", "btn-op"),

key("d1", "1", "btn-num"), key("d2", "2", "btn-num"), key("d3", "3", "btn-num"),
key("op_add", "+", "btn-op"),

key("d0", "0", "btn-num btn-zero"),
key("dot", ".", "btn-num"),
key("eq", "=", "btn-op")
)
),
tags$script(HTML(keyjs))
)

# ---- Server ----------------------------------------------------------------
server <- function(input, output, session) {
rv <- reactiveValues(
display = "0", stored = NULL, op = NULL,
fresh = TRUE, error = FALSE, lastOp = NULL, lastOperand = NULL
)

reset_all <- function() {
rv$display <- "0"; rv$stored <- NULL; rv$op <- NULL
rv$fresh <- TRUE; rv$error <- FALSE
rv$lastOp <- NULL; rv$lastOperand <- NULL
}
set_error <- function() {
rv$display <- "Error"; rv$error <- TRUE
rv$op <- NULL; rv$stored <- NULL; rv$fresh <- TRUE
}

press_digit <- function(d) {
if (rv$error) reset_all()
if (rv$fresh || rv$display == "0") {
rv$display <- d; rv$fresh <- FALSE
} else if (nchar(gsub("[^0-9]", "", rv$display)) < 12) {
rv$display <- paste0(rv$display, d)
}
}

press_dot <- function() {
if (rv$error) reset_all()
if (rv$fresh) { rv$display <- "0."; rv$fresh <- FALSE; return() }
if (!grepl(".", rv$display, fixed = TRUE)) rv$display <- paste0(rv$display, ".")
}

press_op <- function(o) {
if (rv$error) return()
cur <- as.numeric(rv$display)
if (!is.null(rv$op) && !rv$fresh) { # chain: evaluate the pending op first
res <- compute(rv$stored, cur, rv$op)
if (is_bad(res)) { set_error(); return() }
rv$display <- fmt(res); rv$stored <- res
} else {
rv$stored <- cur
}
rv$op <- o; rv$fresh <- TRUE
}

press_eq <- function() {
if (rv$error) return()
cur <- as.numeric(rv$display)
if (!is.null(rv$op)) {
rhs <- cur
res <- compute(rv$stored, rhs, rv$op)
rv$lastOp <- rv$op; rv$lastOperand <- rhs
} else if (!is.null(rv$lastOp)) { # press = again -> repeat last op
res <- compute(cur, rv$lastOperand, rv$lastOp)
} else {
return()
}
if (is_bad(res)) { set_error(); return() }
rv$display <- fmt(res); rv$stored <- res; rv$op <- NULL; rv$fresh <- TRUE
}

press_pct <- function() {
if (rv$error) return()
cur <- as.numeric(rv$display)
res <- if (!is.null(rv$op) && rv$op %in% c("+", "-")) rv$stored * cur / 100 else cur / 100
if (is_bad(res)) { set_error(); return() }
rv$display <- fmt(res); rv$fresh <- TRUE
}

press_neg <- function() {
if (rv$error || rv$display %in% c("0", "0.")) return()
rv$display <- if (startsWith(rv$display, "-")) substring(rv$display, 2)
else paste0("-", rv$display)
}

press_back <- function() {
if (rv$error) { reset_all(); return() }
if (rv$fresh) return()
s <- rv$display; n <- nchar(s)
if (n <= 1 || (n == 2 && startsWith(s, "-"))) { rv$display <- "0"; rv$fresh <- TRUE }
else rv$display <- substr(s, 1, n - 1)
}

# ---- wire buttons ----
lapply(0:9, function(d)
observeEvent(input[[paste0("d", d)]], press_digit(as.character(d)), ignoreInit = TRUE))
observeEvent(input$dot, press_dot(), ignoreInit = TRUE)
observeEvent(input$op_add, press_op("+"), ignoreInit = TRUE)
observeEvent(input$op_sub, press_op("-"), ignoreInit = TRUE)
observeEvent(input$op_mul, press_op("*"), ignoreInit = TRUE)
observeEvent(input$op_div, press_op("/"), ignoreInit = TRUE)
observeEvent(input$eq, press_eq(), ignoreInit = TRUE)
observeEvent(input$ac, reset_all(), ignoreInit = TRUE)
observeEvent(input$neg, press_neg(), ignoreInit = TRUE)
observeEvent(input$pct, press_pct(), ignoreInit = TRUE)

# ---- wire keyboard ----
observeEvent(input$keypress, {
k <- strsplit(input$keypress, "|", fixed = TRUE)[[1]][1]
if (k %in% as.character(0:9)) press_digit(k)
else if (k == ".") press_dot()
else if (k == "+") press_op("+")
else if (k == "-") press_op("-")
else if (k == "*") press_op("*")
else if (k == "/") press_op("/")
else if (k %in% c("=", "Enter")) press_eq()
else if (k == "%") press_pct()
else if (k == "Backspace") press_back()
else if (k == "Escape") reset_all()
}, ignoreInit = TRUE)

# ---- outputs ----
output$main <- renderText(rv$display)
output$sub <- renderText(if (is.null(rv$op)) "" else paste0(fmt(rv$stored), " ", sym(rv$op)))
}

shinyApp(ui, server)

# Basic Electronic Calculator -- Shiny app
# Single-file app. Run with: shiny::runApp("C:/R Projects/calculator")
# Mouse + physical-keyboard input (digits, . + - * /, Enter/=, %, Backspace, Esc).

library(shiny)

# ---- helpers (pure) --------------------------------------------------------
is_bad <- function(x) length(x) == 0 || is.na(x) || is.nan(x) || is.infinite(x)

# Format a numeric result for the display: trims float noise, no padding/trailing zeros.
fmt <- function(x) if (is_bad(x)) "Error" else format(x, digits = 12, trim = TRUE)

compute <- function(a, b, op) switch(op,
"+" = a + b,
"-" = a - b,
"*" = a * b,
"/" = if (b == 0) NaN else a / b
)

sym <- function(op) switch(op, "+" = "+", "-" = "−", "*" = "×", "/" = "÷", "")

# A keypad button rendered as a Shiny action-button (any .action-button works).
key <- function(id, label, cls) tags$button(
id = id, type = "button",
class = paste("btn action-button", cls), label
)

# ---- UI --------------------------------------------------------------------
css <- "
:root{--num:#505050;--fn:#a5a5a5;--op:#ff9f0a;}
body{background:#000;}
.calc{max-width:340px;margin:24px auto;background:#000;border-radius:28px;
padding:18px 14px;box-shadow:0 12px 40px rgba(0,0,0,.6);}
.display{color:#fff;text-align:right;padding:18px 14px 6px;min-height:120px;
display:flex;flex-direction:column;justify-content:flex-end;}
.subdisplay{font-size:20px;color:#8a8a8e;min-height:24px;font-weight:300;
font-family:'Helvetica Neue',Arial,sans-serif;}
.subdisplay .shiny-text-output{display:inline;}
.maindisplay{font-size:60px;font-weight:300;line-height:1.05;overflow:hidden;
white-space:nowrap;font-family:'Helvetica Neue',Arial,sans-serif;}
.maindisplay .shiny-text-output{display:inline;}
.keys{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;padding:6px;}
.keys .btn{height:68px;border:none;border-radius:50%;font-size:28px;font-weight:400;
padding:0;color:#fff;transition:filter .08s;outline:none;box-shadow:none;}
.keys .btn:focus{outline:none;}
.keys .btn:active{filter:brightness(1.35);}
.btn-num{background:var(--num)!important;color:#fff!important;}
.btn-fn{background:var(--fn)!important;color:#000!important;}
.btn-op{background:var(--op)!important;color:#fff!important;}
.btn-zero{grid-column:span 2;border-radius:34px!important;text-align:left;
padding-left:28px!important;}
"

# JS: route physical keystrokes through a single Shiny input ('keypress').
keyjs <- "
document.addEventListener('keydown', function(e){
var k = e.key;
var ok = '0123456789.+-*/=%'.indexOf(k) >= 0 ||
['Enter','Backspace','Escape'].indexOf(k) >= 0;
if (!ok || typeof Shiny === 'undefined') return;
e.preventDefault();
Shiny.setInputValue('keypress', k + '|' + Date.now(), {priority:'event'});
});
"

ui <- fluidPage(
tags$head(tags$title("Calculator"), tags$style(HTML(css))),
div(class = "calc",
div(class = "display",
div(class = "subdisplay", textOutput("sub")),
div(class = "maindisplay", textOutput("main"))
),
div(class = "keys",
key("ac", "AC", "btn-fn"),
key("neg", "+/−", "btn-fn"),
key("pct", "%", "btn-fn"),
key("op_div", "÷", "btn-op"),

key("d7", "7", "btn-num"), key("d8", "8", "btn-num"), key("d9", "9", "btn-num"),
key("op_mul", "×", "btn-op"),

key("d4", "4", "btn-num"), key("d5", "5", "btn-num"), key("d6", "6", "btn-num"),
key("op_sub", "−", "btn-op"),

key("d1", "1", "btn-num"), key("d2", "2", "btn-num"), key("d3", "3", "btn-num"),
key("op_add", "+", "btn-op"),

key("d0", "0", "btn-num btn-zero"),
key("dot", ".", "btn-num"),
key("eq", "=", "btn-op")
)
),
tags$script(HTML(keyjs))
)

# ---- Server ----------------------------------------------------------------
server <- function(input, output, session) {
rv <- reactiveValues(
display = "0", stored = NULL, op = NULL,
fresh = TRUE, error = FALSE, lastOp = NULL, lastOperand = NULL
)

reset_all <- function() {
rv$display <- "0"; rv$stored <- NULL; rv$op <- NULL
rv$fresh <- TRUE; rv$error <- FALSE
rv$lastOp <- NULL; rv$lastOperand <- NULL
}
set_error <- function() {
rv$display <- "Error"; rv$error <- TRUE
rv$op <- NULL; rv$stored <- NULL; rv$fresh <- TRUE
}

press_digit <- function(d) {
if (rv$error) reset_all()
if (rv$fresh || rv$display == "0") {
rv$display <- d; rv$fresh <- FALSE
} else if (nchar(gsub("[^0-9]", "", rv$display)) < 12) {
rv$display <- paste0(rv$display, d)
}
}

press_dot <- function() {
if (rv$error) reset_all()
if (rv$fresh) { rv$display <- "0."; rv$fresh <- FALSE; return() }
if (!grepl(".", rv$display, fixed = TRUE)) rv$display <- paste0(rv$display, ".")
}

press_op <- function(o) {
if (rv$error) return()
cur <- as.numeric(rv$display)
if (!is.null(rv$op) && !rv$fresh) { # chain: evaluate the pending op first
res <- compute(rv$stored, cur, rv$op)
if (is_bad(res)) { set_error(); return() }
rv$display <- fmt(res); rv$stored <- res
} else {
rv$stored <- cur
}
rv$op <- o; rv$fresh <- TRUE
}

press_eq <- function() {
if (rv$error) return()
cur <- as.numeric(rv$display)
if (!is.null(rv$op)) {
rhs <- cur
res <- compute(rv$stored, rhs, rv$op)
rv$lastOp <- rv$op; rv$lastOperand <- rhs
} else if (!is.null(rv$lastOp)) { # press = again -> repeat last op
res <- compute(cur, rv$lastOperand, rv$lastOp)
} else {
return()
}
if (is_bad(res)) { set_error(); return() }
rv$display <- fmt(res); rv$stored <- res; rv$op <- NULL; rv$fresh <- TRUE
}

press_pct <- function() {
if (rv$error) return()
cur <- as.numeric(rv$display)
res <- if (!is.null(rv$op) && rv$op %in% c("+", "-")) rv$stored * cur / 100 else cur / 100
if (is_bad(res)) { set_error(); return() }
rv$display <- fmt(res); rv$fresh <- TRUE
}

press_neg <- function() {
if (rv$error || rv$display %in% c("0", "0.")) return()
rv$display <- if (startsWith(rv$display, "-")) substring(rv$display, 2)
else paste0("-", rv$display)
}

press_back <- function() {
if (rv$error) { reset_all(); return() }
if (rv$fresh) return()
s <- rv$display; n <- nchar(s)
if (n <= 1 || (n == 2 && startsWith(s, "-"))) { rv$display <- "0"; rv$fresh <- TRUE }
else rv$display <- substr(s, 1, n - 1)
}

# ---- wire buttons ----
lapply(0:9, function(d)
observeEvent(input[[paste0("d", d)]], press_digit(as.character(d)), ignoreInit = TRUE))
observeEvent(input$dot, press_dot(), ignoreInit = TRUE)
observeEvent(input$op_add, press_op("+"), ignoreInit = TRUE)
observeEvent(input$op_sub, press_op("-"), ignoreInit = TRUE)
observeEvent(input$op_mul, press_op("*"), ignoreInit = TRUE)
observeEvent(input$op_div, press_op("/"), ignoreInit = TRUE)
observeEvent(input$eq, press_eq(), ignoreInit = TRUE)
observeEvent(input$ac, reset_all(), ignoreInit = TRUE)
observeEvent(input$neg, press_neg(), ignoreInit = TRUE)
observeEvent(input$pct, press_pct(), ignoreInit = TRUE)

# ---- wire keyboard ----
observeEvent(input$keypress, {
k <- strsplit(input$keypress, "|", fixed = TRUE)[[1]][1]
if (k %in% as.character(0:9)) press_digit(k)
else if (k == ".") press_dot()
else if (k == "+") press_op("+")
else if (k == "-") press_op("-")
else if (k == "*") press_op("*")
else if (k == "/") press_op("/")
else if (k %in% c("=", "Enter")) press_eq()
else if (k == "%") press_pct()
else if (k == "Backspace") press_back()
else if (k == "Escape") reset_all()
}, ignoreInit = TRUE)

# ---- outputs ----
output$main <- renderText(rv$display)
output$sub <- renderText(if (is.null(rv$op)) "" else paste0(fmt(rv$stored), " ", sym(rv$op)))
}

shinyApp(ui, server)

Rajesh188 Fri, 19/06/2026 - 20:40

अमेरिका नी भारता लाच नाही तर सर्व गैर अमेरिकन, आणि जगातील सर्व देशान तंत्र ज्ञान देण्यास बंदी केली आहे. त्या साठी त्यांनी दिलेली सर्व च कारण पटणारी नाहीत.
युरोपियन union नी ai ला त्यांच्या नियमात बसवयला सुरुवात केली आहे. भारता सहित चीन आणि बाकी देशांनी पण डेटा सुरक्षा वर भर दिला आहे.
अमेरिकन ai आधारित उद्योग ना जगात मोकळे रान मिळू नये असे उपाय देश करत आहेत.
त्या साठी दबाव तंत्र म्हणून बंदी च निर्णय असावा.
अपेक्षित फायदा मिळत नाही हे दिसले की टेक कंपन्या प्रचंड दबाव निर्माण करतील. नेहमी सारखं च अमेरिका बंदी मागे घेईल...