util package¶
Submodules¶
util.aws module¶
AWS Wrapper Module
- This module contains wrapper classes for AWS Services. This includes:
- EC2
- AutoScaling
- SES
- TrustedAdvisor
- DynamoDB
-
util.aws.
LOW_USE_CHECK_ID
¶ Unique str indentifier for Low Use Check in Trusted Advisor.
Type: str
-
util.aws.
SES_EMAIL
¶ SES Email used to send Low Use reports from.
Type: str
-
util.aws.
ADMIN_EMAIL
¶ Admin email account that will receive the admin reports.
Type: str
-
class
util.aws.
ASGWrapper
(session)¶ Bases:
object
Wrapper for AWS ASG
-
session
¶ Boto3 Session object with AWS
Type: obj
-
asg
¶ Boto3 ASG Client object to directly interface with AWS ASG
Type: obj
Tag Autoscaling group and it’s EC2 instances
Parameters: Tags – ( list
ofdict
): List of tags to tag ASG and EC2Returns: Response from AWS EC2 CreateTags API Call Return type: dict
-
get_asg_instance_ids
(asg_name)¶ Get the instance_ids of instances belonging to an ASG
Parameters: asg_name (str) – Name of an ASG Returns: List of ids of instances in the ASG Return type: [str]
-
get_asg_user_tag_by_instance_id
(instance_ids)¶ Get the name of the ASG for these instances
This is done to ensure that the owner of the ASG is accurated tagged as the owner of the instances belonging to the ASG
Parameters: instance_ids ([str]) – List of instance_ids that belong to the same ASG Returns: The ASG Name associated with these instances Return type: str
-
-
class
util.aws.
DynamoWrapper
(session)¶ Bases:
object
Handler for dynamodb data
-
session
¶ Boto3 AWS Session Object
Type: obj
-
dynamo
¶ Boto3 AWS Dynamo Resource Object
Type: obj
-
low_use
¶ Boto3 AWS Dynamo Table Object
Type: obj
-
whitelist
¶ Boto3 AWS Dynamo Table Object
Type: obj
-
add_to_low_use
(instance_id, creator)¶ Adds an instance to the low use list
Parameters: - instance_id (str) – ID of EC2 Instance
- creator (str) – Creator email of Instance
Returns: Response from AWS DynamoDB PutItem API Call
Return type: dict
-
add_to_whitelist
(instance_id, creator, reason)¶ Adds an instance to the whitelist
Parameters: - instance_id (str) – ID of EC2 Instance
- creator (str) – Creator email of Instance
- reason (str) – Reason for Whitelisting
Returns: Response from AWS DynamoDB PutItem API Call
Return type: dict
-
batch_delete_item_from_low_use
(instance_ids)¶ Removes multiple instances from the low use list
Parameters: instance_ids ( list
ofstr
) – IDs of EC2 Instance
-
delete_from_low_use
(instance_id)¶ Removes an instance from the low use list
Parameters: instance_id (str) – ID of EC2 Instance Returns: Response from AWS DynamoDB DeleteItem API Call Return type: dict
-
get_low_use_instance
(instance_id)¶ Fetch Instance from low use table.
Parameters: instance_id (str) – ID of EC2 Instance Returns: DynamoDB item from LowUse table. None if item does not exist Return type: dict
-
get_whitelist_instance
(instance_id)¶ Fetch Instance from whitelist table.
Parameters: instance_id (str) – ID of EC2 Instance Returns: DynamoDB item from Whitelist table. None if item does not exist Return type: dict
-
is_low_use
(instance_id)¶ Checks if an instance is flagged as low use in Dynamo
Parameters: instance_id (str) – ID of EC2 Instance Returns: True if instance is low use, false otherwise Return type: bool
-
is_scheduled_for_deletion
(instance_id)¶ Checks if an instance is scheduled for deletion in Dynamo
Parameters: instance_id (str) – ID of EC2 Instance Returns: True if instance is scheduled for deletion, false otherwise Return type: bool
-
is_whitelisted
(instance_id)¶ Checks if an instance is whitelisted in Dynamo
Parameters: instance_id (str) – ID of EC2 Instance Returns: True if instance is whitelisted, false otherwise Return type: bool
-
schedule_for_deletion
(instance_id, creator)¶ Adds an instance to the low use list and labels it as scheduled for deletion
Parameters: - instance_id (str) – ID of EC2 Instance
- creator (str) – Creator email of Instance
Returns: Response from AWS DynamoDB PutItem API Call
Return type: dict
-
-
class
util.aws.
EC2Wrapper
(session)¶ Bases:
object
Wrapper for AWS EC2
-
session
¶ Boto3 Session object with AWS
Type: obj
-
ec2
¶ Boto3 EC2 Client object to directly interface with AWS EC2
Type: obj
Tags resources
Parameters: - Resources (
list
ofstr
) – List of Resource Ids - Tags (
list
ofdict
) – List of Key/Value pairs for Tags
Returns: response from AWS CreateTags API Call
Return type: dict
- Resources (
-
get_creator_for_instance
(instance_id)¶ Get the Creator tag value from instance
Parameters: instance_id (str) – ID of the Instance Returns: Creator of EC2 instance (Unknown if Creator tag does not exist) Return type: str
-
get_tag_for_instance
(instance_id, tag_key)¶ Get the specific tag value from instance
Parameters: - instance_id (str) – ID of the Instance
- tag_key (str) – key of the desired tag
Returns: Value of desired tag of EC2 instance (None if tag does not exist)
Return type: str
Get all tags from instance
Parameters: instance_id (str) – ID of the Instance Returns: all tags of EC2 instance (empty list if no tags exist) Return type: list
-
get_whitelist_reason_for_instance
(instance_id)¶ Get the Reason tag value from instance
Parameters: instance_id (str) – ID of the Instance Returns: Reason for whitelisting the EC2 instance (None if Reason tag does not exist) Return type: str
-
is_low_use
(instance_id)¶ Check if Instance is low use
Parameters: instance_id (str) – ID of the Instance Returns: True if low use, false otherwise Return type: bool
-
is_scheduled_for_deletion
(instance_id)¶ Check if Instance is scheduled for deletion
Parameters: instance_id (str) – ID of the Instance Returns: True if scheduled for deletion, false otherwise Return type: bool
-
is_tagged
(instance_id, tag_name)¶ Check if Instance is tagged with a specific key
Parameters: instance_id (str) – ID of the Instance Returns: True if tagged, false otherwise Return type: bool
-
is_whitelisted
(instance_id)¶ Check if Instance is whitelisted
Parameters: instance_id (str) – ID of the Instance Returns: True if whitelisted, false otherwise Return type: bool
-
stop_instances
(instance_ids)¶ Stops instance
Parameters: instance_id (str) – ID of the Instance Returns: Response from AWS StopInstances API call. Return type: dict
-
tag_as_low_use
(instance_id)¶ Tag instance as Low Use
Parameters: instance_id (str) – ID of the Instance Returns: response from AWS CreateTags API Call Return type: dict
-
tag_as_whitelisted
(instance_id)¶ Tag instance as Whitelisted
Parameters: instance_id (str) – ID of the Instance Returns: response from AWS CreateTags API Call Return type: dict
-
tag_for_deletion
(instance_id)¶ Tag instance as Scheduled for Deletion
Parameters: instance_id (str) – ID of the Instance Returns: response from AWS CreateTags API Call Return type: dict
-
tag_instance
(instance_id, tag_key, tag_value)¶ Tag instance
Parameters: - instance_id (str) – ID of the Instance
- tag_key (str) – Key for the tag
- tag_value (str) – value for the tag
Returns: response from AWS CreateTags API Call
Return type: dict
-
tag_whitelist_reason
(instance_id, reason)¶ Tag instance with Whitelist Reason
Parameters: - instance_id (str) – ID of the Instance
- reason (str) – Reason for whitelisting, tag value
Returns: response from AWS CreateTags API Call
Return type: dict
-
-
class
util.aws.
EmailDynamoWrapper
(session)¶ Bases:
util.aws.DynamoWrapper
Extends the DynamoWrapper to handle email queries
We want to get instances where EmailSet is set to False for LowUse table and whitelisted table
-
type_map
¶ dict that determines which DynamoDB table to use based off of the instance state (Low Use or Whitelisted)
Type: dict
-
get_low_use_instances
()¶ Fetch instances from whitelist table
Returns: Response from the AWS DynamoDB BatchGetItem API Call Return type: dict
-
get_whitelist_instances
()¶ Fetch Instances from whitelist table.
Returns: Response from the AWS DynamoDB BatchGetItem API Call Return type: dict
-
set_email_sent
(instance_id, creator, type)¶ Set EmailSent key value to True after email is sent.
Parameters: - instance_id (str) – ID of EC2 Instance
- creator (str) – Creator email of Instance
- type – (str): Whether or not an instance was whitelisted or low use
Returns: Response from the AWS DyanmoDB PutItem API Call
Return type: dict
-
-
class
util.aws.
SESWrapper
(session)¶ Bases:
object
Wrapper for AWS SES
-
session
¶ Boto3 Session object
Type: obj
-
ses
¶ Boto3 SES Client
Type: obj
-
low_use_template_name
¶ Name of SES Template to use in the Low Use Report
Type: str
-
admin_template_name
¶ Name of SES Template to use in the Admin Report
Type: str
-
get_low_use_template_data
(creator, low_use_instances, instances_scheduled_for_deletion)¶ Creates the templated data to send via SES
Parameters: - creator (str) – Person receiving email
- low_use_instances (
list
ofdict
) – Has all low use instances and associated metadata - instances_scheduled_for_deletion (
list
ofdict
) – Has all scheduled for deletion instances and associated metadata
Returns: Template data to use in SES Email
Return type: dict
-
send_admin_report
(low_use_instances, instances_scheduled_for_deletion)¶ Sends the admin report
Parameters: - low_use_instances (
list
ofdict
) – Has all low use instances and associated metadata - instances_scheduled_for_deletion (
list
ofdict
) – Has all scheduled for deletion instances and associated metadata
Returns: Response from AWS SES SendTemplatedEmail API Call
Return type: dict
- low_use_instances (
-
send_low_use_email
(creator, low_use_instances, instances_scheduled_for_deletion, TemplateName=None)¶ Sends the low use report
Parameters: - creator (str, optional) – Email of the instances owner. If not given, will send to Admin
- low_use_instances (
list
ofdict
) – Has all low use instances and associated metadata - instances_scheduled_for_deletion (
list
ofdict
) – Has all scheduled for deletion instances and associated metadata - TemplateName (str, optional) – SES template to use, must be created in your AWS Account. If none specified, will use Low Use template.
Returns: Response from AWS SES SendTemplatedEmail API Call
Return type: dict
-
-
class
util.aws.
TrustedAdvisor
¶ Bases:
object
Wrapper for AWS ASG
-
support
¶ Boto3 Support Client object to directly interface with AWS TrustedAdvisor
Type: obj
-
get_low_use_instances
()¶ Get low use instances
Returns: List of instances flagged as low use by TrustedAdvisor Return type: list
ofdict
-
get_low_use_summary
()¶ Get low use report
Returns: Trusted Advisor Low Use Report, None if no report was pulled Return type: dict
-


This was a real milestone for the website.
Nice nice.
Your browser does not support the audio element.


Road Warriors
About
Brands
Contact Us
Bike's Around the World
Bringing Couples Together
Bikes of the Future
One Last Ride
The Cavemen Rode
Hit the Rode
The Night Man
Quick Links
Gallery
Twisty Rodes
Hangouts
New Products
Feast of Fools
Help Wanted
Crazy Corner
Real Warriors
Strechy Pants
Aerosmith Rules
BMX or Harley
Indian Adventures
Fresh and Fast
Gone in 60sec
Blacktop Twister
My Garage
Spotlights
Garage Time
The V-Twin
Old School
Parts Hanger
Captain America
Accessories
Hold my Cup
Flaming Hot


On an unseasonably warm January night some 30 years ago, Etta Alexander returned to her mobile home after her shift at the A & B Cafe in downtown Winchester, Indiana. A light snow was falling when two men, carrying out a $4,000 murder-for-hire plot, entered Alexander’s trailer. Alexander was shot and killed, her home doused with kerosene and then set on fire.
Today, one of the men convicted in the plot, Jason Buie, works as a part-time contract faculty member in Ball State’s computer science department. He maintained his innocence throughout the trial and continues to do so today.
Although criminal records like this raise questions for university hiring managers and human resources personnel, policies and procedures at Ball State and other Indiana universities contend that a criminal conviction cannot immediately disqualify a job candidate.
While some experts say there is no crime too great to disqualify someone from working at a university, others would say hiring officials would be better off excluding those with a violent past. However, in Indiana little guidance is given about what to consider when hiring an ex-convict.
Additionally, federal law states employers cannot exclude job applicants with a criminal past simply because of their convictions.
This complex situation raises some questions: if there is a line in the sand, what is it? What responsibilities do hiring managers have to students, employees and the applicant? What crimes are too great to disqualify someone from employment at a university?
The Crime
Detective and volunteer firefighter Jay Harris was attending a going-away party for his fire chief on the night of Jan. 25, 1990, when he got called out on a house fire.
When Harris arrived at Alexander’s mobile home, he and his fellow firefighters found a trailer engulfed in flames. When they finally put out the fire they found Alexander’s charred body inside.
The fire was originally thought to be an accident caused by a kerosene heater until an autopsy was performed on the body the following day.
“We went in and the sheriff said, ‘We got a little problem with the fire last night,’” Harris said in an interview with The Daily News. “I said, ‘What’s that?’ and he said, ‘That body has a buckshot [sic] in it.’”
That discovery launched a months-long investigation into the murder, which ultimately landed three people in jail — and on death row for a time.
Reagan Allen, DN File
The story didn’t begin on the day of the murder, though. In the weeks leading up to the crime, Scott McCord, a then 42-year-old Muncie business owner, told several people he wanted someone killed and said he was willing to pay $4,000 for the act.
McCord originally asked then 17-year-old John Sheets, an acquaintance, to kill one of his employees, according to a written statement by Sheets’ friend Val Haase. Haase wrote that McCord later asked then 18-year-old Jason Buie to commit the murder. Haase said Buie was “fascinated by the idea.”
McCord allegedly told Buie he wanted the “b***h dead” and to “make it look like an accident,” according to Sheets’ written statement. The year before Alexander was murdered, McCord took out a $50,000 life insurance policy on her and made his then girlfriend, Pam Resler, the beneficiary, according to court documents. Resler later told police she was unaware of the policy.
On the night of Jan. 25, 1990, Buie and Sheets met with McCord in his Muncie home where Buie told McCord “he was going to do it,” according to Sheets’ statement. Buie requested a gun from McCord who then gave him a 12-gauge shotgun, according to court documents.
When the pair arrived at Alexander’s trailer, Buie and Sheets went up to the door and asked about a camper which Alexander’s roommate was trying to sell.
Sheets told police he was going to leave his name and phone number because Alexander’s roommate was not home at the time. Buie said he needed to get a pen and paper from the car.
Buie then went to the car, brought the shotgun into the mobile home and shot Alexander twice, according to Sheets’ statement. Alexander was shot once in the shoulder and once in her abdomen, according to the autopsy report.
Sheets originally told police during a psychological stress test that Buie went in the trailer and killed Alexander. Later Sheets admitted to police he went in the trailer with Buie. Buie has contradicted Sheets’s account.
Randolph County Courts, Documents Provided; Emily Wright, DN Photo Illustration
“I just stood there in a daze, so he grabbed a blanket off the bed and through [sic] it on her and he started yelling more,” Sheets wrote in his statement.
Buie then told Sheets to burn Alexander’s body and threatened to kill him if he didn’t, according to Sheets’ statement. After Buie threw a blanket over Alexander’s body, Sheets lit it on fire.
Sheets and Buie then got in the car where Buie told Sheets that if he ever said anything, he would “f*****g kill” him, according to Sheets’ statement.
Sheets later told police he and Buie then went to McCord’s house where Buie said “it’s done.”
A few months later, tips led police to arrest Buie, Sheets and McCord for what police described as “a murder for pay.”
The Courts
During police interviews, Buie said Sheets was the one who had shot and killed Alexander. Buie’s lawyers claimed he just witnessed Alexander’s murder, and Buie maintained his innocence throughout the process.
“When he [the voice stress analyst] asked Buie if he shot her, the voice stress analysis guy said [Buie] was not being truthful,” Harris said. “And when Sheets said he did not shoot her, he was being truthful, is what the voice stress analysis guy told us.”
Charges were filed against Buie, Sheets and McCord in Randolph County. The prosecutor initially requested the death penalty for all three, but that request was later dropped due to the estimated $6 million expense for that type of trial.
Buie was charged with murder, conspiracy to commit murder and arson. According to the Indiana Criminal Code, a conspiracy to commit murder charge becomes a Level 1 felony if the conspiracy results in the death of another person, which in this case, it did.
The Palladium Item, Photo Provided
Kelly Bryan, Buie’s co-defense counsel, said in court Buie believed he was going to do a burglary. Buie had no knowledge of the gun in the car, Bryan said, or that Sheets intended to kill Alexander.
Buie’s first trial resulted in a hung jury and a mistrial was declared on March 13, 1991. Buie was tried again, and on Aug. 28, 1991, was convicted in Randolph Circuit Court of murder, conspiracy to commit murder and arson. On Sept. 25, 1991, Judge Zane Stohler sentenced Buie to 100 years in prison — 60 for murder, 20 for conspiracy to commit murder and 20 for arson. However, Buie appealed the convictions, and the case went directly to the Indiana Supreme Court in February 1992.
Even though the court said the prosecution proved the murder case against Buie, the justices ruled because of the double-jeopardy clause in the Fifth Amendment of the U.S. Constitution, which says a person cannot be tried twice for the same crime, Buie could not face both the murder and the conspiracy to commit murder charges simultaneously.
“It is apparent that to obtain Buie's conviction for conspiracy to commit murder, the State proved that Buie intentionally killed Etta Alexander,” the Court wrote in its opinion.
Two years after his original conviction, Buie’s murder conviction was reversed. His convictions of conspiracy to commit murder and arson were upheld. He was sentenced to 40 years in prison, but was released on Feb. 7, 2006, after he served nearly 15 years of his original sentence. While Buie served time for Level 1 and 2 felonies, his eventual career as an academic was not lost.
Looking back, Buie said in an interview with The Daily News that he feels he played some role in Alexander’s death.
“It definitely makes me feel sad and remorseful. You know, there’s not a day that goes by that I don’t wish that that could be changed, but the reality is that it can’t,” Buie said. “I mean, I didn’t pull the trigger, but I was there. So I bear a great deal of responsibility about it.”
Sheets was the only one who did not face a murder charge — he pleaded guilty to assisting a criminal. McCord was convicted of murder and conspiracy to commit murder.
Life after Prison
While incarcerated, Buie said he obtained two associates degrees — one from Ball State in 2000 and another from Indiana University in 2005. He obtained his bachelor’s degree from Ball State in May 2005.
Upon his release, he obtained a master's in information and communication sciences from Ball State in 2007, and a master's in computer science again from Ball State in 2016, according to his online Ball State profile.
Buie’s curriculum vitae (CV) states that he has had nine different jobs since being released from prison. In January of 2013, Buie was hired by Ball State as an instructor of computer science after completing a graduate assistantship with the university.
“He was a graduate student just like anybody else,” said Paul Buis, the chairperson of the department of computer science. “He had been doing a great job, got great reviews from the students. He was being monitored in the classroom and was doing a fantastic job, so we hired him.”
Buie is now pursuing a doctorate in education technology at Ball State.
“That was a lot of the motivation for me to get a Ph.D. because I felt like it was going to offset my past,” Buie said. “Then I realized it doesn’t matter if you have 10 Ph.D.s, people are either going to accept you or they’re not.”
Brynn Mechem, DN
Buis said he was aware of Buie’s past before hiring him, having read about Buie’s criminal history in the newspaper. After talking to him, Buis decided that Buie had moved past his history.
Because Buie was being brought in as a part-time instructor, a search committee was not required in order to hire him — the decision instead fell on Buis. Before extending an offer, given Buie’s past, Buis said he sought counsel from other faculty members and collected character references on Buie, per the university administration's request.
In order to not extend an offer to Buie, Buis said he would have to “discriminate against criminals, which I obviously don’t.”
“I think it’s reasonable to worry about — certainly recent offenses — that involve violence or sexual abuse issues,” Buis said. “Especially if the faculty member is going to be teaching minors, but we don’t do that here, on a university level.”
Buis said he hired Buie because “he, himself, committed no violent acts during the burglary."
“His partner, while they weren’t together, did something while they were breaking into a house,” Buis said. “Who pulled the trigger was not an undisputed fact ...  Simply participating in a felony in which someone is murdered might get you [in prison].”
While Buie previously taught on campus, he currently teaches four online classes at the university.
The Ball State Hiring Process
In order for a faculty or staff member to be hired by the university, they must go through several steps. For a person to become an instructor or professor, the process includes even more steps.
Background Checks
After a candidate is chosen, but before becoming officially employed, one must undergo a background check, which the university began conducting in 2011 — before Buie was hired. While the university would not specify how much or what type of background checks prospective employees undergo, state background checks can cost anywhere from $7 to $17, according to the Indiana Department of Insurance, and federal background checks cost $18, according to the Federal Bureau of Investigation.
Gracie Reiff, the Ball State compensation and human resources information manager, said this means the candidate has to have a “clear background check” with no “inappropriate convictions” in order to be hired. However, the background check only dates back seven years.
If employees do not work with minors and were hired prior to 2011, they did not and will not have a background check conducted.
When hiring a person with a criminal background, the hiring bodies must be able to answer 12 questions to ensure that the candidate is appropriate to work at the university. These questions include, but are not limited to:
- The nature and seriousness of the offense or conduct.
- The time elapsed since the conviction and/or completion of the sentence.
- The nature of the job sought.
- The number of offenses for which the individual was convicted.
University spokesperson Kathy Wolf said the university has a responsibility to follow “appropriate hiring procedures” and fully consider “all relevant information” about a potential candidate before extending an offer.
Is there a felony too great?
“If I see a conviction on somebody’s record, we look to see what’s the time frame, is this something that happened 30 years ago or something recent,” said Kate Stoss, Ball State director of university human resource services. “If somebody was convicted of a felony assault within the past two years, obviously that’s going to raise some red flags.”
A job applicant has no responsibility to disclose their criminal past on a Ball State application, Reiff said, and there is no crime that will automatically disqualify an applicant from a job at the university.
“It’s case-by-case. We look at each individual case,” Reiff said.
Catherine Mattice Zundel, a human resources professional who owns Civility Partners out of La Mesa, California, focuses on helping companies build better hiring cultures.
“These days we’re trying to create a more inclusive work environment, and that means accepting people for who they are ... even if they’ve made bad choices in the past,” Zundel said. “I think it’s important to make better, more positive, more inclusive, work environments. So including people who have criminal records is important to that process. The problem is, it can be hard to trust someone if they’ve done things in the past.”
Ex-convicts are often perceived as being a danger to others, but some research has shown the exact opposite. A study published in the Washington Post focused on how former felons perform in the military.
“Overall termination rates for negative reasons like misconduct or poor performance, with a couple of exceptions, were no higher for enlistees with criminal histories than they were for those without a criminal record,” the article said.
Ball State human resources officials and Zundel agree that there aren’t hard lines as to which felonies would be too great to disqualify somebody from a job. Instead, they suggested that hiring employees with criminal backgrounds depends on if the crime committed pertains to the job for which the employee is being considered.
“If I’m looking to hire someone and they had a DUI 15 years ago, who cares? But if I’m looking to hire somebody to do driving for my company and they had a DUI a year ago, that’s going to make me uncomfortable,” Zundel said. “I don’t know that you could really say, ‘These levels of felonies we are OK with and these we aren’t.’ It’s going to be more focused on, and in fact the law requires, that you can’t discriminate [against] somebody based on their background unless it’s related to your business.”
Other Universities
The U.S. Equal Employment Opportunity Commission determined certain factors for employers to consider when a potential employee has a criminal history. Those factors are in line with Ball State’s follow-up questions for applicants with criminal backgrounds.
“The commission continues to hold that, where there is evidence of adverse impact, an absolute bar to employment based on the mere fact that an individual has a conviction record is unlawful under the Title VII,” the commission's policy states.
Ball State Human Resources assesses each new potential hire with a criminal background with little legislative guidance aside from what’s laid out in its internal policies, which are not accessible to the public.
At other schools in Indiana, procedures for hiring new faculty with felonies on their criminal records are similarly vague. Because no such state or federal guidelines exist, schools don’t have to adhere to any specific procedures when hiring new faculty or staff with criminal records.
Still, background checks are seemingly universal at colleges and universities across the state.
Andy Brantley, president and CEO of the College and University Professional Association for Human Resources, said every college and university should have a required background check policy that applies to every new employee, including those in temporary positions.
“This is an essential risk management practice that should be used by every employer across the country,” Brantley said in an email to The Daily News. “The policy should also clearly state that disclosure of a conviction during the selection process will not necessarily exclude an applicant from consideration.”
Regardless, the existence of a conviction does not automatically disqualify an individual from employment at the universities analyzed by The Daily News. The decision to reject or separate an individual with an unreported conviction is solely at the discretion of the universities.
Buie did disclose his conviction to the university, but he says because people know, he is still unsure about his opportunities to move up within the university.
“I’ve never put in for any kind of promotions or anything because of that. Maybe I’m right, and maybe I’m not, who knows,” Buie said. “I always wonder if something happens, that’s my first thing I think — it’s because of [my past].”
At Indiana and Purdue Universities, pre-disclosing criminal convictions before a criminal background check is conducted is required. According to the universities’ hiring policies, unreported convictions that are revealed in the criminal history check could result in a withdrawal of the offer of employment unless the individual shows that the report is in error.
Indiana State University and Ivy Tech Community College also require potential new hires to pre-disclose prior convictions under the same conditions. Ball State does not require such pre-disclosures.
If the criminal history check reveals convictions which the individual disclosed in the application, the campus human resource office will review the report with the hiring department. Human resources personnel have liberties when weighing the considerations surrounding each potential new hires’ background check.
Ivy Tech’s hiring policy, for example, states that relevant considerations may include “the nature and number of the convictions, their dates, and the relationship that a conviction has to the duties and responsibilities of the position.” Similar considerations are listed in policies by other colleges and universities in Indiana.
Hiring policies at the University of Notre Dame, a private institution, differ slightly from public higher ed institutions. That university conducts background checks that emphasize criminal convictions in the past seven years, as well as pending felony charges, sex or violent offender listings and criminal convictions involving violence or sexual misconduct at any time in the potential new hires’ record.
Pre-disclosure of criminal convictions are not required by Notre Dame, and candidates are given seven days to respond to human resources with information showing that the data should not disqualify them from being hired. That information is taken into consideration by human resources personnel to deem if the candidate is still eligible for hire.
Is perception reality?
Despite all the legal ambiguity surrounding employment, some say ex-convicts can’t erase their pasts when it comes to their futures.
Harris, the original investigator on the murder case, said that if Buie has done his time, he has gone through the system — and in the eyes of the law — is rehabilitated. Though, he said, there are still always some uncertainties.
“I really don’t have an opinion one way or another,” Harris said. “But, you never know when one’s going to slip. I might not want my grandchildren to be taught by him.”
And for one Ball State student, who requested their name be withheld, the line is very clear.
“Knowing this information angers me,” the student said. “It lowers my confidence in the way that BSU hires professors. I expect my professors to be morally sound and not murderers.
“I think BSU should do thorough background checks. If something comes up on a background check that severe [murder], they should not be considered a candidate. If BSU is not drawing the line at murder, where are they drawing it?”
Buie said he understands people’s apprehensions when they learn about his past, but after getting to know him, they learn that he’s a different person. And he thinks the person he is now should have a chance.
“What do [people] want me to do, work at McDonald’s? I’ll be the best McDonald’s worker there ever was. That’s not going to benefit a lot of other people,” Buie said. “The amount of people with criminal pasts is large. It’s a significant portion of the population, and if you try to exclude people based on that, you’re excluding a lot of people. A) it could potentially benefit them [ex-convicts] and B) it could potentially benefit other people.”
Contact Brynn Mechem with comments at<EMAIL_ADDRESS>or on Twitter at @BrynnMechem. Contact Max Lewis with comments at<EMAIL_ADDRESS>or on Twitter at @MaxLewisReports.


BariChai.com
Home
Contact Us
About
Sign Up
Login
+029333838
+029333839
+029333840
<EMAIL_ADDRESS><EMAIL_ADDRESS>@gmail.com
To support us please Contact


Reset client
Login with token
Token1 (read access)
Token2 (read and write access)
Token3 (invalid)
Connect
Messages
Add message
Add


A simple solution to complex tasks is coming soon
Say goodbye to inefficient juggling of multiple apps, teams, and projects. Officelite is the new collaboration platform built with an intuitive interface to improve productivity.
Basic
Free
Up to 5 users for free
- Basic document collaboration
- 2 GB storage
- Great security and support
Pro
$9.99
Per user, billed monthly
- All essential integrations
- 50 GB storage
- More control and insights
Ultimate
$19.99
Per user, billed monthly
- Robust work management
- 100 GB storage
- VIP support


Programming Languages: Java
PC Hardware: Building, Troubleshooting, Networking
Human Languages: English and Korean
High School
I went to a small high school in Kansas with a graduating class of 200 called Lansing High School.  UIUC was my first exposure to Computer Science.
I also did some independent study at Kansas City Kansas Community College where I took a course on IT and Networking Essentials.
University
I'm currently an undergraduate student at the University of Illinois in Urbana-Champaign where I am pursuing a Bachelor's of Science of Computer Science.
• Video games (League of Legends, osu!, Overwatch, Skyrim, and many others)
• Muay Thai
• Playing the guitar
• Watching Korean Dramas/Variety shows
• Spending time with close family and friends
• Reading books
• Trying to figure out how programming works


{{ cookiecutter.project_name }}
A trustworthy operations workflow.
About
This package implements a trustworthy operations workflow that comprises the following steps:
-
{%- for item in cookiecutter.workflow_steps.replace(' ','').split(',') | reject('eq','...') %}
- Step {{ item }}: … {%- endfor %}
The workflow itself is defined and implemented via the Snakemake workflow management system. Snakemake uses the conda package management system to handle all software dependencies and manage execution environments for all individual steps. This package provides additional command line scripts to run the workflow, such as storing and retrieving IT credentials (mail account, SOAP API, etc.) or running the workflow periodically. Furthermore, this package aims at implementing a reasonably secure and trustworthy workflow.
Installation
A secure and trustworthy operations workflow requires a reasonable setup on the host machine.
Therefore, before installing the {{ cookiecutter.project_slug }}
package, make sure that best practices regarding adminstration, user management and security measures are met on the host machine (see also the platform-specific notes further down below).
After the generation of the workflow from the template, installation of this package and its dependencies is handled via conda. Consult the official conda installation instructions to get started with conda.
Create a conda environment for the project and install all dependencies (the command prompt must be in the {{ cookiecutter.project_slug }}
project root folder):
conda env create -f environment.yml
Activate the environment:
conda activate {{ cookiecutter.project_slug }}
Usage
Development / deployment process
In the following, the steps of the intended development / deployment process are explained:
- Develop software for individual workflow steps
- review software that does not come from trusted sources, to check if it is trustworthy
- Freeze development
- a file digest is created for relevant files, storing a unique hash (SHA256) based on the file content the file digest is encrypted and protected with a user-defined password
- see command
{{ cookiecutter.project_slug }}_freeze
- Store confidential data
- the credentials cache is encrypted and protected with user-defined password
- needs to be the same password as used for the file digest
- see command
{{ cookiecutter.project_slug }}_pwd
- Run the workflow
- user provides password for file digest and credentials cache (only at the start when running the workflow periodically)
- execution is stopped in case the files have been altered w.r.t. the file digest
- see commands
{{ cookiecutter.project_slug }}_create_envs
,{{ cookiecutter.project_slug }}_runonce
and{{ cookiecutter.project_slug }}_loop
Workflow definition and configuration
The workflow is specified in the Snakefile, which can be found in subfolder workflow
.
All steps of the workflow are defined as individual Snakemake rules.
Each rule executes a Python script (scripts are located in subfolder workflow/scripts
) in its own conda environment (environment definition files are located in workflow/envs
).
The workflow uses a configuration file, which by default is workflow/config.json
.
The configuration file may contain arbitrary data for configuring the individual workflow steps, but must also contain the following entries:
- target: define the final target of the workflow; uses wildcard run_id (string)
- runidformat: define format string for creating a run-specific ID for each workflow execution based on a datetime code (string)
- credentials: list of sitenames for which credentials should be stored by the credentials cache (list of string)
- num_cores: number of cores to be used (integer)
Using confidential data in the workflow
For passing confidential data to the scripts executed in the individual steps, the credentials cache can be used.
IT credentials should be passed to the scripts as parameters (Snakemake keyword params
) in the Snakefile
.
The cache's retrieve
method returns the username and password for stored sites as tuple.
For example:
rule step1:
output:
'data/step1/{run_id}_step1.out'
params:
user = credentials_cache.retrieve( 'https://zenodo.org/' )[0],
pwd = credentials_cache.retrieve( 'https://zenodo.org/' )[1],
conda:
'envs/step1.yml'
script:
'scripts/step1.py'
Running the default workflow
The following describes how to run the standard configuration of the workflow manually, according to the deployment process described above. For automating the workflow, also refer to the instructions further down below.
It is assumed that the {{ cookiecutter.project_slug }}
project root folder is used as working directory.
In case another folder is used as working directory, the (absolute or relative) path to the {{ cookiecutter.project_slug }}
project root folder needs to be given as input argument to all commands.
After installation, freeze the workflow in order to mark the current state as trustworthy. When prompted, supply a user-defined passphrase:
{{ cookiecutter.project_slug }}_freeze
Next, provide the required IT credentials for the workflow. When prompted, use the same passphrase as used for freezing the workflow, then enter username and password for all sites:
{{ cookiecutter.project_slug }}_pwd
Build the conda environments for executing the individual workflow steps. During the download and installation of these environments, you may be prompted to provide IT credentials (e.g., username / password for accessing a repository):
{{ cookiecutter.project_slug }}_create_envs
To run the whole workflow once, use the following command. When prompted, provide the previously used passphrase:
{{ cookiecutter.project_slug }}_runonce
To run the whole workflow periodically (by default once a day), use the following command. Before the workflow is run for the first time, you will be prompted to provide the previously used passphrase:
{{ cookiecutter.project_slug }}_loop
Reference for command line scripts
{{ cookiecutter.project_slug }}_freeze
Freezes the workflow:
{{ cookiecutter.project_slug }}_freeze [-h] [-v] [{{ cookiecutter.project_slug | upper }}_DIR]
Positional arguments:
- {{ cookiecutter.project_slug | upper }}_DIR: path to
{{ cookiecutter.project_slug }}
project root directory
Optional arguments:
- -h, --help: show help message and exit
- -v, --verbose: output additional information
{{ cookiecutter.project_slug }}_pwd
Store credentials for workflow:
{{ cookiecutter.project_slug }}_pwd [-h] [-v] [-n] [--no-freeze] [{{ cookiecutter.project_slug | upper }}_DIR]
Positional arguments:
- {{ cookiecutter.project_slug | upper }}_DIR: path to
{{ cookiecutter.project_slug }}
project root directory
Optional arguments:
- -h, --help: show help message and exit
- -v, --verbose: output additional information
- -n, --new-cache: create a new credentials cache
- --no-freeze: do not check if workflow has been frozen
{{ cookiecutter.project_slug }}_create_envs
Create conda environments for all workflow steps:
{{ cookiecutter.project_slug }}_create-envs [-h] [{{ cookiecutter.project_slug | upper }}_DIR]
Positional arguments:
- {{ cookiecutter.project_slug | upper }}_DIR: path to
{{ cookiecutter.project_slug }}
project root directory
Optional arguments:
- -h, --help: show help message and exit
{{ cookiecutter.project_slug }}_runonce
Run workflow once:
{{ cookiecutter.project_slug }}_runonce [-h] [-v] [-f] [-d] [--no-freeze] [--no-cache] [{{ cookiecutter.project_slug | upper }}_DIR]
Positional arguments:
- {{ cookiecutter.project_slug | upper }}_DIR: path to
{{ cookiecutter.project_slug }}
project root directory
Optional arguments:
- -h, --help: show help message and exit
- -v, --verbose: output additional information
- -f, --forceall: force all output files to be re-created
- -d, --dryrun: only dry-run the workflow
- --no-freeze: do not check if workflow has been frozen
- --no-cache: do not load credentials cache
{{ cookiecutter.project_slug }}_loop
Run workflow periodically, the default period is one day:
{{ cookiecutter.project_slug }}_loop [-h] [-v] [-f] [-d] [-N NUM_LOOPS] [-D DAYS] [-H HOURS] [-M MINUTES] [-S SECONDS] [--no-freeze] [--no-cache] [{{ cookiecutter.project_slug | upper }}_DIR]
Positional arguments:
- {{ cookiecutter.project_slug | upper }}_DIR: path to
{{ cookiecutter.project_slug }}
project root directory
Optional arguments:
- -h, --help: show help message and exit
- -v, --verbose: output additional information
- -f, --forceall: force all output files to be re-created
- -d, --dryrun: only dry-run the workflow
- -N NUMLOOPS, --num-loops NUMLOOPS: specify maximum number of loops
- -D DAYS, --days DAYS: loop period days
- -H HOURS, --hours HOURS: loop period hours
- -M MINUTES, --minutes MINUTES: loop period minutes
- -S SECONDS, --seconds SECONDS: loop period seconds
- -r, --retry-delay: delay in seconds for retrying to run a failed workflow execution (default: 60)
- --no-freeze: do not check if workflow has been frozen
- --no-cache: do not load credentials cache
Unattended workflow execution
Entering a passphrase for running the workflow is not a feasible option when automating the workflow.
For such a case, an environment variable called {{ cookiecutter.project_slug | upper }}_PWD_FILE
can defined, pointing to a file to which the passphrase has been stored.
When using this option, please make absolutely sure that the permissions for the passphrase file are set appropriately, i.e., read access only for the current user!
On Linux, this should look similar to the following:
echo MY_SUPER_SECURE_PASSPHRASE > .passphrase
chmod 600 .passphrase
export {{ cookiecutter.project_slug | upper }}_PWD_FILE=$PWD/.passphrase
On Windows, this should look similar to the following:
ECHO MY_SUPER_SECURE_PASSPHRASE > .passphrase
ICACLS .passphrase /INHERITANCE:R /GRANT %USERNAME%:(F)
SET CE4T_OPT_OPS_PWD_FILE=%CD%\.passphrase
Platform-specific comments
When running the workflow, Snakemake creates temporary files that may contain confidential data in plaintext format. In the current implementation, file permissions for accessing these temporary depend strongly on the used platform:
- Linux:
Only the user who started the workflow (via
{{ cookiecutter.project_slug }}_runonce
or{{ cookiecutter.project_slug }}_loop
) has read access to these temporary files. This makes it safe to use{{ cookiecutter.project_slug }}
in a shared environment (e.g., under/var
,/opt
or/srv
) by more than one user, even if the{{ cookiecutter.project_slug }}
project root folder is the working directory (default). - Windows:
No specific file permissions are applied to the temporary files (Python standard).
Every user who has read access to the working directory (which contains the temporary files in a subfolder) has also read access to the temporary files.
When installing
{{ cookiecutter.project_slug }}
in a shared environment, unwanted file access can be avoided by not using the{{ cookiecutter.project_slug }}
project root folder as working directory, but instead a folder with apropriate access permissions (i.e., no common access, but only access by one user).
Comment:
Further development could probably fix these differences between Windows and Linux, by using the pywin32
package to manage folder access permissions.


The Master of Urban Spatial Analytics (MUSA) program at the University of Pennsylvania teaches at the intersection of data science & public policy. In the MUSA Practicum, students work with clients to develop data science tools that can help stakeholders better allocate their limited resources. The course is taught by Michael Fichman & Matthew Harris and was founded by the late Professor Ken Steif. Each project below includes a case study and source code that other cities can adopt for the purposes of replication.


Siem Reap
We spent the first week of our two weeks in Cambodia in Siem Reap. After our long journey into town, we arrived at our hotel. For CAD$13/night, we had the nicest place of our trip so far, in what we thought would be an expensive tourist trap of a town. Instead, we really enjoyed Siem Reap.
Our hotel was in a great location just one door down from one of the small night markets, and across a small pedestrian footbridge into the centre of Siem Reap. So it was only 5 minutes or less to Pub Street and tons of restaurants, yet quiet at night.  The service from the hotel staff was incredible; we’d definitely stay there again.
Obviously the main draw to Siem Reap is the Angkor temple complex, and we’ll cover that more in another post. There are hundreds of ancient temples in the area, and not all are within the Angkor Archeological Park, but there’s only so many you can see.
We had several off days between Angkor visits to relax and explore the town (and also to spend less money :P).
The only thing that made Siem Reap slightly less enjoyable was the pestering of the tuk tuk drivers. There are a ton of them, and any time you walk by any one of them you'll hear "tuk tuk? sir? lady?" - regardless of whether you're walking down the street, crossing the road, looking in a store, about to walk into a restaurant, or (my favourite) getting onto a bicycle. No we do not need a tuk tuk, sir - as you can see, we already have a form of transport with this bicycle we're sitting on. :P
Artisans
One day we visited a well-known artisans workshop. They make souvenirs and art in several different mediums, and do a good job of touring you around the workshop to see the “artisans” in progress. The work was very nice, and much better than the cheap stalls in town, but way out of our price range. It felt a bit like an assembly line where they just copy existing work. It was still worth a visit to see the different things they make and some of the details in how they are made.
Tonle Sap
We also did an organized half-day trip to Tonle Sap. This is the largest lake in South-East Asia, and is the lifeblood of Cambodia. The lake provides freshwater fish and sustenance for many. The lake itself rises and falls huge amounts with the seasons, from a depth of 2m in the dry season to 11m in the rainy season. The villages around the edges are all built on stilts, and on our boat tour we visited one of the floating villages. The entire village, including the buddhist temple, school, and shops, are all floating on barges. As the lake rises and falls, the buildings are towed into different places on the lake - up to 5km each direction a year.
These villages are quite poor however. The life expectancy at birth is 54 years, and 12% of children die before age 5. Average income per household is just US$500 per year and literacy rates are 46%. Even for Cambodia, these numbers are low. Village life still looked peaceful and idyllic from our vantage passing by.
Our tour wasn't great - we didn't spend all that long on an actual boat, and one direction it poured rain so we lowered the blinds and couldn't see anything. We spent a large part of our time on a big old riverboat they use as a base. We got lunch and two drinks, and spent time in hammocks at one end of the boat.
I enjoyed just lying there watching the villagers putter by in little canoes stacked high with vegetables to sell, fisherman casting lines, and kids playing on the barges.
We also stopped at one barge to look at souvenirs and some crocodiles in a cage. A couple local kids came by in circular tubs to offer photos with a snake and to beg. Interesting boats though!


Page maintained by Ke-Sen Huang.
If you have additions or changes, send an e-mail.
Information here is provided with the permission of the ACM.
Note that when possible I link to the page containing the link to the actual PDF or PS of the preprint.
I prefer this as it gives some context to the paper and avoids possible copyright problems with direct linking.
Thus you may need to search on the page to find the actual document.
the ACM Digital Library (DOI) Link for the paper
the Eurographics Digital Library Link for the paper
Paper Abstract
Author Preprint
Paper Video
Paper Presentation
Paper Images
Paper Data
Demo Program or Source Code
Related Links
Changelog
Session: Squash, Stretch & Render
- Modeling Tools at Disney Animation
-
Dmitriy Pinskiy,
Jose L. Gomez Diaz
- Delta Mush: Smoothing Deformations While Preserving Detail
-
Joe Mancewicz, Matt L. Derksen, Hans Rijpkema, Cyrus A. Wilson
- Computer graphics and particle transport: our common heritage, recent cross-field parallels and the future of our rendering equation
-
Eugene D¡¦Eon
Session: Pipe Dreams
- Houdini Engine: Evolution Towards a Procedural Pipeline
-
Ken Xu,
Damian Campeanuy
- Depends: Workflow Management Software for Visual Effects Production
-
Andrew Gardner,
Jonas Unger
- Can We Solve the Pipeline Problem?
-
Cristian S. Calude,
Alasdair Coull,
J. P. Lewis
- CG Pipeline Design Patterns
-
Bill Polson
Session: Effects Poutine
- The Brush Shader: A Step towards Hand-Painted Style Background in CG
-
Marc Salvati, Ernesto Ruiz Velasco, Katsumi Takao
- Time Travel Effects Pipeline in "Mr. Peabody & Sherman"
-
Robert Chen, Fangwei Lee, David Lipton
- Choreographed droid destruction on Elysium
-
Greg Massie, Koen Vroeijenstin
- Arctic Ice: Developing the Ice Look for How to Train Your Dragon 2
-
Feng Xie, Mike Necci, Jon Lanz, Paolo deGuzman, Patrick O¡¦Brien, Eduardo Bustillo
kesen.huang@gmail.com


- No hard-coding of values in scripts
- Making changes in just one location
- Saving time and human error
- Easy to locate
- Future-proof
- Groups of related system properties
- Add header and helpful description
- Add helpful links to wiki/doc page
Pages > Categories > Properties
Server-side use
gs.getProperty('name');


Bela Ban, JBoss
Sept 2008
Memcached is a widely used cache, which can be distributed across a number of hosts. It is is a hashmap storing key/value pairs. Its main methods are set(K,V) which adds a key/value pair, get(K) which returns a value for a previously inserted key and delete(K) which removes a key/value pair.
Memcached is started on a given host and listens on a given port (11211 being the default). The daemon is written in C, but clients can be written in any language and talk to the daemon via the memcached protocol.
Typically, multiple memcached daemons are started, on different hosts. The clients are passed a list of memcached addresses (IP address and port) and pick one daemon for a given key. This is done via consistent hashing, which always maps the same key K to the same memcached server S. When a server crashes, or a new server is added, consistent hashing makes sure that the ensuing rehashing is minimal. Which means that most keys still map to the same servers, but keys hashing to a removed server are rehashed to a new server.
Memcached does not provide any redundancy (e.g. via replication of its hashmap entries); when a server S is stopped or crashes, all key/value pairs hosted by S are lost.
The main goal of memcached is to provide a large distributed cache sitting in front of a database (or file system). Applications typically ask the cache for an element and return it when found, or else ask the DB for it. In the latter case, the element is added to the cache before returning it to the client and will now be available from the cache on the next cache access.
This speeds up applications with good cache locality (e.g. fetching web pages comes to mind), because even a round trip in a LAN is typically faster then a round trip to the DB server, plus the disk access for reading a SELECT statement.
In addition, clients now have a huge aggregated cache memory. If we start 10 memcached daemons of 2GB memory each, then we have a 20GB (virtual) cache. This is bigger than most physical memory sizes of most hosts today (2008).
Figure 1 shows a typical use of memcached. The example shows an instance of Apache which serves HTTP requests and a Python client running in the mod_python Apache module. There are 3 instances of memcached started, on hosts A, B and C. The Python client is configured with a list of [A,B,C].
When a request hits the Python code that requires a DB lookup, the Python code first checks the cache by hashing the key to a server. Let's assume K is hashed to C, so now the client sends a GET(K) request to C via the memcached protocol and waits for the result. If the result is not null, it is returned to the caller as an HTTP response. If not, the value for K is retrieved from the DB, inserted into the cache (on host C) and then returned to the client. This ensures that the next lookup for K (by any client) will find K,V in the cache (on host C) and does not have to perform a DB lookup.
A modification to the DB is typically also followed by a cache insertion: so if K/V is modified, then we execute a SET(K,V,T) against the cache after the DB insertion.
Each SET request carries an expiry timestamp T with it, which lets the client define when the entry should be evicted from the cache. The time stamp is given in seconds, 0 means don't expire1 and -1 means don't cache.
Illustration
1: The memcached architecture
PartitionedHashMap is an implementation of memcached on top of JGroups, written completely in Java. It has a couple of advantages over memcached:
Java clients and PartitionedHashMap can run in the same address space and therefore don't need to use the memcached protocol to communicate. The latter is text based2 and slow, due to serialization. This allows servlets to access the cache directly, without serialization overhead.
All PartitionedHashMap processes know about each other, and can therefore make intelligent decisions as to what to do when a cluster membership change occurs. For example, a server to be stopped can migrate all of the keys it manages to the next server. With memcached, the entries hosted by a server S are lost when S goes down. Of course, this doesn't work when S crashes.
Similat to the above point, when a cluster membership change occurs (e.g. a new server S is started), then all servers check whether an entry hosted by them should actually be hosted by S. They will move all entries to be hosted by S to S. This has the advantage that entries don't have to be re-read from the DB (for example) and inserted into the cache (as in memcached's case), but the cache rebalances itself automatically.
PartitionedHashMap has a level 1 cache (L1 cache). This allows for caching of data near to where it is really needed. For example, if we have servers A, B, C, D and E and a client adds a (to be heavily accessed) news article to C, then memcached would always redirect every single request for the article to C. So, a client accessing D would always trigger a GET request from D to C and then return the article. JGroups caches the article in D's L1 cache on the first access, so all other clients accessing the article from D would get the cached article, and we can avoid a round trip to C. Note that each entry has an expiration time, which will cause the entry to be removed from the L1 cache on expiry, and the next access would have to fetch it again from C and place it in D's L1 cache. The expiration time is defined by the submitter of the article.
Since the RPCs for GETs, SETs and REMOVEs use JGroups as transport, the type of transport and the quality of service can be controlled and customized through the underlying XML file defining the transport. For example, we could add compression, or decide to encrypt all RPC traffic. It also allows for use of either UDP (IP multicasting and/or UDP datagrams) or TCP.
The connector (org.jgroups.blocks.MemcachedConnector) which is responsible for parsing the memcached protocol and invoking requests on PartitionedHashMap, PartitionedHashMap (org.jgroups.blocks.PartitionedHashMap) which represents the memcached implementation, the server (org.jgroups.demos.MemcachedServer) and the L1 and L2 caches (org.jgroups.blocks.Cache) can be assembled or replaced at will. Therefore it is simple to customize the JGroups memcached implementation; for example to use a different MemcachedConnector which parses a binary protocol (requiring matching client code of course).
All management information and operations are exposed via JMX.
Figure 2 shows a typical use case for which PartitionedHashMap was designed.
Clients access a web application via Apache and forward HTTP requests for dynamic content via mod-jk to one of the nodes in the cluster. This is usually a servlet/JSP/JSF container such as JBoss, and the servlet then handles the request and returns an HTTP response.
The servlet has to access the DB, and in a typical scenario for webapps, 10% of the requests to the DB are writes and 90% are reads.
Because access to the DB is slow (due to the round trip to the DB server, plus the disk access), and because many clients might access the DB at the same time, therefore creating a bottleneck, the servlet uses PartitionedHashMap to cache the result of its access to the DB.
This is very simple and could be done for example like this:
Read(X)
Read from the cache. If X was found in the cache, return it and don't access the DB
If not, read from the DB and the place the result into the cache
On the next read for X, it will be found in the cache (if not expired yet)
Write(X)
Write X to the DB
Insert X into the cache
Illustration
2: a typical use case for PartitionedHashMap
The local cache instance will hash each key K to either host A, B or C. So, for example, if the servlet on host A does a GET(K), and K is hashed to C, then the PartitionedHashMap on A will forward the GET(K) to C. C returns the value associated with K to A. If A has an L1 cache enabled, then A will cache K,V (depending on K's expiration time). The next time a client on A accesses K, V will be returned from A's L1 cache directly.
Note that because we don't run Python clients, but Java clients, we could use a hardware load balancer which directs HTTP requests for static content to Apache, and dynamic content directly to one of the 3 JBoss servers, as shown in Fig. 3.
Note that we don't need sticky request balancing here (unless the servlet also accesses HTTP sessions which are replicated), but the cache is globally available. Of course, sticky request balancing might help increasing cache locality: if client C is always directed to host B, then B's L1 cache will already contain the most frequently accessed entries by C.
Fig. 3 shows that the hardware load balancer let's Apache handle static web pages, but directs requests for dynamic content to one of the 3 servers.
Over time, each of the 3 servers will build up a bounded cache of the most frequently accessed entries,
Illustration
3: PartitionedHashMap with a hardware load balancer
and serve them directly from the L1 cache.
Note the Fig. 3 shows that the PartitionedHashMap instances on hosts A, B and C form a cluster, so keys and values will get migrated on rehashing. While this is one large cluster, nothing prevents us from partitioning a large cluster into several smaller ones. For example, if we used mod-jk, we could create mod-jk domains, and only cluster the servers inside one domain. So, if we had 3 domains, we'd have 3 different clusters.
The advantage of partitioning a large cluster into multiple domains is that domains can be taken down independently, e.g. for HW/SW upgrades.
PartitionedHashMap can also be accessed via the memcached protocol, so existing clients continue working with it.
The setup would be the same as shown in Fig. 1, except that the backend would not consist of memcached servers, but of JGroups MemcachedServer instances.
Note that the full protocol has not been implemented, but only GET (single and multi), SET, DELETE and STATS. Adding APPEND, PREPEND, CAS etc is simple, so if you need these urgently, post this on the JGroups dev mailing list and I'll see that it gets added.
The Python and Java clients work fine.
The Java performance test (MemCachedBench) with 10000 SET, GET and REMOVE requests against 4 memcached instances on the one hand and 4 PartitionedHashMap instances on the other hand shows ca. 4 secs for GETs, 2.8 for GETs, 200ms for multi gets and 1.8 secs for removes.
The biggest overhead by far is the memcached protocol, in the above test, the protocol took ca 90% of the entire time of the test run.
The current memcached implementation is ca 10% faster than PartitionedHashMap, but - again - that diff mainly lies in the memcached protocol. A setup like the one shown in Fig. 3 should be really fast.
The main class to start the JGroups memcached implementation is org.jgroups.demos.MemcachedServer. It creates
an L1 cache (if configured)
a L2 cache (that's the default hashmap storing all entries)
and a MemcachedConnector
The latter parses the memcached protocol and is optional, for example, if you run inside of JBoss. In this case, you'd only create a PartitionedHashMap instance and possibly set the L1 cache in it.
The command line options for MemcachedServer are ('-help' dumps all options)
The API is very simple:
public void put(K key, V val): puts a key / value pair into the cache with the default caching time
public void put(K key, V val, long caching_time): same as above, but here we can explicitly define the caching time. 0 means cache forever, -1 means don't cache and any positive value is the number of milliseconds to cache the entry
public V get(K key): gets a value for key K
public void remove(K key): remove a key / value pair from the cache (L2 and L1, if enabled)
PartitionedHashMap<String,String>
map=new PartitionedHashMap<String,String>(props,
"demo-cluster");
Cache<String,String>
l1_cache=new Cache<String,String>();
l1_cache.setMaxNumberOfEntries(5);
l1_cache.disableReaping();
map.setL1Cache(l1_cache);
Cache<String, String>
l2_cache=map.getL2Cache();
l2_cache.enableReaping(10000);
map.setMigrateData(migrate_data);
map.start();
map.put(“name”,
“Bela”, 60000);
String
val=map.get(“name”);
map.remove(“name”);
System.out.println("address:
" + map.getLocalAddress());
System.out.println("L1
cache:\n" + map.getL1Cache());
System.out.println("L2
cache:\n" + map.getL2Cache());
l1_cache.stop();
map.stop();
The example first creates an instance of PartitionedHashMap, which accepts String as both keys and values. Then we configure an L1 cache which is bounded (5 entries max) and doesn't have reaping enabled. This means, when we insert an entry and the size of the L1 cache exceeds 5, the oldest entry will be removed to bring the size back to 5.
The next step configures the L2 cache (the main cache) to look for entries to evict every 10 seconds.
Then we enable data migration on cluster view changes and start the cache. The start() method is important, because it starts the JGroups channel plus the reaper timer.
Then we insert an entry, fetch it again and finally remove it. After printing out some information about the cache, we stop it.
PartitionedHashMap can be downloaded here (http://downloads.sourceforge.net/javagroups/memcached-jgroups.jar). The memcached-jgroups.jar file contains JGroups plus commons-logging.jar and log4j.jar pre-packaged in one JAR and is all you need to get started.
java -jar memcached-jgroups.jar -help will dump all command line options (see above for a description).
By default, the JAR file ships with a log4j.properties file which has logging enabled at the TRACE level for org.jgroups.blocks.PartitionedHashMap. This should be changed to WARN in production. However, to play with MemcachedServer, you may even want to enable org.jgroups.blocks.MemcachedServer at the TRACE level.
Let's start the first instance:
[linux]/home/bela/distro/JGroups/dist$ java -Djgroups.bind_addr=<IP_ADDRESS> -jar memcached-jgroups.jar -p 11211
-------------------------------------------------------
GMS: address is <IP_ADDRESS>:33377
-------------------------------------------------------
view = [<IP_ADDRESS>:33377|0] [<IP_ADDRESS>:33377]
0 [TRACE] PartitionedHashMap: - node mappings:
138: <IP_ADDRESS>:33377
MemcachedConnector listening on <IP_ADDRESS>/<IP_ADDRESS>:11211
This shows that we've started a first instance at port 11211 and its JGroups address is <IP_ADDRESS>:33377. (Replace <IP_ADDRESS> with the correct interface in -Djgroups.bind_addr).
Let's now start the second instance:
[linux]/home/bela/distro/JGroups/dist$ java -Djgroups.bind_addr=<IP_ADDRESS> -jar memcached-jgroups.jar -p 11212
-------------------------------------------------------
GMS: address is <IP_ADDRESS>:38613
-------------------------------------------------------
view = [<IP_ADDRESS>:33377|1] [<IP_ADDRESS>:33377, <IP_ADDRESS>:38613]
0 [TRACE] PartitionedHashMap: - node mappings:
138: <IP_ADDRESS>:33377
902: <IP_ADDRESS>:38613
MemcachedConnector listening on <IP_ADDRESS>/<IP_ADDRESS>:11212
The second instance is started at port 11212 and its JGroups address is <IP_ADDRESS>:38613. We can see that the 2 instances formed a cluster; both instances should have a view of
[<IP_ADDRESS>:33377|1] [<IP_ADDRESS>:33377, <IP_ADDRESS>:38613].
If the cluster didn't form, go and read this (http://www.jgroups.org/javagroupsnew/docs/manual/html/ch02.html) to fix it.
Now run a simple client (we use telnet, but any of the memcached clients could be used3) and connect to the instance running at 11212:
[linux]/home/bela$ telnet localhost 11212
Trying <IP_ADDRESS>...
Connected to localhost.
Escape character is '^]'.
set name 0 0 4
Bela
STORED
This means we added a key “name” with a 4-byte value of “Bela”. Let's add another key/value:
set id 0 0 6
322649
STORED
To get the value associated with “name” and “id”, execute the following:
get id name
VALUE id 0 6
322649
VALUE name 0 4
Bela
END
This returns both values.
Add a few more key/value pairs, to be sure that they are (more or less) evenly distributed across both instances. Note that you can start a second telnet session, connected to the server listening on port 11211.
  Do a simple CTRL-C. This mimicks a graceful shutdown. In my case, I killed instance one, and saw that its keys were migrated to instance two:
862209 [TRACE] PartitionedHashMap: - migrated last_name from <IP_ADDRESS>:33377 to <IP_ADDRESS>:38613
862272 [TRACE] PartitionedHashMap: - migrated name from <IP_ADDRESS>:33377 to <IP_ADDRESS>:38613
862339 [TRACE] PartitionedHashMap: - migrated id from <IP_ADDRESS>:33377 to <IP_ADDRESS>:38613
We can see in the other shell that those keys were added by the second instance:
867581 [TRACE] PartitionedHashMap: - _put(last_name, [B@3a747fa2, 0)
867685 [TRACE] PartitionedHashMap: - _put(name, [B@2092dcdb, 0)
867751 [TRACE] PartitionedHashMap: - _put(id, [B@29d381d2, 0)
view = [<IP_ADDRESS>:33377|2] [<IP_ADDRESS>:38613]
867871 [TRACE] PartitionedHashMap: - node mappings:
902: <IP_ADDRESS>:38613
We also see that the cluster view now only shows one member: instance two.
A GET on the telnet session connected to instance two reveals that the keys are indeed present:
get name id hobbies last_name
VALUE name 0 4
Bela
VALUE id 0 6
322649
VALUE hobbies 0 4
none
VALUE last_name 0 3
ban
END
This shows that key/value pairs for “name”, “last_name” and “id” were hosted by instance one and migrated to instance two on stopping instance one.
For optimal performance, message bundling should be disabled for unicast messages (which are used for RPCs, e.g. remote GET requests). This is done by setting enable_unicast_bundling to false in the transport, e.g. UDP or TCP. The reason for this is described here (http://wiki.jboss.org/wiki/ProblemAndClusterRPCs) in more details.
1Of course, entries with a timestamp of 0 can still be evicted when the cache needs to make room for more entries.
2There has been talk of a binary protocol for memcached, but this hasn't materialized yet (as of 2008)
3The client would have to be configured with both servers: <IP_ADDRESS>:11211 and <IP_ADDRESS>:11212


Preparation time
less than 30 mins
Cooking time
10 to 30 mins
Serves
Serves 4
This French classic is surprisingly simple to make and perfect for your next dinner party.
For the stock, heat the butter in a saucepan and add the shallot, celery and thyme. Cook for 2-3 minutes. Add the langoustine shells and increase the heat. Add the white wine and fish stock and cook for 5 minutes.
Remove from the heat and place in a large food processor. Blend everything together, including the shells. Pass through a sieve and set aside.
For the sauce, heat a large sauté pan and add the butter. Once melted add the shallot and cook for 1 minute. Add the vermouth, stock and bay leaf and cook until the volume of liquid has reduced by half. Add the cream and reduce by half again. Pass through a sieve into a clean pan.
To cook the sole, heat a large frying pan and add the butter. Once hot add the sole. Cook on each side until golden and cooked through. Add the langoustine meat and warm through.
Put the sole fillets on a large plate and top with the langoustines. Pour the sauce around the plate and garnish with the fresh chervil and edible flowers.


I am Jizheng Dong, a graduate from Nanjing University with a major in applied mathematics and currently a research assistant in the system neuroscience lab of Professor Yi Sun at Westlake University. My research interests include the analysis and modeling of animal behavior and neural activity.
The project aims for the development of equipment for adaptive recording and analysis of 3D behavior in the free-behaving fruit fly.
A fruit fly displays special standing
How to improve the resolution for behavior recording is an important problem in systems neuroscience. To address this question, we plan to build equipment to track the free-behaving animals. This could be used for behavioral analysis and optical stimulation in brain areas.
Compared to the head-injured or restricted state under which many behavior experiments are performed, fruit fly display lots of behaviors that are not even observed when they are head-fixed, such as special standing and rolling. The existing results have shown that our equipment is valuable.
I'm interested in devleoping efficient models for computer vision (e.g. classification, detection, and super-resolution) using pruning, quantization, distilaltion, NAS, etc.


This is a tutorial on how to import new fonts into your website, which is something that can help give your website more personality and stand out.


Sumedha loves books, especially, books with suspence, danger, evil and adventure.( like Harry Potter) Her favorite color is the darkest black. Her favorite food is cheese pizza.
She loves cupcakes, candies, cookies and other sweet stuff. She is vegetarian. Her favorite food is pizza.


Enumerable #map
Map, often confused with "Each", is a Ruby method used to iterate over an array where Map will return a new array put together by the results of the block while Each will return the original array.
For example:
Each
irb(main):> [1, 2, 3].each { | i | i + 2 } => [1, 2, 3]
Map
irb(main):> [1, 2, 3].map { | i | i + 2 } => [3, 4, 5]
There is another Ruby method, called "Collect" which is identical to "Map"; Collect, also, outputs a new array from the block results.
Collect
irb(main):> [1, 2, 3].collect { | i | i + 2 } => [3, 4, 5]


{{each recip_prefs}}
{{loop_var.name}}
{{each loop_var.ids}}
{{articles[loop_var].headline}}
{{articles[loop_var].content}}
Learn more
{{end}} {{end}}
Growing Quality.
Avocado Industries, 1200 Farmers Way, Jacksonville, FL 20202
© 2017 Avocado Industries. All rights reserved.
Privacy Policy
Update email
Unsubscribe


Each consists of separate fst files for target depths: 5x, 10x, 15x, 20x, 25x, 30x, 50x, 100x.
Fraction of gnomAD exomes over 5x, 10x, 15x, 20x, 25x, 30x, 50x, 100x for each locus in CCDS genes (in bigwig format).
Contains all other data necessary to run WEScover locally.


EAT DA BURGER!
 MMMMMM!
What Burger Do Ya Want?
Burger Name:
Add Da Burger!
I'm hungry! Gimme burgers!
Da Holy Guacamole
DEVOUR IT!
Da Bacon Bacon Cheesy Cheese
DEVOUR IT!
Yum! Burgers that I devoured!
Da Jalepeño Papa
DEVOURED!
X
Da Avocado Vegan Eater!
DEVOURED!
X


BY
Same rules as classic chess.
Player vs player only (no AI yet).
Features enpassant.
Castling not yet included.
Checkmate.
Draw after 50 non-pawn moves in a row
Draw if only 2 kings remain.
Only allows for legal moves.


Toggle navigation
Example Plans
FAQ
BUY NOW
Plans
Choose a plan that suits you and your dog(s)!
Small
From $5 / week
Around 5 KG
Nutritious
Help a small dog
Medium
From $12 / week
Around 18 KG
Nutritious
Help a medium dog
Large
From $24 / week
Around 30 KG
Nutritious
Help a large dog


Although you can make the sample work with an iframe embed, because it manipulates the DOM around the player (to inject the thumbnails for additional videos), it is easier to use the in-page embed, as done in the sample.


The CoOp backing trio of good causes in Bamber Bridge and Lostock Hall
by Laura LongworthThe CoOp in Lostock Hall and Bamber Bridge is celebrating becoming the new champion of three good causes.
The Lostock Hall food store and Bamber Bridge funeralcare branch will join forces to raise money over the next year for their Local Community Fund.
Each time CoOp members make a purchase, the brand will put 1% into the fund, which will be split by Lostock Hall Juniors Football Club, Walton-le-Dale Recreation Society and Cuerden Valley Park Trust.
CoOp picked these three causes as part of its focus on supporting community spaces, well-being and skill development in its 2022 community strategy.
Jacqueline Evans, member pioneer for Penwortham, Lostock Hall and Bamber Bridge, said: "Colleagues from FuneralCare and Food are so pleased to work with CoOp members to encourage them to choose the local cause they want their 1% reward from CoOp to go to. We appreciate how vital these funds are to support local community work."
The two branches collected more than £11,000 for previous local causes between November 2018 and last October. Staff will celebrate with in-store events on Saturday.


Usage¶
The typical usage pattern will be something like the following. In the below example, we are finding those sentences (identified by Genia) that are contained in a ce:para XML element.
# Get a SparkSession
spark = pyspark.sql.SparkSession.builder.getOrCreate()
# Set a reasonabe value for shuffle partitons (help with join performance)
spark.conf.set("spark.sql.shuffle.partitions",4)
# Read in some annotations. The below reads in the Original Markup annotations (think XML)
omAnnots = GetAQAnnotations(spark.read.parquet("./tests/resources/om/"),
props=["*"],
decodeProps=["*"],
numPartitions=int(spark.conf.get("spark.sql.shuffle.partitions"))) \
.persist(StorageLevel.DISK_ONLY)
# Read in some more annotations. The below reads in NLP annotations generated by Genia.
geAnnots = GetAQAnnotations(spark.read.parquet("./tests/resources/genia/"),
props=["orig", "lemma", "pos"],
decodeProps=["orig", "lemma"],
numPartitions=int(spark.conf.get("spark.sql.shuffle.partitions"))) \
.persist(StorageLevel.DISK_ONLY)
# Find those sentence annotations contained in a ce:para (XML element)
sentenceParaAnnots = ContainedIn(FilterType(geAnnots,'sentence'),FilterType(omAnnots,'ce:para'))
Query examples¶
To get you started, you can find below some more examples using the various query functions. Note that you can combine them to express more complex queries.
# Find the annotations "simple" that are within 25 characters after an annotation "the".
results = After(FilterProperty(geAnnots,"orig","simple"), FilterProperty(geAnnots,"orig","the"),25)
# Find the annotations "the" that are within 25 characters before an annotation "simple"
results = Before(FilterProperty(geAnnots,"orig","the"), FilterProperty(geAnnots,"orig","simple"),25)
# Find the annotations "simple" that are after an annotation "the" and before an annotation "end"
results = Between(FilterProperty(geAnnots,"orig","simple"), FilterProperty(geAnnots,"orig","the"), FilterProperty(geAnnots,"orig","end"))
# find those annotations "sentence" that are contained in "ce:para"
results = ContainedIn(FilterType(geAnnots,"sentence"), FilterType(omAnnots,"ce:para"))
# find those annotations "sentence" that contain an annotation "simple"
results = Contains(FilterProperty(geAnnots,"orig","sentence"), FilterProperty(geAnnots,"orig","simple"))
# filter the property field "orig" with the value "simulator". A single value or an array of values can be used for the filter comparison.
results = FilterProperty(geAnnots,"orig","simulator")
# filter the annotation sets with the value "ge"
results = FilterSet(geAnnots,"ge")
# filter the annotation types with the value "sentence"
results = FilterType(geAnnots,"sentence")
# return the following "sentence" annotation that contains an annotation "simple" within the annotation anchor: "ce:para"
sentences = Contains(FilterType(geAnnots,"sentence"),FilterProperty(geAnnots,"orig","simple"))
results = Following(FilterType(geAnnots,"sentence"), sentences,FilterType(omAnnots,"ce:para"))
# return the preceding "sentence" annotation that contains an annotation "simple" within the annotation anchor: "ce:para"
val sentences = Contains(FilterType(geAnnots,"sentence"),FilterProperty(geAnnots,"orig","simple"))
val results = Preceding(FilterType(geAnnots,"sentence"), sentences,FilterType(omAnnots,"ce:para"))
# find the annotations "basic" that are in the same document as the annotation "simple" and also match values on the specified property "parentId"
results = MatchProperty(FilterProperty(geAnnots,"orig","basic"), FilterProperty(geAnnots,"orig","simple"),"parentId")
# filter the property field "orig" using a regex expression "^sim*"
results = RegexProperty(geAnnots,"orig","^sim*")
# Sequence find the annotations "the" that are within 50 characters before an annotation "simple"
results = Sequence(FilterProperty(geAnnots,"orig","the"), FilterProperty(geAnnots,"orig","simple"), 50)


Ping-Pong
About Ping Pong
Created By:
Dean Scelza
GitHub Username/URL:
d34n5: Dean Scelza
Week 3 Independent Project for:
Epicodus / Intro: Javascript
Let's Play!
Rules:
Ping Pong will count up to your number from 1 with the following exceptions:
Numbers divisible by 3 become "ping"
Numbers divisible by 5 become "pong"
Numbers divisible by 15 become "pingpong"
Enter your number here:


Click “Share your Map!” to send your friends what you have built.
Marbleo.us was built by Robert Böhnke and Simon Hohberg in 2011 for a students project at Freie Universität Berlin.
A write-up about some of the technical details can be found here.
This project was built using CoffeeScript
To test your map, make sure you have at least one of these blocks on your map and they are not covered by other blocks:
Once you’re good to go, The “Test your Map”-Button will turn green. Click it to take your marble for a ride!
Dismiss


^ Drupal settings
To integrate a Drupal site with TSAdm tool you will have to add the following lines to the site's settings.php
file:
if (is_readable('/home/tsadm/drupal.settings.php'))
{
$tsadm_referrer = __FILE__;
# If this is a Drupal multisite installation and if it's NOT the
# default site, we need to hardcode the site's name here, so
# comment out the next line (remove the # character) if that's the case.
#$tsadm_site_name = "{{site.name}}";
require('/home/tsadm/drupal.settings.php');
}
That will tell Drupal which database to use, its user and password. Among other things.
Note that because of the gitignore file, settings.php will be ignored, so you will have to force it using add -f /path/to/file/settings.php


Here are a few things you will usually want to do when you Fire-Up to start work. Just CLICK the green bars as needed. You can use the Short Form option, below, for a simplified view. And, you can use the Apps tab in the Configuration Manager (left pane) to make this your Default Startup view.
After you turn on your Handibot, the first thing you will typically want to do is to accurately set the home or zero location for each axis. Most of the instructions on this page are also available as individual functions in the Macros folder (left pane).
If you have changed your cutter, you will need to re-set the Z-Zero location. This is done automatically for you by having the tool "touch-off" a Z-Zeroing plate. You will be asked to put the plate into position under the Z and to put the aligator clip on the cutter shank. Click "continue" after you are ready. [NOTE: Clip to the cutter-shank and not the collet-nut; the collet-nut does not provide a reliable electrical connection.]
Sometimes you will need to manually set the Z-zero location based on the current value rather than use automatic Z-Zero function. For example if you want to manually determine the correct 0 for the Z. First make sure your XYZ locations are initially accurate by running the Home Tool routine (or Macro#3). Then set the 0 for the Z where you would like it to be using the 0 (orange) button in the red panel (right side). Then, Click below ...
This App contains a variety of "helper" functions and information for setting-up and using your tool. It's designed to help you learn about your tool and its operation. You can simplify the view by selecting Short Form after you get familiar with the functions. Most of the instructions are also available as single function "macros" in the Macros folder (left pane). After you become knowledgeable and comfortable in the use of your tool, you may find you don't use the App itself anymore. Feel free to delete it (you can always get it back from the Handibot website)
Homing the Tool is the first thing that you will usually want to do after powering your tool up. Determining the zero location of each axis is automatically done for you by moving into the end-stops of the axis and then backing off an exact known distance to the location where Zero for the particular axis is set, defining, or re-establishing, your Home Location for each axis. It is very accurate and allows you to always get back to the exact location you were at when the tool was shut down. NOTE THAT IT WILL MAKE SOME NOISE at hit the END STOPS AGGRESSIVELY.
The back-off distance that is used in this function set at the factory and saved as a persistant variable. As you get more experienced, you may want to change the back-off distance in order to move your zero locations to better suit your work, for a particular project, or just to make a slight adjustment of your zero location. You can modify the back-off distance for each axis in the Preferences
tab (above).
Using the Set Home function in this app is the same thing as clicking on Macro#3 in the Macros folder. It also the same as using the [C3] Command in the Sb4 App or in the OpenSBP fabrication language. You can use each, interchangeably. [CustomCut in Sb4 = Macro in FabMo.]
Your Tool's Coordinate System
Your tool moves around in a Cartesian coordinate system. The X axis (left/right) and the Y axis (front/back) are in the plane of the material. The X = 0 and Y = 0 locations are at the bottom left corner as you face the front of the tool. Moving the tool-head to the right is moving in increasing value in the X axis, moving it towards the back is moving it in increasing value the Y axis. In most uses, these coordinates are used as the tool's Base Coordinates. Temporary working coordinates can be set as offsets from these Base Coordinates. Up/Down motion of the router is the Z axis. Down is the negative direction. Zero in the Z is typically set (as a working coordinate, offset from the top stop) at the height that the cutter tip is just touching the surface of the material or the bed. To explore the coordinate system, play with the keypad on in the red, DRO panel on the right:
The "Touch-and-Go App" can be very instructive in understanding the coordinate system. It is also helpful in just moving the tool around. Click the button below to try it out (restart the Fire-Up App to come back here when you are finished):
Z-Zero is the short name for setting the zero location for the cutter. We are actually determining the cutter length and setting the 0 location for the tip in order to set the working location for the tip of the cutter in the Z axis. Using the Z-Zero functionality, your tool uses electrical contact with a Z-zero plate to tell exactly the distance of tip of the cutter from the top stop. It then adds the known distance from the Z-zero plate to the material surface in order to calculate an overall back-off distance from the top. We call this total distance, "current_cutter_Zoffset".
You will also see the "current_cutter_Zoffset" in the Preferences
tab (above).
Your Handibot comes with a number of preset variables that it uses in operations to assist you. These variables all have default values, but you are able to modify them to suit your specific needs. After you change them, the values will persist even when the tool is turned off. These preference settings are in additions to the System Configuration available in the left side pull out; the latter define the actual motion and mechanical operation of the tool.
Preference settings are saved using a system of "persistent variables". There are several ways these persistent variables can be modified directly or by job files, the most direct approach is to just change them here. Make sure to hit the SAVE button after editing.
Handibots are a new kind of power tool. They are intrinsically safer than manual power tools. But please read the safety information to understand the precautions you should observe with these new tools.
The Handibot Manual provides information on getting-started, setting-up, and using your Handibot.
Additional resources and help are available on the Handibot User Forum.
The following is a listing of the current, system-wide configuration tree for the FabMo digital fabrication platform that is running on your Handibot. It can be useful for diagnostics:


Keith Tachibana>>>
Home
About Me
About Me
Contact Info
Curriculum Vitae (C.V.)
My Developer's Story
Technology Used
Media
Photos
Videos
Portfolio
Breaking Bad Connect 4 Game
EZ-FIT: FitBit Workout Suggestions
Star Wars Memory Match Game
Student Grade Table
Keith Tachibana>
Photos
Visual snapshots from my life's journey
My Photos
1 / 18
2 / 18
3 / 18
4 / 18
5 / 18
6 / 18
7 / 18
8 / 18
9 / 18
10 / 18
11 / 18
12 / 18
13 / 18
14 / 18
15 / 18
16 / 18
17 / 18
18 / 18
❮
❯


Turkey should scrap Russian missile system or face US sanctions -White House official
JERUSALEM: The Israeli Cabinet has approved hard-line politician Naftali Bennett as defense minister in the country's caretaker government.
Prime Minister Benjamin Netanyahu appointed Bennet, with whom he has a rocky relationship, last week.
Netanyahu appears to be trying to shore up support among his right-wing base. He's hoping to block attempts by his chief rival, Benny Gantz, to form Israel's next government.
The Cabinet voted Sunday for Bennett to become defense minister until a permanent government takes hold.
Gantz is in the process of trying to cobble together a majority coalition after inconclusive elections in September. Netanyahu had the first try at forming a government, but failed.
Bennett, who leads the New Right party, has demanded tougher military action against militants in Gaza.


Members
-
tunnel
-
Field to store the tunnel child process (or PID if tunnel is already running)
- Source:
- drivers/tunnel_client.js, line 19
Methods
-
addRunner(runner) → {*}
-
Parameters:
Name Type Description runner
Function - Source:
- drivers/phantomjs.js, line 83
Returns:
- Type
- *
-
<virtual> Client()
-
- Source:
- drivers/client.js, line 11
-
initialize(tests, config)
-
Parameters:
Name Type Description tests
config
- Source:
- drivers/client.js, line 21
-
isConnected(data) → {boolean}
-
Parameters:
Name Type Description data
- Source:
- drivers/browserstack.js, line 63
Returns:
- Type
- boolean
-
isConnected(data) → {boolean}
-
Parameters:
Name Type Description data
- Source:
- drivers/saucelabs.js, line 250
Returns:
- Type
- boolean
-
run()
-
- Source:
- drivers/browserstack.js, line 21
-
<virtual> run()
-
- Source:
- drivers/client.js, line 43
-
run()
-
- Source:
- drivers/phantomjs.js, line 28
-
run()
-
- Source:
- drivers/saucelabs.js, line 81
-
runInstance(test)
-
Parameters:
Name Type Description test
- Source:
- drivers/phantomjs.js, line 48
-
runInstance(instance, callback)
-
Parameters:
Name Type Description instance
callback
- Source:
- drivers/saucelabs.js, line 137
- To Do:
-
- Handle running out of minutes and all other service issues. Available ports: 80, 443, 888, 2000, 2001, 2020, 2222, 3000, 3001, 3030, 3333, 4000, 4001, 4040, 4502, 4503, 5000, 5001, 5050, 5555, 6000, 6001, 6060, 6666, 7000, 7070, 7777, 8000, 8001, 8003, 8031, 8080, 8081, 8888, 9000, 9001, 9080, 9090, 9999, 49221 (https://saucelabs.com/docs/connect)
-
spawn()
-
- Source:
- drivers/browserstack.js, line 53
Returns:
ChildProcess -
spawn()
-
- Source:
- drivers/saucelabs.js, line 237
Returns:
ChildProcess See https://saucelabs.com/docs/connect for available flags and options -
<virtual> spawn()
-
- Source:
- drivers/tunnel_client.js, line 81


UI/UX Designer, Information Security Analyst, Data Engineer for MAXX Potiental Internship Simulator, Mentor for students at Mako Music, Junior Technical Assistant for Dominion Power. Learn More
Who am I?
I am a student, a musician, and a nintendo enthusiast.


{{ msg }}
ID: {{currPlayer.ID}}
Name: {{currPlayer.deck.name}}
Play
Stop
Transition
Get Pool
Pick a song
{{item.name}}


BaseList Class
list class of DDD pattern.
Methods
containsEntity
()
Boolean
public
static
returns item is Entity
Returns:
Boolean:
emitLoaded
()
private
tell listeners emit loaded
first
()
public
first item
getPropInfo
()
PropInfo
public
get an instance of PropInfo, which summarizes properties of this class
Returns:
include
(
Promise(BaseModel)
-
[options]
include all relational models if not set
Parameters:
-
[options]
Object optional-
[recursive]
Boolean optionalrecursively include models or not
-
Returns:
Promise(BaseModel):
self
inherit
(
BaseModel
-
anotherModel
inherit value of anotherModel
Parameters:
-
anotherModel
BaseModel
Returns:
BaseModel:
this
last
()
public
last item
on
()
public
on addEventListeners for 'loaded'
setEntityProp
(
BaseModel
-
prop
-
submodel
set related model(s)
Parameters:
-
prop
Stringproperty name of the related model
-
submodel
Entity | Array
Returns:
BaseModel:
this
setIds
(
-
ids
set ids.
Parameters:
-
ids
Array(String | Number)
setItems
(
-
models
set items
Parameters:
-
models
Array
sort
()
protected
sort items in constructor
toArray
()
public
export models to Array
toPlainObject
()
Object
create plain list. if this list contains entities, returns their ids if this list contains non-entity models, returns their plain objects
Returns:
Object:
plainObject
Properties
ids
Array
public
ids: get ids of items
itemModelName
String
protected
static
model name of the item
items
Array
items: array of models
length
Number
public
the number of items
loaded
Boolean
loaded: is data loaded or not


--- layout: post title: Top 10 Mac OS X Lion How Tos | How To - CNET categories: [] tags: - geek - lion - mac - osx status: publish type: post published: true meta: _original_post_id: '' _original_import_author: John Duprey author: ---
I've been rolling with Lion at home on both my Macbook Pro and Mac Pro. As soon as there is a break at work, my Mac Pro will get the upgrade as well. There are some great Lion resources in this article.


{% extends "bookmarks/list.html" %}
{% load i18n %}
{% block subtitle %}{% blocktrans with user.username as username %}{{ username }}'s Bookmarks{% endblocktrans %}{% endblock %}
{% block heading %}{% blocktrans with user.username as username %}{{ username }}'s Bookmarks{% endblocktrans %}{% endblock %}


{% extends "base-register.html" %} {% load humanize %} {% block lcrContent %}
Tesserakt Software Appliance Licensing
Application token: {{ reg.token }}
Status of your application: {{ reg.get_status_display }}
Submission date: {{ reg.dt_when }}
Once your application has been approved, please visit this page to get access to your TG/LCR software credentials. Please keep your personal URL safe. Thank you for your business!
{% endblock %}


 So when Tiger go, Hanansi eat done. And say, "Brar Tiger, you foot short!" Tiger say, "No, me no hear you mak noise!" Hanansi say, "No, so me said, for when man makin' noise he kyan' eat." An' say, "Well, nex' day come back." When Tiger come, Hanansi tak shame, gi' him little breakfas' but say, "Brar Tiger, when we go fe eat, when I say 'Nyammy nyammy nyammy' you mus' say, 'Nyam a wha' eat'." So Hanansi stay deh eat everyt'ing, Tiger never get one. Tiger study fe him. Nex' day he go to Tiger yard. When Tiger gi' him breakfast an' gi' him enough meat he said to Tiger, "Brar Tiger, a whe' you get meat every day so?" Tiger said, "You know how me come by dis meat? When I see a cow lie down, I go up an' run me ban' inside of de cow an' hol' de man tripe, so I never out of meat." So Hanansi went his way an' do de same. De cow frighten on de hill-side an' turn head right down to lowland.  Cow fasten de han' de better an' gallop right down de hill an' drag Hanansi over de stone. Dat's de reason let you see Hanansi belly white.
Source: Here


writing software documentation
barker
[[understanding_code]]
- understanding task orientation
- writing to teach: tutorials
- writing to guide: procedures
- writing to support: reference
-
analyzing your users
- degrees of structure (physical location on the page > abstract terms)
- Getting the language right


We extend interfaces!
- embrace robust experiences
- reinvent frictionless bandwidth
- seize B2C web services
- transition open-source e-tailers
- benchmark rich networks
- synergize B2B applications
- aggregate impactful vortals
- empower 24/7 e-commerce
- integrate world-class web services
- benchmark magnetic users


Welcome,
John Doe
Total Refugees
3000
4% From last Week
Total Registered
1,500
34% From last Week
Total Volunteers
325
34% From last Week
Total Supported
$ 50
Recent News info
Refugee Saturation geo-presentation
To Do List Sample tasks
-
Skill set Interview with Mr.Suhaas #1544
-
Verify Documents for Mr.Snehal #1500


jQuery popup alert plugin
Super simple to use popup/alert plugin for jQuery.
Click this button to open a popup :
Usage example:
$.popup.show("The title", "A message.");
See .js file for available options.
Styles can be easily modified using provided stylsheet, or by adding your own classes to the popup.
© 2008 Yves Bresson -<EMAIL_ADDRESS>-
http://www.ybresson.com


Akan names are derived from Ghanian culture. Frequently in Ghana, children are given their first name as a 'day name' which corresponds to the day in the week they were born.Everyone Has An Akan Name.


@* * Copyright 2023 HM Revenue & Customs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *@ @import config.TrackingConsentConfig @()(implicit request: Request[_], flash: Flash, user: Option[CachedData], feedbackUrl: String, trackingConsentConfig: TrackingConsentConfig, messages: Messages) @main_template(title = "Submit your application") {
Once you submit your application you will not be able to amend any of your details.
After your application is submitted, you will receive an invitation to complete your online exercises. Your timer will start and you will have 5 days to complete your online exercises once you have received your invitation.


--- layout: post title: 2019-07-20-Cake.jpg date: 2019-07-20 07:36:30 permalink: /assets/html/gallery/2019-07-20-Cake.jpg.html exclude: true ---