@צבי-ש כתב בשיתוף | אב טיפוס של תוכנת תרגום אופליין:
זה לא זה?
https://huggingface.co/Helsinki-NLP/opus-mt-tc-big-he-en
מעניין, אני אבדוק את זה. תודה.
אתה יודע מה המשמעות של tc-big ??
@צבי-ש כתב בשיתוף | אב טיפוס של תוכנת תרגום אופליין:
זה לא זה?
https://huggingface.co/Helsinki-NLP/opus-mt-tc-big-he-en
מעניין, אני אבדוק את זה. תודה.
אתה יודע מה המשמעות של tc-big ??
@דאציג כתב בשיתוף | אב טיפוס של תוכנת תרגום אופליין:
רציתי להפנות את תשומת לבך, שיש תוכנת תמלול אופליין מבוססת AI (דורשת משאבים רבים), אמנם היא כעת בפיתוח, אבל - עובדת.
לא הכרתי, דווקא חיפשתי תוכנה כזאת לפני שהתחלתי לפתח.
בכל אופן התוכנה שהבאת משתמשת במודל התרגום NLLB-200 שזה מודל רב-לשוני של 200 שפות, ולכן הוא זולל הרבה משאבים (אצלי אני רואה 3.5 גיגה ראם בשימוש) שלא מתאימים למחשב רגיל
לפני שבחרתי את המודל תרגום לתוכנה בדקתי כמה מודלים, והסיבה שבחרתי את המודל הנוכחי (שנלקח מפה) היא בגלל שהוא דו-לשוני - לא זולל ראם, ותרגום יחסית בסדר (לא ראיתי מודלים שתרגמו יותר טוב).
בין המודלים שבדקתי:
SeamlessM4T ,MBART ,NLLB-200 ,M2M100
@pcinfogmach עוד אופציה למיטוב ביצועים, זה להשתמש ב - StringBuilder עם AppendLine, ולא עם Where ו - string.Join
@yossiz נכון, לכן לא הצעתי את זה, אבל אני אישית הייתי עושה ככה.
(כי בינתיים אף פעם לא נתקלתי בבעיה כזאת, ולעשות new[] { '\r', '\n' } כנראה יגרום ליצירת שורות ריקות מיותרות, כי ב-windows שורה חדשה זה: r\n\)
@pcinfogmach
במקום:
return string.Join("\n", nonEmptyLines);
עדיף:
return string.Join(Environment.NewLine, nonEmptyLines);
אני הייתי עושה את זה גם בשורה הראשונה במקום: new[] { '\r', '\n' }
https://drive.google.com/file/d/1cZE1URPl3PP3OPcbBW6KBPeGyzqZ0ibY/view?usp=sharing
פיתחתי את זה לצורך אישי, ואני מאמין שזה יהיה שימושי לעוד אנשים - בעיקר למי שלא משתמש באינטרנט.
נ.ב. אני יודע שהתרגום לא מושלם, ונקטע במשפטים ארוכים, אבל לבנתיים זה מה שהצלחתי לאופליין, אם יש הצעות ייעול אני ישמח לשמוע.
כהוספה למה ש @חגי כתב, הקוד ב - #C צריך להיראות ככה:
public static class Export
{
[UnmanagedCallersOnly(EntryPoint = "add")]
public static int Add(int a, int b) => a + b;
}
ובקובץ הפרוייקט להוסיף את השורה:
<PublishAot>true</PublishAot>
@pcinfogmach כתב באיך לתקשר בין חלקים שונים של תוכנה ב-C# wpf?:
הייתי שמח לשמוע אם זה הכוון הנכון
כן. אבל מי אני שאני יאשר...
@pcinfogmach כתב באיך לתקשר בין שלוש חלקים של תוכנה ב-C# wpf?:
אני רוצה ליידע את viewmodel ב' כאשר הנתונים ב-viewmodel א' משתנים. איך אני עושה זאת?
ה - ViewModel לא מאחסן את הנתונים, אלא רק מתווך אותם ממקור אחר (Service לדוגמא), אז הרעיון שברגע שהנתונים משתנים זה משתנה ביחד בשני ה - ViewModels. במצב תקין ViewModel צריך לדעת כמה שפחות על קיומם של ViewModels אחרים.
אם אתה מסתבך עם זה, אז תזרום עם מה שנוח לך, @dovid פעם טען שלא חייב לעשות הכל "לפי הספר" (ובפרט אם אתה מפתח יחיד שיודע להתמודד עם נקודות החולשה שלך)
@pcinfogmach כתב באיך לתקשר בין שלוש חלקים של תוכנה ב-C# wpf?:
אשמח לשמוע מהמומחים
אני לא מומחה גדול, אבל אם אתה הולך על MVVM אז לכאורה לא צריך להיות קשר בין פקדים/תצוגות, כל פקד/תצוגה הוא עצמאי, והוא מקבל את הנתונים שהוא אמור להציג דרך ה - ViewModel (כנראה מה שהתכוונת באפשרות 1)
אגב, אם אתה כבר מפתח ב - WPF ולא יודע מה זה DependencyProperty אז אתה ממש מפסיד...
@mekev אצלי במחשב יש בנתיב הרג'יסטרי הזה:
Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration\DELF06...\00
את הערכים PrimSurfSize.cx ו - PrimSurfSize.cy שמחזיקים את הערך של הרזולוציה של המסך, יכול להיות שאצלך החלק של הנתיב אחרי \Configuration\... יהיה טיפה שונה, אז תבדוק שם.
נ.ב. איך הגעתי לזה? פשוט:
א. הרצתי Procmon
ב. סיננתי את כל הפעולות חוץ מ - RegSetValue
ג. פתחתי הגדרות, ושיניתי את הרזולוצייה.
ד. חזרתי ל - procmon ועברתי על הערכים שהשתנו.
@pcinfogmach כתב בעזרה עם בעיה בהתחברות לגיטהב:
לפי מה שכתוב שם המתקין החדש אמור לטפל בזה באופן אוטומטי
כנראה שזה אמור לטפל באופן אוטומטי רק אם מותקן לך גיט, וכנראה שלא מותקן לך גיט באופן גלובאלי, (ויז'ואל סטודיו מאחסן את הבינאריים של גיט באיזשהו תיקיה במחשב וניגש אליהם באופן ישיר)
אז אפשרות אחת שתתקין גיט מכאן, ואח"כ תריץ git clone https://github/???.git עם הלינק של המאגר (כמובן אחרי ההתקנה של התעודה)
ואפשרות שניה שתבצע את מה שכתוב כאן תחת הכותרת: שימוש ב github desktop או בgit דרך תוכנות מסוימות למשל visual studio, ואגב, אם מותקן לך Everything זה יהיה יותר קל למצוא את הנתיב של git, פשוט תחפש git.exe
@aknvtchtk אפשר לשאול באיזה כלים השתמשת לחקור (לא להסיר) את WiFree3, ו-Videoff?
@חגי לא צריך לדבג את הקנרל בשביל להסיר, אני בטוח שרוב האלו שהסירו לא יודעים בכלל איך מדבגים קוד בקרנל, אני אישית מצאתי את החולשה בניתוח סטטי.
בקשר לוויפרי 3, ממה שאני זוכר, הדפוס פעולה שלו ממש דומה ל-vidoeff בלי להרחיב בפרטים, אני חושב שהרבה מהקוד של הדרייבר הגיע מ-videoff, ונכון שיותר קשה להסיר מוויפרי 2, אבל ברור שאפשרי.
@גאון כתב בחסימה של וייפרי פוגעת בחסימות אחרות חזקות יותר?:
לא, אלא א"כ אתה מונע מהם את המחשב לגמרי אבל אם אתה נון גישה אבל לא רוצה שהם יגשו רק לרשת אז זה לא רלונטי.
ברור שלא יעזור מבחינת החסימה (אני יודע שאפשר לאפס), אני התכוונתי אם זה יעזור כדי לדעת אם משהו עקף את זה או לא.
ואגב, את מי שזה מעניין, בזמנו כתבתי תוכנה שמסירה את וויפרי בכמה שניות. (גם פתחתי לנטפרי פנייה עם פרטי החולשה שמאפשרים את ההסרה הזאת, והדרך למניעתה)
@חגי כתב בחסימה של וייפרי פוגעת בחסימות אחרות חזקות יותר?:
ואני מאוד מקווה שהילדים שלי לא סוחרים בכרטיסי רשת חיצוניים וכונני live cd מאחורי גבי.
קוד ל bios לא יעזור לגבי זה?
הקוד הבא מחזיר את גרסת הדרייבר של videoff המותקנת במחשב.
public static class VideoffDetector
{
private const string VideoffPortName = "\\msdtghPort";
public static bool TryGetVersion(out int? version)
{
return TryGetVersionByCommunicationPort(out version);
}
private static bool TryGetVersionByCommunicationPort(out int? version)
{
version = null;
var hResult = FltLib.FilterConnectCommunicationPort(VideoffPortName, 0, 0, 0, 0, out var hPort);
if (hResult != 0)
{
return false;
}
try
{
var input = BitConverter.GetBytes(1);
var output = new byte[4];
hResult = FltLib.FilterSendMessage(hPort, input, output);
if (hResult != 0)
{
return false;
}
version = BitConverter.ToInt32(output);
return true;
}
finally
{
Kernel32.CloseHandle(hPort);
}
}
}
internal static partial class FltLib
{
private const string LibraryName = "FltLib";
[LibraryImport(LibraryName, StringMarshalling = StringMarshalling.Utf16)]
public static partial int FilterConnectCommunicationPort(string lpPortName, int dwOptions, nint lpContext, short wSizeOfContext, nint lpSecurityAttributes, out nint hPort);
[LibraryImport(LibraryName, EntryPoint = "FilterSendMessage")]
public static partial int FilterSendMessage(nint hPort, ReadOnlySpan<byte> lpInBuffer, int dwInBufferSize, ReadOnlySpan<byte> lpOutBuffer, int dwOutBufferSize, out uint lpBytesReturned);
public static int FilterSendMessage(nint hPort, ReadOnlySpan<byte> lpInBuffer, ReadOnlySpan<byte> lpOutBuffer)
{
return FilterSendMessage(hPort, lpInBuffer, lpInBuffer.Length, lpOutBuffer, lpOutBuffer.Length, out _);
}
}
internal static partial class Kernel32
{
private const string LibraryName = "Kernel32";
[LibraryImport(LibraryName)]
[return: MarshalAs(UnmanagedType.Bool)]
public static partial bool CloseHandle(nint hObject);
}
@mekev אני גם מצטרף ל @צדיק-תמים, התוכנה לכשעצמה עושה את העבודה מצוין, מניסיון אישי, לא נתקלתי בשום בעיה (ה'בעיה' היחידה שנתקלתי זה ששינויי מחיצות בדיסק לא חזרו לקדמותם לאחר הפעלה מחדש)