יום חמישי, 12 ביוני 2025

אחסון אתרים בחינם ע"י github

בשביל לאחסן אתרים ללא הגבלת זמן נשתמש בטריק דרך חשבון github שלנו

  1. ניצור repo בשם שנבחר
  2. ניצור או נוסיף את קובץ עמוד האינטרנט שלנו (עדיף שם קובץ index.html)
  3. בתוך האתר של github נלחץ על הקובץ שיצרנו ונעתיק את הכתובת של העמו המתקבל: https://github.com/snirex/snir-resume/blob/main/index.html
  4. נלך אל הכתובת https://raw.githack.com ונזין בתיבת הטקסט העליונה את הכתובת שהעתקנו
  5. נבחר את הכתובת שנרצה:
    אם בשביל development:
    - שינויים חדשים יתעדכנו בתוך מספר דקות
    - תעבורה מוגזמת תנותב באופן זמני לכתובות CDN מתאימות
    אם בשביל production:
    - אין מגבלות תעבורה. הקבצים מוגשים דרך רשת ה-CDN של CloudFlare.
    - ניתן לבצע אופטימיזציה אוטומטית לקבצים אם מוסיפים את הפרמטר ?min=1 לכתובת.
    - השתמש בתג מסוים (tag) או במזהה commit ספציפי בכתובת ה-URL (ולא בענף - branch). הקבצים מאוחסנים במטמון לצמיתות לפי כתובת ה-URL. מחרוזת השאילתה (Query string) לא נלקחת בחשבון.




יום רביעי, 9 באפריל 2025

הורדת Windows 10

הכנסו אל אתר האינטרנט של הורדת Windows 10 (קישור)

אם אתם משתמשים בגוגל כרום (כנראה):
1. לחצו על F12 או לחצו לחיצה ימנית איפשהו בדף ובחרו ב- "בדיקה" - בשביל להיכנס למצב Developer
2. לחצו ctrl+shift+M כדי להכנס למצב פיתוח לטלפון נייד

אם משתמשים בדפדפן Microsoft Edge:
1. לחצו על F12 או לחצו לחיצה ימנית איפשהו בדף ובחרו ב- "בדיקה" - בשביל להיכנס למצב Developer
2. בסרגל העליון לחצו על + , וברשימה הנפתחת בחרו ב- Network Conditions
3. הסירו את סימון V מאפשרות Use browser default , וברשימה הנפתחת בחרו ב-BlackBerry-BB10

- רעננו את אתר האינטרנט
- ברשימה הנפתחת בחרו ב-Windows 10 ולחצו "אשר"
- ברשימה הנפתחת בחרו בשפה הרצויה (עברית) ולחצו אשר
- לחצו על Download bit-64

יום חמישי, 5 בספטמבר 2024

ChatGPT - תיקון ימין-שמאל בכתיבת עברית

כתבתי כמה תיקונים לעבודה נוחה יותר עם chatGpt.
ניתן להוריד את התוסף מחנות גוגל כרום

במידה ואין אפשרות להתקנת תוספים בדפדפן שלך, אפשר להשתמש בתוסף באחת מהדרכים הבאות:

דרך ראשונה
  • יש ללחוץ ctrl+D כדי להוסיף bookmark, ואז לערוך את הבוקמרק ולשנות את שדה "כתובת האתר" לקוד שכתבתי כאן:

  1. לחץ כאן כדי להעתיק את הקוד
  2. לחץ ctrl+d
  3. שנה את שם הסימניה, ובמקום כתובת, הדבק את הטקסט שהעתקת בסעיף 1

javascript:(function(){let textareaDirection='rtl';function toggleDirection(){textareaDirection=textareaDirection==='rtl'?'ltr':'rtl';const textarea=document.querySelector('#prompt-textarea');if(textarea){textarea.style.direction=textareaDirection;}const img=document.querySelector('#direction-toggle-button img');if(img){img.style.transform=textareaDirection==='ltr'?'scaleX(-1)':'scaleX(1)';}}function toggleMarkdownDirection(){const markdowns=document.querySelectorAll('.markdown');markdowns.forEach(el=>{el.dir=el.dir==='rtl'?'ltr':'rtl';});const img=document.querySelector('#markdown-toggle-button img');if(img){img.style.transform=img.style.transform==='scaleX(-1)'?'scaleX(1)':'scaleX(-1)';}}function toggleWhitespaceStyle(){document.querySelectorAll('.whitespace-pre-wrap').forEach(el=>{const isActive=el.classList.contains('styled-q');if(isActive){el.classList.remove('styled-q');el.style.border='';el.style.borderRadius='';el.style.background='';}else{el.classList.add('styled-q');el.style.border='1px solid red';el.style.borderRadius='10px';el.style.background='lightyellow';}});}function jumpToNext(){const messages=document.querySelectorAll('[data-message-author-role]');let current=[...messages].findIndex(m=>m.getBoundingClientRect().top>100);if(current!==-1&&messages[current]){messages[current].scrollIntoView({behavior:'smooth',block:'start'});}}function jumpToPrevious(){const messages=[...document.querySelectorAll('[data-message-author-role]')];if(messages.length===0)return;let index=messages.findIndex(m=>m.getBoundingClientRect().top>=10);if(index===-1){index=messages.length;}if(index>0){messages[index-1].scrollIntoView({behavior:'smooth',block:'start'});}}function toggleQButtonGlow(){const qButton=document.querySelector('#q-style-toggle-button');if(!qButton)return;const glowing=qButton.classList.toggle('glowing-q');if(glowing){qButton.style.boxShadow='0 0 10px 4px yellow';}else{qButton.style.boxShadow='0 2px 6px rgba(0,0,0,0.2)';}}function createTooltip(btn){let tooltip=document.createElement('div');tooltip.textContent='Snir Elgabsi';tooltip.style.cssText=`position:absolute;bottom:120%;left:50%;transform:translateX(-50%) scale(0.5);padding:5px 10px;background:rgba(0,0,0,0.7);color:white;border-radius:6px;font-size:0.9rem;opacity:0;transition:opacity 0.3s ease, transform 0.3s ease;pointer-events:auto;cursor:pointer;z-index:10000;white-space:nowrap;`;tooltip.onclick=()=>{window.open('https://snir.blogspot.com','_blank');};btn.appendChild(tooltip);setTimeout(()=>{tooltip.style.opacity='1';tooltip.style.transform='translateX(-50%) scale(1)';},30);setTimeout(()=>{tooltip.style.opacity='0';tooltip.style.transform='translateX(-50%) scale(0.5)';setTimeout(()=>{if(tooltip.parentElement){tooltip.remove();}},300);},5030);btn._tooltip=tooltip;}function removeTooltip(btn){if(btn._tooltip){btn._tooltip.style.opacity='0';btn._tooltip.style.transform='translateX(-50%) scale(0.5)';setTimeout(()=>{if(btn._tooltip){btn._tooltip.remove();btn._tooltip=null;}},300);}}function addTooltipEvents(btn){let hoverTimeout=null;let leaveTimeout=null;btn.addEventListener('mouseenter',()=>{clearTimeout(leaveTimeout);hoverTimeout=setTimeout(()=>createTooltip(btn),1500);});btn.addEventListener('mouseleave',()=>{clearTimeout(hoverTimeout);leaveTimeout=setTimeout(()=>removeTooltip(btn),1000);});}function makeButtonImage(id,title,imgSrc,imgAlt,clickHandler){const btn=document.createElement('button');btn.id=id;btn.title=title;btn.style.cssText='width:2.2rem;height:2.2rem;border-radius:50%;background:white;color:black;border:1px solid lightgray;font-size:1.2rem;box-shadow:0 2px 6px rgba(0,0,0,0.2);cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;position:relative;';btn.onmouseover=()=>btn.style.backgroundColor='#f0f0f0';btn.onmouseout=()=>btn.style.backgroundColor='white';btn.onclick=(e)=>{e.preventDefault();clickHandler();};const img=document.createElement('img');img.src=imgSrc;img.alt=imgAlt;img.style.cssText='width:1.5rem;height:1.5rem;object-fit:contain;pointer-events:none;';btn.appendChild(img);addTooltipEvents(btn);return btn;}const imgPromptDir = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAD/UExURenp6c7OzrKysnl5eVZWVpOTkwAAAAEBAaGhoW1tbQMDA5ycnI2NjVtbW8bGxsjIyMrKyrGxscXFxd3d3dLS0ubm5ujo6IuLi3d3d+Li4uTk5E1NTezs7CYmJicnJ1BQUI6OjtXV1ZKSknZ2dpqamgICAt/f36ampnJyclxcXDk5OaqqqrCwsK+vr7+/v66urnR0dMPDw29vb+7u7rW1tSwsLIWFhUJCQkRERMTExNTU1AYGBsfHx3FxcWtra8nJybOzswQEBE5OTjMzM6mpqa2trdzc3OXl5UxMTKWlpUtLS52dnUlJSZ6enuPj40hISMvLy0ZGRqSkpOvr6wAAAKVmCqgAAABVdFJOU////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCwoQfPAAAACXBIWXMAAA7BAAAOwQG4kWvtAAAAGHRFWHRTb2Z0d2FyZQBQYWludC5ORVQgNS4xLjgbaeqoAAAAtmVYSWZJSSoACAAAAAUAGgEFAAEAAABKAAAAGwEFAAEAAABSAAAAKAEDAAEAAAACAAAAMQECABAAAABaAAAAaYcEAAEAAABqAAAAAAAAANl2AQDoAwAA2XYBAOgDAABQYWludC5ORVQgNS4xLjgAAwAAkAcABAAAADAyMzABoAMAAQAAAAEAAAAFoAQAAQAAAJQAAAAAAAAAAgABAAIABAAAAFI5OAACAAcABAAAADAxMDAAAAAA5X1phWJRlb4AAAFhSURBVEhL5ZRXV8JAEIUpurEiorGAHdGIxoYo9i5WbPP/f4uzmZFkl6xsXuV7yHLP3C9kYU9SkJh/rqTSmWyfQponRKfSLxBHXtoM8IjoUAa5PxSUHUeGYZ4RujLCXSFGc2P5cVwz+cIEDwlNmaS6JIvRxXWKJiGaMh3uYgbjLK5FmoRoSonqEktlbp7qEltlgeoS2wdbpLrEVllKvv1lqktsFVhp/5XWCpR/D5i9AquBUEmiwNq6t1FN9C0Bm8mVreSK36vKtievO0Ls4mKl7AmxXwM4qFcPMRWPGg2XBiGacoy3FSccDKhKQRp5DiYUxcpQlBwKpwUOZiLKmTzy9bJ3HsfFJbeiCv6gFe31HeWKa1GlVhLXfyg+15QHc2/Qub3L+HHcP3BL3X7zEe/2xMFMVIHmMzovHIwoChRf0XnjYEJVoPWOzgcHA5oCrU/xxR9N6Ap8dzmUMUp3eloB+AGGLqjp2OH2dAAAAABJRU5ErkJggg==';  const imgMarkdownDir = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE4AAABOCAIAAAAByLdKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALeSURBVHhe7ZsxjuIwFIZTU+0RKLkBJWlX4gLT0SPtDZBAokFcAYFoqaDZFiqQQKKAHi5ARUvB/orfWCSZOF7ivDHM+ypiXvL7ix2HSCG4/xhE9R2xVV0ul61Wq1qtBiyEYXg+nynbEVaqCKYuMILT6tY2XzXtiU6UCsW4ts1R7Xa7FBsE+Ox8UqXBZUJ5EQ5tTarIoMAgwLVKrSWTUAWubE2qk8lEhWE8qal8tCpC9WR2YmtS1bP3W1Qxj4BDW5PqYyo1lU8i1KGt76rAle0LqAIntq+hCorbvowqKGj7SqqgiK2/qrirU1Ocp229U9W/W5BOTSmes/VOFVkqFBgcnrD1ThVoB/NT6//a+qiKTmsHAGH05Esey3JtfVQFjyNmj/m3uqeqAEOUGLdcUE87f4W/qhqkA6zMWegnsJdXzQXdU/0UVUJUI0TVO0Q1iahGiGqMTqdTq9VQ87s0cHBEIIgiU3CojkYjVcAD4ig4Dofq4XBQBTwcj0cKjsOhCi6Xy5oFBFFkCiZVHxDVJKIakat6vV7VnYaBRqOBOAqOw6E6GAxUAQ+Io+A4HKq3263ZbKoazS9H0OE+QRDiKDgOh6oniGoSUY2wUT2dTn9ZQBBFpuBQ3W63qoAHxFFwHA7V6XSqCnhAHAXH4VAFw+GwXq+j5qM0cHBEIIgiUzCp+oCoJhHVCBvV8Xj8x5per0e7RUsaWjabDW0XgEN1NpupAnva7TZ2nM/ntB0EWc8r9nCorlYrVWBPv9/Hjuv1Wm1WKhV1qCJwqILdboepaMlisaDd7vf9fo+W4kMKmFR9QFSTiGqEqHqHqCYR1QhR9Q5RTSKqET9RdZLxGr0nWP6hzaQKQ3UI89n6drSqeUhMqpgY+nVcb+ewnr2AmjLI+VqfMIDPue/HM5PoHrVmkKMKnnixnB90krqbTb4q0OuTn1guJVaqAFd8GIY4ef4Msvqnhv0iYqv6Bojq+3G//wN9rsRvy4i5OAAAAABJRU5ErkJggg==';  const imgPrevBtn='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCA1LjEuOBtp6qgAAAC2ZVhJZklJKgAIAAAABQAaAQUAAQAAAEoAAAAbAQUAAQAAAFIAAAAoAQMAAQAAAAIAAAAxAQIAEAAAAFoAAABphwQAAQAAAGoAAAAAAAAAYAAAAAEAAABgAAAAAQAAAFBhaW50Lk5FVCA1LjEuOAADAACQBwAEAAAAMDIzMAGgAwABAAAAAQAAAAWgBAABAAAAlAAAAAAAAAACAAEAAgAEAAAAUjk4AAIABwAEAAAAMDEwMAAAAACrgCETU544KAAAAfBJREFUaEPtmbtKxEAYheMFLdRCsRC0ULQTES+NPoBvoGAraKGlhdhaqGglgq1voAg2ViIi2KiVKIhY+wCijZdzMpOQ3WwmS8i/mV3ng4+Z2SXZPUn+mU3WczgcmemBx/AOrvMFm2nSbTkMcQ5n/JFiD26orpE+uAyT9p0XW7pNpBvewN8K7sI0pmClbfPWiClEYFqYCfgNK22bp4lUEyJwByZRyBkJrmOGYE3M+qPq4JnZVN0SBuE2bIaxD8yRRd2G9MJbWJ64GvehFfCotcIOf6S+HHmBT6obcgU/VTck2M4aOGXeQwZ5g8PwTI8Dl+BCZHwIrWQAnsAxf+R5FzAaZBWSFXiguvVBUhArMa2+DDKnuj5r8Eh1jbTBftUVhSUQIhFkHF7DFsgzKUWnblPJemlNwuh2UpbA6bchkAjyAz/gF+S6I2UJEjXSDjmVS/Oq21Tqavp1NWIbLohtSMxaQ5A3XdIHaV63qWSdtQq51ZU4alwQaU2RCMJ91rz2JGrEmgd0AW5lLwIXxDYaJojErNUFpyH3HVu4cuRSt6lknbUa6p499kHSSAWRXgxjSNTIKDyF0s+1RnTrIxGEZ5kPIKSJPUlJwv1EKQJTEP4BFIXXvLWYgjzDR/gA+e/VO7QWU7Hzvej7Qa04HP8Hz/sDd3810jpBBHcAAAAASUVORK5CYII=';  const imgNextBtn='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCA1LjEuOBtp6qgAAAC2ZVhJZklJKgAIAAAABQAaAQUAAQAAAEoAAAAbAQUAAQAAAFIAAAAoAQMAAQAAAAIAAAAxAQIAEAAAAFoAAABphwQAAQAAAGoAAAAAAAAAYAAAAAEAAABgAAAAAQAAAFBhaW50Lk5FVCA1LjEuOAADAACQBwAEAAAAMDIzMAGgAwABAAAAAQAAAAWgBAABAAAAlAAAAAAAAAACAAEAAgAEAAAAUjk4AAIABwAEAAAAMDEwMAAAAACrgCETU544KAAAAgVJREFUaEPtmT0vBEEYxw8JChJUEgoSNAoJKhIFn4HQShRIJKLSKBSiFSFK30BDR0RES0EkJOJTeCkE///uzGX2bs2eu3325TK/5Jdn9jY3e8/uM3O7swWHQ4YGFcPgPnP/jzJ3HMEHeAsf4RzMLLYrcgWn/KbHGtz3m1a64RK09R0H2ypGcg51OdEVWAlj0PyelAEaVYyTb2WiSCTCPiX6tWKrY5bWjN/0WIWHftNKH9yBTKasBGJkQcVIqh0jqZB4CUjhEskadZOIxKzVDHv8piivKnpIJDICr2ETlJx+21SMpNrpdxSa35MygBvsFnif9QY/4YegASTGSAvs9ZuivKgYibtFSQOXSNaom0QkZq1+uAulT9KsipFUO2u5xYdakEiEfSY+9iTGSN0s0KVC4iUghUska/wnEenBWxPmj+MzBF8bbMF7eAGnoUbPWstwCK7DMNrhOGTfZX9cMXKpYgBOmXyhwwNzdWIAnqlt7SKcN7b3YBipPLMTJsErwJ38R2Z8hk+qreWLHz5imp8dwFKYiO5H0gAcI1+Qz9hEl9ogZPmY8O1Vq98s8q5iKYmPJ33ADngKJ72tyuAd7qbfDDAMT6D0uhbLv4h55johk5nwtuz8lQThVeYChDRlKykmTOYGltajKZPIBbZkcpOEJiyZ3CWh6YLH8A5u8AOHw5FXCoVfKaQOUfKxTTgAAAAASUVORK5CYII=';const dirBtn=makeButtonImage('direction-toggle-button',textareaDirection==='rtl'?'כיוון כתיבה מימין לשמאל - Ctrl+Shift':'כיוון כתיבה משמאל לימין - Ctrl+Shift',imgPromptDir,'כיוון כתיבה',toggleDirection);dirBtn.querySelector('img').style.transform=textareaDirection==="ltr"?"scaleX(-1)":"scaleX(1)";const mdBtn=makeButtonImage('markdown-toggle-button','החלף כיוון כתיבה של התשובות',imgMarkdownDir,'כיוון תשובות',toggleMarkdownDirection);const qBtn=document.createElement('button');qBtn.id='q-style-toggle-button';qBtn.title='הפעל/בטל עיצוב על whitespace-pre-wrap';qBtn.textContent='Q';qBtn.style.cssText=dirBtn.style.cssText;qBtn.onclick=(e)=>{e.preventDefault();toggleWhitespaceStyle();toggleQButtonGlow();};addTooltipEvents(qBtn);const nextBtn=makeButtonImage('next-snir-button','קפוץ לשאלה הבאה - Alt+↓',imgNextBtn,'קפוץ לשאלה הבאה',jumpToNext);const prevBtn=makeButtonImage('prev-snir-button','קפוץ לשאלה הקודמת - Alt+↑',imgPrevBtn,'קפוץ לשאלה הקודמת',jumpToPrevious);function createButtons(){if(document.querySelector('#direction-toggle-button'))return;const textarea=document.querySelector('#prompt-textarea');const buttonContainer=textarea?.closest('form')?.querySelector('div.flex > div.flex');if(!textarea||!buttonContainer)return;let btnGroup=document.querySelector('#custom-btn-group');if(!btnGroup){btnGroup=document.createElement('div');btnGroup.id='custom-btn-group';btnGroup.style.cssText='position:absolute;bottom:13px;right:95px;display:flex;gap:10px;z-index:9999;';buttonContainer.style.position='relative';buttonContainer.appendChild(btnGroup);}btnGroup.appendChild(prevBtn);btnGroup.appendChild(nextBtn);btnGroup.appendChild(mdBtn);btnGroup.appendChild(dirBtn);}document.addEventListener('keydown',function(e){if(e.key==='ArrowUp'&&e.altKey){e.preventDefault();jumpToPrevious();}if(e.key==='ArrowDown'&&e.altKey){e.preventDefault();jumpToNext();}});document.addEventListener('keydown',function(e){if(e.ctrlKey&&e.shiftKey&&!e.altKey){e.preventDefault();toggleDirection();}});const observer=new MutationObserver(()=>{createButtons();});observer.observe(document.body,{childList:true,subtree:true});createButtons();toggleDirection();toggleDirection();})();


  1. לחץ כאן כדי להעתיק את הקוד
  2. לחץ ctrl+d
  3. שנה את שם הסימניה, ובמקום כתובת, הדבק את הטקסט שהעתקת בסעיף 1

דרך שניה

תוסף לדפדפן גוגל כרום

יש ליצור תיקיה חדשה ולשמור בתוכה את הקבצים הבאים:
  1. manifest.json
    {
      "manifest_version": 3,
      "name": "כיוון כתיבת עברית ב-ChatGPT",
      "version": "1.2",
      "author": "Snir Elgabsi",
      "description": "הוספת תפריט קטן לשינוי כיוון כתיבה ב-ChatGPT",
      "icons": {
        "16": "icon.png",
        "48": "icon.png",
        "128": "icon.png"
      },
      "content_scripts": [
        {
          "matches": [
            "https://chat.openai.com/*",
            "https://chatgpt.com/*"
          ],
          "js": [
            "content.js"
          ]
        }
      ],
      "permissions": [],
      "host_permissions": [
        "https://chat.openai.com/*"
        "https://chatgpt.com/*"
      ]
    }
    לחץ כאן כדי להעתיק את הקוד
  2. content.js
    javascript:(function(){
    let textareaDirection = localStorage.getItem('snir-textarea-direction') || 'rtl';
    
    function toggleDirection(){
      textareaDirection = textareaDirection === 'rtl' ? 'ltr' : 'rtl';
      localStorage.setItem('snir-textarea-direction', textareaDirection);
      const textarea = document.querySelector('#prompt-textarea');
      if(textarea){ textarea.style.direction = textareaDirection; }
      const img = document.querySelector('#direction-toggle-button img');
      if(img){ img.style.transform = textareaDirection === 'ltr' ? 'scaleX(-1)' : 'scaleX(1)'; }
    }
    
    function toggleMarkdownDirection(){
      const markdowns=document.querySelectorAll('.markdown');
      markdowns.forEach(el=>{el.dir=el.dir==='rtl'?'ltr':'rtl';});
      const img=document.querySelector('#markdown-toggle-button img');
      if(img){img.style.transform=img.style.transform==='scaleX(-1)'?'scaleX(1)':'scaleX(-1)';}
    }
    
    function toggleWhitespaceStyle(){
      document.querySelectorAll('.whitespace-pre-wrap').forEach(el=>{
        const isActive=el.classList.contains('styled-q');
        if(isActive){
          el.classList.remove('styled-q');
          el.style.border='';el.style.borderRadius='';el.style.background='';
        }else{
          el.classList.add('styled-q');
          el.style.border='2px solid red';
          el.style.borderRadius='10px';
          el.style.boxShadow='0 0 8px 2px red';
          el.style.padding='5px';
        }
      });
    }
    
    function jumpToNext(){	
      const messages = document.querySelectorAll('[data-message-author-role]');
      let current = [...messages].findIndex(m => m.getBoundingClientRect().top > 100);
      if (current !== -1 && messages[current]) {
        messages[current].scrollIntoView({behavior: 'smooth', block: 'start'});
      }
    }
    
    function jumpToPrevious() {
      const messages = [...document.querySelectorAll('[data-message-author-role]')];
      if (messages.length === 0) return;
      let index = messages.findIndex(m => m.getBoundingClientRect().top >= 10);
      if (index === -1) index = messages.length;
      if (index > 0) {
        messages[index - 1].scrollIntoView({ behavior: 'smooth', block: 'start' });
      }
    }
    
    function toggleQButtonGlow(){
      const qButton=document.querySelector('#q-style-toggle-button');
      if(!qButton)return;
      const glowing=qButton.classList.toggle('glowing-q');
      if(glowing){qButton.style.boxShadow='0 0 10px 4px yellow';}
      else{qButton.style.boxShadow='0 2px 6px rgba(0,0,0,0.2)';}
    }
    
    function createTooltip(btn){
      let tooltip = document.createElement('div');
      tooltip.textContent = 'Snir Elgabsi';
      tooltip.style.cssText = `
        position:absolute;
        bottom:120%;
        left:50%;
        transform:translateX(-50%) scale(0.5);
        padding:5px 10px;
        background:rgba(0,0,0,0.7);
        color:white;
        border-radius:6px;
        font-size:0.9rem;
        opacity:0;
        transition:opacity 0.3s ease, transform 0.3s ease;
        pointer-events:auto;
        cursor:pointer;
        z-index:10000;
        white-space:nowrap;
      `;
      tooltip.onclick = () => {
        window.open('https://snir.blogspot.com', '_blank');
      };
      btn.appendChild(tooltip);
      setTimeout(() => {
        tooltip.style.opacity = '1';
        tooltip.style.transform = 'translateX(-50%) scale(1)';
      }, 500);
      setTimeout(() => {
        tooltip.style.opacity = '0';
        tooltip.style.transform = 'translateX(-50%) scale(0.5)';
        setTimeout(() => {
          if (tooltip.parentElement) {
            tooltip.remove();
          }
        }, 300);
      }, 5030);
      btn._tooltip = tooltip;
    }
    
    function removeTooltip(btn){
      if(btn._tooltip){
        btn._tooltip.style.opacity='0';
        btn._tooltip.style.transform='translateX(-50%) scale(0.5)';
        setTimeout(()=>{if(btn._tooltip){btn._tooltip.remove();btn._tooltip=null;}},300);
      }
    }
    
    function addTooltipEvents(btn){
      let hoverTimeout=null;
      let leaveTimeout=null;
      btn.addEventListener('mouseenter',()=>{
        clearTimeout(leaveTimeout);
        hoverTimeout=setTimeout(()=>createTooltip(btn),1500);
      });
      btn.addEventListener('mouseleave',()=>{
        clearTimeout(hoverTimeout);
        leaveTimeout=setTimeout(()=>removeTooltip(btn),1000);
      });
    }
    
    function makeButtonImage(id,title,imgSrc,imgAlt,clickHandler){
      const btn=document.createElement('button');
      btn.id=id;
      btn.title=title;
      btn.style.cssText='width:2.2rem;height:2.2rem;border-radius:50%;background:white;color:black;border:1px solid lightgray;font-size:1.2rem;box-shadow:0 2px 6px rgba(0,0,0,0.2);cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;position:relative;';
      btn.onmouseover=()=>btn.style.backgroundColor='#f0f0f0';
      btn.onmouseout=()=>btn.style.backgroundColor='white';
      btn.onclick=(e)=>{e.preventDefault();clickHandler();};
      const img=document.createElement('img');
      img.src=imgSrc;
      img.alt=imgAlt;
      img.style.cssText='width:1.5rem;height:1.5rem;object-fit:contain;pointer-events:none;';
      btn.appendChild(img);
      addTooltipEvents(btn);
      return btn;
    }
    
    // BASE64 images:
    const imgPromptDir = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAD/UExURenp6c7OzrKysnl5eVZWVpOTkwAAAAEBAaGhoW1tbQMDA5ycnI2NjVtbW8bGxsjIyMrKyrGxscXFxd3d3dLS0ubm5ujo6IuLi3d3d+Li4uTk5E1NTezs7CYmJicnJ1BQUI6OjtXV1ZKSknZ2dpqamgICAt/f36ampnJyclxcXDk5OaqqqrCwsK+vr7+/v66urnR0dMPDw29vb+7u7rW1tSwsLIWFhUJCQkRERMTExNTU1AYGBsfHx3FxcWtra8nJybOzswQEBE5OTjMzM6mpqa2trdzc3OXl5UxMTKWlpUtLS52dnUlJSZ6enuPj40hISMvLy0ZGRqSkpOvr6wAAAKVmCqgAAABVdFJOU////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCwoQfPAAAACXBIWXMAAA7BAAAOwQG4kWvtAAAAGHRFWHRTb2Z0d2FyZQBQYWludC5ORVQgNS4xLjgbaeqoAAAAtmVYSWZJSSoACAAAAAUAGgEFAAEAAABKAAAAGwEFAAEAAABSAAAAKAEDAAEAAAACAAAAMQECABAAAABaAAAAaYcEAAEAAABqAAAAAAAAANl2AQDoAwAA2XYBAOgDAABQYWludC5ORVQgNS4xLjgAAwAAkAcABAAAADAyMzABoAMAAQAAAAEAAAAFoAQAAQAAAJQAAAAAAAAAAgABAAIABAAAAFI5OAACAAcABAAAADAxMDAAAAAA5X1phWJRlb4AAAFhSURBVEhL5ZRXV8JAEIUpurEiorGAHdGIxoYo9i5WbPP/f4uzmZFkl6xsXuV7yHLP3C9kYU9SkJh/rqTSmWyfQponRKfSLxBHXtoM8IjoUAa5PxSUHUeGYZ4RujLCXSFGc2P5cVwz+cIEDwlNmaS6JIvRxXWKJiGaMh3uYgbjLK5FmoRoSonqEktlbp7qEltlgeoS2wdbpLrEVllKvv1lqktsFVhp/5XWCpR/D5i9AquBUEmiwNq6t1FN9C0Bm8mVreSK36vKtievO0Ls4mKl7AmxXwM4qFcPMRWPGg2XBiGacoy3FSccDKhKQRp5DiYUxcpQlBwKpwUOZiLKmTzy9bJ3HsfFJbeiCv6gFe31HeWKa1GlVhLXfyg+15QHc2/Qub3L+HHcP3BL3X7zEe/2xMFMVIHmMzovHIwoChRf0XnjYEJVoPWOzgcHA5oCrU/xxR9N6Ap8dzmUMUp3eloB+AGGLqjp2OH2dAAAAABJRU5ErkJggg==';
      const imgMarkdownDir = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE4AAABOCAIAAAAByLdKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALeSURBVHhe7ZsxjuIwFIZTU+0RKLkBJWlX4gLT0SPtDZBAokFcAYFoqaDZFiqQQKKAHi5ARUvB/orfWCSZOF7ivDHM+ypiXvL7ix2HSCG4/xhE9R2xVV0ul61Wq1qtBiyEYXg+nynbEVaqCKYuMILT6tY2XzXtiU6UCsW4ts1R7Xa7FBsE+Ox8UqXBZUJ5EQ5tTarIoMAgwLVKrSWTUAWubE2qk8lEhWE8qal8tCpC9WR2YmtS1bP3W1Qxj4BDW5PqYyo1lU8i1KGt76rAle0LqAIntq+hCorbvowqKGj7SqqgiK2/qrirU1Ocp229U9W/W5BOTSmes/VOFVkqFBgcnrD1ThVoB/NT6//a+qiKTmsHAGH05Esey3JtfVQFjyNmj/m3uqeqAEOUGLdcUE87f4W/qhqkA6zMWegnsJdXzQXdU/0UVUJUI0TVO0Q1iahGiGqMTqdTq9VQ87s0cHBEIIgiU3CojkYjVcAD4ig4Dofq4XBQBTwcj0cKjsOhCi6Xy5oFBFFkCiZVHxDVJKIakat6vV7VnYaBRqOBOAqOw6E6GAxUAQ+Io+A4HKq3263ZbKoazS9H0OE+QRDiKDgOh6oniGoSUY2wUT2dTn9ZQBBFpuBQ3W63qoAHxFFwHA7V6XSqCnhAHAXH4VAFw+GwXq+j5qM0cHBEIIgiUzCp+oCoJhHVCBvV8Xj8x5per0e7RUsaWjabDW0XgEN1NpupAnva7TZ2nM/ntB0EWc8r9nCorlYrVWBPv9/Hjuv1Wm1WKhV1qCJwqILdboepaMlisaDd7vf9fo+W4kMKmFR9QFSTiGqEqHqHqCYR1QhR9Q5RTSKqET9RdZLxGr0nWP6hzaQKQ3UI89n6drSqeUhMqpgY+nVcb+ewnr2AmjLI+VqfMIDPue/HM5PoHrVmkKMKnnixnB90krqbTb4q0OuTn1guJVaqAFd8GIY4ef4Msvqnhv0iYqv6Bojq+3G//wN9rsRvy4i5OAAAAABJRU5ErkJggg==';
      const imgPrevBtn='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCA1LjEuOBtp6qgAAAC2ZVhJZklJKgAIAAAABQAaAQUAAQAAAEoAAAAbAQUAAQAAAFIAAAAoAQMAAQAAAAIAAAAxAQIAEAAAAFoAAABphwQAAQAAAGoAAAAAAAAAYAAAAAEAAABgAAAAAQAAAFBhaW50Lk5FVCA1LjEuOAADAACQBwAEAAAAMDIzMAGgAwABAAAAAQAAAAWgBAABAAAAlAAAAAAAAAACAAEAAgAEAAAAUjk4AAIABwAEAAAAMDEwMAAAAACrgCETU544KAAAAeNJREFUaEPtmbtKxEAUhuMFLdRCsRC0ULQTES+VD2Bhr2AraKGljbYWXrASwdY3UAQbKxFRbFwrURCx9gFEK/U/mUmY7CaTEHLM7Ho++DgzG5Ldk7lkZ+IJgpCbHngM7+E6fVCPUBK38MdwD2ahT8c/pUlHk254Dmf8WhRKZkMVE5mCczDu2kWypWMslMQNNFui2l1oYwLGnVe0iWRJInAHJkEtEndO0UYImt/WnZKgltlUxQiDcBs2w5ovLJBFHUN64R2szjiL+9AJ6K61wg6/pn4c8QKfVDHkCn6qYkhwnjPQlFmBlMgbHIZnuh64BBeM+iF0kgF4Asf8muddQDORVUiswANVrA+SEnESGiMNge3pSy0yq4o+a/BIFa20wX5VZIXGcghHIuPwGrZA6pJcdOqYSt4xMgnN87iMwDFGvuEH/IL03OEyAkfXaoc0lXPzqmMqMv2WgSTiGpKIa3BMv0OQVo/cN2lex1TyTr+lrNmla1mg1eYytF27CKz7WibyZC8DScQ1JBHX4Jh+u+A0pGvXPLgK5FLHVPJOvw2zZi8Fjq41Ck8h93bQiI4+HIlQK9MGBDc1OylJyF+UMrAlQi+ATKjPO4stkWf4CB8gvb16h85iG+x0zDwejBVB+D943i8TrRfXoZttJgAAAABJRU5ErkJggg==';  
      const imgNextBtn='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCA1LjEuOBtp6qgAAAC2ZVhJZklJKgAIAAAABQAaAQUAAQAAAEoAAAAbAQUAAQAAAFIAAAAoAQMAAQAAAAIAAAAxAQIAEAAAAFoAAABphwQAAQAAAGoAAAAAAAAAYAAAAAEAAABgAAAAAQAAAFBhaW50Lk5FVCA1LjEuOAADAACQBwAEAAAAMDIzMAGgAwABAAAAAQAAAAWgBAABAAAAlAAAAAAAAAACAAEAAgAEAAAAUjk4AAIABwAEAAAAMDEwMAAAAACrgCETU544KAAAAfhJREFUaEPtmc0rBVEYhweFBYWVYkFhI8nHirKRjT1lLQskCytbC9mJIks7SxtZKUl3y4IUJf4JHwvh95tzzu3MnWvmds1rZnKeenrfubeZO+89Z87MOeM5HDLU6FgOfmd//6XNHQfwFl7BOzgLc8kFNK1AV2AltOv4p0R1rTM4qVKfZbiv0khG4DSMOnYSbOgYCwuxW2QJVsIQtPeTMkCtjkkiccxYJLpWF9yELCj0zyXInI6xVNu1UiGVbiCBKyRruEKyhsTwWw87VCrKk44+EoUMwktYByXvI006xlLtfWQY2vtJGUDiGvmEL/AdvgkaQKJrNcBOlYryqGMs7hElDVwhWcMVkjUkht9uuAWl/6QZHWOpdvjlKoq9n5QBXNeKgAt0CzDq2Ekgvq6VCm74zRr/shDpi/dX2IVwDnEMB/yt8ImbsXsRbqs0O5iT5ZB5CrmS/gyn4A7k6wHDPHyFR/6W5+3CVZUGaIajkMcO3bgS5FzHIiziBvJHOU1lfID3OjfyxQ+nmPZne7CU1ObsH5BzbGJaqBf2qbTIBGxUaRG2UCYwJ94CT+C4v1UZfDBcV2mAfshrTXo5qEdHH/uCboUsZszfiuanIghbmQsQ0oRWUmxYTAGW9kdbFpELoorJTRGGcsXkrghDGzyE13CNHzgcjrzied8Om+958SArgwAAAABJRU5ErkJggg==';
    
    // כפתורים:
    const dirBtn = makeButtonImage('direction-toggle-button', textareaDirection==='rtl'?'כיוון כתיבה מימין לשמאל - Ctrl+Shift':'כיוון כתיבה משמאל לימין - Ctrl+Shift', imgPromptDir, 'כיוון כתיבה', toggleDirection);
    dirBtn.querySelector('img').style.transform = textareaDirection === "ltr" ? "scaleX(-1)" : "scaleX(1)";
    
    const mdBtn = makeButtonImage('markdown-toggle-button', 'החלף כיוון כתיבה של התשובות', imgMarkdownDir, 'כיוון תשובות', toggleMarkdownDirection);
    
    const qBtn=document.createElement('button');
    qBtn.id='q-style-toggle-button';
    qBtn.title='הפעל/בטל עיצוב על whitespace-pre-wrap';
    qBtn.textContent='Q';
    qBtn.style.cssText=dirBtn.style.cssText;
    qBtn.onclick=(e)=>{e.preventDefault();toggleWhitespaceStyle();toggleQButtonGlow();};
    addTooltipEvents(qBtn);
    
    const nextBtn=makeButtonImage('next-snir-button','קפוץ לשאלה הבאה - Alt+↓',imgNextBtn,'קפוץ לשאלה הבאה',jumpToNext);
    const prevBtn=makeButtonImage('prev-snir-button','קפוץ לשאלה הקודמת - Alt+↑',imgPrevBtn,'קפוץ לשאלה הקודמת',jumpToPrevious);
    
    // יצירת כפתורים
    function createButtons(){
      if(document.querySelector('#direction-toggle-button')) return;
    
      const textarea=document.querySelector('#prompt-textarea');
      const buttonContainer=textarea?.closest('form')?.querySelector('div.flex > div.flex');
      if(!textarea||!buttonContainer) return;
    
      let btnGroup=document.querySelector('#custom-btn-group');
      if(!btnGroup){
        btnGroup=document.createElement('div');
        btnGroup.id='custom-btn-group';
        btnGroup.style.cssText='position:absolute;bottom:13px;right:95px;display:flex;gap:10px;z-index:9999;';
        buttonContainer.style.position='relative';
        buttonContainer.appendChild(btnGroup);
      }
    
      btnGroup.appendChild(prevBtn);
      btnGroup.appendChild(nextBtn);
      btnGroup.appendChild(mdBtn);
      btnGroup.appendChild(dirBtn);
    
      // החלת כיוון כתיבה מה־localStorage
      if (textarea) {
        textarea.style.direction = textareaDirection;
        const img = dirBtn.querySelector('img');
        if (img) img.style.transform = textareaDirection === 'ltr' ? 'scaleX(-1)' : 'scaleX(1)';
      }
    }
    
    document.addEventListener('keydown', function (e) {
      if (e.key === 'ArrowUp' && e.altKey) {
        e.preventDefault();
        jumpToPrevious();
      }
      if (e.key === 'ArrowDown' && e.altKey) {
        e.preventDefault();
        jumpToNext();
      }
      if(e.ctrlKey && e.shiftKey && !e.altKey) {
        e.preventDefault();
        toggleDirection();
      }
    });
    
    const observer=new MutationObserver(()=>{createButtons();});
    observer.observe(document.body,{childList:true,subtree:true});
    createButtons();
    })();
        
    
    
    לחץ כאן כדי להעתיק את הקוד
  3. שמור את התמונה הבאה בשם icon.png 

    התוסף מוכן, כעת נפעיל אותו ע"י הדפדפן:
  1. פתח את Chrome.
  2. :עבור לכתובת
  3. הפעל את Developer mode (בצד ימין למעלה).
  4. לחץ על Load unpacked ובחר את התיקייה עם הקבצים שלך.


יום שלישי, 16 ביולי 2024

c# החלפת משתמש בווינדוס / נעילת המחשב


[DllImport("user32.dll")]
public static extern void LockWorkStation();

// The function to switch user/lock the computer
void foo() { LockWorkStation(); } 
  

יום חמישי, 11 באפריל 2024

merge multiple docx

 בשביל לחבר קבצי docx צריך להוסיף reference לקבצים הבאים:

חלון Solution Explorer > לחיצה ימנית על References > לחיצה על Add References

להוריד NuGet או מהאינטרנט את הקבצים ולהוסיף:

Telerik.Windows.Documents.Flow.dll

קוד C#:

void MergeDocx(List<string> files, string result_file)
{
   RadFlowDocument target = new RadFlowDocument();
   RadFlowDocument source = new RadFlowDocument();
   DocxFormatProvider provider = new DocxFormatProvider();
   for (int i = 0; i < file.Count; i++)
  {
     using(Stream input = File.OpenRead(files[i]))
     {
          target.Merge(provider.Import(input));
      }
   }
   byte[] ba = provider.Export(target);
   File.WriteAllBytes(result_file, ba);
 }

convert docx to pdf telerik

 בשביל להמיר docx ל-pdf צריך להוסיף reference לקבצים הבאים:

חלון Solution Explorer > לחיצה ימנית על References > לחיצה על Add References

להוריד NuGet או מהאינטרנט את הקבצים ולהוסיף:

Telerik.Windows.Documents.Core.dll
Telerik.Windows.Documents.Flow.dll
Telerik.Windows.Documents.Flow.FormatProviders.Pdf.dll

קוד C#:

void ConvertDocxToPdf(string docxpath, string pdfpath)
{
  var docxProvider = new DocxFormatProvider();
  var pdfProvider = new PdfFormatProvider();
  byte[] docxByteArr = File.ReadAllBytes(docxpath);
  var doc = docxProvider.Import(docxByteArr);
  byte[] resultPdfByteArr = pdfProvider.Export(doc);
  File.WriteAllBytes(pdfpath, resultPdfByteArr);
}

יום שני, 12 ביוני 2023

Search in list

חיפוש מחרוזת תווים בתוך מאגר מילים: - מיושם בתוכנת C# Winform:
List<string> listTemp = new List<string>();
private void textBox1_TextChanged(object sender, EventArgs e)
{
  var tmp = new List<string>();
  
  //restore source list
  if (textBox1.Text.Length == 0 || textBox1.Text.Length > 1)
    richTextBox1.Text = String.Join(" ", listTemp);
  
  if (textBox1.Text.Length > 0)
  {
    //copy from src to out-temp (happens only once)
    if (textBox1.text.Length == 1 && listTemp.Count == 0)
      listTemp = richTextBox1.Text.Split(' ').ToList();
  
    //filter
    foreach (string item in richTextBox1.Text.Split(' ').ToList())
    {
      if (item.Contains((textBox1.text))
        tmp.Add(item);
    }
    richTextBox1.Text = String.Join(" ", tmp);
  }
}

private void richTextBox1_TextChanged(object sender, EventArgs e)
{
  if (richTextBox1.Focused)
    listTemp.Clear();
}

יום שני, 28 בנובמבר 2022

WPF - בחירת עמודות מטופס חיצוני - Column Chooser

בשביל שימוש בפקדים של telerik צריך להוסיף ref לקבצים:

Telerik.Windows.Controls
Telerik.Windows.Controls.GridView
Telerik.Windows.Controls.Input
Telerik.Windows.Data

  https://www.telerik.com/blogs/how-to-column-chooser-for-radgridview-for-silverlight-and-wpf

MainWindow.xaml

MainWindowxaml.cs

dummy class

VisisbilityToBoolConverter

ColumnChooser xaml page

ColumnChooser xaml.cs page

יום שני, 16 במאי 2022

הורדה ישירה מחנות מיקרוסופט

1. צריך למצוא את האפליקציה שרוצים להוריד, ולהעתיק את id שלה. 
למשל עבור WinDbg Preview   הכתובת היא:
https://apps.microsoft.com/store/detail/windbg-preview/9PGJGD53TN86
הקוד הוא 9PGJGD53TN86

2. ללכת לאתר: https://store.rg-adguard.net   לבחור ברשימה הנפתחת את product id להזין שם הקוד שהעתקנו,וללחוץ v. 
כמה שניות והכתובות יופיעו. 

 3. צריך להוריד קובץ appx

4. ע"פ אתר https://github.com/MicrosoftFeedback/WinDbg-Feedback/issues/19       צריך לעשות לקובץ unzip לתוך תיקיה ולהריץ את קובץ DbgX.Shell.exe 

5. ע"פ אתר https://digitalitskills.com   צריך להריץ PowerShell ולהתקין:
PS C:\WINDOWS\System32\Add-AppxPackage -Path C:\windbg.appx

יום ראשון, 30 בינואר 2022

מיפוי כונן רשת לאות כונן במחשב

מיפוי כונן רשת - נעשה בעבר כדי למפות database מרוחק

* חשוב לוודא תקשורת בין שני המחשבים (בעזרת ping)

שלבים:

1. למצוא את כתובת ip של המחשב (עם database) - למשל 125.16.54.77

2. לעשות מיפוי כונן רשת - לחיצה ימנית על סמל 'המחשב שלי' >  בחירת אות כונן (למשל A:) > 

לבחור ספריה בכונן הרשת שאנו רוצים, למשל:

\\125.16.54.77\d$\databases\

צריך לבחור ב-Connect using different Credntials אם רוצים להזין שםמשתמש וסיסמה לכונן.

3. לחיצה על Finish - אם סימנו V בסעיף הקודם, אז יפתח חלון Windows Security - נלחץ על More Choices - Use Different Accout ונזין את פרטי ההתחברות

4. כדי לנתקן מיפוי כונן - יש ללחוץ לחיצה ימנית על הכונן בחלון 'המחשב שלי' > Disconnect network drive





יום שלישי, 11 בינואר 2022

C# - Udp Server & Client

UDP Server:


  Thread trdServerUdp = 
     new Thread(new ThreadStart(serverThread));
  trdServerUdp.Start();
}

void ServerThread() {
  UdpClient server = new UdpClient(port);
  while (true) {
    IPEndPoint remoteIpep = new IPEndPoint(IPAddress.Parse(ip), port);
    byte[] receiveBytes = server.Receive(ref remoteIpep);
    string str = Encoding.ASCII.GetString(receiveBytes);
    Console.WriteLine($"{remoteIpep}: {str}");
  }
}
  
UDP Client:


  string ip = "127.0.0.1";
  int port = 8080;

  string input;
  UdpClient client = new UdpClient();
  client.Connect(ip, port);

  byte[] data;
  while (true) {
    input = Console.ReadLine();
    if (input == "exit") break;
    data = Encoding.ASCII.GetBytes(input);
    client.Send(data, data.Length);
  }
}
  

C# - Tcp Server & Client

קוד סרבר שמחכה עד שקליינט יתחבר, ואז מקבל הודעות ומחזיר אותן אל הקליינט:

TCP Server:

void server_foo(){
  int port = 9050;
  int recv;
  byte[]data = new byte[1024];
  IPEndPoint ipep = new IPEndPoint(IPAdress.Any, port);
  Socket newsock = new Socket(AddressFamily.InterNetwork, 
                        SocketType.Stream,
                        ProtocolType.Tcp);

  newsock.Bind(ipep);
  newsock.Listen(10);

  Console.WriteLine("waiting for client...");
  Socket client = newsoc.Accept();

  IPEndPoint clientep = (IPEndPoint )client.RemoteEndPoint;
  Console.WriteLine($"Connected with {clientep.Address} at port {clientep.Port}");
  data = Encoding.ASCII.GetBytes("[CONNECTED TO SERVER]");
  client.Send(data, data.Length, SocketFlag.None);

  while (true) {
     try {
        data = new byte[1024];
        recv = client.Receive(data);
        Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
        if(recv == 0) break; // 0 == exit
        client.Send(data, recv, SocketFlags.None);
     }
     catch (Exception ex) {
        Console.WriteLine(ex.Message);
        Console.ReadLine();
        break;
     }
     finally {
        client.Close();
        newsock.Close();
     }
  }
  Console.WriteLine($"Disconnected from {clientep.Address}:{clientep.Port}");
}
  
לחץ כאן כדי להעתיק את הקוד

קוד קליינט שמנסה כל 5 שניות להתחבר:

TCP Client:

void client_foo(){
   byte[]data = new byte[1024];
   string input, stringData;
   IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(ip), port);
   Socket server = new Socket(AddressFamily.InterNetwork, 
        SocketType.Stream,
        ProtocolType.Tcp);
  
  //try to connect:
  while (true) {
    try {
      server.Connect(ipep);
      Console.WriteLine("CONNECTED");
      break;
    }
    catch {
      //try to reconnect:
      Console.WriteLine("Unable to connect: " + ex.Message);
      Console.WriteLine("Trying to reconnect in:");
  
      for (int i = 1; i <= 5; i++) {
        Console.Write(i);
        Console.CursorLeft = 0;
        Thread.Sleep(1000);
      }
    }
  }

  // connected
  int recv = server.Receive(data);
  stringData = Encoding.ASCII.GetString(data, 0 ,recv);
  Console.WriteLine(stringData);
                            
  while (true) {
    input = Console.ReadLine();
    if (input == "exit") break;

    // send message
    server.Send(Encoding.ASCII.GetBytes(input));
                            
    // get message back
    data = new byte[1024];
    recv = server.Receive(data);
    stringData = Encoding.ASCII.GetString(data, 0 ,recv);
    Console.WriteLine(stringData);
  }

  //close connection to server
  Console.WriteLine("Disconnected from server");
  server.Shutdown(SocketShutdown.Both);
  server.Close();
}
לחץ כאן כדי להעתיק את הקוד

יום רביעי, 10 בנובמבר 2021

hack family safety lock

איך לפרוץ את נעילת הגנת הורים של windows

כאשר החשבון נעול מפני מנגנון הגנת משפחה (Family Safety Monitor by Microsoft Corporation), ומאפשר למשל כניסה הבאה רק ב-8 בבוקר, ניתן לפרוץ אותו בדרך הבאה:

להדליק ולכבות את המחשב לפני שהוא נכנס ל-windwos מספר פעמים עד שהמחשב יעלה במצב לתיקון בעיות אתחול.

ניתן לראות הדגמה לכניסה למערכת הקבצים כאן:

https://www.youtube.com/watch?v=n7KEwXbFlIU

צריך להיכנס למערכת הקבצים ולשנות את שם הקובץ 

c:\windows\system32\wpcmon.exe

לשם אחר - למשל להוסיף לשם הקובץ 1111

ואז להפעיל את המחשב מחדש.

הקובץ הזה הוא זה שמפעיל את מנגנון הגנת הורים, וכעת הוא לא יפעל בעליית windows

יום חמישי, 15 ביולי 2021

חלוקת מסך בדפדפן האינטרנט

ניתן לבצע חלוקת מסך אופקית או אנכית בדפדפן האינטרנט לשני אתרים בו זמנית!
לשם כך, לחצו ctrl+d בשביל יצירת סימניה חדשה ריקה, ובחרו ליצור אותה בסרגל הסימניות.

לאחר מכן, לחצו לחיצה ימנית על הסימניה ובחרו עריכה.
יופיעו שני שדות לעריכה: 
שם - כתבו חלוקה אנכית (או אופקית)
כתובת - לחצו לחיצה משולשת לבחירת כל הקוד, ואז העתיקו והדביקו אותו:

חלוקת מסך אנכית

חלוקת מסך אופקית

יום ראשון, 15 בנובמבר 2020

איך להריץ קובץ bat בתור מנהל מערכת

יש להוסיף את הקוד הזה בתחילת הקובץ, ובסופו את הקוד שנרצה להריץ בתור מנהלי מערכת:

כיצד ליצור קובץ bat:

1. יש לפתוח את התיקיה בה נרצה שיהיה הקובץ

2. לחיצה ימנית על שטח ריק > ניצור קובץ txt

3. נכתוב בתוכו את תוכן הקובץ ונשמור

4. נשנה את סיומת הקובץ מ-txt ל-bat - למשל

snir.txt  >   snir.bat

יום רביעי, 18 במרץ 2020

החבאת זיפ בתוך תמונה

אפשר 'להתחכם' ולהחביא קובץ ZIP שנרצה לשמור סודי,
ולשנות את סיומת הקובץ לכל סיומת שנבחר, למשל jpg .
אבל ברגע שננסה לפתוח את ה'תמונה' החדשה שעכשיו יצרנו ניתקל בהודעת שגיאה.


בשביל ליצור קובץ תמונה תקני שיתפקד כקובץ zip בשינוי סיומת הקובץ, יש לנקוט צעדים הבאים:
1. מקם את שני הקבצים , למשל - snir.jpg , elgabsi.zip - באותה תיקיה.
2. הקלד את הפקודה:
copy /b snir.jpg + elgabsi.zip ha_gever.jpg 
    כאשר ha_gever.jpg יהיה הקובץ הסופי שיכיל את שני הקבצים - המכווץ והתמונה - יחד .
    b/ משמעו קיצור ל "בינארי". הפקודה 'תעתיק' יחד את שני הקבצים.
    סדר רישום הקבצים בפקודה חשוב.
3. כעת נוצר הקובץ הסופי - ha_gever.jpg (אפשרי גם ליצור קובץ סופי בכל פורמט).
    שנה את סיומת הקובץ ע"מ להשתמש בו במתכונתו האחרת.

יום שבת, 26 באוקטובר 2019

how to get windows product key

1) פתח את 'פנקס הרשימות' - notepad

2) הדבק את הקטע הבא ושמור אותו בקובץ product-key.vbs


המקור מגיע מכאן:
https://www.slothparadise.com/how-to-get-windows-product-key

https://www.youtube.com/watch?v=wzuCgm7dIEc

יום שלישי, 10 בספטמבר 2019

VS_FileCompare

השוואת קבצים ע"י Visual Studio
ללא תוכנה חיצונית

כתבו את הקוד הבא בקובץ cmd
VS_FileCompare.cmd



השוואת הקבצים תיעשה ע"י כתיבת שורת הקוד הבאה


כאשר Form1.cs, Form2.cs הם שמות הקבצים שרוצים להשוות

יום חמישי, 22 בנובמבר 2018

כתיבה וטעינה של קבצי XML - שפת c#

כתיבה וטעינה של קבצי XML בשפת c#
ניתן לכתוב/לקרוא XML לכל סוג של מחלקה/אובייקט, גם אם יהיה זה אובייקט בסיסי (לדוגמה string) או מחלקה שנוצרה על-ידי המשתמש:

public class SnirXmlHandler
{
   /// <summary>save xml</summary>
   public static void Save<T>(T t, string filename)
   {
      try 
      {
         XmlSerializer serializer = new XmlSerializer(typeof(T));
         using (TextWriter textWriter = new StreamWriter(filename)) 
         {
            serializer.Serialize(textWriter, t);
            textWriter.Close();
         }
      }
      catch (Exception ex) { throw; }
   }

   /// <summary>load xml file</summary>
   public static T Load<T>(string filename)
   {
      T t;
      try 
      {
         XmlSerializer deserializer = new XmlSerializer(typeof(T));
         using (TextReader textReader = new StreamReader(filename)) 
         {
            t = (T)deserializer.Deserialize(textReader);
            textReader.Close();
         }
      }
      catch (Exception ex) { throw; }
      return t;
   }
}

שימוש לדוגמה:
public class MyClass
{
    public string Name { get; set; }
    public int[] Age { get; set; }
    public MyClass2 Mc2 { get; set; }
}

public class MyClass2
{
    public int[] Num { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        MyClass myclass = new MyClass()
        {
            Name = "snir",
            Age = new int[] { 1, 2, },
            Mc2 = new MyClass2 
            {
                Num = new int[] { 10, 45 }
            }
        };
        SnirXmlHandler.Save(myclass, "snir.xml");
        MyClass mc = SnirXmlHandler.Load("snir.xml");
    }
}



קובץ XML תוצאה:
<myclass xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <age> <name>snir</name> <age> <int>1</int> <int>2</int> </age> <mc2> <num> <int>10</int> <int>45</int> </num> </mc2> </myclass>

קונטרול webbrowser לגרסת Internet Explorer הכי גבוהה

כיצד להשתמש בקונטרול C# webbrowser שישתמש בגרסת internet explorer גבוהה (ולא גרסה 7 - ברירת מחדל)

1. יש לגשת לתיקיה זו ברגיסטרי
ולשנות/להוסיף מפתח זה עבור כל תוכנה רצויה
>HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

לערכים הבאים עבור גרסאות ie (בהתאמה לי המספר)
  • 7000 , 8888, 9000, 10000, 11000 (standards-based !DOCTYPE directives)
  • 8888, 9999, 10001, 11001 (regardless of the !DOCTYPE directive)

2. לאחר מכן, צריך להגדיר את internet explorer 11, לפי התמונות להלן:
(אפשרות זו אינה קיימת ב-internet explorer edge)
תרגום לעברית: הגדרות של תצוגת תאימות


יש אפשרות לעשות שהתוכנה תרשום את עצמה ברגיסטרי עבור שימוש בגרסה IE גבוהה יותר:
/// <summary>
/// Set IE Version to registry.
/// Options: 8888, 9999, 10001, 11001 (regardless of the !DOCTYPE directive) 
/// 7000, 8000, 9000, 10000, 11000 (standards-based !DOCTYPE directives)
/// </summary>
private void SetIeVersionInRegistery(string version)
{
   try
   {
      string key_str = @"Software\Microsoft\Internet Explorer\
                                      Main\FeatureControl
                                      \FEATURE_BROWSER_EMULATION";
      string exe_name = System.AppDomain.CurrentDomain.FriendlyName;

      RegistryKey myKey = Registry.CurrentUser.OpenSubKey(key_str, true);

      using (RegistryKey key = myKey.OpenSubKey(key_str, true))
      {
         if (myKey != null)
         {
            myKey.SetValue(exe_name, version, RegistryValueKind.DWord);
         }
      }
   }
   catch (Exception ex)
   {
      throw ex;
   }
}

יום שני, 8 באוקטובר 2018

איך לדחוף dll לתוך קובץ exe


1. במאפיינים של קובץ ה-dll שנוסף בתור reference, יש לשנות את Copy Local=False
2. את אותו קובץ שהוספנו בתור reference יש לגרור אל תוך הפרויקט ב-solution explorer
3. יש לשנות את המאפיין של קובץ זה: Build Action=Embedded
4. יש להעתיק את הקוד הבא למקום שלפני Application.Run בתוך הקוד של exe:

static class Program
{
   /// <summary>
   /// The main entry point for the application.
   /// </summary>
   [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
            Application.Run(new Form1());
        }

   private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
   {
            string dllName = args.Name.Contains(',') 
                ? args.Name.Substring(0, args.Name.IndexOf(',')) 
                : args.Name.Replace(".dll", "");
            dllName = dllName.Replace(".", "_");
            if (dllName.EndsWith("_resources"))
                return null;

            using (var stream = Assembly.GetExecutingAssembly()
                .GetManifestResourceStream(GetCurrentNamespace() + "." + dllName + ".dll"))
            {
                byte[] assemblyData = new byte[stream.Length];
                stream.Read(assemblyData, 0, assemblyData.Length);
                return Assembly.Load(assemblyData);
            }
   }

   [System.Runtime.CompilerServices.MethodImpl(MethodImplOptions.NoInlining)]
   public static string GetCurrentNamespace()
   {
            return 
    System.Reflection.Assembly.GetCallingAssembly().EntryPoint.DeclaringType.Namespace;
    }
 }