(My) Dart Katas
Quite frankly, I think that this should actually better be named something along the lines of Dart Lab, the examples/exercises below are much more suited to expose experimentation than demonstration. But I won't change anything, if this is shameful, so be it!
The website CodeKata has a wonderful motivation text about programming katas, with which I squarely agree:
How do you get to be a great musician? It helps to know the theory, and to understand the mechanics of your instrument. It helps to have talent. But ultimately, greatness comes from practicing; applying the theory over and over again, using feedback to get better every time.
How do you get to be an All-Star sports person? Obviously fitness and talent help. But the great athletes spend hours and hours every day, practicing.
But in the software industry we take developers trained in the theory and throw them straight in to the deep-end, working on a project. It’s like taking a group of fit kids and telling them that they have four quarters to beat the Redskins (hey, we manage by objectives, right?). In software we do our practicing on the job, and that’s why we make mistakes on the job. We need to find ways of splitting the practice from the profession. We need practice sessions.
It is important to emphasize the fact that katas should be minimalistic units of practice so you can focus on just one topic. This will help us identify mistakes and univocally connect them to their root, with no ambiguity at all. Similarly to what Doug McIlroy mentions in the Bell System Technical Journal from 1978, albeit in a different context and with different intentions:
Make each program do one thing well. To do a new job, build afresh rather than complicate old programs by adding new "features".
Again, CodeKata has a nice description of what katas are:
What makes a good practice session? You need time without
interruptions, and a simple thing you want to try. You need to try it
as many times as it takes, and be comfortable making
mistakes
Code Kata is an attempt to bring this element of practice to software
development. A kata is an exercise in karate
Remember that the point of the kata is not arriving at a correct answer. The point is the stuff you learn along the way. The goal is the practice, not the solution.
Feedback on your craft is very important so you can do the movements or write the code correctly. As Vince Lombardi once famously said, again, in a different context and with different intentions:
Practice does not make perfect. Perfect practice makes perfect.
The Programming Kata's origins are unkown, but the earliest explicit mention comes from Dave "Pragmatic Dave" Thomas' book The Pragmatic Programmer (1999). This practice was further popularized by Robert "Uncle Bob" C. Martin on his blog, in an article called The Programming Dojo.
Personally, I first got in touch with it after reading Uncle Bob's
books
Clean Code
and
The Clean Coder, in which he not only mentions and recommends this practice but also
puts a layer on top: TDD or Test-Driven Development
After mentioning TDD, it's also worth citing Kent Beck, who is
actually its inventor
My most current katas are the ones written in my
Dart Katas Github
repository. These are much longer than the usual expected time of 1
hour to 1 afternoon. On average, mine took an afternoon to a whole
day. The main reason for this is that I was intentionally more careful
with the structure of the code, featuring TDD while also trying to
make it more clean
Some will disagree with my code and I'm not here to say that it is the
best ever or the most correct
One example of practice for which a much more experienced and overall
much better programmer,
Marcelo Glasberg,
criticized me was, in his words, "my systematic obfuscation of the
test answers". For example, in the
Bowling Game Kata, I created a file called fixture_data.dart
where I
deposit all of the variables used as the test answers:
final Map<Map<String, int>, int> rollsPinsAndScores = {
gutterGame: 0,
allOnes: 20,
perfectGame: 300,
};
const Map<String, int> gutterGame = {
'rolls': 20,
'pins': 0,
};
const Map<String, int> allOnes = {
'rolls': 20,
'pins': 1,
};
const Map<String, int> perfectGame = {
'rolls': 12,
'pins': 10,
};
His critique was that this was incredibly unnecessary since it doesn't
really add much to so simple a program/problem. He also mentioned that
it makes it harder for other people to read my code because they now
have to manage more files and screens in their heads. I mostly do
agree with his criticism actually, but I left it that way because it
serves to show what I would do if the program got a little bit more
unwieldy
Putting the maps used in each separate test scenario inside another
map was yet another source of his dislike of my code. In this case, I
was trying to avoid the needless repetition of the test setups, which
always had the same heuristics. I still think this makes the reader
better think at a higher level more easily though. Rote repetition of
simpler tests might be easier to read, but its volume will be harder
to memorize and visualize as a whole. Instead of setting up the same
types of tests over and over, you can simply use a
forEach
:
test('Test canonical games: gutter, all ones and perfect', () {
rollsPinsAndScores.forEach((Map<String, int> rollsPins, int score) {
_game = BowlingGame();
_rollManyPins(rollsPins['rolls'], rollsPins['pins']);
expect(_game.score(), score);
});
});
Another last warning I must give about my kata code in this particular repository is that I sometimes overparameterized or overgeneralized the problem too much — for practicing purposes —, which is a very easy trap to fall into for programmers. For example, my Tic-Tac-Toe solution can work for any symbol/character and any board size. Not only the board class but also the parser's would be much simpler if I hadn't chosen to implement this overgeneralized solution.
At any rate, in the end, I'll let you be the judge of what practice is
best — if there is one thing I've learned from Go (Baduk or
Weiqi) is that the discussion itself can be much more enlightening
than simply labeling a practice as good or bad


Synopsis
Invoked with arguments referring to packages:
xpm install [<options> ...] [<packs>...]
Invoked with no package arguments, and running in a package folder:
xpm install [<options> ...]
Aliases:
i
intstall
Description
This command installs a package, and all packages that it depends on.
As for npm, a package is any of the following:
- A folder containing a
package.json
file. - A gzipped tarball containing (1).
- A URL that resolves to (2).
- A
<name>@<version>
that is published on the registry with (3). - A
<name>@<tag>
that points to (4). - A
<name>
that has alatest
tag satisfying (5). - A
git
url that, when cloned, results in (1).
Even if you never publish your package, you can still get a lot of benefits of using xpm to conveniently install dependencies, and perhaps to automate path management for dependent tools.
Install dependencies
When invoked without arguments in a package folder, xpm install
installs
the dependencies listed in the dependencies
and devDependencies
field in package.json
.
If the dependencies are xPacks, they are installed in the local xpacks
folder. For binary xPacks, soft links to the executables are created
in the xpacks/.bin
folder (on Windows .cmd
stubs are created).
To maintain compatibility with npm, dependencies
must not necessarily be xPacks, they can also be npm modules,
and are installed as usual in node_modules
.
Example:
$ cd /tmp/hifive1-blinky-cpp
$ xpm install --verbose
xPack manager - install package(s)
Installing dependencies for 'hifive1-blinky-cpp'...
Folder 'micro-os-plus-diag-trace' linked to<EMAIL_ADDRESS>Folder 'sifive-hifive1-board' linked to<EMAIL_ADDRESS>Folder 'sifive-devices' linked to<EMAIL_ADDRESS>Folder 'micro-os-plus-riscv-arch' linked to<EMAIL_ADDRESS>Folder 'micro-os-plus-startup' linked to<EMAIL_ADDRESS>Folder 'micro-os-plus-c-libs' linked to<EMAIL_ADDRESS>Folder 'micro-os-plus-cpp-libs' linked to<EMAIL_ADDRESS>Folder 'xmake' linked to 'xmake/0.3.8'.
File 'xmake' linked to 'xmake/bin/xmake.js'
Folder 'gnu-mcu-eclipse-riscv-none-gcc' linked to<EMAIL_ADDRESS>File 'riscv-none-embed-addr2line' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-addr2line'
File 'riscv-none-embed-ar' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-ar'
File 'riscv-none-embed-as' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-as'
File 'riscv-none-embed-c++' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-c++'
File 'riscv-none-embed-c++filt' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-c++filt'
File 'riscv-none-embed-cpp' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-cpp'
File 'riscv-none-embed-elfedit' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-elfedit'
File 'riscv-none-embed-g++' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-g++'
File 'riscv-none-embed-gcc' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-gcc'
File 'riscv-none-embed-gcc-7.2.0' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-gcc-7.2.0'
File 'riscv-none-embed-gcc-ar' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-gcc-ar'
File 'riscv-none-embed-gcc-nm' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-gcc-nm'
File 'riscv-none-embed-gcc-ranlib' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-gcc-ranlib'
File 'riscv-none-embed-gcov' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-gcov'
File 'riscv-none-embed-gcov-dump' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-gcov-dump'
File 'riscv-none-embed-gcov-tool' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-gcov-tool'
File 'riscv-none-embed-gdb' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-gdb'
File 'riscv-none-embed-gprof' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-gprof'
File 'riscv-none-embed-ld' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-ld'
File 'riscv-none-embed-ld.bfd' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-ld.bfd'
File 'riscv-none-embed-nm' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-nm'
File 'riscv-none-embed-objcopy' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-objcopy'
File 'riscv-none-embed-objdump' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-objdump'
File 'riscv-none-embed-ranlib' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-ranlib'
File 'riscv-none-embed-readelf' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-readelf'
File 'riscv-none-embed-run' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-run'
File 'riscv-none-embed-size' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-size'
File 'riscv-none-embed-strings' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-strings'
File 'riscv-none-embed-strip' linked to 'gnu-mcu-eclipse-riscv-none-gcc/.content/bin/riscv-none-embed-strip'
Folder 'gnu-mcu-eclipse-openocd' linked to<EMAIL_ADDRESS>File 'openocd' linked to 'gnu-mcu-eclipse-openocd/.content/bin/openocd'
Folder 'gnu-mcu-eclipse-windows-build-tools' linked to<EMAIL_ADDRESS>'xpm install' completed in 6.086 sec.
$
Install packages
When invoked with arguments, they must refer to packages. The common use case is to use names of packages stored on the public npm repository, but since xpm uses the same library to manage downloads as npm, all formats are accepted:
xpm install [<@scope>/]<name>
xpm install [<@scope>/]<name>@<tag>
xpm install [<@scope>/]<name>@<version>
xpm install [<@scope>/]<name>@<version range>
xpm install <github>:<organization>/<repo-name>[#commit-id]
xpm install <github>:<organization>/<repo-name>[#semver:X.Y.Z]
xpm install <gitlab>:<organization>/<repo-name>[#commit-id]
xpm install <gitlab>:<organization>/<repo-name>[#semver:X.Y.Z]
xpm install <git repo url>
xpm install <tarball file>
xpm install <tarball url>
xpm install <folder>
When referring to GitHub by semver, a tag named vX.Y.Z
must be present.
For detail please see npm install
.
Examples:
$ xpm install --global @gnu-mcu-eclipse/arm-none-eabi-gcc --verbose
xPack manager - install package(s)
Processing<EMAIL_ADDRESS>Installing globally in<EMAIL_ADDRESS>Extracting 'gnu-mcu-eclipse-arm-none-eabi-gcc-8.2.1-1.7-20190524-0603-macos.tgz'...
3248 files extracted.
'xpm install' completed in 9.958 sec.
$
Options
Help (--help
)
$ xpm install --help
xPack manager - install package(s)
Usage: xpm install [options...] [--global] [--system] [--force]
[--config <config_name>] [--dry-run] [--save-prod]
[--no-save] [--save-dev] [--save-optional] [--save-bundle]
[--save-exact]
[[<EMAIL_ADDRESS>Install options:
-g|--global Install the package globally in the home folder (optional)
-sy|--system Install the package in a system folder (optional)
-f|--force Force install over existing package (optional)
-c|--config <config_name> Install configuration specific dependencies (optional)
-n|--dry-run Pretend to install the package(s) (optional)
-P|--save-prod Save to dependencies; default unless -D or -O (optional)
--no-save Prevent saving to dependencies (optional)
-D|--save-dev Save to devDependencies (optional)
-O|--save-optional Save to optionalDependencies (optional)
-B|--save-bundle Save to bundleDependencies (optional)
-E|--save-exact Save deps with exact version (optional)
Common options:
--loglevel <level> Set log level (silent|warn|info|verbose|debug|trace)
-s|--silent Disable all messages (--loglevel silent)
-q|--quiet Mostly quiet, warnings and errors (--loglevel warn)
--informative Informative (--loglevel info)
-v|--verbose Verbose (--loglevel verbose)
-d|--debug Debug messages (--loglevel debug)
-dd|--trace Trace messages (--loglevel trace, -d -d)
--no-update-notifier Skip check for a more recent version
-C <folder> Set current folder
xpm -h|--help Quick help
xpm --version Show version
xpm -i|--interactive Enter interactive mode
npm<EMAIL_ADDRESS>'/Users/ilg/.nvm/versions/node/v14.16.0/lib/node_modules/xpm'
Home page: <https://xpack.github.io/xpm/>
Bug reports: <https://github.com/xpack/xpm-js/issues/>
Global install (-g|--global
)
Install package(s) in the global xPacks store (in the user home folder).
System install (-sy|--system
)
Install package(s) in the system repository.
Force install (-f|--force
)
Normally if a package is already installed, xpm exits with a message.
Use this option to force xpm to reinstall a package.
Configuration (-c|--config
)
Install dependencies into an existing configuration build folder instead of the top project folder.
xpm install --config stm32f4discovery-cmake-gcc10-debug<EMAIL_ADDRESS>xpm install --config stm32f4discovery-cmake-gcc9-debug<EMAIL_ADDRESS>The xpacks
folders are not stored in the project folder, but in the
configuration build folder, configured via the buildFolderRelativePath
property.
Similarly, the dependencies are stored in the configuration, for example:
{
"...": "...",
"xpack": {
"configurations": {
"stm32f4discovery-cmake-gcc10-debug": {
"devDependencies": {
"@xpack-dev-tools/arm-none-eabi-gcc": "10.2.1-1.1.2"
}
},
"stm32f4discovery-cmake-gcc9-debug": {
"devDependencies": {
"@xpack-dev-tools/arm-none-eabi-gcc": "9.3.1-1.4.1"
}
}
}
}
}
Dry-run (-n|--dry-run
)
Do everything except to actually install the packages(s).
Save to dependencies (-P|--save-prod
)
Add the installed packages to the dependencies
array and
update the package.json
;
Unless an explicit -D
or -O
, source xPacks are stored to
dependencies
by default.
Prevent saving to dependencies (--no-save
)
Prevent saving to dependencies and updating the package.json
file.
Save to devDependencies (-D|--save-dev
)
Add the installed packages to the devDependencies
array and
update the package.json
.
Unless an explicit -P
, binary xPacks and npm modules are stored to
devDependencies
by default.
Save to optionalDependencies (-O|--save-optional
)
Add the installed packages to the optionalDependencies
array and
update the package.json
.
Save to bundleDependencies (-B|--save-bundle
)
Add the installed packages to the bundleDependencies
array and
update the package.json
.
Save with exact version (-E|--save-exact
)
By default, the stored reference to the installed package
uses the ^
syntax,
which is the npm/semver convention that means compatible,
in other words the
highest version that does not change the major number, if available.
For example:
{
"...": "...",
"devDependencies": {
"liquidjs": "^9.23.3"
},
"xpack": {}
}
This option changes the behaviour by storing the version without ^
,
which means the exact version is required.
Unless an explicit -D
, binary xPacks with longer version
strings (that do not comply to
semver) are stored without ^
by default, for example:
{
"...": "...",
"devDependencies": {
"@xpack-dev-tools/arm-none-eabi-gcc": "10.2.1-1.1.2"
},
"xpack": {}
}


Id: 418
Name: Mrs. Sullivan's Boyfriend
Status: Alive
Species: Human
Type: Necrophiliac
Gender: Male
OriginName: Interdimensional Cable
OriginUrl: https://rickandmortyapi.com/api/location/6
LocationName: Interdimensional Cable
LocationUrl: https://rickandmortyapi.com/api/location/6
Image: https://rickandmortyapi.com/api/character/avatar/418.jpeg
Episode: ['https://rickandmortyapi.com/api/episode/8']
Url: https://rickandmortyapi.com/api/character/418
Created: 2018-04-15T21:43:43.867Z


The Technology Detection add-on uses the Wappalyzer rules to detect the technologies used by applications.
它的工作方式与Wappalyzer浏览器加载项非常相似，以下情况例外：
Beside the site selection drop down is an Export button which can be used to export a CSV (comma separated values) file based on the table information currently being displayed. There is also a toggle button which allows users to easily Enable/Disable the Wappalyzer passive scanner.
The toolbar includes an enable/disable toggle button which controls whether the technology detection passive scan rule is functioning or not. This enabled state is persisted between ZAP sessions.
| https://www.wappalyzer.com/ | The Wappalyzer Homepage | |
| https://github.com/wappalyzer/wappalyzer | The Wappalyzer Repository |


Class: Concurrent::SerializedExecutionDelegator
- Inherits:
-
SimpleDelegator
- Object
- SimpleDelegator
- Concurrent::SerializedExecutionDelegator
- Defined in:
- lib/concurrent/executor/serialized_execution_delegator.rb
Overview
A wrapper/delegator for any ExecutorService
that
guarantees serialized execution of tasks.
Instance Method Summary (collapse)
-
- (self) <<(task)
included
from ExecutorService
Submit a task to the executor for asynchronous processing.
-
- (Boolean) can_overflow?
included
from ExecutorService
Does the task queue have a maximum size?.
-
- (SerializedExecutionDelegator) initialize(executor)
constructor
A new instance of SerializedExecutionDelegator.
-
- (undocumented) log(level, progname, message = nil, &block)
included
from Concern::Logging
Logs through global_logger, it can be overridden by setting @logger.
-
- (Boolean) post(*args) { ... }
Submit a task to the executor for asynchronous processing.
-
- (Boolean) serialized?
included
from SerialExecutorService
Does this executor guarantee serialization of its operations?.
Constructor Details
- (SerializedExecutionDelegator) initialize(executor)
Returns a new instance of SerializedExecutionDelegator
15 16 17 18 19 |
# File 'lib/concurrent/executor/serialized_execution_delegator.rb', line 15 def initialize(executor) @executor = executor @serializer = SerializedExecution.new super(executor) end |
Instance Method Details
- (self) <<(task) Originally defined in module ExecutorService
Submit a task to the executor for asynchronous processing.
- (Boolean) can_overflow? Originally defined in module ExecutorService
Always returns false
Does the task queue have a maximum size?
- (undocumented) log(level, progname, message = nil, &block) Originally defined in module Concern::Logging
Logs through Concurrent.global_logger, it can be overridden by setting @logger
- (Boolean) post(*args) { ... }
Submit a task to the executor for asynchronous processing.
22 23 24 25 26 |
# File 'lib/concurrent/executor/serialized_execution_delegator.rb', line 22 def post(*args, &task) raise ArgumentError.new('no block given') unless block_given? return false unless running? @serializer.post(@executor, *args, &task) end |
- (Boolean) serialized? Originally defined in module SerialExecutorService
Always returns true
Does this executor guarantee serialization of its operations?


Bharath Kumar Murugan
Devops Engineer
About me
Software developer looking for position as a dedicated DevOps Engineer. Have 2 years of experience in software development .Team-oriented worker able to collaborate with coworkers in order to complete projects in a timely manner.
-
Bharath Kumar Murugan
-
03 December 1992
-
3 Thiruppathi Nagar Keelkattalai Chennai 600117
-
<EMAIL_ADDRESS>-
(91) 741 88 30296
Timeline
The Arctic Ocean freezes every winter and much of the sea-ice then thaws every summer, and that process will continue whatever happens.
Learn moreCareer Experience
According to the National Oceanic and Atmospheric Administration, Ted, Scambos, NSIDClead scentist, puts the potentially record maximum.
Devops Engineer
- Developed automation on CI/CD pipeline, integrating Git, Jenkins, Jira and Containers across geographically separated hosting zones in AWS.
- Built automation using python that generate groovy scripts for Jenkins Job and Jenkins Pipeline.
- Developed python scripts that scrap data from scm tool and load & performance test tool report.
Engineer
- Designed and developed interactive font-end development for web applications using HTML, CSS and AngularJS.
- Collaborated with senior developers in creating an e-learning portal for the organization with community forum, live chat and blog. And also involved in creating REST APIs for the application.
- Designed HTML prototypes and UI deliverables such as wireframes, flowcharts and screen mock-ups.
- Created user interactive design for desktop and Web-based projects, including dashboards and widgets.
Intern
- Designed and developed an interactive web application that helps in creating webpages.
- Implemented web components, CSS and JavaScript with drag and drop feature.
- Implemented automatic backend script generation for the webpages at runtime.
Projects
According to the National Oceanic and Atmospheric Administration, Ted, Scambos, NSIDClead scentist, puts the potentially record low maximum sea ice extent tihs year down to low ice.
Issue Tracker
The Arctic Ocean freezes every winter and much of the sea-ice then thaws every summer, and that process will continue whatever happens.
Learn moreIssue Tracker
The Arctic Ocean freezes every winter and much of the sea-ice then thaws every summer, and that process will continue whatever happens.
Learn moreWe made website building easier for you.
I will be the leader of a company that ends up being worth billions of dollars, because I got the answers. I understand culture.


Welcome to my personal website. To ensure that all features of this page are working correctly, please use the latest version of your browser.
ABOUT MEI turn ideas into reality, believing anything can be created with the correct creative direction and skills.
With experience in the customer service industry I'd describe myself as a person with a versatile set of skills. Bearing the devotion and willingness to go an extra mile to satisfy a customer, if theres an expectation to be met I will ensure that the bar is passed.
I'm looking to take my career to the next level and expand on my education, following a direction that will allow me to innovate and treat society as my customers. I'd like to build a path that will allow me to continue learning and testing the boundaries of modern society.
The brick walls are not there to keep us out. The brick walls are there to give us a chance to show how badly we want something. -Randy Pausch
Currently employed at Olympian Swimming as a lifeguard and swimming instructor. I work with children ages 4-14 creating an fun and educational enviroment for students.
Served by the dozen is a phrase that is commonly heard at Tiny Tom Donuts, Toronto's famous fried donut store that is frequently found at fairs, amusement parks, and exhibitions. As a Manager at Tiny Tom, I train new employees, ensure we have adequate inventory on hand, and verify our sales records and financial information after every shift.
I currently serve as Vice President of Dr. Norman Bethune's Student Administrative Council where I work collectively with the leaders of the school to organize spirit days and school wide events.
Bethune's Debate Club participates in regional debate competitions against different schools, arguing controversial topics such as BIRT It should be mandatory for all students in Ontario to take a senior history course.. I particularly enjoy being President of the Bethune Debate Club as it provides me with the opportunity to mentor younger members of the Debate Club and strengthen their logical reasoning.
I have been involved in DECA for the past three years, and it has allowed me to explore the world of business, and meet like minded business-orientated individuals. Recently, my partner and I placed 1st overall within the Toronto Region in the Business Team Decision Making category
Working with youth in the community as a Volunteer Coordinator, I lead a group of volunteers in organizing events such as basketball tournaments
Have any questions? Feel free to send me an email to ask me any questions about anything from my projects to how I created this website!
wenson647@hotmail.com


No account? No problem, create one here
KickApp allows you to find nearby football fields to play around your neighbourhood. You can see how many people are playing, reviews for each field and even add friends if you meet them and they are users of the app. Each location will indicate who is playing on the day and the type of field it is.
Find a pick up game nearby and see if your friends are there.
Easy to locate with markers indicating each field and their respective information.
Met someone new while playing? Add them as a friend on the app and grow your network.
Invite your friends to play and create a game.


Just one sec while we load the data... we are about to drop some pins on that map over there.
Search by your current location or enter an address in the search bar in the map to look for current building permits near you.
Just one sec while we load the data... we are about to drop some pins on that map over there.
Search by your current location or enter an address in the search bar in the map to look for current building permits near you.


As part of our ongoing effort to provide better support and services, we would like to request some details from you.
Required Optional


GV framework documentation version 1.4
Thanks for using GV framework!
You are awesome!
The goal of GV is to create web services or web sites as fast and robust as possible, following the convention over configuration technique, Hexagonal architecture patterns and market standards.
Through this documentation I assume that you have some knowdledge of PHP, usage of the command line, and databases in general.
This documentation is to help you regarding each step of your development. Please go through the documentation carefully to understand how this framework was made and how to use it.
You will need the following dependencies to make GV work.
Docker will create all the containers needed for GV to work as fast as possible
You can still install everything manually, and the information for it will be provided.
GV is composed by a lot of pieces, among them you will find:
We will cover everything on this page, so, dont be worried about fancy wording.
And of course GV itself is open source with a public repository on GitHub.
Before we go into the installation process, lets be sure that you have the required software installed
docker -v
docker-compose -v
git --versionIf the output of those commands are ok, you are ready to start :)
There are two ways of using GV, through docker and manually.
Please read more about docker here.
Before we start, clone GV repository into any directory that you would like to work, for instance:
$> mkdir repos $> git clone git@github.com:veraguido/gv.git
Or if you use composer, just do:
$> composer create-project gvera/gv
We are ready to generate our 4 docker containers now, those are going to be separated in: nginx, php, mysql and redis
Place yourself in the root folder of GV and run:
$> ./gvconsole build
After the command is finished, our containers are ready to be started:
$> ./gvconsole up
Provision your database:
./gvconsole doctrine orm:schema-tool:create
Now navigate to localhost:8089 in your browser to check if the installation was successful. You should be able to see the welcome json object indicating the version of GV and the cache that is being used.
Be sure to install: the web server of your choice, php, composer, mysql and redis.
Configure your web server's virtual hosts to point all its requests to public/index.php which is the application's entry point
go to config/config.yml and configure your app to change your database's credentials
gvconsole is a shell script that will lead you thorugh all the administration options.
The idea is to manage everything through gvconsole {available_command}
For starting, let's list all the possible commands with gvconsole
$> ./gvconsole
That command will output:
-/*-/*-/*-/*-/*-/*-/* APPLICATION COMMANDS -/*-/*-/*-/*-/*-/*-/* clear-cache create-controller create-model create-user create-user-role create-user-role-action create-user-status disable-task doctrine doctrine-migrations enable-task generate-api-doc list-user-roles scheduler tests list-tasks -/*-/*-/*-/*-/*-/*-/* DEPENDENCY COMMANDS -/*-/*-/*-/*-/*-/*-/* composer -/*-/*-/*-/*-/*-/*-/* BUILDING COMMANDS -/*-/*-/*-/*-/*-/*-/* build phpcs phpcbf -/*-/*-/*-/*-/*-/*-/* CONTAINER MANAGEMENT COMMANDS -/*-/*-/*-/*-/*-/*-/* start stop up down logs enter
We will go one by one, don't worry.
In a typical gv application, the cache is going to be managed by redis, but redis is not mandatory, the strategy is, gv will ping redis, if this one is available it will be used, if not, the files cache strategy will be put in place.
If redis is not used, the cache will be stored in the var/cache/files/ directory. Note: this fallback can be changed on the config file.
./gvconsole clear-cache usage example: clear-cache 1 Please select the option: -------------------------- 1 - Flush all 2 - Flush config 3 - Flush routes 4 - Flush translations 5 - Flush controller names --------------------------
The create controller that will help you to create your controller in the correct path, and extending the correct base class. Parameters are: class name and method names separated by space
./gvconsole create-controller usage example: ./gvconsole create-controller Cars \ list create update delete
The create models command will guide you thorgh the process, doctrine is used as the ORM for GV so please, if you haven't heard about it read the documentation.
Usage:
./gvconsole create-model
GV uses doctrine as the defacto ORM, to execute the doctrine commands, run:
./gvconsole doctrine
Please if you have doubts about doctrine, read their documentation.
./gvconsole doctrine #!/usr/bin/env php Doctrine Command Line Interface version 2.4.8 Usage: command [options] [arguments] Options: -h, --help Display this help message -q, --quiet Do not output any message -V, --version Display this application version --ansi Force ANSI output --no-ansi Disable ANSI output -n, --no-interaction Do not ask any interactive question -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug Available commands: help Displays help for a command list Lists commands dbal dbal:import Import SQL file(s) directly to Database. dbal:run-sql Executes arbitrary SQL directly from the command line. orm orm:clear-cache:metadata Clear all metadata cache of the various cache drivers. orm:clear-cache:query Clear all query cache of the various cache drivers. orm:clear-cache:result Clear all result cache of the various cache drivers. orm:convert-d1-schema Converts Doctrine 1.X schema into a Doctrine 2.X schema. orm:convert-mapping Convert mapping information between supported formats. orm:convert:d1-schema Converts Doctrine 1.X schema into a Doctrine 2.X schema. orm:convert:mapping Convert mapping information between supported formats. orm:ensure-production-settings Verify that Doctrine is properly configured for a production environment. orm:generate-entities Generate entity classes and method stubs from your mapping information. orm:generate-proxies Generates proxy classes for entity classes. orm:generate-repositories Generate repository classes from your mapping information. orm:generate:entities Generate entity classes and method stubs from your mapping information. orm:generate:proxies Generates proxy classes for entity classes. orm:generate:repositories Generate repository classes from your mapping information. orm:info Show basic information about all mapped entities orm:run-dql Executes arbitrary DQL directly from the command line. orm:schema-tool:create Processes the schema and either create it directly on EntityManager Storage Connection or generate the SQL output. orm:schema-tool:drop Drop the complete database schema of EntityManager Storage Connection or generate the corresponding SQL output. orm:schema-tool:update Executes (or dumps) the SQL needed to update the database schema to match the current mapping metadata.
For using doctrine migrations, those are going to be put under resources/migrations/ directory
The command to be run to manage migrations is ./gvconsole doctrine-migrations
./gvconsole doctrine-migrations #!/usr/bin/env php Doctrine Migrations version v1.5.0 Usage: command [options] [arguments] Options: -h, --help Display this help message -q, --quiet Do not output any message -V, --version Display this application version --ansi Force ANSI output --no-ansi Disable ANSI output -n, --no-interaction Do not ask any interactive question -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug Available commands: help Displays help for a command list Lists commands migrations migrations:diff Generate a migration by comparing your current database to your mapping information. migrations:execute Execute a single migration version up or down manually. migrations:generate Generate a blank migration class. migrations:latest Outputs the latest version number migrations:migrate Execute a migration to a specified version or the latest available version. migrations:status View the status of a set of migrations. migrations:up-to-date Tells you if your schema is up-to-date. migrations:version Manually add and delete migration versions from the version table.
Unit tests are created under the tests directory in the root of the project, Phpunit is used for them. if you have any doubt please read their documentation.
To run unit tests, please use ./gvconsole phpunit
./gvconsole phpunit
The scheduled tasks are basically cron jobs that will execute your tasks on a specific moment in time.
GV will handle the setup for it you only need to focus on 3 things: create the task that you want to execute, enabling your task and disabling it if you want.
Tasks should be put in the tasks directory under Resources
In your task you can do whatever is needed, for instance, could be, log amount of orders created, get information from an external system and save it into the database, run a mysql query, etc.
In order to enable your scheduled task use the gvconsole command:
./gvconsole enable-task \* \* \* \* \* {name of your task as you have it on your tasks folder, without the .php} {identifier for deletion}
If you are wondering what are the * in the command, please read this.
For example:
./gvconsole enable-task \* \* \* \* \* awesome-task aw3some
The selected task, in this case will run every minute, and will log a specific message through logger.
To remove a task use the gvconsole disable-task command, using the identifier when you enabled it.
./gvconsole disable-task aw3some
If you don't remember the identifier of a command use the gvconsole list-tasks command:
./gvconsole list-tasks
$> ./gvconsole list-tasks * * * * * php resources/tasks/awesome-task.php >> var/log/cron.log #aw3some
All your tasks will log their output into the var/log/cron.log file
To enter into any of the containers that gv provides you need to run:
$> ./gvconsole enter {name_of_the_container}
The containers that gv creates by default are: gv_mysql_1, gv_redis_1, gv_nginx_1 and gv_php_1
You can create users, user roles and user role actions, for example:
$> ./gvconsole create-user-role admin 10 $> ./gvconsole create-user admin<EMAIL_ADDRESS>complexPassword admin $> ./gvconsole create-user-role-action canpublish admin
We first create a new user role with the role name and a role priority (an integer defined by you) as a second parameter.
We then use the create-user command with: username, email, password and role name as parameters.
Lastly, and only if you want to use it on your application, we define a role action with a role name as a second parameter
If you use the openAPI standard on your controllers you can generate the api docs with:
$> ./gvconsole generate-api-doc
This will scan all your controllers and generate the api documentation, which will be under /doc
Note: the documentation is under basic authentication and you have to have a valid user to access it.
Let's imagine that you need to validate the input set from your HttpRequest. GV has a set of rules for you to do this very easily, following convention over configuration through the ControllerValidationAbstract class.
You could use a new Validation Object, which will be separated from anything else, and then use the validate() method. Look at the example below:
We have a method inside our Examples controller called login, this action expects to receive username and passoword fields.
We then need to Create a new class with the same controller name and method name but under the Validations directory, extending ControllerValidationAbstract like this:
Then we need to implement the same method name we want to validate, in this case login() utilizing the protested "fields" property.
Lastly inside your controller the only thing you need to do is $this->httpRequest->validate()
Let's imagine that you need to validate a specific field that is comming from the request. In this case is will be the "email" field
In this field you need to validate a set of rules, first that the field is not empty, then that the field is a valid email string.
GV has a validation service for you to use and validate your fields. Usage:
This will return true, false or throw an exception.
There are 3 validation strategies in place, you can add the ones that you need for your project extending the ValidationStrategyInterface, and hopefully send the pull request to the gv main repo :)
All the requests sent to a gv application will go through the index.php file located at the public folder, this is managed though the .htaccess file
Gv has a set of classes that are responsible of the http lifecycle, those are HttpRequest and HttpResponse. This two classes are already initialized and put into the main controller class.
HttpRequest
HttpRequest has the getParameter method that will return the fields wanted. For instance, inside a controller you can:
Within the HttpRequest You can also check the request method using isPost(), isGet(), isDelete(), isPut() and isPatch()
When you want to generate a response, you can use Any of the built-in response types: Response, JSONResponse, TransformerResponse or PrintErrorResponse
HttpResponse
In your controller you can setup your httpresponse, the default behavior will be:
The methods available in the HttpResponse class are:
You can add http method validation to your controllers, by using the @httpMethod annotation, as an example:
/** * @httpMethod("GET") */ public function view() { //your code here }
The above will validate that the actual request is of that method (in this case a get method)
Tip: you can use multiple Http methods in this annotation, for instance @httpMethod("GET", "POST", "PUT")
GV includes an event mechanism ready to be used. This mechanism is composed by different parts.
All your event listeners will need to be registered in this Class, inside GvEventListenerRegistry->registerEventListeners() method, GV will handle the relationships after it. For example:
Your events must be created under the events folder, and they need to extend from GvEvent for instance:
Your listeners must implement EventListenerinterface and you must implement the handleEvent method that will be executed when the event is triggered. In the following example, the user will receive an email when the account is created, while devmode is not true.
The event dispatcher is the class that is going to dispatch the events that you need when you need it. For the sake of the example we will dispatch our event when a new user is created, the "CreateNewUserCommand"
GV includes a command pattern put in place for enforcing the hexagonal architecture and make your code frameworkless.
Your commands will need to implement CommandInterface, and you will need to implement the execute method. For example:
Then you need to execute the command where you think is needed:
GV was built with the idea of not having uneeded configuration files, that's why you only need to configure only one small yml file. config.yml is in the config directory.
If for some reason you want to avoid using the default url strategy of host/{controller}/{method} you can write your own url rewrite in the routes.yml file located at the config directory
The rules are, whatever you put between ":" will be counted as parameters of the http request, and then the action will be fowarded with {controller}->{method} follow the example
GV comes with some pre-built Http response types: Response, JSONResponse, TransformerResponse, PrintErrorResponse
In your controller you just have to call $this->httpResponse->response() specifying which response you want. For example:
GV was done with ease in mind, every exception thrown will be catched by the application and depending on the state of the app two things can happen:
As a good practice you can throw a GVException with parameters, that will be sent to the log through Logger.
A fractal transformer is a way of present filtered and serialized data as output on the response of your Restful API
When calling httpResponse->response() method, you can pass a TransformerResponse object, which will take care of the rest.
The way to do this is extending the TransformerAbstract class, and pass your object on the constructor. In this new transformer class you need to overwrite the transform method.
Please not that your transformer object should be on src/Helpers/transformers/ directory.
The transform method should return an array containing exactly what you need to response. See the example below:
Throttling will prevent DDOS or brute force attacks on your application, limiting the ammount of requests per second allowed on a given ip
Please note that for using throttling, your application has to use redis as the source of your cache.
The way of enabling throttling and the allowance is as easy as going into config/config.yml and change throttling value to true, as well as "allowed_requests_per_second" to the number you'd prefer.
Gv comes with xdebug to be used out of the box. You just need to check that the .docker/php.ini file has the needed lines for this not commented:
In this case it would be from line 7 to 12, also remember to configure your ide with the correct configuration. For instance on Visual Studio code:
or in PHPStorm:
You can obviously disable xdebug on the php.ini file
General recommendations for your project
GV provides a way of using dependency injection out of the box. This technique is based on inversion of control, giving the responsibility of the instatiation of the objects to the application based on rules.
The rules imposed in GV are three:
Let's take a look at an example
Inside the examples controller we can find the login method, inside it we can see that there's a call made to "getLoginCommand", all GvControllers have magic methods implemented. Meaning that you can call any ioc object from it's name
In this specific example, the object called is "loginCommand"
you can use this example if you need to pass more than one object to inject in the constructor
Let's start taking a look at the ioc.yml
Other valid nodes in your objects are: parameters (if you want to initialize your object with specific parameters, and singleton, if you want only one instance of your object to live on the application lifecycle
Now let's take a look at the LogginCommand Class.
We can identify 3 important things of this class:
Through this technique you can Inject objects within your objects through properties or in the constructor itself and forget about instantiation :)
I am just a regular guy that wanted to contribute to the open source community. I hope you enjoy GV as much as I enjoyed building it.
You will find more information about me here.
I am just a regular guy that wanted to contribute to the open source community. I hope you enjoy GV as much as I enjoyed building it.
You will find more information about me here.


Fish deserve names, just like the rest of us. Pick a name for this fish:
Save
This is a picture of a fish named
:


disabled
field support chart
← Return to main list
| |
VoiceOver Chrome |
VoiceOver Firefox |
VoiceOver Safari |
NVDA Chrome |
NVDA Firefox |
NVDA Edge |
JAWS Edge |
JAWS Edge |
<button> with disabled |
Announced |
Announced |
Announced |
Announced |
Announced |
Announced |
Announced |
Announced |
<input> with disabled |
Announced |
Announced |
Announced |
Announced |
Announced |
Announced |
Announced |
Announced |
<textarea> with disabled |
Announced |
Announced |
Announced |
Announced |
Announced |
Announced |
Announced |
Announced |
<select> with disabled |
Announced |
Announced |
Announced |
Announced |
Announced |
Announced |
Announced |
Announced |
<option> with disabled |
Announced |
Option not announced |
Announced |
Option not announced |
Option not announced |
Option not announced |
Option not announced |
Option not announced |
<fieldset> with disabled |
Announced |
Announced |
Announced |
Announced |
Announced |
Announced |
Option not announced |
Option not announced |


Hi, there!
WattCharger allows you not only to find your charging posts taking into consideration your vehicle characteristics but also allows you to plan your routes when you're travelling abroad avoiding the boring process of payment cards creation, in different countries. Yes! We provide a single card that unites all current charging cards, allowing you to travel around Europe without worrying about the next payment spot.


Fixed inaccuracy in the type system intro in tour: private instance methods are visible from class methods and vice-versa, when using <Instance> and <Self class> types.
Corrected longstanding documentation error on the history page that failed to credit Dan Ingalls for his work on the first attempt at a static type system for Smalltalk.
Added AssocSet
(Dave Griswold) This release consists of just a couple of things that came up shortly after the first public release to address some issues people were having:
A Benchmarking Guide has been added to the documentation to help people avoid some very common benchmarking traps.
A bug is fixed in Dictionary>>at:put: that caused it to allocate an Association even when an entry already exists for the key. This was fixed a long time ago, but apparently the fix got lost. This speeds up replacing dictionary values by about 32%. It ought to be even faster- the code generator must not be producing good code for this for some reason.
Support for file-ins in basic Squeak format is now supported. This is just for simple classes and methods, and has one big caveat: the class must not have a class comment. Primarily useful for moving benchmarks around. Classes in this format can be filed into VisualWorks, too, if you remove the 'stamp:' keywords on the method chunk headers.
This release consists of contributions from
David Griswold - lots of different kind of cleanup work and enhancements:
Made it work on Windows XP. Command line arg handling was wrong, and lots of files were read-only that shouldn't have been. DON'T run in a compatibility mode, unless you are filing in my 1.1 deltas to 1.0, in which case you MUST:
First start the 1.0 system in Windows 95 compatibility mode.
File in my 1.1 code, and save the system
Exit, and turn off compatibility mode
make strongtalk.bst.bak writable (for some reason, compatibility mode cause it to be read-only)
Tons of library changes to get the core libraries back to (or closer to) being fully typesafe. More to do, especially the Stream and Visual hierarchies, which I had done a lot of work to clean up a long time ago but lost the changes, so I am too depressed about it to tackle it again right now. But at least the Collection, Number and many other critical "Blue Book" areas are quite close to being typesafe now (most of the remaining problems are bugs in the typechecker or in other people's code). I will do more on this.
Fixed an bug in the typechecker error display code caused by a postincrement that should have been a preincrement. This needs more looking at.
HTML Browser enhancements to make the System Tour work, including making it possible to view html documents edited (in some ways) using Outlook Express.
Wrote the System Tour and reorganized and extended the rest of the documentation.
Added filtering to the hierarchy browser. The API can do hierarchy filtering with an arbitrary predicate, and the UI has convenience interfaces for filtering on common library subsets, class comment substrings, or on subclasses of a class (which lets you nicely view a class' subhierarchy and its superclass chain at the same time), or combinations built up using AND operators. Filtering is used by the system tour to make it easy to view all the classes in a subsystem at once, regardless of where they are. Look on the context menu for subclasses as well as on the pulldown menus (they are different). Classes that don't match but that need to be shown because they have matching subclasses can be distinguished by a different font.
Added support for a source code save log, which makes rapid development a whole lot easier. To use it, create an empty text file in the source subdirectory called strongtalkSave.log, and it will accumulate saved source code changes, without any changes that haven't been saved. Not as good as projects, but a whole lot better than what we had before.
The system now keeps track of whether you have made source changes or not, and prompts you intelligently to save or not when you try to exit. %Bug: Doesn't work for the rare things that aren't reflected in the change log. Why isn't everything reflected there? You can also view all unsaved source changes made during a session (See "Browse/Unsaved Changes" in Launcher menu).
Changed the Transcript so it can show DoIt buttons for system restore after a session crash
Added mouse scrollwheel support
"implementers", "senders" and "messages" now open a browser directly if there is only one match.
Added Apply button to Definitions selection box, so you can quickly browse many matching classes.
Added prompt dialog for category name changes for safety.
added back the missing prims.src file (with many changes) so that primitives can be typechecked.
Ctrl-O (open definition) now only needs the cursor to be on the name of the definition in text- it will try to select the range itself.
Switched browser fonts to ones that work with ClearType technology in Windows XP. (makes fonts much higher resolution on LCD displays- try it!).
added a gross hack because the full garbage collection doesn't run automatically right now so that we don't run out of virtual memory while browsing, by running GC explicitly in the browser every time we load a page. I do it in a background process that waits 1/4 second after page loading so that it hopefully happens during think time.
When creating a new subclass in the prog. env. a browser for the new class is now automatically launched.
HTML Browser now supports <strong>. Also, headings can now contain <br>, images, links, and other phrase markup.
Quitting the system without saving changes now automatically reverts the source database, so that quitting after unsaved changes doesn't leave the source database in an inconsistent state (you are prompted to save if you want, and you can view the unsaved changes from the Browse menu if you want to save them some other way). The changes are still recorded in the change log no matter what.
Added a toolbar button to Class browers to spawn the superclass.
Ctrl-Shift-Enter is now a shortcut for accept & typecheck in TypedCodeViews.
Turned off smooth scrolling by default. This seems to reduce the frequency of the occasional hangs people have been having. You can turn it on again from the Launcher Dev menu.
TextViews now automatically resize by default. This makes the browsers work a lot cooler.
Fixed that nagging baseline alignment bug when imbedding category outliners in browser pages.
*Maybe fixed the hellish intermittent temporary hang in the system. Guessed it was some kind of deadlock on the semaphore protecting the event 'grab' stack, used by the region enter/leave managment logic, so disabled it by returning a new semaphore anytime anyone asks, and haven't had a hang since! Theoretically this opens a hole, but the monitor was only there for an obscure case that probably has never happened anyway (two processes asking for the event grab at the same time). Can try turning smooth scrolling on again now.
Gilad Bracha and the rest of the team- A copy of the new paper on mixins has been included.
Fixed: one of the typechecker error display bugs -D.G.
Fixed: Now works on Windows XP - D.G.
The new dialog boxes I added to keep track of whether source changes have been made, only keep track of things that modify the change log. Other changes (specifically creation of a new category) aren't noticed, and don't by themselves cause the quit dialog to prompt you. I need to fix this at some point, although it is rare to just modify a category without modifying any method. -D.G.
otherwise, same as 1.0
This is the original release from Sun Microsystems, Inc. Most of the work done internally at Sun to get this ready for release was done by Gilad Bracha and Robert Griesemer.
Doesn't work on Windows XP.
There are a variety of shortcomings and bugs in the typechecker, but here are some of the main ones you may encounter:
(c) 1994-1997 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
Use and distribution of this software is subject to the terms of
the
source license.


{% extends "base.html" %} {% block body %}
If you have questions, suggestions, or are simply interested in the technology behind reTOracle:
Shoot us an email!


Steven Gerrard makes Rangers contract pledge as he hails 'box office' Alfredo Morelos
The Ibrox boss is preparing for a season defining period as the international break comes to an end.
by Liam Bryce, https://www.dailyrecord.co.uk/authors/liam-bryce/Steven Gerrard has told his Rangers stars that new contracts will take care of themselves - if they bring silverware to Ibrox.
Rangers are set to embark on a season-defining period that includes a Betfred Cup semi-final showdown with Celtic.
Gerrard 's side sit just one goal behind their Glasgow rivals in the Premiership and are also on course to reach the Europa League last 32.
Nikola Katic and Ryan Jack have been rewarded with improved terms this season with extensions for the likes of Jermain Defoe and Allan McGregor also a possibility.
But the Rangers boss insists there will be no reward without trophies as he previews Sunday's visit to Hamilton.
He said: "The players don't have to worry about new contracts, if they perform to a top-level consistently and bring silverware they will be rewarded by the club.
"The form we are in there is one part wanting to play play play but is important when you get a chance for a rest for the players and staff to use it in the right way.
"There are some really interesting fixtures in this next block up to Christmas, it is exciting and the players have earned the chance to have this but the focus is all on Hamilton for now."
A number of Gerrard's stars returned from international duty over the past few days in buoyant mood.
Glen Kamara and Filip Helander celebrated Euro 2020 qualification with Finland and Sweden, while there was also a first Colombia goal for Alfredo Morelos to savour.
The striker has now hit 23 overall this season and Gerrard reserved special praise for his talisman, hailing him as "box office".
Gerrard said: "We are very pleased for Alfredo, it was only a matter of time before he got his goal. Scoring goals is what he does.
"People forget he is still 22, he is box-office.
"I have no doubt he will continue to answer all questions that come his way."
And, after he was pictured back in training on Thursday, Gerrard confirmed Jordan Jones is closing in on a comeback at just the right time.
He added: " Jordan Jones is back in full training, I am delighted to have him back. I predict he will be available for selection in 10 days by the time he gets up to speed."


Basement Jaxx and The Divine Comedy announced as headliners for Kaleidoscope 2020
The three day event will take place next June
by William DunneBasemen Jaxx and The Divine Comedy have been announced as the headline acts of a festival in Co Wicklow next summer.
The Where's Your Head At hitmakers and the Northern Irish band will take to the main stage for Kaleidoscope 2020.
The three day event will take place between June 26-28 at Russborough, Blessington.
The festival has also announced the return of all of the much-loved entertainment areas that debuted in June - Rumpledumpus, The Front Lawn Stage, The Hippodrome Theatre, Cinema Under The Stars, Wonderland Junior, Wonderland Teen, the Scrumdiddlyumptious Festival of Food and The Big Hooley.
The Sports and Wellness programme, Kaleidoscope Carnival, and the World’s Largest Bouncing Castle are set to return next summer.
And if you fancy kitting the family out in Kaleidoscope gear, check out the website for t-shirts and hoodies, alongside the festival's limited edition Irish handmade Kaleidoscope soft by Irish toymakers Red Rufus costing €14.95 and Kaleidoscope Christmas mug priced at €15.00 all available from the Kaleidoscope online shop here.
How to follow the Irish Mirror on social media
You can like our main Facebook page here.
Our Irish Mirror Sports page - which brings you all your Irish and UK sports news - can be found here.
You can also check out our Irish Mirror GAA sports page.
The Irish Mirror Twitter account is @IrishMirror while our sports account is @MirrorSportIE.
Our Instagram account can be found here.


NIT KKR Discussion Forum
Home
Feedback
Navbar Link
menu
Question Display
Have another Question?..Add Here
Add Question


{%extends 'base.html'%} {%load static%} {{block.supper}} {%block content%} {%include 'navbar.html'%}
Marched {{founds|length}} related Posts
{%else%}Either {{term}} Has no photos to share or has no profile !
{%endif%}{{user.user}}'s Posts Visit profile
{%endfor%}


The server is usually accessed via a GSvar client only!
Information about the server can be found on the info page. Information about the API endpoints can be found on the help page.


Stage 5: Game Lifecycle: drawing text, title screen, failure condition, and moving between levels
Currently, when monsters are killed they are immediately deleted from the game. That's great, but there is no code to handle
player death. Let's tackle that now.
Game state
We'll add the concept of a
so we can model the game as a
finite state machine with four states.
Our four states:
- loading: waiting for the assets to load
- title: on the title screen
- running: playing the game actively
- dead: the moment after the player has died, but before returning to the title screen
"Finite state machine" sounds super complicated. It's not.
Just think about a title screen. That's a state. Then when the
actual game is running, that's a state. Clearly different things are displayed on the title screen versus the game proper. And pressing a specific button in-game and pressing it on the title screen do different things. So that's all we're trying to accomplish.
To make this work, we need to only do two things.
- When needed, switch states simply by setting to a different state name
- Use conditionals checking the value of to wrap behavior that should only occur in specific states
index.html
When our spritesheet image loads, we want to switch to showing the title screen which is accomplished by assigning a function to
(we'll write that
function below next). But what's our first state? Unsurprisingly, we're initializing
to "loading" because that's the first thing that happens.
While we're here, we're adding some variables related to the game lifecycle:
and
.
Within the
handler, you can see where we're starting to add transitions between game states when buttons are pressed and also restricting when gameplay actions can take place (only when "running").
Lastly, we're moving out some code related to setting the
location and generating a level. If we're going to have multiple levels, it no longer makes sense to do these things only once.
There are several small changes to add to game.js:
game.js
In
,
we restrict our draw operations to when the game is running OR when the player just died.
In
,
we change to the "dead" state when we detect that the player has died.
In
,
we draw a semi-transparent black background, which will function as our title screen for now. Then we change to the "title" state.
In
,
we jump to the first floor, call
, and we change to the "running" state.
In
,
we move over the code that we took out of index.html. Also
gets initalized with
equal to the value passed in
. This value starts as 3, but in a little bit we'll use this function to persist player HP across levels.
Now load up the game. You'll see the "title screen", a black box for now. When you hit a key, the game will start running. And if you were to die, everything would freeze until you pressed another key... leading back to the title screen, this time overlaid semitransparently over the game. That's the whole state machine right there working!
Spawning more monsters
It's not easy to die in this game. No monsters spawn after the first two. Let's make it harder.
game.js
We're using two new global variables.
-
counts down until each spawn and then resets
-
is how often monsters will get spawned and provides the initial value for every time it is reset
After every spawn,
is decremented so that monsters come out even faster.
After the first 15 turns, a new monster gets spawned
14 turns after that, another monster spawns
13 turns after that, another monster spawns
...
And so on until monsters spawn every turn
Tweaking the initial value of
will have a massive impact on the game's design (try a value of 1 for some real fun).
Try that out and see how you like the spawn behavior.
Teleport counter
One more rough edge to smooth out. Monsters can spawn right next to us and immediately start attacking. It's also very weird to see monsters spawning in the middle of the map with no explanation.
One convenient explanation is that these monsters are being "teleported" into the map. While each monster is teleporting, which will take one extra turn, they will be unable to do anything. Think of this as equivalent to Magic's "summoning sickness".
To visually demonstrate this, we need a teleporting sprite. Let's draw that before getting to the code.
Drawing the teleport sprite
There's not much to this one. We draw a spiral, add swirly limbs, and outline it.
To integrate this teleporting thing, we'll use a counter just like we did with
.
This should look familiar. You can do a
hell of a lot of work with only boolean flags for statuses and integer counters for longer lasting effects.
monster.js
The monsters are teleporting in and spawning nicely... eventually leading to an unwillable scenario. Let's give the player an
exit from this situation.
Drawing the exit sprite
I tried drawing something resembling a portal.
Our
tile is a pretty basic object, but it does need to do something (i.e. go to the next level) whenever the player moves onto it. It's within the monster code that we determine when we're stepping on something, but after that point it's best to delegate to the tiles themselves. Each tile will know exactly what to do when stepped on.
tile.js
Notice that we need an empty
method for
too because monsters will be stepping on them as well. It won't do anything for now but it's nice to leave a little reminder comment to finish up the behavior later. We'll never need this method for a
because monsters don't step on those. And unlike in other languages we don't need this method on the base object in order to call it on the subclasses.
Now what happens when the player steps on the
? If we were already on the last level, we jump to the title screen. Otherwise, we start a new level with 1 extra HP.
Two more pieces to tie it all together: triggering
and creating the
tile.
monster.js
game.js
With these small additions, the game has some real structure to it.
Title time
The title screen is seriously lacking though. I don't want to do anything too crazy for the title screen, but at the very least it needs some text.
If you're trying to draw UI elements for a browser game, I would typically recommend trying it with HTML. You've got a lot of functionality out of the box with HTML & CSS, built up over decades. But for a few simple lines of text, the canvas will do just fine.
Drawing text on the canvas is not much different from drawing images. The important bit here is at the end:
.
All we need to pass is what text to draw and where.
game.js
The first two lines of our function set the font color and size. The string
might look a little cryptic. We're actually writing a bit of CSS : we specify a font size in "px" units (pixels) and specify the type of font we want, which is "monospace".
We're going to leave the Y position up to the caller, but to make things easier this function will handle X. We're going to draw text in two places basically: justified centered on the title screen and on the far right (where the UI is) during play. The
variable lets us toggle between these two.
So what does this line mean exactly?
textX = (canvas.width-ctx.measureText(text).width)/2;
When you want to center
any element, whether on the canvas or in HTML, the calculation is the same. For X: half the container width minus half the content width. For Y: half the container height minus half the content height. The reason is obvious when you see it:
This is a good example of where HTML & CSS would be a lot easier to use! For one there are many easy ways to center things in CSS (there weren't for about 20 years but now there certainly are). And for two getting the width or height of an HTML element is very easy. None of this
nonsense. Did you know there isn't even a way to measure the height? Ugh!
Anyway, enough ranting... let's draw some text.
game.js
To review the arguments to our
function
- some text
- a font size
- whether the text is centered
- the Y position
- the color
Whew! That's a mouthful, but trust me when I say it's preventing us from duplicating a lot of code.
We're drawing the level number on the UI during play and drawing the name of the game on the title screen. I chose a silly name. I'm sure you can do better.
Try it out. I think it's looking good. At this point, the game can be considered a fully playable and complete game. It's just not very interesting yet. We'll get there.
In the
next section, we'll be adding treasure and score mechanics.


|
Macro: |
|
|---|---|
|
Pattern: |
|
|
Description: |
Internal Use Only. Used
for making template parameters for the |
|
Where its used: |
|
|
Header Defined in: |
template_expansion_macros.hpp |
|
Macro: |
|
|---|---|
|
Pattern: |
|
|
Description: |
Internal Use Only. Used
in the implementation of |
|
Where its used: |
|
|
Header Defined in: |
template_expansion_macros.hpp |
|
Macro: |
|
|---|---|
|
Pattern: |
|
|
Description: |
Internal Use Only. This is used for processing all of the template parameters by "rebinding" the bft_arg_parse_impl using its process template member. |
|
Where its used: |
|
|
Header Defined in: |
template_expansion_macros.hpp |
|
Macro: |
|
|---|---|
|
Pattern: |
|
|
Description: |
Internal Use Only. Used
to create pattern for the |
|
Where its used: |
|
|
Header Defined in: |
template_expansion_macros.hpp |
|
Macro: |
|
|---|---|
|
Pattern: |
|
|
Description: |
Internal Use Only. This is used for processing the template arguments by passing each of the arguments into the bft_arg_parse_impl. |
|
Where its used: |
|
|
Header Defined in: |
bitfield_tuple_impl.hpp |
|
Macro: |
|
|---|---|
|
Pattern: |
|
|
Description: |
Internal Use Only. Helps produce the sequence T0, ... TN, both with and with out typename before it. |
|
Where its used: |
|
|
Header Defined in: |
template_expansion_macros.hpp |
|
Macro: |
|
|---|---|
|
Pattern: |
|
|
Description: |
Internal Use Only. used
to help generate type names and maintain the variadic behavior
of |
|
Where its used: |
|
|
Header Defined in: |
template_expansion_macros.hpp |
|
Macro: |
|
|---|---|
|
Pattern: |
|
|
Description: |
Internal Use Only. Macro
is used for generating template parameters for the |
|
Where its used: |
|
|
Header Defined in: |
template_expansion_macros.hpp |
|
Macro: |
|
|---|---|
|
Pattern: |
|
|
Description: |
Part of interface. Helps the the creation of template parameters for use in partial specilization of class templates. |
|
Where its used: |
Not used within library. |
|
Header Defined in: |
template_expansion_macros.hpp |
|
Macro: |
|
|---|---|
|
Pattern: |
|
|
Description: |
Part of interface. Helps aid in the creation of class template specialization. |
|
Where its used: |
Not used within library. |
|
Header Defined in: |
template_expansion_macros.hpp |
|
Macro: |
|
|---|---|
|
Pattern: |
|
|
Description: |
Internal Use Only. Helps
create a deduced parameter for the |
|
Where its used: |
|
|
Header Defined in: |
make_bitfield_tuple.hpp |
|
Macro: |
|
|---|---|
|
Pattern: |
|
|
Description: |
Internal Use only. This
macro is used to create function parameters for the |
|
Where its used: |
|
|
Header Defined in: |
make_bitfield_tuple.hpp |
|
Macro: |
|
|---|---|
|
Pattern: |
|
|
Description: |
Internal Use Only Represents
a function call that is generated by the |
|
Where its used: |
|
|
Header Defined in: |
make_bitfield_tuple.hpp |
|
Macro: |
|
|---|---|
|
Pattern: |
|
|
Description: |
Internal Use Only. Generates
function calls which are either no-op's or store data into
a member of the |
|
Where its used: |
|
|
Header Defined in: |
make_bitfield_tuple.hpp |


Simon Says
Press each button in the order they light up
Wait for the pattern to end playing before pressing buttons
Simon Says
You lost!
Score:


--- title: Microkernel Construction Lecture Notes layout: post ---
Table of Contents
- Preface
- 1. Overview
- 2. Threads and Thread Switching
- 3. System Calls
- 4. TCBs
- 5. IPC Functionality and Interface
- 6. IPC Implementation
- 7. Dispatching
- 8. Virtual Memory Mapping
- 9. Small Spaces
- 10. Local IPC
- 11. Interrupt and Exception Handling
- 12. Security
- Index
- A. Communication Spaces


Nowadays, technological progress is developing with unseen speed and power. It may even look like everyday something new is created and its potential is exhaustless. Technological advance has captured all the people on the planet in both positive and negative meaning of this word.
Space adventure by humans was one of a milestone. The space environment, with its very low level of gravity, lack of atmosphere, wide temperature variations and often high levels of ionizing radiation from sun and from cosmic rays, it's an unnatural place for humans, but still exploration of space and technology has dragged human advancements much more.
A new problem really haunts space explorations and that is space debris.
Highlight
Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean. A small river named Duden flows by their place and supplies it with the necessary regelialia
“IF WE CONTINUE TO DEVELOP OUR TECHNOLOGY, WITHOUT WISDOM OR PRUDENCE, OUR SERVANT MAY PROVE TO BE OUR EXECUTIONER. ” — Omar N. Bradley
What is space debris?
Space junk or space trash is a term for defunct human-made objects in space, principally in earth’s orbit. These include derelict spacecrafts, abandoned launch vehicle stages. Even paint flecks, solidified liquids expelled from spacecraft , and unburned particles from solid rocket motors add to it . This represents a risk to the spacecraft.
In order to tackle this problem of increasing space junks, scientists from the KYOTO university in Japan have teamed up with a company specializing in construction using wooden materials to build the world's first wooden satellites by 2023.
The researchers believe that wood can simply burn up easily without propelling the debris back to Earth. It does not release any harmful substance into the atmosphere. Sumitomo Forestry, part of the Sumitomo Group, which was founded more than 40 years ago, said it would work on developing wooden materials highly resistant to temperature changes and sunlight. The word it is using is an “Research and Development secret“.
“TECHNOLOGY LIKE ART IS A SOARING EXERCISE OF THE HUMAN IMAGINATION ” — Daniel Bell
Takao Doi, Japanese astronaut, engineer and veteran of two NASA space shuttles missions is part of this team. He said “The next stage will be developing the engineering model of the satellite, then we will manufacture the flight model”.
Wooden satellites appear to be the latest in a series of endeavours to avoid the accumulation of junk in space, which had led researchers to explore options like sending “space-whips” to knock space debris out of orbit, employing giant magnets, harpoons or nets to bring debris down.
According to a theory proposed by former NASA scientist Donald Kessler in 1978, excessive space junk can initiate a reaction causing more and more objects to collide, to the point where Earth’s orbit itself becomes unusable for satellites. This could in turn impact humankind as we and our modern life aspects rely on satellites, GPS and so on. As such, wooden satellites are a new innovative insight to this hazard.


Requires:
- jQuery library 1.42+
- jQuery UI library 1.82+ (optional)
Options:
- rotationInterval (int)
Default: 5000
The time, in miliseconds, it takes before the next item is shown.
- effectTimer (int)
Default: 1000
The time, in miliseconds, it takes for the effect to finish.
- effect (string)
Default: false (none)
Supported effects are: blind, clip, explode, fade, fold, slide
NB: Some effects must have additional arguments to work. Currently this is the “slide” effect. Please note that aside from fade and slide, all the other effects require jQuery UI to be included. If not, it will default back to none.
- effectOptions (JSON object)
Default: {}
Currently supported setting is slideBy for the slide effect, it tells the engine how many pixels to move for each slide. This value must be the exact width of the content of the list element (<li>). Image width is an example of this.
- shuffle (boolean)
Default: false
If true, the next item is picked on random. All items are shown once before the engine resets and starts all over again.
- randomStart (boolean)
Default: false
If true, the first item is randomly picked on start. If false, the first item in the list is shown on start.
- autoStart (boolean)
Default: true
If false, rotationEngine is not started on start. The rotationEngine will start when an action that starts the engine is performed, for example a mouseover event.
- disableRotationEngine (boolean)
Default: false
If true, the rotationEngine will never run, even when events that is suppose to start it is fired.
- helper (jQuery selector)
Default: false
If set, the main list is linked to a helper list, which can be used for thumbnails, tabs, text etc. The item order of both lists must match.
- activeItemClass (string)
Default: alrActiveItem
Class that is put on active main list item
- helperActiveItemClass (string)
Default: alrHelperActiveItem
Class that is put on active helper list item
- helperInteraction (string)
Default: mouseover
Possible values are click and mouseover. Trigger event on user interaction with helper.
- startIndex (int)
Default: 0
Sets the active item on first run. 0 is first. This setting will be overriden if randomStart is set to true.
- nextItemElement (jQuery selector)
Default: false
If set, interaction with the element will move the list rotation forward.
- previousItemElement (jQuery selector)
Defualt: false
If set, interaction with the element will move the list rotation backwards.
- nextItemElementInteraction (string)
Default: click
Possible values are click and mouseover.
- previousItemElementInteraction (string)
Default: click
Possible values are click and mouseover.
- randomEffect (boolean)
Default: false
If set to true, a random effect from the randomEffects array is picked for each rotation.
- randomEffects (Array)
Default: blind, clip, explode, fade, fold
You can override this with your own array of effects
- debug (boolean)
Default: false
If set to true, debug information is outputted through FireBug console (requires FireBug)
- debugLevel (Array)
Default: debug, info, warn, error
You can override this with your own array of debugLevels
- itemControl (JSON object)
Default: none
Lets you specify rotationInterval, effect, effectTimer, effectOptions, randomEffect and randomEffects on an per item basis. Each item is specified with itemIndex_n where n is the item index, which is zero based. See below for example.
Option example:
jQuery(document).ready(function($) {
$('.myList').advListRotator({
helper: '#myHelperId',
rotationInterval: 2000,
effectTimer: 500,
effect: 'slide',
shuffle: true,
activeItemClass: 'myActiveItemClass',
randomEffect: true,
randomEffects: new Array('fade', 'blind'),
itemControl: {
itemIndex_0: {
rotationInterval: 500,
effect: 'fold'
},
itemIndex_1: {
effectTimer: 1500
}
}
});
});


What do we do
We help businesses scale
Schedule a call to learn more about our services
Unlimitmaed Possibilities
Schedule a call to learn more about our services
AI Powered Technology
Take the lepa
100 Combinations
1000's of colors
See what makes us different


EDL_WRITESCRIPT Writes an EDL script $ Syntax $ - edl_writescript(filename, guid, workdir, ctrlpath, props) $ Arguments $ - filename: the filename of the destination script - guid: the guid string assigned to the script - workdir: the root working directory of the experiments - ctrlpath: the path of control file (r.t. script's parent) - props: the properties of the experiment parameters (no need of internal_index) $ Description $ - edl_writescript(filename, guid, workdir, ctrlpath, props) writes the script according to the information provided. It will also add the internal index to each entry. $ Remarks $ - The function will also creates the initial control file. $ History $ - Created by Dahua Lin, on Aug 14, 2006
0001 function edl_writescript(filename, guid, workdir, ctrlpath, props) 0002 %EDL_WRITESCRIPT Writes an EDL script 0003 % 0004 % $ Syntax $ 0005 % - edl_writescript(filename, guid, workdir, ctrlpath, props) 0006 % 0007 % $ Arguments $ 0008 % - filename: the filename of the destination script 0009 % - guid: the guid string assigned to the script 0010 % - workdir: the root working directory of the experiments 0011 % - ctrlpath: the path of control file (r.t. script's parent) 0012 % - props: the properties of the experiment parameters 0013 % (no need of internal_index) 0014 % 0015 % $ Description $ 0016 % - edl_writescript(filename, guid, workdir, ctrlpath, props) writes the 0017 % script according to the information provided. It will also add the 0018 % internal index to each entry. 0019 % 0020 % $ Remarks $ 0021 % - The function will also creates the initial control file. 0022 % 0023 % $ History $ 0024 % - Created by Dahua Lin, on Aug 14, 2006 0025 % 0026 0027 %% parse and verify input 0028 0029 if nargin < 5 0030 raise_lackinput('edl_writescript', 5); 0031 end 0032 0033 %% Prepare elements 0034 0035 doctag = 'ExpScript'; 0036 nodetag = 'Entry'; 0037 0038 attribs.guid = guid; 0039 attribs.workdir = workdir; 0040 attribs.ctrlpath = ctrlpath; 0041 0042 n = length(props); 0043 for i = 1 : n 0044 props(i).internal_index = i; 0045 end 0046 0047 0048 %% Write 0049 0050 edl_writeprops(doctag, attribs, nodetag, props, filename); 0051 cpath = sladdpath(ctrlpath, slfilepart(filename, 'parent')); 0052 edl_initctrlfile(cpath, guid, n); 0053


This demo shows the color stream in an image element. The default color stream is a buffer with jpeg data. Note that the img tag in this demo is resized through css to fit the window. The native image size in this demo is larger.
Most resolutions support a 30fps stream. Only the largest resolution (KinectAzure.K4A_COLOR_RESOLUTION_3072P) is limited to 15fps.


Grid Resize
Grid has fixed width/height (resize grid itself)
Grid has 100% width/height (resize container)


--- layout: successCriteria title: "Section Headings" successCriteria: "2-4-10" successCriteriaTitle: "Section Headings" technology: "alt3" ---
2.4.10 Section Headings: Section headings help the user navigate and understand the content.
What to do:
What not to do:
Examples:
[A couple of examples that show different ways to use section headings. Formatting them so they look like real examples would be ideal.]
Related criteria:
Success Criterion 4.1.2: User Interface components


France’s Macron says global system in ‘unprecedented crisis’
PARIS, Nov 12 — French President Emmanuel Macron today said that the global political system was in “unprecedented crisis”, urging new kinds of alliances and cooperation to solve the world’s problems.
Macron’s warning came days after the publication of an interview in which the president argued Nato was experiencing brain death and Europe risked becoming insignificant, in comments that sent shockwaves around EU capitals.
“We are experiencing an unprecedented crisis in our international system,” he told the Paris Peace Forum, a France-backed group promoting global peace.
The president, who has sought a prominent place on the international stage since coming to power in 2017, said that “new ways of cooperation, new alliances” are needed between states and organisations, complaining that the United Nations itself has become “blocked”.
Macron lamented that while the global political and financial systems have worked well after World War II, they are now in crisis.
“The system was efficient for 70 years but it allowed new inequalities to emerge,” the president said, adding: “A crisis of our democracy allowed unilateralism to be reborn.
“We need more cooperation to respond to these challenges,” he said, warning against reluctance to question existing international institutions.
Macron’s interview with The Economist, published Thursday, described by analysts as a revealing expose of the president’s views, caused controversy in Europe with German Chancellor Angela Merkel saying his comments were “drastic”.
Possibly taking aim at his critics, Macron said Tuesday that plain-speaking was essential.
“I think we need the truth. Squeamishness or hypocrisy won’t work. Silence is not a solution,” he said. — AFP


Features¶
LibID is a a novel third-party Android library detection tool that can reliably identify the library version used in Android apps given the library and app binaries. LIBID is resilient to common code obfuscation techniques, including:
- Identifier renaming
- Code shrinking
- Control-flow randomization
- Package modification
Installation¶
LibID uses Python 2.7.x. Dependencies can be installed by:
pip install -r requirements.txt
In addition, LibID uses Gurobi Optimizer to solve the BIP (binary integer programming) problem. For researchers, a free academic license can be requested from the Gurobi website.
Usage¶
To use LibID, users must first use the profile subcommand to generate app and library profiles from their binaries. Then, users can use the detect subcommand to detect if a library is used in an app.
Library Profiling¶
$ ./LibID.py profile -h
usage: LibID.py profile [-h] [-o FOLDER] [-w] [-p N] [-v]
(-f FILE [FILE ...] | -d FOLDER)
optional arguments:
-h, --help show this help message and exit
-o FOLDER specify output folder
-w overwrite the output file if it exists
-p N the number of processes to use [default: the number of CPUs in the system]
-v show debug information
-f FILE [FILE ...] the app/library binaries
-d FOLDER the folder that contains app/library binaries
Profiling Android apps (*.apk):
$ ./LibID.py profile -f app1.apk app2.apk ...
Profiling thrid-party Android libraries (*.jar | *.dex):
$ ./LibID.py profile -f lib1.jar lib2.jar ...
Profiling all related files (*.apk | *.jar | *.dex) inside a directory:
$ ./LibID.py profile -d apps
The generated profiles will be stored as .json files.
Library Detection¶
$ ./LibID.py detect -h
usage: LibID.py detect [-h] [-o FOLDER] [-w] [-b] [-p N] [-s] [-r] [-v]
(-af FILE [FILE ...] | -ad FOLDER)
(-lf FILE [FILE ...] | -ld FOLDER)
optional arguments:
-h, --help show this help message and exit
-o FOLDER specify output folder
-w overwrite the output file if it exists
-b considering build-in Android libraries
-p N the number of processes to use [default: the number of CPUs in the system]
-A run program in Lib-A mode [default: LibID-S mode]
-r consider classes repackaging
-v show debug information
-af FILE [FILE ...] the app profiles
-ad FOLDER the folder that contains app profiles
-lf FILE [FILE ...] the library profiles
-ld FOLDER the folder that contains library profiles
Detect if specified apps use specified libraries:
$ ./LibID.py detect -af app1.json app2.json -lf lib1.json lib2.json lib3.json
Detect if apps in directory use libraries in a directory:
$ ./LibID.py detect -ad profiles/app -ld profiles/lib
Parameter Tuning¶
The parameters of LibID can be found in the module/config.py file. In particular, users can tweak the following parameters to achieve better performance.
LSH_PERM_NUM = 256
LSH_THRESHOLD = 0.8
SHRINK_THRESHOLD_ACCURATE = 0.1 # The minimum percentage of library classes needed to make a decision (LibID-A mode)
SHRINK_THRESHOLD_SCALABLE = 0.1 # The minimum percentage of library classes needed to make a decision (LibID-S mode)
SHRINK_MINIMUM_NUMBER = 5 # The minimum number of classes needed to make a decision
PROBABILITY_THRESHOLD_ACCURATE = 0.8 # The minimum percentage of app classes needed to make a decision (LibID-A mode)
PROBABILITY_THRESHOLD_SCALABLE = 0.8 # The minimum percentage of app classes needed to make a decision (LibID-S mode)
Example¶
Run the example/init.sh script to download the demo app and library binaries from FDroid and Maven.
$ ./example/init.sh
Run the following command to profile the binaries:
$ ./LibID.py profile -d example
Run the following command to detect the correct version of OkHttp library used in the app:
$ ./LibID.py detect -ad profiles/app -ld profiles/lib
The result is stored under the outputs folder as a .json file:
$ python -m json.tool outputs/com.example.root.analyticaltranslator_6.json
{
"appID": "com.example.root.analyticaltranslator",
"filename": "com.example.root.analyticaltranslator_6.apk",
"libraries": [
{
"category": "example",
"matched_root_package": [
"Lcom/squareup/okhttp"
],
"name": "okhttp",
"root_package_exist": true,
"shrink_percentage": 1.0,
"similarity": 1.0,
"version": [
"2.3.0"
]
}
],
"permissions": [
"android.permission.INTERNET"
],
"time": 3.760045051574707
}


Bodies of 28 Afghan Refugees Returned to Afghanistan
Members of the Nimroz Provincial Council said most of the victims are from the western province of Ghor.
by TOLOnews.comThe bodies of 28 Afghan refugees on Friday were repatriated to the southwestern province of Nimroz of Afghanistan from Iran, local officials confirmed.
The refugees died “in a traffic accident” in an attempt to travel “illegally” to Turkey, said Mohammad Ibrahim Amini, head of the Nimroz Police media office.
The accident occurred when two vans collided near the town of Khash in Sistan and Baluchistan, according to AP, and 21 passengers were injured as well.
Ibrahimi said most of those killed in the accident are from the western province of Ghor.
Last week the incident was reported by Iranian officials, who said 28 people were killed and 30 others were wounded.
According to the Nimroz Provincial Council, quoted by DW, most of the refugees are from Ghor while others are from Farah and Badakhshan provinces.
The council said that the age of the refugees ranged from 14 to 45 years old.
Iran hosts almost two million refugees from Afghanistan who seek refuge there in search of work, AP reports, and the area is frequently used by traffickers to smuggle illegal Afghan migrants, usually in overcrowded vehicles.
Also according to AP, Iran has one of the “world’s worst traffic safety records,” due to “disregard of traffic laws, unsafe vehicles and inadequate emergency services,” and each year approximately “17,000 people die in accidents in Iran.”


HOME
QUOTES
BIOGRAPHY
SOURCES
VIDEOS
DEVICES
ABOUT ME
Some videos, hope that they can inspire you!(Youtube Videos)