לא יודדע למה נכנס לי בראש שצריך לעשות את זה דווקא בשבת, גם את הטסט, הרי הטסט לא משנה מתי, אז התיישבתי לבצע טסט ולהפתעתי יצירת האינדקס לא לקח יותר מ 6 דקות.
וזה בכלל לא נעל את הטבלה להוספה
מה שגרם לי לחשוב שיקח הרבה זמן וינעל את הטבלה כי בעבר עשיתי פעולה על הטבלה שלקח הרבה שעות, כעת אני מקשר שאז הפעולה הייתה הוספת עמודה וזה באמת לקח המון המון זמן, נראה לי לילה שלם והשבית את הטבלה, יצירת אינדקס זה משהו אחר מהיר ולא נועל.
אך ראיתי שגם לאחר יצירת האינדקס שאילתות נתקעות ואז שמתי לב שהשאילתות שהשרת יוצר כוללות % ב like ולכן האינדקס לא עזר.
וא"כ השאלה המתבקשת בפוסט חדש
חוקר
-
mysql הוספת אינדקס על עמודת varchar(25) בטבלת עם 30,859,912 שורות -
mysql הוספת אינדקס על עמודת varchar(25) בטבלת עם 30,859,912 שורות@WWW כתב בmysql הוספת אינדקס על עמודת varchar(25) בטבלת עם 30,859,912 שורות:
הכי פשוט 5 לפנות בוקר, ואם זה עדיין בעייתי.
לא פותר אצלי,

אבל ליל שבת זה רעיון.. -
ubuntu כשרת מקומי@yossiz אמר בubuntu כשרת מקומי:
אתה צריך לכתוב 'my'@'%' עבור משתמש שיכול להתחבר מכל IP, או @<your-ip> עבור משתמש מ-IP מסויים.
כמעט בטוח שזה הבעיה, או לפחות חלק מהבעיה
שהמשתמש הוא לוקאלי בשרת עצמו ולא נגיש מבחוץ
חייבים ליצור משתמש לגישה חיצונית כמו ש @yossiz כתב -
נוד bcrypt עם מלח משלי@dovid אמר בנוד bcrypt עם מלח משלי:
בעת ניסיון כניסה אני רוצה לבדוק שזה אכן הסיסמה
אצלי ה signIn עובד כך, הרי אני דורש ממי שמזדהה כתובת מייל (או שם משתמש) וסיסמא.
ראשית כל שולפים מהבסיס נתונים את המשתמש העונה למייל המבוקש, ואח"כ משווים את הסיסמא עם פונקציה יעודית.
(אח"כ אני נותן טוקן jwt)exports.signin = (req, res) => { User.findOne({ where: { username: req.body.username } }) .then(user => { if (!user) { return res.status(404).send({ message: "משתמש לא נמצא." }); } if (user.status) { //משתמשים חסומים וכדומה return res.status(403).send({ message: user.status }); } var passwordIsValid = bcrypt.compareSync( req.body.password, user.password ); if (!passwordIsValid) { return res.status(401).send({ accessToken: null, message: "סיסמא שגויה!" }); } let expiresIn = 86400; if (req.body.rememberMe){ expiresIn = 86400 * 365; } var token = jwt.sign({ id: user.id }, config.secret, { expiresIn: expiresIn // 24 hours }); var authorities = []; var ability = [{ "action": 'read', "subject": 'Auth' }]; user.getRoles().then(async roles => { for (let i = 0; i < roles.length; i++) { authorities.push("ROLE_" + roles[i].name.toUpperCase()); } roles.sort((a, b) => (a.roleId < b.roleId) ? 1 : 0); let max = roles[0]; for (let i = 0; i <= ROLES.indexOf(max.name); i++) { ability.push({ "action": 'manage', "subject": ROLES[i] }); } res.status(200).send({ accessToken: token, "userData": { id: user.id, "fullName": user.username, username: user.username, "avatar": "/img/13-small.d796bffd.png", email: user.email, "role": "admin", roles: authorities, "ability": ability, }, "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.dfsgdffhd.gghdfjhgjnjyue576uyjd" }) }); }) .catch(err => { res.status(500).send({ message: err.message }); }); }; -
OAuth2 גוגל - יצירת אישורי אימות ללא צורך בהרצה לוקאלית של האפליקציה@צדיק-תמים
אני ניסיתי אפליקציה רק על מצב בדיקה כי אני עשיתי לשימוש אישי, ובמקרה כזה לא חייב בכלל לעבור דרך localhost, אלא אפשר להשים גם כתובות ודומיינים משלך, ולא חייב לעבור אימות, אלא אתה מגדיר בכתובות המורשות ל redirectUri את הכתובת המדוייקת של השירות שידע לקבל את הקוד ולשמור את האסימון המתקבל.
אתה מתכנן לעשות אפליקציה שתעבור בדיקת גוגל? -
הפעלת סקריפט של גוגל באמצעות שרת חיצוני (בתשלום)למה שלא תעבוד עם הAPI הרשמי לגוגל סקריפט?
זה אולי מסובך קצת ללמוד את הAPI של גוגל בהתחלה, אבל לכאורה זה שווה השקעה, עוד תמצא הרבה שימושים.
אני למשל לפני שנה הייתי צריך סינכרון אוטומטי מאקסלים בדרייב (מישהו עובד על הדרייב ישירות) לשרת שלי (להתעדכן בשינויים שההוא עשה).
למדתי את הAPI של ההזדהות מול גוגל (מדריך בסיסי שכתבתי אז) ואח"כ עשיתי שהשרת שלי בודק כל חמש דקות מול השרת של גוגל איזה קבצים השתנו ב 5 הדקות האחרונות, ובמידת הצורך אני מוריד לשרת שלי ומעבד את המידע.
כעת שגוגל ביטלו את ה SMTP כבר היה לי את המידע הנדרש איך לשלוח מיילים דרך הAPI של גוגל. -
חשבון מייל אקדמאי לJETBRAIN@clickone אמר בחשבון מייל אקדמאי לJETBRAIN:
@חוקר אני לא רואה שזה המחיר שלהם לשנה
כשאני נכנס אצלם אני רואה $89.00המחיר ששילמתי זה המחיר שמקבלים אחרי שהסטודנט גדל והיה לאיש.
לולי האפשרות של חשבון סטודנט לא הייתי קופץ לזה בתשלום, גם אני הייתי סטודנט כל עוד זה בא לי בקלות (חשבון אמיתי של חברים) ואחרי שהתרגלתי לתוכנה ואני מכיר את מעלותיה אני מוכן ואף רוצה לשלם..@clickone אמר בחשבון מייל אקדמאי לJETBRAIN:
אתה בטוח בזה?
בטוח
זה מופיע מפורש

-
שליחת הודעת מג'ימייל באמצעות node-mailer וכדומהלפי ההודעה שהגיע במייל שהחל מ 30/05/2022 תיחסם הגישה באמצעות שם משתמש וסיסמא
אפשר להגיד שלום לספריות כמו node-mailer של שליחת מיילים באמצעות גוגל?
או שניתן יהיה להמשיך? או שהגישה תיהיה אחרת?

-
nodejs הגדרת פונקציית השרת כ async@dovid אמר בnodejs הגדרת פונקציית השרת כ async:
אם זו השאלה, אז בטח שזה טוב, אדרבא הדרך הקודמת שלך הייתה משונה.
זה הגיע מחוסר ידיעה..
כשהתחלתי לכתוב nodejs (בזכותך..) לפני 3 שנים בערך, לא ידעתי שניתן לעשות זאת, והתמודדתי בשינויים מPHP לnodejs, ורק זה היה הפיתרון שמצאתי אז..
מאז התקדמתי המון ב"ה.. אבל לא היה לי צורך ממשי לשנות, לאחרונה כבר תקופה שחשבתי לשנות זאת, אבל הסתפקתי, כעת נוצר לי צורך חוזר, ואמרתי בא נברר את זה.
למעשה, תוך כדי, לאחר שכתבתי את הפוסט כאן ניסיתי לחפש בגוגל ומצאתי פוסט בנושא, מבחינת הטיפול בשגיאות, ואני מנסה להבין את זה איפה זה ישנה לי.
https://stackoverflow.com/questions/44813401/passing-in-async-functions-to-node-js-express-js-router/67689269#67689269 -
הוספת מתודה ל moment@יוסף-בן-שמעון אמר בהוספת מתודה ל moment:
@חוקר תחשוב טוב אם כדאי לך להתערב ב API של ספריה חיצונית, למה שלא תעשה פונקציה עצמאית שתחזיר את הערך שאתה רוצה?
הרבה פעמים האובייקט מכיל תאריך שאינו התאריך הנוכחי, וא"כ אצטרך תמיד להעביר לפונקציה אובייקט של התאריך, יותר קריא וקל לעשות זאת ישירות מתוך האובייקט, אבל אתה מעלה רעיון נכון
-
אסימון רענון ב API של יוטיוב ב PHPהאסימון של refreshToken נוצר פעם אחת לכל אפליקציה.
ייתכן שכבר יצרת את זה פעם אחת בהצלחה ולכן ביצירות הבאות הוא לא יוצר לך אותו.
תוכל להכנס להגדרות החשבון שלך, לשונית אבטחה, אפליקציות צד ג' ולבטל את ההרשאה של האפליקציה שלך, לאחר מכן ביצירת ההרשאה הבאה זה כן ייצור לך טוקן.
לפי הנראה אצלך אתה שומר את הטוקן בתוך הקוד, לכן הייתי מציע שתדפיס את הטוקן למסך לדפדפן, ואז תעתיק אותו לתוך הקוד, והוא לא אמור יותר להשתנות.
https://myaccount.google.com/permissions?gar=1&continue=https%3A%2F%2Fmyaccount.google.com%2Fsecurity%3Fgar%3D1

-
ספריית nodemailer והאבטחה של גוגלב"ה אצלי זה עובד כבר כמה שנים שליחה של עשרות מיילים ביום דרך חשבון שלי ב gmail ללא שום בעיה.
בפעם או בפעמים הראשונות היה עלי לאשר את הפעילות "זה הייתי אני" ואח"כ עבד תקין -
בית חכם...@yossiz אמר בבית חכם...:
אל תשקיע שקל בזה עד שתהיה בטוח שאתה באמת מבין בנושא
אם הזמן יותר חשוב לך מכסף אז גם את הזמן תשקיע רק בחכמה..
אני צריך לטפל בחיבור מדפסת קופה לאחד הפרוייקטים שלי, הזמנתי בעלי אקספרס מדפסת כזו והיא לא עלתה יקר, אך הזמן ששרפתי להסתדר עם העברית היה מידי הרבה (אני נוטה להיות עקשן למצוא דרך לבצע משהו שאני אמור לבצע, אני לא אוהב את המשפט "אי אפשר" או "לא יודע איך" או "לא הצלחתי"..) אך בסוף החלטתי שאני מחוייב לחזור לשגרה של פעולות שמחכות לביצוע שלי ולחכות אולי עד אחרי הימים טובים או מה.. -
התממשקות ל API של ניהול קופה והדפסת הקבלה על נייר תרמי@avi-rz אמר בהתממשקות ל API של ניהול קופה והדפסת הקבלה על נייר תרמי:
שהוא יפתח את חלון ההדפסה ותוכל לבחור מדפסת.
אני מחפש משהו ללא החלונית הזו
אלא בסיום עדכון התשלום זה יודפס אוטומטי
אני רואה שנראה שיש אפשרות ע"י מדפסת שמחוברת לרשת והדפסה ע"י התחברות לרשת הפנימית
https://www.npmjs.com/package/receiptline?activeTab=readme
אך אם כן השאלה היא איך ניתן להוציא חשבוניות/קבלות מאושרות לצרכי מס -
הראוטר VUE לא קולט טובאני משתמש עם קובץ .htaccess שזה תוכנו:
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.htmlרק שים לב להשים את הקובץ בתיקיית public מה שיגרום שבכל פעם שעושים build הקובץ יתווסף ל dist או איך שזה מוגדר שנקרא אצלך.
אחרת זה ימחק בכל בכל build מחדש

-
דליפת זיכרון בהרצת הbuild בnode.js@chagold
אציין שמאז שנכנסתי רציני לvue ואני עובד כל הזמן על מצב serve עם vue-cli פתוח ראיתי שזה דורש המון משאבים ופשוט קניתי מחשב חדש..
את הפיתוח אני עושה על המחשב ומעביר לשרת רק קבצים מוכנים.
תעשה את החשבון שלך כמה העבודה באמצעות npm חוסך לך ותחשב עם שווה לך להשקיע בזה כסף.. -
צד קליינט וצד שרת@chagold אמר בצד קליינט וצד שרת:
כרגע אפאצי. אם חובה לעבור אז אני רוצה לדחות את זה קצת.
אני ינסה עם זה. ואם לא ילך אעדכן.אני בשעתו היה לי צורך במשהו הפוך.
רציתי שכל הניתובים יועברו לפרימווק YII שנמצא בתוך תיקיות משנה, מלבד הAPI שנמצא בתיקיית השורש.
וזה היה ההגדרות ששמתי אז
אולי תוכל לקחת השראה מזה..<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_URI} !/api/ RewriteRule ^(.*)$ yii/frontend/web/$1 [L] </IfModule> -
VUE ניטור שינויים במשתנה המאוכלס ב store@chagold
על פי דבריך ומראי המקומות ב"ה הצלחתי.
מה שעשיתי הואcomputed: { getSelectedProject: () => store.state.app.selectedProject, }, watch: { getSelectedProject(val) { this.selectedProject = val this.myProvider() }, },יש לי אובייקט getSelectedProject שהוא מחושב ומקושר ל store ויש לי צופה באם הערך של getSelectedProject השתנה הוא מפעיל את הפונקציה של ריענון הנתונים וכו' מול השרת.
תודה רבה! -
References ב-PHP@dovid אמר בReferences ב-PHP:
@חוקר אני בחיים לא צריך את הפונקציה הזאת...
לפני
if (!myData.ExtraMessageReadingConfirmation[ProjectID]){ myData.ExtraMessageReadingConfirmation[ProjectID] = {}; } if (!myData.ExtraMessageReadingConfirmation[ProjectID][messageId1]){ myData.ExtraMessageReadingConfirmation[ProjectID][messageId1] = {}; } if (!myData.ExtraMessageReadingConfirmation[ProjectID][messageId1][userId]){ myData.ExtraMessageReadingConfirmation[ProjectID][messageId1][userId] = {}; } myData.ExtraMessageReadingConfirmation[ProjectID][messageId1][userId]['np'] = 1;אחרי
__.setDescendantProp(myData.ExtraMessageReadingConfirmation, ProjectID + '.' + messageId1 + '.' + userId + '.' + 'np', 1);בצורת העבודה שלי יש לי המון אובייקטים שמכילים תתי אבוייקטים ותתי תתי וכו'.
לפני הפונקציה הייתי משתגע איך אני מגדיר ערך לאובייקט שאני לא יודע אם כבר קיים הנתיב שלו דהיינו תתי/תתי תתי/תתי תתי תתי
אם אגדיר אותו ישירות אקבל שגיאה שלא ניתן להגדיר ערך ל undefined.
באמצעות הפונקציה הנ"ל ששידרגתי אותה לצורה כזו:setDescendantProp : function (obj, desc, value) { if (!desc){return obj = value;} let arr = desc.split('.'); while (arr.length > 1) { let shift = arr.shift(); if (typeof obj[shift] === 'undefined'){obj[shift] = {}} obj = obj[shift]; if (typeof obj[arr[0]] === 'undefined' && arr.length > 1){obj[arr[0]] = {}} } return obj[arr[0]] = value; },אני מגדיר בקלות את הנתיב המלא, ומזין את הערך הנדרש באובייקט המקורי - הגלובאלי
-
References ב-PHPאני לא הצלחתי הרבה להתעמק בנושא הזה.
אבל אציין דוגמא של משהו שאולי זה חלק מהכוונה של @yossiz
ואולי זה יפתח קצת את התאבון להבין טוב יותר את הנושא (גם אני לא יודע בזה הרבה)$rows = self::find() ->where(['ProjectID' => \common\models\GetProjectID::getProjectID()]) ->andWhere(['id' => $selection]) ->andWhere(['is', 'PaymentDetails', new \yii\db\Expression('null')])->asArray()->all(); $rows2 = []; foreach ($rows as $row){ if ($row['TotalToPaid'] > 0) { if (isset($Students[$row['StudentId']])) { $row['Bank'] = $Students[$row['StudentId']]['BankNumber']; $row['Branch'] = $Students[$row['StudentId']]['BranchNumber']; $row['AccountNumber'] = $Students[$row['StudentId']]['AccountNumber']; $row['TeudatZehut'] = $Students[$row['StudentId']]['Identity']; $row['ClientName'] = $Students[$row['StudentId']]['Family'] . ' ' . $Students[$row['StudentId']]['Name']; }else{ $row['Bank'] = ''; $row['Branch'] = ''; $row['AccountNumber'] = ''; $row['TeudatZehut'] = ''; $row['ClientName'] = ''; } $rows2[] = $row; } } return $rows2;במקרה זה, היה לי מערך שעלי היה להוסיף נתונים לאיברים, ולקבל מערך חדש הכולל את האיברים.
אם זה היה כמו ב JS למשל הייתי עושה זאת פשוט יותר:$rows = self::find() ->where(['ProjectID' => \common\models\GetProjectID::getProjectID()]) ->andWhere(['id' => $selection]) ->andWhere(['is', 'PaymentDetails', new \yii\db\Expression('null')])->asArray()->all(); foreach ($rows as $row){ if ($row['TotalToPaid'] > 0) { if (isset($Students[$row['StudentId']])) { $row['Bank'] = $Students[$row['StudentId']]['BankNumber']; $row['Branch'] = $Students[$row['StudentId']]['BranchNumber']; $row['AccountNumber'] = $Students[$row['StudentId']]['AccountNumber']; $row['TeudatZehut'] = $Students[$row['StudentId']]['Identity']; $row['ClientName'] = $Students[$row['StudentId']]['Family'] . ' ' . $Students[$row['StudentId']]['Name']; }else{ $row['Bank'] = ''; $row['Branch'] = ''; $row['AccountNumber'] = ''; $row['TeudatZehut'] = ''; $row['ClientName'] = ''; } } } return $rows;דהיינו כשעושים foreach, הוא לא מעביר לי את האיבר האמיתי המקורי, אלא איבר משוכפל, ששינוי בו אינו משנה כלום באיבר המקורי, ב JS לעומת זאת ניתן להעביר משתנים אפילו לפונקציות שהן משנות את האיבר המקורי.
דוגמא לזה, פונקציות שאני משתמש איתן המוןfunction setDescendantProp(obj, desc, value) { var arr = desc.split('.'); while (arr.length > 1) { obj = obj[arr.shift()]; } return obj[arr[0]] = value; } var obj = {a: {b: {c: 0}}}; var propPath = getPropPath(); // returns e.g. "a.b.c" var result = setDescendantProp(obj, propPath, 1); // obj.a.b.c will now be 1מקור: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval
אציין, שאני התחלתי עם PHP, וכשנתקלתי בפונקציה הנ"ל setDescendantProp לקח לי המון זמן לעבוד איך עובד הפלא ההוא.