Jump to content

ოთო

წევრი
  • Posts

    9335
  • Joined

  • Last visited

  • Days Won

    7

Everything posted by ოთო

  1. პირველ სურათზე ჩანს ფონზე აპდეიტერი გაქ და არ გადაგირესტარტებია კაი ხანი კომპი გადაარესტარტე და უნდა გასწორდეს წესით. ერორი წაიკითხე, დარესტარტება ჭირდაბეაო რო არესტარტებ იგივეს გიწერს ზუსტად??
  2. თუ ცოცხალი სექტორები კიდე ბლომად დარჩა არაუშავს. ახალი HDD ჭკვიანია და შეუძლია გადაახტეს გაფუჭებულ სექტორებს მაგრამ 1თხელ უნდა გაატრო ნომრალურად რომ გაფუჭებულებზე არაფერი არ იყოს და ყველა გაფუჭებილი ახნიშნოს რო გაფუჭებულია
  3. c:usersuserappdatalocaltemp-ში შედი და ყველაფეირ რაც არის წაშალე
  4. JS-ს რას ერჩი jQuery, ExtJS, ბევრი რამე გასართობი და თავის ასატკიებელი მევთქვი ბექს მე დავწერ და შენ ფრონტი გააკეთე თქო
  5. front-end კაცი ხარ შენ თუ back-end?
  6. ვინდოუსი არ ჩატვრით აბა, ბიოსი გახსენი და ნახე თუ მაინც გაითიშება (წესით უნდა გაითიშოს) ქულერი რამდენი ხანი ტრიალებს მერე? სანამ დენიდან არ გამოერთებ? თუ ითიშება ყველაფერი უნდა გაითიშოს წესით ტემეპრატურის პრობლემა ჩანს ჩემი ვარაუდი ესეა, რომელიღაც არის დაზინებული აქედან, რაც უფრო ზემოთაა უფრო გმოონია რო დაიზნდა 1) პროცესორი 2) დედაპლატა 3) კვების ბლოკი
  7. მე შემიძლია გაკეთება ფასი დამოკიდებულია სიძნელეზე დეტალური ახნს მომწერე PM-ში და შენ რა ფასად გინდა და დანარჩენზე მოვრიგდებით. სურათიც თუ იქნება ძალიან კარგია, გინდა paint-ში გაკეთებული, გინდა photoshop-ში, ან თუნდაც პურცელზე ფანქრით დახატული.
  8. საიდან დაასკვენი რომ ოპერატიულები ცხელდება? ოპერატიულის გადაუხრება ძლაინ, ძალიან იშვიათია
  9. სათაური აქ ცუდი და არავინ არ შემოდის
  10. არამგონია კერნელისთვის პროგრამებს/მოდულებს/დრაივერების ბევრი წერდეს აქ (თუ საერთოდ ვინმე წერს) სამწუხაროდ, მაგრამ იყო ეს თემა მაინც. შეიძლება ვინმე დაინტერსდეს და დაიწყოს ინტერნეტშ უამრავი მასალაა, სამწუხაროდ ქართულ ენოვანი სახელმძღვანელო არ მომეპოვება წარმოდგენა რო შეგქმანთ როგორ გამოიყურება კერნელის მოდულები რამდენიმე მაგალითს ქვემოთ დავწერ. გაითვალისწინეთ რომ მარტო უნიქსის სისტემებზე მუშაობს ეს პროგრამები ყვლა კოდს რასაც დავპოსტავ, ჩემი დაწერილია და თუ სადმე გამოიყენებთ არ დაგავიწყდეთ დავიწყოთ მარტივით ეს პროგრამა ბეჭდავს თუ რამდენი პროცესია გშვებული ps aux ბეჭდავს ყველა პროცესებს, შემდეგ ამას ვამისამერთებთ wc-ში (ასოების, სიტყვების და ხაზბეის თვლა) და შემდეგომ -l -ით ვბეჭდავთ მარტო ხაზებს // © Otar Bichiashvili #include <stdio.h> #include <stdlib.h> int main() { int n = system("ps aux | wc -l"); if (n == -1) printf ("Errorn"); return 0; } ეს ცოტა უფრო დიდი პროგრამაა წამოდიგინეთ საერთ საპირფარეშო (ტაულეტი) სადაც 3 ადგილია ქალები და კაცები ერთად რა თქმა უნდა ვერ შევლენ ტულეტთან დგება რიგი, და შედიან შემდეგი პრინციპით: თუ რიგში კაცია პიველი და ტუალეტი ან ცარიელია, ან კაცია შიგნით და 1 ადგილი მიანცაა თავისუფალი, შედის თუ არადა ელოდება სანამ ადგილი გათვაისფუდლება, ან თუ შიგნით ქალია, მაშინ ელოდება სანამ ყველა გამოვა იგივე ხდება ქალზეც // © Otar Bichiashvili #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> int manCount, womanCount; sem_t x, y, z, womanSem, manSem, bathroomSize; void Delay(void) { int i; int time = random(); for (i = 0; i < time; i++); } void *Woman(void *ptr) { sem_wait(&z); sem_wait(&womanSem); womanCount++; if (womanCount == 1) { sem_wait(&manSem); } sem_post(&y); sem_post(&womanSem); sem_post(&z); sem_wait(&bathroomSize); printf("Woman in!n"); Delay(); printf("tWoman out!n"); sem_post(&bathroomSize); sem_wait(&y); womanCount--; if (womanCount == 0) { sem_post(&manSem); } sem_post(&y); } void *Man(void *ptr) { sem_wait(&z); sem_wait(&manSem); sem_wait(&x); manCount++; if (manCount == 1) { sem_wait(&womanSem); } sem_post(&x); sem_post(&manSem); sem_post(&z); sem_wait(&bathroomSize); printf("Man in!n"); Delay(); printf("tMan out!n"); sem_post(&bathroomSize); sem_wait(&x); manCount--; if (manCount == 0) { sem_post(&womanSem); } sem_post(&x); } int main(void) { int i; srandom(60); manCount = 0; womanCount = 0; sem_init(&x, 0, 1); sem_init(&y, 0, 1); sem_init(&z, 0, 1); sem_init(&womanSem, 0, 1); sem_init(&manSem, 0, 1); sem_init(&bathroomSize, 0, 3); pthread_t tid[20]; for (i = 0; i < 10; i++) { pthread_create(&tid, NULL, Woman, NULL); } for (i = 10; i < 20; i++) { pthread_create(&tid, NULL, Man, NULL); } for (i = 0; i < 20; i++) { pthread_join(tid, NULL); } sem_destroy(&x); sem_destroy(&y); sem_destroy(&z); sem_destroy(&manSem); sem_destroy(&womanSem); sem_destroy(&bathroomSize); return 0; } შედეგი აპლიკაცია უკვე სრულფასოვანი მოდულია რომელიც შეგიძლიათ დააყენოთ ეს არის უბრალო დრაივერი რომელიც აკონტროლებს ჩაწერა/წაკითხვას. მარტივად რომ თქვათ სადა დრაივერია რომელიც რეაგირებს ყველა სიმბოლოზე და არ ელოდება რაღაც ბლოკის ზოამს არსეობობს 2 ტიპის დრაივერები, character (რომელიც ყოველ სიმბოლოს წერს/კითხულობს ცალ-ცალკე) და block (რომელიც სიმბოლობის ჯგუფთან მუშაობს) // © Otar Bichiashvili #include <linux/module.h> #include <linux/moduleparam.h> #include <linux/init.h> #include <linux/kernel.h> /* printk() */ #include <linux/slab.h> /* kmalloc() */ #include <linux/fs.h> /* everything... */ #include <linux/errno.h> /* error codes */ #include <linux/types.h> /* size_t */ #include <linux/proc_fs.h> #include <linux/fcntl.h> /* O_ACCMODE */ #include <linux/seq_file.h> #include <linux/cdev.h> #include <asm/system.h> /* cli(), *_flags */ #include <asm/uaccess.h> /* copy_*_user */ #include "scull.h" /* local definitions */ /* * Our parameters which can be set at load time. */ int scull_major = SCULL_MAJOR; int scull_minor = 0; int scull_nr_devs = SCULL_NR_DEVS; /* number of bare scull devices */ int scull_quantum = SCULL_QUANTUM; int scull_qset = SCULL_QSET; module_param(scull_major, int, S_IRUGO); module_param(scull_minor, int, S_IRUGO); module_param(scull_nr_devs, int, S_IRUGO); module_param(scull_quantum, int, S_IRUGO); module_param(scull_qset, int, S_IRUGO); MODULE_AUTHOR("A.R."); MODULE_LICENSE("Dual BSD/GPL"); struct scull_dev *scull_devices; /* allocated in scull_init_module */ /* * Empty out the scull device; must be called with the device * semaphore held. */ int scull_trim(struct scull_dev *dev) { struct scull_qset *next, *dptr; int qset = dev->qset; /* "dev" is not-null */ int i; for (dptr = dev->data; dptr; dptr = next) { /* all the list items */ if (dptr->data) { for (i = 0; i < qset; i++) kfree(dptr->data); kfree(dptr->data); dptr->data = NULL; } next = dptr->next; kfree(dptr); } dev->size = 0; dev->quantum = scull_quantum; dev->qset = scull_qset; dev->data = NULL; return 0; } #ifdef SCULL_DEBUG /* use proc only if debugging */ /* * The proc filesystem: function to read and entry */ int scull_read_procmem(char *buf, char **start, off_t offset, int count, int *eof, void *data) { int i, j, len = 0; int limit = count - 80; /* Don't print more than this */ for (i = 0; i < scull_nr_devs && len <= limit; i++) { struct scull_dev *d = &scull_devices; struct scull_qset *qs = d->data; if (down_interruptible(&d->sem)) return -ERESTARTSYS; len += sprintf(buf+len,"nDevice %i: qset %i, q %i, sz %lin", i, d->qset, d->quantum, d->size); for (; qs && len <= limit; qs = qs->next) { /* scan the list */ len += sprintf(buf + len, " item at %p, qset at %pn", qs, qs->data); if (qs->data && !qs->next) /* dump only the last item */ for (j = 0; j < d->qset; j++) { if (qs->data[j]) len += sprintf(buf + len, " % 4i: %8pn", j, qs->data[j]); } } up(&scull_devices.sem); } *eof = 1; return len; } /* * Actually create (and remove) the /proc file(s). */ static void scull_create_proc(void) { struct proc_dir_entry *entry; create_proc_read_entry("scullmem", 0 /* default mode */, NULL /* parent dir */, scull_read_procmem, NULL /* client data */); entry = create_proc_entry("scullseq", 0, NULL); if (entry) entry->proc_fops = &scull_proc_ops; } static void scull_remove_proc(void) { /* no problem if it was not registered */ remove_proc_entry("scullmem", NULL /* parent dir */); remove_proc_entry("scullseq", NULL); } #endif /* SCULL_DEBUG */ /* * Open and close */ int scull_open(struct inode *inode, struct file *filp) { struct scull_dev *dev; /* device information */ dev = container_of(inode->i_cdev, struct scull_dev, cdev); filp->private_data = dev; /* for other methods */ /* now trim to 0 the length of the device if open was write-only */ if ( (filp->f_flags & O_ACCMODE) == O_WRONLY) { if (down_interruptible(&dev->sem)) return -ERESTARTSYS; scull_trim(dev); /* ignore errors */ up(&dev->sem); } return 0; /* success */ } int scull_release(struct inode *inode, struct file *filp) { return 0; } /* * Follow the list */ struct scull_qset *scull_follow(struct scull_dev *dev, int n) { struct scull_qset *qs = dev->data; /* Allocate first qset explicitly if need be */ if (! qs) { qs = dev->data = kmalloc(sizeof(struct scull_qset), GFP_KERNEL); if (qs == NULL) return NULL; /* Never mind */ memset(qs, 0, sizeof(struct scull_qset)); } /* Then follow the list */ while (n--) { if (!qs->next) { qs->next = kmalloc(sizeof(struct scull_qset), GFP_KERNEL); if (qs->next == NULL) return NULL; /* Never mind */ memset(qs->next, 0, sizeof(struct scull_qset)); } qs = qs->next; continue; } return qs; } /* * Data management: read and write */ ssize_t scull_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) { struct scull_dev *dev = filp->private_data; struct scull_qset *dptr; /* the first listitem */ int quantum = dev->quantum, qset = dev->qset; int itemsize = quantum * qset; /* how many bytes in the listitem */ int item, s_pos, q_pos, rest; ssize_t retval = 0; if (down_interruptible(&dev->sem)) return -ERESTARTSYS; if (*f_pos >= dev->size) goto out; if (*f_pos + count > dev->size) count = dev->size - *f_pos; /* find listitem, qset index, and offset in the quantum */ item = (long)*f_pos / itemsize; rest = (long)*f_pos % itemsize; s_pos = rest / quantum; q_pos = rest % quantum; /* follow the list up to the right position (defined elsewhere) */ dptr = scull_follow(dev, item); if (dptr == NULL || !dptr->data || ! dptr->data[s_pos]) goto out; /* don't fill holes */ /* read only up to the end of this quantum */ if (count > quantum - q_pos) count = quantum - q_pos; if (copy_to_user(buf, dptr->data[s_pos] + q_pos, count)) { retval = -EFAULT; goto out; } *f_pos += count; retval = count; out: up(&dev->sem); return retval; } ssize_t scull_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos) { struct scull_dev *dev = filp->private_data; struct scull_qset *dptr; int quantum = dev->quantum, qset = dev->qset; int itemsize = quantum * qset; int item, s_pos, q_pos, rest; ssize_t retval = -ENOMEM; /* value used in "goto out" statements */ if (down_interruptible(&dev->sem)) return -ERESTARTSYS; /* find listitem, qset index and offset in the quantum */ item = (long)*f_pos / itemsize; rest = (long)*f_pos % itemsize; s_pos = rest / quantum; q_pos = rest % quantum; /* follow the list up to the right position */ dptr = scull_follow(dev, item); if (dptr == NULL) goto out; if (!dptr->data) { dptr->data = kmalloc(qset * sizeof(char *), GFP_KERNEL); if (!dptr->data) goto out; memset(dptr->data, 0, qset * sizeof(char *)); } if (!dptr->data[s_pos]) { dptr->data[s_pos] = kmalloc(quantum, GFP_KERNEL); if (!dptr->data[s_pos]) goto out; } /* write only up to the end of this quantum */ if (count > quantum - q_pos) count = quantum - q_pos; if (copy_from_user(dptr->data[s_pos]+q_pos, buf, count)) { retval = -EFAULT; goto out; } *f_pos += count; retval = count; /* update the size */ if (dev->size < *f_pos) dev->size = *f_pos; out: up(&dev->sem); return retval; } /* * * The "extended" operations -- only seek * */ loff_t scull_llseek(struct file *filp, loff_t off, int whence) { struct scull_dev *dev = filp->private_data; loff_t newpos; switch(whence) { case 0: newpos = off; break; case 1: newpos = filp->f_pos + off; break; case 2: newpos = dev->size + off; break; default: return -EINVAL; } if (newpos < 0) return -EINVAL; filp->f_pos = newpos; return newpos; } struct file_operations scull_fops = { .owner = THIS_MODULE, .read = scull_read, .write = scull_write, .open = scull_open, .release = scull_release, }; /* * Finally, the module stuff */ /* * The cleanup function is used to handle initialization failures as well. * Thefore, it must be careful to work correctly even if some of the items * have not been initialized */ void scull_cleanup_module(void) { int i; dev_t devno = MKDEV(scull_major, scull_minor); /* Get rid of our char dev entries */ if (scull_devices) { for (i = 0; i < scull_nr_devs; i++) { scull_trim(scull_devices + i); cdev_del(&scull_devices.cdev); } kfree(scull_devices); } #ifdef SCULL_DEBUG /* use proc only if debugging */ scull_remove_proc(); #endif /* cleanup_module is never called if registering failed */ unregister_chrdev_region(devno, scull_nr_devs); } /* * Set up the char_dev structure for this device. */ static void scull_setup_cdev(struct scull_dev *dev, int index) { int err, devno = MKDEV(scull_major, scull_minor + index); cdev_init(&dev->cdev, &scull_fops); dev->cdev.owner = THIS_MODULE; dev->cdev.ops = &scull_fops; err = cdev_add (&dev->cdev, devno, 1); /* Fail gracefully if need be */ if (err) printk(KERN_NOTICE "Error %d adding scull%d", err, index); } int scull_init_module(void) { int result, i; dev_t dev = 0; /* * Get a range of minor numbers to work with, asking for a dynamic * major unless directed otherwise at load time. */ if (scull_major) { dev = MKDEV(scull_major, scull_minor); result = register_chrdev_region(dev, scull_nr_devs, "scull"); } else { result = alloc_chrdev_region(&dev, scull_minor, scull_nr_devs, "scull"); scull_major = MAJOR(dev); } if (result < 0) { printk(KERN_WARNING "scull: can't get major %dn", scull_major); return result; } /* * allocate the devices -- we can't have them static, as the number * can be specified at load time */ scull_devices = kmalloc(scull_nr_devs * sizeof(struct scull_dev), GFP_KERNEL); if (!scull_devices) { result = -ENOMEM; goto fail; /* Make this more graceful */ } memset(scull_devices, 0, scull_nr_devs * sizeof(struct scull_dev)); /* Initialize each device. */ for (i = 0; i < scull_nr_devs; i++) { scull_devices.quantum = scull_quantum; scull_devices.qset = scull_qset; sema_init(&scull_devices.sem, 1); scull_setup_cdev(&scull_devices, i); } /* At this point call the init function for any friend device */ dev = MKDEV(scull_major, scull_minor + scull_nr_devs); #ifdef SCULL_DEBUG /* only when debugging */ scull_create_proc(); #endif return 0; /* succeed */ fail: scull_cleanup_module(); return result; } module_init(scull_init_module); module_exit(scull_cleanup_module); რაიმე კითხვები თუ გაქვთ დამისვით და &#036;#^#(|დები გიპასუხოთ
  11. არსებობს მაგრამ დღეს დღებოთ არცერთ ახალი ვირუსი არაა გავრცელებული და როგორც ჩანს ყველა ძველი ჩაკვდა მაგრამ ეს არ ნიშნავს რო ლინუქსზე ვირუსი ვერ იარსებებს
  12. ალბათ ცუდ ვინდოუსს აყენებდი UEFI-ზე ცოტა სხვანაირი ყენდება, ძველ ბიოსზე სხვანაირი კონფიგურაციის ფაილშია განსხვავებები
  13. ბრაუზერების და ვებ სერვერების
  14. ლანის დრაივერი და ბიოსი არაფერ შუაში არაა საერთოდ ბიოსი ცალკე პატარა ოპერაციული სისტემაა
  15. არა, შენზე არააა ეგ დამოკიდებული. სისტემის იმპლემენტაციაზეა დამოკიდებული მარტო, როგორც დეველოპერი გადაწყვეტს ისე იქნება
  16. UEFI-ს ბევრი კარგი ფუნქცია აქვს რაც ძველ BIOS-ს არ გააჩნია. ყოველთვის ჯობია რო UEFI გამოიყენო პ.ს იგივე ოპერაციულ სისტემას 2ივეზე ვერ ჩატვრითავ. სხვა და სხვა ნაირად ყენდება, იმისს მიხედვით თუ რაზე აყენებ
  17. სადღაც ივლისისკენ დამჭირდება ალბათ, რამე თუ გამოვა იქმადე უკეთესი ჰო კაი, თუ არა და მაშინ ამას ვიყიდი ალბათ მადლობა
  18. სოსო იქნებ მეც დამეხამრო ბარეღამ ტერაბაიტინია SSD მჭირდება http://www.amazon.com/dp/B00E3W16OU/ ამას ნორმალური შეფასებები აქვს მაგრამ რამდენად კარგია არ ვიცი
  19. მსგავსი რაღაცეები ამრტივად არ ტყდება თუ ნორმლური პაროლი აქვს, მოკვადვის კომპიუტერს წლები კი არა შეიძლება ათწოლებით დასჭირდეს, თუ საუკუნეები არა (გააჩნია რამხელა პაროლი აქ, ავტომატურად დაგენერირებული გატხევა ეგრე დაივიწყე) ყველაზე "მარტივია" ვირუსის მაგვარი რამე გქონდეს და თვითონ როცა ჩაწერს პაროლს ეგ დაითრიო და ვსო 337 მილიონი პაროლი არაფერია მარტივად რომ გადავთვალოთ. ინგლისურში ხომ არის 26, ანუ დიდი და პატარა სულ 52, ამას კიდე ციფრები ეგ უკვე 62. ამას სხვა სპეციალური სიმბოლოები რომ არ დავამატოთ 5 ნიშნა პაროლის უკვე თითქმის მილიარდი კომბინაციაა (ზუსთად რომ ვთქვათ 916,132,832), ასე რომ ხელით პაროლების მორგებას წლები დაჭირდება თუ ნორმალური პაროლი აქვს
  20. სასურველია რო გამოცვალო, 2ივე როცა გეუბნება კვდებაო ე.ი რაღაც მართლა ჭირს
  21. მე ყოველთვის TCP-ს ვიყენებ როცა სერვერს ვაკეთებ ხოლმე და მშვიდად ვარ რო გზაში რამე ინფორმაცია არ დამეკარგება. გამოიყენება ინტერნეტ ბანკიგში, სადაც ინფორმაცია არ უნდა დაიკარგოს ბორუზერები და სერვერები იყენებ ყველა ხშირად, სხვა უცებ არ მახსენდება არაფერი შენი ბორუზერი ეხლა TCP-ს იყენებს
  22. ინგლისური თუ არა რუსული მიანც უნდა იცოდე ინტერნეტში რამის წაკითხვა თუ გინდა ნუ ძალიან მოკლედ რომ ვთქვათ ესეა TCP - სანდო კავშირია, "სამმაგი ხელის ჩამორთმევა" აქვს, ანუ მაგალითად პიროვნება A უგზავნის რაღაცას პირობნება B-ს, A-დან რომ მივა შეტყობინება B-სთან, B ეტყვის A-ს რომ ეს შეტყობინება მასთან მივიდა და მერე ისევ A ეტყვის B-ს რომ გაიგო რომ შეტყობინება მოუვიდა. ანუ გზაში თითქმის არასდროს არაფერი არ იკარგება, ცოტა ნელია მაგრამ სანდო. გამოიყენება სადაც ყველა პაკეტი მნიშვნელოვანია UDP - შედარებით ლაითია, გზა და გზა პაკეტები იკარგება, A უგზავნის B-ს და მორჩა, არანირი დადასტურება. გამოიყენება მაგალითად YouTube, Skype და ა.შ სადაც 1 კადრის დაკარგვას არაფერი გრანდიზული ზიანი არ მოყვება პაკეტების ზომაც სხვადასხვაა, ასევე დამოკიდებულია IPv4ია თუ IPv6. პაკეტების განლაგებაც და "დაშიფრვრაც" განსხვავდება დანარჩენი რამე კონკრეტული თუ გაინტერესებს მითხარი და &#036;#^#(|დები აგიხსნა
  23. კი კარგია დამწყებსაც კარგი ველოსპიედი რო ყავს. ნამდვილად არ ვიტყოდი უარს demo-ზე, როცა კატაობს ვიწყებდი (არც ეხლა ვიტყვი უარს ), მაგრამ ჩვეულებრივი სადა ბაიკით რო დავიწყე არც ეგ იყო კატასტროფა. ნელ ნელა ვითარდები და უფრო და უფრო კარგ ბაიკს დაითრევ. ვინც ნორმალურად ვერ კატაობს იმას კარბონის session 9 აზრი არააქ, ბაიკის შესაძლებლობის 10%საც ვერ გამოიყენებს იმდენად ნორმალურს იყიდი რო იკატავებ და ვერ გაღუნავ/გატეხავ მარტო სკოტი ხო არაა. ექტრიმშიც ექნბათ რამე და დარწმუნებული ვარ რომ შეუკვეთო ნორმალურსაც ჩამოგიყვანენ ვისთვის კამიკაძე და ვისთვის ადრენალინის მოყვარული
  24. არამგონია იმ დონის რაიდერი იყო რომ custom build დაგჭირდეს, აწყობილი ბაიკი რო იყიდო სრულიად დაგაკმაყოფილებს. 500$ ად ისეთ BMX-ის იყიდი ყელში რო გადაგივა, ბოლომდე ვერც გამოიყენებ. 3 მეტრიდან არ ხო არ ხტუნაობ სწორ ზედაპირზე რამე რო მოუვიდეს. არცერთ ნაწილზე არ მიდის განსაკუთრებულად დიდი დატვირთა, street/dirt-სგან განსხვავებით 14 კილოიანი BMX რა უბედურებაა, ჩემი 26 იანი dirt არ იწონის 14 კასკის გარეშეც მშენივრად დაიწყებ, ქართველი ხარ ბოლო-ბოლო, ერთ ორ დარტყმას აიტან კუსტბიდან ვეშვებოდი ნახევარიწელი უკასკოდ და არაფერი არ მომსვლია
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.