Biz paytda nima deganini eslolmaymanu, buni o'zim tasavvur qilib yozdim, ular ko'proq kitobiy, formal tilda gapiradi, oddiy va onson tushuntirib berishi uchun domlani o'zi OOP ni suv qilib ichvorgan bo'lishi kk.
:) Savollar chiqaveradi, bu shaxarlarga eng qisqa masofada eng kam pul sarflab yetib borishni qanday qilsa bo'ladi? kabi. Muhimi boshlang'ich algoritmni tushunib xazm qila olish, keyin uni optimallashtirish va kerakli shaklga solish mumkin.
$ids=array();
foreach ($model as $v) $ids[]=$v->id;
$sql = "update user_meta set seat_date='2222222' where id in (".implode(',',$ids).")";
$connection->createCommand($sql)->execute();
Bu ko'rinishdagi masalalar murakkabligi NP-complete masalalar sirasiga kiradi. Ya'ni kiruvchi ma'lumotlar (shaxarlar) soni oshib borishi bilan hisoblash jarayoni murakkablashib boradigan turdagi masalalardir, ularni hal etishda aniq algoritm ishlab chiqilmagan. Bu klassik Travelling Salesman Problem masalasining namumansi, ya'ni shaxarlar berilgan, eng qisqa masofada bir shaxardan ikkinchisiga borish. Bu ko'rinishdagi NP murakkablikdagi masalarni hal etishda kombinatorika, graflar, optimallashtirish, parallel hisoblash kabi ko'plab algoritmlar qo'llaniladi.
Hozirgi davrda bu turdagi masalalarni hal etish juda ham dolzarb sanaladi va logistika, genetika, telekommunikatsiya, kosmonavtika, harbiy kabi sohalarda amaliy qo'llaniladi.
Maqolada dastur kodida qo'llanilgan algoritm, uning bosqichlari, ma'lumotlar tuzilmasi haqida, koddagi asosiy tricklar haqida psevdokodda yoki yozma ko'rinishda batafsil to'xtalib o'tilsa juda ham yaxshi bo'lar edi, chunki hamma ham kodni o'qib chiqib mag'zini chaqa olmaydi.
Ha, ko'p sonli ma'lumotlar bilan ishlaganda, bazada bir qancha muammolar yuzaga keladi. Qanday qilib tezroq ...? degan savolga albatta proektni qurishdan avval javob topib kerakli texnologiyalarni o'rganib chiqish kerak. Hozirda MySql ni kerakli darajadagi tezligini ta'minlashda biz bilgan va bilmagan juda ko'plab sozlanmalari mavjud, oddiygina jadvalni yoki butun boshli baza arxitekturasini qurishdan tortib, server configuratsiyasi, master-slave nodlar bilan ishlash, keshlash kabi texnologiyalarni ham o'rganib chiqishga to'g'ri keladi. Menda maqola bo'yicha quyidagi fikrlar tug'ildi:
1. 10 ta user bir paytda millisekundigicha aniqlikda post qo'shish extimolini ko'rib chiqilibdi, bu yaxshi, lekin extimolligi juda ham past, agar bo'lganda ham kimdan keyin kim post qo'shganini userga qizig'i yo'q, aytmoqchi bo'lganim ular millisekundgacha aniqlikni sezmaydi ham, masalan mendan 1 millisekund keyin do'stim post qo'shdi nima, 1 millesekund oldin, farqi yo'q, muhimi post menga ko'rinsin, nari borsa minutlar farqi meni qiziqtirishi mumkin. Lekin yaxshi juda past extimollikni inobatga olingani.
2. Agar post o'chirilsa, yoki user do'stlar safidan o'chirilsa nima bo'ladi degan savol, bu yerdagi logika bo'yicha counterlarni kamaytirib chiqish kerakmi?
3. Agar order by qo'llanilmasa, user_newsfeed dagi qatorlar row_id qo'shilish tartibida select bo'ladi, Limit yordamida kerakli qatorlarni olsa bo'lmaydimi?
4. KEY `POST_COUNTER` (`id_user`,`counter`) index uchun unikal bo'lmagan qiymat berish extimolichi?
5. If(MutexHelpers::lock($lockKey, 5)){....} qatorga bir vaqtda kelib qolgan bir nechta userdan faqat bittasi shartni ichiga kiradi, qolganlari kutib turadimi yoki shartni bajarmay o'tib ketadimi? Shu logikani shared memory lar bilan hal qilsa bo'ladimi (APC yoki Memcache)
6.
for($i = $start; $i > $end && $i > 0; $i--)
{
$user_newsfeed = UserNewsfeed::hsFindByIndex(array($id_user, $i)); //$i - bu yerda counter qiymati
$post = PostsModel::hsFindByIndex($user_newsfeed->id_post);
...
}
Bu yerda sikl ichida bazaga so'rov berilyabdimi? Agar shunday bo'lsa nima uchun?
«guzal» so'zidan «ajal» so'zining uzoqligi 3 ga teng (1. g-ni o'chirish, 2. u-ni a-ga almashtirish, 3. z-ni j-ga almashtirish), ya'ni 3 ta tahrirlash amalga oshirilishi kerak. Bizdagi natijalarda faqat 2 ta tahrirlashdagi so'zlar olingan.
Ha albatta o'ziz generatsiya qilib ishlatsangiz bo'ladi, lekin o'ziz yasaganiz «Ishonchli sertifikat» sifatida ishlamaydi, brauzerda Security Error ogohlantirish bilan ochiladi. Ishonchli sertificat qilish uchun ushbu sertifikatingiz VerySign kabi sertifikat beruvchi tashkilotlar tomonidan imzolangan bo'lishi kerak.
C++ va Java, Python va Ruby to'grisidagi fikrlaringiz o'rinli, lekin PHP siz tasavvur etganchalik kichkina til emas. Ishonchim komilki ayni shu PHPda yozilgan ko'pgina freymworklar va platformalarda bugungi kunda qanday ommabop tizimlar ishlayotganligini hech kim inkor eta olmaydi: Facebook, Yii, Magento… Masalan siz shu platformalardan birini professional darajada o'rganib chiqaman desangiz kamida 1.5-2 yil vaqtingiz ketadi. PHP ni ham mukammal bilgan dasturchi hali beri «yiqilmasa kerak».
Fikringizga uncha qo'shilmayman, dasturlashning asl mantig'i bu algoritm, ixtiyoriy algoritmni tushunish va kerakli muammoga qo'llay bilish uchun matematik mantiq, matematik tafakkur shakillangan bo'lishi kerak. To'g'ri, hozirda dashturlash deganda tayyor shablonlar, texnologiyalar va kutubhonalardan foydalanib «LEGO» singari tayyor blocklarni birlashtirib biror bir mahsulot yaratish ham tushuniladi, bu holatda siz etgandek matematikaning ahamiyati yo'qdek, lekin keling bu yerda dasturlashni asl manosi bo'yicha tushunaylik ya'ni biror bir algoritmga asoslangan holda muammoni hal qilish yoki mahsulot yaratish. Hech qanday nazariyaga asoslanmagan kashfiyot dasturlashda bo'lishi mumkin emas, har qanday yetuk, ommabop, foydali dastur va ilovalar ilg'or g'oya bilan kuchli bilimni natijasidir. «Dasturlash» degan katta bir daryoda erkin suza olish uchun «hisoblash asoslari», «algoritm», «ma'lumotlar tuzilmasi» kabi nazaryalari yaxshi tushinish va bilish zarur va lozim, ularning asosi esa matematika. Hozirda sohaga endi kirib kelayotgan yosh mutaxassislar HTML, CMS, freymwork kabi yarimtayyor texnologiyalardan qanchalik mohirona foydalanmasin, ayni shu «LEGO» bloklari asosida yotuvchi algoritm mantig'ini esdan chiqarmasliklari kerak.
Firma baquvvat bo'lsa albatta stajerga kundalik xarajatlarida yordam berishi yaxshi shu bilan birga u qancha muddat ichida birinchi natijasini bera oladi shunga ham bogliq.
«Responsive design» texnologiyasini Twitter Bootstrap ni ishlatib, uni qoidalarini o'rganib chiqqanimda birinchi bor tushungan edim. Menimcha ayni shu qoidalar va Bootstrapdan namunalar keltirilsa o'rganuvchiga yanada tushunarliroq bo'ladi. Berilgan 2 ta maqolada nazariyotga ko'proq etibor bergansiz. Seriyali maqolalarda oldingi bo'limlarga havola (ssilka) berish ham maqsadga muvofiq.
Ha hozirda hamma muammolar «robotlar» orqali hal qilinadi, dastruchining vazifasi esa shu robotga to'g'ri buyruq berish, ya'ni algoritmlarni tushunish va kerakli muammoga qo'llay bilish.
Aniq bo'lib qoldiki sohaning chegarasi yo'q, bitta mutaxassis sohadagi 2-3 ta yo'nalishni o'rganib borishi qiyin bo'lib bormoqda.
— buni siz ham to'gri deb tan olyabsiz.
C/C++ da dasturlovchi ma'lumotlar bazasi yoki tarmoq texnologiyalari yoyinki bizga oddiygina ko'ringan PHP ni mukammal o'rganib, ulardan foydalangan holda yetuk mahsulot yarata olishi mumkin emasligi aniq bo'lib bormoqda
— PHP da mukammal mahsulot yaratib bo'lmaydi demoqchi emasman, aytmoqchi bo'lganim IT da X yo'nalishni (C/C++ yoki PHP yoki MobilDastrulash) professional darajada bilgan mutaxassis boshqa bir Y yo'nalishni professional darajada o'zlashtirishi qiyin demoqchiman. Bu yerda PHP misol sifatida etilgan. Chunki X ni professional o'rganish uchun kamida 2 yil shu bilan muntazam shug'ullanishi va real mahsulotlar yaratgan bo'kishi kerak, endi yana Y ni professional darajada bilishi uchun 2 yil vaqt sarflasa shu 2 yil ichida o'zining yo'nalishi X qay darajada o'zgarib, takomillashib ketishini tasavvur qilish qiyin emas.
Men ham maqolada bildirganim «universallik» cho'qqisiga chiqib bo'lmaydi, agar imkoni bo'lsada bu ayni bizni IT sohada befoyda ekanligini menimcha siz ham takidlayabsiz.
Hozirgi davrda bu turdagi masalalarni hal etish juda ham dolzarb sanaladi va logistika, genetika, telekommunikatsiya, kosmonavtika, harbiy kabi sohalarda amaliy qo'llaniladi.
Maqolada dastur kodida qo'llanilgan algoritm, uning bosqichlari, ma'lumotlar tuzilmasi haqida, koddagi asosiy tricklar haqida psevdokodda yoki yozma ko'rinishda batafsil to'xtalib o'tilsa juda ham yaxshi bo'lar edi, chunki hamma ham kodni o'qib chiqib mag'zini chaqa olmaydi.
1. 10 ta user bir paytda millisekundigicha aniqlikda post qo'shish extimolini ko'rib chiqilibdi, bu yaxshi, lekin extimolligi juda ham past, agar bo'lganda ham kimdan keyin kim post qo'shganini userga qizig'i yo'q, aytmoqchi bo'lganim ular millisekundgacha aniqlikni sezmaydi ham, masalan mendan 1 millisekund keyin do'stim post qo'shdi nima, 1 millesekund oldin, farqi yo'q, muhimi post menga ko'rinsin, nari borsa minutlar farqi meni qiziqtirishi mumkin. Lekin yaxshi juda past extimollikni inobatga olingani.
2. Agar post o'chirilsa, yoki user do'stlar safidan o'chirilsa nima bo'ladi degan savol, bu yerdagi logika bo'yicha counterlarni kamaytirib chiqish kerakmi?
3. Agar order by qo'llanilmasa, user_newsfeed dagi qatorlar row_id qo'shilish tartibida select bo'ladi, Limit yordamida kerakli qatorlarni olsa bo'lmaydimi?
4. KEY `POST_COUNTER` (`id_user`,`counter`) index uchun unikal bo'lmagan qiymat berish extimolichi?
5. If(MutexHelpers::lock($lockKey, 5)){....} qatorga bir vaqtda kelib qolgan bir nechta userdan faqat bittasi shartni ichiga kiradi, qolganlari kutib turadimi yoki shartni bajarmay o'tib ketadimi? Shu logikani shared memory lar bilan hal qilsa bo'ladimi (APC yoki Memcache)
6.
Bu yerda sikl ichida bazaga so'rov berilyabdimi? Agar shunday bo'lsa nima uchun?
— PHP da mukammal mahsulot yaratib bo'lmaydi demoqchi emasman, aytmoqchi bo'lganim IT da X yo'nalishni (C/C++ yoki PHP yoki MobilDastrulash) professional darajada bilgan mutaxassis boshqa bir Y yo'nalishni professional darajada o'zlashtirishi qiyin demoqchiman. Bu yerda PHP misol sifatida etilgan. Chunki X ni professional o'rganish uchun kamida 2 yil shu bilan muntazam shug'ullanishi va real mahsulotlar yaratgan bo'kishi kerak, endi yana Y ni professional darajada bilishi uchun 2 yil vaqt sarflasa shu 2 yil ichida o'zining yo'nalishi X qay darajada o'zgarib, takomillashib ketishini tasavvur qilish qiyin emas.
Men ham maqolada bildirganim «universallik» cho'qqisiga chiqib bo'lmaydi, agar imkoni bo'lsada bu ayni bizni IT sohada befoyda ekanligini menimcha siz ham takidlayabsiz.
Bu yerda manzil bo'yicha uning lat/long dagi koordinatalari aniqlanadi, api ni o'rganib chiqqan holda undan foydalansangiz bo'ladi.
maps.google.com/maps/api/geocode/json?address=kocha,shaxar,davlat&sensor=true ko'rinishida so'rov yuboriladi.
Batafsil: developers.google.com/maps/documentation/geocoding/