---
layout: default
---
Pfui User's Guide
Introduction
A brief introduction to the Pfui application and its purpose ...
Getting Started
Pfui application interface
GrammarView
Main menu
Toolbar
New, Open, Save
Cut, Copy, Paste
Parse
Using this view's grammar language, parse the input text and create a parse tree.
Transform
Transform the view's parse tree into a canonical form.
Generate
Create a file containing a serialized Grammar initializer, which can be used to make a parser for this view's language.
Run
open a new View, using this view's generated grammar as its language.
terminals and nonterminals
after parsing, shows the terminals and nonterminals discovered in the input.
editor area
standard text area for entering input to be parsed by the current language.
output area
shows the results of the most recent action. One of:
Partial Parse Trees view
shows all the parse sub-trees that were found.
Parse Trees view
shows the completed parse tree (if the grammar is ambiguous, there will be multiple parse trees).
Generated Grammar view
shows a table view of the generated Grammar class initializer, after transformations.
BNF Bootstrap grammar
When you start the Pfui application, or when you choose File->New, you'll be using the BNF bootstrap grammar. This is indicated in the title bar -- it'll say Pfui - BnfBootstrap. Here's the language it understands:
BNF = Rule* ;
Rule = Lhs /[:=]/ Rhs ";" ;
Lhs = Nonterm ;
Rhs = Sentences ;
Sentences = Sentence ("|" Sentences)* ;
Sentence = Item* ;
Item = Grouped Qualifier?
| Nonterm
| Literal
;
Qualifier = "*" | "+" | "?" ;
Grouped = "(" Sentences ")" ;
Nonterm = /[a-zA-Z_]+|<[a-zA-Z_]+>/ ;
Literal = /'((\\')|([^']))*'|"((\\")|([^"]))*"/ ;
A BNF grammar is a set of zero or more rules.
Literals are quoted, with either single or double quotes. Regular expressions are wrapped with forward-slashes. The assignment operator is either : or =; | separates alternatives. Parentheses express grouping; *, +, and ? represent zero or more, one or more, and zero or one.
Tokenizing the input
literals
Literals are wrapped in quotes -- either single tick or double-quote.
To include a quote character in a literal, use the single-quote mode.
Escaped quote characters are not yet supported.
regular expressions
Regexes are enclosed between a pair of forward-slash characters:
To include a forward-slash in a regular expression, escape it with a backslash:
SLcomment : /\/\/[^\r\n]*/;
Pfui regular expressions are implemented with Fan Regex, so any construct that is valid
in the underlying Fan rumtime should be okay here.
RegexLex tokenizer
Pfui input is tokenized according to the literals and regular expressions you provide.
In cases where the input could be tokenized in more than one way, Pfui uses Earliest-first,
longest-next as its algorithm. That is, at any point in tokenizing, the next token
will be the one whose start character occurs earliest; if two or more possible tokens
start at the same character, the longest is taken. Tokenizing then continues with the
next character after the end of the current token.
Characters which can't be matched by any token are currently ignored.
Out-of-band tokens
It's usually necessary to have a way to view the input stream differently, depending on
the context. For instance comments need to be ignored by a code-generating compiler,
but they need to be accessible to an editor. In Fan, Fandoc comments (groups of single-line
comments started with ** ) need to be passed through for inclusion in the
generated pod, but only when they occur in the proper spot.
Multi-line strings, and DSLs (domain-specific language blocks, inclusions of source to
an arbitrary language enclosed in <| ... |>, are passed unchanged
to the proper parser), need to be visible as a single token to the compiler, but should
be handled differently in an editor.
In ANTLR this is handled with channels, specifying that some token types are in a
hidden channel where they're accessible from code but invisible to the normal lex function.
I'm trying to avoid clogging up the grammar with special lexical considerations. Right
now Pfui creates a single lexical analyzer for a grammar, which can recognize all of the
token types inferred from the specified literals and regular expressions.
It's not a big step, though, to Grammar-directed tokenizing : since the lexical
elements are specified directly in the grammar, and since the Pfui parser knows (from its
FIRST sets) what it should expect at any point in the parse, it should be
straightforward to make the tokenizer return only tokens that are valid at the current
point in the parse.
More Later: Mary Had a Little LLama example.
The Earley Parser
Chart Parsers
the CYK algorithm
the Earley algorithm
PEP (Earley Parser)
Core classes
Refer to the Fandoc source code documentation for more detailed (that is, existing)
documentation of the PEP classes.
Grammar
BnfBootstrap
ParseTree
BnfParseTree
Category
Rule
DottedRule
Edge
Chart
EarleyParser
ParserListener
optionSet
parserSeeded
edgePredicted
tokenScanned
edgeCompleted
parseComplete
parseError
ParserEvents
TokenEvent
Generated when a token is scanned from the input stream.
EdgeEvent
Generated when an edge is added to the parser's chart: either a prediction or a completion
OptionEvent
A parser option was changed -- not used currently.
ErrorEvent
Should indicate a parse error.
ParserOptions
Creating a Grammar
Using your parser


Survey Form
Send a few personal data to unknown people. It's free, until it lasts!
Name:*
Email:*
Age:
From 1 to 5, how much do you trust unknown people on internet?:
Select one:
1
2
3
4
5
How likely is that you will share your credit card number?
Definitely
Maybe
Not sure
Tell us the name/s of your bank/s.
Rich Bank
Poor Bank
Wannabe Bank
Anything else of personal you want provide us...to let us know you better!
Submit


name: inverse layout: true class: center, middle, inverse --- # A Spotlight for developer relations @ github .footnote[by tom callaway
2020-05-27] ??? I made this! --- .center[![Total Eclipse of the Octocat](https://octodex.github.com/images/total-eclipse-of-the-octocat.jpg)] ??? There is no dispute. GitHub is the largest home for open source. But with over 50 million users and almost 40 million repositories, getting a project noticed can be challenging. --- layout: false .left-column[ ### Goals ] .right-column[ To gain momentum, early-stage open source projects need to: - find new users - find new contributors ] ??? Early-stage open source projects face a daunting challenge as they attempt to accomplish two fundamental goals: finding new users and finding new contributors. These goals are key to both the health and the growth of the project. --- .left-column[ ### Goals ### The Path ] .right-column[ - These goals are connected - No one contributes to an open source project they do not use.red[*] .footnote[.red[*] Okay, almost no one] ] ??? These two goals are tied to each other since virtually no one contributes to an open source project that they do not use personally. Over time, some users become “power users”, some “power users” become contributors, and some contributors become “top contributors”, eventually even maintainers. --- .left-column[ ### Goals ### The Path ### The Pyramid ] .right-column[ .center[
] ] ??? This evolution can be modeled as a pyramid. At each stage of the pyramid, some people will stay at the level they are at, but in a healthy project, a percentage of participants will move up over time. --- .left-column[ ### Goals ### The Path ### The Pyramid ### Simplified Problem ] .right-column[
New open source projects need to find new users to grow, but it is hard for them to stand out amongst the large numbers of projects on GitHub.
] ??? Understanding this allows us to simplify the problem statement to: New open source projects need to find new users to grow, but it is hard for them to stand out amongst the large numbers of projects on GitHub. --- template: inverse class: middle, center .center[ ![Screen capture of the GitHub Trending page](trending.png) ] ??? Traditionally, the burden of raising awareness of an open source project falls almost entirely onto the project, but GitHub does provide some tooling to assist them today. The concept of “stars” provides an indicator of the popularity (and possibly, usage) of a repository. While a large number of stars is a good metric for identifying a healthy open source project in a mature stage, this is not expected for an open source project in an early stage. Since a high star rating (per day) is important to being featured on the GitHub trending page, it is less likely that new open source projects will be found here. --- .left-column[ ### Our Objective ] .right-column[
# Help early-stage open source projects on GitHub to find and grow a user base. ] --- .left-column[ ### Our Objective ### Key Results ] .right-column[ * 30% growth in star count * 50% increase in clones and downloads * 20 new pull requests
Period: 3 months
] ??? Initially, I suggest a 3-month period for achieving these key results. --- template: inverse class: middle, center # GitHub Open Source
Spotlight Program .footnote[the idea] ??? GitHub, with help with volunteers from the wider open source community, will select some early-stage open source projects (that live on GitHub) to be promoted as Github Open Source Spotlight Projects. --- .left-column[ ### Promotion ] .right-column[ * A dedicated collection featuring the winners * A dedicated page for the program on github.com * Blog write ups of the project (including interviews from the maintainer(s) * Social media posts promoting the winning projects (not just reshares) * A graphical badge ] --- .left-column[ ### Promotion ### Focus Areas ] .right-column[ * Artistic/Creative * Gaming * Humanitarian * Infrastructure * Mobile * Scientific * Web Application ] ??? GitHub has an excellent infrastructure for enabling repositories to provide category metadata about their repository through “topics”. I suggest we take advantage of that, and choose several topics for this program (beyond “open source”) as focus areas. This list is obviously up for debate, and should be reinforced with metrics of which topics are popular before any launch-instance of the program. --- .left-column[ ### Promotion ### Focus Areas ### Hey, you forgot... ] .right-column[ There are any number of other focus areas that could be chosen: * Back End * Blockchain/Cryptocurrency * CI/CD * Cloud * Container * Database * Education * Embedded/IOT * Front End * Machine Learning * $PROGRAMMING_LANGUAGE * QE ] ??? This gives an idea of the strong potential this program can have across multiple technology categories. Initially, the program should start simple, with focus area categories that have minimal overlap, but are likely to have good applicants (both in quality and quantity). We can always evolve our focus areas over time. --- template: inverse class: middle, center # 5 x 7 = 35 .red[*] .footnote[.red[*]140 per year] ??? There should be at least five featured projects in each category per quarter (3 months). For the seven proposed focus areas, there would be 35 projects per quarter (and 140 per year). --- .left-column[ ### Opt-in ] .right-column[ .center[ ![Shadows of multiple hands raised as if to volunteer, in different colors](volunteer-2055010_640.png) .footnote[
Image by
Tumisu
from
Pixabay
] ] ] ??? Some projects may not want promotion. They may be content to be just as they are, and we should respect that. To be considered for inclusion in the OSSP, projects should opt-in. To start the application process, we should have projects complete a smart web form. I emphasize smart here, because we do not want this to feel like doing your taxes. This form should contain a checklist of the criteria for consideration, with as many of them auto-checked as possible. The GitHub API should be able to help us here. --- template: inverse class: middle, center ## The
Heart
of our Criteria
[![Screenshot of opensource.guide](opensource.guide.png)](https://opensource.guide/) ??? GitHub already has some great guides for Open Source Software, specifically everything at opensource.guide and the Building A Strong Community section in the GitHub Enterprise docs. These reference materials are excellent, and we want to encourage early-stage open source projects on GitHub to follow the advice they provide. By pointing to them explicitly, we not only guide people to them, but we also help projects know what we are looking for them to do well. --- .left-column[ ## Criteria ### - Qualified ] .right-column[ * GitHub account * Commit access to the project ] --- .left-column[ ## Criteria ### - Qualified ### - License ] .right-column[ * Project repo clearly (and correctly) marked with a valid open source license ] --- .left-column[ ## Criteria ### - Qualified ### - License ### - Topics ] .right-column[ * Project repo has a topic applied that matches our focus areas * If multiple, they should choose the one to be considered under ] ??? This refers to the GitHub topics feature. --- .left-column[ ## Criteria ### - Qualified ### - License ### - Topics ### - Stars ] .right-column[ *
Below
a certain threshold of stars * My best guess: 1000 ] ??? We are not trying to help already popular projects, so projects should be below a certain threshold of stars. (I’m honestly not sure what this threshold should be, my best guess is 1000, but even that may be too high or too low.) --- .left-column[ ## Criteria ### - Qualified ### - License ### - Topics ### - Stars ### - Function ] .right-column[ * The project needs to work. * Not perfect, not feature complete, just able to do something * Tell us what it can do today. * Include anything known to be missing/broken ] ??? The project needs to work. It doesn’t need to do everything or be perfect, but it needs to actually have function. This program is not about “idea” repositories that are hoping someone will show up and start actual creation. The project should be able to point to a revision, tell us what works (and what they know is missing/broken), and be judged on that. We will be forgiving, but only to a point. --- .left-column[ ## Criteria ### - Qualified ### - License ### - Topics ### - Stars ### - Function ### - Prepared ] .right-column[ Projects need to have: * A README.md of substance (e.g. word count) * A set of contributing guidelines * CONTRIBUTING * A code of conduct * CODE_OF_CONDUCT * How to get help * SUPPORT * Documentation beyond README * Does not need to be complete * An issue template * ISSUE_TEMPLATE * A pull request template * PULL_REQUEST_TEMPLATE ] --- .left-column[ ## Criteria ### - Qualified ### - License ### - Topics ### - Stars ### - Function ### - Prepared ### - Legal ] .right-column[ * Agree to the legal terms and conditions ] ??? This is a contest, at least legally. We need to get legal terms/rules/conditions created and have them agree to those terms here. --- ## Project Information * Ask smart questions that cannot be autogenerated, to be answered in the applicant's own words * Not essays, just a few sentences * Some suggestions * What is the purpose of your project? * How is it unique? * What features/functionality do you hope to add? (TODO) * Why do you want to be featured as a GitHub Open Source Spotlight Project? ??? This will give us a better sense of the project and also help craft messaging when the project is being promoted within the program, if accepted. --- .left-column[ ## Reviewing ### - Two-step ] .right-column[
Step 1: Internal review by Hubbers * Narrow pool to 20 per category
Step 2: Final review by Open Source category experts * Could be Hubbers, could be external * Chooses the final five ] --- .left-column[ ## Reviewing ### - Two-step ### - Scoring ] .right-column[
* 0-5 scale * 0 is "does not meet" * 5 is "a perfect example" * Scored in these categories * Functionality * Does it do what it claims to do? * Documentation * Was it present, clear, and useful? * Originality * Does this project do something new (or something old in a new way)? * Health Check * Does the current upstream seem active? * Are there recent commits? * Have existing issues been addressed/triaged? * Opportunities * Are there clear places for new folks to get involved? ] --- .left-column[ ## Reviewing ### - Two-step ### - Scoring ### - Teams ] .right-column[
* Divide out applications for review in groups * Take the average of the scores to determine top 20, then top 5. ] ??? The amount of people in the reviewing teams should reflect the scope of the work as much as possible, but it should not be too small to avoid burdening any single person, nor too big. The idea is to divide out the applications for review in groups, then take the average of the scores to determine the top 20, then 5 winners. We should consider some way of thanking reviewers (internally and externally) for their time. Possibly program-branded swag or some other item of reasonable monetary value. --- ## Measuring Success .red[*] * Star count after being featured * Number of repository clones * Number of repository forks * Number of release downloads * Number of new pull requests * Number of new issues opened * Number of additional unique contributors * Social media likes, reshares, and click-through percentages * Did this project make it to the Trending page? .footnote[.red[*] With data!] ??? All of these metrics should be done by count and percentage growth. It should be possible to automate their collection via GitHub API calls, and they should be generated at regular intervals to see how the impact of the program holds over time. While they go beyond helping to measure the initial Key Results, they help us to see a more complete picture of the impact of the program, as well as to inform future evolutions of our key results. --- template: inverse class: middle, center # TRANSPARENCY ??? Since open source requires transparency, we should post an annual report detailing the program’s metrics in aggregate (not per project, as we do not want this to have a negative effect on any featured projects which do not grow). --- ## Resources needed * Reviewers to look over submissions (internal and external) * Marketing resources to promote winners via web and social * Marketing resources to promote the program (to get applicants) * Creative resources to create a brand for this program * Technical resources to build and maintain the application form * Budget for branded swag --- ## Risks * We can’t do this because of legal restrictions * It’s more likely that there will be people in locales who are not eligible * No one applies * Very few projects apply (“the best of the worst”) * Too many projects apply (“so much hay!”) * Our promotional efforts do not have enough impact (“lighter fluid does not burn”) * We highlight a project and discover they’re stuck in an early stage of maturity due to their own unhealthy behavior (which they are unable or unwilling to correct) that our reviewers didn’t catch * Not enough people to review projects (either internal or external) --- ## Nice to haves * Program specific swag * Unique octocat sticker * Anything appropriate with the program branding * A cash stipend for the featured projects * Look to Google Summer of Code for guidance on how to manage this * Project demo in the GitHub booth at a major open source event * Provide funding for a project rep to attend the event and give their demo * Not the whole GH booth, just a featured area * Expand program from a quarterly recognition model to a more frequent recognition * Add an annual winner? * Create a community of applicants and engage them --- name: last-page template: inverse # Thank you! Slideshow created using [remark](http://github.com/gnab/remark).


Use the arrow keys to move your ship and the space bar to shoot.
About Blastar
Blastar was a game written by Elon Musk in 1984 (at the age of 12).
The source code was published in a magazine and he received $500 for it.
Ashlee Vance's Elon Musk:
Tesla, SpaceX and the Quest for a Fantastic Future includes a reproduction
of the page from the publication where it appeared. This version is based on that listing.
Elon has since moved beyond 8-bit spaceships.
"[It was] a trivial game... but better than Flappy Bird."
--Elon Musk (via WaitButWhy)


--- layout: post title: "Jesus is" subtitle: "Found in all" date: 2018-02-24 15:19:37 -0800 background: '/img/posts/13.jpg' comments: true ---
"The light shines in the darkness, and the darkness has not overcome it."
-John 1:5
Jesus is
Invigorating morning air in
The breath of a bird whistling to
Swirling mist condensing on
Blades of grass.
Golden rays breaking forest shade in
Warmth on the ground surrounding
Plants breaking boundaries of
Earth tinged with vitality in
The arrival of dawn.
Harmony immediate to
The peak of a mountain supported by
Shifting plates in restless communion with
The wanderer seeking
Creation's hidden valley.
Rolling waves of the ocean
Pushing forward to reach
A destination unseen yet palpably
Present in
The crashing of waves on
Opulent shores
Eternal.


Location: @Model.Location; Process ID: @Model.ProcessId
WelcomePage is a Visual Studio extension that automatically displays a welcome page when you open a solution.
For more details, see http://github.com/rlipscombe/vs-welcome-page
WelcomePage version @Model.Version


Add better support for tasks that accept arbitrary additional arguments (e.g. things like `bundle exec`)
Add stop_on_unknown_option!
Only strip from stdin.gets if it wasn’t ended with EOF
Allow “send” as a task name
Allow passing options as arguments after “–”
Autoload Thor::Group
Add enum to string arguments
Fix regression when destination root contains reserved regexp characters
Support strict_args_position! for backwards compatibility
Escape Dir glob characters in paths
Added print_in_columns
Exposed terminal_width as a public API
Fix Ruby 1.8 truncation bug with unicode chars
Fix shell delegate methods to pass their block
Don’t output trailing spaces when printing the last column in a table
Alias method_options to options
Refactor say to allow multiple colors
Exposed error as a public API
Exposed file_collision as a public API
Exposed print_wrapped as a public API
Exposed set_color as a public API
Fix number-formatting bugs in print_table
Fix “indent” typo in print_table
Fix Errno::EPIPE when piping tasks to `head`
More friendly error messages
Added CreateLink class and link_file method
Made Thor::Actions#run use system as default method for system calls
Allow use of private methods from superclass as tasks
Added mute(&block) method which allows to run block without any output
Removed config
Enabled underscores for command line switches
Added Thor::Base.basename which is used by both Thor.banner and Thor::Group.banner
Deprecated invoke() without arguments
Added :only and :except to check_unknown_options
Added :lazy_default which is only triggered if a switch is given
Added Thor::Shell::HTML
Added subcommands
Decoupled Thor::Group and Thor, so it’s easier to vendor
Added check_unknown_options! in case you want error messages to be raised in valid switches
run(command) should return the results of command
Methods generated by attr_* are automatically not marked as tasks
inject_into_file does not add the same content twice, unless :force is set
Removed rr in favor to rspec mock framework
Improved output for thor -T
Do not force white color on status
Yield a block with the filename on directory
Added a rake compatibility layer. It allows you to use spec and rdoc tasks on Thor classes.
BACKWARDS INCOMPATIBLE: aliases are not generated automatically anymore since it may cause wrong behavior in the invocation system.
thor help now show information about any class/task. All those calls are possible:
thor help describe thor help describe:amazing
Or even with default namespaces:
thor help :spec
Thor::Runner now invokes the default task if none is supplied:
thor describe # invokes the default task, usually help
Thor::Runner now works with mappings:
thor describe -h
Added some documentation and code refactoring.
Fixed some tiny issues that were introduced lately.
Setting global method options on the initialize method works as expected: All other tasks will accept these global options in addition to their own.
Added ‘group’ notion to Thor task sets (class Thor); by default all tasks are in the ‘standard’ group. Running ‘thor -T’ will only show the standard tasks - adding –all will show all tasks. You can also filter on a specific group using the –group option: thor -T –group advanced
Generic improvements
Improve Windows compatibility
Update (incorrect) README and task.thor sample file
Options hash is now frozen (once returned)
Allow magic predicates on options object. For instance: `options.force?`
Add support for :numeric type
BACKWARDS INCOMPATIBLE: Refactor Thor::Options. You cannot access shorthand forms in options hash anymore (for instance, options)
Allow specifying optional args with default values: method_options(:user => “mislav”)
Don’t write options for nil or false values. This allows, for example, turning color off when running specs.
Exit with the status of the spec command to help CI stuff out some.
Try to add Windows compatibility.
BACKWARDS INCOMPATIBLE: options hash is now accessed as a property in your class and is not passed as last argument anymore
Allow options at the beginning of the argument list as well as the end.
Make options available with symbol keys in addition to string keys.
Allow true to be passed to Thor#method_options to denote a boolean option.
If loading a thor file fails, don’t give up, just print a warning and keep going.
Make sure that we re-raise errors if they happened further down the pipe than we care about.
Only delete the old file on updating when the installation of the new one is a success
Make it Ruby 1.8.5 compatible.
Don’t raise an error if a boolean switch is defined multiple times.
Thor::Options now doesn’t parse through things that look like options but aren’t.
Add URI detection to install task, and make sure we don’t append “.thor” to URIs
Add rake2thor to the gem binfiles.
Make sure local Thorfiles override system-wide ones.
Generated with the Darkfish Rdoc Generator 2.


Former first lady in ICU
by Egypt Today staffCAIRO - 21 November 2019: Egypt’s former first lady Suzan Mubarak is in the Intensive Care Unit (ICU).
In response to a citizen's tweet asking about Suzan’s health condition, Alaa Mubarak, her son, replied that she is still in the ICU.
In August 2019, Suzan underwent a surgery in her back, Al-Watan newspaper reported.
Following the 2011 uprising, which ousted former President Mohamed Hosni Mubarak, Suzanne was charged with money laundering; then released after she handed over assets to the government at that time, BBC reported on May 17, 2011.
Despite this charge, Suzanne Mubarak had a great legacy in the Egyptian education domain. She had launched the initiative of Reading for All in 1991. The initiative aimed at disseminating awareness of the significance of reading among students, particularly young children, and to get rid of illiteracy.
She had also launched another educational initiative under title “Family Library’, which provides subsidized books


{{ define "main" }} More Links {{ partial "components/appmenu.html" . }} Moodle Meet EBSCOhost Grades Perps Loop Powered by Curator.io Powered by Curator.io {{ end }}


August 12, 2020
LONG ARTICLE! I realized I put a lot of effort in to this post. I might move it to another page for consistency later.
I'm trying to organize a new Angular App as part of my Liftoff project. I should be making a "Hello World" in angular that is supposed to demonstrate my skills. Right now, there is some unsettled nerves.
The issue isn't developing the project, but WHERE I want to develop it. I want to build this app on a Raspberry Pi that is more than capable of running an Angular application. But in order to do that, I must remember how to set up Angular.
This is this is a Manajro Linux set up, installing Node should be easy.
In addition there are three other things worth installing: Yarn, TypeScript, and TS-Node.
node
and tsc
as well as an interface to try out Typescript.On any other Linux distro, this software would be installed using npm
.
However, ArchLinux has better curation of their packages so the installation of these three packages is done this way.
But installing Node packages globally (either with the -g
option with npm
or a package manager like pacman
is rare.
In fact, some global application DON'T have an Arch Linux software package. Angular happens to be one of them.
So to kick off my project, I need to install Angular as a global application the npm
way.
With that done, we can get down to business!
The other thing I need to think about is making this a peristent app. Arch Linux doesn't use MySQL. Some of the folks in the open-source community were not keen about Oracle buying Java or MySQL a few years ago. Instead of using Java, they use OpenJDK. Instead of using MySQL they use MariaDB.
MariaDB is simply a fork of MySQL starting with MySQL version 5.7. The semantic versioning of each relational database management software (RDBMS) is a little complicated. MariaDB is at version 10.4 at the time of this writing, which should be compatible with MySQL 5.7. MySQL is at version 8.0 but there is a catch!
While it does look like MySQL is a "newer" version, it really isn't. If you are still using MySQL 5.7, you're still doing good. There is still support for that version of MySQL.
The other thing is that MySQL is slower than MariaDB. MariaDB might not have all of the items that Oracle added to MySQL, but it's faster than MySQL. There are extension for JSON data. Oracle had to embed that stuff into MySQL. Then I there was the fact that when I first used the MySQL Shell feature that was added to MySQL, it was set to JavaScript mode. I already have a JavaScript REPL. It's called node
! You know what would have been better, a Java mode since Java and MySQL are both Oracle products.
So for this application, we're not just going to learn something new but also make a peristant application with Angular.
"But Jason? Why not make it a MEAN stack and use MongoDB?"
The 2014 me would have said "Yeah, let's use MongoDB because NoSQL sound pretty cool and a new technology.
However things have changed. NoSQL isn't as cracked up as it seems to be.
Technically, I am making a MEAN-stack application, only the M stands for MariaDB instead of MongoDB.
What's more, there's an npm
package for MariaDB. So here's the installation set up.
When I was learning how to develop apps with Angular, I was told not to enable routing. What they didn't mention was why.
If you are making a very simple Single Page Application (SPA) with one view. What they didn't say was views (the combination of component and templates) are necessary for securing the application from unauthorized access. So for this application, we are going to use routing and impose guard to keep users safe.
"OK, Jason, you've stored this on another computer for the benefit of showing off something? How are you going to access it?"
I've though a lot about this. Since my goal is to develop a secure application, I should find some way to securely share access from the Linux machine that is hosting the files and the repository to the Windows client that is accessing and writing them. This is where Samba comes in.
You may have seen the phrase "Samba shares" kicked around some office-types over the last few decades. When they talk about "Samba share" what are they talking about?
A samba share is just some techincal jargon stating how one computer has access to another computer. Think of it as how you can use SSH to access a computer from a text terminal or whenever we push stuff using Git.
Samba, according to its website, is a standard Windows interoperablity suite of programs for Linux and Unix. Basically, it lets you access files on either operating system as if they were part of the computer, sort of how One Drive or Dropbox does, but on a more closed network like an office or school does.
I don't feel like installing another database software on my Windows laptop, and to be honest, I should really think about moving some of my software development stuff off this machine and have it be accessible either by SSH or Samba. There are apps that allow you to access file systems over SSH as if they were on the same network (i.e. WinSCP), but this requires there to be a connection.
There's also another distributed file system protocol called NFS which prides itself on speed but is unecrypted. In the interest of making a secure application, we should use a secure protocol. Samba provides that.
Fortuitously, samba
is already installed as part of Manjaro Linux. It likely was installed to allow for access to network printers. So that saves me from needing to run sudo pacman -S samba
. Worth noting that if I had used Arch Linux, the configuration file (/etc/samba/smb.conf
) might not have been created which according to the Arch Linux Wiki is necessary.
Before I get into explaining how I plan on access the local server from my computer, I want to go over one other piece of software called Avahi. Avahi is a free Zero-configureation networking (zeroconf) implementation that allows me to access devices by name rather than IP address. It isncludes a system for multicast DNS service discovery and allows programs to publish and discover services and hosts running on a local network with not specific configuration. This is ideal for the home office, but if you learn anything about IP addresses in some networking course like Cisco, you'll find that using this publicly might not be a good idea. Still, it's nice to have because then I can call up a device by a hostname rather than an IP address.
We'll refer to the device that is running our application as Blake (of which the host name will be blake
). Thus on the home network, if I run my angular app at http://localhost:4200/
the application should be accessible on other machines at http://blake:4200/
or http://blake.local:4200/
.
There was also something about how this one software called Bonjour needed to be installed if you were trying to use a zeroconf system on Windows. But now that I think about it, I think that's optional and possibly for accessing the Windows computer the same way.
At any rate, back to our Samba setup.
According the the Arch Linux Wiki, if there is a zeroconf (Avahi/Bonjour) daemon running on both the server and the client, the file manager on the client should automatically find the server.
So now we need to set up our username and password for Samba. I would probably suggest using the same one a login, but in high security situation you'll want to use something different.
The next part is we want to say what it is we want to share. As tempting as it is to tell it to share your Linux home directory, that might not be such a good idea.
Interestingly enough I have decided to limit my share to one of two folders. ~/Projects
or ~/Public
. Normally, I just stick my project that I am working on the computer that I am using in ~/Projects
, but I'm using another computer to acces this project. So I guess the solution should me moving my directory that I am using to hold my project into the ~/Public
, and have Samba access to that folder.
Now comes a messy part. On the Linux machine, make a backup of the Samba configuration file in your home directory.
As root, you will need a use a text editor to edit the original file. There are two parts of the file that need to be edited. The first part is the [global]
section, where modes for creating files and directories need to be modified.
The other part is a new section that needs to be added at the end of the file to allow access to the folder and to limit access only to yourself.
Once saved, we need to check for typos.
Almost there. We just need to reset the service.
On you Windows machine, you DO NOT need to turn on Network Sharing!
This next section is a slide deck! Hover over it to see arrow controllers!
So was it worth all that trouble just to get this project set up. Yes.
This article got pretty long. I might break it up into smaller parts. I still have to get the database set up and wireframe my project views. All sorts of stuff.


Women strike for minimum wage in Spanish football
MADRID: Footballers in Spain's women's league launched an indefinite strike on Friday (Nov 15) seeking to double the minimum wage to €16,000 (US$17,680), the players' union AFE announced.
The Association of Women's Football Clubs (ACFF) believes the more modest clubs will be unable to afford wages with the minimum currently set at €8,000.
Women are also trying to force through a maternity package, paid holidays and other basic fringe benefits.
"We will be stopping full match-day programmes as of 16-17 November for an indefinite period, because we have tried all other methods of negotiation," the players' union said.
The strike thereby sees the cancellation of this weekend's ninth round of the women's 16-team football league.
Over the past 15 years women's participation in football in Spain has increased four-fold and there are 70 members of the ACFF.


--- layout: post title: Cracks date: '2013-04-28T07:31:00-04:00' tags: - '2013' - revision tumblr_url: http://poetry.liabogoev.com/post/49083277195/cracks ---
Spiderweb fissures
spread thin probing fingers,
Clawing at flawless veneer.
Years later, cracks appear.
Decades slide,
cracks widen,
gaping, yawning,
gnawing at perfect veneer.
Flakes fall,
flutter in a flurry
to the floor.
Pale peering china doll,
pirouettes in the light
purported perfection
piebald.
pillaged.
putrified.
replete with rot,
reeking of duplicity
death dawdles drearily,
deeming dreaded distance desirable,
And of the pulchritudinous porcelain?
paltry powder persists.


If you have one of these surnames you could inherit a Scottish castle and £370,000
The Government has published a list of unclaimed estates north of the border, with hundreds of thousands of pounds in assets up for grabs
by Hilary Mitchell, Ben WeichIf you happen to have the right surname, you could be in line to claim any one of the 435 empty Scottish estates worth up to £370,000.
The Government has just published a list of estates across Scotland which have been left unclaimed after their owners died either without making a will or without identifying a next of kin .
When a person dies in Scotland without leaving a will detailing their desired benefactors, any unclaimed assets automatically fall under the care of the Crown , and are then placed in the care of The Office of Queen’s and Lord Treasurer’s Remembrancer.
In March 2016, the Succession Act passed by the Scottish Parliament made the process of claiming unwanted estates easier, removing the requirement to obtain a 'bond of caution' - a type of insurance provided only by a small number of firms in the UK.
Cash, land, assets and homes - some as large as mansions and castles - could be up for grabs, providing claimants are able to successfully prove they are entitled to them.
When a person dies with no will, everything they owned can theoretically be claimed.
And it could start by simply noticing you have the same surname as the previous owner of an estate.
Some of the more unusual surnames on the list include Carlin, Hunniball, Malone-Philban and Raube.
The estates will eventually revert to the Crown if no next of kin are identified.
If you think you are entitled to claim an estate, applications can be submitted here .
You can download the list for the rest of Scotland here .
There are thought to currently be more than 8,000 unclaimed estates in England and Wales.
This summer, London pensioner Margaret Abbotts inherited more than £300,000 from a half sister she never knew she had, after she was contacted by a law firm specialising in forensic genealogy.
Advice on unclaimed estates in England and Wales is available here .


Instancing Instances
Copy SOP
A typical approach to instancing uses a piece of geometry to describe the positions of our instances — this is great, but we sometimes want more complex arrangements of instances. In tools like C4D, it’s not uncommon to have clones of clones — but in TouchDesigner instancing on the GPU doesn’t work exactly like that. Instead we need to do some additional set-up work to make this possible. For static arrangements, the copy SOP can be a great helper. Here the first input of the copy SOP is the shape to be copied, and the second input is the points where it will be copied.
In the image above, we create a sphere at each point of a reference sphere. That set of 12 spheres then becomes the source geometry to be instanced at the corner points of our box.
This approach is great for static sets of instances that are not overly complex. The copy SOP produces actual geometry rather than just instances on the GPU — which makes this less efficient in some cases, and not well suited for pieces that are animated. As a starting point, however, this is a great place to start understanding how instances work, and how to create complex arrangements.
Tested in TouchDesigner099 2020.23680
Updated 06.03.20
Matthew Ragan
Zoe Sandoval


{% extends "b2note_app/__base.html" %} {% block content %}
{{ msg }}
What would you like to do next?
Assess
the
service
Request
a new
feature
Report
a bug


American English leads in Mexico; Australian Day misses cut
(Reuters) - Former amateur standout Harris English, back in the sizzling form he displayed early in his professional career, surged to the halfway lead at the Mayakoba Classic in Mexico on Saturday.
English capped off his second round in style by chipping in for birdie at the final hole for a seven-under-par 64.
At 13-under 129, he was one stroke ahead of fellow American Vaughn Taylor (66) and two ahead of another resurgent American, Brendon Todd (68).
Alvaro Ortiz (67) was the best-placed Mexican, four shots off the pace.
Following Thursday’s rainout at the Mayakoba Resort in Playa del Carmen, the field will attempt to play the final 36 holes on Sunday, though chances are the leaders will have to return early on Monday for the final few holes.
Harris, whose two PGA Tour victories include the 2013 Mayakoba Classic, said a back-to-basics approach had contributed to his form resurrection.
He has not shot worse than par in 18 rounds in the new tour season that started in September.
“That’s what I did really well my first couple of years on tour and haven’t done so well in the past couple of seasons,” he told Golf Channel.
“I’m just doing what I did back in college and my first couple of years on tour. It’s just little things.
“This game can seem so simple but it’s difficult at the same time. I’ve stuck with a game plan and routine I do every single day and it’s really helped me.”
Todd has similarly suddenly hit a rich vein of form, winning in his last start in Bermuda after years in the wilderness.
He said all facets of his game were on song.
“I’m just hitting ball in play, feeling really confident with my short irons and wedges and got the putter rolling again,” he said.
“A lot has changed with my game and I feel really comfortable out there.”
While Harris and Todd strutted their stuff, former world number one Jason Day of Australia ignominiously missed the cut.
Day shot 77, which included a triple bogey. It was his worst score on the PGA Tour outside the four major championships since May 2017.
American Russell Henley also missed the cut after incurring eight penalty strokes.
He was signing balls for fans when he realized that one of the balls he had played was different from the rest.
The three-times PGA Tour winner received a two-stroke penalty for each of the four holes he played the different ball.


when something will be made in my test setup will need some volunteers to test this e2e encrypted mesh network over internet
2
dukeleto20-Jun-18 06:35 PM
Audo21-Jun-18 06:49 AM
Did you guys want to bridge this channel to another discord channel? Let me know and we will get it done. I need an inivation link to your discord.
grewalsatinder21-Jun-18 07:00 AM
not yet. but thanks mate
yesterday following cjdns project's core dev cjd's conversation found that finally cjdns project is moving towards a cryptocurrency friendly development.
earlier that community was very much reluctant to cryptocurrencies.
now core dev cjd thinks of making a VPN network out of his cjdns mesh network, and using bitcoin lightening network.
will explore what they been up to, and see where I can help them.
and see how I can utilise their tech with ours
@jl777c do we have any micropayments similar solutions on our todo/roadmap in komodo ecosystem ?
I remember you said something, but don't remember now
@Audo@ns408 is here too.
jl777c21-Jun-18 07:54 AM
i was thinking just using LN for micropayments, via CHIPS
1
1
FishyGuts10-Oct-18 04:51 PM
Hey guys, I just want to let you know I have had a KMD tipbot made for KMD discord.
If you have your own discord, it will work there for KMD and you are free to use it.
DM me for the link and I will get you setup with the creator.
Ignacio Figueroa (FIG)20-Oct-18 04:36 AM
@grewalsatinder where can I find more info about meshbits?
This document is to express who we are, our passion and commitment to the Komodo project.
Audo13-Nov-18 10:08 PM
Hey Komodo Projects,
Komodo team is looking to know better the projects which are building with Komodo. We ask you to fill out this form so that we get information about each project and the rapidly growing ecosystem.
https://airtable.com/shrKBzMwUddQ4ggET


{% trans "Please, note that the translation functionality is affected by the original editing language of this content" %} ({{ object.get_language_name }}) {% trans "and by the languages known by the user as declared in the user profile" %}.
{% trans "The current active language" %} ({{ current_language_name }}) {% trans "affects only the UI messages of this view" %}.
{% if model == 'project' %}{% trans "Translations for" %}
{% elif model == 'flatpage' %}{% trans "Translations for" %}
{% elif model == 'entry' %}{% trans "Translations for" %}
{% elif model == 'featured' %}{% trans "Translations for" %}
{% elif model == 'repo' %}{% trans "Translations for" %}
{% elif model == 'oer' %}{% trans "Translations for" %}
{% elif model == 'learningpath' %}{% trans "Translations for" %}
{% elif model == 'pathnode' %}{% trans "Translations for" %}
{% endif %}
{{ object_title }}
{% if original_language %}
{% for field_forms in form_sets %}
{% for form_language, field_form in field_forms %}
{% endfor %}
{% if not forloop.last %}{% endif %}
{% endfor %}
{% else %}
{% trans "The original language of this content is not known." %}


Dear , I would like to apply through this letter for your express co-operation and to secure in your position an opportunity to invest and do joint business with you in your country. I have a substantial capital i honourably intend to invest in your country into a very lucrative business venture of which you are to advise and execute the said venture over there for the mutual benefits of both of us. Your able co-operation is to become my business partner in your country and create ideas on how money will be invested,properly managed and the type of investment after the money is transferred to your custody with your assistance. I am looking forward to your urgent and positive response for us to discuss details. Thank you. Mr.Peter Ottawa 00221-618-2740.


THE FAIRY FAITH (2000) / **
Directed by John Walker. Running time: 77 minutes. Rated PG by the MFCB. Reviewed on March 22nd, 2001.
By SHANNON PATRICK SULLIVAN
Last year, the wrestling chronicle "Beyond The Mat" became the first documentary to procure a regular engagement at a St John's cinema in recent memory. Now, the envelope has been pushed one step further, with the week-long screening of the Genie Award-nominated "The Fairy Faith" -- the first Canadian documentary to hit local theatres in probably an even longer time.
Of course, given the subject material, it makes sense that "The Fairy Faith" would find its way to this province. Newfoundland enjoys as close a relationship with rural Britain and Ireland as any region on Earth. Indeed, some outport communities probably bear a closer resemblance to the England of three centuries ago than anywhere in the present-day United Kingdom. And it is these sorts of places where the traditional fairy lore still holds some measure of influence -- where the oldtimers speak of strange things that happened to a friend of a friend, back in the day, and even the younger set is wary of peculiar shapes half-glimpsed in the twilight mist.
"The Fairy Faith" is about these people: those who still adhere to the ancient customs, in spite of the onset of progress and skepticism. Producer/director John Walker is a man who was himself enthralled as a child by the stories of the Wee Folk, as told by his Scottish grandmother. His mission here is to explore why certain folk still have faith in the fairy lore -- why, to some, fairy tales are not mere bedtime fiction but indeed something unexpectedly close to the truth.
Much of the film is spent traipsing about the British Isles, from the Scottish highlands to the glens of Ireland. These scenes are beautifully filmed, often set to bewitching music. After giving a brief synopsis of the basics of fairy legends (accompanied by some lovely artwork in a variety of styles), Walker interviews several individuals who claim to believe in fairies. Unfortunately, there is little rhyme nor reason to the process of Walker's investigation. His subjects seem chosen haphazardly, and he strains sometimes to lend them credibility.
For instance, a university scholar and a Celtic harpist offer interesting insight into the subject at hand, and their segments are genuinely engaging. But then there is the man who avers that he has the power to see fairies; when he starts pointing out places where the creatures are supposed to be, things grind to an embarrassing halt. The camera, of course, captures nothing unusual, and Walker never really pursues the obvious questions. Why can this man see fairies but we can't? What is it that prevents us from seeing the curious sprite he insists is sitting at the foot of a cascade?
This failure of Walker's to strive for substance persists throughout the documentary. Later, he visits a castle in which is stored a piece of cloth allegedly once owned by a fairy. Walker describes being fascinated by the artefact when his grandmother brought him there in his youth. He comments that now it just looks like an old, ragged piece of material, possessing none of the wonder he formerly beheld. But he explores this no further. Why has his perspective changed? Does this mean his belief in the fairies has wavered? Why? What does this say about him, given that he constantly insists to his interview subjects that he does, indeed, share their faith?
To make matters worse, for every well-presented conversation, Walker includes some testimonials which are sorely in need of the editor's touch. Consider, for example, the yawn-inducing story told by a bemused Englishman who claims his shadow was nearly stolen by two fairies. Or the extended detour in which Walker indulges, about a supposed fey tree on the verge of being uprooted to make way for a new bypass. "The Fairy Faith" is short enough at an hour and a quarter, so perhaps Walker felt the need to pad things out, but he could have done so by bolstering his analysis rather than just drawing out the proceedings.
Equally uneven is the latter third of the film, when Walker returns to Canada to examine how fairy lore persists in this country. Disappointingly, Walker confines his attention just to the Antigonish region of Cape Breton island in Nova Scotia. What about other parts of the country where the old legends are not yet forgotten, like Newfoundland or Quebec? While I enjoyed the parallels Walker drew between belief in fairies and the traditions of indigenous peoples, I felt a greater exploration was warranted of the translation of fairy legends to the New World. Are there any noticeable differences in the fairy folklore of Cape Breton and the British Isles? Have any characteristics arisen which are unique to Canada, or are things essentially unchanged?
Further, Walker spends so much time on his Native American angle that he largely neglects the more obviously Celtic-derived myths of the Atlantic region. When he does return to this theme, it's often without much coherence. For example, several minutes are spent with a schoolteacher who took photographs of a small cave in which fairies are thought to reside. A big deal is made about one photo, which is supposed to contain evidence of fey activity, and the camera returns to it on multiple occasions. The problem is that it's never explained just what that evidence is supposed to be -- it just looked to me like a bunch of shadows, and I had no idea what I was supposed to be seeing.
"The Fairy Faith" is a nice idea poorly executed. Fairy lore is a rich and fascinating topic -- there is, after all, a very good reason why it has survived down through the millennia. Unfortunately, Walker never probes far below the surface of the subject. The result is a movie which neither successfully examines the questions it poses, nor fully captures the sheer magic of the fairy realm.
Copyright © 2001 Shannon Patrick Sullivan. Archived at The Popcorn Gallery, http://www.physics.mun.ca/~sps/movies/TheFairyFaith.html
| Shannon Patrick Sullivan |<EMAIL_ADDRESS>| +----------------------------------+----------------------------------+ / Popcorn Gallery Movies Reviews www.physics.mun.ca/~sps/movies.html \ | Doctor Who: A Brief History of Time (Travel) /drwho.html |
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Traditional method calling.
We have a consumer that wants structured data.
type Consumer struct {
// internal fields, doesn't matter here
}
type Data struct {
// some useful data types
}
// This function has a receiver, the (*Consumer) bit, that
// makes it a method on Consumer.
func (*Consumer) Notify(data Data) {
// do stuff with data
}
The producer, that creates the data,
has a reference to a consumer.
type Producer struct {
// This is a pointer to a Consumer structure.
consumer *Consumer
}
func NewProducer(consumer *Consumer) *Producer {
// & takes the address of the thing. This is how
// Go gets pointers to things. The {...} is a struct
// initialiser.
return &Producer{consumer}
}
The producer calls the method directly on the consumer.
// This receiver as a name "p", and is used to access
// the elements of the Producer struct. It is the "Go"
// way to generally use a single character for this,
// and not use words like "this" or "self".
func (p *Producer) Call() {
data := Data{...}
// do stuff
p.consumer.Notify(data)
}
Step one is to use an interface.
Instead of taking a concerte type, the Consumer interface is declared with the Producer.
// An interface is just a collection of methods.
type Consumer interface {
Notify(data Data)
}
type Producer struct {
consumer Consumer
}
// Any type that implements the Notify method
// can be passed as the Consumer.
func NewProducer(consumer Consumer) *Producer {
return &Producer{consumer}
}
Any structure that implements the methods defined by the Consumer interface can now be passed to the NewProducer function.
type MyConsumer struct {
// internal fields, doesn't matter here
}
// Notify implements the Consumer insterface.
func (*MyConsumer) Notify(data Data) {
// do stuff with data
}
// in some function...
consumer := &MyConsumer{...}
producer := NewProducer(consumer)
The producer still calls the method directly on the consumer.
// This isn't a trick, it hasn't changed.
func (p *Producer) Call() {
data := Data{...}
// do stuff
p.consumer.Notify(data)
}
Now the Producer has a slice of consumers.
type Producer struct {
// consumers is now a slice
consumers []Consumer
}
func (p *Producer) AddConsumer(consumer Consumer) {
p.consumers = append(p.consumers, consumer)
}
Iterating over the consumers calling each one.
func (p *Producer) Call() {
data := Data{...}
// do stuff
// when iterating over a slice the first element
// is the index into the slice, and the second
// is the value in the slice, we don't care about
// the index here so we assign it to the "special"
// variable _.
for _, consumer := range p.consumers {
consumer.Notify(data)
}
}
type Hub struct {
// the hub stores the consumers
consumers []Consumer
}
func (h *Hub) AddConsumer(consumer Consumer) {
h.consumers = append(h.consumers, consumer)
}
// Calling Notify on the hub just calls Notify
// on all the consumers.
func (h *Hub) Notify(data Data) {
for _, consumer := range h.consumers {
consumer.Notify(data)
}
}
// We could use the concrete type Hub, but Hub
// implements the Consumer interface.
type Producer struct {
consumer Consumer
}
func NewProducer(consumer Consumer) *Producer {
return &Producer{consumer}
}
func (p *Producer) Call() {
data := Data{...}
// do stuff
p.consumer.Notify(data)
}
Use a name for an event, let's call them topics.
type Topic string
func (h *Hub) Publish(topic Topic, ...) {
// implementation
}
func (h *Hub) Subscribe(topic Topic, ...) {
// implementation
}
The interface{}
type can be anything.
// Publish a topic with some data.
func (h *Hub) Publish(topic Topic, data interface{}) {
// implementation
}
// Subscribe to a topic, and provide the callback that
// gets told the topic and the data.
func (h *Hub) Subscribe(topic Topic, func (Topic, interface{})) {
// implementation
}
type subscriber struct {
topic Topic
callback func(Topic, interface{})
}
type Hub struct {
mutex sync.Mutex
subscribers []*subscriber
}
func (h *Hub) Subscribe(topic Topic, callback func (Topic, interface{})) {
h.mutex.Lock()
// The "defer" keyword queues up the function to be called at the
// end of the function. Multiple defer calls work LIFO.
defer h.mutex.Unlock()
h.subscribers = append(h.subscribers, &subscriber{topic, callback})
}
func (h *Hub) Publish(topic Topic, data interface{}) {
h.mutex.Lock()
defer h.mutex.Unlock()
for _, subscriber := range h.subscribers {
if subscriber.topic == topic {
// The "go" key word calls the function in
// a different goroutine.
go subscriber.callback(topic, data)
}
}
}
Have the Subscribe
function return something that can be used to unsubscribe.
type Unsubscriber interface {
Unsubscribe()
}
func (h *Hub) Subscribe(...) Unsubscriber {
// implementation
}
Each subscription has a unique identifier.
type subscriber struct {
id int
topic Topic
callback func(Topic, interface{})
}
type Hub struct {
mutex sync.Mutex
index int
subscribers []*subscriber
}
func (h *Hub) unsubscribe(id int) {
h.mutex.Lock()
defer h.mutex.Unlock()
for i, sub := range h.subscribers {
if sub.id == id {
h.subscribers = append(
h.subscribers[0:i],
h.subscribers[i+1:]...)
return
}
}
}
type handle struct {
hub *Hub
id int
}
// Unsubscribe implements Unsubscriber.
func (h *handle) Unsubscribe() {
h.hub.unsubscribe(h.id)
}
Each subscription has a unique identifier.
func (h *Hub) Subscribe(topic Topic,
callback func (Topic, interface{})) Unsubscriber {
h.mutex.Lock()
defer h.mutex.Unlock()
h.index++
h.subscribers = append(h.subscribers, &subscriber{
id: h.index, topic: topic, callback: callback})
return &handle{hub: h, id: h.index}
}
func (*Suite) TestPublishOneSubscriber(c *gc.C) {
var called bool
var topic pubsub.Topic = "test topic"
hub := pubsub.NewHub()
hub.Subscribe(topic, func(call pubsub.Topic, data interface{}) {
c.Check(call, gc.Equals, topic)
c.Check(data, gc.IsNil)
called = true
})
hub.Publish(topic, nil)
// How long do we wait, how do we know it was called?
c.Assert(called, jc.IsTrue)
}
Go channels are used for signalling.
func waitForMessageHandlingToBeComplete(c *gc.C, done <-chan struct{}) {
select {
case <-done:
case <-time.After(time.Second):
// We expect message handling to be done in under 1ms
// so waiting for a second is 1000x as long.
c.Fatal("publish did not complete")
}
}
func (h *Hub) Publish(topic Topic, data interface{}) <-chan struct{} {
h.mutex.Lock()
defer h.mutex.Unlock()
done := make(chan struct{})
wait := sync.WaitGroup{}
for _, subscriber := range h.subscribers {
if subscriber.topic == topic {
wait.Add(1)
go func(){
defer wait.Done()
subscriber.callback(topic, data)
}
}
}
go func() {
wait.Wait()
close(done)
}()
return done
}
func (*Suite) TestPublishOneSubscriber(c *gc.C) {
var called bool
var topic pubsub.Topic = "test topic"
hub := pubsub.NewHub()
hub.Subscribe(topic, func(call pubsub.Topic, data interface{}) {
c.Check(call, gc.Equals, topic)
c.Check(data, gc.IsNil)
called = true
})
done := hub.Publish(topic, nil)
waitForMessageHandlingToBeComplete(c, done)
c.Assert(called, jc.IsTrue)
}
If multiple calls to Publish
are made that match a subscriber, what order does the subscriber get told about the events?
It depends
type subscriber struct {
id int
topic Topic
handler func(topic Topic, data interface{})
mutex sync.Mutex
pending *deque.Deque
closed chan struct{}
data chan struct{}
done chan struct{}
}
func newSubscriber(topic Topic, handler func(Topic, interface{}))
*subscriber {
// A closed channel is used to provide an immediate
// route through a select call in the loop function.
closed := make(chan struct{})
close(closed)
sub := &subscriber{
topic: topic,
handler: handler,
pending: deque.New(),
data: make(chan struct{}, 1),
done: make(chan struct{}),
closed: closed,
}
go sub.loop()
return sub
}
type handlerCallback struct {
topic Topic
data interface{}
wg *sync.WaitGroup
}
func (h *handlerCallback) done() {
h.wg.Done()
}
func (s *subscriber) notify(call *handlerCallback) {
s.mutex.Lock()
defer s.mutex.Unlock()
s.pending.PushBack(call)
if s.pending.Len() == 1 {
s.data <- struct{}{}
}
}
func (s *subscriber) popOne() (*handlerCallback, bool) {
s.mutex.Lock()
defer s.mutex.Unlock()
val, ok := s.pending.PopFront()
if !ok {
// nothing to do
return nil, true
}
empty := s.pending.Len() == 0
return val.(*handlerCallback), empty
}
func (s *subscriber) loop() {
var next <-chan struct{}
for {
select {
case <-s.done:
return
case <-s.data:
// Has new data been pushed on?
case <-next:
// If there was already data, next is a closed channel.
// otherwise it is nil so won't pass through.
}
call, empty := s.popOne()
if empty {
next = nil
} else {
next = s.closed
}
// call *should* never be nil as we should only be calling
// popOne in the situations where there is actually
// something to pop.
if call != nil {
s.handler(call.topic, call.data)
call.done()
}
}
}
func (s *subscriber) close() {
s.mutex.Lock()
defer s.mutex.Unlock()
// Need to iterate through all the pending calls and make
// sure the wait group is decremented.
for call, ok := s.pending.PopFront(); ok;
call, ok = s.pending.PopFront() {
call.(*handlerCallback).done()
}
close(s.done)
}
func (h *Hub) unsubscribe(id int) {
h.mutex.Lock()
defer h.mutex.Unlock()
for i, sub := range h.subscribers {
if sub.id == id {
sub.close()
h.subscribers = append(
h.subscribers[0:i],
h.subscribers[i+1:]...)
return
}
}
}
The SimpleHub
Now what?
How about not having callbacks with interface{}
?
Better topic matching?
Hander functions for a structured hub can get all the published data available by defining a callback with the signature:
func (Topic, map[string]interface{})
Or alternatively, define a struct type, and use that type as the second argument.
func (Topic, SomeStruct, error)
Uses the simple hub, and wraps all callbacks so the data interface{}
used for the simple hub publish method is always given a map[string]interface{}
Converting the data
value can now generate an error.
func (h *StructuredHub) Publish(topic Topic, data interface{})
(<-chan struct{}, error) {
// convert data to map[string]interface{}
// call the simple hub Publish with the map
}
// Marshaller defines the Marshal and Unmarshal methods used to
// serialize and deserialize the structures used in Publish and
// Subscription handlers of the structured hub.
type Marshaller interface {
// Marshal converts the argument into a byte streem that it
// can then Unmarshal.
Marshal(interface{}) ([]byte, error)
// Unmarshal attempts to convert the byte stream into type
// passed in as the second arg.
Unmarshal([]byte, interface{}) error
}
import "encoding/json"
// JSONMarshaller simply wraps the json.Marshal and json.Unmarshal
// calls for the Marshaller interface.
var JSONMarshaller = &jsonMarshaller{}
type jsonMarshaller struct{}
func (*jsonMarshaller) Marshal(v interface{}) ([]byte, error) {
return json.Marshal(v)
}
func (*jsonMarshaller) Unmarshal(data []byte, v interface{}) error {
return json.Unmarshal(data, v)
}
type Emitter struct {
Origin string `json:"origin"`
Message string `json:"message"`
ID int `json:"id"`
}
value := Emitter{"master", "hello world", 42}
// JSON Marshalling
`{"origin":"master","message":"hello world","id":42}`
// Unmarshalled into map[string]interface{} gives
map[string]interface{}{
"origin": "master",
"message": "hello world",
"id": 42,
}
func (h *StructuredHub) toStringMap(data interface{})
(map[string]interface{}, error) {
if cast, ok := data.(map[string]interface{}); ok {
return cast, nil
}
var result map[string]interface{}
// convert to a map by marshalling the structure
// out and back into a map
bytes, err := h.marshaller.Marshal(data)
if err != nil {
return nil, errors.Annotate(err, "marshalling")
}
err = h.marshaller.Unmarshal(bytes, &result)
if err != nil {
return nil, errors.Annotate(err, "unmarshalling")
}
return result, nil
}
Subscribing can now also generate an error if the handler function doesn't match the expected signatures.
func (h *StructuredHub) Subscribe(topic Topic, handler interface{})
(Unsubscriber, error) {
// reflection to interrogate the handler to make
// sure it is a function that matches either
// `func(Topic, map[string]interface{})`
// or
// `func(Topic, SomeStruct, error)`
}
Originally I started with regular expressions.
// Topic represents a message that can be subscribed to.
type Topic string
// TopicMatcher defines the Match method that is used to determine
// if the subscriber should be notified about a particular message.
type TopicMatcher interface {
Match(Topic) bool
}
// Match implements TopicMatcher. One topic matches another if they
// are equal.
func (t Topic) Match(topic Topic) bool {
return t == topic
}
// RegexpMatcher allows standard regular expressions to be used as
// TopicMatcher values.
type RegexpMatcher regexp.Regexp
// MatchRegexp expects a valid regular expression. If the expression
// passed in is not valid, the function panics. The expected use of this
// is to be able to do something like:
// `hub.Subscribe(pubsub.MatchRegex("prefix.*suffix"), handler)`
func MatchRegexp(expression string) TopicMatcher {
return (*RegexpMatcher)(regexp.MustCompile(expression))
}
// The topic matches if the regular expression matches the topic.
func (m *RegexpMatcher) Match(topic Topic) bool {
r := (*regexp.Regexp)(m)
return r.MatchString(string(topic))
}
During initial use, I found that I wanted to be able to match every topic.
type allMatcher struct{}
// Match implements TopicMatcher. All topics match for the allMatcher.
func (*allMatcher) Match(topic Topic) bool {
return true
}
// MatchAll is a topic matcher that matches all topics.
var MatchAll TopicMatcher = (*allMatcher)(nil)
BTW talk is on github


Checkout
Contact information
E-mail
Phone
Shipping address
Full name
Address
City
Country
Postal code
markunread_mailbox
Save this information for next time
Continue
Vintage Backbag
$54.99
$94.99
Levi Shoes
$74.99
$124.99
Shipping
$19
Total
$148.98


{% extends "base.html" %} {% block title %}Sign-up completed!{% endblock %} {% block content %}
Thank you for signing up on PubLab
An email has been sent to the address you provided. Please click on the activation link to complete your account application
Thank you - The PubLab Team.


Pilot
Lawnmower Dog
Anatomy Park
M. Night Shaym-Aliens!
Meeseeks and Destroy
Rick Potion #9
Raising Gazorpazorp
Rixty Minutes
Something Ricked This Way Comes
Close Rick-counters of the Rick Kind
Ricksy Business
A Rickle in Time
Mortynight Run
Auto Erotic Assimilation
Total Rickall
Get Schwifty
The Ricks Must Be Crazy
Big Trouble in Little Sanchez
Interdimensional Cable 2: Tempting Fate
Look Who's Purging Now
The Wedding Squanchers
The Rickshank Rickdemption
Rickmancing the Stone
Pickle Rick
Vindicators 3: The Return of Worldender
The Whirly Dirly Conspiracy
Rest and Ricklaxation
The Ricklantis Mixup
Morty's Mind Blowers
The ABC's of Beth
The Rickchurian Mortydate


Surname
First name
Middle name
You aremalefemale
Age
Country of Residence Russia USA Germany Great Britain Сhina Сanada
CityRyazanMoscow
Photography
Title Web Master Database Administrator Computer-aided design Economoc Planning Management accounting Budgeting and planning
Salary
Site
Email
Phone
Password


Here are some ideas what you could do in Glasgow.
There are many things to do in Glasgow!
No matter whether it's during the day or night.
Glasgow is also the perfect location for some trips.
Subscribe to our newsletter!


We are a non-profit organization dedicated to making a difference in our world by providing a ground-breaking interactive and immersive experience that seeks to improve intergroup relations, increase empathy and respect, reduce bias, and encourage action in our communities.
-
Instructions: Rate what you think your comfort level would be in each situation using the scale below. There are no right or wrong answers! Simply be honest with yourself and do not over-think the situations. The way you answer the questions may be different depending on your own social group membership, such as your race/ethnicity, gender, age, weight, or ability status. In some cases, you may not think a situation is personally applicable; if so, mark “N/A” in the space provided. After you have completed all sections, follow the instructions to create a total score for each section.
 Highest? Or are all your scores similar? Why do you think that happened? Do you feel surprised, disappointed, or satisfied by your results? Why?
Think about your own social group memberships. How do you think the answers for each section would be different for dominant group members (e.g., a White person answering the questions in Section A or a heterosexual answering the questions in Section C) compared to minority group members (e.g., a disabled person answering the questions in Section D)? Explain your reasoning.
Think about your friends and family and how they might have completed the questionnaire. Do you think their responses would be similar to or different from yours? Why?
What experiences have you had that may have contributed to the way you answered the questions?
What does it mean if someone reports feeling uncomfortable in the situations described on the questionnaire? Does it suggest that the person is biased against certain social groups? Why or why not?
Download Background ResearchThis activity aims to create awareness of how subtle beliefs and behaviors can affect social interactions in everyday life. This activity was created to evoke thought and reflection about situations where race, gender, sexuality, disability, weight, and age can affect interactions. Participants (school students, college students, or adults in the workplace) get an opportunity to think about where their stereotypes and attitudes influence our own or others' behavior.
Find out more about them here: http://breakingprejudice.org/teaching/group-activities/subtle-prejudice-activity/


General discussion about Komodo. For useful links and more info click the pinned messages to the right. DON'T DM @jl777
100 messages
Before 05-Dec-19 12:00 AM
ComputerGenie 👴👴👴09-Oct-18 06:48 AM
fair distribution of POS tokens is an oxymoron
passcombo.com 🏴☠🏴09-Oct-18 06:48 AM
why fair = value ?
IP09-Oct-18 06:48 AM
you invest in equipment and electricity and get tokens. with pos someone just gets the token out of thin air
token distribution matters a lot
ComputerGenie 👴👴👴09-Oct-18 06:49 AM
pow is much more fair in distributing tokens
Said everyone who never purchase a building full of miners and had to pay the power bill
passcombo.com 🏴☠🏴09-Oct-18 06:49 AM
what is the difference in just direct buying gold then to byuing aquipment to get gold? some % of fee?
IP09-Oct-18 06:49 AM
people seem to not find value in coins where they think distribution is very much infair
passcombo.com 🏴☠🏴09-Oct-18 06:49 AM
meaningless
IP09-Oct-18 06:49 AM
hard to find value in xrp tokens..
passcombo.com 🏴☠🏴09-Oct-18 06:49 AM
well so you just pointed to what people find fair / unfair and as I explained above it's uselss ./ undefined
IP09-Oct-18 06:49 AM
@passcombo.com 🏴☠🏴 someone mined that gold and did not print it out of thin air, right
passcombo.com 🏴☠🏴09-Oct-18 06:50 AM
all ocmes to the same point of what people think
you pay the price anyway
IP09-Oct-18 06:50 AM
so with gold it is fine to get it either way
passcombo.com 🏴☠🏴09-Oct-18 06:50 AM
and distrivbution is not fair - early adopters get more
forget about fair
illusion
gold you min, BTC you also mine
same thing
ComputerGenie 👴👴👴09-Oct-18 06:51 AM
early adopters get more
To that extent, PoS and PoW are pretty much even
passcombo.com 🏴☠🏴09-Oct-18 06:53 AM
so it is totally unfair distribution - fair would be when late adopters get same? but here also inflation comes ... and people who do not get it will say this year 103 is > last year 100
or there can be also deflation
in terms of USD you get same amount of BTC though so you can same it's "fair"
ComputerGenie 👴👴👴09-Oct-18 06:54 AM
distribution of currency will never be "fair" except in some Utopia where unicorns shit rainbows
passcombo.com 🏴☠🏴09-Oct-18 06:55 AM
because fairness does not exist - everyone think fairs is when it's better for them
mathmeticaly when it's fair does not mean people will take it as that
for me it's enough if it seems it make sense and margins not too high
ultimately fairness is and idea which is sometimes used by populists to make the world better, but how it ends you know
ComputerGenie 👴👴👴09-Oct-18 06:57 AM
Even the shittiest of GPUs mining a young BTC in the early days would make you wealthy selling today
Now, $100k and you might bank $60k profit(edited)
TonyL09-Oct-18 07:01 AM
Can recommend this dude's book if you're interested in questions of inequality (applicable partially to crypto-economics as well)
Daniel J. Levitin's latest book: The Organized Mind
ComputerGenie 👴👴👴09-Oct-18 07:05 AM
@TonyL Does that book tell folks that "If you're living 'paycheck to paycheck' then you're not in the middle-class"?
imo, the majority of people that speak on wanting "economic equality" and "fairness" need that drilled into their head before they can even accept any logic
TonyL09-Oct-18 07:07 AM
@ComputerGenie 👴👴👴 It's historical research on reason of inequity of capitals accumulating in different countries. And main thesis is that inequity is necessary for capitalism. Not sure what did you ask
ComputerGenie 👴👴👴09-Oct-18 07:10 AM
There seems to be an epidemic of people in the US and EU (more so in the US) that drone one about inequality being a thing that needs "fixed". The worsening part of that seems to come from "working class poor" who are under the delusion that they are "middle class".
1
TonyL09-Oct-18 07:12 AM
Oh, I see. Can't argue on this mater objectively since never lived in EU or USA and have a degree in nuclear physics, not economics
ComputerGenie 👴👴👴09-Oct-18 07:13 AM
polycryptoblog09-Oct-18 07:13 AM
@ComputerGenie 👴👴👴
actionslacks09-Oct-18 07:14 AM
Any economic theory based on the infinite supply model is inherently flawed imo
polycryptoblog09-Oct-18 07:14 AM
Equality to the equal , inequality to the unequal
ComputerGenie 👴👴👴09-Oct-18 07:14 AM
How dafuq does a nuclear physicist get into crypto this deep?
TonyL09-Oct-18 07:17 AM
@ComputerGenie 👴👴👴 In few words - on some point found that IT field is more interesting for me
2
1
ComputerGenie 👴👴👴09-Oct-18 07:18 AM
Now I have a new reply for when my folks say "it's not like it's rocket science or something"
"If it's good enough for a nuclear physicist, it's good enough for me"
TonyL09-Oct-18 07:19 AM
I've started masters in field of cancer treatment by particles accelerators and so on. What demotivated me totally: there were some dudes in my class which already work in hospitals, treat people from cancer and have salary 300-400 usd/month
Desktop App for SuperNET DAPPs. Contribute to KomodoPlatform/Agama development by creating an account on GitHub.
KomodoWorld09-Oct-18 02:21 PM
yes 0.3.13c is the Verus Agama, it supports Kmd too
ComputerGenie 👴👴👴09-Oct-18 02:22 PM
ahhh the fun bits of decentralization
KomodoWorld09-Oct-18 02:24 PM
@BitDaddy for Pirate you have to use the Kmd Agama
chainzilla is supported in both
BitDaddy09-Oct-18 02:30 PM
So I have version 0.2.42c installed just now but recently downloaded a verus wallet which I noticed is v 0.3.13c. If I install this verus wallet will it uninstall my agama 0.2.42c.(edited)
KomodoWorld09-Oct-18 02:38 PM
Verus is standalone, doesn't install and won't do anything to Komodo Agama
I'm using Verus on the same computer with Kmd Agama
and can access my kmd with either
I mean I use one or the other, not at the same time
BitDaddy09-Oct-18 02:40 PM
Thanks for clearing that up.
Mörökölli (Boogeyman)09-Oct-18 04:30 PM
will verus be on the kmd agama wallet or is it only going to be on their agama?
just confused about the two agamas :d
ComputerGenie 👴👴👴09-Oct-18 04:37 PM
ComputerGenie Today at 9:22 AM
ahhh the fun bits of decentralization
Mörökölli (Boogeyman)09-Oct-18 04:52 PM
k thanks!
Bappo09-Oct-18 07:07 PM
so my friend has ubuntu on his laptop which i guess is a linix thing. We did all the code up to cd ~
git clone https://github.com/jl777/komodo
cd komodo
git checkout dev
./zcutil/fetch-params.sh.  It won't let us copy and paste either
we messed up, do we start over or just re do the correct command?
SHossain09-Oct-18 07:12 PM
you need to follow the guide and issue the commands 1 line each time after installing all dependencies
Bappo09-Oct-18 07:13 PM
do we start over or just re do the correct command'
SHossain09-Oct-18 07:13 PM
yes
Bappo09-Oct-18 07:13 PM
yes
to what
starting over
or re doing the command?
SHossain09-Oct-18 07:13 PM
because, you didn't install all the deps
Bappo09-Oct-18 07:13 PM
so start over..
SHossain09-Oct-18 07:13 PM
start over
Bappo09-Oct-18 07:14 PM
ok, thanks
Bappo09-Oct-18 07:23 PM
when I put in cd ~
git clone https://github.com/nanomsg/nanomsg
cd nanomsg
cmake . -DNN_TESTS=OFF -DNN_ENABLE_DOC=OFF
make -j2
sudo make install
sudo ldconfig it says "Command 'cmake' not found, but can be installed with: sudo apt install cmake


--- layout: page title: Tournaments date: 2010-09-08 02:41:23.000000000 -05:00 type: page parent_id: '0' published: true password: '' status: publish categories: [] tags: [] meta: _edit_last: '16309375' _wp_page_template: default geo_public: '0' author: login: acfquizbowl email<EMAIL_ADDRESS>display_name: acfquizbowl first_name: '' last_name: '' permalink: "/tournaments/" ---
ACF will again be producing three tournaments in the 2018-2019 academic year. Stay tuned on the Collegiate Announcement section of the HSQuizbowl Forums for full announcements!
2019 ACF Nationals, 4/13-4/14 at the University of Pennsylvania