Programistyczne WTF jakie Was spotkały

Programistyczne WTF jakie Was spotkały
mcoder
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 5 lat
  • Postów:117
0

Chciałem użyć takich czarów, aby dodać dni do daty:

Kopiuj
const __int64 nano100SecInDay=(__int64)10000000*60*60*24;
__int64 num = GetDlgItemInt(hwndDlg, IDC_DAYEDIT, NULL, NULL);
SYSTEMTIME st1;
FILETIME ft;
 SYSTEMTIME st2;
 __int64* pi; 

SystemTimeToFileTime (&st1,&ft); 
pi = (__int64*)&ft; 
(*pi) += (__int64)num*nano100SecInDay; 

FileTimeToSystemTime (&ft,&st2);

Po godzinie myślenia czemu nie działa - poszedłem po linii najmniejszego oporu:

Kopiuj
WORD wMaxDay;

if((st.wMonth == 9) || (st.wMonth == 4) || (st.wMonth == 6) || (st.wMonth == 11))
{
     wMaxDay = 30;
}
else if(st.wMonth == 2)
{
	if((stpay.wYear % 4) == 0) 
	{ 
		if((stpay.wYear % 100) == 0) 
		{
			if( (stpay.wYear % 400) == 0) 
				wMaxDay = 29;
			else 
				wMaxDay = 28;
		} 
		else 
			wMaxDay = 29;
	}
	else
		wMaxDay = 28;
}
else
{
     wMaxDay = 31;
}

if(st.wDay == wMaxDay)
{
    st.wDay = 1;
    st.wMonth++;
    if(st.wMonth == 13)
    {
		st.wMonth = 1;
		stpay.wYear++;
	}
}
else
{
	st.wDay += GetDlgItemInt(hwndDlg, IDC_DAYEDIT, NULL, NULL);
}

<sup>_</sup>
Zobacz pozostały 1 komentarz
Azarien
@ShookTea: dałeś się zmylić ;-) ten kod jest prawidłowy, choć wygląda strasznie...
ShookTea
Tak, teraz jeszcze zobaczyłem na wierzchu %4... To nie wygląda strasznie, to po prostu jest straszne.
Marooned
Przecież jasno widać %4,100,400 czyli zgodnie z obecnymi zasadami
Azarien
Te "obecne" zasady mają już 431 lat, ale wciąż się spotyka nieaktualny kod.
bogdans
Moderator
  • Rejestracja:ponad 16 lat
  • Ostatnio:prawie 5 lat
0

Precyzyjna informacja o rodzaju błędu

An error occured: DailymotionPlayer is not defined at undefined line undefined


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
unikalna_nazwa
no czyli nigdzie nie jest zdefiniowany ;D
mcoder
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 5 lat
  • Postów:117
0

Największy WTF to robienie programu bez specyfikacji.

  1. Nie dostałeś informacji jak zrobić
  2. robisz po swojemu
  3. jest źle
  4. dostajesz niedokładną informację jak poprawić
  5. poprawiasz
  6. nadal nie jest tak jak ma być
  7. poprawiasz znowu
  8. i wracamy do punktu pierwszego

<sup>_</sup>
Zobacz pozostałe 2 komentarze
fasadin
opisałeś moją pierwszą pracę :D Ja miałem tak że koleś podchodził kasował połowe linijki, coś tam dopisywał (oczywiście nie do końca) i szedł :D
dzek69
@fasadin: To pół linijki robi aż taką dużą różnicę w funkcjonalności? o.O
fasadin
źle napisałem, połowę funkcji ;) ogólnie ze stanu kompilowalnego doprowadzał do stanu który nie wiadomo o co chodzi i nie dało się skompilować. A że funkcja była bardzo duża to już inna historia ;)
siararadek
Ja pracowałem w firmie gdzie się robiło kod w ten sposób. Po 2 miesiącach zwolnili mnie (nie przedłużyli okresu próbnego, ale na jedno wychodzi) bo powiedzieli, że nie są zadowoleni z rozwoju aplikacji, którą się zajmuję. Firma aktualnie nie istnieje :D
Marooned
Dzień jak co dzień. Niestety, wypominanie nic nie daje.
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Stacktrace
  • Postów:6821
2

SQL od Oracle ma taki feature co się nazywa Hints. Dla nie obeznanych, jest to taki specjalny rodzaj komentarza umieszczanego w zapytaniu, który wskazuje optymalizatorowi jak planować zapytanie. Generalnie zabawka fajna jak odbezpieczony granat.

Mamy sobie zapytanie "na 350 linii" z czego 330 (po formatowaniu sql developerem) to lista hintów. Przychodzi zgłoszenie z produkcji (po wdrożeniu), że "zapytanie działa 3h i nic się nie dzieje, a działało 15 minut"(join na kilku tabelach + 3xunion tego joina bo jeden parametr się zmienia, w sumie wynik to około 4mln rekordów). Odpalam analizę planu... koszt 133355036258513296.

Bez hintów koszt wynosi 83595.

Na czym polega WTF? Otóż bez hintów plan zapytania jest mocno niestabilny i czasami zawiesza proces. Zasada była taka, że jak wdrażamy nową wersję to po przebudowaniu statystyk zapytań zamrażamy je i generujemy nowy zestaw hintów. Tu nikt nie wygenerował nowych hintów tylko od razu zgłosił problem. Najzabawniejsze jest jednak to, że nie ma żadnego systemowego rozwiązania tego problemu ponad cykliczne wdrażanie "poprawki" w postaci nowego zestawu hintów. Ktoś rzucił użycie SPM, ale nikt nie wie jak to działa... poza tym nie dostaniemy uprawnień by się nim pobawić.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
Zobacz pozostałe 2 komentarze
Koziołek
@Azarien, zestawienie operacji za jeden dzień w banku. zapytania nie za bardzo już idzie przerobić. @siararadek, po co mi stronicowanie danych przy zaciąganiu do hurtowni skoro i tak muszę pobrać wszystkie?
KR
Prawdziwy WTF polega na używaniu Oracla. A kolejny WTF to zasilanie hurtowni wynikami zapytania SQL. 15 minut na 4 mln rekordów, WTF, to jak grube te rekordy są? Jeśli w tych rekordach nie ma jakiś BLOBów, to przecież to powinno śmigać w sekundy a nie minuty. Zwykły laptop jest w stanie zasysać dane z dysków prędkością kilkaset MB/s (maks przepustowość typowego SATA w laptopie to 600 MB/s, dość łatwo wysycić), a serwer z Oraclem nie może?
Azarien
ja myślę że jest to po prostu błąd projektowy, w dużym rozumieniu "projektu". nikomu niepotrzebne są 4 miliony rekordów na raz. nikt nie będzie tego czytał ;)
Azarien
No dobra; jaki to bank? bo w PKO mi jeden przelew czasem tydzień idzie. :P
Koziołek
@Azarien, jeden z większych. Poza tym tego nikt nie czyta, tylko jest dalej przepychane do systemów raportowych i "czarymary" przygotowujacych kampanie targetowane. @Krolik, on przesadziłem z tymi 15 minutami, ale generalnie to czas tego rzędu. Ciągnie bloby, dużo małych joinów (słowniki), trochę caseów. Plus całość na nie najnowszej maszynie. Poza tym tam coś z siecią jest "od dawna". Czasy dotychczas akceptowalne, po zmianie się okazało, że już nie za bardzo.
KR
Moderator
  • Rejestracja:prawie 21 lat
  • Ostatnio:około 18 godzin
  • Postów:2964
0

Może nie totalny WTF, ale zabawne. Właśnie znalazłem w kodzie:

Kopiuj
    public static final long aVeryLongTime = 259200 * 1000; // 3 days
Zobacz pozostałe 2 komentarze
no_solution_found
a co jeśli wykonuje się np w cronie?
hauleth
@ShookTea - serwery HTTP, bazy danych, cron, daemony systemowe, cache, loggery - dużo jest tego. Zaryzykował bym, że większość oprogramowania działa dłużej niż 3 dni.
KR
Mnie w tym kodzie śmieszy to, że dla kogoś 3 dni to jest "a very long time". A WTF jest w tym, że to powinno być jakoś lepiej nazwane, właśnie żeby nie trzeba było patrzeć na użycie, by zrozumieć po co jest ta stała.
Azarien
@ShookTea: jak przeczytałem tego posta to moją reakcją było raczej że 3 dni to śmiesznie krótko na "very long time", a nie odwrotnie...
Azarien
zresztą sama liczba to jest "magic number". lepiej byłoby coś w stylu 3*24*3600*1000 albo nawet 3*24*60*60*1000.
02
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 8 lat
  • Postów:1176
0

Komentarz z jre:

Kopiuj
Class<?> cl = getProxyClass0(loader, interfaces); // stack walk magic: do not refactor
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 godziny
0

Chwaliłem sobie offline'owy help w Visual Studio 2012.

Przed chwilą pojawiła się mała, jednomegowa aktualizacja. Kliknąłem.
Aktualizacja wycięła całego helpa do zera doszczętnie. Kilka gigabajtów.

Repozytorium jest puste, nie można nic przywrócić.

Nie wiem czy to tylko fakap podczas próby wypuszczenia prawdziwej aktualizacji, ale WTF na pewno.

Póki co nie aktualizujcie helpa ;-)

0

@Azarien:
wczoraj zainstalowałem VS2012 i dzisiaj miałem jedynie NuGet do pobrania. Żadnego "helpa" nie chciało aktualizować.

KR
Moderator
  • Rejestracja:prawie 21 lat
  • Ostatnio:około 18 godzin
  • Postów:2964
0
Kopiuj
public class JobTracker {
   ....
   public JobTracker(JobConf conf) throws IOException, InterruptedException {
   
    this.queueManager = qm;
    this.clock = clock;
    // Set ports, start RPC servers, setup security policy etc.
    InetSocketAddress addr = getAddress(conf);
    this.localMachine = addr.getHostName();
    this.port = addr.getPort();
    // find the owner of the process
    // get the desired principal to load
    UserGroupInformation.setConfiguration(conf);
    SecurityUtil.login(conf, JT_KEYTAB_FILE, JT_USER_NAME, localMachine);

    long secretKeyInterval = 
    conf.getLong(DELEGATION_KEY_UPDATE_INTERVAL_KEY, 
                   DELEGATION_KEY_UPDATE_INTERVAL_DEFAULT);
    long tokenMaxLifetime =
      conf.getLong(DELEGATION_TOKEN_MAX_LIFETIME_KEY,
                   DELEGATION_TOKEN_MAX_LIFETIME_DEFAULT);
    long tokenRenewInterval =
      conf.getLong(DELEGATION_TOKEN_RENEW_INTERVAL_KEY, 
                   DELEGATION_TOKEN_RENEW_INTERVAL_DEFAULT);
    secretManager = 
      new DelegationTokenSecretManager(secretKeyInterval,
                                       tokenMaxLifetime,
                                       tokenRenewInterval,
                                       DELEGATION_TOKEN_GC_INTERVAL);
    secretManager.startThreads();
       
    MAX_JOBCONF_SIZE = conf.getLong(MAX_USER_JOBCONF_SIZE_KEY, MAX_JOBCONF_SIZE);
    //
    // Grab some static constants
    //
    TASKTRACKER_EXPIRY_INTERVAL = 
      conf.getLong("mapred.tasktracker.expiry.interval", 10 * 60 * 1000);
    RETIRE_JOB_INTERVAL = conf.getLong("mapred.jobtracker.retirejob.interval", 24 * 60 * 60 * 1000);
    RETIRE_JOB_CHECK_INTERVAL = conf.getLong("mapred.jobtracker.retirejob.check", 60 * 1000);
    retiredJobsCacheSize =
             conf.getInt("mapred.job.tracker.retiredjobs.cache.size", 1000);
    MAX_COMPLETE_USER_JOBS_IN_MEMORY = conf.getInt("mapred.jobtracker.completeuserjobs.maximum", 100);

    // values related to heuristic graylisting (a "fault" is a per-job
    // blacklisting; too many faults => node is graylisted across all jobs):
    TRACKER_FAULT_TIMEOUT_WINDOW =  // 3 hours
      conf.getInt("mapred.jobtracker.blacklist.fault-timeout-window", 3 * 60);
    TRACKER_FAULT_BUCKET_WIDTH =    // 15 minutes
      conf.getInt("mapred.jobtracker.blacklist.fault-bucket-width", 15);
    TRACKER_FAULT_THRESHOLD =
      conf.getInt("mapred.max.tracker.blacklists", 4);
      // future:  rename to "mapred.jobtracker.blacklist.fault-threshold" for
      // namespace consistency

    if (TRACKER_FAULT_BUCKET_WIDTH > TRACKER_FAULT_TIMEOUT_WINDOW) {
      TRACKER_FAULT_BUCKET_WIDTH = TRACKER_FAULT_TIMEOUT_WINDOW;
    }
    TRACKER_FAULT_BUCKET_WIDTH_MSECS =
      (long)TRACKER_FAULT_BUCKET_WIDTH * 60 * 1000;

    // ideally, TRACKER_FAULT_TIMEOUT_WINDOW should be an integral multiple of
    // TRACKER_FAULT_BUCKET_WIDTH, but round up just in case:
    NUM_FAULT_BUCKETS =
      (TRACKER_FAULT_TIMEOUT_WINDOW + TRACKER_FAULT_BUCKET_WIDTH - 1) /
      TRACKER_FAULT_BUCKET_WIDTH;

    NUM_HEARTBEATS_IN_SECOND = 
      conf.getInt(JT_HEARTBEATS_IN_SECOND, DEFAULT_NUM_HEARTBEATS_IN_SECOND);
    if (NUM_HEARTBEATS_IN_SECOND < MIN_NUM_HEARTBEATS_IN_SECOND) {
      NUM_HEARTBEATS_IN_SECOND = DEFAULT_NUM_HEARTBEATS_IN_SECOND;
    }
    
    HEARTBEATS_SCALING_FACTOR = 
      conf.getFloat(JT_HEARTBEATS_SCALING_FACTOR, 
                    DEFAULT_HEARTBEATS_SCALING_FACTOR);
    if (HEARTBEATS_SCALING_FACTOR < MIN_HEARTBEATS_SCALING_FACTOR) {
      HEARTBEATS_SCALING_FACTOR = DEFAULT_HEARTBEATS_SCALING_FACTOR;
    }

    // This configuration is there solely for tuning purposes and
    // once this feature has been tested in real clusters and an appropriate
    // value for the threshold has been found, this config might be taken out.
    AVERAGE_BLACKLIST_THRESHOLD =
      conf.getFloat("mapred.cluster.average.blacklist.threshold", 0.5f);

    // This is a directory of temporary submission files.  We delete it
    // on startup, and can delete any files that we're done with
    this.conf = conf;
    JobConf jobConf = new JobConf(conf);

    initializeTaskMemoryRelatedConfig();

    // Read the hosts/exclude files to restrict access to the jobtracker.
    this.hostsReader = new HostsFileReader(conf.get("mapred.hosts", ""),
                                           conf.get("mapred.hosts.exclude", ""));
    aclsManager = new ACLsManager(conf, new JobACLsManager(conf), queueManager);

    LOG.info("Starting jobtracker with owner as " +
        getMROwner().getShortUserName());

    // Create the scheduler
    Class<? extends TaskScheduler> schedulerClass
      = conf.getClass("mapred.jobtracker.taskScheduler",
          JobQueueTaskScheduler.class, TaskScheduler.class);
    taskScheduler = (TaskScheduler) ReflectionUtils.newInstance(schedulerClass, conf);
    
    // Set service-level authorization security policy
    if (conf.getBoolean(
          ServiceAuthorizationManager.SERVICE_AUTHORIZATION_CONFIG, false)) {
      ServiceAuthorizationManager.refresh(conf, new MapReducePolicyProvider());
    }
    
    int handlerCount = conf.getInt("mapred.job.tracker.handler.count", 10);
    this.interTrackerServer = 
      RPC.getServer(this, addr.getAddress().getHostAddress(), addr.getPort(), handlerCount,
          false, conf, secretManager);
    if (LOG.isDebugEnabled()) {
      Properties p = System.getProperties();
      for (Iterator it = p.keySet().iterator(); it.hasNext();) {
        String key = (String) it.next();
        String val = p.getProperty(key);
        LOG.debug("Property '" + key + "' is " + val);
      }
    }

    String infoAddr = 
      NetUtils.getServerAddress(conf, "mapred.job.tracker.info.bindAddress",
                                "mapred.job.tracker.info.port",
                                "mapred.job.tracker.http.address");
    InetSocketAddress infoSocAddr = NetUtils.createSocketAddr(infoAddr);
    String infoBindAddress = infoSocAddr.getAddress().getHostAddress();
    int tmpInfoPort = infoSocAddr.getPort();
    this.startTime = clock.getTime();
    infoServer = new HttpServer("job", infoBindAddress, tmpInfoPort, 
        tmpInfoPort == 0, conf, aclsManager.getAdminsAcl());
    infoServer.setAttribute("job.tracker", this);
    // initialize history parameters.
    final JobTracker jtFinal = this;
    getMROwner().doAs(new PrivilegedExceptionAction<Boolean>() {
      @Override
      public Boolean run() throws Exception {
        JobHistory.init(jtFinal, conf,jtFinal.localMachine,
            jtFinal.startTime);
        return true;
      }
    });
    
    infoServer.addServlet("reducegraph", "/taskgraph", TaskGraphServlet.class);
    infoServer.start();
    
    this.trackerIdentifier = identifier;

    createInstrumentation();
    
    // The rpc/web-server ports can be ephemeral ports... 
    // ... ensure we have the correct info
    this.port = interTrackerServer.getListenerAddress().getPort();
    this.conf.set("mapred.job.tracker", (addr.getAddress().getHostAddress() + ":" + this.port));
    this.localFs = FileSystem.getLocal(conf);
    LOG.info("JobTracker up at: " + this.port);
    this.infoPort = this.infoServer.getPort();
    this.conf.set("mapred.job.tracker.http.address", 
        infoBindAddress + ":" + this.infoPort); 
    LOG.info("JobTracker webserver: " + this.infoServer.getPort());
    
    // start the recovery manager
    recoveryManager = new RecoveryManager();
    
    while (!Thread.currentThread().isInterrupted()) {
      try {
        // if we haven't contacted the namenode go ahead and do it
        if (fs == null) {
          fs = getMROwner().doAs(new PrivilegedExceptionAction<FileSystem>() {
            public FileSystem run() throws IOException {
              return FileSystem.get(conf);
          }});
        }
        // clean up the system dir, which will only work if hdfs is out of 
        // safe mode
        if(systemDir == null) {
          systemDir = new Path(getSystemDir());    
        }
        try {
          FileStatus systemDirStatus = fs.getFileStatus(systemDir);
          if (!systemDirStatus.getOwner().equals(
              getMROwner().getShortUserName())) {
            throw new AccessControlException("The systemdir " + systemDir +
                " is not owned by " + getMROwner().getShortUserName());
          }
          if (!systemDirStatus.getPermission().equals(SYSTEM_DIR_PERMISSION)) {
            LOG.warn("Incorrect permissions on " + systemDir +
                ". Setting it to " + SYSTEM_DIR_PERMISSION);
            fs.setPermission(systemDir,new FsPermission(SYSTEM_DIR_PERMISSION));
          }
        } catch (FileNotFoundException fnf) {} //ignore
        // Make sure that the backup data is preserved
        FileStatus[] systemDirData = fs.listStatus(this.systemDir);
        // Check if the history is enabled .. as we cant have persistence with 
        // history disabled
        if (conf.getBoolean("mapred.jobtracker.restart.recover", false) 
            && systemDirData != null) {
          for (FileStatus status : systemDirData) {
            try {
              recoveryManager.checkAndAddJob(status);
            } catch (Throwable t) {
              LOG.warn("Failed to add the job " + status.getPath().getName(), 
                       t);
            }
          }
          
          // Check if there are jobs to be recovered
          hasRestarted = recoveryManager.shouldRecover();
          if (hasRestarted) {
            break; // if there is something to recover else clean the sys dir
          }
        }
        LOG.info("Cleaning up the system directory");
        fs.delete(systemDir, true);
        if (FileSystem.mkdirs(fs, systemDir, 
            new FsPermission(SYSTEM_DIR_PERMISSION))) {
          break;
        }
        LOG.error("Mkdirs failed to create " + systemDir);
      } catch (AccessControlException ace) {
        LOG.warn("Failed to operate on mapred.system.dir (" + systemDir 
                 + ") because of permissions.");
        LOG.warn("Manually delete the mapred.system.dir (" + systemDir 
                 + ") and then start the JobTracker.");
        LOG.warn("Bailing out ... ", ace);
        throw ace;
      } catch (IOException ie) {
        LOG.info("problem cleaning system directory: " + systemDir, ie);
      }
      Thread.sleep(FS_ACCESS_RETRY_PERIOD);
    }
    
    if (Thread.currentThread().isInterrupted()) {
      throw new InterruptedException();
    }
    
    // Same with 'localDir' except it's always on the local disk.
    if (!hasRestarted) {
      jobConf.deleteLocalFiles(SUBDIR);
    }

    // Initialize history DONE folder
    FileSystem historyFS = getMROwner().doAs(
        new PrivilegedExceptionAction<FileSystem>() {
      public FileSystem run() throws IOException {
        JobHistory.initDone(conf, fs);
        final String historyLogDir = 
          JobHistory.getCompletedJobHistoryLocation().toString();
        infoServer.setAttribute("historyLogDir", historyLogDir);

        infoServer.setAttribute
          ("serialNumberDirectoryDigits",
           Integer.valueOf(JobHistory.serialNumberDirectoryDigits()));

        infoServer.setAttribute
          ("serialNumberTotalDigits",
           Integer.valueOf(JobHistory.serialNumberTotalDigits()));
        
        return new Path(historyLogDir).getFileSystem(conf);
      }
    });
    infoServer.setAttribute("fileSys", historyFS);
    infoServer.setAttribute("jobConf", conf);
    infoServer.setAttribute("aclManager", aclsManager);

    if (JobHistoryServer.isEmbedded(conf)) {
      LOG.info("History server being initialized in embedded mode");
      jobHistoryServer = new JobHistoryServer(conf, aclsManager, infoServer);
      jobHistoryServer.start();
      LOG.info("Job History Server web address: " + JobHistoryServer.getAddress(conf));
    }

    this.dnsToSwitchMapping = ReflectionUtils.newInstance(
        conf.getClass("topology.node.switch.mapping.impl", ScriptBasedMapping.class,
            DNSToSwitchMapping.class), conf);
    this.numTaskCacheLevels = conf.getInt("mapred.task.cache.levels", 
        NetworkTopology.DEFAULT_HOST_LEVEL);

    //initializes the job status store
    completedJobStatusStore = new CompletedJobStatusStore(conf, aclsManager);

    pluginDispatcher = PluginDispatcher.createFromConfiguration(
            conf, "mapred.jobtracker.plugins", JobTrackerPlugin.class);
    pluginDispatcher.dispatchStart(this);


   }
}

Klient skarżył się, że mu w tym kodzie leci "Cannot bind to port 8012: Address already in use." Co może być przyczyną? ;)

Sarrus
Błąd jest gdzieś w konstruktorze ;)
somekind
Przynajmniej są wcięcia w kodzie. ;)
KR
Błędem jest brak obsługi błędów. Konstruktor może wywalić się w wielu miejscach, ale nic nie łapie wyjątku i nie zamyka portów zanim konstruktor się zakończy. Po opuszczeniu konstruktora nie da się posprzątać, bo nie masz już instancji obiektu - porty pozostają otwarte i nie da się ponownie wystartować JobTrackera bez restartu całego procesu. Taki sam błąd jest w TaskTrackerze. Ogólnie taki niedbały kod jest tam wszędzie w Hadoopie.
somekind
Dlatego właśnie uważam, że konstruktory powinny być proste i nie powinny wykonywać żadnych operacji na zewnętrznych zasobach. Takie konstruktory nie mają szans się wywalić, ani napsuć.
KR
Twórcy Hadoopa chyba nie potrafią inaczej. Ja to się czasem zastanawiam, jak to możliwe, że ten ich kod w ogóle jakoś działa. Z innych WTFów: puste zadanie, przetwarzające 0 rekordów na pojedynczym komputerze (nie-klaster) wykonuje się ok. 20 sekund.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 godziny
0
Azarien napisał(a):

Aktualizacja wycięła całego helpa do zera doszczętnie.

No cóż, zaczęło się. Zgłoszone dzisiaj bugi:

· no content in help viewer 2.0 — to moje, byłem pierwszy ;-)
· MS Help viewer update removes existing content and has no sources to re-download from
· Help Viewer - After Applying Update, All Content Disappears!
· VS2012 help viewer can't take a books catalog
· Microsoft Help Viewer 2.0 deletes all local catalogs and will no longer fetch books online
· HelpViewer Update Removed All Help Content from Computer

przynajmniej wiem że nie miałem halucynacji :)

Na razie jedyna odpowiedź z Microsoftu to “Thank you for your feedback”...

edytowany 2x, ostatnio: Azarien
somekind
Wygląda na to, że 6 osób korzysta z wersji offline. Sporo.
Azarien
@somekind: to i tak o 5 raportów za dużo, bo to są wszystko duplikaty. A korzysta na pewno mniejszość.
dzek69
na pewno mniejszość, reszta od takich rzeczy (jak coś się nie wie) ma forum :p
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około godziny
  • Lokalizacja:Wrocław
0

Tworzymy system księgowy dla międzynarodowej korporacji. Oczywiste jest, że potrzebne są na bieżąco kursy walut, więc zgodnie z wolą klienta w aplikacji jest serwis pobierający je z NBP.
Z tymże, serwery produkcyjne klienta "ze względów bezpieczeństwa" pracują w sieci odciętej od internetu. [rotfl]


Po dopracowaniu rozwiązania każdy będzie mógł założyć własny drzewiasty wątek.
Zobacz pozostałe 5 komentarzy
Azarien
już sobie wyobraziłem ramię robota, które zgodnie z jakimś cronem będzie przekładać dyskietkę z jednego serwera do drugiego :D
Gjorni
Tak na pierwszą myśl przychodzi drobny serwer pobierający dane z neta z jakąś określoną przez klienta częstotliwością następnie się rozłącza "dla bezpieczeństwa" (:P) po czym wysyła dane do systemu księgowego :D
somekind
Tylko jak sieć nie ma dostępu do internetu, to chyba się to nie uda. ;)
Gjorni
No to input listowny ;D Chociaż poczta to też jakaś forma sieci... do diaska :/
Azarien
"IP over Snail Mail"? ;-)
TE
  • Rejestracja:około 16 lat
  • Ostatnio:ponad 11 lat
0

Fantazja prosto z Finlandii :-D

Kopiuj
/// <summary>
///   Check if string is not null and it's length is not zero
/// </summary>
/// <param name="text"> </param>
/// <returns> </returns>
private bool check(String text)
{
	if (text == null || text.Length == 0)
	{
		return false;
	}

	return true;
}
Zobacz pozostałe 7 komentarzy
Azarien
@Koziołek: wut? tak często M$ podaje w stopce, ale co w tym widzisz złego?
Koziołek
kwestia, że nie znamy motywacji do napisania tego kodu. Możliwe, że ma działać na niewspieranej platformie... i co terasssss?
Azarien
to są wypisane wymagania .NET Framework 4.5. Jak u góry strony wybierzesz 2.0, to napis ci się zmieni na "Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition".
Azarien
Gwoli ścisłości, jest też komunikat, że “Note: This method is new in the .NET Framework version 2.0.” Więc MOŻLIWE że to jest kod dla .NET 1.0 albo 1.1. Ale wtedy WTF polega na tym, że ktoś używa tak starej wersji ;-)
TE
@Azarien to nie jest takie stare, metoda napisana 2010-03-18T15:36:24.610508Z (wygrzebane z SVN'a)
ShookTea
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 6 lat
  • Lokalizacja:Wrocław
  • Postów:629
0

Nie wiem, czy to tutaj pasuje...

Kopiuj
if (blockS == blockE) {
 System.out.println("Tak!");
}

Kod wydrukuje "Tak!".

Kopiuj
if (blockS == blockE) {
 System.out.println("Tak!");
} else {
 System.out.println("Nie!");
}

Ta dodatkowa linijka to jedyna zmiana w całym programie... i kod drukuje "Nie!".

EDIT:

Kopiuj
int blockS = 0;
int blockE = 0;
for (int i = 0; i < codesText.length; i++) {
 if (codesText[i].isBlockEnd()) {
  blockE++;
 }
 if (codesText[i].isBlockStart()) {
  blockS--;
 }
}
System.out.println(blockE + " " + blockS);

W moim programie drukuje "-1 1". Po zamianie blockS--; na blockS++ Wydrukuje "1 0".

EDIT 2:

Zamieniłem miejscami warunek w drugim kodzie, teraz jest to:

Kopiuj
if (blockS != blockE) {
 System.out.println("Nie!");
} else {
 System.out.println("Tak!");
}

... Drukuje mi "Nie!" i "Tak!" jednocześnie...


edytowany 4x, ostatnio: ShookTea
Zobacz pozostałe 11 komentarzy
ShookTea
Przez tą godzinę wywaliłem cały kod. Nie tylko dlatego, że nie działał - był brzydki, rozniosły, a zmienne miały takie ciekawe nazwy, jak int tekst, int text, String tekstText czy double texxt. Być może to wina kilku ostatnich dni - przez pogodę mam spore problemy z zaśnięciem i nie myślę, dopiero ostatniej nocy mocno się zdrzemnąłem i znalazłem takie dzieła sztuki. Wracając do tematu: Wywaliłem cały kod i napisałem go pięknie od nowa, wszystko działa. Faktycznie musiałem sam gdzieś popełnić błąd.
n0name_l
Btw. Skoro piszesz w Javie, to korzystaj z normalnego softu: http://www.jetbrains.com/idea/
ShookTea
Nauczyłem się korzystać z NB i z NB będę korzystał :)
bogdans
Dobrze, że nie nauczyłeś się korzystać z notatnika.:)
ShookTea
Jak to? Przecież notatnik i javac, java to najlepsze rozwiązanie :D
K5
  • Rejestracja:około 12 lat
  • Ostatnio:około 7 lat
  • Lokalizacja:Tutaj,obok
  • Postów:759
0

Jeśli mój post jest dowodem mojej niekompetencji, to trudno, ale po to pytam, żeby się czegoś dowiedzieć.
ShookTea
Nie ma to, jak dołączać bibliotekę w C++, nie używając preprocesora.
K5
A może autor tamtego tematu tak lubi ....
msm
Błędem jest to że nie dał <code>, kod był poprawny...
hauleth
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:8 dni
0

Zastanawiałem się czy dać to tu, czy do trochę humoru, ale macie http://www.wykop.pl/link/1570155/koles-swietuje-7-urodziny-bugu-w-mysql/


Sopelek
ja się bardziej śmiałem niż WTFowałem
Patryk27
The cake is a lie!
unikalna_nazwa
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 9 lat
1

Tyle lat obcowania z javascriptem a jakimś cudem dowiaduję się tego dopiero dzisiaj:

Pytanie:
Czy ten kod się kiedykolwiek wykona

Kopiuj
if(a != a) {
  alert('tak');
}

?

...

Okazuje się, że tak - dokładnie w jednym przypadku.
Istnieje coś takiego jak NaN (not a number), które jest na tyle specjalne że nie jest równe nawet samemu sobie :O

Może i to jest logiczne, ale w takim razie to samo moim zdaniem powinno się dziać na przykład z wartością Infinity jako że nieskończoność nieskończoności nierówna - tak jednak nie jest

Ciekawe czy któreś IDE stwierdzi że kod jest nieosiągalny


Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
edytowany 1x, ostatnio: unikalna_nazwa
Zobacz pozostałe 3 komentarze
unikalna_nazwa
@msm: z NaNami mało się ma z reguły do czynienia - pewnie dlatego pierwsze o tym słyszę. Raczej dąży się do tego żeby ich w ogóle nie było, a jak są to chyba tylko w wyniku jakiegoś błędu. Jak tak o tym pomyśleć to raczej dobrze że porównanie z czymkolwiek nigdy nie zwraca true
bogdans
@ShookTea, poważnie myślisz, że takich oczywistych kandydatów nie sprawdziłem? @unikalna_nazwa, w Javie NaN pojawia się stosunkowo często - przy próbie wykonania nielegalnej operacji matematycznej: 0.0/0.0, Math.sqrt(-1), Math.log(0),..
unikalna_nazwa
to nadal błędy wynikające z niesprawdzenia dziedziny, myślę że tak samo "często" pojawiają się w innych językach; już raczej w javascript'cie są częściej bo tu wystarczy parseInt('cokolwiek'). W pythonie NaN można uzyskać na przykład dodając minus nieskończoność do plus nieskończoności
bogdans
Sprawdzasz przy skomplikowanym wyrażeniu dziedzinę? Ja nie, próbuje wykonać działania i obsługuję ewentualny wyjątek => dla mnie to nie jest błąd.
KR
NaN potrafi się pojawić całkiem normalnie przy rozwiązywaniu problemów, które są źle uwarunkowane. Dlatego przy obliczeniach numerycznych trzeba na to uważać - czasem kodu do unikania takich sytuacji jest więcej niż normalnego kodu rozwiązującego problem.
mcoder
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 5 lat
  • Postów:117
0

Dwa moje WTFy na teście rekrutacyjnym:

  1. Jest godzina 3:15 jaki kąt tworzą wskazówki zegara?
    0 stopni

  2. Masz naczynia 5 litrów oraz 3 litry i odmierz 4 litry.
    Nalać dwa do pełna i połowy z dwóch naczyń dadzą razem 4 litry.

Próbowałem się tłumaczyć 3h jazdy w upale, ale to nic nie dało...


<sup>_</sup>
Zobacz pozostałe 8 komentarzy
mcoder
Kto chce znać gdzie takie pytania i jakie stanowisko to PM me.
Azarien
rozwiązanie na chłopski rozum bez żadnego PI-kania: kąt to 1/4 godziny, czyli 1/(4*12) pełnego koła, czyli 360/48 = 7,5° = 7°30'
TA
@Azarien: Nie chciało mi się wklejać znaczku stopni, tak czy inaczej 15/2° = 7,5° i to było uwzględnione, a z Pi, jest równie łatwo bo przecież 2Pi = 360°, wiec nie widzę problemu w takim rozwiązaniu, wręcz masz mniejsze liczby do liczenia,
siararadek
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 9 lat
0

W bazie danych stworzono tabele Company - Address i relację między nimi. Każda firma powinna posiadać adres więc AddressId nie był nullowalny. Ale nagle się pojawiła potrzeba, żeby jednak firma przez chwile mogła nie mieć adresu. To co zrobiono? Zmieniono AddressId na nullowalny?

A gdzie tam, usunięto relację i dla firm bez adresu AddressId jest ustawiany na 0. Co najlepsze, w modelu bazy danych relacja wciąż jest widoczna, za to w samej bazie danych jej nie ma. I tak w całej aplikacji, teraz jest tragicznie rozwijać taką aplikację bo właściwie nie wiadomo czego się spodziewać po stronie bazy danych.

edytowany 4x, ostatnio: siararadek
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

FPC WTF po raz chyba trzeci:
Mamy deklarację rekordu:

Kopiuj
 Type PSSAVarID = ^TSSAVarID;
      TSSAVarID = Record
                   Typ  : (sstNone, sstOne, sstPhi);
                   Value: Array of uint32;
                  End;

Jest ona z kolei wykorzystywana w rekordzie znajdującym się nieco niżej:

Kopiuj
      TExpressionNode = Record
                         {...}
                         SSA   : TSSAVarID;
                         {...}
                        End;

Stwierdziłem, że pole Typ jest zbędne i postanowiłem je usunąć, zostawiając samo Value; efekt?
Internal error w operatorze porównania TSSAVarID:

Kopiuj
Operator = (A, B: TSSAVarID): Boolean;
Var I: Integer;
Begin
 if (Length(A.Value) <> Length(B.Value)) Then
  Exit(False);

 For I := Low(A.Value) To High(A.Value) Do
  if (A.Value[I] <> B.Value[I]) Then
   Exit(False);

 Exit(True);
End; 

Jakżeby inaczej...
Będę musiał sprawdzić, czy błąd jest też w najnowszym trunku z FPC i ew.zgłosić lub przestać korzystać z własnych zmodyfikowanych wersji :P


edytowany 1x, ostatnio: Patryk27
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 godziny
1

yt.PNG

Tyle się dziś mówi o tolerancji, a YouTube nie potrafi zapamiętać moich preferencji, ciągle zmieniając ustawienia.
Jaki to problem zapisać gdzieś w profilu użytkownika, raz a dobrze, jaki język wybrałem do oglądania ich strony?
I nie uszczęśliwiać mnie na siłę ustawieniami których mogę nie chcieć?

EDIT: Ja już ich naprawdę nie rozumiem. Nic nie robiłem, nic nie zmieniałem, ten sam komputer, ta sama przeglądarka, a YouTube postanowiło nagle zmienić zdanie...
yt2.PNG

  • yt2.PNG (6 KB) - ściągnięć: 64
  • yt.PNG (8 KB) - ściągnięć: 74
edytowany 1x, ostatnio: Azarien
Zobacz pozostałe 2 komentarze
Azarien
Wszystko fajnie, tylko po co implementują możliwość ręcznego wyboru języka, skoro i tak potem „wiedzą lepiej” i przełączają?
msm
Trochę późno odpisuję, ale u mnie działa (ustawiłem raz a dobrze w koncie google język)
wasiu
Mnie youtube co chwila się pyta jak chce by wyświetlał nazwe mojego konta... irytujące to jest, zwłaszcza, że juz z kilkanaście razy wybierałem.
Azarien
@wasiu: mam to samo. wybieram ksywkę. chyba liczą na to, że każdy za którymś razem kliknie źle i wybierze imię i nazwisko.
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około godziny
  • Lokalizacja:Wrocław
0

Nic chyba nie pobije Getin Online.

Pomijając już to, że nowy interfejs jest koszmarnie popieprzony, to nie mogę ustawić nowego hasła, bo stare hasło zawiera nieprawidłowe znaki.


Po dopracowaniu rozwiązania każdy będzie mógł założyć własny drzewiasty wątek.
Marooned
Spieprzony interfejs to domena nowej strony Cinema City - wszystko na JSowych popupach, zero możliwości zapisania linku do repertuaru lokalnego kina, a jak się pomylisz w rezerwacji to od nowa.. od głównej: wybór miasta, kina, filmu, godziny.. klasyczny przykład epic fail + double facepalm
AF
Większym failem Cinema City jest fakt, że to okienko samo się przesuwa - jak na tablecie próbuję powiększyć prawy dolny róg, to popup sam ustawia się "na środku" (według niego) i za cholerę nie da się go ustawić tak, jak trzeba.
KR
Moderator
  • Rejestracja:prawie 21 lat
  • Ostatnio:około 18 godzin
  • Postów:2964
1

Dzisiaj chciałem zamówić sprzęty do nowej kuchni w Euro RTV Agd. Zapłaciłem kartą kredytową. No i z karty mi zjadło, PayU twierdzi, że transakcja przeszła dobrze i przelali kwotę na konto Euro, a Euro się upiera, że nie otrzymali, i proponuje żebym może spróbował zapłacić inaczej np. przelewem. WTF? I gdzie jest moje dziesięć kafli?

edytowany 1x, ostatnio: Krolik
Zobacz pozostałe 8 komentarzy
KR
Sprawa się wyjaśniła, z karty ściągnęło. Ale dopiero ręcznie musieli sprawdzić w księgowości, że jednak kasa im wpłynęła i zamówienie przeszło w stan realizacji. @somekind właśnie dlatego w tym przypadku zapłaciłem kredytówką. W ten sposób realnie płacę za to prawie za 2 miesiące, bez odsetek.
wasiu
Może się i opłacała... do czasu aż mi nie przyszło 120zł zapłacić za to, że limitu z niej nie wyrobiłem (nazbierało się na monitach, których nigdy nie dostałem, a za każdy 30zł)... a potem dodatkowe 100zł za to by się tej karty pozbyć bo... kolejny cykl rozliczeniowy się zaczął i trzeba za niego zapłacić. Po tym sobie darowałem i wole mieć jedną wypłatę 'pod poduszką' i to wydawać, niż bawić się nieswoimi pieniędzmi, na czym ostatecznie stracę.
KR
@somekind, karta była wydana w okresie, gdy banki na lewo i prawo rozdawały karty (i kredyty też). Wystarczało wypełnić wniosek, zadeklarować (!) wynagrodzenie i bez ceregieli dostawało się limit na poziomie 3-5-krotności miesięcznego wynagrodzenia, a bank nawet tego chyba nie sprawdzał (serio, nie pamiętam, abym chodził po jakieś papierki od pracodawcy). Nie za bardzo widzę, gdzie tu jakiś szpan ;)
Marooned
Nie mamy pańskiej kuchni i co nam pan zrobi?
unikalna_nazwa
ba - ostatnio banki nawet nie potrzebują adresu żeby założyć konto! Niedawno zgubiłem dowód osobisty ale nie miałem żadnego problemu z założeniem konta na paszport w którym nie ma podanego adresu zamieszkania - wystarczyło jedynie pisemne oświadczenie że mieszkam pod podanym na kartce adresem O_o
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 godziny
0

Dlaczego ten laptop tak wolno chodzi?
defrag.PNG
Windowsowy defrag się poddaje, przerywając pracę na 1% za każdym razem z minimalnym skutkiem.
Już kilkanaście razy odpalałem, ale może krok po kroku się rozkręci...

Marooned
Kiedyś był jakiś defrag, który odpalał się po resecie przed startem systemu dzięki temu nic mu nie przerywało. Rozejrzyj się w temacie.
Azarien
znalazłem: Defraggler. na razie pokazuje "Pozostały czas: >1 dzień" ;-)
Marooned
hahaha, ostro :)
Olamagato
Najszybszy sposób defragmentowania tak pociętego i zapchanego do pełna woluminu, to sekwencyjny backup wszystkich plików na inny nośnik, szybki format oryginału i restore (można użyć zwykłego kopiowania). Jest to szybsze i sprawniejsze niż jakikolwiek defrag, który w takim wypadku będzie przenosił niektóre fragmenty plików wielokrotnie. W przypadku gdy ilość wolnego miejsca na woluminie jest mniejsza niż wielkość największego pliku podlegającego defragmentacji - jest to jedyna skuteczna metoda.
Azarien
Po wielu próbach i kilku dniach walki ostatecznie z dyskiem wygrał MyDefrag :-) @Olamagato: to jest stary laptop z dyskiem PATA jeszcze, a nie mam pod ręką stacjonarnego żeby się w wyciąganie dysku móc bawić…
Markness
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 2 lata
0

Strona szkoły językowej postawiona na prestashopie... I nie, oni tam nic nie sprzedawali ;)

edytowany 1x, ostatnio: Markness
KR
Moderator
  • Rejestracja:prawie 21 lat
  • Ostatnio:około 18 godzin
  • Postów:2964
0

Środa ok. godz. 16:30. Pracuję nad poprawką obsługi błędów dotyczącą naszego rozproszonego systemu plików. "No, to jeszcze zapuszczę testy, sprawdzę logi i jeśli wszystko ok. to commit i koniec roboty na dzisiaj". A tam w logach widzę takie coś:

Kopiuj
... Block not found: java.nio.HeapByteBuffer[pos=13748 lim=13764 cap=5498210]

Hmm, ta informacja nie wygląda na przydatną. Popatrzmy skąd to leci:

Kopiuj
ByteBuffer blockId = ....
...
logger.error("Block not found: " + blockId);

No tak, Cassandra wszystko traktuje jako ByteBuffer. Znacznie bardziej przydatne byłoby zalogować zawartość bufora oznaczającą id tego brakującego bloku niż te bzdury co wypisuje ByteBuffer.toString(). No, ale wiedząc, że w tym buforze jest UUID, to przecież 5 minut roboty? Cassandra ma wewnętrzny typ UUID, do konwersji z ByteBuffer na UUID i z powrotem (zresztą są takie konwersje dla wszystkich wspieranych typów, włączając kolekcje), więc to powinien być pikuś.

Kopiuj
logger.error("Block not found: " + UUIDType.instance.compose(blockId));

No, jest chyba dobrze:

Kopiuj
Block not found: 39653631-6266-3130-3066-666631316533

Zadowolony już miałem commitować, kiedy zorientowałem się, że to nie jest ten UUID, który miał być. Tzn. nie jest ten, który był po stronie klienta (klient wyszukuje blok po id). WTF?

Po 15 minutach nieskutecznego szukania co może być nie tak, postanowiłem zapytać kolegów od Cassandry co robię źle, że mi się UUID psuje. Dostałem odpowiedź, żebym spróbował tego:

Kopiuj
logger.error("Block not found: " + UUIDGen.getUUID(blockId));

Niestety, znowu nieprawidłowy UUID.

  • Jakiego typu masz ten UUID? Type 1 czy Type 3?
  • Żebym to ja wiedział... ....(po kolejnych kilkunastu minutach szukania w kodzie, bo oczywiście nie ja to pisałem)... Type 1 (TimeUUID)
  • No to UUIDGen.getUUID musi działać.

Damn. Ale nie działa. Ponieważ getUUID raczej jest napisane dobrze, doszedłem do wniosku, że to co zostało wrzucone do bufora musiało zostać poddane jeszcze jakiejś dodatkowej obróbce. Znajdźmy to miejsce, gdzie oni to serializują do bufora. Znowu po jakimś długim czasie odkryłem to:

Kopiuj
ByteBuffer uuidToByteBuffer(UUID id)
{
     return ByteBufferUtil.bytes(Hex.bytesToHex(UUIDGen.decompose(id)));
}

Spoko, powinna być tu gdzieś też odwrotna funkcja. Ale nie, nigdzie nie ma. Dobra, no to spróbujmy ją odwrócić:

Kopiuj
UUID byteBufferToUUID(ByteBuffer bb)
{
     return ??????  (Hex.hexToBytes(ByteBufferUtil.string(bb));
}

Pozostało znalezienie jak z byte[] zrobić UUID i wstawić to w ????. Może UUIDGen ma metodę compose, odwrotną do decompose. F***ck. Nie ma. O! ale jest UUID.nameUUIDFromBytes() i chyba pasuje.

Kopiuj
UUID byteBufferToUUID(ByteBuffer bb)
{
     return UUID.nameUUIDFromBytes(Hex.hexToBytes(ByteBufferUtil.string(bb));
}

No, teraz powinno być dobrze. Odpalam i.... znowu nic z tego. Jeszcze inny UUID dostałem. UUID.nameUUIDFromBytes działa bowiem dla UUIDów typu 3 a nie 1.
....

W końcu okazało się, że rozwiązaniem jest:

Kopiuj
UUID byteBufferToUUID(ByteBuffer bb)
{
     return UUIDGen.getUUID(ByteBuffer.wrap(Hex.hexToBytes(ByteBufferUtil.string(bb));
}

Uff. Patrzę na zegarek: 19:40. A miało być 5 minut ;)
W jakim celu autor kodu zdecydował się w taki pokrętny sposób serializować UUIDy (zamiast wykorzystać UUIDType compose/decompose) to niestety się nie dowiedziałem i chyba nigdy nie dowiem, bo ten gość już nie pracuje.

edytowany 1x, ostatnio: Krolik
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 godziny
0

Office 2013 nie wspiera wygładzania tekstu ClearType, przez co drobny tekst jest niewyraźny albo spikselizowany jak w 1995.

Porównanie tekstu pod Wordem 2013 i 2010:

word2013_word2010.png

Wibowit
tzn które lepsze? :P
Koziołek
To drugie to 2010...
Wibowit
ten wyżej ma większe odstępy między liniami, więc jest czytelniejszy :] poza tym jestem krótkowzroczny i nie widzę większej różnicy z normalnej odległości
Azarien
odstępy to akurat moja wina, chodzi o ostrość tekstu.
spartanPAGE
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 16 godzin
0

Wyszedł nowy SDL (2) -> Trzeba wypróbować.
Wczoraj:
Pobieram i kompiluje źródła, ustawiam flagi, jeszcze tylko przykładowy program... Działa, jest okienko. Zapisuje, zostawiam.
Dzisiaj:

Segmentation fault (core dumped)

Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Stacktrace
  • Postów:6821
0

Niestety jestem zmuszony do używania jQuery pod IE 7 na winxp.

Mamy sobie formularz gdzie w ukryty inpucie (ma tylko name bez id) jest sobie wartość na której powinny być po wybraniu pewnej kombinacji selectów ukrywane inne pola.

Kopiuj
if(kombinacjaSelectow()){
   $j = jQuery.noConflict();
   var l  = $j('input[name="poszukiwanaNazwa"]');
   if(l.val()=="fistaszki"){
      /...
   }
}

Czyli sama przyjemność... nie! Nie pod IE. Okazuje się, że val() pod IE zwraca undefined co powoduje wywałkę skryptu i tym samym całego formularza. Co więcej attr("value") też nie działa. Pomogło dopiero stare dobre document.getElementsByName. Ja się pytam jak złym człowiekiem jest ten ktoś kto zmusza ludzi do pracy w IE7?


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
Zobacz pozostałe 5 komentarzy
unikalna_nazwa
ten kod normalnie działa na IE7, problem musi być gdzieś indziej
Marooned
Sprawdź, czy $j('input[name=&quot;poszukiwanaNazwa&quot;]') zwraca Ci pod IE7 dany element - może nie umie go odszukać w DOMie?
Koziołek
Zwraca poprawny obiekt, ale bez połowy dokooptowanych przez jQuery funkcji np. bez val.
unikalna_nazwa
może to nie jest obiekt jQuery? Używasz noConflict więc pewnie używasz jeszcze czegoś co się podpina pod znak dolara - może gdzieś się pomyliłeś i zamiast $j użyłeś $ (bo rozumiem że kod powyżej to uproszczenie, tym bardziej że działa pod IE7). Jeśli jest jak piszesz to jest to bug w jQuery, nie w IE i powinieneś to zgłosić: http://jquery.com/browser-support/ "Any problem with jQuery in the above browsers should be considered and reported as a bug in jQuery"
Koziołek
Generalnie w systemie pewno gdzieś jest używany znak $ :) tyle tylko, że samych JSów na "dzień dobry" ładuje się około 10MB :) Ale nie moja małpa nie mój cyrk. Poprawiłem, działa, może kiedyś ktoś coś poprawi. Nie lubię ich aż tak bardzo by im soft reperować na 100%
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Po godzinie rozkminiania jak to się dzieje że rzutowanie w pythonie bloku bajtów na strukturę C (za pomocą ctypes) powoduje że cześć danych ma poprawne wartości a część nie, doszedłem wreszcie do sedna sprawy i leżało ono w standardzie języka C, a konkretnie w kochanym "implementation dependent".
Pakowanie pól bitowych nie jest jasno zdefiniowane i w efekcie w GCC struktura:

Kopiuj
int8 x : 7;
int8 y : 7;
int8 z : 7;
int8 v : 7;
int8 q : 4;

będzie miała 4 bajty bo GCC wszystko upycha tak jak sie tylko da. Ale w MSVC będzie miała 5 bajtów bo każde pole będzie miało wyrównanie.
W efekcie można wygenerować blok bajtów za pomocą pewnej struktury w programie kompilowanym jednym kompilatorem, a potem nie móc jej poprawnie wczytać za pomocą tej samej struktury ale pod innym kompilatorem. WTF i mój zmarnowany czas ;]
Co ciekawe python ma to zgloszone już od 3 lat: http://bugs.python.org/issue12528 a nadal w żadnym releasie tego nie ma ;]


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
Azarien
IMHO to jeden z absolutnie nieprzydatnych ficzerów w C/C++ (nieprzydatnych bo zepsutych ponad możliwość sensownego wykorzystania)
Shalom
To moze polecisz jakąś alternatywę? Przy czym dla jasności: mówię tutaj o strukturach które mają po kilkaset pól o rozmiarach 1-64 bitów i dość istotnym czynnikiem jest czas ekstrakcji danych, ergo bawienie się w wyciąganie pole po polu za pomocą masek bitowych to raczej żadna alternatywa.
Azarien
a myślisz że jak w takiej strukturze wyciągane są bity, jak nie za pomocą masek bitowych?
IE
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 7 lat
  • Postów:32
0

Robiłem zadanie http://codeforces.com/contest/340/problem/B i zastanawiałem się czemu ciągle odrzuca moje rozwiązanie. Byłem praktycznie pewien, że jest poprawne. Po zakończeniu sprawdzam dlaczego nie przyjmowało - błąd zaokrąglenia. Wtf, przecież liczyłem wszystko co trzeba na doublach, powinno działać. Sprawdzam jeszcze rozwiązanie wzorcowe - liczą tak samo i działa. Chwila zastanowienia i postanawiam dodać do kodu std::cout.precision(15). Działa. Jakby sensowna precyzja nie mogła być standardowo włączona O.o

MarekR22
"The answer will be considered correct if its absolute or relative error does't exceed 10^-9". czyli std::cout.precision(10) powinno być ok.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)