Better way to upsert (if querying isn't done on id's)?

Wondering if there's a better way of doing upserts, perhaps via a custom base class function? The example listed in the documentation doesn't really cover my use case, as the update isn't done on an id-based query, but on other column values. This is the workaround I find using, but it isn't great as I would also like to return the updated object and not just if it was inserted:
Model.query()
      .where({...})
      .update({...})
      .then((nrUpdated) => {
        if (nrUpdated === 0) { return Model.query().insertAndFetch({...}) }
      })

It is possible with some restrictions. The following code is an example that I haven't tested, so it may not work, but it should lead you to the right track. The restrictions are mentioned in the comments of the example:
class MyQueryBuilder extends QueryBuilder {
  upsert(obj) {
    let whereQuery;
    return this
      .query()
      .runBefore((result, builder) => {
        // At this point the builder should only contain a bunch of `where*`
        // operations. Store the `where` query for later use in the `runAfter`
        // method.
        whereQuery = builder.clone();

        // Call the `update` method on the original query turning it into an
        // update operation.
        builder.update(obj);

        return result;
      })
      .runAfter(numUpdated => {
        if (numUpdated === 0) {
          return this.insertAndFetch(obj);
        } else {
          // Now we can use the `where` query we saved in the `runBefore`
          // method to fetch the inserted results. It is noteworthy that this
          // query will return the wrong results if the update changed any
          // of the columns the where operates in. This also returns all
          // updated models. Chain `.first()` if you only want the first one.
          return whereQuery;
        }
      });
  }
}

Now you should be able to use this like this:
Person
  .query()
  .upsert({firstName: 'Jack'})
  .where('foo', 'bar')
  .orWhere('a', '<', 'b')
  .then(updatedOrInsertedResult => {

  });

runAfter is just like then but it doesn't execute the query and convert it into a promise.
As I mentioned, I'm not 100% sure this works. Let me know how it goes :smile:

Ugh, I changed the example one more time. I added the parts with modelClass variable.

Thanks so much! Haven't had the chance to work with the upper concept yet, but meanwhile I found these:
knex upsert monkey patch gist
another one
Maybe they're of of relevance. I think the first approach still doesn't cover cases when there wouldn't be a conflict due to no unique constraints on the columns. There's a knex issue that would make this much easier if implemented.

We'll just have to wait for knex on this one.

@koskimas this is great, thanks for posting the code! Your code almost works, just two tweaks were needed:

this.query() doesn't make sense as we're already in a query builder.
The runAfter() method is missing the 2nd builder argument.

class MyQueryBuilder extends QueryBuilder {
  upsert(obj) {
    let modelClass = this.modelClass();
    let whereQuery;
    return this
      .runBefore((result, builder) => {
        if (!builder.context().isWhereQuery) {
          // At this point the builder should only contain a bunch of `where*`
          // operations. Store the `where` query for later use in the `runAfter`
          // method. Also mark the query with `isWhereQuery: true` so we can
          // skip all this when this function is called for the `whereQuery`.
          whereQuery = builder.clone().context({ isWhereQuery: true });
          // Call the `update` method on the original query turning it into an
          // update operation.
          builder.update(obj);
        }
        return result;
      })
      .runAfter((result, builder) => {
        if (!builder.context().isWhereQuery) {
          if (result === 0) {
            return modelClass.query().insertAndFetch(obj);
          } else {
            // Now we can use the `where` query we saved in the `runBefore`
            // method to fetch the inserted results. It is noteworthy that this
            // query will return the wrong results if the update changed any
            // of the columns the where operates with. This also returns all
            // updated models. Chain `.first()` if you only want the first one.
            return whereQuery;
          }
        }
        return result;
      });
  }
}

I've just found a problem with this code, see https://gitter.im/Vincit/objection.js?at=59fb57aff7299e8f53643386
The solution is simple: Instead of taking a reference to the modelClass, I create a clone of the original query, and use taht to run the insertAndFetch(). This works and correctly sets foreign keys when inserting into a relation:
class MyQueryBuilder extends QueryBuilder {
  upsert(obj) {
    const originalQuery = this.clone();
    let whereQuery;
    return this
      .runBefore((result, builder) => {
        if (!builder.context().isWhereQuery) {
          // At this point the builder should only contain a bunch of `where*`
          // operations. Store the `where` query for later use in the `runAfter`
          // method. Also mark the query with `isWhereQuery: true` so we can
          // skip all this when this function is called for the `whereQuery`.
          whereQuery = builder.clone().context({ isWhereQuery: true });
          // Call the `update` method on the original query turning it into an
          // update operation.
          builder.update(obj);
        }
        return result;
      })
      .runAfter((result, builder) => {
        if (!builder.context().isWhereQuery) {
          if (result === 0) {
            return originalQuery.insertAndFetch(obj);
          } else {
            // Now we can use the `where` query we saved in the `runBefore`
            // method to fetch the inserted results. It is noteworthy that this
            // query will return the wrong results if the update changed any
            // of the columns the where operates with. This also returns all
            // updated models. Chain `.first()` if you only want the first one.
            return whereQuery;
          }
        }
        return result;
      });
  }
}

Even simpler: You can just use the whereQuery: whereQuery.insertAndFetch(obj);

@koskimas I've tried to use mergeContext({...}) instead of context({...}) on this line here, but it doesn't work correctly then:
mainQuery = builder.clone().context({ isMainQuery: true })

Do you understand why? As far as I can tell, context({}) replaces the internal context object, while mergeContext({}) merges it. But at the time of the call, the result of context() is an empty object, so why does it matter? Does it have something to do with branching and sharing contexts?

@lehni You found a small bug/inconsistency there. I'll fix that for 0.9.1 if it doesn't turn out to be a breaking change.

@lehni the mergeEager thingy is now fixed in master

@koskimas great, thanks! It all seems to work fine for me now.

Sorry I know this is a really old thread but anyone know how I can get upserts to work now for mssql? Should I be patching my knex to use the code in this PR https://github.com/knex/knex/pull/6050?

I've just found a problem with this code, see https://gitter.im/Vincit/objection.js?at=59fb57aff7299e8f53643386
The solution is simple: Instead of taking a reference to the modelClass, I use the whereQuery as a version of the original query, and use that to run insertAndFetch() if update() wasn't successful. This works and correctly sets foreign keys when inserting into a relation:
class MyQueryBuilder extends QueryBuilder {
  upsert(data) {
    let mainQuery
    return this
      .runBefore((result, builder) => {
        if (!builder.context().isMainQuery) {
          // At this point the builder should only contain a bunch of `where*`
          // operations. Store the `where` query for later use in the `runAfter`
          // method. Also mark the query with `isMainQuery: true` so we can
          // skip all this when this function is called for the `mainQuery`.
          mainQuery = builder.clone().context({ isMainQuery: true })
          // Call the `update` method on the original query turning it into an
          // update operation.
          builder.update(data)
        }
        return result
      })
      .runAfter((result, builder) => {
        if (!builder.context().isMainQuery) {
          if (result === 0) {
            return mainQuery.insertAndFetch(data)
          } else {
            // Now we can use the `where` query we saved in the `runBefore`
            // method to fetch the inserted results. It is noteworthy that this
            // query will return the wrong results if the update changed any
            // of the columns the where operates with. This also returns all
            // updated models.
            return mainQuery.first()
          }
        }
        return result
      })
  }
}

@lehni Would this solution work for multiple rows of data?


Info screens go too fast

Got it working, but it seems the script is not retrieving the info from wunderground, since the weather shows 0°C and the screens cycle super fast. API key was set and manual requests from my browser display all the info needed (eg http://api.wunderground.com/api/MY API KEY/conditions/q/USA/NEW_YORK.json).

Please try to replace USA with NY:
http://api.wunderground.com/api/YOUR_API_KEY/conditions/q/NY/NEW_YORK.json
When I tried the call with USA then I got a list of possible candidate
locations...
2017-07-10 16:10 GMT+02:00 Trecoolius<EMAIL_ADDRESS>
Got it working, but it seems the script is not retrieving the info from
wunderground, since the weather shows 0°C and the screens cycle super fast.
API key was set and manual requests from my browser display all the info
needed (eg http://api.wunderground.com/api/MY API
KEY/conditions/q/USA/NEW_YORK.json).
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/squix78/esp8266-weather-station-color/issues/22, or mute
the thread
https://github.com/notifications/unsubscribe-auth/AArwFkUgtRirS-rGfQLuY60I5Ukirp8mks5sMjDrgaJpZM4OS5dS
.

One day WU will publish details of their API's including allowed values, I asked them if they would do this, but they said the current supplied documentation is adequate. For example I discovered their systems sometimes report wind direction as WEST when other days it usually reports 'W' only, there's an example where API values like County and City values are needed.

Awesome, works now, but the screen go by too fast. Is there any setting I can change to make them go slower?

Are they moving automatically? They actually should not move at all until
you press the touch screen, assuming that you have a display module with a
touch screen (e.g. from my ESP8266 Wifi Color Display Kit
https://blog.squix.org/product/esp8266-wifi-color-display-kit-2-4). If you
are talking about the forecast slider on the first screen you can control
this by calling carousel.setTimePerFrame(time)
2017-07-10 20:13 GMT+02:00 Trecoolius<EMAIL_ADDRESS>
Awesome, works now, but the screen go by too fast. Is there any setting I
can change to make them go slower?
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
https://github.com/squix78/esp8266-weather-station-color/issues/22#issuecomment-314189421,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AArwFjYHzRZzBLyaTSK4qpC_jowyjPMvks5sMmnBgaJpZM4OS5dS
.

It's not the starting slider, it's everything :(

What display are you using? Does it have touch screen? If not I recommend
to comment the line "screen = (screen + 1) % screenCount;"
Then you can't switch from frame to frame but you can always add a button
or so
2017-07-10 20:47 GMT+02:00 Trecoolius<EMAIL_ADDRESS>
It's not the starting slider, it's everything :(
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
https://github.com/squix78/esp8266-weather-station-color/issues/22#issuecomment-314199039,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AArwFsa4LwLqVclB7ETXcK6stBUP35Mnks5sMnG0gaJpZM4OS5dS
.

I'm using this one.

I have one like that but have not tried it with the touch interface...
2017-07-10 21:16 GMT+02:00 Trecoolius<EMAIL_ADDRESS>
I'm using this one
http://www.ebay.com/itm/2-8-TFT-LCD-Display-Touch-Panel-SPI-Serial-240-320-ILI9341-5V-3-3V-STM32/201950756171
.
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
https://github.com/squix78/esp8266-weather-station-color/issues/22#issuecomment-314206589,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AArwFuXMMBBsWAKEuMC05lfR3NRwkAbzks5sMnh7gaJpZM4OS5dS
.

Hi all
I'm also seeing the same issue on my display.
I have this display [https://learn.adafruit.com/wifi-weather-station-with-tft-display/overview].
Regards,
Marcos

Hi,
I got my screen today and I have same issue with my display 2.4" TFT LCD Display Touch Panel SPI Serial 240*320 ILI9341
I have tried to disconnect pins for touchscreen but it did not help. The screen changes automatically. From page 1 to 5 in maybe 2-3 seconds
Unfortunately, I can not program so I do not know where to enter carousel.setTimePerFrame (time) exactly :/

I report the same issue, I have a 2,8" TFT LCD SPI 240*320 ILI9321 display with XPT2046 Touch Screen chip. After flashing of the code and connection to WiFi all 5 screens start automatic rapid scrolling one after other in majority cases also after reset button is pressed.  However in a very seldom case one of the random screens stops, but automatic scrolling starts again as soon as screen is touched. I found that when scrolling happens the blue LED on the module is blinking very fast, when screen is stable the LED is off and it goes bright while screen is touched, doesn't matter stable or scrolling screens are present at the moment.

Thank you all for your feedback. Are you sure that the 2.8" display uses a XPT2046 touch screen chip? It sounds like that the described behavior occurs, when the touch driver has not been detected properly and they isTouched method always returns true. This should be certainly fixed on the software side. To actually solve your problem I would like to hear from you if it might be possible that the 2.8" display uses a different driver chip

Hello
In my case you are right.
The controller of my touch unit is a STMPE610 have a look at page 14 in this doc.
Thanks a lot for the hint.
Regards,
Marcos

In my case it is XPT2046

Same here XPT2046 ours may be are fake IC :)

Hello
I managed to get my display/touch starting working the expected way.
I downloaded and intslled the Adafruit lib.
I modified the code to disable the lib for the XPT2046 and replaced parts of the code to use the Adafruit lib.
Currently the pages swap only after a touch on the screen.
Switching from 24h to 12h display is not working as the code is not able yet to detect where the user touched the screen.
I will try to get this issue also solved.
I will also try to get the display switched off after a couple of seconds and switch it on at the first screen touch.
I still do not understand why the red led is blinking all the time, any hint on this?
Bye
Marcos

It seems that I've found the possible reason of screen scrolling with XPT2046. As to me it happens just because the onboard +3,3v regualator on D1 Mini ESP module is not enough to power everything in this setup especially LED backlight of the display. It works at the edge of its capacity I believe and some of the XPT chips might be very sensitive to voltage fluctuations. I disconnected an LED pin at the display from GPIO and connected to +3,3v pin at D1 Mini module via 100 Ohm resistor first. It doesn't help a lot as the regulator was still loaded. Then I connected LED pin via the same resistor to +5V pin at D1, so directly to USB input power. And screen scrolling has stopped! Everything works now how it meant to work! If I touch the screen it goes to next one, if not -  it shows the current screen with refreshed from time to time info. Hope that this might be the reason, interesting to know from others whether it helps as well.

@vadpol can you share the modified Lib which working for you , so we can test it .
i have identical LCD screen and same issue of touch problem.

Hi,
I didn't change any lib, the thing worked for me is just re-connection of the display's backlight LED pin to +5V power (USB) via 100 Ohm resistor. This allowed to take out a part of the load from 3,3V regulator at D1 Mini board and thus influented XPT somehow. I still have no idea why it is so, but it worked for me. I have made some improvements of this schematics later on, you may find my the latest developments under the Screen brightness issue up here.

the problem still not solved for me with the above solution that @vadpol purposed
i even try to provide a 3.3V from other source and share the ground to take out the entire load from the USB.
any other work around??

I also tried to put 1000,0 x 6,3V and 0,1uF capacitors at both power lines (+3,3V and +5V) thinking that it might be some LF and/or HF distortions, however no result as well. By the way I never saw a calibration screen appeared and prompt to switch in between 12H /24H and METRIC/IMPERIAL modes. Trying of the separate touch screen test examples also didn't work.  So my conclusion at the moment is that some batches of XPT2046 are not good enough or even fake indeed and this is a pure hardware issue. Different XPT2046 chips behave differently, there is no system in it...

@vadpol i so sad to say that i already found the problem , there was a small crack on the touch glass that's make problem.
i figured it out by trying a sketch for touch painting which automatically fill the screen line by line..
the crack was on the corner small unseen and later it spread diagonally enough see it
check you screen for crack 😢

Well, how did you fix it then? I think it is not an easy thing....

no way i just saved my time and ordered a new screen with less headache i ordered nextion screen 2.8" they have a good enough IDE to design the GUI
here More about

I was tearing my hair out trying to get my display to work when I found out that I had a display with no touch sensor. See photos. I ordered another that is identical except it has the resistive touch sensor in place. See the extra connector on the left.
https://photos.app.goo.gl/CHiLMIcjrS65UYXm1

Hi Daniel, was this issue discussed any further. I have several 2,4/2.,8/3,2 inch TFT touch displays with the named chip (fake?) but non of them works with touch.
In my case strange, when first starting i shortly could see a calibration screen which immediately started to switch like with others every 2-3 seconds....
After clearing the flash and reinstallation of the same code without any adaptation i now have the strange situation that no calibration request (even if it did not work) and also no rotation. Now the main screen is kept, only the 12/24 hour clock switches every 2-3 seconds. Touch of course does not react. Wiring is the same as your plane wiring scheme.
Any further digging into this issue? Any idea why a full flush of flash does not bring the same starting situation with calibration request? (if full flash is cleared).

what would be necessary to disable the TOUCH part if it does not work at all. So i could put a simple button to get alternative switching.

Many Thanks, Norbert

I have the TFT FeatherWing from AdaFruit 2.4" touchscreen and I got the same issues.   First boot, got the calibration screen, then it started to flip through all the screens very quickly.   On all future boots, I never get the calibration screen anymore but all screens flip by very quickly.

I'm still not making progress with issue. I soldered a 1000uF capacitor onto the TFT VCC and GND pins thinking that perhaps the regulator on the Wemos board might be a bit borderline. No luck!
Today I received a new 2.4" TFT screen and wired it up to my ESP dev board. It has the same issue with the fast-moving screen. It has a touch controller IC with HR2046 written on it. I've tried some Different libraries incl the Adafruit STMPE610, and Bodmer's TFT_Touch  and TFT_Touch_Shield_V2. None of these will compile for me.

I am having similar problems with the touchscreen part of things—symptoms as previously described. My screen has an HR2406 controller, and the build quality is anything but outstanding, but I managed to get the display part functional by simply removing (commenting out) the 'if (touchController.isTouched(500))' conditional statement at around line 199. My unit also works a lot more reliably with an independent 5V power supply.
It would be nice to get to the bottom of the touchscreen problem though. It seems that whatever is going on, the MCU thinks that the screen is constantly being 'touched'. When running the TouchTest sketch, there is a constant stream of messages of to the Serial Monitor:
Pressure = 4095, x = 0, y = 1
Pressure = 4095, x = 0, y = 1
Pressure = 4095, x = 0, y = 1
Pressure = 4095, x = 0, y = 1
Pressure = 4095, x = 0, y = 1
Pressure = 4095, x = 0, y = 1
Pressure = 4095, x = 1, y = 1
Pressure = 4691, x = 611, y = 612
Pressure = 4655, x = 562, y = 576
Pressure = 4112, x = 211, y = 185
Pressure = 4098, x = 2, y = 1
Pressure = 4095, x = 0, y = 1
Pressure = 4095, x = 1, y = 1
Pressure = 4095, x = 0, y = 1
Pressure = 4095, x = 0, y = 1
Pressure = 4095, x = 0, y = 1
Pressure = 4095, x = 0, y = 1

Note that the screen is detecting my own tap above the 'background noise'—those are the entries with non-zero/one x & y values. Should we just be setting a sensitivity threshold somewhere?

Well, I can get things partially working on my configuration by editing the XPT2046_Touchscreen.cpp file and setting the value of Z_THRESHOLD to something greater than the 'background' pressure measurement displayed when I ran the TouchTest sketch. I also set the Z_THRESHOLD_INT value correspondingly higher, but at this point I'm not sure what that is doing.
#define Z_THRESHOLD     4200
#define Z_THRESHOLD_INT	750

Now the esp8266-weather-station-color sketch will load and run, and I can change the time format by tapping on the screen. But that's all I can do. If I check the x & y values that are being returned, the y value is always 0, which explains why tapping anywhere on the screen only changes the time format. But the x value is sometimes negative, which doesn't make a lot of sense to me.
One other thing I noticed when running the TouchTest sketch was that, while the x & y values did vary as I tapped around the screen, I couldn't work out the logic of the x & y values being reported. In particular, the x & y values, apart from being affected in some way by the position being touched on the screen, were also very much affected by how hard I was pressing (i.e. if I just touched one point and pressed harder, the x & y values increased, significantly).
And why is the blue [NodeMCU] 'load LED' flashing constantly? (It's on hard as the TouchTest sketch is running too.)
Anyway, I'll fiddle some more. If anyone else works it out, please let us all know.

The LED is flashing because on that board it is shared by one of the gpio ports in use you can determine which one by serial.println(BUILTIN_LED) if I remember the correct spelling.
Have you tried running a touch test programme to eliminate any issues resulting from the hardware.

Thanks for the tip. It wasn't that LED, but it was the same problem—the LED in question was linked to GPIO 2, which we were using for T_IRQ. Disconnect that lead and no more flashing LED. No more T_IRQ either, of course, but that didn't seem to make any difference...?!?
There aren't that many GPIO pins left to use though. Are we really using all those leads coming from the display? We only seem to be using four of them (CS, DC, T_CS and T_IRQ, notwithstanding my observation in relation to T_IRQ), plus the RST, LED and power leads I guess. Nonetheless, I tried GPIO9 (SD2), and that just resulted in a crash. GPIO10 (SD3) seems to be OK, so that's where T_IRQ is now, but given that completely disconnecting the T_IRQ line from the display seemed to have no impact on operations, I've no idea wether or not the current connection (to GPIO10) is doing anything.
And yes, the problem seems to exist when running the TouchTest sketch, so it's almost certainly hardware related. The question is really whether this is a simple configuration issue or a more intrinsic hardware problem.
The fact that the TouchTest output indicates that both x & y values are being sensed (even if it's not clear what they mean), while the weather station software constantly reports a y value of "0", suggests that there is still a software element to this issue.

OK, so I appear to have fixed my remaining problem. Somewhere along the line, obviously when things weren't working properly, I had created a bad calibration file (valid file, but invalid data) that was being read every time I loaded the sketch. So I modified the sketch to set the result of the calibration check (at around line 170) to false and force a new calibration:
//  boolean isCalibrationAvailable = touchController.loadCalibration();
boolean isCalibrationAvailable = false;

After following the calibration instructions (creating the new calibration file), I changed the sketch code back to the original call to touchController.loadCalibration().
I still don't really understand the x & y values being returned, but now at least when I tap on the upper part of the display, the date format changes, and when I tap of the lower part of the display it cycles through several screens. I'm assuming that that's the correct behaviour...

Sadly also seeing the issue with all the screens switching through within a few seconds with this non-touch screen + D1 mini: https://www.aliexpress.com/item/Smart-Electronics-2-2-Inch-240-320-Dots-SPI-TFT-LCD-Serial-Port-Module-Display-ILI9341/32607741715.html

Anyone got an idea how to fix this?
As per https://github.com/ThingPulse/esp8266-weather-station-color/issues/52 it used to work prior to touch support.
Thanks,
Matt

For anyone interested, you can use this with non-touch screens with the last commit before touch screen support was added. You don't get the fast scrolling issue.
For reference, compiling with this commit it works fine:
https://github.com/ThingPulse/esp8266-weather-station-color/tree/5ba7fa70b5b707a85b4a15fe4bdc9f9bc79b0d9c
👍

@commanzoom  Other than fixing the actual problem, you could always look at making the required changes for openweathermap at that git commit I referred to.
Openweathermap changes were done in https://github.com/ThingPulse/esp8266-weather-station-color/commit/5b6fef3da75738f050d128b6546ae56773dbd5bd
Sorry - I don't have time to give this a go, nor the C skills to try and fix/understand the problem with non-touch screens.
Thanks,
Matt

Hi @mattie47
Thanks for advice, but i was busy with this yesterday night and managed to fix this following advise from #84 - commented lines from 216 to 224 (master)

Thanks for that @commanzoom. I hadn't seen that post. Got mine working too. :-)

Hi.  I'm sorry if this has been addressed.  I saw a reference to it up above but when I clicked on the link it would not let med view it.  I received my kit(s) directly from Thingpulse. got them all assembled and programmed no problem, and they boot up and run great - for about a minute, and then the screen goes completely white.  If I power down and back up again, works great, again for a minute and then white screen.  Help???


static build with newer libstdc++?

Hi! Thank you for providing the static builds of the CQ-Editor.
I have an issue however. On my Arch system, it starts but won't render anything. I see the following in the console:
libGL error: MESA-LOADER: failed to open i965: /opt/CQ-editor/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /usr/lib/dri/i965_dri.so) (search paths /usr/lib/dri, suffix _dri)
libGL error: failed to load driver: i965
libGL error: MESA-LOADER: failed to open swrast: /opt/CQ-editor/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/lib/dri/swrast_dri.so) (search paths /usr/lib/dri, suffix _dri)
libGL error: failed to load driver: swrast

apparently the latest build provides libstdc++ 3.4.28. Can the later/latest version be provided instead?

I spent a few weeks working on this issue, but I was unable to come to a one-size-fits-all solution. If I build for newer libstdc++ then it breaks compatibility with older linux releases. For now I have decided to stick with Ubuntu-20.04 as the build environment. For users of newer linux releases I recommend you follow the pip installation instructions (which ideally should be done in a fresh conda/mamba/poetry/etc environment so as not to affect your system).
pip install git+https://github.com/jdegenstein/jmwright-CQ-Editor
pip install --pre git+https://github.com/cadquery/cadquery

Thanks for your interest in these builds, and if there are other ways of solving this issue I am definitely open and eager to fix this.


Cleanup a11y and TS warnings/errors

pnpm check --no-tsconfig --ignore "dist,src/routes"

Before
After

pnpm check

Before
After

Phase 1 complete:
pnpm check --no-tsconfig --ignore "dist,src/routes"

Before
After

pnpm check

Before
After

<!-- av pr metadata
This information is embedded by the av CLI when creating PRs to track the status of stacks when using Aviator. Please do not delete or edit this section of the PR.
```
{"parent":"main","parentHead":"","trunk":"main"}
```

Getting close...

and then there was 1...


combo issue：1 edge in data but 2 edges are drawn in graph

G6 Version: 3.5.7
Platform: mac OS, chrome
Mini Showcase(like screenshots):
CodePen Link:

repro demo: https://riddle.alibaba-inc.com/riddles/a805f0d5

下个小版本修复

v3.5.8 已修复。


Add a EventLoopGroup.register(ChannelPromise)

Motivation:
EventLoopGroup.register doesn't need the Channel paramter when ChannelPromise is provided as we can get the Channel from ChannelPromise. Resolves #2422.
Modifications:

Add EventLoopGroup.register(ChannelPromise)
Deprecate EventLoopGroup.register(Channel, ChannelPromise)

Result:
EventLoopGroup.register is more convenient as people only need to set one parameter.

@windie thanks for taking care but Im not sure about this...
@Scottmitch @trustin WDYT ?

I'm also not sure this really provides much benefit at the expense of carrying a deprecated method around. I'm not strongly opposed but perhaps this would be more attractive when we can break the API and just get rid of the old method.

+1 for merging this. If we deprecate it we can remove it in the next minor bump (feature release). If we wait until the major version bump, it might take much longer as we saw with 5.

@normanmaurer @Scottmitch WDYT now?

Let's pull it in so we can remove the deprecated one sooner :-)

Cherry-picked into 4.1 as a5006c1969e6bfab2d78699de190441e518f34b8

removing in next minor release sgtm! thanks @windie


24-hour time format

Allows to set the time to the 24-hour format in the plugin settings.
The AM/PM time format style hasn't been modified.
Fixes #33

Thanks for submitting this PR! This branch looks like it contains some code for the initial view feature in #149. Could you remove that code from this PR? I can also do it manually on my end, but I'll keep my review to focus on the code for the 24-hour format.

Yes, I made a mess, it should be fine now.

Looks like GitHub bugged out and didn't close this when I merged the changes in. Anyways, the changes are in as of 3cc6a31919b7cd349d1eec177ef96974879b0250. Thanks again for the contribution!


Use the new location of gdb.exe (multi-arch) and parse source.properties

This PR has fixes to work with the new path to gdb in NDK  >= r11.
Also note that the RELEASE.txt file that used to be in the root of the NDK has been replaced by a source.properties file.

cc: @gregg-miskelly @chuckries @jacdavis

:+1:


PyInstaller --noconsole/windowed mode cannot recognize

My System: Windows 10 64-Bit, Python 3.5.4, pip 9.0.1
SpeechRecognition library version: 3.8.1
PyAudio library version: 0.2.11
My Code:
#. Tkinter codes
#.........................
#.........................
def main():
    r = sr.Recognizer()
    with sr.Microphone() as source:
        status.set("Listening...") #Tkinter Label
        sound = r.listen(source)
    try:
        status.set("Processing...") #Tkinter Label
        word=r.recognize_google(sound, language="tr-tr")
        print(word)
    except:
        pass

while True:
    keyboard.add_hotkey('ctrl+alt', main) #Keyboard Library

I freezed my code with PyInstaller ( pyinstaller.exe --onefile ) everything is ok. But when i hide console (pyinstaller.exe --onefile --noconsole or --windowed) my code enter the except block. So word=r.recognize_google(sound, language="tr-tr")  not working.

Hello, have you solved this? I'm having the same problem.

Hello, have you solved this? I'm having the same problem.

Unfortunately no. I also reported the failure to the pyinstaller team, but the problem was not solved.

Hello, have you solved this? I'm having the same problem.

Edit// Yes i solved problem. Just use Pyinstaller on Windows 7.

I'll try. Thank you so much

Did you literally switched os? Switching compatibility in properties wont help

Hello, have you solved this? I'm having the same problem.

Edit// Yes i solved problem. Just use Pyinstaller on Windows 7.

I solved the problem for about a year. So I can't remember exactly how I solved it. But if I remember correctly, I started using Python 3.5. and I'm using pyinstaller on Windows 7 (Virtual Machine).


[Desktop][Mobile] Need help | Question 3 screen | submit button is disabled

env: https://staging.fightpandemics.work/need-help#Step3

Go to Need Help Question 3 screen
Press Submit button
Button is disabled. Feed screen is not open

and with my email:

@robinv85 though you were working on getting this step wizard refactored/working (offer-help/need-help)?  Is this work in progress?

@joshmorel I wasn't working on this, I did this couple of weeks ago, not sure if anyone is currently working on it. I recently just added email validation and realised that the requirements weren't clear regarding

is email required to submit?
what do we do with the data?

Hi @robinv85 I'm reassigning this issue to PMs to get answers to your questions.

Hi @ppagarawal @tiagocostasilva
We have questions about submit button on Need Help (on question 3 screen) and also Give Help  (on question 3 screen):

is email required to submit?
what do we do with the data?

@manualzuru @Yu-Alexa-Zhao Can you please help answer these questions?

Button submit is also disabled on Give Help Question 3 screen

I think users are able to skip the third step in the process. The button is disabled until the user enters a valid email address to continue.

@Yu-Alexa-Zhao Do we need to store this data?

I think @manualzuru can better answer this question. The back story for this feature is for markets to gather users' email to send them promotions even if they are not registered with us.
So I gather it depends on the marketing team if they are planning to utilize user email.

If marketers have a plan to use user emails, then there is a need to store this data
If they don't for have a plan in terms of how to use the email address, then I would say there is no need in having this feature in the soft launch?

@manualzuru In that case, I believe that it will be good to inform the users that their email is being captured for marketing mails. The current screen does not convey that. Please let me know the purpose so that we can proceed accordingly.

Ohh, I understand now, so as of now there is no really any usage of the submit button. 🤔 commenting here to follow what we would decide to do with the user data.

@idjevm Can we close this as this has been merged?

Yeah I will close this one up as it will get resolved once we merge #731 as we have decided what to do with the data atm.


Increase memory with vagrant virtualbox

@Shopify/kafka otherwise non-vmware users get a useless 512MB by default.

This was a funny read on kafka issue, lgtm

:ship:


fix: bump mocha to newest version

Why
Mocha contained vulnerabilities that needed to be patched.
How

Bump to version ^10.0.0

Checklist

[x] Commit messages are formatted as per the convention, and breaking changes are marked

:tada: This PR is included in version 3.2.1 :tada:
The release is available on:

npm package (@latest dist-tag)
GitHub release

Your semantic-release bot :package::rocket:


[Event Request] Table 39 - "Purchase Line" OnBeforeCaseVATCalculationTypeIsReverseChargeVAT

Dear Microsoft,
For procedure "Purchase Line".UpdateVATAmounts(), we like to have the ability to have our own implementation for assigning
"VAT Base Amount" for case "VAT Calculation Type"::"Reverse Charge VAT", in both situations PurchHeader."Prices Including VAT"=true and PurchHeader."Prices Including VAT"=false. There we hope to see the following publishers added.
Maybe it's quite a specific request, but we cannot handle this in the OnAfterUpdateVATAmounts because it has such limited options - only Rec is passed on in the argument.
procedure UpdateVATAmounts()
    var
        PurchLine2: Record "Purchase Line";
        TotalLineAmount: Decimal;
        TotalInvDiscAmount: Decimal;
        TotalAmount: Decimal;
        TotalAmountInclVAT: Decimal;
        TotalQuantityBase: Decimal;
        IsHandled: Boolean; //New local variable
    begin
        OnBeforeUpdateVATAmounts(Rec);
...
...
            if PurchHeader."Prices Including VAT" then
                case "VAT Calculation Type" of
                    "VAT Calculation Type"::"Normal VAT",
                    "VAT Calculation Type"::"Reverse Charge VAT":
                        begin
//**** Start new publisher
                            IsHandled := false;
                            OnBeforeCaseVATCalculationTypeIsReverseChargeVAT(Rec,PurchHeader,Currency,TotalAmount,Amount,
                            TotalVATBaseAmount,TotalLineAmount,TotalInvDiscAmount,IsHandled)
                             if not IsHandled then begin
//**** End new publisher
                            Amount :=
                              Round(
                                (TotalLineAmount - TotalInvDiscAmount + CalcLineAmount) / (1 + "VAT %" / 100),
                                Currency."Amount Rounding Precision") -
                              TotalAmount;
                            "VAT Base Amount" :=
                              Round(
                                Amount * (1 - PurchHeader."VAT Base Discount %" / 100),
                                Currency."Amount Rounding Precision");
                            "Amount Including VAT" :=
                              TotalLineAmount + "Line Amount" -
                              Round(
                                (TotalAmount + Amount) * (PurchHeader."VAT Base Discount %" / 100) * "VAT %" / 100,
                                Currency."Amount Rounding Precision", Currency.VATRoundingDirection) -
                              TotalAmountInclVAT - TotalInvDiscAmount - "Inv. Discount Amount";
                        end; //**** New end for if not IsHandled then begin
                        end;
                    "VAT Calculation Type"::"Full VAT":
                        begin
                            Amount := 0;
                            "VAT Base Amount" := 0;
                            "Amount Including VAT" := ROUND(CalcLineAmount(), Currency."Amount Rounding Precision");
                        end;
                    "VAT Calculation Type"::"Sales Tax":
                        begin
                            PurchHeader.TestField("VAT Base Discount %", 0);
                            "Amount Including VAT" :=
                              Round(CalcLineAmount, Currency."Amount Rounding Precision");
                            if "Use Tax" then
                                Amount := "Amount Including VAT"
                            else
                                Amount :=
                                  Round(
                                    SalesTaxCalculate.ReverseCalculateTax(
                                      "Tax Area Code", "Tax Group Code", "Tax Liable", PurchHeader."Posting Date",
                                      TotalAmountInclVAT + "Amount Including VAT", TotalQuantityBase + "Quantity (Base)",
                                      PurchHeader."Currency Factor"),
                                    Currency."Amount Rounding Precision") -
                                  TotalAmount;
                            OnAfterSalesTaxCalculateReverse(Rec, PurchHeader, Currency);
                            "VAT Base Amount" := Amount;
                            if "VAT Base Amount" <> 0 then
                                "VAT %" :=
                                  Round(100 * ("Amount Including VAT" - "VAT Base Amount") / "VAT Base Amount", 0.00001)
                            else
                                "VAT %" := 0;
                        end;
                end
            else
                case "VAT Calculation Type" of
                    "VAT Calculation Type"::"Normal VAT",
                    "VAT Calculation Type"::"Reverse Charge VAT":
                        begin
//**** Start new publisher
                            IsHandled := false;
                            OnBeforeCaseVATCalculationTypeIsReverseChargeVAT(Rec,PurchHeader,Currency,TotalAmount,Amount,
                            TotalVATBaseAmount,TotalLineAmount,TotalInvDiscAmount,IsHandled)
                             if not IsHandled then begin
//**** End new publisher
                            Amount := Round(CalcLineAmount, Currency."Amount Rounding Precision");
                            "VAT Base Amount" :=
                              Round(Amount * (1 - PurchHeader."VAT Base Discount %" / 100), Currency."Amount Rounding Precision");
                            "Amount Including VAT" :=
                              TotalAmount + Amount +
                              Round(
                                (TotalAmount + Amount) * (1 - PurchHeader."VAT Base Discount %" / 100) * "VAT %" / 100,
                                Currency."Amount Rounding Precision", Currency.VATRoundingDirection) -
                              TotalAmountInclVAT;
                        end; //**** New end for if not IsHandled then begin
                        end;
                    "VAT Calculation Type"::"Full VAT":
                        begin
                            Amount := 0;
                            "VAT Base Amount" := 0;
                            "Amount Including VAT" := CalcLineAmount;
                        end;
                    "VAT Calculation Type"::"Sales Tax":
                        begin
                            Amount := Round(CalcLineAmount, Currency."Amount Rounding Precision");
                            "VAT Base Amount" := Amount;
                            if "Use Tax" then
                                "Amount Including VAT" := Amount
                            else
                                "Amount Including VAT" :=
                                  TotalAmount + Amount +
                                  Round(
                                    SalesTaxCalculate.CalculateTax(
                                      "Tax Area Code", "Tax Group Code", "Tax Liable", PurchHeader."Posting Date",
                                      TotalAmount + Amount, TotalQuantityBase + "Quantity (Base)",
                                      PurchHeader."Currency Factor"),
                                    Currency."Amount Rounding Precision") -
                                  TotalAmountInclVAT;
                            OnAfterSalesTaxCalculate(Rec, PurchHeader, Currency);
                            if "VAT Base Amount" <> 0 then
                                "VAT %" :=
                                  Round(100 * ("Amount Including VAT" - "VAT Base Amount") / "VAT Base Amount", 0.00001)
                            else
                                "VAT %" := 0;
                        end;
                end;
        end;

        OnAfterUpdateVATAmounts(Rec);
    end;

New Publisher
[IntegrationEvent(false,false)]
local procedure OnBeforeCaseVATCalculationTypeIsReverseChargeVAT(var PurchaseLine:Record "Purchase Line";PurchaseHeader: record "Purchase Header";Currency: record Currency;var TotalAmount: Decimal;var Amount: Decimal;var TotalVATBaseAmount: Decimal;TotalLineAmount: Decimal; TotalInvDiscAmount: Decimal;var IsHandled: boolean);
begin
end;

Thanks for reporting this. We agree, and we’ll publish a fix asap, either in an update for the current version or in the next major release. We will update this issue with information about availability.


Bevy 0.9

Updated to 0.9, mostly Resource derives.
Still a problem with https://github.com/Aceeri/sabi/blob/2f37474ce5d32d1237548709f2083a7a60fc8ed4/sabi/src/replicate/physics3d.rs#L237-L238
and
https://github.com/Aceeri/sabi/blob/2f37474ce5d32d1237548709f2083a7a60fc8ed4/sabi/src/replicate/physics2d.rs#L219-L220
getting an error that the trait bound SharedShape: Deserialize<'_> is not satisfied

Error gone, works good


What to explore next?

I'm going to keep track of this via a virtual card "game" at:
https://playingcards.io/mj5fhf
I intend to pick one card per traditional Sunday-Saturday week, and study the underlying mixtape that maps to that card, based on some arbitrary Mapping Rules, as well as some personal "study rules" I'll establish below in this description.
This particular virtual card game has a traditional 52-card deck, so I could theoretically do this each week for a year.
The layout of this virtual card game has three "public" spots, and then my "private" hand (it's possible if you follow the link you won't see what's in my hand at that time).  I've decided to deal six cards to my private hand to choose from.  This makes it so the odds are good for getting a valid mixtape from the Mapping Rules, as well as (my personal) Study Rules below.
Once I've made my choice, I'm going to document it in a comment below, and then:

Keep the "card under study" in my hand while I'm studying its underlying mixtape.
Any "invalid" cards (without a mixtape mapping) will be discarded to the public spot down and to the right (or South-East if you like) of the main draw deck (these will eventually be shuffled back into that draw deck).  I might flip these over just to indicate their un-usable nature, for now.
Any "valid" cards that I'm not studying will go to the spot directly underneath (or South) of the main draw deck, for future "sure thing" use (like when I pull six "invalid" cards, or the main draw deck is almost empty).
When I've finished studying a card's mixtape (again in the comments below), I'll return it to the bottom-most (furthest South) public spot.

Study Rules:

Playable in the Archive (otherwise I'd need to rely on my broadcast notes)
Favor older Mixtapes (they tend to get retired / evaporate from the Archive sooner, so Study notes can survive this)
Favor least-recently-played (a final single-file filter, but also makes it more likely there's something discoverable to be contributed to The Codex, or the discord)
Study notes will appear in a separate issue linked from the comment that produced it.

First hand of six:
Ace Hert = Mixtape 41
Queen Hert = ?
King Hert = ?
2 Club = Mixtape 22
Q Club = Forced Stereo
Q Diamond = Mixtape 10

New Year Week 1 Round:
Dealt six cards, and used current mapping:
5 Club = Mixtape 25 (in Archive, Premiere 20200223, Last Play 20201220)
9 Diamond = Mixtape 39 (Archive, 20200616, 20201229)
9 Spade = Mixtape 19 (Archive, 20200114, 20200820)
10 Spade = Mixtape 20 (Archive, 20200119, 20201206)
3 Hert = Mixtape 43 (Not in archive, 20200723, 20201119)
7 Spade = Mixtape 17 (Archive, 20191229, 20201201)

New Year Week 1 Round:
Dealt six cards, and used current mapping:
5 Club = Mixtape 25 (in Archive, Premiere 20200223, Last Play 20201220)
9 Diamond = Mixtape 39 (Archive, 20200616, 20201229)
9 Spade = Mixtape 19 (Archive, 20200114, 20200820)
10 Spade = Mixtape 20 (Archive, 20200119, 20201206)
3 Hert = Mixtape 43 (Not in archive, 20200723, 20201119)
7 Spade = Mixtape 17 (Archive, 20191229, 20201201)

New Year Week 2 Round:
Dealt six cards, and used current mapping:
9 Club = Mixtape 29 (Archive, 20200322, 20201203)
King Spade = Mixtape 51 (Not in archive, 20201206, 20201208)
Ace Spade = Mixtape 11 (Archive, 20191119, 20201020)
9 Hert = Mixtape 49 (Not in archive, 20201011, 20201217)
Jack Hert = Mixtape 9 (Archive, 20191110, 20201108)
4 Club = Mixtape 24 (Archive, 20200216, 20210107)

New Year Week 2 Round:
Dealt six cards, and used current mapping:
9 Club = Mixtape 29 (Archive, 20200322, 20201203)
King Spade = Mixtape 51 (Not in archive, 20201206, 20201208)
Ace Spade = Mixtape 11 (Archive, 20191119, 20201020)
9 Hert = Mixtape 49 (Not in archive, 20201011, 20201217)
Jack Hert = Mixtape 9 (Archive, 20191110, 20201108)
4 Club = Mixtape 24 (Archive, 20200216, 20210107)

New Year Week 3 Round:
Dealt six cards, and used current mapping:
Ace Club = Mixtape 21 (Archive, 20200126, 20201119)
6 Club = Mixtape 26 (Archive, 20200303, 20201122)
5 Spade = Mixtape 15 (Archive, 20191215, 20201122)
10 Diamond = Mixtape 40 (Archive, 20200623, 20210110)
4 Diamond = Mixtape 34 (Archive, 20200510, 20201222)
Jack Club = Mixtape 7 (Archive, 20191103, 20201108)

New Year Week 3 Round:
Dealt six cards, and used current mapping:
Ace Club = Mixtape 21 (Archive, 20200126, 20201119)
6 Club = Mixtape 26 (Archive, 20200303, 20201122)
5 Spade = Mixtape 15 (Archive, 20191215, 20201122)
10 Diamond = Mixtape 40 (Archive, 20200623, 20210110)
4 Diamond = Mixtape 34 (Archive, 20200510, 20201222)
Jack Club = Mixtape 7 (Archive, 20191103, 20201108)

New Year Week 4 Round:
Dealt six cards, and used current mapping:
6 Hert
8 Club
7 Hert
10 Hert
Ace Diamond
King Club

New Year Week 4 Round:
Dealt six cards, and used current mapping:
6 Hert
8 Club
7 Hert
10 Hert
Ace Diamond
King Club

(for some reason 8 Club is now missing from the card game so I made sure to sign in this time)
New Year Week 5 Round:
Dealt six cards, and used current mapping:
5 Hert = Mixtape 45 (Not in Archive, 20200809, 20201215)
Queen Spade = Video Beam (Not in Archive, 20200329, 20201217)
6 Spade = Mixtape 56 (Not in Archive, 20210124, 20210126)
2 Spade = Mixtape 12 (Archive, 20191124, 20201210)
2 Diamond = Mixtape 32 (Archive, 20200426, 20210117)
Jack Spade = Mixtape 6 (Archive but broken, 20191027, 20201112)
Most of these go on top of the "pull later" in the hopes that they'll be (in working order) in the Archive in future.
Mixtape 12 is older and least recently played, so 32 / 2 Diamond goes to "pull later" also.
Fifth week of 2021 (20210131 til 20210206) I'll be studying Mixtape 12: Defend Yourself!

(for some reason 8 Club is now missing from the card game so I made sure to sign in this time)
New Year Week 5 Round:
Dealt six cards, and used current mapping:
5 Hert = Mixtape 45 (Not in Archive, 20200809, 20201215)
Queen Spade = Video Beam (Not in Archive, 20200329, 20201217)
6 Spade = Mixtape 56 (Not in Archive, 20210124, 20210126)
2 Spade = Mixtape 12 (Archive, 20191124, 20201210)
2 Diamond = Mixtape 32 (Archive, 20200426, 20210117)
Jack Spade = Mixtape 6 (Archive but broken, 20191027, 20201112)
Most of these go on top of the "pull later" in the hopes that they'll be (in working order) in the Archive in future.
Mixtape 12 is older and least recently played, so 32 / 2 Diamond goes to "pull later" also.
Fifth week of 2021 (20210131 til 20210206) I'll be studying Mixtape 12: Defend Yourself!

Dealt six cards, and used current mapping*:
King Diamond = 54 (Not in Archive, 20210110, 20210112)
6 Diamond = 36 (Archive, 20200526, 20201203)
Jack Diamond = 8 (Archive, 20191107, 20201108)
3 Club = 23 (Archive, 20200211, 20210126)
4 Hert = 44 (Not in Archive, 20200802, 20210105)
8 Diamond = 38 (Archive, 20200607, 20210112)
*going to hold off on mapping new mixes for awhile, there will be plenty of time to get to them

Dealt six cards, and used current mapping:
7 Diamond = 37 (Not in Archive, 20200531/20200625, 20210128)
5 Diamond = 35 (Archive, 20200517, 20210107)
2 Hert = 42 (Archive, 20200709, 20210207)
8 Spade = 18 (Not in Archive / Retired)
3 Diamond = 33 (Archive, 20200503, 20201220)
7 Club = 27 (Archive, 20200308, 20201222)

This week there's only 4 cards left in the draw pile!  Oh no!
4 Spade = 14 (Archive, 20191208/20200915, 20200915)
10 Club = 30 (Archive, 20200405, 20210216)
3 Club = 23 (Archive, 20200211, 20210126)
8 Hert = 48 (Not in Archive yet)

Rebuilt the deck because that's easier, and hey, if we run across a card we've studied already, we can put that in a different pile.  All the cards have a corresponding Mixtape already, even if most of them aren't in the Archive.
Dealt six cards:
King Spade = 51 (Not in Archive yet)
7 Hert = 47 (Not in Archive yet)
9 Spade = 19 (Archive but retired?)
King Club = 52 (Not in Archive yet)
Ace Hert = 41 (Archive, 20200630, 20210114)
Queen Club = Forced Stereo (Not in Archive and retired?)
Choice is obvious this time, eh?  Everything except Ace Hert goes to the "not valid" pile to the east.
For the week of 20210228 I'll be studying Mixtape 41: You Bastards Are from the 30th Century?!

Dealt six cards:
Jack Club = 07 (already covered)
3 Spade = 53 (not in archive)
7 Club = 27 (Archive, 20200308, 20201222)
2 Club = 22 (Archive, 20200202, 20210105)
3 Hert = 43 (new to archive)
3 Club = 23 (Archive, 20200211, 20210126)
22 wins!

I always temporarily second-guess screenshot gathering -- if I can find a video source, why bother -- until I consider how easily YouTube sources disappear, and how sometimes Mixtapes themselves disappear from the Archive.
It has never been Easy to automate music identification.  The usual suspects (Shazam, SoundHound) tend to only pick up a handful of songs when left alone while the whole mixtape plays out.  Even when focusing on individual moments, there are more false positives (music published far after the source video would have been produced) than true discoveries.  For this reason I usually make that a lower priority than finding the video source -- since this is producing a Wiki, you can always come back for another pass.  Most of the time the music links that get added to the first pass of these pages is from my chat notes from others (neckro, avi), which I've organized by broadcast date instead of Mixtape.  This means I maximize the number of accurate hits by also spending time to research possible broadcast dates outside of when the Mixtape was New or Last Seen.
I've been tracking broadcast dates with increasing accuracy since mid-February of 2020, mostly noting the date and the mixtapes and the order of those during each broadcast.  Many of the mixtapes I'm choosing to study, however, debuted before then, and some potentially had significant edits made to them before they were Archived, which is why I try to make it very clear that I'm studying a specific Archive Version (by date) for the Wiki pages.  If I know all the broadcast dates for a mix, I can then consult my chat notes for each one for some quick wins / shortcuts to research...
In my chat notes, I tend to siphon off URLs that people have posted during a broadcast, and try to quickly contextualize them.  TheOpponent, being the main editor of The Codex, posts known links to Full Movies on Youtube (et al) usually during the first occurrence of a clip from that movie in the mixtape, so there's all the context you need.  Music, however is trickier.  Neckro and Avi, who both maintain stream-relevant playlists, are also good at posting links to Full Songs on Youtube (et al) near (and sometimes during) the first (and sometimes each) occurrence of the use of a clip of that song (usually native to the video source itself), so I only need to do a little bit of contextualizing to place it with the video source.
Outside of URLs, people will sometimes use a SingsNote emoji to call out a song they know, but only about half the time is this followed by an actual song, and around half of that time, someone else has already provided a link anyway.  In those cases I'll note what I think is a discovery, relying on my memory alone, in the moment, so it's even less of a sure thing.  People will also just chat something like "I think this is by the Ramones" with no follow-up, and it's always a game-time judgement call whether or not to take it seriously.
Once I synthesize these notes in mixtape-runtime order, there's usually 1-2 shortcuts to research per mixtape, and every little bit helps.

Dealt six cards:
4 Diamond
6 Hert
5 Hert
5 Club
10 Hert
King Diamond

Dealt six cards:
Jack Spade
7 Spade
4 Spade
King Hert
5 Diamond
7 Diamond

Dealt:
5 Spade
2 Diamond
Ace Diamond
2 Hert
9 Diamond
8 Hert

Dealt:
Jack Hert = 9
10 Club = 30
6 Diamond = 36
Queen Spade = VB
4 Club = 24
Ace Spade = 11

Dealt:
2 Spade
8 Spade
10 Spade
8 Club
6 Spade
8 Diamond

Dealt:
6 Club
Queen Diamond
Queen Hert
9 Hert
4 Hert
Jack Diamond

Dealt (only 4 left):
3 Diamond
9 Club
10 Diamond
Ace Club

Next week, toying with just dealing a card until I get to a valid one, then using the suit of a second card (either an invalid one or just deal another if the first is valid) as a "focus" for the study.
For example: Spades = Screenshots, Clubs = Personnel (Actor/Artist/Company/?), Diamonds = Video Sources, Herts = Music/Audio Sources.
I'd always attempt to describe each segment in a few choice words, and get the sequencing right, but this way I can theoretically finish a study quicker. Finding out which Personnel/Actors are in a given clip's scenes might be difficult if I don't know the Video Source, but most of the time someone knows the source, it just might be impossible to find it on YouTube.  The information is more or less out there even if the digitized movie isn't.
This also makes it possible to revisit existing Wiki entries, as I've never focused that diligently on Music Sources or Personnel.

Dealt (recalled and shuffled all cards, following new strat):
9 Club
3 Diamond

Dealt:
Ace Club = 21 (already reviewed) / Personnel
Ace Diamond = 31 (Archived) / Video
For the week of 20210516 I'll review Mixtape 31: Magic Hand, with a focus on Personnel!

Dealt:
9 Hert = 49 (not in archive) / Music
Jack Hert = 9 (not in archive but #10 sequenced)
Until 20210529 I'll continue reviewing 31 for video sources and personnel, and I can also look into Mixtape 09: I Know What It Takes to Be Invincible!

Dealt:
3 Club
Queen Hert

Going to put this project on hold (since I've done it for half a year now) until I can use the #13 new project to aid it.

Content matching endeavors were interesting but ultimately not effortlessly consistent.  Basically too many things that should have matched didn't, including entire mixtapes that were repeated between two broadcasts.  I'll keep the issues open as the general concept still applies, and assume my attempts to be efficient with it messed with the consistency.  The best move would be to dig into ffmpeg's code and keep it from crashing, and I'm not ready to dive into that just yet.

Even though it's more labor-intensive and generates more sprawl for the Wiki in the medium term, I'm liking the way the last couple of mixtape breakdowns worked.  In fact the way they're breaking down might even make the process easier to stop and pick back up in short bursts, say by only going through the briefest description of a clip and its duration in one pass, then reconciling those descriptions with existing wiki entries in another pass, then generating new entries in a third pass.
This leaves room for later passes in the new source pages themselves to add more detail, such as music, artists, release details, etc.
How/why would we "refactor" the old format?  Well...

...while the randomization via the card decks is fun, it doesn't address something that recently changed.  The Archive opened up with a ton of mixtapes that hadn't previously been uploaded, and all in working order, too.  Randomizing should get more successful hits now, especially with more recent mixtapes, but something curious happened.  Several of the Archive editions shifted from their 2019 originals to their "2020 editions".  This means that revisiting particularly old mixtapes might be difficult if the trend continues.
So instead of random prioritization, I'll be focusing on what hasn't been seen most recently, in order.  At time of writing this is Mixtape 19: EZ Movie Intro Vortex, which I'll be looking at from 20210725 til 20210731!

I've also decided it's more fun to just do this when I have time and not worry about fitting into a rigid one week schedule.
Now that 19 is done, I'll move on to 14.  It already has an entry, but in a form that lends itself pretty well to refactoring to the new format.

Luckily there's already an article started for Forced Stereo Championship that has most of the sources figured out for that special broadcast of many of the music videos up to that point.
I also, luckily, have a record of the names of the music videos that started each broadcast in 2021, for the most part.  For the ones that don't appear in Forced Stereo Championship, I can break them down further into ones that haven't (yet) been broadcast in 2022, and go through sourcing their video and music components one-by-one.

20221012 Dice Roll
1, 5, 6
2019 Maintenance Table of Contents is what the dice rolled.  I've been meaning to do something more with the Mixtapestry page.  Perhaps I'll start by simply listing the wiki entries that correspond to the tapestry columns, making sure that they become ToC entries themselves in the process, and then decide what to do from there.  It'd be cool if the tapestry itself could link off to each entry, and there's already a table on that page separated that way that could work at first.  Wonder if imagemaps are still a supported thing...

20221015 Dice roll
5, 3, 2
2021 Sourcing Chronological Mixtapes!  This is gonna take awhile :) .
There were 45 mixtapes made in 2021, which is around the same amount made in 2020.
Because of the introduction of the Megamix, this gets a little easier as I can reference other mixtapes instead of actual video source material where it is re-used.  Luckily I'd already established a pattern for that, by putting anchors in the source mixtape.  For items that are shared across multiple mixtapes (vortex etc), I'd only do that if there were 3 in a row or more, and picked the most recent mixtape that had the same sequence.  For instances where a Megamix switches back and forth between multiple mixtapes after a single reference, I'll probably do the same thing unless it gets annoying.
Megamixes probably don't need anything else special besides the header/code taking the form "Megamix MM##: TITLE" for easier searching in the navigation menu.  There were 16 of these in 2021.
2021 featured the first physical VHS release, which coincidentally was recently broadcast, making it easier to source.  It too re-used sources beyond the Vortex, but was shorter than a Megamix.
There were several other shorter mixes that didn't broadcast on the main stream, but on socpens' stream, and those were like mini-megamixes where the sources were mostly from mixtapes that had come before, but in some cases featured new material (which was then later used in a full mixtape).
Outside of that there were 23 numbered mixes all with more or less fresh sources, as well as the two special Halloween mixtapes, and Forced Stereo Championship, which has already been sourced.
Once I decided to go in chronological order for the 2020 mixes things started getting easier - unknown sources that made more than one appearance suddenly connected the dots, new Vortex entries were easier to track - and with everything mentioned above, this seems like the only way to approach 2021, so I'm glad the dice fell this way!

In 2020, FVCR created Context Club.
Initially this was going to be on-stream breakdowns of sources that featured heavily in mixtapes, but quickly transitioned to the idea of a group watch-along of a movie in the discord.
This caught on, and with few exceptions, a different movie has been watched weekly for multiple years.
At the 3rd anniversary, I made a video celebrating all those movies.
I liked it so much that I didn't stop making videos -- either more short ones incorporating clips of movies as we gathered more, introducing the new movie of the week, or longer edits of movies that had been broadcast on tv to bring in their more interesting commercials.

Because I was doing something more creative, the analytical side slowed down, but didn't stop, exactly.
Any new mixtapes post 2021, as they've aired, I've made sure to at least get a detailed list of cuts while not distracting too much from the real fun of the broadcast -- interacting in the chat.
With some of those lists, I've been too curious about the source movie to wait, and uncovered some real wild ones, and usually recommended them for Context Club.
Toofan is one of my favorite examples of this, as it expanded tradition a little.  We'd previously screened an Anime "straight to video" series that had been serialized from four shorter parts into two feature-length movies, and then screened them one week after the other.  Toofan is part of what is generally known as "Bollywood", and movies in that genre tend to run 3+ hours.  They traditionally have an intermission in the middle, so there's a natural place to edit and screen the two separate parts, one week after the other.  This also gave me an excuse to be creative and make a "teaser" for the second part as the first part finished.
The tricky part with these "discoveries" is to not spoil future mixtapes' use of the source material, so the soft "rule" has generally been to wait 6 months, from a movie's clip first being featured in a mixtape, before screening it for Context Club.
In terms of spoiling it in the wiki, well, there's usually very little danger of that, as of now I'm at least 2 years behind...

There are two to three more entries needed to "finish" 2021:
-)Megamix 15
-)Megamix 16
-)2021-2022 New Year's
This shouldn't be difficult, right? ;)


Replace Q with Bluebird

For the most parts, conversation done half-automatically
(https://gist.github.com/SevInf/007cbce5c5ad6898dc28c279998445ac)
Code using Q.defer() required manual updating. Please, pay attention
to LimitedPool class.
Internally, only bluebirds promises are used.
For outside world, at least for 4.x, blueberd promosies adapted to
Q-like interface using bluebird-q library.
Since bluebird warns about unhandled rejections by default, few tests
required changes. For creating rejected promises
test/util:rejectedPromise should now be used to suppress the warning.
q-promise-utils and q-io are still there, their replacement is the next
step.
@j0tunn @sipayRT @eGavr @DudaGod

Coverage decreased (-0.2%) to 83.635% when pulling 5c2090a53c7f1cc2e7d1cf55bd4c7bc3bdc4dacb on feature/proper-bluebird into 1076a29fef504fc205dff3cd8a5018348fba4eca on master.

Coverage decreased (-0.2%) to 83.731% when pulling 92e9e376004c5aa1793ad5b5369b80e4904adac2 on feature/proper-bluebird into 87fa8df80361db647a124af4f3df0848f2121bc1 on master.


Merge triggers for CICD recipe

Description
Attempt to merge triggers into a single submodule to avoid repeated code.
Closes #956

/gcbrun

/gcbrun

Looking at the final result, I'm inclined to think it's better to just keep templating and have clearer final output files. I don't like that when I look at a triggers/main.tf file, I see
github = var.is_github ? ... : []
trigger_template = is_cloud_source_repository ? ... : []

and similar things elsewhere. It makes me have to mentally do the boolean logic by looking at the terraform.tfvars to figure out what kind of trigger this is and what it's doing.

Looking at the final result, I'm inclined to think it's better to just keep templating and have clearer final output files. I don't like that when I look at a triggers/main.tf file, I see
github = var.is_github ? ... : []
trigger_template = is_cloud_source_repository ? ... : []

and similar things elsewhere. It makes me have to mentally do the boolean logic by looking at the terraform.tfvars to figure out what kind of trigger this is and what it's doing.

On my very first try, this is kind of what I was talking about. Trying to reduce the code creates even more complexity that is more difficult to maintain, but I think it worths the effort to try to accomplish something in the middle.
Particularly with the github/csr logic, that can still be templated while the triggers are still merged? What do you think?
We can have a meeting with Xin to evaluate. I think these are the possibilities:

Keep it like it is right now
Keep merged the triggers but templating only the github/csr part
Not implementing at all

Looking at the final result, I'm inclined to think it's better to just keep templating and have clearer final output files. I don't like that when I look at a triggers/main.tf file, I see
github = var.is_github ? ... : []
trigger_template = is_cloud_source_repository ? ... : []

and similar things elsewhere. It makes me have to mentally do the boolean logic by looking at the terraform.tfvars to figure out what kind of trigger this is and what it's doing.

On my very first try, this is kind of what I was talking about. Trying to reduce the code creates even more complexity that is more difficult to maintain, but I think it worths the effort to try to accomplish something in the middle.
Particularly with the github/csr logic, that can still be templated while the triggers are still merged? What do you think?
We can have a meeting with Xin to evaluate. I think these are the possibilities:

Keep it like it is right now
Keep merged the triggers but templating only the github/csr part
Not merging at all

A meeting is a good idea, but sure, #2 sounds like it could be an improvement.

Looking at the final result, I'm inclined to think it's better to just keep templating and have clearer final output files. I don't like that when I look at a triggers/main.tf file, I see
github = var.is_github ? ... : []
trigger_template = is_cloud_source_repository ? ... : []

and similar things elsewhere. It makes me have to mentally do the boolean logic by looking at the terraform.tfvars to figure out what kind of trigger this is and what it's doing.

On my very first try, this is kind of what I was talking about. Trying to reduce the code creates even more complexity that is more difficult to maintain, but I think it worths the effort to try to accomplish something in the middle.
Particularly with the github/csr logic, that can still be templated while the triggers are still merged? What do you think?
We can have a meeting with Xin to evaluate. I think these are the possibilities:

Keep it like it is right now
Keep merged the triggers but templating only the github/csr part
Not merging at all

A meeting is a good idea, but sure, #2 sounds like it could be an improvement.

I'll open a separate PR against this branch with the #2 so we can compare the alternatives before setting up the meeting.
I'll let you know!

/gcbrun

/gcbrun


Instance lighting has a tendency to break

Describe the Bug
Lighting of instances will sometimes go completely or partially dark. This can be seen on large, moving Create contraptions.
This issue was recently opened, showing it happening to chests.
When looking for an issue to direct that to, I was very surprised to find this has never been formally reported?? It's a pretty common problem. I checked Flywheel and both Creates and found nothing. So now there is one.
Reproduction Steps
unknown, very random
Expected Result
correct lighting
Screenshots and Videos
see this issue
Crash Report or Log
No response
Operating System
Windows 10
What is your GPU?
I've had this occur on my 3060, unknown for original reporter.
Mod Version
0.6.8.a
Minecraft Version
1.19.2
Loader Version
unimportant, happens on all loaders and game versions
Other Mods
No response
Additional Context
No response

I've also experienced this issue, and spent the last week trying to figure out why this happens and fixing it. I will not be posting a jar of the fixed version as i'm not sure if that is allowed and you probably shouldn't download and run jars from stranger's on the internet anyways. Fortunately, it is very easy to fix if you know how to clone the code and build your own jar.
There are 2 files that you need to change, InstancedMaterialGroup.java and FallbackAllocator.java. in InstancedMaterialGroup.java, you'll want to look for the following bits of code at lines 97 and 158:
P program = owner.context.getProgram(ProgramContext.create(entry.getKey().getProgramSpec(), Formats.BLOCK, layer));
and
return new ModelPool(Formats.BLOCK);
In FallbackAllocator.java, look for line 11:
IndexedModel out = new IndexedModel(model, Formats.BLOCK);
In all 3 of these places, change Formats.BLOCK to Formats.POS_TEX_NORMAL
This is what fixed it for me, so if you're only interested in that the below information will not be relevant. Here are some things i've found while trying to figure out why it breaks.
In the vertex shaders, the normal is multiplied with a matrix 'normalMat' (done in the vertex(inout Vertex v, Instance i) function defined in model.vert). For some reason, the 'normalMat' that is passed to the shaders is all zeroes sometimes, following a certain pattern (more on that later). This then causes the normal to be set to zeroes, which in turn makes the diffusefactor zero, which finally makes the color zero (black). As to why 'normalMat' is the zero-matrix in the shaders, i couldn't figure that out. By using the debugger, i found that the matrices generated in the code in the BeginFrame() methods of broken instances are completely as expected (and i did not see them get altered after this method). I also checked memory locations the values were written to, and everything seemed to check out. At some point i noticed that there was a place in the constructor of ModelPart.java, which is used to create the broken instances, where  POS_TEX_NORMAL format is used to create a PosTexNormalWriterUnsafe. After altering this to a BlockWriterUnsafe (and also implementing some methods in PartBuilder.java to accept the blockwriter), the issue still persisted. I think i looked at basically everything as to why using the BLOCK format might break it, and by all accounts, it shouldn't. In fact, it doesn't for most people: i asked a friend to quickly test it and released version of flywheel where the BLOCK format is used works just fine on his device. This leads me to believe that the issue is perhaps cause by certain graphics drivers or hardware configurations.
I mentioned a pattern in how instances are broken earlier. I noticed that at any point, the oldest half of created instanced (rounded up) of one type works normally, while the newest half (rounded down) is rendered incorrectly. With 'of one type', i mean things such as chest lids and minecarts being distinct types. Also, left- and right-half chest lids for double chests and single lids are considered different types. Shulker boxes top-and bottom halves are also distinct types, as well as shulker boxes of different colors.
Lastly, i noticed that broken instances either rendered too bright or completely black (i assume this is because diffusefactor in the shader is either 0 or 1, but never something in between as a result of the broken 'normalMat'). But once an instance of particular type is destroyed, instances of that type are always completely black until the world is closed and restarted.
This has been a very long comment. To finish i would like to mention that looked through several different branches and commits, and this commit is the one that introduced the problem. This commit happened quite a while ago, so it must be a quite rare occurrence for this problem to happen. Also, i noticed a new version is being worked on on the branch 1.20/next. This problem doesn't occur (at least for me) on that branch.
That was all. I hope this helps!

I would like to fix it, so I'm wondering if anyone has an exact list of things I need to do? Because from that post I don't even know where to look for the files...

@HiMikoHyuga The issue is now mostly resolved on 1.20/next and I don't know if there's a true solution that isn't just another workaround.
The problem is that some drivers simply don't handle integer vertex attributes correctly. Flywheel used integer attributes for light (and still uses them for overlay), so sometimes the shader ends up with garbage data.
The workaround you might want to try is to avoid using integer attributes at all. The 2 places I'll point you to are vertex_input.glsl for the GPU side code, and InternalVertex for the CPU side representation.

It is fixed entirely in dev but the fix has not been released yet

Downgraded to AMD Adrenalin 23.12.1 and this issue doesn't occur for me anymore even while on instancing engine (AMD GPU)

I'm also getting this issue like the this post, the top of my chest is just black.

After harf a year by "fixed in dev", it still not fix in release? what can i say.
i try an old version about amd driver, it`s ok, but i need to play other games with new driver too.
I must play MC with black chest and purple belt now.
Wish it will be here soon.

Also still experiencing this issue on Adrenalin 24.9.1. Would very much appreciate a fix for this.

It is fixed entirely in dev but the fix has not been released yet

Genuinely, why have you not released it then? This is a pretty severe issue, shouldn't it be a priority?

@Jozufozu It's genuinely pathetic that it's taking this long to release a patch when the patch is already finished.

"the fix" in question is a complete rewrite of the mod. I tried duct taping on some things I thought could work to 0.6, but nothing simple made a difference.
Flywheel 1.0 cannot release on 1.20.1 without breaking create, so it will remain in dev until such time as create is ready to release with it.
I appreciate your patience, and I remind you that contributions are always welcome if you feel you can improve the stability of the mod.

Oh, didn't realize it was a part of the rewrite. Sorry.


[Transformer] Format documentation

From #300
Transformer for formatting the documentation. By default it could use one style of the documentation (like Google docstring) but allow to switch to some other popular styles.
Upon consideration: allowing to pass some kind of template that would be applied to documentation.

Considering the complexity of formatting existing documentation, we cannot provide anything more than simple support such as indenting whole lines etc.
We can do more in terms of generating new documentation - for example if we have new keyword and we want to create documentation for it. We could have non-default transformer GenerateTransformer that will add documentation stubs based on content of the keyword - arguments, return values etc. By default it would only add missing documentation with the option to overwrite previous docs.
User would be able to select basic documentation styles (such as google-style) or provide their own template for the documentation (using jinja templating).
Example of the template:

{% if arguments %}
{{ c_indent }}Arguments:
{% endif %}
{% for arg in arguments %}
{{ c_indent }}{{ separator }}{{ arg }}:
{% endfor %}

{{ c_indent }}Returns:

Keyword before running transformer:
Two Arguments
    [Arguments]    ${var}    ${var2}

After:
Two Arguments
    [Documentation]
    ...
    ...    Arguments:
    ...        ${var}:
    ...        ${var2}:
    ...
    ...    Returns:
    ...
    [Arguments]    ${var}    ${var2}

For the templates I will provide basic values such as indent, continuation indent, separator (that can be provided in robotidy config or taken from defaults), and parsed arguments, return values. I need to take a look at some example documentation to see if there is need to access any extra information (for example generate special line if specific keyword is used etc).

Hi,
is it possible to add to the template two such fields which can insert a placeholder static user message to the documentation like "WRITE DOCUMENTATION".
And another one which can insert the keyword name to the documentation.
Or combining these two stuffs.
I hope I could explain my ideas well.
Examples:
    [Documentation]    WRITE DOCUMENTATION
    ...
    ...    Arguments:
    ...        ${var}:
    ...        ${var2}:
    ...
    ...    Returns:
    ...
    [Arguments]    ${var}    ${var2}

Two Arguments
    [Documentation]    Two arguments
    ...
    ...    Arguments:
    ...        ${var}:
    ...        ${var2}:
    ...
    ...    Returns:
    ...
    [Arguments]    ${var}    ${var2}```

Two Arguments
    [Documentation]    WRITE DOCUMENTATION Two arguments
    ...
    ...    Arguments:
    ...        ${var}:
    ...        ${var2}:
    ...
    ...    Returns:
    ...
    [Arguments]    ${var}    ${var2}

And that is a good question what would be better the inserted text should be the same line as the [Documentation] tag or in the next line.

Yes, if you look at the example I provided - which is from working POC - I'm already using some static text. It's "Arguments" and "Returns". User will be able to provide any kind of free text in their custom templates. And it will be covered in the future documentation but first line of the template is space right after [Documentation] marker. So user can provide something in the first line of the template and it will be displayed there or can simply (like I did in the example template) put few empty lines so the text starts below documentation marker.

You are right.
I thought those are dedicated strings, not such kind of free text.
Sorry, my bad. :-(

And for automatic field I can also provide keyword name (ie {{ keyword }}) which will help users to insert it somewhere in the template.
The main downside of using templating is that user will need to learn basics of jinja templating if he wants anything more complex than provided by default. But I think it's quite straightforward to learn (and rewarding if you apply new skills in other automation tasks). And it will be optional since robotidy will come with predefined templates already.

You are right.
I thought those are dedicated strings, not such kind of free text.
Sorry, my bad. :-(

Don't be sorry, , that was important part to point out and I will hightlight it in the documentation as well - since it could be not clear that you are free to input free text. The documention is often one of the most important parts of the implementation ;) (but of the irony here since we're talking about transformer for documentation :D)

GenerateDocumentation transformer was just released in Robotidy 4.0! However I recommend waiting till the Robotidy 4.0.1 is (soon) released because I introduced regression.


Crash if string contains NSLinkAttributeName

If string contains NSURL in NSLinkAttributeName then this code is incorrect
//KILabel.m:481
NSString *realURL = [text attribute:NSLinkAttributeName atIndex:matchRange.location effectiveRange:nil];
if (realURL == nil)
realURL = [plainText substringWithRange:matchRange];//crash

I can't reproduce this crash on the development branch. What is the text in the label and attribute?

try this attributed string:
NSMutableAttributedString *string = [NSMutableAttributedString new];
[string appendAttributedString:[[NSAttributedString alloc] initWithString:@"I have "]];
[string appendAttributedString:[[NSAttributedString alloc] initWithString:@"http://google.com/" attributes:@{NSLinkAttributeName:@"http://google.com/"}]];
[string appendAttributedString:[[NSAttributedString alloc] initWithString:@", "]];
[string appendAttributedString:[[NSAttributedString alloc] initWithString:@"http://google.com/" attributes:@{NSLinkAttributeName:[NSURL URLWithString:@"http://google.com/"]}]];
[string appendAttributedString:[[NSAttributedString alloc] initWithString:@", and http://google.com"]];
label.attributedText = string;

Thanks for the quick reply. The problem is because KILabel is assuming NSLinkAttributeName is a string. This is actually fixed on the develop branch where we are checking type of the object (It can be either string or url but url is preferred).
I was planning on releasing the develop branch over the next few days so it's fairly stable if you want to get the fix now. Otherwise I'll close this when I've finalised the 1.1 release.
Thanks

pod 'KILabel', :branch: 'develop'


add the remote flag to the istioctl version command

Without the remote flag, users will only post the version of istioctl binary. This should help new bug reporters make better bug reports. 😄

[APPROVALNOTIFIER] This PR is NOT APPROVED
This pull-request has been approved by: dwradcliffe
To fully approve this pull request, please assign additional approvers.
We suggest the following additional approver: linsun
If they are not already assigned, you can assign the PR to them by writing /assign @linsun in a comment when ready.
The full list of commands accepted by this bot can be found here.
The pull request process is described here

Needs approval from an approver in each of these files:

OWNERS

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

Hi @dwradcliffe. Thanks for your PR.
I'm waiting for a istio member to verify that this patch is reasonable to test. If it is, they should reply with /ok-to-test on its own line. Until that is done, I will not automatically test new commits in this PR, but the usual testing commands by org members will still work. Regular contributors should join the org to skip this step.
Once the patch is verified, the new status will be reflected by the ok-to-test label.
I understand the commands that are listed here.

Instructions for interacting with me using PR comments are available here.  If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository.


Provide block-level global styles

Describe the problem
I think Svelte's local-first style policy is brilliant. That said, when it comes to global styles (think reset.css or styles that apply to an entire component library) I find it extremely clunky having to wrap every single style declaration with a global() statement.
Describe the proposed solution
I would much prefer having some sort of block-level attribute as follows:
<style scope="global">
body {
    color: red;
}

a {
    text-decoration: none;
}
</style>

Alternatives considered
The main way to achieve this currently is by linking a global stylesheet inside src/app.html.
Importance
nice to have
Additional Information
No response

https://github.com/sveltejs/svelte-preprocess#global-style svelte-preprocess already lets you do this


[Part2] Clean & fix scikit-learn testing

Description
Please include a summary of the change. For large or complex changes please include enough information to introduce your change and explain motivation for it.
Changes proposed in this pull request:

@Mergifyio rebase


Stylesheet is missing

When I run "npm run build", the link to the app.version.css is missing in build/index.html.
To fix it, remove quotes from 'false' because debug is not a string.
https://github.com/badsyntax/react-seed/blob/master/app/index.html#L7

Are you sure? 'debug' is a string, because it's passed as a string: https://github.com/badsyntax/react-seed/blob/f6cbd0378413840c11d1ea9688126640b0791ad0/webpack/loaders.js#L19 (Not ideal, I know).
This is the output I'm getting in index.html when I run npm run build:
<!DOCTYPE html>

  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width" />
  <title>react-seed</title>

  <link type="text/css" rel="stylesheet" media="all" href="css/app.0.0.13.css" />

Input: app/index.html

The type of 'version' variable is <%= typeof(version) %>
\n

The type of 'title' variable is <%= typeof(title) %>

The type of 'debug' variable is <%= typeof(debug) %>

  ...

Output: build/index.html

The type of 'version' variable is string

The type of 'title' variable is string

The type of 'debug' variable is boolean

  ...

I found out why. I started react-seed from a fresh install of node_modules so I use the last version of "loader-utils" package. (https://github.com/webpack/loader-utils/commit/1c75aac162e77351442bcc05e186959315abcea3 and https://github.com/webpack/loader-utils/commit/63f19e9a0772292c1cb1e48944cbc3294317fd3f)
"true" and "false" strings are converted to boolean since<EMAIL_ADDRESS>
<EMAIL_ADDRESS>/tmp/react-seed/node_modules/template-html-loader
├──<EMAIL_ADDRESS>└──<EMAIL_ADDRESS>
What is your version of loader-utils ?

Thanks for feeding back this information! That's exactly what's happened. Dev's should be more careful about how they release, a change of behaviour should not be a patch release, as is the case here.
I'll fix this when I have some time. Thanks again!

Or feel free to send a PR!
I'd like to update all the packages at some point (npm-check-updates is helpful here).

Thanks for the new release.


Files for OS X 10.7 Lion Terminal and update for IntelliJ using Scala

See included readme.

Why is this not being merged in?

Works great for me as well, please merge this in.

I won't speak for @altercation, but one very possible reason this hasn't been merged is the sheer size of the pull request and the number of unrelated files it touches.  Break this down into logical chunks and submit each as a separate pull request and you'll be much more likely to have it merged.

Unfortunately when I submitted this pull request I didn't realise that subsequent changes to my clone would become updates to the pull request.
As far as I can recall the first commit in the sequence: https://github.com/sroebuck/solarized/commit/c28646e2c5586e70639eaa12ec148c8ae87d896b is the only commit relating to OS X Lion Terminal.  All the others are, I think, the various changes I made to IntelliJ settings for Scala.
So, @altercation if you would like to include this, you can just take the first commit and ignore all the rest.

that puts more works on @altercation... best to make pull requests as easy as possible to merge in.  I'd recommend creating a new branch on your local repo based on HEAD on the master repo.  Then make the singular change there and send the pull request.  Because it's in a separate branch, there's no concern about any of your other changes getting mixed in.

@willnorris Okay, I mistakenly thought he could just cherry pick that commit with a single command or just copy and paste the two files from the github site.  Perhaps you could guide me on how I would go about creating a branch on my repo that contains the current head of his and just one commit from mine.  To be frank it would seem easier just to create a whole new fork and a new pull request, but that's probably just 'cause I don't know the particular command required.  On the other hand given that I have had no response to this from @altercation in the last 10 months it would seem stupid to spend time reformulating the pull request when he may just have other things on his mind.

yeah, he definitely could do a cherry pick which wouldn't be that big of a deal... depends on the developer as to what they prefer.  You're right that it'd probably be easier to create a new pull request.  But as you point out, given that Ethan hasn't responded here in quite a while, might not be worth the effort :-\
for what it's worth, I've been using your Terminal settings and definitely appreciate your work on them.  That's really the main reason I chimed in... I'd  love to see this get merged in one way or the other!

Guys, I'm here.  I am following this and other threads, though. I am considering opening a  forum/g+ page to discuss some issues around the structure of the git repo so I can pull in changes more easily without screwing stuff up. Regardless, please keep posting, please keep emailing, I'm determined to get solarized updated significantly this quarter (Q1), which is a looming deadline.

awesome, great to hear!  @sroebuck: let's see if we can get this into a cleaner pull request that can be merged in with minimal effort.

Okay, fully understand the problems of maintaining lots of out-of-hours stuff.  Just let me know when and if you want to pull this and I'll happily get it into a form that suits you.  In this particular case Terminal for Lion is now arguably the standard version and it might make sense to rearrange the directories to reflect that.

Okay, so I've now become the master of:
git branch lion-terminal upstream/master

And have made a new pull request.  So I'm closing this one.


test PR with Github API

Please pull this in!

Docs Build status updates of commit 6afc133:
:warning: Validation status: warnings

File
Status
Preview URL
Details
Dependent Files

sdp-test/page-model-documents/Tutorial.yml
:warning:Warning

Details

sdp-test/page-model-documents/Tutorial.yml

[Warning] Unable to find uid "challenge-uid".

For more details, please refer to the build report.
Note: If you changed an existing file name or deleted a file, broken links in other files to the deleted or renamed file are listed only in the full build report.

Docs Build status updates of commit d2156b9:
:warning: Validation status: warnings

File
Status
Preview URL
Details
Dependent Files

sdp-test/page-model-documents/Tutorial.yml
:warning:Warning

Details

sdp-test/page-model-documents/Tutorial.yml

[Warning] Unable to find uid "challenge-uid".

For more details, please refer to the build report.
Note: If you changed an existing file name or deleted a file, broken links in other files to the deleted or renamed file are listed only in the full build report.