stripped all CRs from the repository

Description
This PR includes the following proposed change(s):
The CRLF characters were causing some issues with building.  We've added a config to force a LF within git, but it doesn't appear to update the legacy files that were already loaded onto the workstation.  I've searched and replaced all CRLF characters in the repo.  This has an impact on the history of the file so we may not wish to do this.  I'm proposing this PR to open a conversation and then make a choice on how to proceed.
Type of change

[ ] Bug fix (non-breaking change which fixes an issue)
[ ] New feature (non-breaking change which adds functionality)
[X] Refactoring / Documentation
[ ] Version change

if your change is a breaking change, please add breaking change label to this PR
How Has This Been Tested?
No Tests
Does the change impact or break the Docker build?

[ ] Yes
[X] No

If Yes: Has Docker been updated accordingly?

[ ] Yes
[X] No

Checklist:

[X] My code follows the style guidelines of this project
[X] I have performed a self-review of my own code
[ ] I have made corresponding changes to the documentation
[ ] New and existing unit tests pass locally with my changes

I do agree with this change. let's put it in
also we need something to force it on PR maybe...

I do agree with this change. let's put it in
also we need something to force it on PR maybe...


letter issue

There is an issue where the word would look like there are two of the same letter. If you add two of the same letter it will show up like there are two of that letter in the word.

I made my own wordle clone in Vue.js using an animation library.
I got around this issue by keeping track of the appearances of each letter
Take a look at my checkWord function

checkWord(guessedWord: string) {
  // The indices in this dictionary correspond to the status of each letter being "correct" or "close"
  //  e.g. for the word "apple", with a guess of "opens"
  // { 1: "", 2: "correct", 3: "in-word", 4: "", 5: "" }
  const indices: {
    [key: number]: string
  } = {1: "", 2: "", 3: "", 4: "", 5: ""}

  // Keep a string of the matching characters so we can keep track of the prior appearances while iterating
  let matchingChars = ''

  for (let i = 0; i < this.word.length; i++) {
    const letter = guessedWord[i]

    const rgx = new RegExp(`${letter}`, "g")
    // Need to know the total appearances of the letter in the word
    const totalAppearances = (this.word.match(rgx) || []).length
    // Also need to know all prior appearances of the letter in the word,
    //  so we don't mistakenly tell the user that a duplicate letter exists
    const priorAppearances = (matchingChars.match(rgx) || []).length

    if (!this.word.includes(letter)) {
      this.guessedLetters.push(letter)
      // can continue the loop without checking correctness of the letter
      continue
    }

    // The letter is correct
    if (this.word[i] === guessedWord[i]) {
      indices[i + 1] = "correct"

      if (!this.correctLetters.includes(letter)) {
        this.correctLetters.push(letter)
      }

      matchingChars = matchingChars + letter
      continue
    }

    // The letter is included in the word

    // Look ahead... If there is a correct appearance further in the word, we need to know
    let futureCorrectAppearances = 0
    for (let j = i; j < this.word.length; j++) {
      if (this.word[j] === guessedWord[j] && this.word[j] === letter) futureCorrectAppearances++
    }

    // There are correct appearances further ahead in the word, so we should continue
    if (futureCorrectAppearances >= totalAppearances) continue

    // Ensure duplicates are accounted for
    if (priorAppearances >= totalAppearances) continue

    //  the letter is in word
    if (!this.closeLetters.includes(letter)) this.closeLetters.push(letter)

    indices[i + 1] = "in-word"

    matchingChars = matchingChars + letter
  }// end for

  // win event
  if (this.word === guessedWord) return { win: true, indices }

  return { indices, win: false }
}

The current code in master still doesn't properly resolve a case where the player enters more of a given letter than there are in the word. For example, guessing "EERIE" when the word is "QUEER." Here's my fix for it:
...
  stopInteraction()
  flips = mapTiles(guess)
  activeTiles.forEach((...params) => flipTile(...params, guess, flips))
}

function mapTiles(guess) {

  // Pass 1: Number of times each letter occurs in target word
  var targetMap = [...targetWord].reduce((res, char) => (res[char] = (res[char] || 0) + 1, res), {})

  // Pass 2: All of the correct guesses (and build five letter map)
  var map2 = ""
  for (var i = 0; i < guess.length; i++) {
    var c = guess.charAt(i)
    if (c === targetWord.charAt(i)) {
      map2 += "c"
      targetMap[c] -= 1
    } else {
      map2 += "i"
    }
  }

  // Pass 3: Letters in the word, but in incorrect positions
  var map3 = ""
  for (var i = 0; i < map2.length; i++) {
    var f = map2.charAt(i)
    if (f === 'i') {
      var c = guess.charAt(i)
      if (targetMap.hasOwnProperty(c) && (targetMap[c] > 0)) {
        targetMap[c] -= 1
        f = 'p'
      }
    }
    map3 += f
  }

  return map3
}

function flipTile(tile, index, array, guess, flips) {
  const letter = tile.dataset.letter
  const key = keyboard.querySelector(`[data-key="${letter}"i]`)
  const status = flips.charAt(index)

  setTimeout(() => {
    tile.classList.add("flip")
  }, (index * FLIP_ANIMATION_DURATION) / 2)

  tile.addEventListener(
    "transitionend",
    () => {
      tile.classList.remove("flip")
      if (status === 'c') {
        tile.dataset.state = "correct"
        key.classList.add("correct")
      } else if (status === 'p') {
        tile.dataset.state = "wrong-location"
        key.classList.add("wrong-location")
      } else {
        tile.dataset.state = "wrong"
        key.classList.add("wrong")
      }
...

The current code in master still doesn't properly resolve a case where the player enters more of a given letter than there are in the word. For example, guessing "EERIE" when the word is "QUEER." Here's my fix for it:
...
  stopInteraction()
  flips = mapTiles(guess)
  activeTiles.forEach((...params) => flipTile(...params, guess, flips))
}

function mapTiles(guess) {

  // Pass 1: Number of times each letter occurs in target word
  var targetMap = [...targetWord].reduce((res, char) => (res[char] = (res[char] || 0) + 1, res), {})

  // Pass 2: All of the correct guesses (and build five letter map)
  var map2 = ""
  for (var i = 0; i < guess.length; i++) {
    var c = guess.charAt(i)
    if (c === targetWord.charAt(i)) {
      map2 += "c"
      targetMap[c] -= 1
    } else {
      map2 += "i"
    }
  }

  // Pass 3: Letters in the word, but in incorrect positions
  var map3 = ""
  for (var i = 0; i < map2.length; i++) {
    var f = map2.charAt(i)
    if (f === 'i') {
      var c = guess.charAt(i)
      if (targetMap.hasOwnProperty(c) && (targetMap[c] > 0)) {
        targetMap[c] -= 1
        f = 'p'
      }
    }
    map3 += f
  }

  return map3
}

function flipTile(tile, index, array, guess, flips) {
  const letter = tile.dataset.letter
  const key = keyboard.querySelector(`[data-key="${letter}"i]`)
  const status = flips.charAt(index)

  setTimeout(() => {
    tile.classList.add("flip")
  }, (index * FLIP_ANIMATION_DURATION) / 2)

  tile.addEventListener(
    "transitionend",
    () => {
      tile.classList.remove("flip")
      if (status === 'c') {
        tile.dataset.state = "correct"
        key.classList.add("correct")
      } else if (status === 'p') {
        tile.dataset.state = "wrong-location"
        key.classList.add("wrong-location")
      } else {
        tile.dataset.state = "wrong"
        key.classList.add("wrong")
      }
...

nice solution, tried other solution before but yours solved another problem i was having, but i couldn't actually undestand the code correctly, can you comment on it or something? i'm kinda new to JS in general.

Received a request to better describe the change I posted above.
In Pass 1, we use map-reduce functionality built into JavaScript to create an associative array with each unique letter of the correct answer as a key, and the number of times that letter occurs in the word as the value. So for example if the correct answer is QUEER the map is { E:2, Q:1, R:1, U:1 }. This map is called targetMap.
In Pass 2, we do two things at once based on whether each letter of the player's guess is correct or not.
One thing we do in Pass 2 is create a five-letter string consisting of the letters 'i' and 'c'. An 'i' means incorrect, and a 'c' means correct. Every place where the player's guess matches the correct answer gets a 'c' and the others get an 'i'. So for example if the player's guess is SPEAR and the correct answer is QUEER, we produce the five-letter string 'iicic'. This string is called map2.
The other thing we do in Pass 2 is decrement the count in targetMap (that we created in Pass 1) by one for each correct letter guess in the correct position. So for example if the player's guess is SPEAR and the correct answer is QUEER, at the end of Pass 2 the targetMap will be { E:1, Q:1, R:0, U:1 } because one E and one R are correct letters in the correct position. Notice that we didn't delete the 'R' key in targetMap, even though its count is zero.
In Pass 3 we build the map3 string as a copy of map2, but replace 'i' characters with 'p' characters when the letter is correct but in the wrong position ('p' for position). We do this by, for every position in map2 that contains an 'i', looking at the letter in the corresponding position of the player's guess and seeing if targetMap has a non-zero count for that letter. If it does, we replace the 'i' with a 'p' in map3 and decrement the count in targetMap. So for example if the player's guess is SPEAR and the correct answer is QUEER, there are no letters in the player's guess that are correct but in the wrong position, and map3 will be the same as map2. Using targetMap in this way makes sure we properly account for multiples of the same letter in all cases and edge cases. The resulting map3 string tells us what color we should make each tile that we reveal as the result of the player's guess: green for correct position and letter; yellow for correct letter in the wrong position; gray for completely incorrect.
We return map3 from mapTiles(), as the flips string. We pass flips down to flipTile(), and modify the rest of the code so that it uses the 'i', 'c' and 'p' characters for each position to determine the tile color.
Hope this helps!


Not Discoverable on local wifi - Pi 3

Hi,
Im using a rasperry pi 3.
Unfortunately the pi is not discoverable on my local wifi right out of the box by any device.
I can only discover it once I modify the config file and add my username and password to it.
This however means that everybody else on my network cannot use raspotify.
Thanks,
Simon
Logs:

Nov 11 14:28:15 Sipi systemd[546]: Time has been changed
Nov 11 14:28:15 Sipi systemd[1]: Time has been changed
Nov 11 14:28:15 Sipi systemd[1]: apt-daily.timer: Adding 9h 58min 48.041173s random time.
Nov 11 14:28:15 Sipi systemd[1]: apt-daily-upgrade.timer: Adding 56min 23.982175s random time.
Nov 11 14:29:35 Sipi librespot[856]: INFO:librespot::player: Loading track "Fried Hockey Boogie"
Nov 11 14:29:35 Sipi librespot[856]: INFO:librespot::player: Track "Fried Hockey Boogie" loaded
Nov 11 14:33:47 Sipi librespot[856]: INFO:librespot::player: Loading track "On The Road Again"
Nov 11 14:33:48 Sipi librespot[856]: INFO:librespot::player: Track "On The Road Again" loaded
Nov 11 14:37:14 Sipi librespot[856]: INFO:librespot::player: Loading track "Same All Over"
Nov 11 14:37:15 Sipi librespot[856]: INFO:librespot::player: Track "Same All Over" loaded
Nov 11 14:40:26 Sipi systemd[1]: Started Session c3 of user pi.
Nov 11 14:40:43 Sipi systemd[1]: Started Session c4 of user pi.
Nov 11 14:42:52 Sipi systemd[1]: Starting Cleanup of Temporary Directories...
Nov 11 14:42:52 Sipi systemd[1]: Started Cleanup of Temporary Directories.
Nov 11 14:44:30 Sipi systemd[1]: proc-sys-fs-binfmt_misc.automount: Got automount request for /proc/sys/fs/binfmt_misc, triggered by 939 (find)
Nov 11 14:44:30 Sipi systemd[1]: Mounting Arbitrary Executable File Formats File System...
Nov 11 14:44:30 Sipi systemd[1]: Mounted Arbitrary Executable File Formats File System.
Nov 11 14:52:06 Sipi systemd[1]: Stopping Raspotify...
Nov 11 14:52:06 Sipi systemd[1]: Stopped Raspotify.
Nov 11 14:52:06 Sipi systemd[1]: Starting Raspotify...
Nov 11 14:52:06 Sipi systemd[1]: Started Raspotify.
Nov 11 14:52:06 Sipi librespot[1059]: INFO:librespot: librespot 8971d3a (2017-10-05). Built on 2017-10-05. Build ID: POyxPQVg
Nov 11 14:54:22 Sipi systemd[1]: Stopping Raspotify...
Nov 11 14:54:22 Sipi systemd[1]: Stopped Raspotify.
Nov 11 14:54:47 Sipi systemd[1]: Reloading.
Nov 11 14:54:47 Sipi systemd[1]: Reloading.
Nov 11 14:54:50 Sipi dbus[376]: [system] Activating via systemd: service name='org.freedesktop.PackageKit' unit='packagekit.service'
Nov 11 14:54:50 Sipi systemd[1]: Starting PackageKit Daemon...
Nov 11 14:54:50 Sipi PackageKit: daemon start
Nov 11 14:54:50 Sipi dbus[376]: [system] Successfully activated service 'org.freedesktop.PackageKit'
Nov 11 14:54:50 Sipi systemd[1]: Started PackageKit Daemon.
Nov 11 14:56:18 Sipi systemd[1]: Reloading.
Nov 11 14:56:19 Sipi systemd[1]: Reloading.
Nov 11 14:56:20 Sipi systemd[1]: Starting Raspotify...
Nov 11 14:56:20 Sipi systemd[1]: Started Raspotify.
Nov 11 14:56:20 Sipi librespot[1559]: INFO:librespot: librespot 8971d3a (2017-10-05). Built on 2017-10-05. Build ID: POyxPQVg
Nov 11 14:57:46 Sipi systemd[1]: Stopping Raspotify...
Nov 11 14:57:46 Sipi systemd[1]: Stopped Raspotify.
Nov 11 14:57:46 Sipi systemd[1]: Starting Raspotify...
Nov 11 14:57:46 Sipi systemd[1]: Started Raspotify.
Nov 11 14:57:46 Sipi librespot[1588]: INFO:librespot: librespot 8971d3a (2017-10-05). Built on 2017-10-05. Build ID: POyxPQVg
Nov 11 15:00:01 Sipi systemd[1]: Stopping Raspotify...
Nov 11 15:00:01 Sipi systemd[1]: Stopped Raspotify.
Nov 11 15:00:01 Sipi systemd[1]: Starting Raspotify...
Nov 11 15:00:01 Sipi systemd[1]: Started Raspotify.
Nov 11 15:00:01 Sipi librespot[1625]: INFO:librespot: librespot 8971d3a (2017-10-05). Built on 2017-10-05. Build ID: POyxPQVg
Nov 11 15:05:46 Sipi systemd[1]: Stopping Raspotify...
Nov 11 15:05:46 Sipi systemd[1]: Stopped Raspotify.
Nov 11 15:05:46 Sipi systemd[1]: Starting Raspotify...
Nov 11 15:05:46 Sipi systemd[1]: Started Raspotify.
Nov 11 15:05:46 Sipi librespot[1675]: INFO:librespot: librespot 8971d3a (2017-10-05). Built on 2017-10-05. Build ID: POyxPQVg

Hi,
Raspotify can only be used if you setup it with your credentials. it's not an Airplay player, it's a spotify connect client which means:

You can remote control songs played by raspotify through your spotify apps
Raspotify uses your spotify premium account to directly stream content from spotify server

Your raspotify setup will only be accessible to  an application that is connected to your premium account. The raspotify server won't be discoverable by any other device connected to your wifi network.
Hope it helps.

Hi,
Thanks for the reply. Thought so, but then maybe the readme should be changed, because it says that the service is discoverable on the local wifi, which made me think that its discoverable in spotify too.
Still I would like to be able to allow multiple people using the Pi. Would it be possible to run multiple daemons on the pi and thus provide multiple login data?
Simon

It's discoverable in Spotify iff you have Spotify Premium. Do you? I'm happy to update the docs @SimonSchaeferFinReach.

I do have Spotify Premium, but its only discoverable once I input my login data in the config file. Which kinda contradicts the "it works right out of the box" statement in the docs, it should mention that you have to alter the config if you want it to work.
Also do you think it would be possible somehow to setup raspotify for multiple people? For example by running multiple raspotify services?

Same a SimonSchaeferFinReach, I thought raspotify was working out of the box for Premium users.
For exemple, i wanna install a raspi on my sound speaker.
Anyone in my wifi will be able to play any music, as soon as he is premium.
Also, for family accounts, it's quite useless, as only one account can be registered on raspotify.
Anyway, still a great and working app for single users :)

@Etuldan, it does work out of the box for Premium users. I confirm it working with the following,

Flash Raspbian Stretch Lite image on fresh Pi 3
Plug the Pi into router
Install using the one liner in the README
Log onto wifi network using Macbook
Start Spotify with Premium acct on Mac
See the device there "raspotify (raspberrypi)"
Play to it!

Closing. If you have more problems lemme know!

@dtcooper
In my case :

Stretch lite on Pi (B)
Plugin into router (ethernet)
One liner install
Wifi network using Win10 and/or Android
Start Spotify premium on Win10/Android
No raspotify displayed.

As soon as I set account credentials in the raspotify configuration, the 2 wifi devices see the rPI.
UPnP enabled on router.
May be related to some Apple autodiscovering protocol ?
I'm not reopening, as it seems related to someting external to raspotify ;)

This may be obvious, but if it doesn't work out of the box, you may want to double-check your firewall settings on the PC and raspberry, because that may block discovery.


Minor code change to address a warning in g++ 4.6.

A warning pops up in the newest version of Ubuntu since they upgraded to 4.6.
src/subprocess.cc: In member function ‘bool Subprocess::Start(SubprocessSet*, const string&)’:
src/subprocess.cc:72:62: warning: missing sentinel in function call [-Wformat]
This just adds a cast to NULL so gcc can identify it as a null pointer correctly.

Thanks!

BTW, kas looks cool!  I actually initially started writing Ninja in Haskell but I both got frustrated and had vague worries about performance -- like, I didn't want to get to the end of the project and discover that the VM startup time (or whatever) were dominating my perf costs.  I bet D is a lot more predictable in terms of performance, though.  Sorry that the Ninja test suite is written in C++ instead of being .ninja file regression tests, that would make your job a lot easier!

Haskell doesn't have a VM to my knowledge (in case you're interested). It compiles straight to machine code. But I was considering Haskell and that lack of mutable state made things a lot harder for the build system (especially since this was my first attempt at one, which is why it copies the design so heavily from ninja).
D isn't very predictable in terms of performance. This was my first attempt to build something with the language. It resulted in me turning of the GC (I checked performance and the GC took up at least 90% of the no-op build cost).
Unfortunately performance tests for kas on a full build are pretty awful. So far, I've gotten the reason as, "it has to compute a hash for every file." Computing the hash stalls the command runner, and you end up with 7 defunct processes waiting very patiently to be reaped. I tried to fix it with some multi-threading, but D had some serious problems with fork/exec'ing and multithreading (I'm unsure at this point if it's D's implementation or if it's some deep-seated bug with fork).
Good job on ninja though. So far from my personal performance tests, ninja is the fastest build system. Of the build systems I tested, make was close on a full build, and that's it.
Have you been interested in expanding ninja? I have some ideas that I think would make ninja better that I would be willing to run past you if you're interested.
Also, just going to say this. Next time you choose a name for a project, just try doing a debian package search for the name :(


Add Mohamed Falah to Contributors list

i think i didn't know how to change my email address and save the changes. :)

@mohamedFalah, I'm quite elated about your PR. I wanna evolve this project to addresses various problems faced by first-time contributors. I'd love to learn about your journey in open source community, the problems, pain points you had etc.
Could you explain how you felt when you went through the tutorial, made a PR and learned that I merged it?

config user.email is not mentioned so there was wrong in the email address
the second is to make adjustment to this point a window appear in terminal
ask for me to write a message to complete the step but there is no way to
end so i had to exit terminal and back to it again. also the terminal says
that my branch is not completely merged.
2017-07-25 6:34 GMT+03:00 Roshan Jossey<EMAIL_ADDRESS>
Merged #349 https://github.com/Roshanjossey/first-contributions/pull/349
.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/Roshanjossey/first-contributions/pull/349#event-1177261756,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AcjGsF9HYyh3hR4_owzUWbl6QPlFxRvJks5sRWI4gaJpZM4OiBcB
.


GUI Enhancement - reorder Interfaces Alphabetically and other stuff

I notice that the system assigns the interface with LAN, WAN, OPT1 OPT2 etc.
So I wanted to rename the interfaces so I know what is what, but frustratingly they stay in the same position e.g.
WANBackup
LAN
WANMain
WANVoip
I'd prefer them as
LAN
WANBackup
WANMain
WANVoip
(or at least ordered alphabetically so I can rename them and get them in the order I want)
I can see that the pages are then hardlinked e.g.
http://<IP_ADDRESS>/opt1.php
These should be variables or something else.
I also note that if you click 'Interfaces' you get this URL :
http://<IP_ADDRESS>/interfaces_assign.php#Interfaces
That might be better to link to :
http://<IP_ADDRESS>/interfaces_assign.php
Or alternatively when you click each of the main menu Links - e.g. System, Interfaces, etc perhaps it would be better going to a default page for each section - either a description page or the first tab ? Sometimes you feel you click expecting something to happen, and nothing does, beyond a menu expanding !
Sorry - sounds picky, but making the UI intuitive makes so much difference to the user experience IMHO :-) The system may work perfectly, but if you feel you are floundering around for things, it detracts from the quality underneath !
One last bit - It is easy to miss the fact that you might need updates after install. Perhaps once you have done with configuring et al you should be dumped straight in to the updates page with a 'checking for updates' as the system auto checks for the user ?

We'll try a ordering by key for now, but this might clash with a description set. I don't really like using descriptions as descriptive names, but that's for another time.
For firmware updates: we don't want to enable auto-polling by default, so there has to be a manual effort involved. Some deployments also live in a Internet-less environment, where said prodding would cause more annoyance then do good. :)


Normalizing all dates

Lucid currently normalize only default (created_at and updated_at) fields to 'YYYY-MM-DD HH:mm:ss'
But if we have some custom timestamp field like
table.timestamp('published_at')

and fill 'published_at' with something like 'new Date().toISOString()', Lucid doesn't normalize it to 'YYYY-MM-DD HH:mm:ss'.
Though If we fill 'created_at' with 'new Date().toISOString()' Lucid does normalize it.
I think formatting all timestamp fields to this default 'YYYY-MM-DD HH:mm:ss' would be more expected behavior... And docs tell us the same :)

Lucid formats all dates as YYYY-MM-DD HH:mm:ss by default, which is a valid format for all database engines.

Hey @PazzaVlad! 👋
Have you defined the date into the model?
http://adonisjs.com/docs/4.0/lucid#_dates

oh, I don't know how I overlook that in docs :(
Thanks)
This solves the problem
  static get dates () {
    return super.dates.concat(['published_at'])
  }

Cool!
Closing then 😄


Can you tag 2.17 for last update for predictive fields?

Thanks!

I tagged it as 2.3

Oops - I missed that.  Thank you!

I see why you have not found it. Updated to 2.31


Azul (ZUL) token add

Please note: This repository is being rebuilt to accept the new volume of token additions and modifications. PR merges will be delayed.

I agree to not ping anybody on Discord/Twitter/email about this pull request. Instead I will inquire by posting a new comment in the pull request if needed.

PRs are reviewed in bulk and and can take up to two weeks to be merged.
This repository is managed using an auto merge action. Please ensure your PR has no deleted lines, and it will be merged.
Please provide the following information for your token.
Please include change to the src/tokens/solana.tokenlist.json file in the PR.
DON'T modify any other token on the list.
At minimum each entry should have

Token Address: FcJqJBBhfSHtX2tboNjLCpgQCXzJtqD4jkyEWmauFtLs
Token Name: Azul
Token Symbol: ZUL
Logo: (logo should be uploaded under assets/mainnet//*.<png/svg>)
Link to the official homepage of token: "https://eremod.com
Coingecko ID if available (https://www.coingecko.com/api/documentations/v3#/coins/get_coins__id_):

Auto merge requirements
Your pull request will be automatically merged if the following conditions are met:

Your pull request only adds new tokens to the list. Any modification to existing
tokens will require manual review to prevent unwanted modifications.

Your pull request does not touch unrelated code. In particular, reformatting changes to unrelated
code will cause the auto merge to reject your PR.

Any asset files added correspond to the token address you are adding. Asset files
must be PNG, JPG or SVG files.

Your change is valid JSON and conforms to the schema. If your change failed validation,
read the error message carefully and update your PR accordingly.

No other tokens shares the same name, symbol or address.

For example, this change would be rejected due to unrelated changes:

The bot runs every 60 minutes and bulk-merges all open pull requests to prevent conflicts.
This means that you need to wait up to 60 minutes for your pull request to be merged or reprocessed.

need to re git

need to re git


admin API doesn't compile once unzipped

The CMakeList file points to the wrong directory, or the source is in in a extra directory then what it should be.
api: admin
version: reports_v1
rev: 30

The admin suite of APIs use some unusual features of the API Discovery format to group themselves into the same package. My guess is that the template for CMakeLists.txt does not do the right thing w.r.t. that.
The real place to fix this is not in this project, but in the library generator. The actual file which needs changing is probably this one:  https://code.google.com/p/google-apis-client-generator/source/browse/src/googleapis/codegen/templates/cpp/default/templates/package/CMakeLists.txt.tmpl
My back of the envelope calculation is that this will take a couple hours to do, some email negotiation, about four hours for me to integrate the change, test and push back to the repo. My guess is that the user base for this API with CMake is small enough not to warrant it. In any case the fix is not in this project it is in the other one.

That's fine. I will admit, I was just filing issues. Not necessarily something that I'm using/going to use "soon".


Can't publish templates that contain (or leverage) CloudFormation Macros

Description:
SAM throws an error when attempting to publish a template containing an AWS::CloudFormation::Macro resource.  It also throws an error when attempting to publish a template that leverages an existing Macro via a Transform section.
When trying to publish a template containing a Macro resource:
Steps to reproduce the issue:

Create a template that contains an AWS::CloudFormation::Macro resource
Package the template and run sam publish

Observed result:
A response containing the phrase: Error: The template contains unsupported resource types. [AWS::CloudFormation::Macro]
Expected result:
Successful publishing of the template
When trying to publish a template leveraging an existing Macro:
Steps to reproduce the issue:

Create a template that leverages an existing Macro via a Transform section similar to: Transform: [MyMacro, 'AWS::Serverless-2016-10-31']
Package the template and run sam publish

Observed result:
A response containing the phrase: Error: Resource with name [Transform] is invalid. Provided Transform ['MyMacro', 'AWS::Serverless-2016-10-31'] is unsupported, use one of the following ['AWS::Serverless-2016-10-31']
Expected result:
Successful publishing of the template
For what it's worth, both of these scenarios work just fine when packaging and deploying them -- they  just can't be published to the Serverless Application Repository.

Closing, as this is an issue with the Serverless Application Repository and what resources they allow or don't allow and not with SAM. I'll bring this up with that team, this is a known limitation.

Note, you can find the list of resource types supported by SAR here:
https://docs.aws.amazon.com/serverlessrepo/latest/devguide/using-aws-sam.html#supported-resources-for-serverlessrepo


Not able to redirect to Angular URL using #

Issue Summary
Using redirects.json I try to redirect to https://someurl.com/#/login. Ghost encodes the URL to https://someurl.com/%23/login so it is not recognized by Angular anymore.
To Reproduce

Upload this redirects.json:

[
  {
    "from": "/login/" ,
    "to":  "https://someurl.com/#/login",
    "permanent": true
  }
]

Test the redirected URL, it forwards to encoded URL https://someurl.com/%23/login

I understand it can be useful or even neccessarry to encode the URL, but # is a reserved character so it is not neccessarry to encode it - maybe you can let it up to the user to enter encoded URL directly?
Technical details:

Ghost Version: Using docker image 2.6.2-alpine
Node Version: 8.14.0
Browser/OS: Current Firefox on MacOS
Database: sqlite3

Thanks very much for your great work!

Hey @simonbernard!
Thanks for your report.
/#/login is a hash. Ghost currently uses url.format which assumes that to is a path.
url.format auto encodes path delimiters like # or ?.
To support your use case, i think we should detect ^/#/... and forward it as hash option to url.format.
PR is welcome 👍

I was going to tackle this thinking it'd be simple, but now I've gone and gotten confused!
I think the issue with special casing # (or ?, it's a similar issue), is how one should coalesce hash or search params in the incoming URL with hash or search params in the to property of redirects.json.
Current Scenario
Eg. as it works right now, with no hash or search params in the to
{ "from": "/foo", "to": "/bar" }

redirects happen as:
1: /foo -> /bar
2: /foo?search=test -> /bar?search=test
3: /foo#hash -> /bar#hash
4: /foo?search=test#hash -> /bar?search=test#hash

So the incoming hash/search is propagated through as well.
Given Scenario
In the given scenario of including hash or search params in the to
{ "from": "/foo", "to": "/bar?search=other#login" }

I'm not sure what the "right" way would be for use cases 2, 3, and 4, and whether we need to keep backwards compatibility with the current scenario.
1: /foo -> /bar?search=test#hash
2: /foo?search=test -> ???
3: /foo#hash -> ???
4: /foo?search=test#hash -> ???

tl;dr: we potentially have two sources of hash/search data, and it's not obvious how to handle that.

That's a good point, so really it's the browser that decides how hashes are coalesced.
On Chrome at least, the browser will propagate an existing hash through a redirect unless a hash is given by the server, in which case browser will apply that.
For example:
User navigates to /foo1#hash, gets a redirect to /bar1, and browser keeps the hash, so user sees /bar1#hash.
User navigates to /foo2#hash, gets a redirect to /bar2#login, and browser uses that, so user sees /bar2#login.
Really, I only brought it up as I was thinking of how search params would work, but that may be getting ahead of this use case. For now I'll keep things simple and implement kirgg's proposed solution, and if people come up with a use case for dropping search params in to also we can deal with that then.


Add MD restart support and fix config loading

Import changes from https://github.com/zincware/IPSuite/pull/260

[ ] requires new ZnTrack release

Is this the required zntrack release?
https://github.com/zincware/ZnTrack/releases/tag/v0.7.3


Deps: Bump strict encoding to 0.8.1

Use farcaster-core main branch

Codecov Report

Merging #598 (c30fdcf) into main (5252857) will increase coverage by 0.1%.
The diff coverage is n/a.

@@           Coverage Diff           @@
##            main    #598     +/-   ##
=======================================
+ Coverage    9.2%    9.3%   +0.1%
=======================================
  Files         32      32
  Lines      10711   10621     -90
=======================================
- Hits         988     987      -1
+ Misses      9723    9634     -89

Impacted Files
Coverage Δ

src/lib.rs
4.8% <0.0%> (-0.2%)
:arrow_down:

src/swapd/runtime.rs
0.0% <0.0%> (ø)

src/walletd/runtime.rs
0.0% <0.0%> (ø)

src/databased/runtime.rs
48.9% <0.0%> (+7.0%)
:arrow_up:

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 5252857...c30fdcf. Read the comment docs.


Add a custom function to generate tag id

This PR solves #88

Done. I also updated the snippet in tag-input.mdx

Hey @JaleelB  - can you push a new release so this can be used?

Hey @JaleelB - can you push a new release so this can be used?

Will do @juliusmarminge


Calibre import possible?

Is it possible? My wife tracked here read status in calibre for years and I'd love to import it here. Thanks.

Hi,
Thank you for your question. Currently there is no way to import your reading lists from any app at all. I have not used Calibre myself but if there is a way to get the data out then I don't see why this should not be something to work towards. I strongly believe interoperability and migration processes between apps need to exist and that no app should take your data hostage.
Will need to look more into this!


Bare .haml extension not recognised by HighVoltage.page_ids

The haml-rails gem (as opposed to haml) allows one to name its views foo.haml instead of the more cumbersome foo.html.haml.
However HighVoltage.page_ids does not list shortcutted pages, even if they are rendered when one visits /pages/foo.
In other words: high_voltage plays fine with haml-rails except for shortcutted names which aren't included in HighVoltage.page_ids.
Could you please address this?
Thanks!
Victor

Remove && html? from page.rb.
It disables check for matching filename with this pattern /\.(html)(\.[a-z]+)?$/


Vapor Saturation (QSat) table computation Fortran vs C f32 issues

QSat, saturation of vapor, is based on the calculation of Ice and Liquid tables estimated at an incremental temperature values. The table is filled using an exact formulation for both water species described in our code in pyMoist.saturation.qsat_liquid and pyMoist.saturation.qsat_ice.
Code has been heavily debugged to be correct but numeric doesn't validate, which bubbles to qsat itself being wrong and this code is at the base of a lot of moist computation. We side-stepped the validation issue by loading the table from netcdf.
Debugging further we figured out that the issues boils down to actual C (python) vs Fortran numerical differences. Here's two calculation that don't agree with all compilation flags deactivated
C:
#include <stdio.h>

double S16 = 0.516000335e-11 * 100.0;
double S15 = 0.276961083e-8 * 100.0;
double S14 = 0.623439266e-6 * 100.0;
double S13 = 0.754129933e-4 * 100.0;
double S12 = 0.517609116e-2 * 100.0;
double S11 = 0.191372282e0 * 100.0;
double S10 = 0.298152339e1 * 100.0;
double S26 = 0.314296723e-10 * 100.0;
double S25 = 0.132243858e-7 * 100.0;
double S24 = 0.236279781e-5 * 100.0;
double S23 = 0.230325039e-3 * 100.0;
double S22 = 0.129690326e-1 * 100.0;
double S21 = 0.401390832e0 * 100.0;
double S20 = 0.535098336e1 * 100.0;

const float TI = 178.16f;
const float TT = TI - 273.16f;

int main(int argc, void *argv)
{
    float EX = TT * (TT * (TT * (TT * (TT * (TT * S16 + S15) + S14) + S13) + S12) + S11) + S10;
    printf("EX: %f\n", EX);
    return 0;
}

prints:
EX: 0.003803

F90:
program qsat
    real*8 :: S16= 0.516000335E-11*100.0
    real*8 :: S15= 0.276961083E-8 *100.0
    real*8 :: S14= 0.623439266E-6 *100.0
    real*8 :: S13= 0.754129933E-4 *100.0
    real*8 :: S12= 0.517609116E-2 *100.0
    real*8 :: S11= 0.191372282E+0 *100.0
    real*8 :: S10= 0.298152339E+1 *100.0
    real*8 :: S26= 0.314296723E-10*100.0
    real*8 :: S25= 0.132243858E-7 *100.0
    real*8 :: S24= 0.236279781E-5 *100.0
    real*8 :: S23= 0.230325039E-3 *100.0
    real*8 :: S22= 0.129690326E-1 *100.0
    real*8 :: S21= 0.401390832E+0 *100.0
    real*8 :: S20= 0.535098336E+1 *100.0

    real*4, parameter :: TI = 178.16
    real*4 :: TT = TI - 273.16
    real*4 :: EX = 0

    EX = TT * (TT * (TT * (TT * (TT * (TT * S16 + S15) + S14) + S13) + S12) + S11) + S10

    print *, EX

end program qsat

prints
3.77704715E-03

Both of those examples are gcc and gfortran with no options.
We need to figure out how we can make those agree, if at all.
Parent: https://github.com/GEOS-ESM/SMT-Nebulae/issues/57

[ ] Match C and Fortran
[ ] Deploy "numerical fix" on the DSL stack, even it means a debug mode running slowly
[ ] OR Document findings

PS:
The actual errors

For an expected value of

Digging in the assembly, we discovered that the value of the constants are different, e.g.

Language
S16

C
5.16000335000000020638850831546182856834903418530302587897e-10

F90
5.160003535564783305744640529155731201171875e-10

Considering the operations comprised of mult and add, this brings the difference. If we hardcode the Fortran assembly-level value into C, we validated

Same result under icx and ifx, with clang frontend

It seems Fortran is putting a 32--bit representation into a 64-bit registry on literals. E.g. doing the following on C gives the same result
const double S16 = 0.516000335e-11f * 100.f;

Best match

Lang
Ex

C
0.003777

F90
3.77704715E-03

Py
0.0037770470880218454

With code as follows
#include <stdio.h>

const double S16 = 0.516000335e-11f * 100.f;
const double S15 = 0.276961083e-8f * 100.f;
const double S14 = 0.623439266e-6f * 100.f;
const double S13 = 0.754129933e-4f * 100.f;
const double S12 = 0.517609116e-2f * 100.f;
const double S11 = 0.191372282e0f * 100.f;
const double S10 = 0.298152339e1f * 100.f;

const float TI = 178.16f;
const float TT = TI - 273.16f;

int main(int argc, char **argv)
{
    float EX = TT * (TT * (TT * (TT * (TT * (TT * S16 + S15) + S14) + S13) + S12) + S11) + S10;
    printf("EX: %f\n", EX);
    return 0;
}

program hello
    real*8 :: S16= 0.516000335E-11*100.0
    real*8 :: S15= 0.276961083E-8 *100.0
    real*8 :: S14= 0.623439266E-6 *100.0
    real*8 :: S13= 0.754129933E-4 *100.0
    real*8 :: S12= 0.517609116E-2 *100.0
    real*8 :: S11= 0.191372282E+0 *100.0
    real*8 :: S10= 0.298152339E+1 *100.0

    real*4, parameter :: TI = 178.16
    real*4, parameter :: TT = TI - 273.16
    real*4 :: EX = 0

    EX = TT * (TT * (TT * (TT * (TT * (TT * S16 + S15) + S14) + S13) + S12) + S11) + S10

    print *, 'EX', EX

end program hello

import numpy as np

S16 = np.float64(np.float32(0.516000335e-11) * np.float32(100.0))
S15 = np.float64(np.float32(0.276961083e-8) * np.float32(100.0))
S14 = np.float64(np.float32(0.623439266e-6) * np.float32(100.0))
S13 = np.float64(np.float32(0.754129933e-4) * np.float32(100.0))
S12 = np.float64(np.float32(0.517609116e-2) * np.float32(100.0))
S11 = np.float64(np.float32(0.191372282e0) * np.float32(100.0))
S10 = np.float64(np.float32(0.298152339e1) * np.float32(100.0))
S26 = np.float64(np.float32(0.314296723e-10) * np.float32(100.0))
S25 = np.float64(np.float32(0.132243858e-7) * np.float32(100.0))
S24 = np.float64(np.float32(0.236279781e-5) * np.float32(100.0))
S23 = np.float64(np.float32(0.230325039e-3) * np.float32(100.0))
S22 = np.float64(np.float32(0.129690326e-1) * np.float32(100.0))
S21 = np.float64(np.float32(0.401390832e0) * np.float32(100.0))
S20 = np.float64(np.float32(0.535098336e1) * np.float32(100.0))

TI = np.float32(178.16)  # 273.16 - 95.0
TT = TI - np.float32(273.16)

EX = TT * (TT * (TT * (TT * (TT * (TT * S16 + S15) + S14) + S13) + S12) + S11) + S10

print(S16)
print(EX)

This was fixed in https://github.com/GEOS-ESM/GEOSgcm_GridComp/pull/1007
The issues was a mix of 32 representation pushed into a 64-bit float and the fact that in python an i32 * f32 will result in a f64 which then percolate in the calculation and shift the errors into 64-bit land compared to the Fortran.
The actual line for this work was:
-            t = i * DELTA_T + TMINTBL
+            t = Float(i * DELTA_T) + TMINTBL


How to raw query with mongoDB php library

Hi,
I recently started using this library.

Is there any method available to execute RAW query using this library?

I want to add where cause in $lookup query. Can someone help me?

Is there any method available to execute RAW query using this library?

It's not clear what you mean by "RAW" query. MongoDB generally provides two methods of querying for documents: find and aggregate. The CRUD tutorial for the library has examples of both.

I want to add where cause in $lookup query. Can someone help me?

$lookup is an aggregation pipeline operator, so you write that as part of the pipeline argument for MongoDB\Collection::aggregate(). By default, $lookup uses an equality on two fields, but Specify Multiple Join Conditions with $lookup demonstrates the syntax for more complex join criteria and involves specifying a separate pipeline just for the $lookup operation.
Where the MongoDB manual examples show a document (or JSON object for its shell examples) being used, you can use an associative array in PHP. There is an example of using aggregate() in the CRUD tutorial.

By RAW query mean simple JSON query that I want to execute for any operation but I get it now as you provide example of find and aggregate. I need use respective method is query is for update or delete etc.
Thanks :)


column name

I try to replace some codes in Pages/Instructors/Index.cshtml at the "
 ..
 ..
 ..  .." as follow:
@Html.DisplayNameFor(model => model.InstructorData.Instructors.ElementAt(0).LastName)
@Html.DisplayNameFor(model => model.InstructorData.Instructors.ElementAt(0).FirstMidName)
@Html.DisplayNameFor(model => model.InstructorData.Instructors.ElementAt(0).HireDate)
@Html.DisplayNameFor(model => model.InstructorData.Instructors.ElementAt(0).OfficeAssignment.Location)
Courses

and it works well even if the Instructor table is empty, but I wonder if there is any problem coding like that, please advise.

Document Details
⚠ Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.

ID: d0026f69-7e5d-0d3e-5586-16ecc0656ff0
Version Independent ID: 3cb264da-2ff1-1256-572f-aa4ebca6e255
Content: Razor Pages with EF Core in ASP.NET Core - Read Related Data - 6 of 8
Content Source: aspnetcore/data/ef-rp/read-related-data.md
Product: aspnet-core
Technology: aspnetcore-data
GitHub Login: @Rick-Anderson
Microsoft Alias: riande

Hello! Thanks for contacting us. This sounds like a general question about using ASP.NET Core. While we try to look at and respond to all issues, for questions like this we recommend posting to a community support group like Stack Overflow with the asp.net-core tag.

Stack Overflow
ASP.NET Core Slack
ASP.NET Gitter

Potential bugs in the ASP.NET Core framework and product feedback can be reported at dotnet/aspnetcore issues (include full repro steps and cross-link to a repro project in GH when appropriate). For Visual Studio, use the Report a Problem gesture or Suggest a Feature gesture within VS, which open internal issues for the VS team. For Visual Studio Code, you can open an issue at microsoft/vscode issues.

I concern about that because there are codes in Pages/Courses/Index.cshtml like these:

                @Html.DisplayNameFor(model => model.Courses.Courses[0].CourseID)

                @Html.DisplayNameFor(model => model.Courses.Courses[0].Title)

                @Html.DisplayNameFor(model => model.Courses[0].Credits)

                @Html.DisplayNameFor(model => model.Courses[0].Department)

I tried this code that could not work:
@Html.DisplayNameFor(model => model.InstructorData.Instructors.Instructors[0].LastName)
so I tried ElementAt() method suggested by Intellisense, and found it worked well.
If it's okay, then I would suggest you to code
@Html.DisplayNameFor(model => model.Courses.ElementAtOrDefault(0).CourseID)
Isn't it better to use DisplayNameFor than hard coding column names?

Hi Rick, I concern about that because there are codes like this in Pages/Courses/Index.cshtml:
@Html.DisplayNameFor(model => model.Courses[0].CourseID)
So I tried the same for  Pages/Instructors/Index.cshtml, which could not work:
@Html.DisplayNameFor(model => model.InstructorData.Instructors[0].LastName)
Curious about that, then I tried the ElementAt() method suggested by IntelliSense, and apparently worked well:
@Html.DisplayNameFor(model => model.InstructorData.Instructors.ElementAt(0).LastName)
It it's okay, I would suggest to use ElementAtOrDefault(0) in your tutorial, isn't it better to use DisplayForName than hardcoding string for column name?

Hi Rick, I sent an issue specific about this tutorial ie. Data Access - TutoriaLs - EF Core with Razor Pages - Read related data (tuorial 6/8), please review again. Thanks


warning for not being able to determine streams size

Hi!
Upon starting training from a saved state, I see this warning in the logs. Should I be worried about it and can it be fixed?
2015-02-24 07:24:28,242: experiments.nmt.encdec: DEBUG: Build log-likelihood computation graph
2015-02-24 07:24:28,313: groundhog.layers.cost_layers: DEBUG: Get grads
2015-02-24 07:24:29,292: groundhog.layers.cost_layers: DEBUG: Got grads
2015-02-24 07:24:29,292: experiments.nmt.encdec: DEBUG: Build sampling computation graph
/Users/dmitry/Theano/theano/sandbox/rng_mrg.py:1195: UserWarning: MRG_RandomStreams Can't determine #streams from size (Elemwise{Cast{int32}}.0), guessing 60*256
  nstreams = self.n_streams(size)
2015-02-24 07:24:29,666: experiments.nmt.encdec: DEBUG: Create auxiliary variables
2015-02-24 07:24:29,666: experiments.nmt.encdec: DEBUG: Compile sampler
/Users/dmitry/Theano/theano/scan_module/scan_perform_ext.py:133: RuntimeWarning: numpy.ndarray size changed, may indicate binary incompatibility

You can ignore them. It is complicated detail.
The UserWarning is now removed if you update Theano to the latest
development version.
The RuntimeWarning is related by numpy, but you can ignore it.
On Tue, Feb 24, 2015 at 12:28 AM, Dmitry Kan<EMAIL_ADDRESS>wrote:

Hi!
Upon starting training from a saved state, I see this warning in the logs.
Should I be worried about it and can it be fixed?
2015-02-24 07:24:28,242: experiments.nmt.encdec: DEBUG: Build log-likelihood computation graph
2015-02-24 07:24:28,313: groundhog.layers.cost_layers: DEBUG: Get grads
2015-02-24 07:24:29,292: groundhog.layers.cost_layers: DEBUG: Got grads
2015-02-24 07:24:29,292: experiments.nmt.encdec: DEBUG: Build sampling computation graph
/Users/dmitry/Theano/theano/sandbox/rng_mrg.py:1195: UserWarning: MRG_RandomStreams Can't determine #streams from size (Elemwise{Cast{int32}}.0), guessing 60*256
nstreams = self.n_streams(size)
2015-02-24 07:24:29,666: experiments.nmt.encdec: DEBUG: Create auxiliary variables
2015-02-24 07:24:29,666: experiments.nmt.encdec: DEBUG: Compile sampler
/Users/dmitry/Theano/theano/scan_module/scan_perform_ext.py:133: RuntimeWarning: numpy.ndarray size changed, may indicate binary incompatibility
—
Reply to this email directly or view it on GitHub
https://github.com/lisa-groundhog/GroundHog/issues/25.

thanks @nouiz, that is a relief :)


non-android-specific extensions in Collections.kt and Arrays.kt

Just curious, why are there non-android-specific extensions in anko (I mean vs. putting them in kotlin stdlib)? For example List.forEachByIndex().

On the desktop JDK, an iterator initiating is very cheap, and for the numerous reasons using indices is considered a bad practice. But Android is another story: its virtual machine is not smart enough to optimize the code with iterators, so it's quite common to iterate with the index variable.


Vulkan HPP Framework Discussion

Hey @asuessenbach, It would be great to discuss the Vulkan HPP Framework changes before the next call :)
Overview

Demonstrate more use cases with the Vulkan HPP API. This may require the recreation of another framework using Vulkan HPP instead of the C style API. A selection of API and performance samples would be ported to show its benefits ~ paraphrased from previous conversations

My biggest concern with duplicating the framework is that when larger parts are refactored in one of the frameworks then these will need to be reflected in the other; the same applies for samples. Replicating existing samples would mean that contributors will need to take more factors into account - there is already an ever increasing check list on PRs.
Is this a good direction?
I'm worried that direct ports of samples will generate more work in the future without providing much value for the developers looking at these samples. For instance, the inner workings of hello triangle have not been changed. We are simply seeing the same code written in a different style. This is similar to to-do list examples across programming languages in the sense that the added value for a developer is learning dramatically different syntax. In this case, the C style API covers all the Vulkan syntax that a developers needs and the HPP is "syntactic sugar".
It may be a better use of time to find how the HPP API can be used in comparison to the C style API when tackling specific problems in Vulkan. Are there any scenarios where we can show one API greatly simplifying concepts for developers or reducing the size of code footprints for specific features?
One example of this could be showing the benefits of: not using a shared context, current framework; using a shared context, shared pointer to a struct of common handles and using the HPP style API to not require tracking lower level handles - device, instance etc... Or possibly rethinking resource management with tracking structs of handles vs tracking hpp vulkan objects... Can hello triangle be written in a more simple way using HPP...
Summary
Overall, I think it is great to add more HPP. It just may be more beneficial to demonstrate its pros/cons through new samples rather than maintain two copies of the current codebase

Folks can correct me if I get this wrong, but my take-away from last week's discussion is that we wanted to minimize the need for framework changes - just enough to support samples written with C++ bindings (as well as continuing to support C-binding samples) and then we'd re-implement a handful of samples using C++ (API samples and some perf samples) so folks can use their language-binding of choice and/or learn about pros/cons of each.  To manage the maintenance issues of having two versions of some of the samples, the team was hoping we could use CI to flag when one changes - to remind devs to make their changes in both.  Not sure if that's possible tho...hoping Tom can advise.

@marty-johnson59 That's exactly my take-away as well.
It was considered to be better to have two separate branches, one for C-bindings and one for C++-bindings, with (more or less) corresponding content. Whenever something changes in the one branch, one should verify if that change should be ported to the other branch as well.
As both, the framework and the (to-be-transcoded) samples were considered to be pretty stable, we did not expect substantial maintenance work.
@TomAtkinsonArm Maybe you have a wrong impression of what vulkan.hpp is. It does not manage resources or provide higher level functionality. It's still as verbose and detailed as the C-bindings. But it provides better type safety, more compile-time error detections, simplified function and structure handling, better readability, maybe more C++-feeling.
That is, transcoding existing samples from C-bindings to C++-bindings would exactly show the benefits.

It was considered to be better to have two separate branches, one for C-bindings and one for C++-bindings, with (more or less) corresponding content. Whenever something changes in the one branch, one should verify if that change should be ported to the other branch as well.

As I missed the call, the definition here for me is still a little hazy. It sounds like we are comparing the benefits of C++ and C - if, as stated, the C++ API provides no benefit other than having C++ properties (using namespaces and typed enums, etc) then what added value will porting a large amount of code bring other than show it written in a slightly different style?
It feels as though the benefits you listed would be better expressed through an in-depth tutorial showing why these are desirable and why the C++ API is better in some respects. Even better, making the hello triangle sample more robust by replacing some of the hard coded logic with more robust checks which the framework makes to demonstrate more of the C++ properties. This way we avoid the nightmare of tracking differences and maintaining a diverged codebase.

To manage the maintenance issues of having two versions of some of the samples, the team was hoping we could use CI to flag when one changes - to remind devs to make their changes in both. Not sure if that's possible tho...hoping Tom can advise.

We could create an action to compare parts of both frameworks. It would be easier to add an item to the checklist stating that changes should be replicated in both frameworks as its heavily dependant on how the framework is ported - which elements are ported.

we did not expect substantial maintenance work

This is dependant on how the port is done. If it is only the required components then its possible that we wont need to revisit it again for future contributions to the base project. If it is the majority of the project being ported then this will mean each contribution must be split into two PRs to target both branches with identical changes

I just want to make sure we are taking into account that there will be future development on the project, things will inevitably change and this may lead to maintaining two branches with, essentially, identical code? The main questions that could clear this up for me are:

Will porting several samples show any more difference than the port in hello triangle?
Could we provide the same value without maintaining two of the same codebase?
Could we port the framework in a way where only the original project would need continued maintenance?
Will contributions to the second branch go through the same review process?

just enough to support samples written with C++ bindings

I don't think this is trivial work though, with unclear ROI to me.

It was considered to be better to have two separate branches, one for C-bindings and one for C++-bindings

Maintaining two different branches for any future framework/samples work is going to be painful. If anything I worry it will turn into a competition both branches developing like forks with different set of samples and framework features. Because of favourite languages and what not.

transcoding existing samples from C-bindings to C++-bindings would exactly show the benefits.

This makes sense as a goal for the vulkan hpp project but does it apply to vulkan samples project?  Most of the performance samples are less about how to use an API but more about which ones to use amongs the different options available. Only the API samples would benefit from this so If anything I would recommend we have a sample of how to use vulkan.hpp as an API sample and leave it there. That makes more sense. (I am told there is already such thing in review). Regarding other benefits of vulkan.hpp, like type safety etc, we have already gone through that pain in the framework. So it probably doesn't bring any benefit to framework developers/maintainers.

what added value will porting a large amount of code bring other than show it written in a slightly different style?

That's what the samples are for: show it written in code. Such that any interested guy can grab it as a starting point. Up to now, there's close to no such starting point for the C++bindings.

It feels as though the benefits you listed would be better expressed through an in-depth tutorial showing why these are desirable and why the C++ API is better in some respects.

Having such a tutorial is a good idea, indeed. And I don't see samples and tutorials as exclusive.

avoid the nightmare of tracking differences and maintaining a diverged codebase.

I think, that's the most important point. In the meeting on 7/12, it was considered to be an acceptable burdon, but if we now come to the conclusion that it's too labor intensive, we should look for an alternative approach.

If it is only the required components...

I don't have an in-depth knowledge of the framework, but it seems the parts there are very closely meshed. That is, probably a substantial part of the framework would need to be transcoded.

Will porting several samples show any more difference than the port in hello triangle?

I think, at least a couple of the API samples would be good, to make sure different aspects are shown. And some of the perf samples would be great, to show any performance differences (if there are any).
When porting just the hello_triangle sample, the framework "port" could probably be pretty small.

Could we provide the same value without maintaining two of the same codebase?

Without having thought about the details, it should probably be possible to refactor the framework to live with either the C-bindings or the C++-bindings. But that for sure would make it more complex, and all the current samples might need some adustments.

Could we port the framework in a way where only the original project would need continued maintenance?

I don't understand this question. What do you imagine?

I would recommend we have a sample of how to use vulkan.hpp as an API sample and leave it there

Yes, this is the transcoding approach on hello_triangle. But it can't be completely separated from the framework, as the vkb::Instance is instantiated there, and one platform makes more than trivial use of it.

After the short discussion on this issue in the last call, I think transcoding (most of) the framework is not considered an option any more. That is, the first now would be just the transcoded version of the hello_triangle sample (#294).
To conclude with that PR, I just have two questions:

Is the naming (hpp_hello_triangle) and the location (samples/api) ok?
Is the additional flavor of Window::create_surface, and DirectWindow::find_compatible_plane, and the "intrusion" of vulkan.hpp into the framework acceptable?

And a third question:
3. How can we ensure that changes in hello_triangle are ported to hpp_hello_triangle, and vice versa.

Are you still interested in creating an in-depth tutorial on Vulkan HPP? Would this be best in a separate PR?

Is the naming (hpp_hello_triangle) and the location (samples/api) ok?

As it is showing API usage, this seems like a suitable place for the sample

Is the additional flavor of Window::create_surface, and DirectWindow::find_compatible_plane, and the "intrusion" of vulkan.hpp into the framework acceptable?

These additions allow the sample to be run across supported platforms. The framework isn't in a state where these additions can be added in a better way. So for this PR, these additions are the best option for now

How can we ensure that changes in hello_triangle are ported to hpp_hello_triangle, and vice versa.

We could add an item to the PR checklist, something like:

[ ] Changes to Hello Triangle are reflected in HPP Hello Triangle

Are you still interested in creating an in-depth tutorial on Vulkan HPP? Would this be best in a separate PR?

Yes, to both questions. I can't tell, when I can start on that tutorial, though.

Is #294 ready for a re-review?

yep


Add fix for windows-style paths stack-path returns

Attempt to fix cygwin installation problems. Untested.
Closes #98

Thanks for the PR. I'm having trouble getting my Cygwin to work right in the VM. @ideruga could you help test this please?

I'll try it this evening (E.T.)

I ran bash <(curl -sL https://raw.githubusercontent.com/SimpleX91/haskell-vim-now/cygwin/install.sh) 2>haskell-vim-now-2015-12-01.log
I've attached the result.
I think that the problem is that cygwin doesn't recognize the path elements that start with C:. It should start with /cygdrive/c. Also, there is the question of slash v.s. backslash.
haskell-vim-now-2015-12-01.txt

Ok, so I was right... I downloaded the file  https://raw.githubusercontent.com/SimpleX91/haskell-vim-now/cygwin/install.sh, changed the clone command to this:

https://raw.githubusercontent.com/SimpleX91/haskell-vim-now/cygwin/install.sh

and ran it this way:

./install.sh > haskell-vim-now-2015-12-01_b.txt 2>&1

I think that ^M spoils all this, because when I try to do

less /cygdrive/c/Users/Utilisateur/AppData/Roaming/stack/global-project/stack.yaml

it works fine and shows the contents of the file.
haskell-vim-now-2015-12-01_b.txt

@ideruga try sed manually (take command from setup.sh). And check it's output. Try to make it work.
Then you have problems with GCC C compiler. Try running "stack install network" and see what it prints.

@SimpleX91 Here's my test:

#!/usr/bin/bash
. ./func.sh
DEPS_REGEX='s/extra-deps: []/extra-deps: [cabal-helper-<IP_ADDRESS>, pure-cdb-0.1.1]/'
STACK_GLOBAL_CONFIG=$(fix_path $(stack --verbosity 0 path --config-location))
echo $STACK_GLOBAL_CONFIG
sed -i.bak "${DEPS_REGEX}" ${STACK_GLOBAL_CONFIG}

Here's the result:

/cygdrive/c/Users/Utilisateur/AppData/Roaming/stack/global-project/stack.yaml
: No such file or directorygdrive/c/Users/Utilisateur/AppData/Roaming/stack/global-project/stack.yaml

Now, I just copy the result of the echo into the test.sh file like this:

#!/usr/bin/bash

. ./func.sh

DEPS_REGEX='s/extra-deps: []/extra-deps: [cabal-helper-<IP_ADDRESS>, pure-cdb-0.1.1]/'
STACK_GLOBAL_CONFIG=/cygdrive/c/Users/Utilisateur/AppData/Roaming/stack/global-project/stack.yaml
echo $STACK_GLOBAL_CONFIG
sed -i.bak "${DEPS_REGEX}" ${STACK_GLOBAL_CONFIG}

And it works.
I will investigate the C compiler problem this evening (E.T.)

@ideruga any progress with the compiler problem?

Not yet, will take another shot at it tonight.

I made a PR to correct the path issue. I will investigate the compiler problem next.
P.S.: Forking a project from a particular branch (not master) It is way too hard in github...

I think it's done. Thanks to @ideruga for testing and corrections!

Nice work guys. I'll merge it.


Improve, refactor and cleanup packaging script

Did you mean to change all the paths in the configuration file to hard coded paths?

Yes I did, however I completely missed the fact that the script defined $APPLESEED. This is nice. I'll partially revert changes to the configuration file sample and make some other changes to clarify the situation.
Thanks!

Fixed and rebased.

Thanks for the review @jdent02. I haven't pushed the macOS changes yet.


unmentioned problem with work around concerning unhandled exception

The motivation fails to mention that the shown workaround kind of breaks the "break on unhandled exceptions" feature supported by some debuggers. Since from the debuggers point of view not only ConflictError but any Error or derived is handled

… and anything that doesn't match the catch guard gets rethrown, so it shouldn't break anything.

I under stand that. My point was that as thing is today you are forced to use the mentioned workaround. Unfortunately that mean if you check "break on unhandled exception" in chrome debugger all exception will be considred handled if they go through the workaround code. Which is typical not what you want. So I sugest that senario is mentioned as an benefit too.

That doesn’t sound correct - they’d all be handled, but whatever subset isn’t “caught” would be rethrown and thus become unhandled again.

I would be surprised if a debugging tool considered an error to be "caught" if the error didn't match any of the catch patterns in the try-catch. Conceptually, the error just passes right through, without being caught by any of the catch blocks.

@theScottyJam yes, but the OP is talking about the pre-catch-guard workaround - which requires an explicit rethrow, which should thus be considered "uncaught".

@ljhard yes it become unhandeled again but it don't break at original location throw location but at the rethrow location sorry for missing that detail in the initial description


theme in a publication does not apply everywhere

H.+G.+Wells+-+The+Time+Machine.epub.zip

Ah right so unlike night mode, sepia mode doesn’t override background-color.
So the following is not used in sepia mode:
https://github.com/readium/readium-css/blob/14f10444f43c60b4e74aca1bc2f7b4f597305c5e/css/src/modules/ReadiumCSS-night_mode.css#L26-L30
The assumption was that it’s a light mode close to the default enough that asides with background-color could be preserved – e.g. O’Reilly books, but relevant in non-fiction more generally, cf. Kindle implementing a conversion process just for this in their pipeline.
I’m not sure what the best option is though, as by fixing this issue, we will automatically lose this nuance in non-fiction.
Note: I’m also wondering how this renders in night mode in both apps, since background-color is used to hide the border so if you transparentize the background, borders will be displayed.

ok, thanks, to follow

Ah thanks so I’ll have to fix that in night mode also.
Otherwise, I guess it would help to gather opinions on the following:

The assumption was that it’s a light mode close to the default enough that asides with background-color could be preserved – e.g. O’Reilly books, but relevant in non-fiction more generally, cf. Kindle implementing a conversion process just for this in their pipeline.

I’m not sure what the best option is though, as by fixing this issue, we will automatically lose this nuance in non-fiction.

So @llemeurfr and @danielweck for instance, since they were in the original issue. :-)

Hi @JayPanoz, for sure, the iBooks rendering of this specific book (from Feedbooks) is far better. And we know that many publishers are using iBooks as a reference for finalizing their EPUBs.
So I would be inclined to follow their choice and override background colors when themes are active, which would be better for accessibility purpose IMO.

Thanks!
It is my understanding too that sepia mode may be used quite a lot in dys so a11y is one of my concerns.

@panaC I pushed fixes to the reading-mode-improvements branch so ReadiumCSS-after has been updated in dist (for all versions).
See diff.
Looks OK here but can you please confirm it’s also the case on your end before I merge on develop/master?
@danielweck I also updated highlights (re #65) i.e. putting them at the very end of the after stylesheet, adding selectors for sepia/night-mode + !important. Comments/review greatly appreciated, although not urgent by any means.

I will create a special / temporary build of r2-navigator-js in order to test the ReadiumCSS branch from r2-testapp-js. Once the sepia mode is confirmed to override the background (which it now should, just based on reading Jiminy's CSS code changes), then ReadiumCSS can be updated/published officially, and r2-navigator-js can reference the correct / merged ReadiumCSS Git revision hash.

@panaC @danielweck Yikes, sorry for the delay, just emerging now and I can see the last comment was made on August, 5.
Is the fix OK? It’s been sitting in develop for months now and should probably be merged into production.

Good point ... I need to revisit this! (will report back)

Thanks.
And just to be sure as I edited my previous comment, the fix is in the reading-mode-improvements branch https://github.com/readium/readium-css/tree/reading-mode-improvements (and not staging)

Alll good, thanks Jiminy! :)

Thanks for the confirmation, I will merge into develop first, in order to resolve #58 as well, then merge into master as alpha-3.

So, I can confirm that fixing (see PR https://github.com/readium/readium-css/pull/80 ) the performance issue related to the "blanket" application of background-color (sepia or night modes) on all elements in the document's body ... results in a "small" regression with borders / labelled outlines. I say "small", because in my tests the performance degradation was orders of magnitude more detrimental than the visually-annoying border outline (striked-through label).
Screenshots:

Of course, ideally we would find a solution to the performance issue that would not break publication documents ... but unfortunately I ran out of ideas (and time) so I settled for the workaround of applying a transparent background colour everywhere.
Also, note that my fix works in Chromium 80 (Electron 8) ... but your mileage may vary in other browser engines. I suggest using Children's Literature ( https://idpf.github.io/epub3-samples/30/samples.html#childrens-literature ) in order to test the performance impact of CSS design choices (including triggering the GPU 2D / 3D acceleration, in some cases, like I did in ReadiumCSS PR #80). That is because Children's Literature has a single relatively-large spine item in the reading order ( https://github.com/IDPF/epub3-samples/blob/master/30/childrens-literature/EPUB/s04.xhtml ), so when font-size is cranked-up between 150% or 200% for low-vision users, the CSS column pagination spans a great number of pixels on the horizontal axis (consequently, the browser engine's layout and rendering subsystem must then somehow optimize these textures in memory / on the graphics card, and it seems that some combination of CSS rules trigger a more performant render path)

Thanks for the recap.

I say "small", because in my tests the performance degradation was orders of magnitude more detrimental than the visually-annoying border outline (striked-through label).

Yeah and it’s only one “CSS hack” we tried to handle here, I’m not sure we want to handle every conceivable CSS hack because they are de facto corner cases. For instance, we would have the same issue with leading dots in an ePub2-compatible way – using background-color.


PHP 8 support

fixes for PHP 8
dev dependencies update
PHPUnit config fix
minimal PHP version 7.1

This looks good to me, and could supersede my draft PR #199

The removal of composer.lock seems to be the right thing to do, according to: https://getcomposer.org/doc/02-libraries.md#lock-file


Unable to use the SQL Server Maximum DateTime

Hello.
My SQL Server database is refusing to accept the SQL Maximum Datetime of "9999-12-31 23:59:59.997" as a stored procedure parameter with the following error:
Msg 20018, Level 16\nGeneral SQL Server error: Check messages from the SQL Server\n\n\nMsg 8023, Level 16, State 1\nServer 'MUSTANG', Line 1\n\tThe incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Parameter 16 (\"@dtOwnershipEndDate\"): The supplied value is not a valid instance of data type datetime. Check the source data for invalid values. An example of an invalid value is data of numeric type with scale greater than precision.\n"

I am assigning the "9999-12-31 23:59:59.997" value to a Go time.Time (which appears ok), and FreeTDS/gofreetds is correctly recognising that the stored procedure parameter should be a SYBDATETIME.
Some logging I added to convert_sql_buf.go within function typeToSqlBuf showed that the Go Time value is broken down into these components:
diff -2643127431936722624 days -30591 secs<PHONE_NUMBER>

I'll try and do so more research to help assist with this, but if you can see any immediate issues with using the SQL Maximum datetime from within gofreetds, I would be very grateful if you could let me know and I can work around it by using a lower datetime.
I'm using SQL Server 2014 and FreeTDS 0.95
Thanks.

I think the UnixNano for the 9999-12-31 datetime is too big for an int64, so it's going negative which results in a negative days value (as shown in my comment above), which I suspect is the cause of the issue.
I'm struggling with the math in the SYBDATETIME case statement, but I think we need to use uint64 when dealing with extreme datetime values.
I wrote this function to get the uint64 of a time.Time
func UnixNano(t time.Time) uint64 {
	secs := t.Unix()
	var nanos uint64
	nanos = (uint64(secs) * 1e9) + uint64(t.Nanosecond())
	return nanos
}

My intention was then to add a uint64 version of the current int64 code in the SYBDATETIME case, something like this:
if tm.String() == "9999-12-31 23:59:59.997 +0000 UTC" {
  sqlMaxTime := time.Date(9999, 12, 31, 23, 59, 59, 997, time.UTC)
  diff := UnixNano(sqlMaxTime) - UnixNano(sqlStartTime) //<PHONE_NUMBER>0775829989
  _, of := tm.Zone()
  diff += uint64(time.Duration(of) * time.Second)
  days := int32(diff / 1e9 / 60 / 60 / 24)
  secs := uint32(float64(diff-uint64(days)*1e9*60*60*24) * 0.0000003)
  err = binary.Write(buf, binary.LittleEndian, days)
  if err == nil {
    err = binary.Write(buf, binary.LittleEndian, secs)
  }
} else {
  //existing code which uses int64
}

I'm afraid my math is terrible and I'm struggling to get the intended result from this - within SQL Server the max datetime is being stored as "2400-10-18 05:30:40.773"
Any assistance would be appreciated. Thanks.

Broken unit test now resolved in #24


haskellPackages.{ghcWithPackages, ghcWithHoogle}: make overrideable

Motivation for this change
Make ghcWithPackages.override { withLLVM = true; } (p: [ ... ]) work.
Things done

Built on platform(s)

[x] x86_64-linux
[ ] aarch64-linux
[ ] x86_64-darwin
[ ] aarch64-darwin

[ ] For non-Linux: Is sandbox = true set in nix.conf? (See Nix manual)
[ ] Tested, as applicable:

NixOS test(s) (look inside nixos/tests)
and/or package tests
or, for functions and "core" functionality, tests in lib/tests or pkgs/test
made sure NixOS tests are linked to the relevant packages

[ ] Tested compilation of all packages that depend on this change using nix-shell -p nixpkgs-review --run "nixpkgs-review rev HEAD". Note: all changes have to be committed, also see nixpkgs-review usage
[ ] Tested basic functionality of all binary files (usually in ./result/bin/)
21.11 Release Notes (or backporting 21.05 Release notes)

[ ] (Package updates) Added a release notes entry if the change is major or breaking
[ ] (Module updates) Added a release notes entry if the change is significant
[ ] (Module addition) Added a release notes entry if adding a new NixOS module
[ ] (Release notes changes) Ran nixos/doc/manual/md-to-db.sh to update generated release notes

[x] Fits CONTRIBUTING.md.

A bit more detailed writeup concerning the how and why of this change:
Basically, this allows to use override on ghcWithHoogle and ghcWithPackages as you'd expect from nixpkgs in general. The main benefit of this is that you can now add LLVM to a shell environment even if the used GHC is compiled without useLLVM enabled by using ghcWithPackages.override { useLLVM = true; }. It is then possible to use -fllvm which is sometimes useful when there's a bug in the native codegen backend, but LLVM works as expected.
To allow for this the following changes were made:

Change our custom callPackage wrapper (which adds overrideScope) to deal properly with functions by converting them into a functor set and appending the override* attributes.
Refactor withPackages so that it is no longer a wrapper function around with-packages-wrapper.nix, but instead this file does everything. This is crucial because the wrapper function hides the overrides from the user. For this, with-packages-wrapper.nix now takes the selectPackages function and the full haskellPackages as an input.
Move the hoogle wrapper functionality into with-packages-wrapper.nix as well, so ghcWithHoogle doesn't have to be a wrapper function that hides the overrides. For this the hoogle wrapper hoogle.nix is also exposed as its own attribute hoogleWithPackages which can be used and overridden independently (a nice bonus).

I won`t pretend I understand everything of this, but the change seems reasonable and wrappers still seem to be working.

@sternenseemann Thanks for writing up this explanation!  I'm going to try to do a review of this.

Here's one thing that I don't think I can use GitHub's UI to comment on:
diff --git a/pkgs/development/haskell-modules/configuration-common.nix b/pkgs/development/haskell-modules/configuration-common.nix
index 87d1cef5857..802038d4fcb 100644
--- a/pkgs/development/haskell-modules/configuration-common.nix
+++ b/pkgs/development/haskell-modules/configuration-common.nix
@@ -44,6 +44,7 @@ self: super: {
   # enable using a local hoogle with extra packagages in the database
   # nix-shell -p "haskellPackages.hoogleLocal { packages = with haskellPackages; [ mtl lens ]; }"
   # $ hoogle server
+  # this is broken?
   hoogleLocal = { packages ? [] }: self.callPackage ./hoogle.nix { inherit packages; };

   # Needs older QuickCheck version

It looks like this hoogleLocal derivation is still passing packages to ./pkgs/development/haskell-modules/hoogle.nix.
I've never heard of this hoogleLocal derivation, and I've never seen anyone using it.  I'd be fine with just getting rid of it for now.    (Although I guess it might be sort of nice for someone that wants to easily use Hoogle.)

@cdepillabout added documentation as asked and cleaned up the hoogleLocal situation, thanks for spotting that!

@sternenseemann I think this looks good.  You want to merge this in?

Overriding was already possible before this PR with the slightly different
(haskellPackages.ghcWithPackages (ps: with ps; [mtl])).override { withLLVM = true; }

Now this is broken. Sigh...
@sternenseemann please update https://haskell4nix.readthedocs.io/frequently-asked-questions.html#how-to-get-an-environment-with-ghc-and-llvm as well (on Github at https://github.com/NixOS/cabal2nix/tree/master/doc)

Oh, hugh. To be honest, the previous override seems much more plausible for me.
Did you simply not know that possibility, or are there arguments for the one over the other?

Overriding was already possible before this PR with the slightly different

Ah, very annoying, this did not occur to me at all, sorry! I'll amend the documentation and changelog as well. I also think we can add a thing that causes the old scheme to generate a nicer error message.
Not sure if I had done the same had I known this, but with the deed being done I do think it's an improvement, since it's overall a bit clearer and more consistent with the rest of nixpkgs and allows for overriding withPackages globally which wasn't possible before.

Oh wait, the issue is different from what I expected. You can still override the result of calling withPackages which makes what I had in mind trickier. I guess we can still support withLLVM for backwards compat for a time, though.


New-PartnerAccessToken returns error AADSTS50011 when -UseAuthorizationCode is used

Steps to reproduce

What steps can reproduce the defect?
Please share the setup, commandline for vstest.console, sample project, target
framework etc.

When using the below command with application that was created from the guidance on v1.5 module we get the error below in the browser after authentication.
$t=New-PartnerAccessToken -ApplicationId '<app id>' -Credential (Get-Credential) -Scopes 'https://api.partnercenter.microsoft.com/user_impersonation' -ServicePrincipal -Tenant '<tenant id>' -UseAuthorizationCode

AADSTS50011: The reply url specified in the request does not match the reply urls configured for the application:

Seems the problem is that this new v2. module requires that the application has https://localhost as reply url in the app where in previous version the guidance was that the app should be created with urn:ietf:wg:oauth:2.0:oob reply url. The module should allow for both or does not require the reply url value at all.
Expected behavior

Share the expected output

Authtenticate
Actual behavior

What is the behavior observed?

AAD error.
Diagnostic logs

Please share test platform diagnostics logs.
The logs may contain test assembly paths, kindly review and mask those before sharing.

Environment

Please share additional details about your environment.
Version

PS 5.1 and PS 6.2.3

The code that was merged but not yet published "might" fix the refresh token but it will not fix this issue IMHO, but I guess we will have to test it.
@slavizh @isaiahwilliams

@isaiahwilliams by the look of the merge request seems we will have to update our apps rather the code being changed, correct?

That is how I have read it - seems wrong to me...

Yes. Especially that it was not documented that is breaking change.

@isaiahwilliams Several days have passed and the only update was merged that didn't fixed the issue. Is the issue is investigated? Do we need to provide more information? When we can expect a fix?

Agreed with @slavizh we need some sort of resolution as this is a major showstopper for us CSPs... we need to get some traction on this from MSFT, please...

@isaiahwilliams This issue is still present with the latest  version (.5) let us know if will the new guidance will be to include https://localhost in reply URLs of the AAD app? Also if that is the case should we remove urn:ietf:wg:oauth:2.0:oob or it should stay?

In any case you should allow interrupting the process with ctrl +c and having some default timeout if authentication is not done. I think that is present in Az module if I remember correctly.

So when can we expect this to be resolved please? @isaiahwilliams

@slavizh can we just add localhost and leave urn:ietf:wg:oauth:2.0:oob and it still works? Have you tested that by any chance?

@cblackuk yes works if both are added.

Thanks @slavizh I guess I will just add it for now...

@cblackuk  and @slavizh this is the expected behavior with the 2.0 release. Thank you for pointing out this breaking change is not included in the breaking changes documentation. I will work on getting that fixed shortly. The reason for this change is that PowerShell Core does not support the Windows form approach that was used in the past. To ensure that the New-PartnerAccessToken command could function identically between PowerShell 5.1 and PowerShell Core this change was required. You can learn about the expected configurations here.
Please let us know if you have any questions.

For anyone still struggling with this, the solution for me was to manipulate the app registration with the following:
"replyUrlsWithType": [
		{
			"url": "urn:ietf:wg:oauth:2.0:oob",
			"type": "Web"
		},
        {
            "url": "http://localhost:8400",
            "type": "Web"
        }
	],


[bug 1133895] Upgrade grappelli to 2.6.3

This version is compatible with Django 1.7.
r?

peep install worked. tests passed. admin loads. admin plus pages load. i was able to delete multiple responses at a time.
r+

c8a6805 [bug 1133895] Upgrade grappelli to 2.6.3
Thank you!


Change WooCommerce dependency checking

Codecov Report

Merging #56 (d225980) into master (8d6930c) will increase coverage by 5.68%.
The diff coverage is n/a.

@@             Coverage Diff              @@
##             master      #56      +/-   ##
============================================
+ Coverage     26.32%   32.00%   +5.68%
- Complexity      153      154       +1
============================================
  Files            12       12
  Lines           718      703      -15
============================================
+ Hits            189      225      +36
+ Misses          529      478      -51

Impacted Files
Coverage Δ

woorule/inc/class-woorule-order-hooks.php
3.35% <0.00%> (+3.35%)
:arrow_up:

woorule/inc/class-woorule-cart-hooks.php
6.43% <0.00%> (+6.43%)
:arrow_up:

.../class-woorule-klarna-checkout-for-woocommerce.php
14.28% <0.00%> (+14.28%)
:arrow_up:

woorule/inc/class-woorule.php
78.88% <0.00%> (+14.37%)
:arrow_up:

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 8d6930c...d225980. Read the comment docs.


i cant play song

06:34:02 YoutubeResolveStrategy | System.ComponentModel.Win32Exception: The system cannot find the file specified
at System.Diagnostics.Process.StartCore(ProcessStartInfo startInfo)
at NadekoBot.Services.Impl.YtdlOperation.d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at NadekoBot.Modules.Music.Common.SongResolver.Strategies.YoutubeResolveStrategy.d__2.MoveNext()
everytime i link a song it says that

make sure you've installed youtube-dl?

You should see #1053 , and if there isn't any answers post a comment in this section. It seems to be a youtube-dl issue as mentioned by willysunny, widely solved in the section.


User must be able to create a template from an existing container

We need to add functionality to enable creation of templates from existing containers via UI.

Need to have a switch to keep container alive, and get template in addition to container, so that promote does not remove the container.

Seems to solve problem with user's hub account, we might allow this option only for hub environments. Wdyt @akarasulu?

We still need to handle hub-less operation and generating templates is a must have. Without that you lose a lot of productivity. What's the problem there's no easy way to handle hub less users?

There is no value, b/c even promoted and exported templates are not accessible in local Kurjun, they must be uploaded to Hub to be accessible in SS UI (SS UI shows templates from local Kurjun list).
So only admin would be able to use them manually using subutai CLI

There is no value, b/c even promoted and exported templates are not accessible in local Kurjun,

This is a technical shortcoming that prevents SS UI from seeing it. We should find a way to rectify it. Here the cache is the peer. The container template is present on a resource host. The SS UI should be able to offer this promoted template to the user to create new containers with it on any RH of the peer.
When I talk about value, I'm talking about value, I mean to the user. Ultimately we have to design the system for usability and if there are flaws in the implementation we have to fix it. Can't just sit there and say there's no value because the system cannot do X and Y. We must find a way.

they must be uploaded to Hub to be accessible in SS UI (SS UI shows templates from local Kurjun list). So only admin would be able to use them manually using subutai CLI

This is totally unacceptable for the user experience. Then there's no point to the SS UI.
Please find a way to have the SS UI be aware of promoted templates on the resource hosts of the peer and display them as private templates (use a special icon overlay for private templates) available to the user for local use on his peer. Promote and export is all that is need for this.
If he user is a hub user, they should also have a way in the UI to publish or push (modes: public, shared, private) to their kurjun repository. Publish adds the template to the global kurjun repository. Push goes into their personal and can be access controlled as we have it setup.

The problem is that there can be several RHs with diff local templates.
Until a template is published/pushed to Global Kurjun, it can not be cloned on an RH that does not have it, even if its neighbour RH within the same peer has it.
So we can not make it visible in Environment Builder. User must publish it and then only we can clone it on any RH.
Another moment about environment containers:
A container can reside on any peer, it can be on a remote one,and even if we somehow make it visible, it will be physically on a remote peer, not accessible for local Gorjun or subutia cli.
So there are 2 options:

We add new subutai CLI command to promote and publish to Global Kurjun at once. So these 2 operations are not separate but in an atomic transaction. This would allow then to automatically see and use this template from any other RH/peer.
Or we allow user to manipulate containers on local RHs only and promote them to templates. This way we can register them with local Gorjun and make visible in SS UI without mandatory push to Global Gorjun. That means, user can promote container to templates in the context of a single peer where container resides physically. The template will get uploaded to MH RH and be accessible to other RHs in this peer. Later user can publish template to global Gorjun and make it visible to other peers.

The problem is that there can be several RHs with diff local templates.

Sure. Know it.

Until a template is published/pushed to Global Kurjun, it can not be cloned on an RH that does not have it, even if its neighbour RH within the same peer does have it.

This is a technical limitation. There's nothing preventing us from fixing this.

So we can not make it visible in Environment Builder. User must publish it and then only we can clone it on any RH.

Again this is a limitation of the current implementation which overlooked some very important use cases.
The Use Case
It's very natural for a user to "work" on a container, convert it to a template, and re-use it to clone more containers. They should not have to publish it to a global repository to use it. What if it contains private stuff they don't want to expose it? What if the peer is not connected to the Internet? What if the user does not trust the Hub? These are all natural and legitimate concerns. The need is a real one.
The Fix
This is just an idea. Let me know what you think.

We can create a very simple template manager/tracker component for SS. Promotions register private templates created by promotions and keep template metadata like local user ownership and state.
Remove the CLI export command, merge its functionality into promote, always export into the tmpdir
NGINX runs on each RH, and serves the contents of tmpdir
The peer's local Kurjun (on the MH?) can unify all these RH views into a single merged view:

SS's env creator can see all the templates from global and internal
SS's env creator filters private container templates: logged in user must equal template owner
SS's env creator displays private containers owned by user with some graphic overlay to signify they're private (i.e. closed lock in lower right of the icon).

A template management UI area on SS lists local templates based on owner and logged in user. We allow users to delete, push and publish local templates. Once pushed or published the template is ignored to prevent being listed twice.
X-peer environments with or without the Hub should be able to access each others' local Kurjun repositories to transfer private templates and use them across peers and resource hosts just as they do public templates.

and keep template metadata like local user ownership
This would work if template is promoted from SS, if template is promoted manually (using subutai CLI) then no owner information will be there
The peer's local Kurjun (on the MH?) merges all RH views of private templates into a single merged view:
This question is more to @soffokl , if local Gorjun can be made to get templates from RH nginx'es and expose them to SS. But again SS can filter templates based on owner, if it is present at all. Currently ownership is kept outside of template metadata, on Global Gorjun/Hub.

X-peer environments with or without the Hub should be able to access each others' local Kurjun
@soffokl please comment

The only thing I do not know is if the env creator lists private templates kept in private kurjuns on the Hub?
Currently we dont use private templates that are not published on Hub Gorjun

Current local kurjun store nothing, it only proxies requests to the global server.

and keep template metadata like local user ownership

This would work if template is promoted from SS, if template is promoted manually (using subutai CLI) then no owner information will be there

We need to have subutai CLI announce all activities to SS to keep SS data synchronized with the state of the system. This should have been done before. In fact I thought this was already being done. If we don't do this then nothing is going to stay consistent.

The peer's local Kurjun (on the MH?) merges all RH views of private templates into a single merged view:

This question is more to @soffokl , if local Gorjun can be made to get templates from RH nginx'es and expose them to SS. But again SS can filter templates based on owner, if it is present at all. Currently ownership is kept outside of template metadata, on Global Gorjun/Hub.

Yes @soffokl it was more a question for you. You're response was:

Current local kurjun store nothing, it only proxies requests to the global server.

Right it will still store nothing and proxy content. But this time from local RHs as well as Hub Gorjun. It will merge things together.

X-peer environments with or without the Hub should be able to access each others' local Kurjun

@soffokl please comment

@soffokl Can we proxy from multiple x-peer Kurjuns?
I think this starts to get inefficient perhaps.

The only thing I do not know is if the env creator lists private templates kept in private kurjuns on the Hub?

Currently we dont use templates that are not published on Hub Gorjun

Yes it seems we left off many features that were supposed to be in Kurjun right after getting to Gorjun. I guess we were so happy to not die with Kurjun we forgot. I think we need a good specification on this matter.

Right it will still store nothing and proxy content. But this time from local RHs as well as Hub Gorjun. It will merge things together.

RH does not allow to download template. To proxy request it should support downloading. We can't just point local Gorjun to RH, because RH does not provide this functionality.

Yes it seems we left off many features that were supposed to be in Kurjun right after getting to Gorjun. I guess we were so happy to not die with Kurjun we forgot. I think we need a good specification on this matter for the long term.

Yeah, It was because we had "enough for demo", and there were higher priority requirements. All these were panned to implement when everything became better. We are still waiting this.

Right it will still store nothing and proxy content. But this time from local RHs as well as Hub Gorjun. It will merge things together.

RH does not allow to download template. To proxy request it should support downloading. We can't just point local Gorjun to RH, because RH does not provide this functionality.

How hard is it to have NGINX expose those /tmpdir files to the local Gorjun?

Yes it seems we left off many features that were supposed to be in Kurjun right after getting to Gorjun. I guess we were so happy to not die with Kurjun we forgot. I think we need a good specification on this matter for the long term.

Yeah, It was because we had "enough for demo", and there were higher priority requirements. All these were panned to implement when everything became better. We are still waiting this.

Let's focus on doing this the right way now. That's why we're having these discussions. Obviously we're going to need to expose local templates from RH's. We can have NGINX on the RH serve these from some URI like /templates so local Gorjun can add them to the list. Also other RH's without the local template can pull the template when needed.
WDYT?

Done


feat(label): add experimental label component

What

Adds a Label component
Media

Why

Closes DISP-142
How

As labels will often be customized on the project level and will use bare colors instead of semantic ones, I've added a darkTheme helper to simplify writing the css (see the Custom story for example usage)

Awesome!


Declared license

The license of this module has beenchanged to Attribution 4.0 International (CC-BY-4.0). As the original code was released "under under the Creative Commons Attribution-ShareAlike License", I wonder how the license can now be CC-BY-4.0 . By this switch, the "ShareAlike" obligations of the original license were dropped.
Can you explain the reasonsing why CC-BY-4.0 was chosen (and not CC-BY-SA-2.0) ?

I am simply maintaining the code in this project and am not very knowledgeable about licenses. There were some open issues requesting changes to the project.json and the inclusion of license text, and someone made a pull request so I accepted it:
https://github.com/goto100/xpath/pull/61
I agree that it doesn't seem to be quite the right license. Could you tell me where I should obtain the text for the correct license? I know about this, but I don't know the correct way to represent that in text form.

In your package.json, you need to specify the license name in the so called SPDX format, see https://docs.npmjs.com/files/package.json#license , in your case https://spdx.org/licenses/CC-BY-SA-2.0.html -> CC-BY-SA-2.0
As the author of the original version of the code - Cameron McCormack - licensed the code under CC-BY-SA-2.0, the "Share Alike" effect of this license basically makes every successor version of the code licensed under the exact same license. That's why I was wondering why the license in this repo was changed to CC-BY-4.0

I have changed the license name in the package.json, and deleted the LICENSE file. Will reopen issue #5.


Make filter config provider shared.

This makes filter config provider shared between listeners, and change the mapping between filter config provider and subscription to 1 on 1.
fixes https://github.com/envoyproxy/envoy/issues/14934
Signed-off-by: Pengyuan Bian<EMAIL_ADDRESS>

If this is on the right track, I will work on adding a test for this.

As per discussion in #14934 this might not be exactly the right fix.

@htuch ptal, thanks!

I can take a look.

Check CI please?
/wait

@mattklein123 done. Looks like the failures now are unrelated flakes?

/retest

Close in favor of https://github.com/envoyproxy/envoy/pull/15371