Programistyczne WTF jakie Was spotkały

0

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

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:

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);
}
0

Precyzyjna informacja o rodzaju błędu

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

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
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ć.

0

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

    public static final long aVeryLongTime = 259200 * 1000; // 3 days
0

Komentarz z jre:

Class<?> cl = getProxyClass0(loader, interfaces); // stack walk magic: do not refactor
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ć.

0
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ą? ;)

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”...

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]

0

Fantazja prosto z Finlandii :-D

/// <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;
}
0

Nie wiem, czy to tutaj pasuje...

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

Kod wydrukuje "Tak!".

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:

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:

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

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

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/

1

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

Pytanie:
Czy ten kod się kiedykolwiek wykona

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

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...

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.

0

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

 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:

      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:

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

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

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.

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?

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...

0

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

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ś:

... 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:

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ś.

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

No, jest chyba dobrze:

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:

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:

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ć:

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.

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:

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.

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

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)

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.

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?

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:

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 ;]

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

0 użytkowników online, w tym zalogowanych: 0, gości: 0