Pages

Se afișează postările cu eticheta google. Afișați toate postările
Se afișează postările cu eticheta google. Afișați toate postările

duminică, 26 iulie 2026

Tool : F-Droid vs Google: Security, Open Source Software, and Android Privacy

A comprehensive guide to F-Droid, the open-source Android app store, and its major security and privacy differences compared to the Google ecosystem.
What is F-Droid and why does it matter for Android
F-Droid is an alternative application store for FOSS (Free and Open Source Software) designed for users who want total control over their data and installed mobile apps.
  • Total transparency through verifiable source code audited by the global developer community.
  • Complete elimination of tracking modules, advertisement networks, and telemetry code.
  • Full independence from Google Play Services and mandatory user account sign-ins.
  • Direct compilation of APK packages from verified official developer repositories.
Key benefits of using open-source applications from F-Droid
  • Zero intrusive advertisements and no hidden in-app purchases or paywalls.
  • Advanced protection for personal data privacy and web browsing history.
  • Transparent system warnings called Anti-Features for every application entry.
  • Reduced battery consumption and system resource usage without background trackers.
The philosophical divide between F-Droid and the Google ecosystem
The fundamental reasons why F-Droid stands as a true alternative to Google Play center around development philosophy and user data rights.
  • Google relies on data collection and targeted advertising while F-Droid advocates pure software freedom.
  • Google Play forces reliance on proprietary APIs while F-Droid favors open protocols like UnifiedPush.
  • F-Droid preserves developer anonymity and user digital sovereignty without central gatekeeping.
Top recommended FOSS applications available on F-Droid
  • NetGuard for granular firewall control and internet access blocking on a per-app basis.
  • NewPipe for ad-free background video playing without tracking or Google login.
  • Aegis Authenticator for secure offline two-factor authentication token management.
  • Mull and Fennec for privacy-hardened web browsing powered by Firefox engines.
Conclusion on mobile security and digital freedom on Android
Choosing F-Droid provides a higher standard of cybersecurity and privacy on mobile devices. By relying on open-source applications, you eliminate big-tech dependency and maintain full ownership of your smartphone.

miercuri, 15 iulie 2026

News : Android Studio Quail 2 stable version with multi-task and the Android Studio AI agent.

Android Studio Quail 2 is now stable and ready for you to use in production, bringing a shift to your IDE with concurrent agentic workflows, natively integrated memory leak profiling, and context-aware crash remediation. Whether you are performing a sweeping architectural overhaul, tracing a memory leak, or resolving a critical production crash, Android Studio keeps you anchored in your workspace by reducing manual friction.
In Android Studio Quail 2, we've been hard at work redesigning Agent Mode from the ground up. This new architecture provides better performance, offers more flexibility for decomposing complex tasks, and improves the suite of internal tools the agent uses to do its work.

joi, 9 iulie 2026

News : LiteRT.js, Google's high performance Web AI Inference from Google

We are excited to announce LiteRT.js, a JavaScript binding of LiteRT for running AI directly inside the web browser. By bringing the trusted on-device inference library LiteRT to the web, web developers can now run ML and AI models with maximum performance entirely locally. This means enhanced user privacy, zero server costs, and ultra-low latency for real-time experiences. For developers with existing .tflite models, LiteRT.js makes deployment to mobile and desktop web browsers smoother than ever, serving as a powerful evolution from TensorFlow.js for executing .tflite models.

marți, 7 iulie 2026

Google Apps Script : example of transition from a Google Sheet to a formatted Google Doc.

This script that automates the transition from a Google Sheet to a formatted Google Doc. Here is a breakdown of what this solution does:
Custom Menu Integration: The script adds a Custom Menu directly into your Google Sheet interface. With a single click, you can trigger processes like fetching data or generating reports, making the tool incredibly easy to use without touching the code.
This example is based on this URL : https://www.planetpython.org/opml.xml.
Intelligent Data Processing: It doesn't just copy text; it parses RSS and Atom feeds, extracts titles and links, and prepares them for your document. It intelligently handles the HYPERLINK formulas you use in Sheets, translating them into real, clickable links in your final document.
Automatic Folder Management: One of the most useful features of this script is its ability to keep your Drive organized. Instead of cluttering your root directory, the script automatically identifies the folder where your source spreadsheet is located and creates the new document right there.
Built-in Troubleshooting: I have included logging functionality throughout the code. If a link is malformed or a feed fails to load, the script logs exactly what happened, allowing you to debug issues quickly via the Apps Script Dashboard.
Let's see the source code for Google Apps Scripts:
function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu('Custom Menu')
    .addItem('Read OPML PlanetPython', 'fetchAndProcessFeed')
    .addItem('Download Selected Content', 'downloadSelectedContentWrapper')
    .addItem('Send Sheet via Email', 'sendSheetViaEmail')
    .addToUi();
}

function fetchAndProcessFeed() {
  const dateTime = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyy-MM-dd_HH-mm");
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = spreadsheet.getSheetByName(dateTime);
  
  if (!sheet) {
    sheet = spreadsheet.insertSheet(dateTime);
  } else {
    sheet.clear();
  }
  
  sheet.appendRow(["Date", "Source", "Title", "Select"]);
  
  const opmlUrl = "https://www.planetpython.org/opml.xml";
  const opmlContent = UrlFetchApp.fetch(opmlUrl).getContentText();
  const opmlDoc = XmlService.parse(opmlContent);
  const outlines = opmlDoc.getRootElement().getChild("body").getChildren("outline");
  
  outlines.forEach(outline => {
    const text = outline.getAttribute("text")?.getValue().replace(/"/g, '""').replace(/[<>&]/g, '') || "";
    const xmlUrl = outline.getAttribute("xmlUrl")?.getValue() || "";
    
    try {
      const feedContent = UrlFetchApp.fetch(xmlUrl).getContentText();
      const feedDoc = XmlService.parse(feedContent);
      const root = feedDoc.getRootElement();
      
      if (root.getName() === "rss") {
        processRssFeed(root, text, xmlUrl, sheet);
      } else if (root.getName() === "feed") {
        processAtomFeed(root, text, xmlUrl, sheet);
      }
    } catch (e) {
      Logger.log(`Error processing feed ${text} (${xmlUrl}): ${e}`);
    }
  });
}

function processRssFeed(root, source, xmlUrl, sheet) {
  const items = root.getChild("channel")?.getChildren("item") || [];
  items.forEach(item => {
    const title = item.getChild("title")?.getValue().replace(/"/g, '""').replace(/[<>&]/g, '') || "";
    const pubDate = item.getChild("pubDate")?.getValue() || "";
    const link = item.getChild("link")?.getValue().replace(/[<>&]/g, '') || xmlUrl;
    sheet.appendRow([
      pubDate,
      `=HYPERLINK("${xmlUrl}", "${source}")`,
      `=HYPERLINK("${link}", "${title}")`,
      ""
    ]);
  });
}

function processAtomFeed(root, source, xmlUrl, sheet) {
  const entries = root.getChildren("entry") || [];
  entries.forEach(entry => {
    const title = entry.getChild("title")?.getValue().replace(/"/g, '""').replace(/[<>&]/g, '') || "";
    const updated = entry.getChild("updated")?.getValue() || "";
    const link = entry.getChild("link")?.getAttribute("href")?.getValue().replace(/[<>&]/g, '') || xmlUrl;
    sheet.appendRow([
      updated,
      `=HYPERLINK("${xmlUrl}", "${source}")`,
      `=HYPERLINK("${link}", "${title}")`,
      ""
    ]);
  });
}

function downloadSelectedContentWrapper() {
  downloadSelectedContent();
}

async function downloadSelectedContent() {
  const dateTime = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyy-MM-dd_HH-mm");
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadsheet.getActiveSheet();
  const data = sheet.getDataRange().getValues();
  const doc = DocumentApp.create(`Content_${dateTime}`);
  const folderId = DriveApp.getFileById(spreadsheet.getId()).getParents().next().getId();
  DriveApp.getFileById(doc.getId()).moveTo(DriveApp.getFolderById(folderId));
  
  let contentAdded = false;
  const body = doc.getBody();
  
  for (let i = 1; i < data.length; i++) {
    const row = data[i];
    if (row[3] == 1) {
      const sourceMatch = row[1].toString().match(/^=HYPERLINK\("([^"]+)",\s*"([^"]+)"\)$/);
      const source = sourceMatch ? sourceMatch[2] : row[1].toString().replace(/[<>&]/g, '') || "Unknown source";
      const titleMatch = row[2].toString().match(/^=HYPERLINK\("([^"]+)",\s*"([^"]+)"\)$/);
      const title = titleMatch ? titleMatch[2] : row[2].toString().replace(/[<>&]/g, '');
      const link = titleMatch ? titleMatch[1] : "";
      
      Logger.log(`Processing ${title} with link: ${link}`);
      
      try {
        body.appendParagraph(source).setHeading(DocumentApp.ParagraphHeading.HEADING1);
        const titleParagraph = body.appendParagraph(title).setHeading(DocumentApp.ParagraphHeading.HEADING2);
        if (link) titleParagraph.setLinkUrl(link); // Titlu ca hyperlink
        body.appendParagraph(""); // Spațiu între intrări
        contentAdded = true;
        Logger.log(`Added ${title} with link`);
      } catch (e) {
        Logger.log(`Error processing ${title} (${link}): ${e}`);
        body.appendParagraph(source).setHeading(DocumentApp.ParagraphHeading.HEADING1);
        const titleParagraph = body.appendParagraph(title).setHeading(DocumentApp.ParagraphHeading.HEADING2);
        if (link) titleParagraph.setLinkUrl(link);
        body.appendParagraph("");
        contentAdded = true;
      }
    }
  }
  
  if (!contentAdded) {
    Logger.log("No content was added to the document.");
    body.appendParagraph("No content was selected or available.");
  }
}


function sendSheetViaEmail() {
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadsheet.getActiveSheet();
  const sheetName = sheet.getName();
  const data = sheet.getDataRange().getValues();
  
  let htmlContent = `
    <html>
      <head>
        <title>${sheetName}</title>
      </head>
      <body>
        <h1>${sheetName}</h1>
        <table border="1">
          <tr>
            <th>Date</th>
            <th>Source</th>
            <th>Title</th>
            <th>Select</th>
          </tr>
  `;
  
  data.forEach((row, index) => {
    if (index > 0) {
      const date = row[0] || "";
      const sourceMatch = row[1].toString().match(/^=HYPERLINK\("([^"]+)",\s*"([^"]+)"\)$/);
      const sourceUrl = sourceMatch ? sourceMatch[1] : "";
      const sourceText = sourceMatch ? sourceMatch[2] : row[1].toString().replace(/[<>&]/g, '');
      const titleMatch = row[2].toString().match(/^=HYPERLINK\("([^"]+)",\s*"([^"]+)"\)$/);
      const titleUrl = titleMatch ? titleMatch[1] : "";
      const titleText = titleMatch ? titleMatch[2] : row[2].toString().replace(/[<>&]/g, '');
      const select = row[3] || "";
      htmlContent += `
        <tr>
          <td>${date}</td>
          <td><a href="${sourceUrl}">${sourceText}</a></td>
          <td><a href="${titleUrl}">${titleText}</a></td>
          <td>${select}</td>
        </tr>
      `;
    }
  });
  
  htmlContent += `
        </table>
      </body>
    </html>
  `;
  
  const mimetype = "application/epub+zip";
  const containerXml = `
    <?xml version="1.0"?>
    <container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
      <rootfiles>
        <rootfile full-path="OEBPS/content.opf" media-type="application/oebps-package+xml"/>
      </rootfiles>
    </container>
  `;
  
  const contentOpf = `
    <?xml version="1.0" encoding="UTF-8"?>
    <package xmlns="http://www.idpf.org/2007/opf" unique-identifier="bookid" version="2.0">
      <metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
        <dc:title>${sheetName}</dc:title>
        <dc:identifier id="bookid">urn:uuid:${Utilities.getUuid()}</dc:identifier>
        <dc:language>en</dc:language>
      </metadata>
      <manifest>
        <item id="content" href="content.html" media-type="application/xhtml+xml"/>
      </manifest>
      <spine>
        <itemref idref="content"/>
      </spine>
    </package>
  `;
  
  const blobs = [
    Utilities.newBlob("mimetype", "text/plain", "mimetype").setContentType(mimetype),
    Utilities.newBlob(containerXml, "application/xml", "META-INF/container.xml"),
    Utilities.newBlob(contentOpf, "application/xml", "OEBPS/content.opf"),
    Utilities.newBlob(htmlContent, "application/xhtml+xml", "OEBPS/content.html")
  ];
  
  const zipOutput = Utilities.zip(blobs, `Sheet_${sheetName}.epub`);
  
  MailApp.sendEmail({
    to: "catalinfest@gmail.com,catafest@yahoo.com",
    subject: `Sheet activ: ${sheetName}`,
    body: "Vezi atașat sheet-ul activ în format EPUB.",
    attachments: [zipOutput]
  });
}

duminică, 5 iulie 2026

News : Google - View Space Locations by NASA.

I found a map with all view space locations on google by nasauofl@gmail.com.

luni, 15 iunie 2026

Google Apps Script : simple gmail manager !

Today, if you can't afford a paid Google account, you can use Google Apps Script to create your own tools to help you. Here's an older example of an email manager that labels, groups, deletes emails, etc.

joi, 11 iunie 2026

News : DiffusionGemma: The Developer Guide by Google.

Introducing DiffusionGemma, an experimental open 26B Mixture of Experts model that moves beyond traditional sequential generation to process and generate entire blocks of text simultaneously.
DiffusionGemma unlocks new value for developers:
  • Generates 1,000+ tokens/sec on an NVIDIA H100 and 700+ tokens/sec on an RTX 5090;
  • Optimizes non-linear workflows like code infilling, inline editing, and real-time self-correction;
  • Comfortably within 18GB VRAM limits of high-end dedicated consumer GPUs when quantized;
  • Supports native integration for MLX, vLLM, Hugging Face, and Unsloth with advanced NVIDIA NVFP4 kernel optimization;

duminică, 17 mai 2026

News : How much does a Romanian freelancer keep from 100 EUR AdSense revenue?

How much does a Romanian freelancer keep from 100 EUR AdSense revenue?
  • There are two taxes involved:
    • 30% withheld in the United States (no treaty reduction for AdSense), not YouTube where is 10%
    • 10% income tax in Romania, applied only to the money actually received
  • Because there is no other income:
    • No CASS (health contribution)
    • No CAS (pension contribution)
  • Step-by-step for 100 EUR example:
    • Gross AdSense revenue: 100 EUR
    • US withholding: 30% of 100 EUR = 30 EUR
    • Amount received in bank account: 100 EUR - 30 EUR = 70 EUR
    • Romanian income tax: 10% of 70 EUR = 7 EUR
    • Final net amount kept: 70 EUR - 7 EUR = 63 EUR
  • Summary:
    • Gross: 100 EUR
    • US tax (30%): -30 EUR
    • Received: 70 EUR
    • Romanian tax (10%): -7 EUR
    • Net kept by freelancer in Romania: 63 EUR
This does NOT mean AdSense is a bad business in general.
  • AdSense becomes profitable when:
    • you have high traffic
    • you have consistent monthly revenue
    • you earn hundreds or thousands of euros per month
  • At 100 EUR, the taxes look huge.
  • At 1,000 EUR, you already keep around 630 EUR, which is a completely different situation.
To earn 1,000 EUR per month with AdSense, you need:
  • 100,000 – 500,000 pageviews per month (depending on RPM)
  • CTR between 0.5% and 2%
  • RPM between 3 and 10 EUR
  • real and consistent traffic
  • high‑quality content

luni, 11 mai 2026

Star Trek Online : live youtube.

Star Trek Online is a relaxing game with many video scenarios with various missions, relaxing... Here, on my YouTube Dashboard, significant increase in views... but I don't recommend adsense as a source of income because I've studied Google a lot, but it can help the business environment a lot.

duminică, 26 aprilie 2026

News : Google AI Plus in Romania excellent offer.

The promotional price of RON 13.99/month is an excellent offer to test the capabilities of the Gemini 1.5 Pro model.
It offers a massive context window (up to 2 million tokens), which means you can upload entire documentations or massive codebases.
Use with IDE for Development
You can use Gemini for development, but the experience differs depending on how you want to integrate it:
Google IDX: Google has its own cloud-based IDE (Project IDX) that natively integrates Gemini for auto-completion, code explanation, and unit testing.
Android Studio: Gemini is directly integrated to assist mobile app developers.
VS Code / IntelliJ: There is no official "Gemini" extension as ubiquitous as GitHub Copilot, but you can use the API included in the subscription or third-party extensions (such as Codeium or Continue) that allow configuring a Gemini API key to generate code directly in the editor.
Code Analysis: Thanks to the large context window, you can "copy-paste" 10-20 code files into the chat interface, and it will understand the architecture of the entire project, unlike other models that "forget" the beginning of the conversation.

vineri, 17 aprilie 2026

Google Apps Script : ... youtube script for dashboard.

Today, I tested Google Apps Script to get data from youtube dashboard, because I make some streams on youtube and another social platforms.
The source code is large, but I will show this part to understand the basics:
function getChannelStats() {
  const response = YouTube.Channels.list(
    "snippet,statistics",
    { mine: true }
  );

  const ch = response.items[0];

  return {
    title: ch.snippet.title,
    subs: Number(ch.statistics.subscriberCount),
    views: Number(ch.statistics.viewCount),
    videos: Number(ch.statistics.videoCount)
  };
} ...

luni, 6 aprilie 2026

News : Google AdSense upcoming changes.

Starting on or after April 20, 2026, Google AdSense will experiment with an updated set of commonly used ad technology partners. If this experiment is deemed beneficial for publishers, the list will be updated on or after June 5, 2026. This update will reflect the partners that work most closely with publishers globally, determined by data collected from all programmatic demand sources, as well as meeting our privacy standards.
You'll be able to find the up-to-date version of the list published at Manage your ad technology partners (ATPs). You can view the controls, the list of current ad technology partners and, once the experiment starts, those who are part of the experiment in your account in Privacy & messaging, on the European regulations settings page, in the "Your ad partners" menu.
If you want to prevent automatic updates or do not want to participate in the experiment, select "Do not automatically include commonly used ad partners". This will create a custom list pre-filled with your current selections, which you can then modify as needed. If you're using a third-party CMP to collect GDPR consent, your list of ad tech partners is managed through your CMP provider.

sâmbătă, 4 aprilie 2026

News : Agent Development Kit for Go by google.

Agent Development Kit (ADK) is a flexible and modular framework that applies software development principles to AI agent creation. It is designed to simplify building, deploying, and orchestrating agent workflows, from simple tasks to complex systems. While optimized for Gemini, ADK is model-agnostic, deployment-agnostic, and compatible with other frameworks.
This Go version of ADK is ideal for developers building cloud-native agent applications, leveraging Go's strengths in concurrency and performance.

sâmbătă, 21 martie 2026

News : Google Earth's data catalog goes global

News : Stitch into an AI-native software design canvas.

Over the last year, AI has fundamentally changed how we build, turning simple descriptions into functional software. We launched Stitch to bring your ideas to life starting with the design process.
Today, we are evolving Stitch into an AI-native software design canvas. With it, anyone can create, iterate and collaborate to turn natural language into high-fidelity UI designs.
Stitch is accessible by users 18+ who are located in regions where Gemini is available.
It’s an AI‑powered design tool that lets you create full, high‑fidelity user interfaces (UI) simply by describing what you want in natural language. It helps you brainstorm, design, prototype.

sâmbătă, 21 februarie 2026

News : NotebookLM adds Deep Research and support for more source types ...

Today, NotebookLM is introducing new ways to help you find and use sources more effectively: using Deep Research agents and supporting more of the file types you use every day.
We are now rolling out Deep Research to automate and simplify complex online research. It acts like your dedicated researcher, synthesising a detailed report or recommending relevant articles, papers or websites — and you can direct this "researcher" to search specific places, too.

vineri, 20 februarie 2026

News : Gemini 3.1 Pro and animated SVGs.

Gemini 3.1 Pro can generate website-ready, animated SVGs from a simple text prompt. Since these are built in pure code and not pixels, they stay crisp at any scale with incredibly small file sizes.
Let's see one example with my logo game developer.