*FACEPALM* Знайшов. +1, +2.

Уявіть таку ситуацію :
Я створив програму (v1.0), код якої виклав у вільний доступ (на github/gitlab/sourceforge/<ще десь>).
Пройшов деякий час і я зрозумів, що моя програма - гівно (погана архітектура, неправильно зкопмоновані класи, методи названі невдало, оптимізації взагалі нема), короче я переписав програму з нуля і пафосно приліпив " v2.0".
Але вже є люди (розробники), які використовують стару версію в своїх проектах, їх влаштовує робота програми і вони не хочуть переписувати свій код із-за мене, також вони хочуть мати можливість скачувати код старої версії в майбутньому. Тобто я змушений залишити в своїх репозиторіях v1.0 і залити v2.0 не затераючи v1.0, хоча для користувачів (які не є розробниками) програма (v2.0) візуально виглядає точно так само як попередня.
Логіка підказує, що всі версії мають бути в одному репозиторії, але як це правильно зробити ?
Цілі :

  • Надати користувачам можливість завантажувати будь-яку версію програми;

  • Зберегти всі версії в одному ропезиторії. (насправді цей пункт під питанням)

Якщо знайдете якийсь проект на github, який є хорошим прикладом такої ситуації, то кидайте сюди посилання.
Якщо це питання вже є на stackoverflow - теж кидайте посилання.

І взагалі цікаво як ви робите в таких випадках.

Розділу про CVS я не знайшов, тому пишу тут.

3

(0 відповідей, залишених у Організація роботи форуму)

Розділ про системи керування версіями (Git, SVN, Mercurial, ...) був видалений, чи його не існувало ?
В будь-якому випадку на replaceі він повинен існувати.

PS. Ох уже ці подорожі в часі ...

4

(21 відповідей, залишених у JavaScript)

FakiNyan написав:

... я хотів використати "швидкість" малювання, чим швидше - тим тонша лінія, а швидкість мала б бути представлена відстанню між точками, тому що точки ставляться автоматично, через деякий час.

Швидкість = відстань / час.
Я не знайшов в вашому коді операцій з часом. Ви не враховуєте те, що в різних користувачів позиція вказівника мишки оновлюється з різною частотою.
Уявіть:
Користувач_1 має мишку з частотою оновлення 8 с-1;
Користувач_2 має мишку з частотою оновлення 32 с-1;
Два користувачі проводять мишкою лінію однакової форми з однаковою швидкістю, але за рахунок різних частот користувачі отримали зосім різні результати.

Потрібно засікати і позицію і час.

5

(33 відповідей, залишених у Pascal/Delphi)

darsteba написав:
    if((a4<3)&&(a2<6)){
    a4+=1;
    n=a1*1000+a2*100+a3*10+a4; // Ось цю строку підкажіть як пояснити.
    n2=n*n*n;
    printf("result: %d.",n2);
    }

*FACEPALM* *TIRED*

6

(33 відповідей, залишених у Pascal/Delphi)

darsteba написав:

... він питає що буде при 100%3, я кажу :"99,ой 33" ...

Ти не знаєш, приходь і здавай в середу

7

(9 відповідей, залишених у JavaScript)

koala написав:

Перевірив - firefox працює: https://jsfiddle.net/bvcjf7w4/4/

В мене теж все працює.

nazar написав:

на жаль, у мене не працює ... , і по вашому посиланню теж.

Народ, телепатично бачу, що ви повідкривали console своїх firefox'ів і переключаєтесь між консольою і іншою вкладкою. У firefox'і якщо фокус на консолі, то фокусу немає на вкладці.
Або відкрили jsfiddle і не віддали фокус нижній правій прямокутній області, в якій сидить документ і працює js код.

koala написав:

Чомусь onblur не спрацьовує ...

Як це у вас получається. Я би хотів відтворити цей ефект в себе. Опишіть детально.

8

(4 відповідей, залишених у C#, .NET)

Юрій_ написав:
Можете прокоментувати ці рядки коду
:

Private ReadOnly RequiredControls() As Control
 
    Public Sub New()
        InitializeComponent()
        RequiredControls = {
            ComboBox_Product,
            TextBox_Count,
            ComboBox_Executor
        }

RequiredControls - це масив Control'ів, які необхідно заповнювати;
Sub New() - конструктор;
InitializeComponent() - викликається метод згенерований VisualStudio;
{ ComboBox_Product, TextBox_Count, ComboBox_Executor } - значення масиву;
ComboBox_Product, TextBox_Count, ComboBox_Executor : шукайте на формі елементи з цими назвами.

9

(1 відповідей, залишених у C/C++)

Юра_Максименко написав:

'nullptr' was not declared in this scope GCC: (GNU) 4.9.3
В codeblocks прапорець виставлений на С++ 0х.

nullptr доступний в C++11.
Поміняйте параметри компіляції

-std=c++11

10

(4 відповідей, залишених у C#, .NET)

В ідеалі потрібно робити нащадків для Control'ів і додавати до них поля/властивості (наприклад властивість Required As Boolean), в дизайнері у властивостях встановлювати True або залинати False і потім в вашому циклі перевіряти значення цієї властивості.

Або зберігати в формі масив елементів Control'ів, які обов'язково заповнювати. Якось так можна

Public Class Form1
    Private ReadOnly RequiredControls() As Control

    Public Sub New()
        InitializeComponent()
        RequiredControls = {
            ComboBox_Product,
            TextBox_Count,
            ComboBox_Executor
        }
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_Check.Click
        Dim X As Object
        For Each X In Controls
            If TypeOf X Is TextBox Or TypeOf X Is ComboBox Then
                If RequiredControls.Contains(X) And X.Text = "" Then
                    MsgBox("Всі обовязкові поля повинні бути заполнені!", vbExclamation, "Повідомлення!")
                    Exit Sub
                End If
            End If
        Next
        MsgBox("Всі Обов`язкові поля заповнені!", vbInformation, "Повідомлення")
    End Sub
End Class

11

(3 відповідей, залишених у C/C++)

darsteba написав:
Є программа -

1.

{
     system("chcp 1251");
 printf("Речення:  \n");
    char a[101]="мдя ежс кек т з ок ес ";

 printf("Речення без першого словосполучення ЕЖС : \n");
// gets(a);
 if (p1(a,"ежс")) printf("Входжень буквосполучень 'ЕЖС' не знайдено ");

 printf("%s\n ",a);

 printf("Речення із заміненим буквосполученням Т на ДЮЕ : \n");
 //gets(b);
 if (p2(a,"т","дюе"))  printf("Входжень буквосполучень Т не знайдено ");

printf("%s\n",a);

printf("Скопійовані 6 символи з рядка S після першої З в рядок X : \n");
if(p3(a,"з",x)) printf("Входжень букви ч не знайдено ");
 printf("%s\n ",x);


if(p4(a,"ес","їжє"))
        printf("В реченні немає буквосполучення 'ес'.");
    else
        printf("\nРечення з заміненими 'ес' на 'їжє': %s",a);
    return 0;
}


2.

int strdel(char*str,int z,int k){
if(z<0)
    return -1;
if(k<0)
    return -2;
int len=strlen(str);
int m=z+k;
if(z<len)
{
    if(m>=len)
        str[z]=0;
        else
        strcpy(str+z,str+m);
}
return 0;
}
int strins(char *s1,const char*s2,int n)
 {
int len1=strlen(s1);
 if(n>len1 || n<0)
 return -1;
 int len2=strlen(s2);
 int i;
  for(i=len1; i>=n; i--)
 s1[i+len2]=s1[i];
 strncpy(s1+n,s2,len2);

3.

int strdel(char*str,int z,int k);
int strins(char *s1,const char *s2,int n);
int p3(char *c,const char *d,char *x);
int p4(char *S,const char *ed,const char *sh);

4.

int p1(char *a,const char *b){
char *p=strstr(a,b);
if (p==0)
  return 1;
  else{
  strdel(p,0,3);
  return 0;
  }
}
int p2(char *b, const char *n,const char *q){
    char *m=strstr(b,n);
 if (m==0)
    return 1;
 else{
     strdel(m,0,strlen(n));
     strins(m,q,0);
 return 0;
 }
}
int p3(char *c,const char *d,char *x){
char *ch=strstr(c,d);
if (ch==0)
    return 1;
else {
    strncpy(x,ch+1,6);
x[6]=0;
    return 0;

5.

#ifndef PUNKT_H_INCLUDED
#define PUNKT_H_INCLUDED

int p1(char *a,const char *b);
int p2(char *b, const char *n,const char *q);

#endif // PUNKT_H_INCLUDED

Змушуєте мене ненавидіти вас. Виправив відступи.

12

(10 відповідей, залишених у Web-сервери)

Це фіаско, братан.

Лот 2 - теж візьму 1 штуку за 100 грн.

14

(5 відповідей, залишених у JavaScript)

0) Такої хитрої реклами давно не бачив.
1) Якщо теги мають атрибут id, то їх можна витягти зразу через getElementById. Цикл тут зайвий.
2) Щоб відправити запит, вам не обов'язково натискати на кнопку. Достатньо використати XMLHttpRequest і вказати параметри для автентикації, наприклад :
https://cdnDomain.com/path/auth?login=loginValue&password=passValue
Червоні частини замініть на свої.

В мене питання стосовно лоту 26.
Можна брати поштучно, чи обов'язково всі ~50 ?
Якщо можна поштучно, то я би взяв 4 материнські

  • неробочі (з роз'ємами для задньої панелі) по 75 грн за кожну (300 грн за 4 штуки);

  • неробочі (без роз'ємів) по 25 грн за кожну (100 грн за 4 штуки);

Робочі плати є сенс продати комусь іншому (не мені).

Якщо брати треба зразу ящик того всього (плат), то я би дав 500 грн, але то буде виглядати як жлобство з мого боку.

P.Y. написав:

break/continue з міткою циклу, здається, тільки в Java'і зустрічається?

PHP теж надає можливість покинути кілька вкладених циклів.

17

(9 відповідей, залишених у Розваги та гумор)

В повідомленні знайшов пасхалку :

Пасхалка

P.Y. написав:
cat_voice="Miau"
dog_voice="Gau"
man_voice="Suka nahui"

Якщо знайдете ще якісь, то кидайте в цю тему :)

18

(7 відповідей, залишених у Бази даних)

Q-bart написав:

Що думаєте?

https://edgedb.com

М - маркетинг. Незначні недоліки виставляються як переваги, інші - не згадуються.

Engineer написав:

Ще можна загорнути все в try-catch і кидати Exception для виходу

throw + try-catch це надто дорогі операції.

Зупинився на goto. Тепер знаю, що існують випадки, де goto - найкраще рішення.

В мене є функція (тут я її спростив), яка містить кілька вкладених циклів. Наприклад :

bool cond1 = true;
wc1:                    // мітка 1
while(cond1) {
    bool cond2 = true;
    wc2:                // мітка 2
    while(cond2) {
        bool cond3 = true;
        while(cond3) {
            bool cond4 = true;
            if(cond4) {
                break;
                break;    // вихід з while(cond2) ? - не досяжний код
            }
            if(cond4)
                continue wc1; // вихід з while(cond2) ? - помилка компіляції
            bool cond5 = true;
            if(cond5)
                break wc1;    // вихід з while(cond1) ? - помилка компіляції
            // Я пам'ятаю, що в Java останні 2 випадки можна використовувати.
        }
    }
}

Мені потрібно з внутрішнього циклу вийти на N рівнів назад (відносно вкладеності циклів).

Я можу зробити і так :

bool cond1 = true;
while(cond1) {
    bool cond2 = true;
    while(cond2) {
        bool cond3 = true;
        while(cond3) {
            bool cond4 = true;
            if(cond4) {
                goto after_wc2;    // вихід з while(cond2).
            }
            bool cond5 = true;
            if(cond5) {
                goto after_wc1;    // вихід з while(cond1).
            }
        }
    }
    after_wc2:            // мітка 2
    ;
}
after_wc1:                // мітка 1
;

але якось не привично.

Може існує якесь гарніше рішення ?


Тільки не питайте мене, нащо я це роблю. Мене цікавить чисто синтаксично чи можливо таке.