Explain to users how to use this tool, on load

This tool does not have any intro text.
When a user lands on it, how should the user know what to do?
There is zero context.

So I'd like to request some kind of "splash dialog" or "guiders" that are shown on first load, and provides a good summary of what to do.
I recommend using https://github.com/pickhardt/Guiders-JS to do this. However,
a simple div (or even a single flat image, placed centrally H & V over everything, with a click to dismiss) that has arrows pointing to key things or areas to interact with. A quick google image search pulls up this example:

What a beauty. :)
That the click the dismiss gets real old real fast, so I think the key 2nd feature after the contextual introduction is working, is a way to set a local remembered preference to not display the splash dialog and/or guiders on subsequent page loads is important. Hood.ie might make that easy; and GuidersJS has a guiders.hideAll(); method to make that easy.

Intro text, I.e. short user guides to both typetools and videoproof, were
posted for comments In the slide show “TN Type Proof”.  Pages can be made.
https://docs.google.com/presentation/d/15GkpS_NaiMbLGUdu9VzKTOe9veQN0ZpRS_8ur06g8Nc/edit#slide=id.p
Now contains just that information. We will be moving ahead with
integrating this into the tool. Please feel free to add anything you  would
like to see.
Thanks.
On Jul 25, 2019, at 10:39 PM, Dave Crossland<EMAIL_ADDRESS>wrote:
This tool does not have any intro text.
When a user lands on it, how should the user know what to do?
There is zero context.

So I'd like to request some kind of "splash dialog" or "guiders" that are
shown on first load, and provides a good summary of what to do.
I recommend using https://github.com/pickhardt/Guiders-JS to do this.
However,
a simple div (or even a single flat image, placed centrally H & V over
everything, with a click to dismiss) that has arrows pointing to key things
or areas to interact with. A quick google image search pulls up this
example:
[image: Splash-screen-content]
https://user-images.githubusercontent.com/261579/61921824-73ef5f80-af2c-11e9-95b6-efe19b8c464f.png
What a beauty. :)
That the click the dismiss gets real old real fast, so I think the key 2nd
feature after the contextual introduction is working, is a way to set a
local remembered preference to not display the splash dialog and/or guiders
on subsequent page loads is important. Hood.ie https://hood.ie might make
that easy; and GuidersJS has a guiders.hideAll(); method to make that easy.
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/TypeNetwork/variable-type-tools/issues/63?email_source=notifications&email_token=AAO5VDVLEHFZRGPCJPZVB3DQBJPVZA5CNFSM4IG75L7KYY3PNVWWK3TUL52HS4DFUVEXG43VMWVGG33NNVSW45C7NFSM4HBTV4OQ,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AAO5VDRQQCONXPRKOQQJ6OTQBJPVZANCNFSM4IG75L7A
.

David, this is a perfect start for a Guiders JS experience!
I rewrote what you had so far into something that can work for a chain of Guiders popups, and padded it out to the full sidebar elements:

Layout menu

Pick a page layout! Our responsive text compositions are designed with select font and glyphs, and each has its own options in the type specifications

"Ramp" is a text hierarchy progression of six text elements, from H1 to P, to give a broad view over a typeface's optical sizes

"Glyphs" shows all the encoded glyphs within a font family in a table.

"Grid" shows the "H" glyph across Width and Weight axes (if present.) You can adjust the number of cells in x and y, and all other axes values.

"Waterfall" shows the basic Latin glyphs at a full range of optical sizes, stepping point by point

"Logo Pogo" is just one piece of large text. Type your own text, adjust your axes values, and save the result as an SVG

Family menu

Pick from our selection of sample fonts – or add your own by simply drag-and-dropping your OpenType font into this browser window!

Style menu

Pick any Named Instances (styles within a family that have been bookmarked by the font developer)

Column width

For the Ramp layout, you can change the column width. Check out how Leading adjusts automatically to be more appropriate to this value, and see what you ca do with Amstelvar's ascender and descenders to finesse even further

Size and Leading

Set the font-size and line-height of the active text, in CSS Points.

Note the "Mirror size changes" checkbox for fonts that have Optical Size. [This might need to jump down to where the AmstelvarAlpha one is]

Leading, works in Grid, logo pogo and Ramp. Defaults to (???) related to size input, then allowed user input in points.

Alignment and Color

Align your element as left, center, right, or justified. Set the foreground or background colors, too

View All Axes

Variable fonts can have two sets of axes, one for everyone, and a second for expert users. Check this to see everything, and have fun

Axes

Weight, Width, Optical Size, Grade, and other aspects of typographic style are now at your command!

[ Mirror size changes ] Optical Size is tied to match Font Size when this is set

Show

"Verbose font-variation-settings" shows [something.]

"Parameters" shows the axes values next to the text elements.

"CSS" shows the exact CSS at the bottom of the page. Scroll down!

META

Reset all the typography and axes values to the defaults.

As we update our selection of sample fonts from time to time, you can click here to refresh your cache

While drafting, I found a few possible related improvements:

[ ] What does Verbose font-variation-settings do? I forget and couldn't see, lol

[ ] Perhaps the family and style rows should move down under the layout, width, size, alignment and color, rows, so that then its family, style, view all, axes... and then the Show and Meta sections should be moved

[ ] The Col Width should become disabled when the layout is not Ramp page.

[ ] The Size input should become disabled in Waterfall page.

[ ] The Leading input should become disabled in Waterfall and Glyphs pages

[ ] There should be a new sidebar row under Size and Leading, just like it, for setting letter-spacing and word-spacing values

[ ] Since the user might dismiss the 1st guider, each guider that explains the page should appear after that page is loaded.

[ ] A runion should be added for all fonts with yasc and ydsc axes to make them longer in proportion to the line-height, so that the col-width which sets line height also sets the typeface automatically. Perhaps have a AutoMagic section with a checkmark to turn this on or off?

This looks great thanks!
Start in the morning going through and answering questions and integrating
On Jul 26, 2019, at 7:04 PM, Dave Crossland<EMAIL_ADDRESS>wrote:
David, this is a perfect start for a Guiders JS experience!
I rewrote what you had so far into something that can work for a chain of Guiders popups, and padded it out to the full sidebar elements:
Layout menu
Pick a page layout! Our responsive text compositions are designed with select font and glyphs, and each has its own options in the type specifications
"Ramp" is a text hierarchy progression of six text elements, from H1 to P, to give a broad view over a typeface's optical sizes
"Glyphs" shows all the encoded glyphs within a font family in a table.
"Grid" shows the "H" glyph across Width and Weight axes (if present.) You can adjust the number of cells in x and y, and all other axes values.
"Waterfall" shows the basic Latin glyphs at a full range of optical sizes, stepping point by point
"Logo Pogo" is just one piece of large text. Type your own text, adjust your axes values, and save the result as an SVG
Family menu
Pick from our selection of sample fonts – or add your own by simply drag-and-dropping your OpenType font into this browser window!
Style menu
Pick any Named Instances (styles within a family that have been bookmarked by the font developer)
Column width
For the Ramp layout, you can change the column width. Check out how Leading adjusts automatically to be more appropriate to this value, and see what you ca do with Amstelvar's ascender and descenders to finesse even further
Size and Leading
Set the font-size and line-height of the active text, in CSS Points.
Note the "Mirror size changes" checkbox for fonts that have Optical Size. [This might need to jump down to where the AmstelvarAlpha one is]
Leading, works in Grid, logo pogo and Ramp. Defaults to (???) related to size input, then allowed user input in points.
Alignment and Color
Align your element as left, center, right, or justified. Set the foreground or background colors, too
View All Axes
Variable fonts can have two sets of axes, one for everyone, and a second for expert users. Check this to see everything, and have fun
Axes
Weight, Width, Optical Size, Grade, and other aspects of typographic style are now at your command!
[ Mirror size changes ] Optical Size is tied to match Font Size when this is set
Show
"Verbose font-variation-settings" shows [something.]
"Parameters" shows the axes values next to the text elements.
"CSS" shows the exact CSS at the bottom of the page. Scroll down!
META
Reset all the typography and axes values to the defaults.
As we update our selection of sample fonts from time to time, you can click here to refresh your cache
While drafting, I found a few possible related improvements:
What does Verbose font-variation-settings do? I forget and couldn't see, lol
Perhaps the family and style rows should move down under the layout, width, size, alignment and color, rows, so that then its family, style, view all, axes... and then the Show and Meta sections should be moved
The Col Width should become disabled when the layout is not Ramp page.
The Size input should become disabled in Waterfall page.
The Leading input should become disabled in Waterfall and Glyphs pages
There should be a new sidebar row under Size and Leading, just like it, for setting letter-spacing and word-spacing values
Since the user might dismiss the 1st guider, each guider that explains the page should appear after that page is loaded.
A runion should be added for all fonts with yasc and ydsc axes to make them longer in proportion to the line-height, so that the col-width which sets line height also sets the typeface automatically. Perhaps have a AutoMagic section with a checkmark to turn this on or off?
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub, or mute the thread.

Chris, could you comment by Monday on getting these help files into TypeTools?
Thanks.

The Verbose FVS checkbox is a holdover from the early days when many of the fonts were not fully compliant with the spec (in particular, missing a STAT table) which caused Safari to mis-interpret the axis defaults for some axes that were not specified in font-variation-settings. For example if you specified wdth but not wght it might set the weight to the lowest value instead of the default. I think that's probably not an issue these days and could be removed.

Do you want my comments on the content itself or should I just work on getting it in there? This seems a bit overwhelming, but perhaps breaking it up over the different layouts as @dberlow mentioned would reduce that a bit.
I think it would be a good idea to rename all the layouts to be more obvious.  And the difference between Glyphs and Grid is not obvious.

Thanks for your comments Chris. Dave May have more. I
think the specific idea is just to get it up there and start soliciting input on all the stuff so that we can hear more, name better, give clearer instructions, and stabilize to the current functions as they are..
If you want to get into a cycle of editing the help files, we can get into that after we post what we have here, in the best way you see fit, and get some  input.
Thanks.

Sounds good, thanks.

I will be supplying similar documentation for video proof or in the next 24 hours

Chris,
Have you got a plan for putting these guiders into typetools?

Not yet. Tomorrow’s job!

On Aug 5, 2019, at 3:54 PM, David Berlow<EMAIL_ADDRESS>wrote:
Chris,
Have you got a plan for putting these guiders into typetools?
—
You are receiving this because you were assigned.
Reply to this email directly, view it on GitHub, or mute the thread.

I've added some intro texts to typetools using IntroJS. I did not stick to the exact script above, because I think it's an overwhelming amount of information for a first load. But I think it would be good to lay all that out at a help link somewhere!
The actual texts are specified in user-guide.js and people are welcome to update them there. Alternately, let me know your desired updates and I can put them in.

After you have already seen the intros, you won't again until your browser data is cleared. For testing, you can add #view-intro to the URL and reload.

After you have already seen the intros, you won't again until your browser data is cleared. For testing, you can add #view-intro to the URL and reload.

There should be a link to bring it back :)
When I click elsewhere on the page, the guiders disappear and I have no way to bring them back which is annoying :)
I think the bottom of the left sidebar with the other 'misc' links is a good place for that.
Maybe like this?

Show introduction

@dberlow please could you review all the above writing on this topic, comparing against what is already implemented, and define the tasks needing to complete this?
With upcoming YouTube Video Tutorials with demonstrations of using this site, it would be great to have all those videos on a YouTube Channel (eg https://www.youtube.com/user/fontbureau) and link to that in the "META" area at the end of the left sidebar.


Enable xtransfer in khala

enable xcm transfer between parachains
enable x3 transfer between parachains and EVM solo chains

We merge this without review, @h4x3rotab please reminds this PR


fb_token no longer auto fetched

After facebook updates the protocol to obtain an oAuthToken in mid August, this project is no longer able to get the "fb_token". Would it be possible to update it as described in the Tinder API gist?
See this solution:
https://gist.github.com/rtt/10403467#gistcomment-1846343
Thanks,
Cukubik

Hey Cukubik,
Thanks for your message.
I'm on it.
best,

It's done!
Please feel free to try it and tell me if it is okay for you :)

Thanks for prompt update.
Here's a small issue:
==== FACEBOOK ====

Fetching Facebook data...

TinderAutoLike.rb:75:in <main>': undefined method captures' for nil:NilClass (NoMethodError)

Line 75 is when it is fetching the fb_id. I don't know ruby, but you've used the "captures" method for fb_token above, so I'm guessing there's a small syntax error in 75. On the other hand, Facebook no longer needs a fb_id there. So, I've deleted all the references to fb_id and this program works like a charm.
Thanks,
cukubik

A side note:
When you've added mechanize here, the bundle install failed on my machine on nokogiri. Turns out El Capitan has added some security features that the default gem installation dir is no longer user writable.
So maybe it's a good idea to include this command in README,
sudo gem install -n /usr/local/bin nokogiri -v '1.6.8'
Reference:
http://stackoverflow.com/questions/32891965/error-while-executing-gem-errnoeperm-operation-not-permitted
Thanks,
cukubik

Hey,
thank you for this information. I did not know that FB_ID was no longer required.
=> I just removed it from my update.
Also, I just updated the README.
Finally, thank you for this little update, as it gave me back some envy to write a full GUI for the app.
Best,


Add .gitignore for generated files

Just for posterity there is some earlier discussion of this in https://github.com/awslabs/s2n/pull/118


[SPARK-14739] [PySpark] Fix bug while parsing all zero sparse vectors

What changes were proposed in this pull request?
The PySpark deserialization has a bug that shows while deserializing all zero sparse vectors. This fix filters out empty string tokens before casting, hence properly stringified SparseVectors successfully get parsed.
How was this patch tested?
Added an inline test similar to other tests in the init.py file.

Can one of the admins verify this patch?


[Q] ERROR Python 'pickledobject' cannot be converted to a MySQL type

I thought initially that this was down to using a version of Django/Python that wasn't supported by the previous Django-Q but this issue remains in Q2 although I cannot work out where the issue lies - With Django-Q, Picklefield or MySql-Connector.
Library Versions:
    django-picklefield 3.1
    Django 4.0.4
    django-q2 1.4.2
    python 3.10.7
    mysql-connector-python 8.0.29

Fresh installation. Scheduler works correctly - i.e. the task completes - however it fails just after when it tries to create a log entry about the success/failure.
Q_CLUSTER = {
'name': 'DjangORM',
'workers': 4,
'timeout': 90,
'retry': 120,
'queue_limit': 50,
'bulk': 10,
'orm': 'default'
}

For each scheduled task I see 5 similar log entries:
10:25:18 [Q] INFO Enqueued 4
10:25:18 [Q] INFO Process-1 created a task from schedule [2]
10:25:19 [Q] INFO Process-1:2 processing [friend-wyoming-kilo-king]
10:25:20 [Q] ERROR Python 'pickledobject' cannot be converted to a MySQL type
10:25:20 [Q] INFO Processed [friend-wyoming-kilo-king]

The django_q_schedule table gets an entry when I schedule a task.
All three django-q DB tables are empty once the task completes.

This is very strange. I have a feeling this has to do with the mysql-connector-python. What "engine" did you use in the "DATABASES"? I couldn't get it connected with that library.
I just ran a test with the latest version of Django-q2 and created a simple django project in it and connected it to the mysql that I have running in docker (mysql 8). Both the app and mysql run in docker.
This is my DATABASES setting in settings.py:
DATABASES = {
    'default': {
        'NAME': 'db',
        'ENGINE': 'django.db.backends.mysql',
        'HOST': 'mysql',
        'PORT': 3306,
        'USER': 'user',
        'PASSWORD': 'password',
        'OPTIONS': {
            'autocommit': True,
        },
    }
}

I used this library: https://pypi.org/project/mysqlclient/ to get mysql to connect and it ran async tasks without any issues.

For the mysql-connector-python package to my MariaDB/MySQL database I was using this engine:
'ENGINE': 'mysql.connector.django'
After installing mysqlclient, changing the engine config, and re-running the app, everything works perfectly as you say, so it's definitely a connector issue.
Thank you.
My issue has now gone away, and the issue is certainly not with Q2.  It is certainly strange that the other connector fails in this way, especially aa it's the official MySQL one, and yet works perfectly for anything else I've done.

Awesome. Thanks for letting me know. Good to hear that it got solved with that.
Indeed weird that the driver was the issue.
FWIW: Django seems to recommend the mysqlclient library as well: https://docs.djangoproject.com/en/4.1/ref/databases/#mysql-db-api-drivers


Use reactions to weight props

Props with more reactions should count more than props with few reactions.
Endpoint:
https://slack.com/api/reactions.get?token=[TOKEN]&channel=[CHANNEL]&timestamp=1478087331.000002&pretty=1

yields:
{
    "ok": true,
    "type": "message",
    "channel": "[...]",
    "message": {
        "type": "message",
        "user": "[...]",
        "text": "wahlloser text nach dem ich suchen kann: blabla",
        "ts": "1478087331.000002",
        "permalink": "https:\/\/[...]",
        "reactions": [
            {
                "name": "eyes",
                "users": [
                    "U27LVTNM8"
                ],
                "count": 1
            },
            {
                "name": "+1",
                "users": [
                    "U27LVTNM8"
                ],
                "count": 1
            }
        ]
    }
}

read more here: https://api.slack.com/methods/reactions.get

Frederic had the great idea to use this for weighting: https://github.com/wooorm/emoji-emotion/blob/master/index.json


Feature Request: Do not display "Failed Cluster Policies" when ui.views.clusterPolicyReports is set to false

Seems this would make sense.

Hey thanks for your request. I implemented it a bit different. I separated the dashboard configuration from the view configuration.
https://github.com/kyverno/policy-reporter/blob/main/charts/policy-reporter/charts/ui/values.yaml#L116
You can set views.dashboard.clusterPolicyReports to false. This will disable all clusterpolicy information from the dashboard. Same works with PolicyReports.


PI 2 going to sleep?

Hi
My Pi 2 is running stretch linux and has the Allsky software installed. Installed recently from a stored image made in 2018.
My issue is everything works fine with my ASI1034 camera but at the end of the night it seems to shut down or go to sleep?
I try and loging using VNC or ALLSKY.LOCAL and cannot ?
It is off the network until I cycle the power to it?
Is there a setting I can change to stop it going to slepp?

I am not sure it is going to sleep. There might be something else going on. Try connecting to it using SSH or http://your-ip-address
If you connect with SSH, you can monitor the running processes by using the command top or ps -aux. You should see ./capture and timelapse.sh at the end of the night.

I had to upgrade my power supply from 5V 2.0A to 5V 3.0A as my Pi and the allsky software was hanging at random times during the day and night. It's seems that the camera attached to the Pi were drawing too much power together. Since upgrading I've had no problems.

Issue resolved by user.


Install Error on Windows 10

I seem to be having trouble getting this package to install on Windows 10.  I have it working on an Arch Linux setup and Windows 7 at work behind a proxy, but Windows 10 at home is giving me fits.  I do not seem to have issues installing other atom packages on Windows 10 which is why im confused.
I posted this on the NPM issues board as the error message suggests, but It hasn't gotten anywhere yet.  I also tried uninstalling atom and deleting all of the packages.  Not sure if anyone can help, but I thought I would give it a try.
Installing<EMAIL_ADDRESS>failed.Hide output…

npm WARN addRemoteGit Error: Command failed:
npm WARN addRemoteGit     at ChildProcess.exithandler (child_process.js:658:15)
npm WARN addRemoteGit     at ChildProcess.emit (events.js:98:17)
npm WARN addRemoteGit     at maybeClose (child_process.js:766:16)
npm WARN addRemoteGit     at Process.ChildProcess._handle.onexit (child_process.js:833:5)
npm WARN addRemoteGit  git+https://github.com/jeremyramin/term.js.git resetting remote C:\Users\Joseph\.atom\.apm\_git-remotes\https-github-com-jeremyramin-term-js-git-7be5884d because of error: { [Error: Command failed: ] killed: false, code: 1, signal: null }
npm WARN addRemoteGit Error: Command failed:
npm WARN addRemoteGit     at ChildProcess.exithandler (child_process.js:658:15)
npm WARN addRemoteGit     at ChildProcess.emit (events.js:98:17)
npm WARN addRemoteGit     at maybeClose (child_process.js:766:16)
npm WARN addRemoteGit     at Socket.<anonymous> (child_process.js:979:11)
npm WARN addRemoteGit     at Socket.emit (events.js:95:17)
npm WARN addRemoteGit     at Pipe.close (net.js:466:12)
npm WARN addRemoteGit  git+https://github.com/jeremyramin/pty.js.git#3e9c58 resetting remote C:\Users\Joseph\.atom\.apm\_git-remotes\https-github-com-jeremyramin-pty-js-git-27ad4d30 because of error: { [Error: Command failed: ] killed: false, code: 1, signal: null }
npm ERR! git clone --template=C:\Users\Joseph\.atom\.apm\_git-remotes\_templates --mirror https://github.com/jeremyramin/term.js.git C:\Users\Joseph\.atom\.apm\_git-remotes\https-github-com-jeremyramin-term-js-git-7be5884d: Cloning into bare repository 'C:\Users\Joseph\.atom\.apm\_git-remotes\https-github-com-jeremyramin-term-js-git-7be5884d'...
npm ERR! git clone --template=C:\Users\Joseph\.atom\.apm\_git-remotes\_templates --mirror https://github.com/jeremyramin/term.js.git C:\Users\Joseph\.atom\.apm\_git-remotes\https-github-com-jeremyramin-term-js-git-7be5884d: fatal: unable to access 'https://github.com/jeremyramin/term.js.git/': SSL certificate problem: unable to get local issuer certificate
npm ERR! git clone --template=C:\Users\Joseph\.atom\.apm\_git-remotes\_templates --mirror https://github.com/jeremyramin/pty.js.git C:\Users\Joseph\.atom\.apm\_git-remotes\https-github-com-jeremyramin-pty-js-git-27ad4d30: Cloning into bare repository 'C:\Users\Joseph\.atom\.apm\_git-remotes\https-github-com-jeremyramin-pty-js-git-27ad4d30'...
npm ERR! git clone --template=C:\Users\Joseph\.atom\.apm\_git-remotes\_templates --mirror https://github.com/jeremyramin/pty.js.git C:\Users\Joseph\.atom\.apm\_git-remotes\https-github-com-jeremyramin-pty-js-git-27ad4d30: fatal: unable to access 'https://github.com/jeremyramin/pty.js.git/': SSL certificate problem: unable to get local issuer certificate
npm ERR! Windows_NT 6.2.9200
npm ERR! argv "C:\\Users\\Joseph\\AppData\\Local\\atom\\app-1.0.19\\resources\\app\\apm\\bin\\node.exe" "C:\\Users\\Joseph\\AppData\\Local\\atom\\app-1.0.19\\resources\\app\\apm\\node_modules\\npm\\bin\\npm-cli.js" "--globalconfig" "C:\\Users\\Joseph\\.atom\\.apm\\.apmrc" "--userconfig" "C:\\Users\\Joseph\\.atom\\.apmrc" "install" "C:\\Users\\Joseph\\AppData\\Local\\Temp\\d-115927-10584-1velsc4\\package.tgz" "--target=0.30.7" "--arch=ia32" "--msvs_version=2013"
npm ERR! node v0.10.40
npm ERR! npm  v2.13.3
npm ERR! code 128

npm ERR! Command failed: Cloning into bare repository 'C:\Users\Joseph\.atom\.apm\_git-remotes\https-github-com-jeremyramin-term-js-git-7be5884d'...
npm ERR! fatal: unable to access 'https://github.com/jeremyramin/term.js.git/': SSL certificate problem: unable to get local issuer certificate
npm ERR!
npm ERR!
npm ERR! If you need help, you may report this error at:
npm ERR!     <https://github.com/npm/npm/issues>

My understanding of the error message says that it is an issue with using https:// and SSL to fetch the repository where my dependency is located.
npm ERR! fatal: unable to access 'https://github.com/jeremyramin/term.js.git/': SSL certificate problem: unable to get local issuer certificate

I have installed this before on other Windows 10 machines so I do not think it is an issue with Windows 10.
Please try making a new folder somewhere and use the command: git clone https://github.com/jeremyramin/term.js.git. This is assuming you have the git command line tools installed or you can use the Git Bash that comes with Github Desktop. Let me know if it clones successfully.

It didn't work at first because I didn't have my public ssh key on my Github settings (not sure when i deleted that). I resolved that and was able to clone successfully, however the install through atom still did not work

According to this post on the Atom Discuss forum, Atom uses the git command found in your PATH to install packages. The best way to confirm if that git works is to use the command from your system's default shell: cmd.exe or Powershell. If git clone works from there, then the issue lies somewhere else.

Thanks, I think its a system issue of mine.

Figured it out... i had upgraded to the new Git version that installs into Program Files\Git rather than Program Files (x86)\Git.  The PATH variable was out of date. Thanks for the help.

No problem. Glad you were able to resolve your issue.


Support for images with format registry.k8s.io/ingress-nginx/controller@sha256:d5f8217feea...

Hi @ligfx,
I noticed that you have unreleased support for image specs that contain sha256 fingerprints. Would you mind releasing this so that I can use his?
Thanks again for this nice utility!

@pvannierop done! Released as ligfx/k3d-registry-dockerd:v0.6

@ligfx Thanks! Much appreciated.


Error in compilar flutter

Hi, I have a problem in build my app
/usr/local/java/flutter/.pub-cache/hosted/pub.dartlang.org/geolocator-7.2.0+1/android/src/main/java/com/baseflow/geolocator/location/GeolocationManager.java:42: error: cannot find symbol
() -> {
^
symbol:   method metafactory(Lookup,String,MethodType,MethodType,MethodHandle,MethodType)
location: interface LambdaMetafactory
1 error
Fatal Error: Unable to find method metafactory
Why does it happen?

Thanks for reporting this issue. I can't reproduce the issue, can you please provide more information?

Your flutter doctor -v
Your android/app/build.gradle
And which device / which emulator you're using.
Which Android SDK you're using

It seems that it's an issue with the Android SDK / Build tools you're using. Can you try reinstalling the build tools for me?

@betosantin a quick Google action leads me to believe you might have a faulty installation of the Android SDK Build tools (see this Stack Overflow answer).
Maybe you could try reinstalling the Android SDK Build tools. You can find clear instructions on this website.
If this doesn't help please supply the additional information requested by @florissmit1.

@betosantem uma ação rápida do Google me leva a acreditar que você pode ter uma instalação defeituosa das ferramentas Android SDK Build (veja esta resposta Stack Overflow).
Talvez você possa tentar reinstalar as ferramentas Android SDK Build. Você pode encontrar instruções claras neste site.
Se isso não ajudar, forneça as informações adicionais solicitadas por @ florissmit1 .

@florissmit1, Thanks for your reply.
@mvanbeusekom, Thanks for your return, in my SDK, missing the file core-lambda-stubs.jar. I reinstall android sdk.
Sorry for opening the request, I thought it might be the latest geolocator update

@betosantem uma ação rápida do Google me leva a acreditar que você pode ter uma instalação defeituosa das ferramentas Android SDK Build (veja esta resposta Stack Overflow).
Talvez você possa tentar reinstalar as ferramentas Android SDK Build. Você pode encontrar instruções claras neste site.
Se isso não ajudar, forneça as informações adicionais solicitadas por @ florissmit1 .

@betosantin a quick Google action leads me to believe you might have a faulty installation of the Android SDK Build tools (see this Stack Overflow answer).
Maybe you could try reinstalling the Android SDK Build tools. You can find clear instructions on this website.
If this doesn't help please supply the additional information requested by @florissmit1.

@florissmit1, Thanks for your reply.
@mvanbeusekom , Thanks for your return, in my SDK, missing the file core-lambda-stubs.jar. I reinstall android sdk.
Sorry for opening the request, I thought it might be the latest geolocator update


[firebase_messaging] Need Kotlin documentation and example

Describe the bug
At https://pub.dev/packages/firebase_messaging step 6 of backgrond messaging talks about MainActivity.java but it does not exist for my Flutter project.

Looks like a lot of others have this issue https://stackoverflow.com/questions/59225943/flutter-project-mainactivity-java-is-missing
To Reproduce
Steps to reproduce the behavior:

Go to '...'
'...'
See error or incorrect behavior

Expected behavior
A clear and concise description of what you expected to happen.
Additional context
Add any other context about the problem here.

Hi @giorgio79
Your project has Kotlin instead of Java . You can implement MainActivity.kt from this answer
or you can create Flutter project with java support an follow the steps to implement firebase_messaging
Closing, as this isn't an issue with firebase_messaging itself,
if you disagree please write in the comments and I will reopen it
Thank you

Thanks Taha. Perhaps the documentaiton could be improved at https://pub.dev/packages/firebase_messaging
I assume the kotlin based projects will prevail over pure Java, as Flutter rocks.

Hi @giorgio79
thanks for feedback

Just found a dupe thread :) https://github.com/FirebaseExtended/flutterfire/issues/1906

PS, it is also unclear whether we should paste the stuff after what is in MainActivity.kt or overwrite what is in there? For now, I just pasted after what was in there...
`
import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant
//https://stackoverflow.com/questions/59984162/firebase-messaging-handle-background-message-in-kotlin/60634673#60634673
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService
class MainActivity: FlutterActivity() {
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
}
}
import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService
class Application : FlutterApplication(), PluginRegistrantCallback {
fun onCreate() {
super.onCreate()
FlutterFirebaseMessagingService.setPluginRegistrant(this)
}
fun registerWith(registry: PluginRegistry?) {
    GeneratedPluginRegistrant.registerWith(registry)
}

}`

Ok, I think the Google team needs to do a better job. I am unsuccessful so far in updating my main Kotlin file, getting errors like this based on the linked stackoverflow kotlin example... The imports are also totally different from the default kotlin file provided out of the box...
package me.exampleapp

import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant
//https://stackoverflow.com/questions/59984162/firebase-messaging-handle-background-message-in-kotlin/60634673#60634673
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService
import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService

class Application : FlutterApplication(), PluginRegistrantCallback {
    fun onCreate() {
        super.onCreate()
        FlutterFirebaseMessagingService.setPluginRegistrant(this)
    }

    fun registerWith(registry: PluginRegistry?) {
        GeneratedPluginRegistrant.registerWith(registry)
    }
}

Launching lib\main.dart on Pixel 2 in debug mode...
Running Gradle task 'assembleDebug'...
e: android\app\src\main\kotlin\me\cashnear\MainActivity.kt: (8, 45): Conflicting import, imported name 'FlutterFirebaseMessagingService' is ambiguous
e: android\app\src\main\kotlin\me\cashnear\MainActivity.kt: (12, 45): Conflicting import, imported name 'FlutterFirebaseMessagingService' is ambiguous
e: android\app\src\main\kotlin\me\cashnear\MainActivity.kt: (16, 9): 'onCreate' hides member of supertype 'FlutterApplication' and needs 'override' modifier
e: android\app\src\main\kotlin\me\cashnear\MainActivity.kt: (21, 9): 'registerWith' hides member of supertype 'PluginRegistrantCallback' and needs 'override' modifier
e: android\app\src\main\kotlin\me\cashnear\MainActivity.kt: (22, 48): Type mismatch: inferred type is PluginRegistry? but FlutterEngine was expected

FAILURE: Build failed with an exception.

Lol I am finding so many issues around this and the plugin page has no up to date documentation ... WTF Simple carelessness...
https://github.com/FirebaseExtended/flutterfire/issues/1684
https://github.com/FirebaseExtended/flutterfire/issues/1613

Thanks Taha! Looking forward to a working Kotlin / Flutter example. The example linked from firebase_messaging pub dart page is 3 years old and Java based... https://github.com/FirebaseExtended/flutterfire/tree/master/packages/firebase_messaging/example

I don't have time to test this, but based in another plugin that I'm use, and use isolate services, maybe this will be the Android code for handle background notifications, with flutter v2 embedding.
Application.kt
package your.app.package

import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.view.FlutterMain
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService

class Application : FlutterApplication(), PluginRegistrantCallback {
    override fun onCreate() {
        super.onCreate()
        FlutterFirebaseMessagingService.setPluginRegistrant(this)
        FlutterMain.startInitialization(this)
    }

    override fun registerWith(registry: PluginRegistry?) {
         if (!registry!!.hasPlugin("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin")) {
            FlutterFirebaseMessagingService.registerWith(registry!!.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"))
        }
    }
}

MainActivity.kt
package your.app.package

import io.flutter.embedding.android.FlutterActivity

class MainActivity: FlutterActivity() {
}

Update: based in another plugin that I'm using in another app, I'm ussing this code for handle background message in kotlin... I don't know is better than stackoverflow answer, but works.
Application.kt
package your.app.package

import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin
import io.flutter.view.FlutterMain
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService

class Application : FlutterApplication(), PluginRegistrantCallback {

    override fun onCreate() {
        super.onCreate()
        FlutterFirebaseMessagingService.setPluginRegistrant(this);
        FlutterMain.startInitialization(this)
    }

    override fun registerWith(registry: PluginRegistry?) {
        if (!registry!!.hasPlugin("io.flutter.plugins.firebasemessaging")) {
            FirebaseMessagingPlugin.registerWith(registry!!.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
        }
    }
}

Yes, It works! Thank You

Update: based in another plugin that I'm using in another app, I'm ussing this code for handle background message in kotlin... I don't know is better than stackoverflow answer, but works.
Application.kt
package your.app.package

import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin
import io.flutter.view.FlutterMain
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService

class Application : FlutterApplication(), PluginRegistrantCallback {

    override fun onCreate() {
        super.onCreate()
        FlutterFirebaseMessagingService.setPluginRegistrant(this);
        FlutterMain.startInitialization(this)
    }

    override fun registerWith(registry: PluginRegistry?) {
        if (!registry!!.hasPlugin("io.flutter.plugins.firebasemessaging")) {
            FirebaseMessagingPlugin.registerWith(registry!!.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
        }
    }
}

Can you share everything you've done?
Did you remove your MainActivity file? Did you update your AndroidManifest.xml android:name?

You have to update the AndroidManifest.xml as well.
-        android:name="io.flutter.app.FlutterApplication"
+        android:name=". Application"

and add:
            <intent-filter>
                <action android:name="FLUTTER_NOTIFICATION_CLICK" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

inside the <activity tag.

You have to update the AndroidManifest.xml as well.
-        android:name="io.flutter.app.FlutterApplication"
+        android:name=".Application"

and add:
            <intent-filter>
                <action android:name="FLUTTER_NOTIFICATION_CLICK" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

inside the <activity tag.

Is there more of your implementation you can share? Like a spoonfeeding of information?
How did you declare your myBackgroundMessageHandler function?
What are you using for MainActivity.kt?
What are you using for Application.kt?
What does your AndroidManifest have in it?
Does the package name at the top match what's in google-services.json? Does it match what's in the MainActivity.kt?
What version of the actual plugin are yo using in pubspec?
What version of the android/app/build.gradle dependency are you using?
Ex: implementation "com.google.firebase:firebase-messaging:XXXX
My mind is blown by this plugin. None of it makes sense, thanks in advance.

@bretie  you need to follow the pub.dev documentation https://pub.dev/packages/firebase_messaging
The only thing that change from that for flutter kotlin projects is the code below the step that says:
2. Add an Application.java class to your app in the same directory as your MainActivity.java. This is typically found in /android/app/src/main/java//.
If the proccess is too complicated you can search for a youtube video

@bretie you need to follow the pub.dev documentation https://pub.dev/packages/firebase_messaging
The only thing that change from that for flutter kotlin projects is the code below the step that says:
2. Add an Application.java class to your app in the same directory as your MainActivity.java. This is typically found in /android/app/src/main/java//.
If the proccess is too complicated you can search for a youtube video

I can assure you it's not too complicated. When it comes to background messages using this plug it tends to be inconsistent compatibility. It requires unique steps for every other person that aren't documented. Hence, me asking for your full implementation.

Update: based in another plugin that I'm using in another app, I'm ussing this code for handle background message in kotlin... I don't know is better than stackoverflow answer, but works.
Application.kt
package your.app.package

import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin
import io.flutter.view.FlutterMain
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService

class Application : FlutterApplication(), PluginRegistrantCallback {

    override fun onCreate() {
        super.onCreate()
        FlutterFirebaseMessagingService.setPluginRegistrant(this);
        FlutterMain.startInitialization(this)
    }

    override fun registerWith(registry: PluginRegistry?) {
        if (!registry!!.hasPlugin("io.flutter.plugins.firebasemessaging")) {
            FirebaseMessagingPlugin.registerWith(registry!!.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
        }
    }
}

I' ve spend around 2 hours to fix this. Thanks a lot. You saved mine time.

@giorgio79 Did you find a solution yet for this ?

Update: based in another plugin that I'm using in another app, I'm ussing this code for handle background message in kotlin... I don't know is better than stackoverflow answer, but works.
Application.kt
package your.app.package

import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin
import io.flutter.view.FlutterMain
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService

class Application : FlutterApplication(), PluginRegistrantCallback {

    override fun onCreate() {
        super.onCreate()
        FlutterFirebaseMessagingService.setPluginRegistrant(this);
        FlutterMain.startInitialization(this)
    }

    override fun registerWith(registry: PluginRegistry?) {
        if (!registry!!.hasPlugin("io.flutter.plugins.firebasemessaging")) {
            FirebaseMessagingPlugin.registerWith(registry!!.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
        }
    }
}

I' ve spend around 2 hours to find fix for this. Thanks a lot. You saved me.

Buddy, you saved my day.

@giorgio79 , I struggled with this for many hours. Even the above solutions didn't work for me. Finally found a way solve this. Here is how I managed to fix this.

Change AndroidManifest.xml name properties as below.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app">
    <application
        android:name=".Application">
           <activity
            android:name=".MainActivity">
           </activity>
    </application>
</manifest>

Empty MainActivity.kt file as below.

package com.example.app

import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant

class MainActivity: FlutterActivity() {}

Add FirebaseCloudMessagingPluginRegistrant.kt file in same directory.

package com.example.app

import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin

object FirebaseCloudMessagingPluginRegistrant {
    fun registerWith(registry: PluginRegistry?) {
        if (alreadyRegisteredWith(registry)) {
            return
        }
        FirebaseMessagingPlugin.registerWith(registry?.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"))
    }

    private fun alreadyRegisteredWith(registry: PluginRegistry?): Boolean {
        val key: String? = FirebaseCloudMessagingPluginRegistrant::class.java.canonicalName
        if (registry?.hasPlugin(key)!!) {
            return true
        }
        registry.registrarFor(key)
        return false
    }
}

Add Application.kt file in same directory.

package com.example.app

import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService

class Application : FlutterApplication(), PluginRegistrantCallback {
    override fun onCreate() {
        super.onCreate()
        FlutterFirebaseMessagingService.setPluginRegistrant(this)
    }

    override fun registerWith(registry: PluginRegistry?) {
        FirebaseCloudMessagingPluginRegistrant.registerWith(registry)
    }
}

You have to update the AndroidManifest.xml as well.
-        android:name="io.flutter.app.FlutterApplication"
+        android:name=".Application"

and add:
            <intent-filter>
                <action android:name="FLUTTER_NOTIFICATION_CLICK" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

inside the <activity tag.

thanks a lot @hectorAguero and @hpadrao ,
i misstype changing android:name --> .Application inside activity instead of android:name inside application tag.

Totally lost with Kotlin implementation. This issue has been open for 5 months. We need an immediate solution.

@giorgio79 , I struggled with this for many hours. Even the above solutions didn't work for me. Finally found a way solve this. Here is how I managed to fix this.

Change AndroidManifest.xml name properties as below.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app">
    <application
        android:name=".Application">
           <activity
            android:name=".MainActivity">
           </activity>
    </application>
</manifest>

Empty MainActivity.kt file as below.

package com.example.app

import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant

class MainActivity: FlutterActivity() {}

Add FirebaseCloudMessagingPluginRegistrant.kt file in same directory.

package com.example.app

import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin

object FirebaseCloudMessagingPluginRegistrant {
    fun registerWith(registry: PluginRegistry?) {
        if (alreadyRegisteredWith(registry)) {
            return
        }
        FirebaseMessagingPlugin.registerWith(registry?.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"))
    }

    private fun alreadyRegisteredWith(registry: PluginRegistry?): Boolean {
        val key: String? = FirebaseCloudMessagingPluginRegistrant::class.java.canonicalName
        if (registry?.hasPlugin(key)!!) {
            return true
        }
        registry.registrarFor(key)
        return false
    }
}

Add Application.kt file in same directory.

package com.example.app

import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService

class Application : FlutterApplication(), PluginRegistrantCallback {
    override fun onCreate() {
        super.onCreate()
        FlutterFirebaseMessagingService.setPluginRegistrant(this)
    }

    override fun registerWith(registry: PluginRegistry?) {
        FirebaseCloudMessagingPluginRegistrant.registerWith(registry)
    }
}

Esta es la solucion al problema. A mi me funcion perfectamente. No me habia dado cuenta que no tenia los archivos en un mismo directorio. Espero que esto le sirva a otras personas.

This took me a while to figure out but here is a working solution:
You'll need two files in the SAME directory as your MainActivity.kt. The two files:
MainActivity.kt
This file will stay the same.
package com.example.app

import io.flutter.embedding.android.FlutterActivity

class MainActivity: FlutterActivity() {
}

Application.kt
package com.example.app

import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin
import io.flutter.view.FlutterMain
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService

class Application : FlutterApplication(), PluginRegistrantCallback {

    override fun onCreate() {
        super.onCreate()
        FlutterFirebaseMessagingService.setPluginRegistrant(this);
        FlutterMain.startInitialization(this)
    }

    override fun registerWith(registry: PluginRegistry?) {
        if (!registry!!.hasPlugin("io.flutter.plugins.firebasemessaging")) {
            FirebaseMessagingPlugin.registerWith(registry!!.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
        }
    }
}

You then need to update your AndroidManifest.xml to point at these two files. You do this like this:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app">
    <!-- io.flutter.app.FlutterApplication is an android.app.Application that
         calls FlutterMain.startInitialization(this); in its onCreate method.
         In most cases you can leave this as-is, but you if you want to provide
         additional functionality it is fine to subclass or reimplement
         FlutterApplication and put your custom class here. -->
         <!--
           <application
        android:name="io.flutter.app.FlutterApplication"
         -->
    <application
        android:name=".Application"
        android:label="example"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name=".MainActivity"
            android:launchMode="singleTop"

So, you've essentially replaced the application file and kept the main activity the same.
Don't forget
You need to drop this in the AndroidManifest.xml file as well within the activity tags.
<intent-filter>
                <action android:name="FLUTTER_NOTIFICATION_CLICK" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

I follow this doc and it works fine.
https://firebase.flutter.dev/docs/messaging/overview
firebase_core: ^0.5.1
firebase_messaging: ^8.0.0-dev.5
ps. I am using Flutter Android Embedding V2
Hope this helps.

I also moved my app from Kotlin to Java. Kotlin first development is a lie and we shouldn't rely on fancy announcements.

Deprecated doc killing many apps including mine. There r many solutions but I don't know which one should be final. Plz consider to update the doc

didnt read a lot of these posts, but i managed to get push working on an emulator, running a flutter build.
the main thing u gotta use is PlatformChannel, to call a method written in kt/java files from the flutter widget or flutter file.
u gotta setup the channel on both sides of the code, so flutter calls method using PlatformChannel and kotlin/java recieves the call.
i succesfully got a push message from the console on a flutter app.
the instructions provided online are OK but somewhat confusing with all the classes (somewhat bulky) u gotta use, especially if ure not experienced.

i have found the solution for this problem
first you have to create 2 files in the same directory of MainActivity.kt:
1- Application.kt:
`package <your package path e.g : com.bla bla bla .bla >
import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.plugins.GeneratedPluginRegistrant
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService
class Application : FlutterApplication(), PluginRegistrantCallback {
override fun onCreate() {
    super.onCreate()
    FlutterFirebaseMessagingService.setPluginRegistrant(this);
}

override fun registerWith(registry: PluginRegistry?) {
    io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin.registerWith(registry?.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
}

}2- create FirebaseCloudMessagingPluginRegistrant.kt:package <your package path e.g : com.bla bla bla .bla >
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin
object FirebaseCloudMessagingPluginRegistrant {
fun registerWith(registry: PluginRegistry?) {
if (alreadyRegisteredWith(registry)) {
return
}
FirebaseMessagingPlugin.registerWith(registry?.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"))
}
private fun alreadyRegisteredWith(registry: PluginRegistry?): Boolean {
    val key: String? = FirebaseCloudMessagingPluginRegistrant::class.java.canonicalName
    if (registry?.hasPlugin(key)!!) {
        return true
    }
    registry.registrarFor(key)
    return false
}

}`
3- then modify MainActivity.kt to look like:
`package <your package path e.g : com.bla bla bla .bla >
import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant
class MainActivity: FlutterActivity() {
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
}
}
`
4- reference MainActivity.kt and Application.kt in Androidmainfest.xml file:
a- <application         android:name="com.blablabla.Application"
b-<activity android:name="com.blablabla.MainActivity"

Documentation needs urgent updating, still no official Kotlin example despite Flutter overtaking the industry!

PluginRegistrantCallback

Not working again.
"PluginRegistrantCallback" is deprecated now. Any solution?

I have just updated flutter 2 and write the below code and it works for me
package com.flutter.yourPackageName
import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.view.FlutterMain
import io.flutter.plugins.firebase.messaging.FlutterFirebaseMessagingBackgroundService;

class Application : FlutterApplication(), PluginRegistrantCallback {

    override fun onCreate() {
        super.onCreate()
        FlutterFirebaseMessagingBackgroundService.setPluginRegistrant(this);
        FlutterMain.startInitialization(this)
    }

    override fun registerWith(registry: PluginRegistry?) {
    }
}

PluginRegistrantCallback

Not working again.
"PluginRegistrantCallback" is deprecated now. Any solution?

I have just updated flutter 2 and write the below code and it works for me
package com.flutter.yourPackageName
import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.view.FlutterMain
import io.flutter.plugins.firebase.messaging.FlutterFirebaseMessagingBackgroundService;

class Application : FlutterApplication(), PluginRegistrantCallback {

    override fun onCreate() {
        super.onCreate()
        FlutterFirebaseMessagingBackgroundService.setPluginRegistrant(this);
        FlutterMain.startInitialization(this)
    }

    override fun registerWith(registry: PluginRegistry?) {
    }
}

https://github.com/transistorsoft/flutter_background_fetch/issues/127#issuecomment-643795427
Please check out this answer, here this dude is saying that we no longer need custom .Application class. I follow him and the issue now get resolved.

Update: based in another plugin that I'm using in another app, I'm ussing this code for handle background message in kotlin... I don't know is better than stackoverflow answer, but works.
Application.kt
package your.app.package

import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin
import io.flutter.view.FlutterMain
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService

class Application : FlutterApplication(), PluginRegistrantCallback {

    override fun onCreate() {
        super.onCreate()
        FlutterFirebaseMessagingService.setPluginRegistrant(this);
        FlutterMain.startInitialization(this)
    }

    override fun registerWith(registry: PluginRegistry?) {
        if (!registry!!.hasPlugin("io.flutter.plugins.firebasemessaging")) {
            FirebaseMessagingPlugin.registerWith(registry!!.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
        }
    }
}

It works 🤩🤩

@giorgio79 , I struggled with this for many hours. Even the above solutions didn't work for me. Finally found a way solve this. Here is how I managed to fix this.

Change AndroidManifest.xml name properties as below.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app">
    <application
        android:name=".Application">
           <activity
            android:name=".MainActivity">
           </activity>
    </application>
</manifest>

Empty MainActivity.kt file as below.

package com.example.app

import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant

class MainActivity: FlutterActivity() {}

Add FirebaseCloudMessagingPluginRegistrant.kt file in same directory.

package com.example.app

import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin

object FirebaseCloudMessagingPluginRegistrant {
    fun registerWith(registry: PluginRegistry?) {
        if (alreadyRegisteredWith(registry)) {
            return
        }
        FirebaseMessagingPlugin.registerWith(registry?.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"))
    }

    private fun alreadyRegisteredWith(registry: PluginRegistry?): Boolean {
        val key: String? = FirebaseCloudMessagingPluginRegistrant::class.java.canonicalName
        if (registry?.hasPlugin(key)!!) {
            return true
        }
        registry.registrarFor(key)
        return false
    }
}

Add Application.kt file in same directory.

package com.example.app

import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService

class Application : FlutterApplication(), PluginRegistrantCallback {
    override fun onCreate() {
        super.onCreate()
        FlutterFirebaseMessagingService.setPluginRegistrant(this)
    }

    override fun registerWith(registry: PluginRegistry?) {
        FirebaseCloudMessagingPluginRegistrant.registerWith(registry)
    }
}

This works for me.
https://github.com/FirebaseExtended/flutterfire/issues/2311#issuecomment-659620636
Document said that: "If you are using Flutter Android Embedding V2 (Flutter Version >= 1.12) then no additional integration steps are required for Android."
But my flutter version 1.22.6,  firebase_messaging: ^7.0.3, cloud_firestore: ^0.14.4 still get this issue.
Thank you.

Hi there, any idea on how to do this with a FlutterFragmentActivity instead?

Official documentation is not specific to Java now so I'm closing this issue :)
@JaviCore feel free to open a new issue if you have issues.


iOS13 Compatibility

There are a few new warnings as a result of iOS13.
The main culprit seems to be...
'SecTrustEvaluate' is deprecated: first deprecated in iOS 13.0
Screenshots of the code with these warnings...

Any thoughts on this @acmacalister ? Its just generally much better to have no warnings in the code so that developers are able to spot new warnings during coding instantly without having to read through a list of existing warnings. Thanks.

Thanks for fixing this. Any idea when it will be pulled into master? Thanks.

@ddaddy any news for when this will be hitting master?

Sorry, I'm not the owner of this. I submitted the pull request but @acmacalister needs to pull it.

Ok cool. Will wait for @acmacalister to merge into master then.

There are 11 open pull requests open since 2015, and no commit on this repo for over 2 years. I'm guessing it's a dead repo.
Interestingly, Sonos just forked it: https://github.com/sonos/jetfire


Additional Sources

Feature Description
Not sure if it's already in your plans or not, but consider adding the (non-duplicate) sources contained in https://github.com/metafates/mangal-scrapers, such as AsuraScans and ComicK.
They seem to be ready to be imported and used by mangal.
Solution you would like
No response
Alternatives you have considered
No response
Additional context
No response

I don't plan to add more sources to Kaizoku itself. But you can mount any mangal scrapers to /config/.config/mangal/sources and use them.


Implement video input switching capability using Amiga hotkeys and master-slave communication between two FF_OSD enabled blue pills

Hi,
this will be a longer one, but bear with me!
I own one of those AA3000+ Amiga mainboards sold by user 'hese' on Amibay. I'm putting it into a Amiga 3000 case as it is supposed to.
While I want to equip the final setup with a FlashFloppy driven Gotek, I want to retain the original Amiga 3000 look. In particular, I don't want to alter the case in any way. So, FF_OSD controlled by the Amiga keyboard is the way to go.
The AA3000+ board has a built-in video switch that is able to switch the VGA output between two video sources. Usually one of those is the Amiga's AGA output and the other some kind of RTG card, in my case a 3DFX Voodoo3 PCI card.
I want to use the FF_OSD hotkeys to (a) switch between four Kickstarts as in the example in default_config.c by means of U0 and U1 and (b) to be able to manually advance the 3-position video switch to either "automatically" (1) switch between the two video sources or choose Amiga or RTG output manually. This should be accomplished by user pin U2 on the FF_OSD.
Also, I want the OSD to appear in both, the Amiga and the RTG output.
(1) Automatic switching is accomplished by a piece of software called switchcontrol. It monitors the state of the graphics driver and drives the serial port's CTS signal low as soon as RTG output is desired. For automatic switching to work, CTS has to be jumpered to the input signal of the video switch circuit. If the jumper is removed and the switch input is left floating (or driven high), the output is fixed to the Amiga signal, if switch input is driven low, the output is fixed to RTG. On the mainboard, there's a pin header that has
CTS - SWITCH_INPUT - SWITCH_INPUT - GND
Thus by connecting a on-off-on switch, you could switch between auto, Amiga, and RTG. One goal is to accomplish the same by a simple state machine driven by U2.
In an initial working setup, I use two Blue Pills, connected in parallel to the Gotek's I²C port. One, the "master" plugs into the Amiga input of the mainboard and connects to the keyboard. It also has U0 and U1 switching by hotkey enabled as in the ROM switching example and U2 as a momentary button driven high by F10 on the keyboard. This Blue Pill has A0-A1 jumpered.
The second, let's call it "slave", Blue Pill connects to the RTG input on the mainboard and does not have A0-A1 jumpered. This way, the "master" receives all the Amiga keyboard commands and is able to control the Gotek, while the "slave" only receives the Gotek's output.
In my final working breadboard draft, U2 of the "master" egde triggers an interrupt of a PIC12F629 (which I happened to have laying around from another project). The PIC has an output connected to SWITCH_IN and a second input connected to the CTS output of the Amiga. Each detected low-to-high-edge of U2 advances the following state machine:
1 (Initial): Mirror CTS on SWITCH_IN (=automatic mode)
2: Switch output to input mode to simulate an open drain in high impedance (=Amiga)
3: Pull output low (=RTG mode)
-> back to 1

To illustrate, here's my test setup (without the PIC12F629)

Rev. 0.2 of the "master board" integrates the PIC circuitry (and also has the cutout for the Blue Pill's oscillator corrected :-)

And here's a rendering of the much simpler "slave board"

While this setup works well enough, it has some drawbacks:
(1) It uses two Blue Pills where only one might be necessary, given H- and V-Sync can be provided twice independent from one another, and SPI1 and SPI2 can be used as outputs simultaneously, one for RTG the other for Amiga GFX.
(2) The PIC is very much of an overhead, because one additional input on the Blue Pill for CTS would suffice to implement the state machine therein. I just didn't like the idea of choosing one arbitrarily and starting to maintain my own fork of FF_OSD with this additional state machine. ;-)
(3) The "slave" Blue Pill doesn't know anything about the Amiga keyboard. Thus, all the output associated with hotkeys is only visible while Amiga graphics input is chosen. In addition, only the "master" has the nice multi-line output that is triggered by jumpering A0 and A1.
So, the logical idea would be to consolidate all of this into a single Blue (or, if Blue is not powerful enough) Black Pill.
On a side note, this setup would be interesting for people using the so-called "Ratte-Switches" for switching between Amiga and RTG output and perhaps for other scenarios where you don't need the switching but have two different video outputs on the same machine.
Much of this behaviour could be made accessible through the configuration menu I guess (well, a man can dream... ;-)
@keirf What do you think about this proposal? Does it have the slightest chance of being possible to implement?

I don't think it would be easy to drive two OSD outputs simultaneously, but switching between VGA and AGA modes on PA7 and PB15 respectively is more plausible. Do you need H/V syncs for both? Would need care picking the second HSYNC pin. Perhaps PA9 as this is a spare channel on Timer1 (existing PA8 pin uses T1Ch1, so using T1Ch2 would be not too hard to implement). Unfortunately this collides with the serial pins (useful for debug) but serial could perhaps be done on UART2 on pins PA2 and PA3.
In summary:

Two built-in flash configurations. One for VGA, one for AGA.
Hotkey to switch between the configurations.
A bit of pin remapping for VGA so that independent Sync pin inputs are used, eg. H=PA9, V=PA11.

A further complication on (2) is that full mode switch usually requires a reset of the Blue Pill. Just because that's easier to implement and mode switches would usually be rare. So might need to fix that, or remember some state across reset.

Do you need H/V syncs for both? Would need care picking the second HSYNC pin.

I guess so, yes. Both, AGA and RTG cards usually need H- and V-Sync. One can switch jumper the AGA output to do sync-on-green, but my guess is that this would further complicate things instead of helping...

Perhaps PA9 as this is a spare channel on Timer1 (existing PA8 pin uses T1Ch1, so using T1Ch2 would be not too hard to implement). Unfortunately this collides with the serial pins (useful for debug) but serial could perhaps be done on UART2 on pins PA2 and PA3.
Yes, that sounds plausible, while keeping in mind that UART2 is 3.3V only and people need to be warned not to connect 5V USB-UART adapters to it.

In summary:

Two built-in flash configurations. One for VGA, one for AGA.
Hotkey to switch between the configurations.
A bit of pin remapping for VGA so that independent Sync pin inputs are used, eg. H=PA9, V=PA11.

A further complication on (2) is that full mode switch usually requires a reset of the Blue Pill. Just because that's easier to implement and mode switches would usually be rare. So might need to fix that, or remember some state across reset.

Thinking aloud:
What if we keep the concept of using two separate blue pills, but implement some kind of communication between them. The idea would be to have a kind of master-slave setup, where the slave isn't even connected to the Gotek via I²C. Instead master and slave communicate via their UART interfaces with the master sending the slave the text to display on the OSD.
This would just be one additional config option (which defaults to master).
To not interfere with debugging/config, a kind of handshake upon cold reset could be initiated. I.e., after booting up, the master would send some "magical" sequence saying "I am master" in regular intervals while not in config mode. Once a slave sees that sequence on its RX, it responds with another sequence letting the master know that it is ready to receive text from now on.
Everything the slave receives on UART is henceforth displayed on its OSD...

Thinking even further, for this setup, even a config option might be overkill. A device could be set into slave mode by putting a jumper across SCL-SDA (or somewhere else, if that wouldn't work).

This is possible. It might be easier to use I2C2 on the master and communicate using I2C. This gives you some framing, for example. The slave wouldn't be easily configurable but I suppose you would set him up in master mode, and thenceforth he wouldn't need configuring. Configuration things like OSD box position wouldn't affect the slave unless I2C commands to do so were added...

Yes, I2C has the additional benefit of being a open drain bus by default, so - in theory - you could drive more than one slave from a single master. Can't think of a scenario where this would make sense, but you never know. ;-)
Anyway, for my current design, this would simply mean to routing I2C2 instead of I2C1 to the passthrough connector on the master PCB, which is easily accomplished.
What do you think about part 2 of my initial question - having that switching sequence of "mirror an input" - "high (impedance)" - "low". I can't think of a nice way to generalize this "state machine" approach other than having some kind of callback function attached to the hotkeys. Also, it would be nice to have an input pin we can agree on for such mirroring purposes. Ideally, this pin would be from the group of the five volt tolerant ones.

Oh, and I like the idea of being able to configure the slave through the master by I2C. :-)

Regarding the hotkey switch sequence, I'd probably hardcode it and give it a new name/id. Not troubled for Flash space so all sorts of things can be shoved in, really.
Now, with all this, I'm unlikely to just get on and implement it. I don't have time, and other projects take precedence. However it might be considered for inclusion in the upstream codebase, also external patchsets on this codebase aren't too scary as it basically never changes (I'm not really implementing new features).

One (hopefully) last thing before I start coding: I've had a look at the pinout and found that if I want to activate I2C2 for master-to-slave communication, I need B10 for that, which is currently assigned to U2. I'd move U2 to B12 then.
For the CTS input, I'd use A15. This already has a config option attached to it and is configured as an input. This would make the enable/disable function mutually exclusive to the video output switching, which makes sense to me.
I would have liked to take B13 for this, but this is the clock pin for SPI2.
In any case, I'd rather sacrifice some option than use a 3.3V only pin.
In the Amiga, much is done with pull-ups to 5V.
Do you agree, @keirf ?

Not much choice on use of B10 and B11. Either move U2 or disable it for this configuration.
Why use A15 for CTS? This pin is the DisplayEnable output for when using an external tristate buffer for the video output: In this mode, instead of the output GPIO being tristate, the tristate function is implemented in external buffer which requires two signals: the output and the output-enable. Better pick another pin, there are spares even if you insist on 5v tolerance.
By the way pulled-up signals don't seem to kill the STM 3v3 pins, but of course those signals do get "pulled down" to 3v3. Gotek design has a bunch of signals like this. It does basically work, even if not ideal.

I misunderstood the purpose of A15. Thought it was an input to enable/disable the OSD, not the display...
What other 5V tolerant spare pin do you see? I don't want to repurpose any of the 3 user outputs, since I want to have the ability to switch between 4 Kickstart ROMs and need the 3rd pin to do the actual switching between the AGA and RTG outputs.
On the PIC, whose pins don't tolerate 5V at all, when the PIC itself has a VDD of 3.3V, I used a simple voltage divider in front of the input, feeding about 3V into the PIC.
Thus, in case I've not overlooked an unused 5V tolerant pin, I think I'll go down this route to be on the safe side.

Hmm, A12 seems a good candidate...

Yes: https://github.com/keirf/FF_OSD/blob/master/attic/pins.md

@keirf Just a request for comments: https://gist.github.com/tkurbad/1bdedc8757e1fb1730230057b1ea061a holds a patch that implements the video switch functionality as described. There's also a start of master-slave communication, namely a op(eration)_mode, configurable as "Master" or "Slave".
Before I'm going down the rabbithole of I2C host mode on the STM32, I just want your opinion on the code and whether I can keep it styled that way. C isn't my native language when it comes to programming (I'm more of a Python guy), so I'm often unsure whether there might be much simpler or more efficient ways to do things.
I'd appreciate if you might have a quick look.
Thank you very much!

On a side note, I just realized two things: The I2C communication to the slave blue pill is just a very simplified version of what FF does towards FF_OSD. This should be easily adopted.
Also, this could be the solution to issue #38...

Thanks I will try to find some time to take a look a your gist!

Style looks okay. I will have to think about how to deal with relocating U2. Unfortunately the existing pinout is baked into some FlashFloppy+OSD board designs. Probably it needs to be configurable, at run- or compile-time. Indeed this will probably live on a branch, and we can do some test builds and solicit some feedback from the community.

Thanks for the comment.
I'm d'accord with this stuff living in a branch. Besides the relocation of U2, driving I2C2 makes the code a bit convoluted and adds unnecessary complexity to the standard case of having a one-on-one connection between the Gotek and a FF_OSD blue pill.
That said, I'm now done with copying most of the I2C master stuff from the FlashFloppy code and reducing it to a more simple version that can only drive a slave FF_OSD (but no LCD, OLED or whatever). The code compiles but still needs a lot of love.
While looking at the I2C master stuff, I came to think that the differentiation between master and slave via config is not necessary at all. A device will act as master if it successfully probes another FF_OSD on its I2C2 port. If there's nothing there, no transfers will occur and the overhead introduced by the I2C2 initialisation will be minimal.
Independtly of I2C I've ran into an issue with the video input switching:
If I do a complete switching sequence of Auto -> Amiga -> RTG -> Auto, then when the Amiga display returns, the OSD backlight box still displays and resizes correctly, but no text is shown in the box. Do I have to do some kind of reinitialization after each switch? Can you give me hint what's probably going on, @keirf?

Mode switches have so far required a full Blue Pill reset, so doing the switches without reset is sure to require some reinitialisation which has not so far been considered.

Mode switches have so far required a full Blue Pill reset, so doing the switches without reset is sure to require some reinitialization which has not so far been considered.

This is somewhat mysterious nonetheless. I did some testing, rearranging the videoswitch_ functions on the go.
Observations:

The Blue Pill stays connected to the Amiga signal and is fed the Amiga's H- and V-sync regardless of what source is passed through to the VGA output connector of the machine. IMHO there isn't any mode switch happening.
After optimizing the videoswitch_ functions, it was hard to still reproduce the behavior, but after about 10 switching round trips, the problem reappeared. To re-iterate: I can see a correct OSD backlight box, but no text.
Resetting the pill for sure sets things back in order - but also loses the current state of the videoswitch obviously.
One time, after switching back to the Amiga input, I could briefly see the OSD text and then the box contents disappeared

Wild assumption:
The problem occurs if the videoswitch operation interferes with the sync/display timer interrupt(s)...
Possible solutions:
(a) Further reduce the footprint of the videoswitch_ functions
(b) Disable the display interrupt(s) while doing the switching
(a) Is hard to achieve without hardwiring the things that are configurable at the moment, e.g. the pin that drives the video switch
(b) Well, I don't know what hell would break loose ;-)

Or reset but keep some state in ram that you pick up after reset. Probably disabling interrupts at bottom of screen is easiest if you can work out how to do that

I investigated further:
Wenn manually (i.e. by external jumper/switch) switching to RTG mode and back, nothing bad happens. The OSD runs on and on unimpressed.
The issue only surfaces if the OSD box size changes during or shortly after the switch due to the box contents changing.
Will look into the way I do the display notification during switching first before looking at reset/interrupt.

Took me a while to find out, but the disappearing OSD is seemingly a pre-existing bug and it only affects non-15kHz Screens.
To replay try the following: Set up an Amiga with FF_OSD 1.9. Hook it up to the output of a flicker fixer. Start up the Amiga, enter the early startup menu. Hit CTRL-ALT-Del to turn the OSD off and back on again. You will most likely see one of the following:

no OSD at all
OSD background boxes without text

Pressing the reset button on the blue pill brings back the OSD, but it will crash again if CTRL-ALT-Del is used.
The OSD on/off output is done in a different way when the user hotkey outputs, i.e. by snprintf instead of memset..strcpy.
For the OSD display that shows the videoswitch state, I copied the snprintf method and got the same behaviour.
I think I'll try the memset/strcpy method instead and see what happens...
Most probably after Christmas. ;-)

Think I found the fix. Will be in the final PR. Merry Christmas!

I think I'm getting somewhere...

Coming along!

Solution implemented in PR #47


can't import ppca

In [1]: from ppca import PPCA
-----------------------------------------------------------
ModuleNotFoundError       Traceback (most recent call last)
<ipython-input-1-e861ede3f408> in <module>
----> 1 from ppca import PPCA

~/anaconda3/envs/red/lib/python3.6/site-packages/ppca/__init__.py in <module>
----> 1 from _ppca import PPCA

ModuleNotFoundError: No module named '_ppca'

please help me if you watch it

Installing from Github directly worked for me; the version on pip seems to be out of date and not working with Python 3.x

ok，I have solved it ,thanks @RichardWarfield

I pushed a new release to PyPi (0.0.4) that works with Python3 so you should be able to pip3 install -U ppca now


[WIP] 11.2 Convexity

Job d2l-zh/PR-915/1 is complete.
Check the results at http://preview.d2l.ai/d2l-zh/PR-915/

Job d2l-zh/PR-915/2 is complete.
Check the results at http://preview.d2l.ai/d2l-zh/PR-915/

Job d2l-zh/PR-915/3 is complete.
Check the results at http://preview.d2l.ai/d2l-zh/PR-915/

Preview check done:

cite, numref
math
forum links added

Job d2l-zh/PR-915/4 is complete.
Check the results at http://preview.d2l.ai/d2l-zh/PR-915/


Interpolating Undefined Data Points Results in NaN Values on Y-Axis

Description
I'm experiencing an issue with the latest version when rendering a LineChart that includes undefined data points. The Y-axis displays 'NaN' instead of the expected numerical values when I set a yAxisOffset, which is necessary for my use case. However, if I remove the undefined data points or the yAxisOffset, the Y-axis values render correctly.
Code
<LineChart
            data={data}
            // x and y axis
            xAxisLabelTextStyle={{ color: "#64748B", width: 46, textAlign: "right", position: "absolute", right: -6 }}
            xAxisThickness={0}
            yAxisSide={yAxisSides.LEFT}
            yAxisLabelWidth={30}
            yAxisTextStyle={{ color: "#64748B" }}
            yAxisThickness={0}
            yAxisOffset={minWeight - 5}
            color="#4A90E2"
            spacing={50}
            initialSpacing={40}
            endSpacing={20}
            showVerticalLines
            verticalLinesColor="rgba(0,0,0,0.1)"
            rulesColor="rgba(0,0,0,0.1)"
            rulesType="solid"
            showValuesAsDataPointsText={false}
            customDataPoint={() => {
              return <View className="h-3 w-3 rounded-full border-[2px] border-blue-600 bg-white" />;
            }}
            focusEnabled
            interpolateMissingValues={true}
            pointerConfig={{
              hidePointerForMissingValues: true,
            }}
          />

Screenshot

data example
const data = [
    { label: "25 nov.", value: 70 },
    { label: "26 nov.", value: 74 },
    { label: "27 nov.", value: undefined },
    { label: "28 nov.", value: undefined },
    { label: "29 nov.", value: undefined },
    { label: "30 nov.", value: undefined },
    { label: "01 dic.", value: 83 },
  ];

Steps to reproduce
mentioned in the description section.
Snack or a link to a repository
No response
version of react-native-gifted-charts
1.4.47
React Native version
0.76.5
Platforms
iOS
Workflow
Expo Dev Client

it was my fault 😅 since sometimes minWeight was undefined, it was breaking the yAxisOffset. Closing this! but I'll open a new one for the ts error I commented above


Add alternative network scores

Adds two new networks scores based on betweenness
Even if these turn out to be less useful than the original score, I think this code is useful as using them is optional, and there is some other tidying included here
Closes #126

If https://github.com/johnlees/pp-sketchlib/issues/46 is quick, this could also be added here

If https://github.com/johnlees/pp-sketchlib/issues/46 is quick, this could also be added here

May be best to add #147 here

May be best to add #147 here

Check weighted betweenness is still working

Check weighted betweenness is still working

Check weighted betweenness is still working

Fixed in 89c1252

Check weighted betweenness is still working

Fixed in 89c1252


Log APIExceptions

Since we're (AFAIK) the only users of our API, any APIExceptions will be caused by mistakes in our JS code, so we should log these.

Are we now doing this @inglesp ?

We're probably not the only users of our API.  (And the JS code is much better tested than it was.)


xPackage: RunAsCredential Parameter Removed

It appears that in the v<IP_ADDRESS> release, the RunAsCredential has been removed. This breaks installations on WMF 4 where the PsDscRunAsCredential is not supported :disappointed:.
@kwirkykat is there any particular reason that this has been removed (before I look at adding it back in)?

@iainbrighton Sorry :persevere: I messed this up in the resource merge. My bad. RunAsCredential should be added back to xPackage for WMF 4 support.
I can fix it over this weekend unless someone else can get to it faster.

No worries. I'm happy to submit a PR for this as it's impacting us? Not sure I'll get to it over the weekend though!

@kwirkykat I'm happy to pick this up with #221 if you want?

@iainbrighton Sure. Thanks :smile:


Support module resolution which preserves symlinks (--preserve-symlink option in Node >= 6.3.0)

I'm submitting a feature request
I think it would be useful (even if not have this the default behaviour) to be able to preserve symlinks when doing module resolution.
This should function the same as in Node >= 6.3.0 with --preserve-symlinks enabled. To quote docs on that:

The --preserve-symlinks command line flag instructs Node.js to use the symlink path for modules as opposed to the real path.

More info in Node.js docs.

I could not get this to work, but before I open an issue, @andreypopp do you have a sample project showing this feature working ?

@sokra Could we get a backport to<EMAIL_ADDRESS>create-react-app depends on<EMAIL_ADDRESS>which depends on<EMAIL_ADDRESS>and when installing with pnpm to a global symlinked store (the fastest way to install deps currently and what yarn may support eventually).

@andreypopp, I am not sure, but has this been addressed?  resolve and resolveLoader didn't help i am afraid with my npm linked module which has two peer dependencies. I am still getting module error not found


bump: release v1.2.0

Will we include #434 and #433 in this PR? or They will be another PR.

They are cherry picked and included in this PR.


Conservative Loss Calculations at combo.py Line 181 and cql.py Line 150

During conservative loss calculations, a potential error has been identified in the following code snippets:

combo.py at Line 181
cql.py at Line 150:

next_obs_pi_value1, next_obs_pi_value2 = self.calc_pi_values(tmp_next_obss, tmp_obss)

Proposed Correction:
next_obs_pi_value1, next_obs_pi_value2 = self.calc_pi_values(tmp_next_obss, tmp_next_obss)

I might be wrong or misinterpret this as well. Could someone confirm if this change is necessary for accurate implementation?

Actually, the first (original) implementation is a correct implementation (Original CQL impl. also samples the actions from next observations for q value of current observation).
When I used the second implementation, I got lower result (95 -> 60 normalized score in hopper-medium-v2).
Maybe it is because it is same as 2 * self.calc_pi_values(tmp_obss, tmp_obss) in average.

During conservative loss calculations, a potential error has been identified in the following code snippets:

combo.py at Line 181
cql.py at Line 150:

next_obs_pi_value1, next_obs_pi_value2 = self.calc_pi_values(tmp_next_obss, tmp_obss)

Proposed Correction:
next_obs_pi_value1, next_obs_pi_value2 = self.calc_pi_values(tmp_next_obss, tmp_next_obss)

I might be wrong or misinterpret this as well. Could someone confirm if this change is necessary for accurate implementation?

Sorry for my late reply! As explained by GGOSinon, Original CQL implementation samples the actions from next observations for q value of current observation so the first implementation is right. If you use the second implementation, it is equivalent 2*self.calc_pi_values(tmp_obss, tmp_obss) in average.


A large number of values are not transferred from PLC to iobroker

A large number of values are not transferred from PLC to iobroker.
No problem if the number of values are 64 (driver in "debug" level) - I did not detect losses during transmission.
But if you pass 82 values, then some of the values are not transferred (nothing in iobroker debug logs for updated values from PLC).

I found that in the "debug" level of the driver in iobroker, the transfer of values is stable (64 values). In the "info" level (64 values), not all values are transferred from PLC to the ioBroker.
P.S. I use TC2, beckhoff CX9000.

When i take a look on the Code from the Adapter i see no Reason why i should have these Borders on this Side. Maybe it´s a Boarder of the Twincat 2 System? 64 is a special Number it´s not really Bug like -> Maybe there are some Settings in Twincat 2 System?

One thing i can see is that when on the NOTIFY Registration an Error occure -> This error not write to log. I change this behavior this evening and push a new Version to NPM.

It´s per Design impossible that the Log-Level has any impact to the functionality of the Adapter. When u have seen this behavior then it was only coincidence.

You should be able to install the Version 1.0.3 over the latest Repo in ioBroker. Hopefully you can see yet maybe some Problem when u run the Adapter in Debug Mode. I make Today a Test with 80 Variables and i have no Problem. It was on TwinCat 3 but for the Adapter and the ADS Protocol there is no difference. Maybe there is a Problem with TC2 (Functionality or Settings) but i'm sorry i can't help you with that, because i have not much experince with TC2.

Now (ver 1.0.3) I got  logs with random values. All values have data on PLC (BOOL or REAL):
beckhoff.0 | 2019-07-30 19:58:08.445 | warn | Subscription for: .IOBROKER.M10T1 occure an Error: undefined
beckhoff.0 | 2019-07-30 19:58:08.435 | warn | Subscription for: .IOBROKER.M9T2 occure an Error: undefined
beckhoff.0 | 2019-07-30 19:58:08.435 | warn | Subscription for: .IOBROKER.M9T1 occure an Error: undefined
beckhoff.0 | 2019-07-30 19:58:08.435 | warn | Subscription for: .IOBROKER.M8T2 occure an Error: undefined
I don't understand reason for  "Error undefined"  (and these values  not synced from PLC)...

Unfortunately i have in Version 1.0.3 a Typo. But on the other Side on a short Test the Error Message is yet also not really better '... Error: Error'.
I have a Question when u try it again always the same Variables have the Error or it's random?
I don't understand what the Problem is or what the Problem can be ... On my actual Standpoint i can only say that i don't think that is a Problem from the Adapter -> A Number of Variables working fine with your PLC -> And i can not see anything on Adapter that could have a Problem with the amount of Variables especially when it works with big amounts on other PLC's.
Maybe you should ask the Beckhoff Support? Maybe there is some Reason that not more Variables can be subscribed.
I'm sorry that i can't help you in these Case ...

Closed ... Nothing to do at this Time ... Feel free to reopen it when u have new Things to discuss


Update Footer.jsx

Issue Title: Automatic copyright
resolve issue: #341
Updated PR #349
Type of change ☑
What sort of change have you made:

[ ] Bug fix (non-breaking change which fixes an issue)
[ ] New feature (non-breaking change which adds functionality)
[x] Code style update (formatting, local variables)
[ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
[ ] This change requires a documentation update

Checklist: ☑

[x] My code follows the guidelines of this project.
[x] I have performed a self-review of my own code.
[ ] I have commented my code, particularly wherever it was hard to understand.
[ ] I have made corresponding changes to the documentation.
[x] My changes generate no new warnings.
[ ] I have added things that prove my fix is effective or that my feature works.
[ ] Any dependent changes have been merged and published in downstream modules.

How Has This Been Tested? ⚙
Describe how have you verified the changes made.
@singodiyashubham87 Please review this PR

@dishathakurata Well Done, Keep contributing :)

@singodiyashubham87 Thank you so much
Please add suitable level tag, otherwise my points won't be added.

@dishathakurata According to the guidelines given to the PAs, we are not allowed to give any level labels to any PR which have a minute change like this one. Therefore gssoc is the only label, I can assign. It will be counted as 1 Point.

@singodiyashubham87 Okay, thank you


Idea/Suggestion - Generate Code - HTTP File with Variables

Again I want to praise this plugin. I use it all day every day and is amazing!!!
One idea that you may consider.
When you "Generate code" it would be really cool/helpful if there was another option to generate an HTTP file with all the variables substituted that I can execute. It seems the HTTP syntax cannot be executed by HTTPYac.
Here is my use case.
On my local machine, I often have all sorts of .env files and different HTTP files. However, my local machine often does not have connections to the target HTTP servers due to network restrictions at different clients. I often go into bastion hosts/vms that have vscode installed but don't have all my .env files and other config that httpyac will pull in from my local machine. I often use the "Generate Code" --> HTTP. However, the HTTP syntax does not seem to be able to be executed directly by HTTPYac and requires some manipulation (adding https:// and moving the hostname header value to the URL). So I am thinking here if there was another template that was similar to the http code generation but that puts in the full URL. This way I can just copy and past the http file and put it in the bastion host and run it.  I have tried the curl and it sometimes does not work in httpyac.  At the time of writing I don't recall the issue I was having but I will loop back.

@chrismalek I solve the problem by using SSH port forwarding. Instead of installing/running httpyac directly on the server, I enable SSH port forwarding and configure a socks proxy and use my local setup directly.
ssh -D 1111 user@jumphost

# @proxy socks://<IP_ADDRESS>:1111
# @noRejectUnauthorized
GET https://securedserver:6443/openapi/v2

But to the actual question. What advantage over curl would it have to run httpyac on the server if there is no more variable substitution?

Often times port forwarding is not possible.  I often have to bastion into one machine then use another bastion machine to get access. This is RDP into RDP and I don't have control over these machines. Windows port forwarding not as easy.
I did some more testing. When I generate a curl command locally that I want to then execute in httpyac on some other machine the first generation generates something like this:
curl --request POST --url 'https://httpbin.org/anything'  --header 'Content-Type: text/xml'  --header 'From: blahbah'  --header 'OperationName: some-service'  --data '<?xml version="1.0" encoding="utf-8"?>
<request>
    <foo>bar</foo>
</request>'

When I put that in another VSCODE / HTTPYAC HTTP file and try to execute it, HTTPYac throws an error

So this is NOT "portable." This is why I have been falling back on http because it is less manual manipulation to get it to work. I remove hostname and move it to the URL. It is not the end of the world.  I am a heavy user so I am just looking for some efficiencies.  😃
If the curl would work as generated inside vscode at least it would be helpful. I can't tell if httpyac is interpreting the curl command incorrectly or if something is missing (or I am making a dumb mistake).
I have also had clients where I give them that curl command and it will not work. I think the line continuation character might be the culprit some times across different operating systems. Sorry I don't have all the detail here of all the different errors I could get.

By using curl I did mean to use it in cli. I did not implement curl parsing, as I have not understood the purpose. The parsing assumes that the first line is the url if no request method is detected (GET, POST, ...). Due to the variables, it is possible to write the URL in too many different ways to still filter out the false positives.
I can include an additional option that simply transfers all external variables to the file as well (except process.env). It only gets difficult with # @import and request body import (< ./payload.json).

I must be confusing the curl parsing with another plugin.  No wonder why is was not working. Lol.

vscode-restclient does support incomplete curl parsing. But this feature was not worth implementing for me so far.
I have now created a way to merge all executed Http Regions and variables together in one file. Maybe this will help you.

published with v5.6.2


Discrepancy between indices

As it stands, the app has four indices. The listings and ratings indices are properly marked as .json files but the followers, following indices, despite being JSON files, are not properly marked as .json files.

There is also a discrepancy between profile and listings. Listings (e.g. example.json) has .json but profiles are stored in a profile file without the .json extension.

If the followers will be paginated into several files, it may make sense for them to have a separate folder.

done


[FLINK-20860][core][config] Separate managed memory consumer DATAPROC into OPERATOR and STATE_BACKEND

What is the purpose of the change
Previously, DATAPROC represents both operators (batch) and state backends, assuming they never coexist in the same job.
To allow streaming operators to use managed memory, we break that assumption, thus need to separate DATAPROC into OPERATOR and STATE_BACKEND.
Brief change log

Rename ManagedMemoryUseCase#BATCH_OP to OPERATOR.
Separate consumer name DATAPROC into OPERATOR and STATE_BACKEND

Verifying this change
Update existing tests.

cc @wuchong @KarmaGYZ

cc @wuchong @KarmaGYZ


much better implementation of ProxyConnection

WDYT, @Sanne ?

nice, very readable.
Is there a real possibility for that IllegalStateException ?

Is there a real possibility for that IllegalStateException ?

I believe so, if you were to access the session in an illegal way.

I've added documentation explaining the issue with concurrent access to a ProxyConnection.
I'm going to merge this, because I think it's a clearly better implementation.