Commercial systems that provide functionality comparable to the Grader Tool include
Each of these systems provides a wide variety of class mananagement and grading functionality. In terms of such functionality, the goal for the Grader Tool is to provide the important core features found in these tools, not the full range of features found in all of them. The Grader Tool does provide modest functional improvements in three areas, when compared to most commercially available tools. These improvements are:
The goals for the Grader Tool relating to public domain source code and sound pedagogical development are not met by any of the above commercial systems.
A detailed review of each related tool follows in these subsections:
Prev: impacts | Next: [none] | Up: intro | Top: index


| Coupon |
* Sponsored Results
Apple iPod nano 3G Review | Music & Videos content from Paul ...
Sep 15, 2007 . And as of this writing, Apple only plans to port three of these games (Ms. Pac- Man, Sudoku, and Tetris) to the iPod nano 3G and iPod classic.
http://winsupersite.com/article/ipod/apple-ipod-nano-3g-review-140189
copper sun's most importent quote thomas macafee funeral home greenville sc
Games Ipod Nano 3g - Alibaba.com
143 items . Games Ipod Nano 3g, Source Games Ipod Nano 3g Products at .
http://www.alibaba.com/showroom/games-ipod-nano-3g.html
400 Elm Ave
Yukon,
OK 73099
scottish terrier breeder in wa
Family Night Dinner Group Studies Ministries for all ages
russian music video download programmatic agreement nd historical society map of pacific midway island
900 S Littler Ave
Edmond,
OK 73034
outdoor folding sling chair
Apple - Support - iPod nano - 3rd generation
User Guide. Get to know the ins and outs of your iPod nano. . Click below if your iPod displays one of these icons: . Syncing and troubleshooting iPod games .
http://www.apple.com/support/ipodnano/3rd_generation/
youths implication to drugabuse control education theory and practice disorders advanced guestbook 2.3.3
500 S Country Club Rd
how to put free games on ipod nano 3g - YouTube
Jan 30, 2012 . Watch Later How to get games on your Ipod Nano.by TheTPMoore26,881 views; ipod nano 3g trick 2:35. Watch Later ipod nano 3g trickby .
http://www.youtube.com/watch?v=0vaxFiKAM84
Can you recommend sources for free iPod nano 3g games?
Mar 13, 2010 . Can you recommend sources for free iPod nano 3g games? Thomas asks: Where I can get free games for ipod nano 3g and how to install?
http://www.makeuseof.com/answers/recommend-sources-free-ipod-nana-3g-games/
reviews on premium edge dog food cooling curve of stearic acid direct mailing lists free
Basic Listings
226 S 29th St
How to Put Games on the iPod Nano 3G | eHow.com
How to Put Games on the iPod Nano 3G. The iPod is a multimedia device developed by Apple. It was originally released as an MP3 music player, and .
http://www.ehow.com/how_6218057_put-games-ipod-nano-3g.html
natural gas contract engineering work youths implication to drugabuse control beach ocean wave sounds
1202 W Grand Ave
iPod nano (3rd Gen/Fat) - EveryMac.com
Specs and features for the iPod nano (3rd Gen/Fat) 4 GB, 8 GB.
http://www.everymac.com/systems/apple/ipod/specs/ipod-3rd-generation-fat-nano-specs.html
insurance program business rate monitoring pelican at cabo san lucas flights to orlando from london ontario
116 E Georgia Ave
Tetris on my iPod nano (3g) - YouTube
Aug 28, 2008 . Tetris on my iPod nano (3g) . Elena ds 1 year ago. can you still buy games for ipod nano 3g? i only find for ipod touch? and ipad!! Reply .
http://www.youtube.com/watch?v=WiquiI1q2rk
what a sports chairman do education theory and practice scottish terrier breeder in wa
301 S 2nd St
Review: Apple iPod Nano 3G | Apple / Mac Software Updates, News ...
Dec 24, 2007 . The nano was made a wider but it is just as thin as ever. From a style standpoint the 3G combines aspects of the classic iPod styling of the 1G .
http://www.geek.com/articles/apple/review-apple-ipod-nano-3g-20071224/
uses copper ii phosphate nj 2009 jelsoft enterprises ltd craftsman style windows and doors
1910 S 20th St
iPod game - Wikipedia, the free encyclopedia
These games should not be confused with games for the iPod Touch, which require . iPod 3G, 4G, 5G, and 5.5G; iPod Nano 1G and 2G; iPod Mini 1G and 2G .
http://en.wikipedia.org/wiki/IPod_game
sony ericsson w350 reviews the battle of yorktown summary dental assistant gainesville florida
728 W Michigan Ave
iPod Arcade | Free iPod Games | Games for your iPod
iPodArcade.com is your one-stop resource for all iPod Games. . on iPod, iPod Touch, iPhone, iPod Video, iPod Photo, iPod Nano, iPod Mini, 3G, and 4G.
http://www.ipodarcade.com/
tmmk toyota career opportunities learn spanish online free easy dwayne giles brenda avie photos
3340 S 16th St
Apple iPod Nano (3G) Skins - DecalGirl
DecalGirl.com offers iPod nano skins and custom iPod nano decals and graphics . Our custom vinyl designs allow us to offer the most creative iPod nano skins .
http://www.decalgirl.com/skins/iPod-nano-3G-Skins
the grid bury st edmunds outdoor folding sling chair school closings for rockingham county virginia
828 S 9th St
iPod nano 3rd gen Review -- Mobile Tech Review
Sep 18, 2007 . MobileTechReview.com reviews: iPod nano 3G review. . weren't really supposed to find" games with games that other users have actually had .
http://www.mobiletechreview.com/iPod/iPod-nano-3G.htm
camp whittle big bear basic genres of music uses copper ii phosphate
1300 S 29th St
Amazon.com: Apple iPod nano 8 GB Silver (3rd Generation) OLD ...
DLO Hybrid Shell for iPod nano 3G (Clear Front and Black Back) · 4.3 out of 5 stars . All iPod games are designed specifically for the iPod interface. And all of .
http://www.amazon.com/Apple-iPod-Silver-Generation-MODEL/dp/B000JO1MU4
welcome to new jersy lawyer civil rights teacher how to refresh grout
102 E Almar Dr
iPod nano 3G first hands-on
Sep 5, 2007 . Tags: apple, features, hands-on, ipod, ipod nano, IpodNano, portable . iPad Users More Likely To Buy Games Via Ads, But iPhone Users Still .
http://www.engadget.com/2007/09/05/ipod-nano-3g-first-hands-on/
museum of church history and art systems in science activities non exempt marital trust funding
320 S 4th St
Ipod clickwheel games - iPod Nano - Fanpop
I recently bought bomberman for my ipod nano 4g and when downloading found out it was only for the ipod nano 3g, but being a retard like usual i tried to put it .
http://www.fanpop.com/clubs/ipod-nano/articles/38305/title/ipod-clickwheel-games
what is physical geography of rainforest raymond prince and wanted common phrases in jamacia
901 W Grand Ave
iPOD NANO 3G SPORT ARMBAND 'BLACK' - iZKA® One Stop ...
iPOD NANO 3G SPORT ARMBAND 'BLACK' - iZKA® One Stop Shop For All Your Accessory Needs: Amazon.co.uk: PC & Video Games.
http://www.amazon.co.uk/iPOD-NANO-SPORT-ARMBAND-BLACK/dp/B001TWPC24
required documentation to visit germany south lake high school seattle wa arron allen yuma arizona
2414 State Highway 92
iPod Nano 3G 8GB Help??? - MacRumors Forums
I need some help with my iPod Nano 3G. It doesn't seem to power up, but when I put in in my PC, it detects a storage device has been put in.
http://forums.macrumors.com/showthread.php?t=1484872
124 S 6th St
How do you get games on ipod nano
Actually you can get games onto an Ipod Nano 3rd 4th and 5th generation as I just did yesterday with my 5th generation. A lot of people say that you can not but I .
http://wiki.answers.com/Q/How_do_you_get_games_on_ipod_nano
bear wrought iron decor lydia italy celery root salad recipe
3320 S 16th St
Apple iPod nano 3G Photo Gallery | Music & Videos content from ...
Sep 27, 2012 . Apple iPod nano 3G Photo Gallery. Sep. 16, 2007 Paul Thurrott | Paul Thurrott's Supersite for Windows. EMAIL · Tweet. Comments 0 .
http://winsupersite.com/article/ipod/apple-ipod-nano-3g-photo-gallery-127627
page mrachek fitzgerald rose louise wright sublette ks is 110 bas california legal
802 Frisco Ave
How Can You Put Movies Onto an iPod Nano 3G? | Tech Tips ...
The iPod Nano 3G gives you the ability to listen to music and watch music videos, TV shows and movies. Adding files to your iPod can be done automatically, .
http://techtips.salon.com/can-put-movies-onto-ipod-nano-3g-12474.html
read reviews compare canon printers herpes vias de transmision brand name jeans for teens
609 W Highway 277
Frequently Asked Questions (FAQ) for iPod Click Wheel Games
Mar 14, 2012 . iPod Click Wheel Games available on iTunes are designed specifically for the iPod nano (3rd generation), iPod classic, and iPod (5th .
http://support.apple.com/kb/HT1460
location of storm surge navy information professional 1600 ip quality assurance power point
2828 S 9th St
Apple iPod nano (3G) - LAPTOP Magazine
Oct 2, 2007 . Review of the Apple iPod nano (3G) - The world's most popular flash-based . There are some games for the nano at the iTunes Music Store in .
http://www.laptopmag.com/review/mp3/apple-ipod-nano-3g.aspx
indiana rent to own sheds sat set up for 2700a egg harbor business association
202 S 6th St
iPod Nano 3G Accessories, iPod Nano 3rd Generation Accessories
Items 1 - 48 of 622 . Shop discount iPod nano 3G accessories with 3rd .
http://www.handhelditems.com/ipod-nano-3rd-generation-accessories-c-4_4682_5282.html
428 E Almar Dr
iPod Nano - Apple Wiki, a wiki about Macs, iPod, iPhone, iPad ...
The iPod Nano is a portable media player designed and marketed by Apple. . The third generation iPod Nano includes pre-installed games, but can also run games which Apple makes available for purchase in the iTunes . iPod Nano 3G .
http://apple.wikia.com/wiki/IPod_Nano
most white christian states bed bath and beyond frederick learn spanish online free easy
iPod Nano 3rd Generation Cases, iPod Nano 3G Cases
Items 1 - 48 of 345 . Shop huge selection iPod Nano 3rd generation 3G cases .
http://www.handhelditems.com/ipod-nano-cases-ipod-nano-generation-cases-c-4_4682_4732_5349.html
iPod nano (3G) Review | TechCrunch
Sep 14, 2007 . Apple iPod nano (3G), actual size . At the time of this writing, none of the iPod games in the iTunes Music Store work work with current-gen .
http://techcrunch.com/2007/09/14/ipod-nano-3g-review/
11 Years of Apple iPod - 2007: iPod touch, iPod nano 3G, 160GB ...
Oct 10, 2012 . Featuring a 2-inch screen, the nano included video playback, and support for new iPod games. Also that year, if you thought the 80GB iPod .
http://www.pcmag.com/slideshow/story/289519/11-years-of-apple-ipod/7
* Sponsored Results
| Select from the listings below | (page mrachek fitzgerald rose) | |
|
edie brikell circle of friends 226 S 29th St Apple - Support - iPod - iPod nano (3rd generation) Troubleshooting |
||
|
the best apple loop libraries 1202 W Grand Ave Review: Apple's new 3G iPod nano is a 5G video iPod in a nano-thin ... |
||
|
wolf and humans similarities 116 E Georgia Ave iPod nano 3g Password Hack by haris.wmv - YouTube |
||
|
jelly belly authentic large bean machine 301 S 2nd St how to get ipod nano games on your ipod - YouTube |
||
|
best paint for face painting 1910 S 20th St Amazon.com: DLO Action Jacket for iPod nano 3G (Black/Pink): MP3 ... |
||
|
patti allen band seattle 728 W Michigan Ave Amazon.com: Belkin Leather Folio for iPod nano 3G (Cameo Pink ... |
||
|
how do endowments work 2009 3340 S 16th St Amazon.com: DLO Hybrid Shell for iPod nano 3G (Clear Front and ... |
||
|
gunshot would to chest 828 S 9th St iPod nano 3G first hands-on |
||
|
microblaze and soil remediation 1300 S 29th St Apple iPod nano 3G Photo Gallery | Music & Videos content from ... |
||
|
craftsman style windows and doors 102 E Almar Dr Amazon.com: Apple iPod nano 8 GB Black (3rd Generation) OLD ... |
||
|
walt disney rug collection 320 S 4th St How to download games on iPod nano 1st-5th gen - YouTube |
||
|
pioneer sd-p5191-k technical specs 901 W Grand Ave Amazon.com: DLO DLZ28010/17 Action Jacket for iPod Nano 3G ... |
||
|
xena warrior princess plots 2414 State Highway 92 Amazon.com: Shades iPod nano 3G 3rd Generation Case/Skin (4 ... |
||
|
girl cums up close on cam 124 S 6th St Amazon.com: Apple iPod nano 4 GB Silver (3rd Generation) OLD ... |
||
|
alberta real estate calgary surrounding areas 3320 S 16th St Games on my Apple 3rd Gen iPod Nano - YouTube |
||
|
book stocker merchandiser charlotte nc 802 Frisco Ave Amazon.com: Marware Sportsuit Convertible Case for iPod nano 3G ... |
||
|
luna the moon godess 609 W Highway 277 Amazon.com: Marware Sportsuit Runabout Case for iPod nano 3G ... |
||
|
youth and conflict styles 2828 S 9th St Amazon.com: Shades iPod nano 3G 3rd Generation Case/Skin (4 ... |
||
|
realtors office charleston wv 202 S 6th St Xtrememac SportWrap for iPod Nano 3G - Black: Amazon.co.uk ... |
||
|
greenville auto injury attorney 428 E Almar Dr 11 Years of Apple iPod - 2007: iPod touch, iPod nano 3G, 160GB ... |
||
| Select from the listings above | (walt disney rug collection) | |


<!-- ====================================================== --> <!-- DTD for TestNG 1.0 --> <!-- --> <!-- A suite is made of tests and parameters. --> <!-- --> <!-- A test is made of three parts: --> <!-- * Parameters, which override the Suite parameters --> <!-- * Groups, made of two parts --> <!-- * Classes, defining which classes are going to be part --> <!-- of this test run --> <!-- --> <!-- In turn, groups are made of two parts: --> <!-- * Definitions, which allow you to group groups into --> <!-- bigger groups --> <!-- * Runs, which defines the groups that the methods --> <!-- must belong to in order to be run during this test --> <!-- --> <!-- Full documentation: http://testng.org --> <!-- --> <!-- Cedric Beust & Alexandru Popescu --> <!-- ====================================================== --> <!-- A suite is the top-level element of a testng.xml file --> <!ELEMENT suite (listeners|packages|test|parameter|method-selectors|suite-files)* > <!-- Attributes: --> <!-- name: The name of this suite (as it will appear in the reports) verbose: (0-10) How verbose the output on the console will be. This setting has no impact on the HTML reports. Default value: 1 parallel: (methods|tests) Whether TestNG should use different threads to run your tests (might speed up the process) Default value: none (no parallel mode) thread-count: An integer giving the size of the thread pool to use if you set parallel. Default value: 5 annotations: (javadoc|JDK5) If "javadoc", TestNG will look for JavaDoc annotations in your sources, otherwise it will use JDK5 annotations. Default value: JDK5 time-out: the time to wait in milliseconds before aborting the method (if parallel="methods" ) or the test (parallel="tests") --> <!ATTLIST suite name CDATA #REQUIRED verbose CDATA #IMPLIED parallel CDATA #IMPLIED thread-count CDATA #IMPLIED annotations CDATA #IMPLIED time-out CDATA #IMPLIED > <!-- A list of XML files that contain more suite descriptions --> <!ELEMENT suite-files (suite-file)* > <!ELEMENT suite-file ANY > <!ATTLIST suite-file path CDATA #REQUIRED > <!-- Parameters can be defined at the <suite> or at the <test> level --> <!-- Parameters defined at the <test> level override parameters of the --> <!-- same name in <suite>. --> <!-- Parameters are used to link Java method parameters to their actual --> <!-- value, defined here. --> <!ELEMENT parameter ANY> <!ATTLIST parameter name CDATA #REQUIRED value CDATA #REQUIRED > <!-- Method selectors define user classes used to select which methods to --> <!-- run. They need to implement org.testng.IMethodSelector --> <!ELEMENT method-selectors (method-selector*) > <!ELEMENT method-selector ((selector-class)*|script) > <!ELEMENT selector-class ANY> <!ATTLIST selector-class name CDATA #REQUIRED priority CDATA #IMPLIED > <!ELEMENT script ANY> <!ATTLIST script language CDATA #REQUIRED > <!-- A test contains parameters and classes. Additionally, you can define --> <!-- additional groups ("groups of groups") --> <!ELEMENT test (method-selectors?,parameter*,groups?,packages?,classes?) > <!-- Attributes: --> <!-- name: The name of this test (as it will appear in the reports) junit: (true|false) Whether to run in JUnit mode. Default value: false. verbose: (0-10) How verbose the output on the console will be. This setting has no impact on the HTML reports. Default value: suite level verbose. parallel: (methods) Whether TestNG should use different threads to run your tests (might speed up the process) thread-count: An integer giving teh size of the thread pool to be used if parallel mode is used. Overrides the suite level value. annotations: (javadoc|JDK5) If "javadoc", TestNG will look for JavaDoc annotations in your sources, otherwise it will use JDK5 annotations. Default value: JDK5 time-out: the time to wait in milliseconds before aborting the method (if parallel="methods" ) or the test (if parallel="tests" ) enabled: flag to enable/disable current test. Default value: true --> <!ATTLIST test name CDATA #REQUIRED junit CDATA #IMPLIED verbose CDATA #IMPLIED parallel CDATA #IMPLIED thread-count CDATA #IMPLIED annotations CDATA #IMPLIED time-out CDATA #IMPLIED enabled CDATA #IMPLIED > <!-- Defines additional groups ("groups of groups") and also which groups --> <!-- to include in this test run --> <!ELEMENT groups (define*,run?) > <!ELEMENT define (include*)> <!ATTLIST define name CDATA #REQUIRED> <!-- Defines which groups to include in the current group of groups --> <!ELEMENT include ANY> <!ATTLIST include name CDATA #REQUIRED> <!-- Defines which groups to exclude from the current group of groups --> <!ELEMENT exclude ANY> <!ATTLIST exclude name CDATA #REQUIRED> <!-- The subtag of groups used to define which groups should be run --> <!ELEMENT run (include?,exclude?)* > <!-- The list of classes to include in this test --> <!ELEMENT classes (class*) > <!ELEMENT class (methods*) > <!ATTLIST class name CDATA #REQUIRED > <!-- The list of packages to include in this test --> <!ELEMENT packages (package*) > <!-- The package description. If the package name ends with .* then subpackages are included too. --> <!ELEMENT package (include?,exclude?)*> <!ATTLIST package name CDATA #REQUIRED > <!-- The list of methods to include/exclude from this test --> <!ELEMENT methods (include?,exclude?)* > <!-- The list of listeners that will be passed to TestNG --> <!ELEMENT listeners (listener*) > <!ELEMENT listener ANY> <!ATTLIST listener class-name CDATA #REQUIRED >


| Degree | University | Advisor |
|---|---|---|
| Ph.D (2012-2016) | Computer Science University of Colorado at Boulder,CO, USA |
Kenneth M. Anderson |
| M.Sc.(2010-2012) | Computer Science and Engineering University of Colorado at Denver,CO, USA |
Gita Alaghband |
| B.S. (2001-2005) | Electronic and Computer Education Computer Teaching Firat University,Elazig, TURKEY |
İbrahim Turkoglu |
| Duty | Institutition | Duration |
|---|---|---|
| Head of the department of software | Department of Computer Engineering Inonu University, Malatya, TURKEY |
March 4, 2021- Continues |
| Co-chair | Department of Computer Engineering Inonu University, Malatya, TURKEY |
March 5,2018 - March 3, 2021 |
| Job | Institutition | Duration |
|---|---|---|
| Assistant Professor | Department of Computer Engineering Inonu University, Malatya, TURKEY |
Sep 21,2017 - (Continues) |
| Research Assistant Dr. | Department of Computer Engineering Inonu University, Malatya, TURKEY |
March 23, 2017 - Sep 21,2017 |
| Government Employee | Ministry of National Education Erkek Anadolu Imam Hatip Lisesi, Elazig, TURKEY |
Nov 1, 2016 - March 22, 2017 |
| Research Assistant | Project EPIC University of Colorado Boulder,Boulder, CO, USA |
2014-2016 |
| Teaching Assistant | Human-Centered Computing Professional Development Coordinator: Clayton Lewis University of Colorado Boulder, Boulder, CO, USA |
2013 |
| Teaching Assistant | Computer Science as a Field of Work and Study Coordinator: Clayton Lewis University of Colorado Boulder,Boulder, CO, USA |
2013 |
| Computer Teacher | Ministry of National Education Haci Huseyin Koluk Vocational Technical High School, Malatya, TURKEY |
2007 - Feb 2008 |
| Coordinator | Directorate of National Education Malatya, TURKEY |
2007 |
| Project Staff | MEGEP Expo Directorate of National Education, Malatya, TURKEY |
2007 |
| Coordinator Teacher | Hekimhan Vocational High School Directorate of National Education, Malatya, TURKEY |
2006 |
| Computer Teacher | Ministry of National Education Hekimhan Vocational Technical High School,Malatya, TURKEY |
2005- Sep 2007 |
| Name | Candidacy | Started | Job |
|---|---|---|---|
| Muhammed Mehdi ELÖMER | M.Sc. | Fall 2021 | Computer Engineer @ Ayssoft |
| Talha CAN | M.Sc. | Fall 2021 | Computer Engineer @ Ayssoft |
| Uğur Kekevi | Ph.D. | Fall 2020 | Lecturer @ Erzincan Binali Yildirim University |
| Yunus Emre Ekici | Ph.D. | Fall 2022 | Lecturer @ Inonu University |
| Name | Degree | Started | Graduated | Thesis Title | Location |
|---|---|---|---|---|---|
| Aysenur DENİZ | M.Sc. | Fall 2021 | Spring 2023 | APPLICATION AND COMPARISON OF FULL TEXT SEARCH TECHNOLOGIES FOR BIG DATA PROCESSING | Computer Engineer |
| Tuğba Beril Doğuç | M.Sc. | Fall 2018 | Spring 2022 | Tweet collection, analytics, and storage platform Design (TweetCASP) | IOS Developer |
| Haki Mehmet Erzi | M.Sc. | Fall 2018 | Spring 2021 | APPLICATION DEVELOPMENT FOR SMART HOME CONTROL WITH IOT TECHNOLOGY | Computer Engineer @ Istanbul Grand Airport |
| Name | Responsibility | Since |
|---|---|---|
| Journal of Computer Science (JCS) | Editorial Board Member | 2022 |
| Journal of Soft Computing and Artificial Intelligence (JSCAI) | Editorial Board Member | 2020 |
| Name | Organization | Responsibility |
|---|---|---|
| International Conference on Artificial Intelligence and Data Processing (IDAP) | Inonu University, Department of Computer Engineering , Malatya, TURKEY | Scientific and Organization Committee Member |
| Service | Institutition |
|---|---|
| Volunteer Staff (2010) | First Lego League Robotic Competition Colorado School of Mines Golden, CO, USA |
| Volunteer Staff (2010) | UCD Information Systems Association Student Panel University of Colorado Denver Denver, CO, USA |
| MC (emcee) 2009 | CESL Closing Ceremony University of Arizona Tucson, AZ, USA |
| Description | Provider |
|---|---|
| Ph.D Scholarship (2012-2016) | Republic of Turkey Ministry of National Education |
| Master’s Degree Scholarship 2010-2012 | Republic of Turkey Ministry of National Education |
| Name | Description |
|---|---|
| TweetCASP |
TweetCASP 1.0 :Tweet collection, analytics, and storage platform has been developed to collect, store, and analyze tweets that are collected from Twitter microblogging service with the purpose of performing real-time data collection and analytics. TweetCASP provides a user- friendly web application to start streaming Tweets by making use of Twitter Streaming API by Tweepy, RabbitMQ, and Apache Casandra. Moreover, the TweetCASP is an example of a data- intensive software system that provides an exaple technologies can be combined to develop scalable, reliable, and efficient.
Developer(s): Tugba Beril Doguc (MS Student), Ahmet Arif Aydin (supervisor) Year : 2021-2022 |
| IDCAP | Twitter Data Collection and Real-Time Analytics Platform 1.0 The IDCAP (Incremental Data Collection & Analytics Platform) provides incremental data collection and indexing in real-time of Twitter (social media) data, support real-time analytics at interactive speeds and provides highly concurrent batch data processing supported by a novel data model. Developers: Ahmet Arif Aydin (Principal Designer), Ken Anderson (Advisor) Year : 2015-2020 |
| EPIC Analyze | Twitter Data Analytics Environment version 1.0 This analysis environment is actively used by Project EPIC analysts to browse, search, filter, sort and annotate large Twitter data sets. Developer(s): Mario Barrenechea, Ahmet Arif Aydin, Adam Cardenas, Mazin Hakeem, Sahar Jambi, Ken Anderson (Advisor) Year : 2013-2016 |


vue-simple-suggest
Simple yet feature-rich autocomplete component for Vue.js
Install
npm install --save vue-simple-suggest
See installation guide for more options.
Table of contents
- vue-simple-suggest
What is it
This is a simple yet feature-rich suggestion/autocomplete component for Vue.js.
Actually, it's so feature rich, that it's possible to do crazy stuff with it, like
- Imitating drop-downs and drop-down menus
- Turn suggestions list into an actual suggestions table
- Work with ANY type of custom input passed (like type=button, radio and etc.)
- ... And many more things
And, as a bonus, it is very light.
Features
v-model
support.- Automatic accessibility attributes (WAI-ARIA complete)
- Switching
v-model
type (select/input). - Custom input element through default slot.
- Custom list items through named scoped slots.
- All HTML5-valid props for default input element are provided (
type
,tabindex
and etc...). - Customizable keyboard controls.
- Rich and simple API.
- CSS classes for quick and easy restyling.
- Many build variants to choose from.
- Flexible and customizable component design.
- Optional polyfills for IE importable from the lib.
All of the props, events and slots are OPTIONAL for this component, so it can be used without any configuration at all.
New features?
If you feel that something important is missing (or found a bug) - feel free to create an issue. :)
Examples:
To use the component just install via NPM:
npm install --save vue-simple-suggest
Then, in your Vue.js component/page do the following...
Simple example
If you need to suggest things from a static array:

<template>
<vue-simple-suggest
v-model="chosen"
:list="simpleSuggestionList"
:filter-by-query="true">

</vue-simple-suggest>

Chosen element: {{ chosen }}

</template>

Async example
If you're dealing with async data from server (example using https://swapi.co/):

<template>
<vue-simple-suggest
v-model="chosen"
display-attribute="name"
value-attribute="url"
:list="getSuggestionList"
></vue-simple-suggest>

Chosen element: {{ chosen }}

</template>

For a more advanced example (using wikipedia search) see our example source.
Installation
NPM
npm install --save vue-simple-suggest
# or
yarn add vue-simple-suggest
Unpkg
If including via this method - the component will automatically install itself.

Importing
/// ESNext (original code, no pollyfills, single-file .vue component, css included)
import VueSimpleSuggest from 'vue-simple-suggest/lib'
///
/// ES6 (async polyfills)
import VueSimpleSuggest from 'vue-simple-suggest'
// or, if you have problems importing:
import VueSimpleSuggest from 'vue-simple-suggest/dist/es6'
///
/// ES7 and above (no polyfills)
import VueSimpleSuggest from 'vue-simple-suggest/dist/es7'
///
/// CommonJS (async, arrow-functions and promises are polyfilled)
const VueSimpleSuggest = require('vue-simple-suggest')
// or, if you have problems importing:
const VueSimpleSuggest = require('vue-simple-suggest/dist/cjs')
///
// Optional - import css separately with css loaders:
import 'vue-simple-suggest/dist/styles.css'
Polyfills
New in
v1.8.3
vue-simple-suggest
comes with minimal optional polyfills for IE11+ - Object.assign
, Element.prototype.closest
and Element.prototype.matches
.
You can import them like this:
import 'vue-simple-suggest/lib/polyfills';
// or
require('vue-simple-suggest/lib/polyfills');
Usage
Globaly:
// You don't need to do it, if including via
Build Setup
# clone the repo
git clone https://github.com/KazanExpress/vue-simple-suggest.git
cd ./vue-simple-suggest
# install dependencies
npm install
# serve example with hot reload at localhost
npm run dev
# build example & readme for static serving
npm run docs
Default Controls
New in v1.2.0
These are default keyboard shortcuts.
Can be customized with the controls
prop. All fields in this controls
object are optional.
Default scheme:
| Key (key code) | Description |
|---|---|
Escape (27) |
If the suggestions list is shown - hide it. Defined by hideList property. |
ArrowDown (40) |
If the suggestions list is hidden - show it. Defined by showList property. |
ArrowUp (38) / ArrowDown (40) |
Cycle (hover) through suggestions. Defined by selectionUp /selectionDown properties respectfully. |
Enter (13) |
If the list is shown - chooses the highlighted element. Defined by select property. |
(Ctrl/Shift) + Space (32) |
Select the first element in the list. Defined by autocomplete property. Works with Ctrl modifier key or Shift modifier key. |
(Ctrl/Shift) + Enter (13) |
Same as previous, but also hides the suggestions list. |
JS object:
{
selectionUp: [38],
selectionDown: [40],
select: [13],
showList: [40],
hideList: [27],
autocomplete: [32, 13]
}
Component API
TLDR
Click to expand

<vue-simple-suggest ref="vueSimpleSuggest" v-model="model"
value-attribute="id"
display-attribute="title"
mode="input"
placeholder="placeholder!!!"
:list="getListFunction"
:max-suggestions="10"
:min-length="3"
:debounce="100"
:destyled="false"
:remove-list="false"
:filter-by-query="false"
:filter="customFilterFunction"
:value="defaultValue"
:nullable-select="true"
:controls="{
selectionUp: [38, 33],
selectionDown: [40, 34],
select: [13, 36],
showList: [40],
hideList: [27, 35],
autocomplete: [32, 13],
}"
@input="onInputEvent"
@select="onSuggestSelect"
@hover="onSuggestHover"
@focus="onFocus"
@blur="onBlur"
@request-start="onRequestStart"
@request-done="onRequestDone"
@request-failed="onRequestFailed"
@show-list="onShowList"
@hide-list="onHideList"
>

<input class="optional-custom-input">

<template slot="misc-item-above" slot-scope="{ suggestions, query }">

You're searching for {{ query }}.

{{ suggestions.length }} suggestions are shown...

</template>

{{ suggestion.title }}

Loading...

</vue-simple-suggest>
CSS class structure
If there's a need to customize the appearance of the component, here's the internal class-structure:
// .designed is applied only if `destyled` prop is false.
.vue-simple-suggest.designed.focus // .focus is applied whenever the component is focused.
.input-wrapper
.default-input // Replaced with your custom input if default slot is provided.
.suggestions // Also has transition classes, see below.
.suggest-item
If you wish to use your existing classes, or frameworks like Bootstrap you can inject your own classes using the 'styles'
prop:

<template>
<vue-simple-suggest
v-model="chosen"
:list="simpleSuggestionList"
:styles="autoCompleteStyle"
:destyled=true
:filter-by-query="true">
</vue-simple-suggest>
</template>
`

Scheme:
| Property | Description |
|---|---|
vueSimpleSuggest |
Additional classname for component's root element. |
inputWrapper |
Additional classname for .input-wrapper element. |
defaultInput |
Additional classname for input element if no custom input component is given. |
suggestions |
Additional classname for suggestions list ul element. |
miscItemAbove |
Classname for misc-item-above slot wrapper (li element itself). |
suggestItem |
Additional classname for suggestion item li element. |
miscItemBelow |
Classname for misc-item-below slot wrapper (li element itself). |
Transitions
New in v1.8.0
You can also define custom list transitions by defining css rules for the transition named vue-simple-suggest
on the .suggestions
div:
.suggestions {
/* It's improtant to have a cpecific pivot point for transition:*/
opacity: 1;
}
.vue-simple-suggest-enter-active.suggestions,
.vue-simple-suggest-leave-active.suggestions {
/* Transition length here:*/
transition: opacity .2s;
}
.vue-simple-suggest-enter.suggestions,
.vue-simple-suggest-leave-to.suggestions {
/* Transition rule for "disengaged" element:*/
opacity: 0;
}
API definitions
Props
| Name | Type | Default | Description |
|---|---|---|---|
controls v1.2.0 |
Object | See default controls | Determines the keyboard shortcuts in key-codes (for browser-compatibility purposes). Arrays provide the ability to assign multiple keys to one action. Consists of 5 array fields: selectionUp , selectionDown , select , hideList and autocomplete , all of which are optional. |
max-suggestions |
Number | 10 |
The maximum amount of suggestions to display. Set to 0 for infinite suggestions. |
min-length |
Number | 1 |
The minimum amount of symbols in input to trigger suggestion list. vue-simple-suggest starts behaving as a dropdown menu, if the value is 0. |
display-attribute |
String | 'title' |
The property in a suggestion object to display in a list. Supports dotted paths. |
value-attribute |
String | 'id' |
The property in a suggestion object to use as a unique key. Supports dotted paths. |
list |
Function or Array | () => [] |
The array provider function, must accept a query as its only argument. Can return an array or a promise. Can be async. The component behaves as a simple input without this function. |
debounce |
Number | 0 |
Determines the list debounce (a time between the input event and a function execution). |
destyled |
Boolean | false |
Whether to cancel the default styling of input and suggestions list. |
styles v1.8.0 |
Object | {} |
CSS classes to attach with current component style. |
remove-list |
Boolean | false |
If true - the suggestion list will be always hidden. |
filter-by-query |
Boolean | false |
Whether to filter the resulting suggestions by input's text query (make it a search component). |
filter |
Function | - | A custom function for filtering the suggestion results that accepts a single item and a query to filter by as its 2 arguments. Used only if filter-by-query is set to true . |
mode v1.4.0 |
String | 'input' |
The v-model event. Determines the event, that triggers v-model . Can be one of 'input' (v-model binds a displayed property) or 'select' (v-model binds a selected item). |
type , value , pattern , etc... |
All of the HTML5 input attributes with their respected default values. | ||
nullable-select v1.9.0 |
Boolean | false |
Whether the select should accept null or not. |
preventHide v1.11.0 |
Boolean | false |
Whether to keep the input open or not, allowing the user to select multiple inputs |
mode
New in v1.4.0
Determines the event, that triggers v-model
. Can be one of 'input'
(default) or 'select'
.
For example, if 'input'
is chosen - then v-model will update the value each time an input
event is fired, setting the input's string.
Same is for 'select'
- v-model changes only when something is selected from the list, setting the selected value (string, object or whatever) to its argument.
A proper use-case for it being when one wants to use the component only for selection binding and custom input for text binding:
<vue-simple-suggest v-model="selected" mode="select">
<input v-model="text">
</vue-simple-suggest>
Emitted Events
| Name | Arguments | Description |
|---|---|---|
input |
HTML input event | An outward projection of the current input's event. |
focus |
HTML focus event | An outward projection of the current input's event. |
blur |
HTML focus event | An outward projection of the current input's event. |
select |
Selected suggestion | Fires on suggestion selection (via a mouse click or enter keypress). |
hover |
Hovered suggestion, target element | Fires each time a new suggestion is highlighted (via a cursor movement or keyboard arrows). |
suggestion-click |
Selected suggestion, HTML click event | Fires on suggestion element click. |
show-list |
- | Fires each time the suggestion list is toggled to be shown. |
hide-list |
- | Fires each time the suggestion list is being hidden. |
request-start |
Current input value (query) | Fires each time a list function starts executing. |
request-done |
Resulting suggestions list | Fires when a list function successfully returns a result and forwards that result as an argument. |
request-failed |
The interrrupting exception | Fires if an exception occurs during the execution of a list funciton. |
Ref Methods
accessed via
$refs.*your ref name here*
| Name | Arguments | Description |
|---|---|---|
showList |
- | Shows the suggestion list. Emits the respected event. |
hideList |
- | Hides the suggestion list. Emits the respected event. |
getSuggestions |
query : string |
Gets and processes suggestions from the list prop. Returns a promise. Emits the requestStart , requestDone and requestFailed events. |
research |
- | Debounced getSuggestions on the current input value. |
clearSuggestions |
- | Clears the suggestions array. |
select |
suggestion | Selects the passed suggestion. Emits the respected event. |
hover |
suggestion | Hovers over the passed suggestion. Emits the respected event. |
displayProperty |
suggestion | Returns the displayed property of a suggestion. |
valueProperty |
suggestion | Returns the value property of a suggestion. |
setText v1.9.0 |
text | Reliably sets custom text to the input field. |
autocompleteText v1.10.0 |
suggestion | Autocompletes the input text using the suggestion passed as the only argument. |
Ref Event Handlers
accessed via
$refs.*your ref name here*
You can use these to imitate some of the component's behaviours.
| Name | Arguments | Description |
|---|---|---|
onShowList |
Invoked when a suggestion list needs to be shown. | |
showSuggestions |
Shows suggestion list, refreshes the data if needed. | |
onInput |
HTML input event | Invoked whenever the input text is changed. Emits the input event. |
onFocus |
HTML focus event | Invoked whenever the input comes into focus, emits the focus event. |
onBlur |
HTML focus event | Antonym to onFocus . |
onAutocomplete |
- | Invoked when the autocomplete keyboard shortcut is pressed. Selects the first suggestion. |
onListKeyUp |
HTML keyup event | Invoked on component keyup. Internally used for hiding the list. |
onKeyDown |
HTML keydown event | Invoked on component keydown. Internally used for showing the list, updating suggestions and preventing form submit. |
moveSelection |
Invoked when hovered element needs to be changed. | |
suggestionClick |
suggestion , HTML click event |
Invoked on any suggestion click. Can be used to emulate such a click from ouside of the component. |
Ref Data
accessed via
$refs.*your ref name here*
| Name | Default | Description |
|---|---|---|
selected |
null |
Currently selected element. |
hovered |
null |
Currently hovered element. |
suggestions |
[] |
Current suggestions list. |
textLength |
0 |
Length of the text in the input. |
listShown |
false |
Is suggestion list shown. |
inputElement |
null |
Currently used HTMLInputElement. |
canSend |
true |
Whether the assigned getListFuncion can be executed. |
timeoutInstance |
null |
The timeout until next getListFunction execution. |
text |
$props.value |
Current input text. |
slotIsComponent |
false |
Whether this current custom input is a vue-component. |
listIsRequest |
- | Whether the list prop is a function. |
input |
- | A ref to the current input (component or vanilla). |
hoveredIndex |
- | The current hovered element index. |
controlScheme |
Default Controls | The current controls scheme. |
isPlainSuggestion |
false |
Whether the current suggestions list consists of plain strings (not objects). |
isClicking |
false |
true if the user currently clicks. |
isOverList |
false |
true if the user currently hovers over suggestions list. |
isInFocus |
false |
true if the component is currently in focus. |
isTabbed |
false |
true if the user pressed tab, while the component is in focus. |
isSelectedUpToDate |
false |
true if the user hasn't done any inputs since the last selection, so the selection is still relevant. |
Slots
Custom input
default slot (optional)
Supports nesting. Input props can be passed to a custom input to avoid their processing by vue-simple-suggest. Defaults to a simple input with props passed to vue-simple-suggest.
Warning: v-model
on a custom input IS NOT the same as v-model
on vue-simple-suggest!

<vue-simple-suggest v-model="model" placeholder="Text here" type="search" pattern="[a-z]+"/>

<vue-simple-suggest>
<input pattern="[a-z]+">
</vue-simple-suggest>

<vue-simple-suggest v-model="model" placeholder="Text here" type="search">
</vue-simple-suggest>

<vue-simple-suggest v-model="model">
<input placeholder="Text here" type="search">
</vue-simple-suggest>

<vue-simple-suggest v-model="model">

<input type="email">

</vue-simple-suggest>

<vue-simple-suggest v-model="vModelGoesHere">
<my-custom-input-somponent :value="initialInputValueGoesHere"></my-custom-input-somponent>
</vue-simple-suggest>
Custom input component caveats:
To work with the vue-simple-suggest
your custom input component has to follow certain standard behaviours.
Custom input component must (in order to work properly):
- Emit an
input
event. - Emit
focus
andblur
events. - Have a
value
prop.
Custom input component should (in order to avoid usage limitations):
- Not stop any event propagations from internal input HTML element.
- Forward an original event argument with
focus
andblur
events.
If vue-simple-suggest
with your custom component doesn't seem to react to outside variable changes - bind both components' v-model to the same variable, like so:
<vue-simple-suggest v-model="model">
<my-custom-input-somponent v-model="model"></my-custom-input-somponent>
</vue-simple-suggest>
Accessibility on custom input
New in v1.9.0
vue-simple-suggest
automatically injects 3 necessary ARIA attributes for the default <input>
element
and any custom input, as long as your custom input component contains an html <input>
element.
These attributes ensure that the autocomplete can be used by users who rely on Screen Readers.
| Name | Value | Description |
|---|---|---|
| aria-autocomplete | "list" |
Indicates that the autocomplete behavior of the text input is to suggest a list of possible values in a popup. |
| aria-controls | IDREF of suggestions list |
IDREF of the popup element that lists suggested values. |
| aria-activedescendant | IDREF of hovered option | Enables assistive technologies to know which element the application regards as focused while DOM focus remains on the input element. |
Custom suggestion item
suggestion-item
slot (optional)
Description
Allows custom html-definitons of the suggestion items in a list.
Defaults to {{ displayAttribute(suggestion) }}
Accepts the suggestion
object and a query
text as a slot-scope
attribute values.

<vue-simple-suggest>

{{ suggestion.title }} by {{ suggestion.author }}

</vue-simple-suggest>
Custom buttons inside of suggestion items
If you want to add some action buttons to the suggetion items,
just use the .stop
directive modifier to prevent the default suggestion-click
:

<vue-simple-suggest>

{{ suggestion.title }} by {{ suggestion.author }}
<button @click.stop="remove(suggestion)">remove from list</button>
<button @click.stop="like(suggestion)">add to favorites</button>

</vue-simple-suggest>
In this case, the buttons will ONLY execute the bound method and will not select the suggested item.
Manual autocomplete
If there's a need to autocomplete the suggestion in the input instead of selecting it (like in mobile suggestions of google search),
you can use the autocomplete()
function in the slot's scope:

<vue-simple-suggest>

{{ suggestion.title }} by {{ suggestion.author }}
<button @click.stop="autocomplete()">Complete input</button>

</vue-simple-suggest>
or in the ref methods:
<template>
<vue-simple-suggest ref="suggest">

{{ suggestion.title }} by {{ suggestion.author }}
<button @click.stop="onAutocompleteButtonClick(suggestion)">Complete input</button>

</vue-simple-suggest>
</template>

Ref Data
In cooperation with ref fields this slot can be used to drastically transform the suggestion list behaviour.
One of the simplest examples - highlighting the query text in the results:

boldenSuggestion(scope) {
if (!scope) return scope;
const { suggestion, query } = scope;
let result = this.$refs.suggestComponent.displayProperty(suggestion);
if (!query) return result;
const texts = query.split(/[\s-_/\\|\.]/gm).filter(t => !!t) || [''];
return result.replace(new RegExp('(.*?)(' + texts.join('|') + ')(.*?)','gi'), '$1$2$3');
}
Result via Google Books search API:
Custom miscellaneous item slots
misc-item-above
andmisc-item-below
slots (optional)
Allow custom elements to be shown in suggestion list. These elements never dissapear from the list, neither can they be selected nor hovered on.
They can be used for decoration, loaders, error messages and etc.
These slots don't have defaults, so they are not shown until defined.
Accept the suggestions
array and a query
text as a slot-scope
attribute values.

<vue-simple-suggest>
<template slot="misc-item-above" slot-scope="{ suggestions, query }">

You're searching for {{ query }}.

{{ suggestions.length }} suggestions are shown...

</template>

Loading...

</vue-simple-suggest>
These slots can also be used to handle empty results, like this:

<template slot="misc-item-above" slot-scope="{ suggestions, query }">

You're searching for '{{ query }}'.

<template v-if="suggestions.length > 0">

{{ suggestions.length }} suggestions are shown...

</template>

No results

</template>
Contributors
Thanks goes to these wonderful people (emoji key):
This project follows the all-contributors specification. Contributions of any kind are welcome!


Transposition Cipher
In a transposition cipher, one rearranges the order of the letters in the text without making substitutions.
In a transposition cipher, one rearranges the order of the letters in the text without making substitutions.
Implement a program that runs a game of video poker.
Practice work to keep your brain going over the break.
Implement a program that recovers JPEGs from a forensic image.
Implement a program that applies filters to images.
Implement a program that runs a runoff election, as shown below.
Implement a program that runs a plurality election, as shown below.
Implement a program that encrypts messages using Caesar’s cipher.
Implement a program that computes the approximate grade level needed to comprehend some text.


DSC KITRC is dedicated to providing an inclusive and harassment-free experience for participants at all of our events. We are working events intended for networking and collaboration in the community. They exist to encourage the open exchange of ideas and expression and require an environment that recognizes the inherent worth of every person and group. While at DSC KITRC or related social events, any participants, including members, speakers, attendees, volunteers, sponsors, exhibitors, booth staff and anyone else, should not engage in harassment in any form.
Photography is encouraged, but other participants must be given a reasonable chance to opt out from being photographed. If they object to the taking of their photograph, comply with their request. It is inappropriate to take photographs in contexts where people have a reasonable expectation of privacy (in bathrooms or where participants are sleeping).
Participants asked to stop any harassing behavior are expected to comply immediately. As this is an event, we like to explicitly note that the hacks created at our hackathon are equally subject to the anti-harassment policy.
In summary, be nice to each other and help others in need
All event participants are expected to behave in accordance with professional standards, with both this Code of Conduct as well as their respective college policies governing appropriate workplace behavior, and applicable laws.
If you feel uncomfortable or think there may be a potential violation of the code of conduct, please report it to any volunteer present either personally or at the event or contact us at<EMAIL_ADDRESS>All reporters have the right to remain anonymous.


Hi Welcome to the Game
Please enter your name to start
Click here to continue
Stone
Paper
Scissor
Score Board
Computer
0
0


{% extends 'wildlifecompliance/emails/base_email.html' %} {% block content %}
Your request to be linked with the following organisation has been declined:
Organisation: {{ organisation.name }}
ABN: {{ organisation.abn }}


The student fixes their eyes on the outline of the model or object, then tracks the edge of the object with his or her eyes, while simultaneously drawing the contour very slowly, in a steady, continuous line without lifting the pencil or looking at the paper.


This metronome requires JavaScript.
This browser does not support all of the features that are needed to run the metronome. Please try another one.


Object-tracking Benchmark
Zhejiang UniversityImplemented mean-shift and other principle tracking methods, evaluate performance on TB-50 Sequences.
Zhejiang University
Hi, guys! I am currently a senior undergraduate student in computer science at Zhejiang University, China. I work as a research intern in State Key Laboratory of CAD & CG, under the supervision of Prof. Deng Cai. I love machine learning and its applications like data mining and computer vision. My undergraduate research focus on recomendation and social network analysis.
This summer, I had my great pleasure to work with Prof. Yong Jae Lee and Prof. Ian Davidson at UCDavis.
Implemented mean-shift and other principle tracking methods, evaluate performance on TB-50 Sequences.
Built a collaborative filtering recommendation algorithms toolbox in C++, implemented K-nearest neighbor and probabilistic matrix factorization methods.
The current researches on tweet recommendation mainly focus on the content of the tweets and the interests of the receiver. We observed impact of publishers’ authority in social media information propagation and used tensor model in tweet recommendation to incorporate all the three factors.
Pairwise learning to rank methods require a substantial amount of training to perform well. We employed localized annotations to synthesize pairs of training instance,achieved higher ranking accuracy via augmented training data
Thesis: Personalized Recommendation in Heterogeneous Social Network
Topic: Human Augmented Training Data in Learning To Rank
Matlab & C/C++ & Python & Java & UNIX shell
OpenCV & VLFeat & OpenGL
Movies, Travelling, Basketball.


Flowhub keeps a registry of runtimes available to each user. To add new runtimes, use the Flowhub Registry API and the refresh the runtime list.
For NoFlo runtimes running on Node.js, see noflo-nodejs.


In a previous post, I talked about why "shelling out" to spawn a pipeline of external programs via an intermediate shell is a common cause of bugs, security holes, unnecessary overhead, and silent failures. But it's so convenient! Why can't running pipelines of external programs be convenient and safe? Well, there's no real reason, actually. The shell itself manages to construct and execute pipelines quite well. In principle, there's nothing stopping high-level languages from doing it at least as well as shells do – the common ones just don't by default, instead requiring users to make the extra effort to use external programs safely and correctly. There are two major impediments:
Some moderately tricky low-level UNIX plumbing using the pipe
, dup2
, fork
, close
, and exec
system calls;
The UX problem of designing an easy, flexible programming interface for commands and pipelines.
This post describes the system we designed and implemented for Julia, and how it avoids the major flaws of shelling out in other languages. First, I'll present the Julia version of the previous post's example – counting the number of lines in a given directory containing the string "foo". The fact that Julia provides complete, specific diagnostic error messages when pipelines fail turns out to reveal a surprising and subtle bug, lurking in what appears to be a perfectly innocuous UNIX pipeline. After fixing this bug, we go into details of how Julia's external command execution and pipeline construction system actually works, and why it provides greater flexibility and safety than the traditional approach of using an intermediate shell to do all the heavy lifting.
Here's how you write the example of counting the number of lines in a directory containing the string "foo" in Julia (you can follow along at home if you have Julia installed from source by changing directories into the Julia source directory and doing cp -a src "source code"; mkdir tmp
and then firing up the Julia repl):
julia> dir = "src";
julia> int(readchomp(`find $dir -type f -print0` |> `xargs -0 grep foo` |> `wc -l`))
5
This Julia command looks suspiciously similar to the naïve Ruby version we started with in the previous post:
`find #{dir} -type f -print0 | xargs -0 grep foo | wc -l`.to_i
However, it isn't susceptible to the same problems:
julia> dir = "source code";
julia> int(readchomp(`find $dir -type f -print0` |> `xargs -0 grep foo` |> `wc -l`))
5
julia> dir = "nonexistent";
julia> int(readchomp(`find $dir -type f -print0` |> `xargs -0 grep foo` |> `wc -l`))
find: `nonexistent': No such file or directory
ERROR: failed processes:
Process(`find nonexistent -type f -print0`, ProcessExited(1)) [1]
Process(`xargs -0 grep foo`, ProcessExited(123)) [123]
in pipeline_error at process.jl:412
in readall at process.jl:365
in readchomp at io.jl:172
julia> dir = "foo'; echo MALICIOUS ATTACK; echo '";
julia> int(readchomp(`find $dir -type f -print0` |> `xargs -0 grep foo` |> `wc -l`))
find: `foo\'; echo MALICIOUS ATTACK; echo \'': No such file or directory
ERROR: failed processes:
Process(`find "foo'; echo MALICIOUS ATTACK; echo '" -type f -print0`, ProcessExited(1)) [1]
Process(`xargs -0 grep foo`, ProcessExited(123)) [123]
in pipeline_error at process.jl:412
in readall at process.jl:365
in readchomp at io.jl:172
The default, simplest-to-achieve behavior in Julia is:
not susceptible to any kind of metacharacter breakage,
reliably detects all subprocess failures,
automatically raises an exception if any subprocess fails,
prints error messages including exactly which commands failed.
In the above examples, we can see that even when dir
contains spaces or quotes, the expression still behaves exactly as intended – the value of dir
is interpolated as a single argument to the find
command. When dir
is not the name of a directory that exists, find
fails – as it should – and this failure is detected and automatically converted into an informative exception, including the fully expanded command-lines that failed.
In the previous post, we observed that using the pipefail
option for Bash allows detection of pipeline failures, like this one, occurring before the last process in the pipeline. However, it only allows us to detect that at least one thing in the pipeline failed. We still have to guess at what parts of the pipeline actually failed. In the Julia example, on the other hand, there is no guessing required: when a non-existent directory is given, we can see that both find
and xargs
fail. While it is unsurprising that find
fails in this case, it is unexpected that xargs
also fails. Why does xargs
fail?
One possibility to check for is that the xargs
program fails with no input. We can use Julia's success
predicate to try it out:
julia> success(`cat /dev/null` |> `xargs true`)
true
Ok, so xargs
seems perfectly happy with no input. Maybe grep doesn't like not getting any input?
julia> success(`cat /dev/null` |> `grep foo`)
false
Aha! grep
returns a non-zero status when it doesn't get any input. Good to know. It turns out that grep
indicates whether it matched anything or not with its return status. Most programs use their return status to indicate success or failure, but some, like grep
, use it to indicate some other boolean condition – in this case "found something" versus "didn't find anything":
julia> success(`echo foo` |> `grep foo`)
true
julia> success(`echo bar` |> `grep foo`)
false
Now we know why grep
is "failing" – and xargs
too, since it returns a non-zero status if the program it runs returns non-zero. This means that our Julia pipeline and the "responsible" Ruby version are both susceptible to bogus failures when we search an existing directory that happens not to contain the string "foo" anywhere:
julia> dir = "tmp";
julia> int(readchomp(`find $dir -type f -print0` |> `xargs -0 grep foo` |> `wc -l`))
ERROR: failed process: Process(`xargs -0 grep foo`, ProcessExited(123)) [123]
in error at error.jl:22
in pipeline_error at process.jl:394
in pipeline_error at process.jl:407
in readall at process.jl:365
in readchomp at io.jl:172
Since grep
indicates not finding anything using a non-zero return status, the readall
function concludes that its pipeline failed and raises an error to that effect. In this case, this default behavior is undesirable: we want the expression to just return 0
without raising an error. The simple fix in Julia is this:
julia> dir = "tmp";
julia> int(readchomp(`find $dir -type f -print0` |> ignorestatus(`xargs -0 grep foo`) |> `wc -l`))
0
This works correctly in all cases. Next I'll explain how all of this works, but for now it's enough to note that the detailed error message provided when our pipeline failed exposed a rather subtle bug that would eventually cause subtle and hard-to-debug problems when used in production. Without such detailed error reporting, this bug would be pretty difficult to track down.
Julia borrows the backtick syntax for external commands form Perl and Ruby, both of which in turn got it from the shell. Unlike in these predecessors, however, in Julia backticks don't immediately run commands, nor do they necessarily indicate that you want to capture the output of the command. Instead, backticks just construct an object representing a command:
julia> `echo Hello`
`echo Hello`
julia> typeof(ans)
Cmd
(In the Julia repl, ans
is automatically bound to the value of the last evaluated input.) In order to actually run a command, you have to do something with a command object. To run a command and capture its output into a string – what other languages do with backticks automatically – you can apply the readall
function:
julia> readall(`echo Hello`)
"Hello\n"
Since it's very common to want to discard the trailing line break at the end of a command's output, Julia provides the readchomp(x)
command which is equivalent to writing chomp(readall(x))
:
julia> readchomp(`echo Hello`)
"Hello"
To run a command without capturing its output, letting it just print to the same stdout
stream as the main process – i.e. what the system
function does when given a command as a string in other languages – use the run
function:
julia> run(`echo Hello`)
Hello
The "Hello\n"
after the readall
command is a returned value, whereas the Hello
after the run
command is printed output. (If your terminal supports color, these are colored differently so that you can easily distinguish them visually.) Nothing is returned by the run
command, but if something goes wrong, an exception is raised:
julia> run(`false`)
ERROR: failed process: Process(`false`, ProcessExited(1)) [1]
in error at error.jl:22
in pipeline_error at process.jl:394
in run at process.jl:384
julia> run(`notaprogram`)
execvp(): No such file or directory
ERROR: failed process: Process(`notaprogram`, ProcessExited(-1)) [-1]
in error at error.jl:22
in pipeline_error at process.jl:394
in run at process.jl:384
As with xargs
and grep
above, this may not always be desirable. In such cases, you can use ignorestatus
to indicate that the command returning a non-zero value should not be considered an error:
julia> run(ignorestatus(`false`))
julia> run(ignorestatus(`notaprogram`))
execvp(): No such file or directory
ERROR: failed process: Process(`notaprogram`, ProcessExited(-1)) [-1]
in error at error.jl:22
in pipeline_error at process.jl:394
in run at process.jl:384
In the latter case, an error is still raised in the parent process since the problem is that the executable doesn't even exist, rather than merely that it ran and returned a non-zero status.
Although Julia's backtick syntax intentionally mimics the shell as closely as possible, there is an important distinction: the command string is never passed to a shell to be interpreted and executed; instead it is parsed in Julia code, using the same rules the shell uses to determine what the command and arguments are. Command objects allow you to see what the program and arguments were determined to be by accessing the .exec
field:
julia> cmd = `perl -e 'print "Hello\n"'`
`perl -e 'print "Hello\n"'`
julia> cmd.exec
3-element Union(UTF8String,ASCIIString) Array:
"perl"
"-e"
"print \"Hello\\n\""
This field is a plain old array of strings that can be manipulated like any other Julia array.
The purpose of the backtick notation in Julia is to provide a familiar, shell-like syntax for making objects representing commands with arguments. To that end, quotes and spaces work just as they do in the shell. The real power of backtick syntax doesn't emerge, however, until we begin constructing commands programmatically. Just as in the shell (and in Julia strings), you can interpolate values into commands using the dollar sign ($
):
julia> dir = "src";
julia> `find $dir -type f`.exec
4-element Union(UTF8String,ASCIIString) Array:
"find"
"src"
"-type"
"f"
Unlike in the shell, however, Julia values interpolated into commands are interpolated as a single verbatim argument – no characters inside the value are interpreted as special after the value has been interpolated:
julia> dir = "two words";
julia> `find $dir -type f`.exec
4-element Union(UTF8String,ASCIIString) Array:
"find"
"two words"
"-type"
"f"
julia> dir = "foo'bar";
julia> `find $dir -type f`.exec
4-element Union(UTF8String,ASCIIString) Array:
"find"
"foo'bar"
"-type"
"f"
This works no matter what the contents of the interpolated value is, allowing simple interpolation of characters that are quite difficult to pass as parts of command-line arguments even in the shell (for the following examples, tmp/a.tsv
and tmp/b.tsv
can be created in the shell with echo -e "foo\tbar\nbaz\tqux" > tmp/a.tsv; echo -e "foo\t1\nbaz\t2" > tmp/b.tsv
):
julia> tab = "\t";
julia> cmd = `join -t$tab tmp/a.tsv tmp/b.tsv`;
julia> cmd.exec
4-element Union(UTF8String,ASCIIString) Array:
"join"
"-t\t"
"tmp/a.tsv"
"tmp/b.tsv"
julia> run(cmd)
foo bar 1
baz qux 2
Moreover, what comes after the $
can actually be any valid Julia expression, not just a variable name:
julia> `join -t$"\t" tmp/a.tsv tmp/b.tsv`.exec
4-element Union(UTF8String,ASCIIString) Array:
"join"
"-t\t"
"a.tsv"
"b.tsv"
A tab character is somewhat harder to pass in the shell, requiring command interpolation and some tricky quoting:
bash-3.2$ join -t"$(printf '\t')" tmp/a.tsv tmp/b.tsv
foo bar 1
baz qux 2
While interpolating values with spaces and other strange characters is great for non-brittle construction of commands, there was a reason why the shell split values on spaces in the first place: to allow interpolation of multiple arguments. Most modern shells have first-class array types, but older shells used space-separation to simulate arrays. Thus, if you interpolate a value like "foo bar" into a command in the shell, it's treated as two separate words by default. In languages with first-class array types, however, there's a much better option: consistently interpolate single values as single arguments and interpolate arrays as multiple values. This is precisely what Julia's backtick interpolation does:
julia> dirs = ["foo", "bar", "baz"];
julia> `find $dirs -type f`.exec
6-element Union(UTF8String,ASCIIString) Array:
"find"
"foo"
"bar"
"baz"
"-type"
"f"
And of course, no matter how strange the strings contained in an interpolated array are, they become verbatim arguments, without any shell interpretation. Julia's backticks have one more fancy trick up their sleeve. We saw earlier (without really remarking on it) that you could interpolate single values into a larger argument:
julia> x = "bar";
julia> `echo foo$x`
`echo foobar`
What happens if x
is an array? Only one way to find out:
julia> x = ["bar", "baz"];
julia> `echo foo$x`
`echo foobar foobaz`
Julia does what the shell would do if you wrote echo foo{bar,baz}
. This even works correctly for multiple values interpolated into the same shell word:
julia> dir = "/data"; names = ["foo","bar"]; exts=["csv","tsv"];
julia> `cat $dir/$names.$exts`
`cat /data/foo.csv /data/foo.tsv /data/bar.csv /data/bar.tsv`
This is the same Cartesian product expansion that the shell does if multiple {...}
expressions are used in the same word.
You can read more in Julia's online manual, including how to construct complex pipelines, and how shell-compatible quoting and interpolation rules in Julia's backtick syntax make it both simple and safe to cut-and-paste shell commands into Julia code. The whole system is designed on the principle that the easiest thing to do should also be the right thing. The end result is that starting and interacting with external processes in Julia is both convenient and safe.


#!/usr/bin/env python
import logging
import requests
import urllib3
from requests_futures.sessions import FuturesSession
from concurrent.futures import wait
from frisbee.utils import clean_urls
from frisbee.utils import gen_logger
from frisbee.utils import gen_headers
from typing import ClassVar
from typing import Dict
from typing import List
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
[docs]class Base(object):
"""Base module class to assist in writing new modules."""
name: ClassVar[str] = 'base'
log: ClassVar[logging.Logger] = gen_logger(name, logging.DEBUG)
limit: ClassVar[int] = 500
def __init__(self, log_level=logging.DEBUG) -> None:
"""Local variables for the module."""
self.set_log_level(log_level)
[docs] def set_log_level(self, level: str) -> None:
"""Override the default log level of the class."""
if level == 'info':
to_set = logging.INFO
if level == 'debug':
to_set = logging.DEBUG
if level == 'error':
to_set = logging.ERROR
self.log.setLevel(to_set)
[docs] def _request_bulk(self, urls: List[str]) -> List:
"""Batch the requests going out."""
if not urls:
raise Exception("No results were found")
urls = clean_urls(urls)
session: FuturesSession = FuturesSession()
self.log.debug("Bulk requesting: %d" % len(urls))
futures = [
session.get(u, headers=gen_headers(), timeout=7, verify=False)
for u in urls
]
self.log.debug("Requests made")
done, _ = wait(futures)
results: List = list()
self.log.debug("Storing results")
for response in done:
try:
results.append(response.result())
except Exception as err:
self.log.warn("Failed result: %s" % err)
self.log.debug("Stored and returning")
return results
[docs] def search(self) -> None:
"""Execute search function and hand to processor."""
raise NotImplementedError
[docs] def _process(self, responses: List[str]) -> None:
"""Process search engine results for detailed analysis.
Search engine result pages (SERPs) come back with each request and will
need to be extracted in order to crawl the actual hits.
"""
raise NotImplementedError
[docs] def _fetch(self, urls: List[str]) -> None:
"""Perform bulk collection of data and return the content.
Gathering responses is handled by the base class and uses futures to
speed up the processing. Response data is saved inside a local variable
to be used later in extraction.
"""
raise NotImplementedError


|
Drawl
0.3.0-alpha1
The world's best drawing language.
|
Represents text on a drawing. More...
Public Member Functions | |
| Text () | |
| Constructs a default Text object. | |
| Text (@NotNull final String string) | |
| Constructs a Text object with some text. More... | |
| String | getSVG () |
| Gets the SVG associated with this Text object. More... | |
| void | setString (@Nullable final String string) |
| Sets the string associated with this Text object. More... | |
| String | toString () |
| Gets the text string associated with this Text object. More... | |
| void | addText (@Nullable final Text text) |
| Adds Text inside this Shape. More... | |
| Shape | getAbove () |
| Gets this Shape's neighbor above (this Shape is below that one), if any. More... | |
| void | setAbove (@NotNull final Shape shape) |
| Sets this Shape above another Shape. More... | |
| void | setAbove (@NotNull final Shape shape, @NotNull final Measure offset) |
| Sets this Shape above another Shape. More... | |
| Shape | getBelow () |
| Gets this Shape's neighbor below (this Shape is above that one), if any. More... | |
| void | setBelow (@NotNull final Shape shape) |
| Sets this Shape below another Shape. More... | |
| void | setBelow (@NotNull final Shape shape, @NotNull final Measure offset) |
| Sets this circle below another circle. More... | |
| Point | getBottomPort () |
| Returns a Point object representing this Shape's bottom port. More... | |
| String | getFill () |
| Returns the fill associated with this Shape, if any. More... | |
| void | setFill (final String s) |
| Set the fill of this Shape. More... | |
| Measure | getHeight () |
| Returns a Measure object that represents the height of this Shape. More... | |
| Shape | getLeftOf () |
| Gets this Shape's neighbor to the right (this Shape is to the left of that one), if any. More... | |
| void | setLeftOf (@NotNull final Shape shape) |
| Sets this Shape to the left of another one. More... | |
| void | setLeftOf (@NotNull final Shape shape, @NotNull final Measure offset) |
| Sets this Shape's neighbor to the right (this Shape is to the left of that one). More... | |
| Point | getLeftPort () |
| Returns a Point object representing this Shape's left port. More... | |
| Shape | getRightOf () |
| Gets this Shape's neighbor to the left (this Shape is to the right of that one), if any. More... | |
| void | setRightOf (@NotNull final Shape shape) |
| Sets this Shape's neighbor to the left (this Shape is to the right of that one). More... | |
| void | setRightOf (@NotNull final Shape shape, @NotNull final Measure offset) |
| Sets this Shape's neighbor to the left with an offset. More... | |
| Point | getRightPort () |
| Returns a Point object representing this Shape's left port. More... | |
| String | getStroke () |
| Gets the stroke of this Shape. More... | |
| void | setStroke (final String s) |
| Sets the stroke of this shape. More... | |
| Text | getText () |
| Returns a Text object that belongs to this Shape, if there is one. More... | |
| Point | getTopPort () |
| Returns a Point object representing this Shape's top port. More... | |
| void | setWidth (Measure width) |
| Sets the width of this object. | |
| Measure | getWidth () |
| Returns a Measure object that represents the width of this Shape. More... | |
| Boolean | hasText () |
| Indicates whether this shape has a Text object associated with it. More... | |
Protected Member Functions | |
| Number | getExplicitHalfWidth () |
| Gets half the explicit width of this Shape. More... | |
| Number | getExplicitHeight () |
| Get the explicit height of this Shape. More... | |
| void | setExplicitHeight (@Nullable final Number height) |
| Set the height of this Shape to an explicit value. More... | |
| Number | getExplicitWidth () |
| Get the explicit width of this Shape. More... | |
| void | setExplicitWidth (@Nullable final Number width) |
| Set the width of this Shape to an explicit value. More... | |
| Number | getExplicitXPositionCenter () |
| Gets the explicit x-position of the center of this Shape. More... | |
| void | setExplicitXPositionCenter (final Number x) |
| Sets the explicit center position of this Shape. More... | |
| void | setExplicitXPositionCenter (final Integer x) |
| Sets the explicit x position of the center of this Shape. More... | |
| Number | getExplicitXPositionLeft () |
| Gets the explicit x position of the left edge of this Shape. More... | |
| Number | getExplicitXPositionRight () |
| Gets the explicit x position of the right edge of this Shape. More... | |
| Number | getExplicitYPositionBottom () |
| Gets the explicit y position of the bottom of this Shape. More... | |
| Number | getExplicitYPositionCenter () |
| Gets the explicit y-position of the center of this Shape. More... | |
| void | setExplicitYPositionCenter (final Integer y) |
| Sets the explicit y-position of the center of this Shape. More... | |
| void | setExplicitYPositionCenter (final Number y) |
| Sets the explicit y position of this Shape. More... | |
| Number | getExplicitYPositionTop () |
| Gets the explicit y-position of the top of this Shape. More... | |
| Number | getImplicitHalfHeight () |
| Gets half of the implicit height of this Shape. More... | |
| Number | getImplicitHalfWidth () |
| Gets half of the implicit width of this Shape. More... | |
| Number | getImplicitHeight () |
| Gets the implicit height of this Shape. More... | |
| final void | setImplicitHeight (@NotNull final Number implicitHeight) |
| Sets the implicit height of this Shape. More... | |
| Number | getImplicitWidth () |
| Gets the implicit width of this Shape. More... | |
| final void | setImplicitWidth (@NotNull final Number implicitWidth) |
| Sets the implicit width of this Shape. More... | |
| Number | getImplicitXMaximum () |
| Get the implicit maximum (rightmost) x-position of this Shape. More... | |
| Number | getImplicitXMinimum () |
| Get the implicit minimum (leftmost) x-position of this Shape. More... | |
| Number | getImplicitXPositionCenter () |
| Get the implicit x position of the center of this Shape. More... | |
| void | setImplicitXPositionCenter (final Number x) |
| Sets the implicit x position of the center of this Shape. More... | |
| Number | getImplicitXPositionLeft () |
| Gets the implicit x position of the left edge of this Shape. More... | |
| Number | getImplicitXPositionRight () |
| Gets the implicit x position of the right edge of this Shape. More... | |
| Number | getImplicitYPositionBottom () |
| Gets the implicit bottommost y-position of this Shape. More... | |
| Number | getImplicitYPositionCenter () |
| Gets the implicit y position of the center of this Shape. More... | |
| void | setImplicitYPositionCenter (final Number y) |
| Sets the implicit y position of this Shape. More... | |
| Number | getImplicitYPositionTop () |
| Gets the implicit topmost y position of this Shape. More... | |
Static Package Functions | |
| [static initializer] | |
Private Member Functions | |
| Number | getExplicitHalfHeight () |
| Gets half the explicit height of this Shape. More... | |
Private Attributes | |
| String | string |
| The string associated with this Text object. More... | |
| Number | angleToNeighbor |
| The angle, in degrees, to a neighbor. More... | |
| Number | explicitHeight |
The explicit height of a Shape defaults to null to indicate it that has not yet been set. | |
| Number | explicitWidth |
The explicit width of a Shape defaults to null to indicate that it has not yet been set. | |
| Point | explicitPositionCenter = new Point(0, 0) |
| A default Shape is centered at (0,0) in explicit coordinates. | |
| String | fill |
| The fill of this Shape. More... | |
| Number | implicitHeight = DrawlNumber.ONE |
| The implicit height of a default Shape is 1. | |
| Number | implicitWidth = DrawlNumber.ONE |
| The implicit width of a default Shape is 1. | |
| Point | implicitPositionCenter = new Point(0, 0) |
| A default Shape is centered at (0,0) in implicit coordinates. | |
| Shape | neighbor |
| A shape adjacent to this one, if any. | |
| String | stroke |
| The stroke of this Shape. More... | |
| Text | text |
| Text inside this Shape. More... | |
Static Private Attributes | |
| static final Number | ABOVE = DrawlNumber.ZERO |
| static final Number | BELOW = DrawlNumber.valueOf(180) |
| static final Number | LEFT = DrawlNumber.valueOf(270) |
| static final Number | RIGHT = DrawlNumber.valueOf(90) |
| static final String | CANNOT_BE_ADJACENT_TO_ITSELF = "A circle cannot be adjacent to itself" |
| static final FluentLogger | logger |
Represents text on a drawing.
| com.aarrelaakso.drawl.Text.Text | ( | @NotNull final String | string | ) |
|
inherited |
|
inherited |
|
inherited |
|
inherited |
|
privateinherited |
|
protectedinherited |
|
protectedinherited |
Get the explicit height of this Shape.
null
if this Shape has not yet been assigned an explicit height. Reimplemented in com.aarrelaakso.drawl.Circle.
|
protectedinherited |
Get the explicit width of this Shape.
null
if this Shape has not yet been assigned an explicit width. Reimplemented in com.aarrelaakso.drawl.Circle.
|
protectedinherited |
|
protectedinherited |
|
protectedinherited |
|
protectedinherited |
|
protectedinherited |
|
protectedinherited |
|
inherited |
|
inherited |
|
protectedinherited |
|
protectedinherited |
|
protectedinherited |
Gets the implicit height of this Shape.
Reimplemented in com.aarrelaakso.drawl.Circle.
|
protectedinherited |
Gets the implicit width of this Shape.
Reimplemented in com.aarrelaakso.drawl.Circle.
|
protectedinherited |
Get the implicit maximum (rightmost) x-position of this Shape.
Reimplemented in com.aarrelaakso.drawl.Circle.
|
protectedinherited |
Get the implicit minimum (leftmost) x-position of this Shape.
Reimplemented in com.aarrelaakso.drawl.Circle.
|
protectedinherited |
|
protectedinherited |
|
protectedinherited |
|
protectedinherited |
|
protectedinherited |
|
protectedinherited |
Gets the implicit topmost y position of this Shape.
In implicit coordinates, this is the maximum y position.
Reimplemented in com.aarrelaakso.drawl.Circle.
|
inherited |
|
inherited |
|
inherited |
|
inherited |
|
inherited |
| String com.aarrelaakso.drawl.Text.getSVG | ( | ) |
Gets the SVG associated with this Text object.
Reimplemented from com.aarrelaakso.drawl.Shape.
|
inherited |
|
inherited |
|
inherited |
|
inherited |
|
inherited |
|
inherited |
|
inherited |
Sets this circle below another circle.
| shape | The circle that will be above this one. |
|
protectedinherited |
Set the height of this Shape to an explicit value.
| height | The new height of this Shape. Can be null to indicate that this Shape has not yet been assigned an explicit height. |
Reimplemented in com.aarrelaakso.drawl.Circle.
|
protectedinherited |
Set the width of this Shape to an explicit value.
| width | the new width of this Shape, or null to indicate that this Shape has not yet been assigned an explicit width. |
Reimplemented in com.aarrelaakso.drawl.Circle.
|
protectedinherited |
|
protectedinherited |
|
protectedinherited |
Sets the explicit y-position of the center of this Shape.
This convenience allows passing the argument as an Integer rather than a DrawlNumber.
| y | The explicit y position of this shape. |
|
protectedinherited |
|
inherited |
Set the fill of this Shape.
| s | A string representing a fill color, e.g., "white". |
|
protectedinherited |
Sets the implicit height of this Shape.
| implicitHeight |
|
protectedinherited |
|
protectedinherited |
|
protectedinherited |
|
inherited |
|
inherited |
| void com.aarrelaakso.drawl.Text.setString | ( | @Nullable final String | string | ) |
|
inherited |
Sets the stroke of this shape.
| s | A stroke name. |
| String com.aarrelaakso.drawl.Text.toString | ( | ) |
|
privateinherited |
The angle, in degrees, to a neighbor.
0 represents up, and 90 degrees represents to the right.
|
privateinherited |
|
private |
|
privateinherited |
|
privateinherited |


|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object jml.topics.LdaGibbsSampler
public class LdaGibbsSampler
Gibbs sampler for estimating the best assignments of topics for words and documents in a corpus. The algorithm is introduced in Tom Griffiths' paper "Gibbs sampling in the generative model of Latent Dirichlet Allocation" (2002).
| Field Summary | |
|---|---|
(package private) double |
alpha
Dirichlet parameter (document--topic associations) |
(package private) double |
beta
Dirichlet parameter (topic--term associations) |
private static int |
BURN_IN
burn-in period |
(package private) Corpus |
corpus
|
private static int |
dispcol
|
(package private) int[][] |
documents
document data (word lists) documents[m][n] is the term index in the vocabulary for the n-th word of the m-th document |
private static int |
ITERATIONS
max iterations |
(package private) int |
K
number of topics |
(package private) LDAOptions |
LDAOptions
|
(package private) static java.text.NumberFormat |
lnf
|
(package private) int[][] |
nd
nd[i][j] number of words in document i assigned to topic j. |
(package private) int[] |
ndsum
ndsum[i] total number of words in document i. |
(package private) int |
numstats
size of statistics |
(package private) int[][] |
nw
nw[i][j] number of instances of term i assigned to topic j. |
(package private) int[] |
nwsum
nwsum[j] total number of words assigned to topic j. |
(package private) double[][] |
phisum
cumulative statistics of phi |
private static int |
SAMPLE_LAG
sample lag (if -1 only one sample taken) |
(package private) static java.lang.String[] |
shades
|
(package private) double[][] |
thetasum
cumulative statistics of theta |
private static int |
THIN_INTERVAL
sampling lag (?) |
(package private) int |
V
vocabulary size |
(package private) int[][] |
z
topic assignments for each word. |
| Constructor Summary | |
|---|---|
LdaGibbsSampler()
|
|
LdaGibbsSampler(int[][] documents,
int V)
Initialize the Gibbs sampler with data. |
|
LdaGibbsSampler(LDAOptions LDAOptions)
|
| Method Summary | |
|---|---|
void |
configure(int iterations,
int burnIn,
int thinInterval,
int sampleLag)
Configure the gibbs sampler |
void |
configure(LDAOptions LDAOptions)
|
double[][] |
getPhi()
Retrieve estimated topic--word associations. |
double[][] |
getTheta()
Retrieve estimated document--topic associations. |
void |
gibbs(int K,
double alpha,
double beta)
Main method: Select initial state ? Repeat a large number of times: 1. |
static double[] |
hist(double[] data,
int fmax)
Print table of multinomial data |
int[][] |
initialState(int K)
Initialization: Must start with an assignment of observations to topics ? Many alternatives are possible, I chose to perform random assignments with equal probabilities. |
static void |
main(java.lang.String[] args)
Driver with example data. |
void |
readCorpusFromDocTermCountArray(java.util.ArrayList<java.util.TreeMap<java.lang.Integer,java.lang.Integer>> docTermCountArray)
Load corpus and documents from a ArrayList<TreeMap<Integer, Integer>> instance. |
void |
readCorpusFromDocTermCountFile(java.lang.String docTermCountFilePath)
Load corpus and documents from a text file located at String docTermCountFilePath. |
void |
readCorpusFromLDAInputFile(java.lang.String LDAInputDataFilePath)
Load corpus and documents from a LDAInput file. |
void |
readCorpusFromMatrix(org.apache.commons.math.linear.RealMatrix X)
Load corpus and documents from a RealMatrix instance. |
void |
run()
|
static void |
run(Corpus corpus,
LDAOptions LDAOptions)
|
void |
run(LDAOptions LDAOptions)
|
private int |
sampleFullConditional(int m,
int n)
Sample a topic z_i from the full conditional distribution: p(z_i = j | z_-i, w) = (n_-i,j(w_i) + beta)/(n_-i,j(.) + W * beta) * (n_-i,j(d_i) + alpha)/(n_-i,.(d_i) + K * alpha) |
static java.lang.String |
shadeDouble(double d,
double max)
create a string representation whose gray value appears as an indicator of magnitude, cf. |
private void |
updateParams()
Add to the statistics the values of theta and phi for the current state. |
| Methods inherited from class java.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Field Detail |
|---|
Corpus corpus
LDAOptions LDAOptions
int[][] documents
int V
int K
double alpha
double beta
int[][] z
int[][] nw
int[][] nd
int[] nwsum
int[] ndsum
double[][] thetasum
double[][] phisum
int numstats
private static int THIN_INTERVAL
private static int BURN_IN
private static int ITERATIONS
private static int SAMPLE_LAG
private static int dispcol
static java.lang.String[] shades
static java.text.NumberFormat lnf
| Constructor Detail |
|---|
public LdaGibbsSampler(int[][] documents, int V)
documents
- a 2D integer array where documents[m][n] is
the term index in the vocabulary for the n-th
word of the m-th document. Indices always start
from 0.V
- vocabulary sizepublic LdaGibbsSampler(LDAOptions LDAOptions)
public LdaGibbsSampler()
| Method Detail |
|---|
public static void main(java.lang.String[] args)
args
- public void readCorpusFromDocTermCountArray(java.util.ArrayList<java.util.TreeMap<java.lang.Integer,java.lang.Integer>> docTermCountArray)
corpus
and documents
from a ArrayList<TreeMap<Integer, Integer>>
instance.
Each element of the ArrayList
is a doc-term count mapping.
docTermCountArray
- A ArrayList<TreeMap<Integer, Integer>>
instance,
each element of the ArrayList
records the doc-term
count mapping for the corresponding document.public void readCorpusFromLDAInputFile(java.lang.String LDAInputDataFilePath)
corpus
and documents
from a LDAInput file.
LDAInputDataFilePath
- The file path specifying the path of the LDAInput file.public void readCorpusFromDocTermCountFile(java.lang.String docTermCountFilePath)
corpus
and documents
from a text file located at String
docTermCountFilePath.
docTermCountFilePath
- A String
specifying the location of the text file holding doc-term-count matrix data.public void readCorpusFromMatrix(org.apache.commons.math.linear.RealMatrix X)
corpus
and documents
from a RealMatrix
instance.
X
- a matrix with each column being a term count vector for a document
with X(i, j) being the number of occurrence for the i-th vocabulary
term in the j-th documentpublic int[][] initialState(int K)
K
- number of topics
public void gibbs(int K, double alpha, double beta)
K
- number of topicsalpha
- symmetric prior parameter on document--topic associationsbeta
- symmetric prior parameter on topic--term associationsprivate int sampleFullConditional(int m, int n)
m
- documentn
- wordprivate void updateParams()
public double[][] getTheta()
public double[][] getPhi()
public static double[] hist(double[] data, int fmax)
data
- vector of evidencefmax
- max frequency in display
public void configure(int iterations, int burnIn, int thinInterval, int sampleLag)
iterations
- number of total iterationsburnIn
- number of burn-in iterationsthinInterval
- update statistics intervalsampleLag
- sample interval (-1 for just one sample at the end)public void configure(LDAOptions LDAOptions)
public void run()
public void run(LDAOptions LDAOptions)
public static void run(Corpus corpus, LDAOptions LDAOptions)
public static java.lang.String shadeDouble(double d, double max)
d
- valuemax
- maximum value
|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |


--- layout: page title: About header-img: "img/about-bg.png" ---
As titled this is a blog about my journey with software engineering with Flatiron School. I am excited to document my studies, and create a great career in tech.


NTP Reference Library
Maya
glyph alautun
Note: Source documents are not included in this distribution due to
their large size. PostScript and PowerPoint documents will be retrieved
automatically upon request from archive server ftp.udel.edu.
Briefing Slides
Background Description
The Network Time Protocol (NTP) is widely used in the Internet to synchronize
computer clocks to national standard time. The NTP architecture, protocol
and algorithms have evolved over almost two decades to the present NTP
Version 3 specification and implementations for Unix and Windows. The architecture
and security models provide for operation in point-to-point (unicast) and
point-to-multipoint (multicast), and include provisions for cryptographic
authentication. Previous funded research has resulted in a continuous series
of improvements in accuracy and reliability of the protocol and supporting
algorithms. Used in the Internet of today with computers ranging from personal
workstations to supercomputers, NTP provides accuracies generally in the
range of a millisecond or two in LANs and up to a few tens of milliseconds
in global WANs.
The current research effort represents a significant enhancement to
the existing protocol, architecture and algorithms of NTP Version 3 and
an evolutionary step to NTP Version 4. Specifically, these involve provisions
for an autonomous configuration capability and a revised security model
based on public key cryptography. Both of these enhancements are necessary
in order for large, diversified synchronization subnets to survive electronic
warfare attacks on the network routing functions or source selection and
clock discipline algorithms used by the time server and client population.
The design of robust protocols and algorithms which survive such attacks
presents a significant challenge, especially in networks with well over
100,000 servers, such as the existing Internet and fully operational DSI.
In order to provide specific accuracy and reliability requirements,
NTP presently requires configuration engineering specific to each time
server and client site. However, in a tactical network subject to damage
and repair, as well as a widely deployed real-time simulation network such
as the Defense Simulation Internet (DSI), manual configuration engineering
is not acceptable. Our research effort is designed to develop an autonomous
configuration capability using multicast methods to achieve diversity and
redundancy, as well as directory services and service location protocols
as available.
Our approach uses a set of distributed algorithms to provide a completely
automatic, dynamic server discovery and configuration capability as a generic
feature of the NTP architecture and protocol. The algorithms automatically
organize the synchronization subnets in response to server and network
outages or attacks on the security infrastructure. A distributed algorithm
under development operates on a ftp://ftp.udel.edu/pub/people/mills distributed
by the enhanced NTP protocol to select the best subnet topology, subject
to specified accuracy and reliability constraints. Another algorithm calculates
clock offsets between each pair of servers in the local neighborhood, then
distributes the data to all other servers. Other algorithms already implemented
filter and combine the data from all subnet members in the local neighborhood
to provide the best accuracy and reliability. None of these algorithms
require advance information of any kind, other than that collected in real
time by the enhanced NTP protocol.
A robust security model has long been an intrinsic feature in the current
and previous NTP versions. However, this model does not scale well to very
large networks which may fragment and reform frequently due to attack and
repair. The current model, which is based on private key cryptography with
predistributed keys, does not work well in multicasting modes and imposes
an excessive burden on the key management and distribution system in cases
where keys can be compromised and countermeasures are required. These problems
are exacerbated by the need to coordinate key management and time synchronization,
since each of these services depends on the other.
Our approach involves the use of public key cryptography and crafted
algorithms which provide reliable key distribution and management, while
avoiding excessive processing and memory resources. The algorithms use
shared keys for mutually redundant symmetric server modes ("creche" servers),
dynamically computed keys for traditional client/server modes, and backwards
computable hash functions for multicast modes. When necessary, private
data are exchanged using RSA encryption with certificates, but this is
done infrequently in a manner that does not affect the quality of synchronization.
We expect to make use of secure RPC services and secure DNS services as
they become available.
We expect to combine the algorithmic mechanisms for autonomous configuration
with traditional means involving multicast and directory services, as well
as service location protocols now under development by IETF task forces.
We expect also to incorporate the ongoing work of the IETF IPSEC community
as appropriate to the specific NTP protocol and security models. The combined
mechanisms are to be implemented as extensions to the existing NTP Version
3 protocol and implementation for Unix and Windows and made available to
the research community at large. We expect to deploy the new implementation
in the DARTnet research community for distributed testing with other DARTnet
applications, such as multimedia conferencing. Finally, we expect to develop
and publish a definitive protocol specification and vulnerability analysis.
Selected Publications
-
Mills, D.L., A. Thyagarajan and B.C. Huffman. Internet timekeeping around
the globe. Proc. Precision Time and Time Interval (PTTI) Applications
and Planning Meeting (Long Beach CA, December 1997). (PostScript),
(Slides:
PostScript).
-
Mills, D.L. A precision radio clock for WWV transmissions. Electrical Engineering
Report 97-8-1, University of Delaware, August 1997, 25 pp. (Abstract:
PostScript), (Body:
PostScript)
-
Mills, D.L. Clock discipline algorithms for the Network Time Protocol Version
4. Electrical Engineering Report 97-3-3, University of Delaware, March
1997, 35 pp. (Abstract:
PostScript), (Body:
PostScript).
-
Mills, D.L. Authentication scheme for distributed, ubiquitous, real-time
protocols. Proc. Advanced Telecommunications/Information Distribution
Research Program (ATIRP) Conference (College Park MD, January 1997),
293-298. (PostScript)
(Slides: PostScript)
-
Mills, D.L. The network computer as precision timekeeper. Proc. Precision
Time and Time Interval (PTTI) Applications and Planning Meeting (Reston
VA, December 1996), 96-108. (Body:
PostScript) (Slides:
PostScript).
-
Mills, D.L. Proposed authentication enhancements for the Network Time Protocol
version 4. Electrical Engineering Report 96-10-3, University of Delaware,
October 1996, 36 pp. (Abstract:
PostScript), (Body:
PostScript).
-
Mills, D.L. Simple network time protocol (SNTP) version 4 for IPv4, IPv6
and OSI. Network Working Group Report RFC-2030, University of Delaware,
October 1996, 18 pp. (ASCII)
. Major revision and update of: Ibid. Network Working Group
Report RFC-1769, University of Delaware, March 1995, 14 pp. (ASCII).
Also published (with figures) as Ibid Electrical Engineering Department
Report 96-10-2, University of Delaware, October 1996, 14 pp. (Abstract:
PostScript), (Body:
PostScript)
-
Mills, D.L. Improved algorithms for synchronizing computer network clocks.
IEEE/ACM Trans. Networks (June 1995), 245-254. (PostScript).
Revised from: ibid. Proc. ACM SIGCOMM 94 Symposium (London
UK, September 1994), 317-327. (PostScript).
-
Mills, D.L, and A. Thyagarajan. Network time protocol version 4 proposed
changes. Electrical Engineering Department Report 94-10-2, University of
Delaware, October 1994, 32 pp. (Abstract:
PostScript), (Body:
PostScript).
-
Mills, D.L. Unix kernel modifications for precision time synchronization.
Electrical Engineering Department Report 94-10-1, University of Delaware,
October 1994, 24 pp. (Abstract:
PostScript), (Body:
PostScript). Major revision and update of: Network Working Group Report
RFC-1589, University of Delaware, March 1994. 31 pp. (ASCII).
-
Mills, D.L. Precision synchronization of computer network clocks. ACM
Computer Communication Review 24, 2 (April 1994). 28-43. (PostScript).
Condensed from: Ibid. Electrical Engineering Department Report 93-11-1,
University of Delaware, November 1993, 66 pp. (Abstract:
PostScript), (Body:
PostScript).
-
Mills, D.L. Modelling and analysis of computer network clocks. Electrical
Engineering Department Report 92-5-2, University of Delaware, May 1992,
29 pp. (Abstract:
PostScript), (Body:
PostScript).
-
Mills, D.L. Network Time Protocol (Version 3) specification, implementation
and analysis. Network Working Group Report RFC-1305, University of Delaware,
March 1992, 113 pp. (Abstract:
PostScript), (Body:
PostScript), (Appendices:
PostScript). Revised from: Electrical Engineering Department Report
90-6-1, University of Delaware, June 1990. (Abstract:
PostScript), (Body:
PostScript), (Appendices:
PostScript).
-
Mills, D.L. On the chronology and metrology of computer network timescales
and their application to the Network Time Protocol. ACM Computer Communications
Review 21, 5 (October 1991), 8-17. (PostScript).
-
Mills, D.L. Internet time synchronization: the Network Time Protocol. IEEE
Trans. Communications COM-39, 10 (October 1991), 1482-1493. (PostScript).
Also in: Yang, Z., and T.A. Marsland (Eds.). Global States and Time
in Distributed Systems. IEEE Computer Society Press, Los Alamitos,
CA, 1994, 91-102. Condensed from: Ibid. Network Working Group Report
RFC-1129, University of Delaware, October 1989. (Abstract:
PostScript), (Body:
PostScript). Also published as: Electrical Engineering Department Report
89-9-1, University of Delaware, September 1989. (Abstract:
PostScript), (Body:
PostScript).
-
Mills, D.L. On the accuracy and stability of clocks synchronized by the
Network Time Protocol in the Internet system. ACM Computer Communication
Review 20, 1 (January 1990), 65-75. (PostScript).
-
Mills, D.L. Measured performance of the Network Time Protocol in the Internet
system. Network Working Group Report RFC-1128. University of Delaware,
October 1989. (Abstract:
PostScript), (Body:
PostScript). Also published as: Electrical Engineering Department Report
89-9-3, University of Delaware, September 1989. (Abstract:
PostScript), (Body:
PostScript).
David L. Mills (mills@udel.edu)