@א.מ.ד. נשמע מעולה! העתיד כבר כאן... עוד מעט ומנוע החיפוש של גוגל ייקרא 'מיושן'...
השאל שלי היא רק לגבי אבטחת נתונים-נתוני גלישה, פרטי אשראי ופרטים נוספים-היכן זה נשמר וכיצד זה מאובטח?
בקיצור, מי החברה שעומדת מאחורי הדפדפן הלזה ומהי רמת מהימנותה?
@א.מ.ד. נשמע מעולה! העתיד כבר כאן... עוד מעט ומנוע החיפוש של גוגל ייקרא 'מיושן'...
השאל שלי היא רק לגבי אבטחת נתונים-נתוני גלישה, פרטי אשראי ופרטים נוספים-היכן זה נשמר וכיצד זה מאובטח?
בקיצור, מי החברה שעומדת מאחורי הדפדפן הלזה ומהי רמת מהימנותה?
@שלויימה בבקשה החלף כותרת לתקינה ומובנת יותר.
כנאמר בחוקי הפורום:
כותרת הנושא חייבת להיות עניינית ומרמזת על תוכן הנושא! נושא עם כותרת כמו "בעיה במחשב" או "אופיס" לא תקינה! , מיותר לציין שאסור לכלול מילים כמו דחוף וכ"ש לא דחוףףף וכד' - כותרת תקינה הינה לדוגמא: בירור | מחשב thinkpad - איפה מומלץ לקנות או לדוגמא תקלה | תשתית בזק - ניתוקים לעתים קרובות, דוגמאות נוספות והסבר על כותרת תקינה תוכלו לראות כאן
@אליעזר-לוי בעיקרון יש כזה מכשיר אבל זה לא אנדרואיד
שלט שבת
@oryadaniely נוצר ע"י?
הקטנתי את גודל הטקסט והמרווח בין השורות כך שידמה יותר למקור, לגבי שאר הבאגים, אין באפשרותי לטפל בכך כעת, כי עכשיו האתר כן מוצג לי כתקנו וממילא הסקריפט לא נמצא בפעולה כעת.
@י.-פל. כתב בעזרה | AI STUDIO מוצג כטקסט במקום מרקדאון:
שפר זאת
לאחר יו"כ בעז"ה. מקווה שתסלח לי על כך ביו"כ...
@י.-פל. כתב בעזרה | AI STUDIO מוצג כטקסט במקום מרקדאון:
[אפשר להכניס לסקריפט שלי?]
בשמחה! רק קודם צריך לפתור את הבאגים שיש לו, וכמדומני שהוא עושה גם כמה בעיות עם הסרגל שלך אאל"ט. לא בדקתי זאת באופן מעמיק, אבל כמדומני שכך.
אשמח גם אם תעדכן את הסקריפט שלך עם השיפורים שכתבתי בפרטי בשעתו.
בעז"ה יצרתי בעזרת AI STUDIO סקריפט לטמפרמונקי שמיישם עיצוב מרקדאון מלא כשהאתר לא מציג זאת טוב.
// ==UserScript==
// @name AI Studio Markdown Fallback Renderer v10 (Final with Code Utils)
// @namespace http://tampermonkey.net/
// @version 1.0
// @description Adds copy/download buttons and language titles to code blocks after fixing rendering issues.
// @author Your Name & AI
// @match https://aistudio.google.com/prompts/*
// @require https://cdn.jsdelivr.net/npm/marked/marked.min.js
// @grant GM_addStyle
// @run-at document-start
// ==/UserScript==
(function() {
'use strict';
// -- שלב 0: הזרקת CSS עם שליטה על העיצוב --
// כאן תוכל לשנות את הערכים כדי להתאים את העיצוב לטעמך
GM_addStyle(`
/* ------------------------------------------- */
/* --- אזור שליטה על עיצוב --- */
/* ------------------------------------------- */
:root {
/* --- הגדרות לטקסט רגיל --- */
--fallback-text-font-size: 5px /* גודל גופן לטקסט רגיל */
--fallback-text-line-height: 0.1; /* רווח בין שורות לטקסט רגיל */
/* --- הגדרות לבלוק קוד --- */
--fallback-code-font-size: 14px; /* גודל גופן לקוד */
--fallback-code-line-height: 1.45; /* רווח בין שורות לקוד */
}
/* ------------------------------------------- */
/* --- סוף אזור שליטה --- */
/* ------------------------------------------- */
.fallback-rendered p, .fallback-rendered ul, .fallback-rendered ol, .fallback-rendered li {
font-family: 'Google Sans Text', Inter, sans-serif !important;
font-size: var(--fallback-text-font-size) !important;
line-height: var(--fallback-text-line-height) !important;
color: var(--color-v3-text);
margin-block-start: 0 !important;
margin-block-end: 1em !important;
}
.fallback-rendered h1, .fallback-rendered h2, .fallback-rendered h3 {
font-family: 'Google Sans', Roboto, Arial, sans-serif !important;
margin-top: 1.2em !important; margin-bottom: 0.4em !important;
}
.fallback-rendered pre {
position: relative;
background-color: var(--color-v3-surface-container-high, #f1f3f4);
border: 1px solid var(--color-v3-outline-var, #e0e0e0);
border-radius: 8px;
margin: 1em 0 !important;
padding: 16px;
padding-top: 48px;
overflow-x: auto;
}
.code-block-header {
position: absolute; top: 0; left: 0; right: 0;
display: flex; justify-content: space-between; align-items: center;
background-color: rgba(0,0,0,0.05);
padding: 5px 12px;
border-bottom: 1px solid var(--color-v3-outline-var, #e0e0e0);
border-top-left-radius: 8px; border-top-right-radius: 8px;
}
.code-language {
font-family: 'Google Sans Mono', monospace; font-size: 13px;
font-weight: 500; color: var(--color-v3-text-var); text-transform: capitalize;
}
.code-util-buttons {
display: flex; gap: 8px;
}
.code-util-btn {
background-color: rgba(0,0,0,0.08); color: var(--color-v3-text);
border: none; cursor: pointer; padding: 4px 10px;
border-radius: 5px; font-size: 12px; font-family: 'Google Sans Text', sans-serif;
transition: background-color 0.2s ease;
}
.code-util-btn:hover { background-color: rgba(0,0,0,0.15); }
.code-util-btn.copied { background-color: #28a745; color: white; }
.fallback-rendered code {
font-family: 'Google Sans Mono', monospace !important;
font-size: var(--fallback-code-font-size) !important;
line-height: var(--fallback-code-line-height) !important;
white-space: pre-wrap; word-wrap: break-word;
}
.fallback-rendered pre > code { background-color: transparent !important; padding: 0 !important; }
.fallback-rendered :not(pre) > code {
background-color: var(--color-v3-surface-container, #e8eaed);
padding: 2px 6px; border-radius: 4px; font-size: 0.9em;
}
/* Dark Theme Adjustments */
[data-theme="dark"] .fallback-rendered pre,
[data-theme="dark"] .code-block-header {
background-color: #202124; border-color: #3c4043;
}
[data-theme="dark"] .code-util-btn { background-color: rgba(255,255,255,0.1); }
[data-theme="dark"] .code-util-btn:hover { background-color: rgba(255,255,255,0.2); }
[data-theme="dark"] .fallback-rendered :not(pre) > code { background-color: #3c4043; }
`);
// -- שלב 1: הגדרת marked.js עם סניטציה --
marked.setOptions({
sanitize: true,
gfm: true // Enable GitHub Flavored Markdown for better tables and code blocks
});
// -- שלב 2: יצירת מדיניות אבטחה (Trusted Types) --
let fallbackPolicy;
try {
if (window.trustedTypes && window.trustedTypes.createPolicy) {
fallbackPolicy = window.trustedTypes.createPolicy('markdown-fallback-renderer-v10', {
createHTML: (htmlString) => htmlString
});
}
} catch (e) { /* Policy might already exist, which is fine. */ }
function setSanitizedHTML(element, html) {
try {
if (fallbackPolicy) { element.innerHTML = fallbackPolicy.createHTML(html); }
else { element.innerHTML = html; }
} catch (e) { console.error("AI Studio Fallback: Error setting innerHTML.", e); }
}
// -- שלב 3: זיהוי התקלה --
const setErrorFlag = (event) => {
const errorMessage = (event.reason && event.reason.message) ? event.reason.message : event.message;
if (errorMessage && errorMessage.includes('WebAssembly.instantiate')) {
if (!window.nativeMarkdownFailed) {
console.log('AI Studio Fallback: Native Wasm renderer failed. Activating fallback.');
}
window.nativeMarkdownFailed = true;
}
};
window.addEventListener('error', setErrorFlag);
window.addEventListener('unhandledrejection', setErrorFlag);
// -- שלב 4: פונקציה להוספת כלי עזר לבלוק קוד --
function enhanceCodeBlock(preElement) {
if (!preElement || preElement.hasAttribute('data-buttons-added')) return;
const codeElement = preElement.querySelector('code');
if (!codeElement) return;
const header = document.createElement('div');
header.className = 'code-block-header';
const langMatch = codeElement.className.match(/language-(\S+)/);
const lang = langMatch ? langMatch[1] : 'text';
const langSpan = document.createElement('span');
langSpan.className = 'code-language';
langSpan.textContent = lang;
const buttonWrapper = document.createElement('div');
buttonWrapper.className = 'code-util-buttons';
const copyBtn = document.createElement('button');
copyBtn.className = 'code-util-btn';
copyBtn.textContent = 'העתק';
const downloadBtn = document.createElement('button');
downloadBtn.className = 'code-util-btn';
downloadBtn.textContent = 'הורד';
buttonWrapper.append(copyBtn, downloadBtn);
header.append(langSpan, buttonWrapper);
preElement.prepend(header);
preElement.setAttribute('data-buttons-added', 'true');
copyBtn.addEventListener('click', () => {
navigator.clipboard.writeText(codeElement.innerText).then(() => {
copyBtn.textContent = 'הועתק!';
copyBtn.classList.add('copied');
setTimeout(() => {
copyBtn.textContent = 'העתק';
copyBtn.classList.remove('copied');
}, 2000);
});
});
downloadBtn.addEventListener('click', () => {
const fileExtension = {
javascript: 'js', html: 'html', css: 'css', json: 'json',
python: 'py', shell: 'sh', text: 'txt'
}[lang] || 'txt';
const filename = `code-snippet.${fileExtension}`;
const blob = new Blob([codeElement.innerText], { type: 'text/plain;charset=utf-8' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = filename;
a.click();
URL.revokeObjectURL(url);
});
}
// -- שלב 5: מנגנון התיקון הראשי --
const runFallbackRenderer = () => {
if (!window.nativeMarkdownFailed) return;
// שלב א: עיבוד המרקדאון
document.querySelectorAll('ms-text-chunk > div').forEach(el => {
if (el.hasAttribute('data-fallback-rendered') || el.closest('button, input, mat-icon, ms-thought-chunk')) {
return;
}
if (el.childNodes.length === 1 && el.firstChild.nodeType === Node.TEXT_NODE) {
const text = el.innerText;
if (text.includes('```')) {
const renderedHtml = marked.parse(text);
setSanitizedHTML(el, renderedHtml);
el.setAttribute('data-fallback-rendered', 'true');
el.classList.add('fallback-rendered');
}
}
});
// שלב ב: שדרוג בלוקי הקוד
document.querySelectorAll('.fallback-rendered pre:not([data-buttons-added="true"])').forEach(enhanceCodeBlock);
};
// -- שלב 6: הפעלה --
window.addEventListener('load', function() {
console.log('AI Studio Fallback: Page loaded. Starting renderer interval.');
setInterval(runFallbackRenderer, 1500);
});
})();
העיצוב עדיין טעון שיפור, כמו"כ יש באג שבכל כתיבת תשובה של המודל יש לרענן את הדף מכיוון שהתשובה מוצגת חלקית.
@זונדל וואו! רק חבל שאין לי התקנות וכ"ש גוגל פליי...
אשמח מאוד אם תעשה את זה גם בתור אתר אונליין/תוכנה למחשב. (נראה לי שבתור אתר זה יצא יותר יפה ומושך מבחינה עיצובית.)
או שפשוט תעלה לפה את קבצי הקודים, ואתן לידידי מר AI ליצור ממנו את הנדרש.
@DHOC979 כתב בהצעת ייעול | פיתחתי לעצמי דף בית לגוגל!!:
@מישהו12 אתה פיתחת את האתר הזה?? (דף-בית.קום)
@מתכנת-חובב אין אפשרות להמיר את קודי הריאקט לקבצי קוד רגילים?
לאחר זמן רב בו אני מתפלא מדוע אפשרות הורדת הקודים ב Base44 מתאפשרת רק לבעלי מנוי...
בעז"ה יצרתי בעזרת AI סימניית דפדפן שבלחיצה עליה יורדים כל קבצי הקוד של הפרויקט שלכם למחשב.
כמובן שלשם כך אתם אמורים להיות בדאשבורד של האפליקציה על קטעי הקודים. (התיקיות לא חייבות להיות פתוחות - הסימנייה פותחת את כולן אוטומטית כדי שהקודים יהיו גלויים)
תרגום הדפדפן בדף - צריך להיות כבוי. אם הוא דלוק הסימנייה תציג לכם אזהרה ולא תוריד את הקודים.
javascript:(async function(){if(document.documentElement.classList.contains("translated-ltr")||document.documentElement.classList.contains("translated-rtl")||document.querySelector("title")&&document.querySelector("title").hasAttribute("_msthash"))return void alert("⚠%EF%B8%8F תרגום הדפדפן זוהה כפועל בדף זה. זה עלול לגרום לקוד שגוי.\n\nאנא בטל את התרגום באופן ידני (בדרך כלל דרך אייקון בשורת הכתובת) והפעל את הסימנייה מחדש.");const e=e=>new Promise(t=>setTimeout(t,e)),t=(t,n)=>{const o=document.createElement("a"),r=new Blob([n],{type:"text/plain"});o.href=URL.createObjectURL(r),o.download=t,document.body.appendChild(o),o.click(),document.body.removeChild(o),URL.revokeObjectURL(o.href)};console.log("שלב 1: פותח תיקיות באופן רקורסיבי...");let n=0;for(;n<10;){const o=Array.from(document.querySelectorAll('nav button[data-state="closed"]')).filter((e=>e.querySelector(".lucide-folder")));if(0===o.length)break;for(const t of o)t.click(),await e(50);await e(400),n++}await e(500),console.log("שלב 2: איסוף והורדת כל הקבצים...");const o=document.querySelectorAll("nav button"),r=[];if(o.forEach((e=>{const t=e.querySelector("svg"),n=e.querySelector(".lucide-folder"),o=e.querySelector("span.truncate");if(t&&!n&&o){let t=o.innerText.trim();t.includes(".")||(t+=".js"),r.push({button:e,filename:t})}})),0===r.length)return void alert("לא נמצאו קבצים להורדה בתפריט.");for(const n of r){console.log(`מעבד את הקובץ: ${n.filename}...`),n.button.click(),await e(750);const r=document.querySelector(".monaco-editor .view-lines");if(r){const o=Array.from(r.querySelectorAll(".view-line")).map((e=>e.innerText)).join("\n");t(n.filename,o),await e(200)}else console.error(`לא נמצא עורך קוד עבור הקובץ ${n.filename}`)}alert(`ההורדה הושלמה! 👍 (הורדו ${r.length} קבצים בס"ד)`)})();
שימו רק לב כי הקודים של Base44 לא בנויים כאתר סטטי עם html, css, js, אלא כולם קבצי js/jsx בהם נמצאים גם הפונקציונליות וגם העיצוב של האפליקציה עם ספריית React. (כך ע"פ AI Studio)
אם בכל זאת תרצו את ה html של האפליקציה, יהיה עליכם לשמור אותם מהאתר המוכן עצמו (ctrl+s)
@א.מ.ד. קודם כל -ברגוע
חשוב בהיגיון - האם הגיבוי האוטומטי פעיל? אם כן הרי טוב, אם לא, ייתכן שהוא עשה אי פעם גיבוי לכרטיס זיכרון כלשהו.
אלו דברים פשוטים אך לפעמים שוכחים אותם מרוב לחץ...
זה המקסימום שיכולתי לעזור...
טוב חברים, אז אחרי שהשרשור הזה התארך, התחמם, ונגע כמעט בכל נושא אפשרי, רציתי לעשות קצת סדר ולסגור את הסיפור.
לאחר דין ודברים ארוך ומעמיק, שבו הועלו צדדים רבים ומגוונים – החל מההיבט הטכני, דרך שאלות עקרוניות של קניין רוחני וגזל, כמו ש @A0533057932, @צדיק-וטוב-לו-0 ו @mefateach העלו, ובצדק, את הבעייתיות ההלכתית והמוסרית – האם זה לא גזל להשתמש במשאבים של נטפרי בלי רשותם המפורשת? גם אם זה עולה להם "פחות משווה פרוטה" על כל בדיקה.
במקביל, @צדיק-תמים הזכיר לנו את העמדה העקרונית של נטפרי, כפי שנאמרה על ידי @magicode בעבר – הם לא רוצים שיקחו את מאגר המידע שלהם וישתמשו בו לסינונים אחרים, פחות טובים.
אז בקיצור כדי לחתוך את כל הדיונים והספקולציות, פניתי ישירות ל-@magicode כדי לשמוע את דעתו בנושא.
הצגתי לו את הרעיון ואת הדיון שהיה פה, והתשובה שלו הייתה ברורה וחד משמעית: נטפרי לא מאשרת מהלך כזה.
הסיבות לכך אינן רק אידיאולוגיות, אלא גם מעשיות וכלכליות. הוא הבהיר לי כי פעולת הסינון, ובפרט סינון תמונות, כרוכה בעלויות ממשיות. הרעיון להקים שירות (אף אם הוא לזיכוי הרבים) שמתבסס על המשאבים של נטפרי ויוצר עבורה עלויות, אינו נכון ואינו מקובל על ידם. כפי ש-@magicode הסביר לי, התפיסה הנכונה היא שכמו שמשלמים על בשר כשר, כך יש ערך וחשיבות לשלם על סינון אינטרנט איכותי.
וגם אם נניח שמבחינת קנין רוחני זה לא בעיה, 'דעלך סאני לחברך לא תעביד'. ובפרט בעשי"ת...
לכן, לאור כל האמור לעיל – הן הבעיות הרבות שהעלו חברי הפורום והן התשובה הברורה שקיבלתי – החלטתי לרדת מהרעיון ולגנוז אותו עד ביאת גואל צדק (שאז כבר לא נצטרך את כל הסינונים למיניהם... "להעביר גילולים מן הארץ...").
אני חושב שהיה חשוב וטוב שהנושא עלה ונדון לעומק, לשם בירור העניין עד תומו. כעת, כל מי שיעלה בדעתו רעיון דומה בעתיד, יוכל לקרוא את השרשור הזה ולהבין את מורכבות העניין והבעייתיות שבו.
תודה רבה לכל המשתתפים, המגיבים, המעירים וכל מי שסייע להגיע לבירור הסוגיה.
@צוות-פיקוח, כמדומני שניתן לנעול את הנושא.
@EM308 תנסה אולי את אחד הפתרונות שמוצעים מהפוסט הזה והלאה:
https://mitmachim.top/post/1007658
(לא שאני מכיר את הפתרונות ויודע בכלל איך הם עובדים, אבל אולי יש שם משהו מתאים.)
@EM308 תנסה את זה
https://mitmachim.top/post/791456
@צדיק-תמים כתב בבקשה | הצעת פיתוח | API ציבורי של נטפרי:
שהמניעים שלו זה כסף
זה כבר קצת מוזר לי...
כמו"כ כמה כסף כבר אפשר לעשות מ15 ש"ח בחודש?
מילא היית אומר לי כי הוא לא פיתח API בגלל שיקולים כספיים לא הייתי גורם להפסד כספי אחר, אבל ברגע שהוא מצהיר בעצמו כי אין לו שום כוונת רווח מכל הסיפור הזה, וכי API לא קיים משיקולים שונים, זכותי המלאה ליצור API כזה מהשיקולים שלי. לא כן?
@aiib כתב בבקשה | הצעת פיתוח | API ציבורי של נטפרי:
מה שברור שזה לא יוכרע כאן בפורום כמה שהמילים יהיו חריפות...
בדיבורים - לא, במעשים - כן.
התועלת העצומה בזה רב על ההפסד.
@es0583292679 כתב בבקשה | הצעת פיתוח | API ציבורי של נטפרי:
לא חייבים שני שרתים,
מי דיבר על שני שרתים? ולמה שני שרתים?
ניתן להחיל פרוקסי על השרת המקורי, או אולי VPN,
אשמח להסבר 'פשוט' יותר איך זה בדיוק יעבוד.
@צדיק-תמים כתב בבקשה | הצעת פיתוח | API ציבורי של נטפרי:
בגלל התנגדות עקרונית שזה יאפשר לתת את הדברים הטובים של נטפרי עם סינון פחות טוב
אז לכן הוא לא עשה את זה...
לדעתי בכל אופן זה יועיל להמון מפתחים.
@מייבין-במקצת כתב בבקשה | הצעת פיתוח | API ציבורי של נטפרי:
ניסית לדבר איתם?
את האמת - לא.
אם הם פיתחו API פנימי ולא ציבורי, כנראה יש להם סיבה טובה לעשות זאת. ייתכן שאין להם אינטרס להפיץ כזה דבר או שאולי קשה להם לתחזק את זה... לוידע.
@מייבין-במקצת כתב בבקשה | הצעת פיתוח | API ציבורי של נטפרי:
הוא צריך להיות דלוק כל הזמן?
שאלה טובה. אני לא מבין בזה עד כדי כך, פשוט רעיון שחשבתי עליו. אשמח לתשובה מהמומחים.