Ansible Best Practices: The Essentials
THE ANSIBLE WAY
“When I talk about how to develop automation solutions with Ansible, I begin by highlighting the philosophy behind its design. All Ansible best practices relate back to this thinking in one way or another.
Ansible is the Swiss Army knife of DevOps, capable of handling many powerful automation tasks with the flexibility to adapt to many environments and workflows.
Not all approaches are created equal though.
Don't let yours undermine the simplicity and power of Ansible. Based on actual experiences helping Ansible users, we'll show you what to do, and what not to do, to create the most reliable, resilient, and easy-to-manage solutions.”
Complexity Kills Productivity.
That's not just a marketing slogan. We really mean it and believe that. We strive to reduce complexity in how we've designed Ansible tools and encourage you to do the same. Strive for simplification in what you automate.
Optimize For Readability.
If done properly, it can be the documentation of your workflow automation.
Think Declaratively.
Ansible is a desired state engine by design. If you're trying to "write code" in your plays and roles, you're setting yourself up for failure. Our YAML-based playbooks were never meant to be for programming.
Workflow
Treat your Ansible content like code
Version control your Ansible content
Start as simple as possible and iterate
Start with a basic playbook and static inventory
Refactor and modularize later
Treat your Ansible content like code, put it in version control. While Ansible content is not code, it is still text and ideal for version control. [Expand on version control workflows -- branch, tags, code reviews etc] The Ansible Tower automation workflow is optimized for use with SCM systems such as git, subversion and mercurial so you will definitely will want to do this if that’s where.
[EXPAND] Start simple, roles and playbooks, and inventory, in one place, then push out the roles you want to share into individual repos and manage with requirements.yml.
Workflow
Do It with Style
Create a style guide for developers
Consistency in:
Tagging
Whitespace
Naming of Tasks, Plays, Variables, and Roles
Directory Layouts
Enforce the style
Style guides promote standards, reusability, and longevity of Ansible content.
“Creating automation workflows.”
“Grammar”
Mention code reviews.
Project Layouts: Basic
The Ansible Way
basic-project/
├── inventory
│ ├── group_vars
│ ├── host_vars
│ └── hosts
└── site.yml
Start simple, roles and playbooks, and inventory, in one place, then push out the roles you want to share into individual repos and manage with requirements.yml
What defines a project?
One stack or application?
Later -- RBAC control implications?
Project Layouts: Organizational Roles
myapp/
├── roles
│ ├── myapp
│ │ ├── tasks
│ │ │ └── main.yml
│ │ └── etc.etc
│ ├── nginx
│ │ └── etc.etc
│ └── proxy
│ └── etc.etc
└── site.yml
Project Layouts: Shared Roles
myapp/
├── config.yml
├── provision.yml
├── roles
│ └── requirements.yml
└── site.yml
Inventory
Give inventory nodes human-meaningful names rather than IPs or DNS hostnames.
<IP_ADDRESS>
<IP_ADDRESS>
<IP_ADDRESS>
<IP_ADDRESS>
w14301.acme.com
w17802.acme.com
w19203.acme.com
w19304.acme.com
db1 ansible_host=<IP_ADDRESS>
db2 ansible_host=<IP_ADDRESS>
db3 ansible_host=<IP_ADDRESS>
db4 ansible_host=<IP_ADDRESS>
web1 ansible_host=w14301.acme.com
web2 ansible_host=w17802.acme.com
web3 ansible_host=w19203.acme.com
web4 ansible_host=w19203.acme.com
A meaningful inventory hostname can point to a resolvable address, making inventory and ansible-playbook output easier to read and understand.
Important to end users not familiar with your host naming schemes… improves readability.
Inventory
Group hosts for easier inventory selection and less conditional tasks -- the more groups the better.
What
[db]
db[1:4]
[web]
web[1:4]
Where
[east]
db1
web1
db3
web3
[west]
db2
web2
db4
web4
When
[dev]
db1
web1
[test]
db3
web3
[prod]
db2
web2
db4
web4
This is a common pattern we’ve seen in shops with sophisticated Ansible automation workflows.
Explain what we have here -- static inventory groups with host aliases we saw in the previous slide.
Inventory groups allow you to separate your systems into what, where and when. Let the Ansible host selectors query your inventory and do the work of creating unions, intersections and filter.
Hosts can belong to as many groups. Ansible inventory does not have to be a hierarchy.
What: an application, stack or microservice
Where: a datacenter or region
When: development stage
Note the use of the ranges shorthand under the “what”
While more groups are generally better, you can have too much of a good thing.
(Dynamic tagging? Need to resolve.)
Inventory
Use a single source of truth if you have it -- even if you have multiple sources, Ansible can unify them.
Stay in sync automatically
Reduce human error
Static inventory if fine when you’re starting out or managing a relatively small environment that doesn’t change often such as a development environment. Dynamic inventory is an imperative when is come to large environments especially dynamic ones using public/private/hybrid cloud technology.
Variables
Proper variable naming can make plays more readable and avoid variable name conflicts
Use descriptive, unique human-meaningful variable names
Prefix role variables with it’s “owner” such as a role name or package
apache_max_keepalive: 25
apache_port: 80
tomcat_port: 8080
Talk about flat naming space by design.
Highlight how if we just used “port” you could end up configuring you could create port conflict when your apache and tomcat servers both try to listen to port 80. By prefixing the apache and tomcat port, they stay seperate...
This is where having something in your style guide and some documentation comes in handy.
Improves readability.
Variables
Make the most of variables
Find the appropriate place for your variables based on what, where and when they are set or modified
Separate logic (tasks) from variables to reduce repetitive patterns and provided added flexibility.
Shortcut/human readable variables to improve task declaration readability and clarity
Remember you can’t override a variable or parameter if it’s been embedded into a task. Let’s take a look at what I mean…
Separate Logic From Variables
- name: Clone student lesson app for a user
host: nodes
tasks:
- name: Create ssh dir
file:
state: directory
path: /home/{{ username }}/.ssh
- name: Set Deployment Key
copy:
src: files/deploy_key
dest: /home/{{ username }}/.ssh/id_rsa
- name: Clone repo
git:
accept_hostkey: yes
clone: yes
dest: /home/{{ username }}/lightbulb
key_file: /home/{{ username }}/.ssh/id_rsa
repo: git@github.com:example/apprepo.git
Exhibit A
Embedded parameter values and repetitive home directory value pattern in multiple places
Works but could be more clearer and setup to be more flexible and maintainable
This works just fine but…
/home/… is repeated throughout. If changed it will require multiple edits. Yes we have bulk copy and replace.
Not clear what the params the play is working with without reading thru
Parameters like the local path to clone the repo cannot be modified without changing the play. This alone is the most valuable reason alone for doing this even if the others don’t matter.
Sometimes embedding values is intended with good reason (you don’t want user to override something).
Separate Logic From Variables
- name: Clone student lesson app for a user
host: nodes
vars:
user_home: /home/{{ username }}
user_ssh: "{{ user_home }}/.ssh"
deploy_key: "{{ user_ssh }}/id_rsa"
app_dest: "{{ user_home }}/exampleapp"
tasks:
- name: Create ssh dir
file:
state: directory
path: "{{ user_ssh }}"
- name: Set Deployment Key
copy:
src: files/deploy_key
dest: "{{ deploy_key }}"
- name: Clone repo
git:
dest: "{{ app_dest }}"
key_file: "{{ deploy_key }}"
repo: git@github.com:example/exampleapp.git
accept_hostkey: yes
clone: yes
Exhibit B
Parameters values are set thru values away from the task and can be overridden.
Human meaningful variables “document” what’s getting plugged into a task parameter
More easily refactored into a role
Here we have a refactored version of the previous example where logic (tasks) have been separated from variables as we’ve discussed. It’s a bit longer but more readable.
Variables are separated out. We know what parameters are being feed to our tasks.
User home can be set once and used by other variables.
Human-meaningful variable names make what you’re feeding into each task parameter easier to understand.
You can easily override any of the variables to change the default behaviour of the play.
Bonus: Makes refactoring a play into a role easier.
INSERT COMMAND LINE EXAMPLE. Setup root user?
Plays & Tasks
Use native YAML syntax to maximize the readability of your plays
Vertical reading is easier
Supports complex parameter values
Works better with editor syntax highlighting in editors
At its core, the Ansible playbook runner is a YAML parser with added logic such as commandline key=value pairs shorthand. While convenient when cranking out a quick playbook or a docs example, that style of formatting reduces readability. We recommend you refrain from using that shorthand (even with YAML folded style) as a best practice.
Use Native YAML Syntax
No!
- name: install telegraf
yum: name=telegraf-{{ telegraf_version }} state=present update_cache=yes disable_gpg_check=yes enablerepo=telegraf
notify: restart telegraf
- name: configure telegraf
template: src=telegraf.conf.j2 dest=/etc/telegraf/telegraf.conf
- name: start telegraf
service: name=telegraf state=started enabled=yes
Vertical scanning is easier to spot parameters and what is being passed.
Reduces the amount of horizontal scrolling the eyes must do. Modules such as ec2 that require a lot of parameters create long lines scroll off the screen which is really inefficient and makes it hard to read.
Syntax highlighting is suboptimal -- Ansible overloads key=value notation onto the standard python YAML parser. A YAML parser sees all of those key value.
Use Native YAML Syntax
Better, but no
- name: install telegraf
yum: >
name=telegraf-{{ telegraf_version }}
state=present
update_cache=yes
disable_gpg_check=yes
enablerepo=telegraf
notify: restart telegraf
- name: configure telegraf
template: src=telegraf.conf.j2 dest=/etc/telegraf/telegraf.conf
- name: start telegraf
service: name=telegraf state=started enabled=yes
This refactored version of the last example uses what’s called YAML folded syntax to “stack” the first task with the line that ran off our screen. It’s an improvement in that it reduces horizontal scrolling and lines running off your screen, but it still breaks syntax highlighting and we can do better. If you are going this far with white spacing though why not go all the way?
Use Native YAML Syntax
Yes!
- name: install telegraf
yum:
name: telegraf-{{ telegraf_version }}
state: present
update_cache: yes
disable_gpg_check: yes
enablerepo: telegraf
notify: restart telegraf
- name: configure telegraf
template:
src: telegraf.conf.j2
dest: /etc/telegraf/telegraf.conf
notify: restart telegraf
- name: start telegraf
service:
name: telegraf
state: started
enabled: yes
Native YAML has more lines; however, those lines are shorter, reducing horizontal scrolling your eyes have to do and line wrapping in your editor. It lets the eyes scan straight down the play.
The task parameters are stacked and easily distinguished from the next.
Native YAML syntax also has the benefit of improved syntax highlighting in virtually any modern text editor out there. Being native YAML, editors such as vim and Atom will highlight YAML keys (module names, directives, parameter names) from their values further aiding the readability of your content.
NOTE: Some of our own docs use this shorthand for legacy reasons though we’re progressively changing that. (Documentation pull requests accepted.)
Plays & Tasks
Names improve readability and user feedback
Give all your playbooks, tasks and blocks brief, reasonably unique and human-meaningful names
Plays & Tasks
Exhibit A
- hosts: web
tasks:
- yum:
name: httpd
state: latest
- service:
name: httpd
state: started
enabled: yes
PLAY [web]
********************************
TASK [setup]
********************************
ok: [web1]
TASK [yum]
********************************
ok: [web1]
TASK [service]
********************************
ok: [web1]
Here we have a simple example of a working a play. It works fine but what is happening here? yum is installing what? is service starting or shutting down something? what was this play supposed to do anyways? If you just wrote this play you know now or maybe you forgot. Others will have no clue unless they open the playbook and look to become familiar with it.
Plays & Tasks
Exhibit B
- hosts: web
name: installs and starts apache
tasks:
- name: install apache packages
yum:
name: httpd
state: latest
- name: starts apache service
service:
name: httpd
state: started
enabled: yes
PLAY [install and starts apache]
********************************
TASK [setup]
********************************
ok: [web1]
TASK [install apache packages]
********************************
ok: [web1]
TASK [starts apache service]
********************************
ok: [web1]
Here is the same play with names. By adding descriptive human-meaningful names to the play declaration and tasks we get output that give you and users of this automation better feedback and clarity to what is being performed.
Plays & Tasks
Focus avoids complexity
Keep plays and playbooks focused. Multiple simple ones are better than having a huge single playbook full of conditionals.
Monoliths!
As your automation grows in sophistication and scope refactor your plays -- includes & roles to compose automation workflows.
Plays & Tasks
Clean up your debugging tasks
Make them optional with the verbosity parameter so they’re only displayed when they are wanted.
- debug:
msg: "This always displays"
- debug:
msg: "This only displays with ansible-playbook -vv+"
verbosity: 2
Debugging messages and variable dumps in your plays can be helpful when you are developing or debugging automation automation, but not all the time. Displaying debugging pollutes the standard usage with a lot of noise. It can also scare anxious end users that don’t trust this automation stuff when some JSON dump of information explodes onto their screens.
The verbosity parameter was added to the debug module in v2.1.
Plays & Tasks
Don’t just start services -- use smoke tests
- name: check for proper response
uri:
url: http://localhost/myapp
return_content: yes
register: result
until: '"Hello World" in result.content'
retries: 10
delay: 1
Just because a service started or an instances has initialized -- maybe it hit an error initializing and crashed. Use modules like uri and wait_for to smoke test that they are ready to go.
Plays & Tasks
Use blocks to reduce verbosity and repetitive task declarations.
- name: check for proper response
block:
EXAMPLE HERE
Plays & Tasks
Use run commands sparingly
Use the run command modules like shell and command as a last resort
Use the command module unless you really need I/O redirection that shell permits -- but be very careful.
Run commands are...
Explain how run command modules have no concept of state. (See slide from essentials deck here.)
Command will escape redirection characters such a pipe so they cannot be embedded in a variable and used for something malicious. You really shouldn’t be using a variable provided by a user anyway.
Plays & Tasks
Always seek out a module first
- name: add user
command: useradd appuser
- name: install apache
command: yum install httpd
- name: start apache
shell: |
service httpd start && chkconfig httpd on
- name: add user
user:
name: appuser
state: present
- name: install apache
yum:
name: httpd
state: latest
- name: start apache
service:
name: httpd
state: started
enabled: yes
Plays & Tasks
Still using run commands a lot?
- hosts: all
vars:
cert_store: /etc/mycerts
cert_name: my cert
tasks:
- name: check cert
shell: certify --list --name={{ cert_name }} --cert_store={{ cert_store }} | grep "{{ cert_name }}"
register: output
- name: create cert
command: certify --create --user=chris --name={{ cert_name }} --cert_store={{ cert_store }}
when: output.stdout.find(cert_name)" != -1
register: output
- name: sign cert
command: certify --sign --name={{ cert_name }} --cert_store={{ cert_store }}
when: output.stdout.find("created")" != -1
Here “certify” is a fictitious command line tool to illustrate an in-house private tool an organization may have developed for its own use.
This example is a good example of “coding” in your playbooks. That pattern being something like:
Perform a task and register its return and perhaps ignore any errors to handle them later.
Parse/search the registered return as the parameter or conditional of a later task
Rise and repeat.
Sometimes this cannot be avoided because a module doesn’t exist and you need something fast. In that case...
Plays & Tasks
Develop your own module
- hosts: all
vars:
cert_store: /etc/mycerts
cert_name: my cert
tasks:
- name: create and sign cert
certify:
state: present
sign: yes
user: chris
name: "{{ cert_name }}"
cert_store: "{{ cert_store }}"
Modules do the heavy lifting in Ansible. Modules and playbooks work together to provide a simple and easy to read abstraction from the underlying complexity and sophistication that give Ansible it’s power.
Modules provide access to the full power of a proper programming language (typically python) and its ecosystem.
Also note, that you can (and should) do many operations in a module and present that as one task. The previous example’s function was more verbose, harder to read and was spread across multiple tasks.
Modules follow this CRUD pattern typically. Clean. (???)
http://docs.ansible.com/ansible/developing_modules.html
Plays & Tasks
Separate provisioning from deployment and configuration tasks
acme_corp/
├── configure.yml
├── provision.yml
└── site.yml
$ cat site.yml
---
- include: provision.yml
- include: configure.yml
Helpful if you are using different cloud providers -- whether public or private or hybrid -- vagrant or bare metal you can apply the same configuration to different computing platforms and environments.
Templates
Jinja2 is powerful but you needn't use all of it
Templates should be simple:
Variable substitution
Conditionals
Simple control structures/iterations
Design your templates for your use case, not the world's
Things to avoid:
Managing variables in a template
Extensive and intricate conditionals
Conditional logic based on embedded hostnames
Complex nested iterations
Expand upon Jinja2 being powerful. There is a bit of grey and a zen to deciding how to how to design your templates. Strive for simplicity. complexity kills.
Templates
Identify generated files
Label template output files as being generated by Ansible
Consider using the ansible_managed variable with the comment filter
{{ ansible_managed | comment }}
This is useful to tell users that a file has been placed by Ansible and manual changes are likely to be overwritten.
Roles
Like playbooks -- keep roles purpose and function focused
Use a roles/ subdirectory for roles developed for organizational clarity in a single project
Follow the Ansible Galaxy pattern for roles that are to be shared beyond a single project
Limit role dependencies
Roles
Use ansible-galaxy init to start your roles...
...then remove unneeded directories and stub files
Use ansible-galaxy to install your roles -- even private ones
Use a roles files (i.e. requirements.yml ) to manifest any external roles your project is using
Always peg a role to a specific version such as a tag or commit
Scaling Your Ansible Workflow
Command line tools have their limitations
Coordination across distributed teams & organizations...
Controlling access to credentials...
Track, audit and report automation and management activity...
Provide self-service or delegation...
Integrate automation with enterprise systems...


Release History¶
All notable changes to this project will be documented in this file.
[2.0.3] - 2019-10-13¶
Added
Add GenEpi’s documentation to Read the Docs
Add model persistance for classifier and regressor
[2.0.1] - 2019-07-12¶
Added
Support self-defiend genome regions (for any species)
Add argument parser (GenEpi -h)
Add “GenEpi” to bin when installing
Add output log
Add quick test
Add change log in Changelog.md
Changed
Change feature encoder for reducing memory usage
Removed
Remove random forest ensemble
[1.0.3] - 2018-04-22¶
First preview release


Menu
Home
About
Services
Insurance
Patient Forms
Referral Form
Contact Us
Patient Forms
For all your needs
Tell Me More
Patient Forms
Click desired form to download it
Records Release
Form
CLICK TO DOWNLOAD!
New MR Screening
Form
CLICK TO DOWNLOAD!
Al Hippa Form and
Notes
CLICK TO DOWNLOAD!
New Patient Intake
CLICK TO DOWNLOAD!
New CT Contrast Form
CLICK TO DOWNLOAD!


The Piltdown Man (feat. Matt Parker) - Objectivity #207 Get your first audiobook and 2 Audible Originals free when you try Audible for 30 days. Visit http://www.audible.com/objectivity or text objectivity to 500 500. (Sponsor) More links below ↓↓↓ Featuring author, comedian and YouTuber Matt Parker. Buy Matt...
shaneray/ShaneSpace.VisualStudio.InvisibleCharacterVisualizer A Visual Studio extension to add visibility to invisible unicode characters that may slip into your code. - shaneray/ShaneSpace.VisualStudio.InvisibleCharacterVisualizer
Download Mouse Without Borders for Windows 10/8/7 Mouse w/o Borders (http://www.aka.ms/mm) makes you the captain of your computer fleet by allowing you to control up to 4 computers from a single mouse and keyboard. This means that with Mouse w/o
[Discussion] SignalR JavaScript client changing package name to @microsoft/signalr · Issue #11637 · dotnet/aspnetcore In 3.0.0-preview7, the SignalR JavaScript client will change from being @aspnet/signalr to @microsoft/signalr. We are doing this to reflect the fact that SignalR is useful in more than just ASP.NET...
Azure SignalR Service with Xamarin.Forms - Xamarin Get started with Azure SignalR Service and Azure Functions with Xamarin.Forms
Breach at Cloud Solution Provider PCM Inc. — Krebs on Security A digital intrusion at PCM Inc., a major U.S.-based cloud solution provider, allowed hackers to access email and file sharing systems for some of the company’s clients, KrebsOnSecurity has learned.
Wiener Büchereien gehackt: Daten von zehntausenden Nutzern im Netz Namen, Telefonnummern, E-Mail-Adressen und Anschriften sind geleakt. Der Online-Katalog der Wiener Büchereien ist vorerst offline.
Manage and audit access to servers, databases and kubernetes. Manage and audit access to on-prem or cloud servers, databases and kubernetes. Recommended by security experts and operators like Troy Hunt.
World's First Patented Unhackable Computer Ever (Canceled) The Unhackable Computer. A new PATENTED hardware design of a Computer line that does not let any virus and Malware into it.
'Religious Liberty' - Not Just for Gay Cakes Anymore Here’s a pretty important wake-up call for those who may need waking up about the growth of support for ‘religious...
Using Chained Certificates for Certificate Authentication in ASP.NET Core 3.1 This article shows how to create self signed certificates and use these for chained certificate authentication in ASP.NET Core. By using chained certificates, each client application can use a uniq…


{% extends "analytics/_layouts/utils" %} {% import "_includes/forms" as forms %} {% set selectedTab = 'metadata' %} {% set content %}
{{ "Metadata file doesn’t exist"|t }}


The photography was token during my trip in Taiwan last July, and the location is the cat’s paradise: Houdong.
The temperature in the summer is absolutely high in Taiwan. When I arrived in the village, there’re few cats lying in the shadow and taking a nap. Most of them are indolently lying or walking around and it seems that they are not afraid of human beings.
I’m a supper cat lover, and I feel so excited there.  His expression fully showed his pleasant mood at the time: D
Finally, I would like to ask @catwomanteresa what’s the name of the cat in my photo?
「中文部分」
這是我去年七月在台灣旅行的時候拍攝的照片，地點是在貓咪們的天堂貓村猴硐。
可能由於是夏天氣溫著實很高，我去村裡的時候僅在陰涼處看到一些在睡午覺的毛孩子們。他們大多很慵懶也不算太害怕人類，讓我這樣的愛貓人士超激動的。在一棵大樹下我遇到了這只在打瞌睡的貓咪，他的表情充分展現了他當時愜意的心情吧:D
最後還想請教一下@catwomanteresa，和我合影的這位貓貓叫什麼名字呀？
This page is synchronized from the post: ‘「Life & Activities」情感艺术 / Visual Art Contes ‘


Marc-Andre ter Stegen on self-criticism and Barca win over Celta
The goalkeeper had a quiet evening but spoke to the media after
by Jordi DelgadoMarc-Andre ter Stegen did not have to save Barca against Celta. He did speak after the game though.
“A victory is always good,” mused the German goalkeeper.
“At the start they made it hard for us because they pressed us one on one and it was hard to pass the ball to a player who had an opponent on his back. But in the end we got into the game and could get the goals.
“We expected changes from Celta because they changed their coach and it’s never easy to play against a team fighting for survival and they are three important points for us.
“We always are self-critical. That’s normal after any game, including a win like this. There are always things to improve. We’re players and we want to be professionals, to get to the top. Other teams want to beat us and we want to stay leaders in the league, the Champions League, wherever, and this is the way to do it.”


Source code for hTools2.modules.opentype
# [h] hTools2.modules.opentype
"""basic functions to import, export and delete OpenType features in fonts"""
import hTools2.modules.sysutils
reload(hTools2.modules.sysutils)
import os
from hTools2.modules.sysutils import rel_path
[docs]def clear_features(font):
"""
Deletes the content of the OpenType feature file in the font.
"""
font.features.text = ''
[docs]def import_features(font, fea_path, relative=None):
"""
Imports the content of the .fea file in ``fea_path`` into ``font.features``.
"""
features_text = ''
if os.path.exists(fea_path):
# make features file
if relative is None:
fea = open(fea_path,'r')
fea_text = fea.readlines()
for line in fea_text:
features_text += line
fea.close()
# link to features file
else:
rel_fea_path = rel_path(relative, fea_path)
features_text += 'include (%s);' % rel_fea_path
# set features
font.features.text = features_text
[docs]def import_kern_feature(font, fea_path, relative=None):
features_text = '\n'
if os.path.exists(fea_path):
fea = open(fea_path,'r')
# make features file
if relative is None:
fea_text = fea.readlines()
for line in fea_text:
features_text += line
fea.close()
# link to features file
else:
rel_fea_path = rel_path(relative, fea_path)
features_text += 'include (%s);' % rel_fea_path
# append features
font.features.text += features_text
[docs]def export_features(font, fea_path):
"""
Exports the content of `font.features` to the given .fea file in `fea_path`.
"""
if os.path.exists(fea_path):
fea = open(fea_path, "w")
fea.write(font.features.text)
fea.close()
[docs]def export_kern_feature(font):
"""
Export the font's kerning dict to OpenType ``kern`` feature.
"""
kern_feature = 'feature kern {\n'
for pair in sorted(font.kerning.keys()):
value = font.kerning[pair]
if pair[0] in font.keys() and pair[1] in font.keys():
kern_feature += '\tpos %s %s %s;\n' % (pair[0], pair[1], value)
kern_feature += '} kern;\n'
return kern_feature


The Shavian alphabet is an alternative, phonemic way to write English. The alphabet takes its name from Irish writer Bernard Shaw who inspired and posthumously funded it. Shaw believed there should be a simpler way to write English. His wish was fulfilled in 1962 following a worldwide competition. The winner of that competition, Kingsley Read, developed an alphabet designed especially for English, with a unique letter for each of the 40 or so basic sounds we all use today.
For further information about the Shavian alphabet visit Shavian.info.
The desktop and onscreen layouts are identical, and are based on the Shavian Imperial Good Companion typewriter layout, used by by Kingsley Read in the 1960s. Shavian IGC is named in honour of the Shavian Imperial Good Companion typewriter.
The compound letters (𐑸, 𐑹, 𐑺, 𐑻, 𐑼, 𐑽, & 𐑿), and a range of symbols, are entered by holding down SHIFT.
Numbers may be entered by holding down ALT.
The layouts for phone and tablet are identical to each other, and are based on the desktop layout with some tweaks to avoid the keys becoming too small.
The compound letters (and 𐑠) may be found by holding down (long hold) one of the keys with the dot in the top right. Holding down:
Pressing the 123 key will bring up the numbers and a range of symbols, arranged in a similar layout to the standard iOS keyboard.
© 2020 Shavian.info


Current version is
${project.version}
objenesis-${project.version}-bin.zip
- Objenesis distribution (binaries, sources and javadoc).
objenesis-tck-${project.version}.jar
- TCK to test your environment. See
details
.
objenesis-tck-android-${project.version}.apk
- Android TCK to test your Dalvik version. See
details
.
Older versions can be found
here


Minister Simataa calls for patience as ECN verifies results
Information and Communication Technology Minister Stanley Simataa says messages doing the rounds on social media about a demonstration over the delayed results is likely to threaten peace.
Stanley Simataa, who was speaking during a media briefing, called on the nation to be patient as the Electoral Commission of Namibia (ECN) carries out the verifications before final results are announced.


EAST RIVER TOWER
WELCOME
User Name
DASHBOARD
EVENTS
NOTIFICATIONS
COLLABORATE
DIRECTORY
MANAGEMENT|EAST RIVER TOWER
NOTIFICATION|CREATE
Notice
Issue date?


{% extends "template.html" %} {% block content %}
Welcome to Melody, explore the menu above to learn about our students and courses!
{% endblock %}


| I l@ve RuBoard |
8.6 GridsSo far, we've been arranging widgets in displays by calling their pack methods -- an interface to the packer geometry manager in Tkinter. This section introduces grid, the most commonly used alternative to the packer. As we learned earlier, Tkinter geometry managers work by arranging child widgets within a parent container widget (parents are typically Frames or top-level windows). When we ask a widget to pack or grid itself, we're really asking its parent to place it among its siblings. With pack, we provide constraints and let the geometry manager lay out widgets appropriately. With grid, we arrange widgets in rows and columns in their parent, as though the parent container widget was a table. Gridding is an entirely distinct geometry management system in Tkinter. In fact, at this writing pack and grid are mutually exclusive for widgets that have the same parent -- within a given parent container, we can either pack widgets or grid them, but not both. That makes sense, if you realize that geometry managers do their jobs at parents, and a widget can only be arranged by one geometry manager. At least within one container, though, that means that you must pick either grid or pack and stick with it. So why grid, then? In general, grid is handy for laying out form-like displays; arranging input fields in row/column fashion can be at least as easy as laying out the display with nested frames. As we'll see, though, grid doesn't offer substantial code or complexity savings compared to equivalent packer solutions in practice, especially when things like resizability are added to the GUI picture. In other words, the choice between the two layout schemes is largely one of style, not technology. 8.6.1 Grid BasicsLet's start off with the basics; Example 8-17 lays out a table of Labels and Entry fields -- widgets we've already met. Here, though, they are arrayed on a grid. Example 8-17. PP2E\Gui\Tour\Grid\grid1.pyfrom Tkinter import * colors = ['red', 'green', 'orange', 'white', 'yellow', 'blue'] r = 0 for c in colors: Label(text=c, relief=RIDGE, width=25).grid(row=r, column=0) Entry(bg=c, relief=SUNKEN, width=50).grid(row=r, column=1) r = r+1 mainloop() When run, this script creates the window shown in Figure 8-25, pictured with data typed into a few of the input fields. Once again, this book won't do justice to the colors displayed on the right, so you'll have to stretch your imagination a little (or run this script on a computer of your own). Figure 8-25. The grid geometry manager in pseudo-living colorThis is a classic input form layout: labels on the left describe data to type into entry fields on the right. Just for fun, this script displays color names on the left and the entry field of the corresponding color on the right. It achieves its nice table-like layout with the following two lines: Label(...).grid(row=r, column=0) Entry(...).grid(row=r, column=1) From the perspective of the container window, the label is gridded to column in the current row number (a counter that starts at 0), and the entry is placed in column 1. The upshot is that the grid system lays out all the labels and entries in a two-dimensional table automatically, with evenly sized columns large enough to hold the largest item in each column. 8.6.2 grid Versus packTime for some compare-and-contrast: Example 8-18 implements the same sort of colorized input form with both grid and pack, to make it easy to see the differences between the two approaches. Example 8-18. PP2E\Gui\Tour\Grid\grid2.py# add equivalent pack window from Tkinter import * colors = ['red', 'green', 'yellow', 'orange', 'blue', 'navy'] def gridbox(parent): r = 0 for c in colors: l = Label(parent, text=c, relief=RIDGE, width=25) e = Entry(parent, bg=c, relief=SUNKEN, width=50) l.grid(row=r, column=0) e.grid(row=r, column=1) r = r+1 def packbox(parent): for c in colors: f = Frame(parent) l = Label(f, text=c, relief=RIDGE, width=25) e = Entry(f, bg=c, relief=SUNKEN, width=50) f.pack(side=TOP) l.pack(side=LEFT) e.pack(side=RIGHT) if __name__ == '__main__': root = Tk() gridbox(Toplevel()) packbox(Toplevel()) Button(root, text='Quit', command=root.quit).pack() mainloop() The basic label and entry widgets are created the same way by these two functions, but they are arranged in very different ways:
The difference in the amount code required for each scheme is roughly a wash: the pack scheme must create a Frame per row, but the grid scheme must keep track of the current row number. Running the script makes the windows in Figure 8-26. Figure 8-26. Equivalent grid and pack windows8.6.3 Combining grid and packNotice that the prior script passes a brand new Toplevel to each form constructor function, so that the grid and pack versions wind up in distinct top-level windows. Because the two geometry managers are mutually exclusive within a given parent, we have to be careful not to mix them carelessly. For instance, Example 8-19 is able to put both the packed and gridded widgets on the same window, but only by isolating each in its own Frame container widget. Example 8-19. PP2E\Gui\Tour\Grid\grid2-same.py################################################################## # can't grid and pack in same parent container (e.g., root window) # but can mix in same window if done in different parent frames; ################################################################## from Tkinter import * from grid2 import gridbox, packbox root = Tk() Label(root, text='Grid:').pack() frm = Frame(root, bd=5, relief=RAISED); frm.pack(padx=5, pady=5) gridbox(frm) Label(root, text='Pack:').pack() frm = Frame(root, bd=5, relief=RAISED); frm.pack(padx=5, pady=5) packbox(frm) Button(root, text='Quit', command=root.quit).pack() mainloop() We get a composite window when this runs with two forms that look identical (Figure 8-27), but the two nested frames are actually controlled by completely different geometry managers. Figure 8-27. grid and pack in the same windowOn the other hand, the sort of code in Example 8-20 fails badly, because it attempts to use pack and grid at the same parent -- only one geometry manager can be used on any one parent. Example 8-20. PP2E\Gui\Tour\Grid\grid2-fails.py################################################################## # FAILS-- can't grid and pack in same parent (root window) ################################################################## from Tkinter import * from grid2 import gridbox, packbox root = Tk() gridbox(root) packbox(root) Button(root, text='Quit', command=root.quit).pack() mainloop() This script passes the same parent (the top-level window) to each function in an effort to make both forms appear in one window. It also utterly hangs the Python process on my machine, without ever showing any windows at all (on Windows 98, I had to resort to Ctrl-Alt-Delete to kill it). Geometry manager combinations can be subtle until you get the hang of this; to make this example work, for instance, we simply need to isolate the grid box in a parent container all its own to keep it away from the packing going on in the root window: root = Tk() frm = Frame(root) frm.pack() # this works gridbox(frm) # gridbox must have its own parent in which to grid packbox(root) Button(root, text='Quit', command=root.quit).pack() mainloop() Again, today you must either pack or grid within one parent, but not both. It's possible that this restriction may be lifted in the future, but seems unlikely given the disparity in the two window manager schemes; try your Python to be sure. 8.6.4 Making Gridded Widgets ExpandableAnd now, some practical bits. The grids we've seen so far are fixed in size; they do not grow when the enclosing window is resized by a user. Example 8-21 implements an unreasonably patriotic input form with both grid and pack again, but adds the configuration steps needed to make all widgets in both windows expand along with their window on a resize. Example 8-21. PP2E\Gui\Tour\Grid\grid3.py# add label and resizing from Tkinter import * colors = ['red', 'white', 'blue'] def gridbox(root): Label(root, text='Grid').grid(columnspan=2) r = 1 for c in colors: l = Label(root, text=c, relief=RIDGE, width=25) e = Entry(root, bg=c, relief=SUNKEN, width=50) l.grid(row=r, column=0, sticky=NSEW) e.grid(row=r, column=1, sticky=NSEW) root.rowconfigure(r, weight=1) r = r+1 root.columnconfigure(0, weight=1) root.columnconfigure(1, weight=1) def packbox(root): Label(root, text='Pack').pack() for c in colors: f = Frame(root) l = Label(f, text=c, relief=RIDGE, width=25) e = Entry(f, bg=c, relief=SUNKEN, width=50) f.pack(side=TOP, expand=YES, fill=BOTH) l.pack(side=LEFT, expand=YES, fill=BOTH) e.pack(side=RIGHT, expand=YES, fill=BOTH) root = Tk() gridbox(Toplevel(root)) packbox(Toplevel(root)) Button(root, text='Quit', command=root.quit).pack() mainloop() When run, this script makes the scene in Figure 8-28. It builds distinct pack and grid windows again, with entry fields on the right colored red, white, and blue (or for readers not working along on a computer: gray, white, and an arguably darker gray). Figure 8-28. grid and pack windows before resizingThis time, though, resizing both windows with mouse drags makes all their embedded labels and entry fields expand along with the parent window, as we see in Figure 8-29. Figure 8-29. grid and pack windows resized<IP_ADDRESS> Resizing in gridsNow that I've shown you what these windows do, I need to explain how they do it. We learned earlier how to make widgets expand with pack: we use expand and fill options to increase space allocations and stretch into them. To make expansion work for widgets arranged by grid, we need to use different protocols: rows and columns must be marked with a weight to make them expandable, and widgets must also be made sticky so that they are stretched within their allocated grid cell:
Different combinations of row and column weights and sticky settings generate different resize effects. For instance, deleting the columnconfig lines in the grid3 script makes the display expand vertically but not horizontally. Try changing some of these settings yourself to see the sorts of effects they produce. <IP_ADDRESS> Spanning columns and rowsThere is one other big difference in how the grid3 script configures its windows. Both the grid and pack windows display a label on the top that spans the entire window. For the packer scheme, we simply make a label attached to the top of the window at large (remember, side defaults to TOP): Label(root, text='Pack').pack() Because this label is attached to the window's top before any row frames are, it appears across the entire window top as expected. But laying out such a label takes a bit more work in the rigid world of grids; the first line of the grid implementation function does it like this: Label(root, text='Grid').grid(columnspan=2) To make a widget span across multiple columns, we pass grid a columnspan option with spanned-column count. Here, it just specifies that the label at the top of the window should stretch over the entire window -- across both the label and entry columns. To make a widget span across multiple rows, pass a rowspan option instead. The regular layouts of grids can be either an asset or a liability, depending on how regular your user interface will be; these two span settings let you specify exceptions to the rule when needed. So which geometry manager comes out on top here? When resizing is factored in, as in this script, gridding actually becomes slightly more complex (in fact, gridding requires three extra lines of code here). On the other hand, grid is nice for simple forms, and your grids and packs may vary. 8.6.5 Laying Out Larger Tables with gridSo far, we've been building two-column arrays of labels and input fields. That's typical of input forms, but the Tkinter grid manager is capable of configuring much grander matrixes. For instance, Example 8-22 builds a five-row by four-column array of labels, where each label simply displays its row and column number (row.col). When run, the window in Figure 8-30 appears on screen. Example 8-22. PP2E\Gui\Tour\Grid\grid4.py# simple 2d table from Tkinter import * for i in range(5): for j in range(4): l = Label(text='%d.%d' % (i, j), relief=RIDGE) l.grid(row=i, column=j, sticky=NSEW) mainloop() Figure 8-30. A 5 x 4 array of coordinates labelsIf you think this is starting to look like it might be a way to program spreadsheets, you may be on to something. Example 8-23 takes this idea a bit further, and adds a button that prints the table's current input field values to the stdout stream (usually, to the console window). Example 8-23. PP2E\Gui\Tour\Grid\grid5.py# 2d table of input fields from Tkinter import * rows = [] for i in range(5): cols = [] for j in range(4): e = Entry(relief=RIDGE) e.grid(row=i, column=j, sticky=NSEW) e.insert(END, '%d.%d' % (i, j)) cols.append(e) rows.append(cols) def onPress(): for row in rows: for col in row: print col.get(), print Button(text='Fetch', command=onPress).grid() mainloop() When run, this script creates the window in Figure 8-31, and saves away all the grid's entry field widgets in a two-dimensional list of lists. When its Fetch button is pressed, the script steps through the saved list of lists of entry widgets, to fetch and display all the current values in the grid. Here is the output of two Fetch presses -- one before I made input field changes, and one after: C:\...\PP2E\Gui\Tour\Grid>python grid5.py 0.0 0.1 0.2 0.3 1.0 1.1 1.2 1.3 2.0 2.1 2.2 2.3 3.0 3.1 3.2 3.3 4.0 4.1 4.2 4.3 0.0 0.1 0.2 42 1.0 1.1 1.2 43 2.0 2.1 2.2 44 3.0 3.1 3.2 45 4.0 4.1 4.2 46 Figure 8-31. A larger grid of input fieldsNow that we know how to build and step through arrays of input fields, let's add a few more useful buttons. Example 8-24 adds another row to display column sums, and buttons to clear all fields to zero and calculate column sums. Example 8-24. PP2E\Gui\Tour\Grid\grid5b.py# add column sums, clearing from Tkinter import * numrow, numcol = 5, 4 rows = [] for i in range(numrow): cols = [] for j in range(numcol): e = Entry(relief=RIDGE) e.grid(row=i, column=j, sticky=NSEW) e.insert(END, '%d.%d' % (i, j)) cols.append(e) rows.append(cols) sums = [] for i in range(numcol): l = Label(text='?', relief=SUNKEN) l.grid(row=numrow, col=i, sticky=NSEW) sums.append(l) def onPrint(): for row in rows: for col in row: print col.get(), print print def onSum(): t = [0] * numcol for i in range(numcol): for j in range(numrow): t[i]= t[i] + eval(rows[j][i].get()) for i in range(numcol): sums[i].config(text=str(t[i])) def onClear(): for row in rows: for col in row: col.delete('0', END) col.insert(END, '0.0') for sum in sums: sum.config(text='?') import sys Button(text='Sum', command=onSum).grid(row=numrow+1, column=0) Button(text='Print', command=onPrint).grid(row=numrow+1, column=1) Button(text='Clear', command=onClear).grid(row=numrow+1, column=2) Button(text='Quit', command=sys.exit).grid(row=numrow+1, column=3) mainloop() Figure 8-32 shows this script at work summing up four columns of numbers; to get a different size table, change the numrow and numcol variables at the top of the script. Figure 8-32. Adding column sumsAnd finally, Example 8-25 is one last extension that is coded as a class for reusability, and adds a button to load the table from a data file. Data files are assumed to be coded as one line per row, with whitespace (spaces or tabs) between each column within a row line. Loading a file of data automatically resizes the table GUI to accommodate the number of columns in the table. Example 8-25. PP2E\Gui\Tour\Grid\grid5c.py# recode as an embeddable class from Tkinter import * from PP2E.Gui.Tour.quitter import Quitter # reuse, pack, and grid class SumGrid(Frame): def __init__(self, parent=None, numrow=5, numcol=5): Frame.__init__(self, parent) self.numrow = numrow # I am a frame container self.numcol = numcol # caller packs or grids me self.makeWidgets(numrow, numcol) # else only usable one way def makeWidgets(self, numrow, numcol): self.rows = [] for i in range(numrow): cols = [] for j in range(numcol): e = Entry(self, relief=RIDGE) e.grid(row=i+1, column=j, sticky=NSEW) e.insert(END, '%d.%d' % (i, j)) cols.append(e) self.rows.append(cols) self.sums = [] for i in range(numcol): l = Label(self, text='?', relief=SUNKEN) l.grid(row=numrow+1, col=i, sticky=NSEW) self.sums.append(l) Button(self, text='Sum', command=self.onSum).grid(row=0, column=0) Button(self, text='Print', command=self.onPrint).grid(row=0, column=1) Button(self, text='Clear', command=self.onClear).grid(row=0, column=2) Button(self, text='Load', command=self.onLoad).grid(row=0, column=3) Quitter(self).grid(row=0, column=4) # fails: Quitter(self).pack() def onPrint(self): for row in self.rows: for col in row: print col.get(), print print def onSum(self): t = [0] * self.numcol for i in range(self.numcol): for j in range(self.numrow): t[i]= t[i] + eval(self.rows[j][i].get()) for i in range(self.numcol): self.sums[i].config(text=str(t[i])) def onClear(self): for row in self.rows: for col in row: col.delete('0', END) col.insert(END, '0.0') for sum in self.sums: sum.config(text='?') def onLoad(self): import string from tkFileDialog import * file = askopenfilename() if file: for r in self.rows: for c in r: c.grid_forget() for s in self.sums: s.grid_forget() filelines = open(file, 'r').readlines() self.numrow = len(filelines) self.numcol = len(string.split(filelines[0])) self.makeWidgets(self.numrow, self.numcol) row = 0 for line in filelines: fields = string.split(line) for col in range(self.numcol): self.rows[row][col].delete('0', END) self.rows[row][col].insert(END, fields[col]) row = row+1 if __name__ == '__main__': import sys root = Tk() root.title('Summer Grid') if len(sys.argv) != 3: SumGrid(root).pack() # .grid() works here too else: rows, cols = eval(sys.argv[1]), eval(sys.argv[2]) SumGrid(root, rows, cols).pack() mainloop() Notice that this module's SumGrid class is careful not to either grid or pack itself. In order to be attachable to containers where other widgets are being gridded or packed, it leaves its own geometry management ambiguous, and requires callers to pack or grid its instances. It's okay for containers to pick either scheme for their own children, because they effectively seal off the pack-or-grid choice. But attachable component classes that aim to be reused under both geometry managers cannot manage themselves, because they cannot predict their parent's policy. This is a fairly long example that doesn't say much else about gridding or widgets in general, so I'll leave most of it as suggested reading and just show what it does. Figure 8-33 shows the initial window created by this script after changing the last column and requesting a sum. Figure 8-33. Adding data file loadsBy default, the class makes the 5-by-5 grid here, but we can pass in other dimensions to both the class constructor and the script's command line. When you press the Load button, you get the standard file selection dialog we met earlier on this tour (Figure 8-34). Figure 8-34. Opening a data file for SumGridData file grid-data1.txt contains seven rows and six columns of data: C:\...\PP2E\Gui\Tour\Grid>type grid5-data1.txt 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 Loading this into our GUI makes the dimensions of the grid change accordingly -- the class simply reruns its widget construction logic after erasing all the old entry widgets with the grid_forget method.[3] Figure 8-35 captures the scene after a file load.
Figure 8-35. Data file loaded, displayed, and summedData file grid5-data2.txt has the same dimensions, but contains expressions in two of its columns, not just simple numbers. Because this script converts input field values with the Python eval built-in function, any Python syntax will work in this table's fields, as long as it can be parsed and evaluated within the scope of the onSum method: C:\...\PP2E\Gui\Tour\Grid>type grid5-data2.txt 1 2 3 2*2 5 6 1 3-1 3 2<<1 5 6 1 5%3 3 pow(2,2) 5 6 1 2 3 2**2 5 6 1 2 3 [4,3][0] 5 6 1 {'a':2}['a'] 3 len('abcd') 5 6 1 abs(-2) 3 eval('2+2') 5 6 Summing these fields runs the Python code they contain, as seen in Figure 8-36. This can be a powerful feature; imagine a full-blown spreadsheet grid, for instance -- field values could be Python code "snippets" that compute values on the fly, call functions in modules, even download current stock quotes over the Internet with tools we'll meet in the next part of this book. It's also a potential dangerous tool -- a field might just contain an expression that erases your hard drive! If you're not sure what expressions may do, either don't use eval (convert with more limited built-in functions like int and float instead), or see Chapter 15 for details on the Python rexec restricted-execution mode module. Figure 8-36. Python expressions in the data and tableOf course, this still is nowhere near a true spreadsheet program; further mutations towards that goal are left as exercises. I should also point out that there is more to gridding than we have time to present fully here. For instance, by creating subframes that have grids of their own, we can build up more sophisticated layouts in much the same way as nested frames arranged with the packer. For now, let's move on to one last widget survey topic. |
| I l@ve RuBoard |


Accession Codes
Experiments and array designs in ArrayExpress are given unique accession numbers in the format of
- E-XXXX-n for experiments
- A-XXXX-n for array designs
XXXX represents a four letter code and n is a number.
E.g. E-MEXP-568, A-UHNC-18. Some experiments also have secondary accession numbers.
Accessions numbers are generated when sufficient meta-data and data files are provided for a submission. Please refer to our FAQ for more details about obtaining accession number for your data set.
The four letter code in the accession number indicates the data source. The source can be:
- ArrayExpress submission tools: MEXP for MIAMExpress (deprecated since July 2014), MTAB for Annotare, and TABM for Tab2MAGE (deprecated since January 2012).
- Data management tools / submisson pipelines from other research organizations (see full list below).
Note that the 4 letter code does not necessarily tell you which organization performed the experiment or manufactured the array design.
Full list of four-letter codes
Please note that some codes are no longer in active use, i.e. they are not used in accession numbers for new submisisons but are still valid. Some URLs are dead, or point to webpages which are out of maintenance, but are included in the table below for completeness.
| Code | Source | URL |
|---|---|---|
| AFFY | Affymetrix | www.affymetrix.com |
| AFMX | Affymetrix data sets processed by an EBI in-house script | |
| AGIL | Agilent | www.agilent.com |
| ATMX | Arabidopsis experiments and array designs submitted through the At-MIAMExpress submission tool | tool deprecated |
| BAIR | Biological Atlas of Insulin Resistance (BAIR) project | www.bair.org.uk |
| BASE | BASE microarray data management tool | base.thep.lu.se |
| BIOD | BioDiscovery microarray data management tool | www.biodiscovery.com |
| BUGS | Bacterial Microarray Group at St George's, University of London (BuG@S) | www.bugs.sgul.ac.uk |
| CAGE | Compendium of Arabidopsis Gene Expression plant developmental time series project | www.cagecompendium.org/index.htm and www.ebi.ac.uk/microarray/cage |
| CBIL | Computational Biology and Informatics Laboratory at University of Pennsylvania | www.cbil.upenn.edu |
| DKFZ | German Cancer Research Center | www.dkfz.de |
| DORD | DDBJ Omics Archive (DOR) | http://trace.ddbj.nig.ac.jp/dor |
| EMBL | European Molecular Biology Laboratory | www.embl.org |
| ERAD | European
Read Archive Data (pipeline submission from Wellcome Trust Sanger
Institute. "European Read Archive" is now renamed the "Sequence Read
Archive" (SRA) as part of INSDC) |
www.sanger.ac.uk NAR article on the SRA |
| FLYC | FlyChip Microarray services, Cambridge Systems Biology Centre, UK | www.flychip.org.uk |
| FPMI | Functional Pathogenomics of Mucosal Immunity project | www.pathogenomics.ca/fpmi |
| GEAD | Genomic Expression Archive (GEA) | www.ddbj.nig.ac.jp/gea/ |
| GEHB | GE Healthcare array designs | www.gehealthcare.com |
| GEOD | NCBI Gene Expression Omnibus (GEO) | www.ncbi.nlm.nih.gov/geo. See also the How data is imported from GEO. |
| GEUV | Genetic European Variation in Health and Disease (GEUVADIS), A European Medical Sequencing Consortium | www.geuvadis.org/web/geuvadis/home. |
| HGMP | Human Genome Mapping Project Resource Centre (now closed) | www.geneservice.co.uk/home |
| IPKG | Leibniz Institute of Plant Genetics and Crop Plant Research (IPK-Gatersleben) | www.ipk-gatersleben.de/Internet |
| JCVI | J. Craig Venter Institute | www.jcvi.org |
| JJRD | Johnson & Johnson Pharmaceutical Research and Development | www.jnjpharmarnd.com |
| LGCL | LGC Limited | www.lgc.co.uk |
| MANP | Coding of experiment was manually prepared by EBI staff | |
| MARS | Microarray Analysis and Retrieval System (MARS) from Graz University of Technology, Institute for Genomics and Bioinformatics | genome.tugraz.at |
| MAXD | University of Manchester, Micorarray Group maxd software | www.bioinf.manchester.ac.uk/microarray/maxd |
| MEXP | EBI MIAMExpress webform submission tool (deprecated since July 2014) | www.ebi.ac.uk/miamexpress |
| MIMR | MiMiR data warehouse at the Microarray Centre, Clinical Sciences Centre, Medical Research Council | www.csc.mrc.ac.uk |
| MNIA | Laboratory of Genetics, National
Institute on Aging, National Institutes of Health |
lgsun.grc.nia.nih.gov |
| MTAB | Experiments in MAGE-TAB format, submitted via the MTAB spreadsheet submission tool (retired in September 2014), or via Annotare | http://www.ebi.ac.uk/fg/annotare/login |
| MUGN | Integrated Functional Genomics in Mutant Mouse Models as Tools to Investigate the Complexity of Human Immunological Disease (MUGEN) project | www.mugen-noe.org and www.ebi.ac.uk/fg/mugen |
| NASC | European Arabidopsis Stock Centre | arabidopsis.info |
| NCMF | Netherlands Cancer Institute Central Microarray Facility | microarrays.nki.nl |
| NGEN | Nimblegen | www.nimblegen.com |
| RUBN | Gerry Rubin's lab | http://www.hhmi.org/research/groupleaders/rubin.html |
| RZPD | RZPD German Resource Center for Genome Research (no long accessible) | www.rzpd.de (old URL) |
| SGRP | Saccharomyces Genome Resequencing Project , Wellcome Trust Sanger Institute | www.sanger.ac.uk/Teams/Team71/durbin/sgrp |
| SMDB | Stanford Micorarray Database (moving to Princeton University, as of January 2013) | http://smd.stanford.edu |
| SNGR | Wellcome Trust Sanger Institute | www.sanger.ac.uk |
| SYBR | Sybaris Project | http://www.sybaris-fp7.eu/ |
| TABM | EBI tab2mage spreadsheet submission
tool (deprecated since January 2012) |
www.ebi.ac.uk/cgi-bin/microarray/tab2mage.cgi |
| TIGR | The Institute for Genomic Research (now part of the J. Craig Venter Institute) | www.tigr.org |
| TOXM | Toxicogenomics experiments | |
| UCON | The Hutchison/MRC Research Centre | www.hutchison-mrc.cam.ac.uk |
| UHNC | University Health Network Canada | www.uhn.ca |
| UMCU | University Medical Center Utrecht | www.umcutrecht.nl/zorg |
| WMIT | Whitehead Institute for Biomedical Research/ Massachusetts Institute of Technology | www.wi.mit.edu |
Secondary accession numbers
Some experiments or array designs have a secondary accession number which links
to another ArrayExpress experiment/array design, or to an external data source. The
secondary accession number is shown in the "Links" section on an experiment's page.
For example, for experiment
E-GEOD-42281:
For array designs, the secondary accession number can be found in the header of the
actual design file (in tab-delimited text format), e.g. for array design
A-GEOD-9349:
Common reasons for secondary accession numbers
- Data re-analysis: if the data provided is a re-analysis of another dataset, the accession number of the original experiment will be the secondary accession number
- NCBI GEO-imported data: experimental data imported from the NCBI Gene Expression Omnibus (GEO) will have the GEO series (prefix "GSE") or data set (prefix "GSD") identifier as the secondary accession number. Similarly, array design will have the GEO platform (prefix "GPL") accession number. The ArrayExpress primary accession and GEO secondary accession for GEO-imported data are intuitively correlated. E.g. GEO accession "GSE12345" would be associated with ArrayExpress accession "E-GEOD-12345" . See also How data is imported from GEO.
- High-throughput sequencing experiments: they will have a link to the European Nucleotide Archive (ENA) or European Genome-phenome Archive (EGA) where the raw data files (e.g. fastq reads) are kept.


Menu
Home
Categories
faqs
Process
Contact
Home
Advancing the Business
of Creativity
All entries must be submitted by
January 31, 2019
.
Categories
Illustration
Photography
Digital Imagery
Cinematic Still
Architectural/Industrial Model
3D Digital Imagery
Has side
Tittle
Has side
Tittle
Has side
Tittle
Has side
Tittle
faqs


Kogito Travel Agency
Plan your next trip with Kogito Travel Agency, it's easy and fast!
Travels
| Traveller name | Destination | Dates | Visa required | Hotel | Flight | Actions |
|---|
Plan your next trip with Kogito Travel Agency, it's easy and fast!
| Traveller name | Destination | Dates | Visa required | Hotel | Flight | Actions |
|---|


Welcome to BusMall's User Testing Site
Below are three images. Click on the one that appeals to you the most. Continue to click one of the three images that most appeals to you, the pictures stop refreshing.
Below are three images. Click on the one that appeals to you the most. Continue to click one of the three images that most appeals to you, the pictures stop refreshing.


FITSIO Home
Next: 9.6.2 Low-Level Table Access
Up: 9.6 Specialized FITS ASCII
Previous: 9.6 Specialized FITS ASCII
Contents
- 1
- Get information about an existing ASCII or binary table column. A null
pointer may be given for any of the output parameters that are not
needed. DATATYPE is a character string which returns the data type
of the column as defined by the TFORMn keyword (e.g., 'I', 'J','E',
'D', etc.). In the case of an ASCII character column, typecode
will have a value of the form 'An' where 'n' is an integer
expressing the width of the field in characters. For example, if
TFORM = '160A8' then ffgbcl will return typechar='A8' and
repeat=20. All the returned parameters are scalar quantities.
int fits_get_acolparms / ffgacl
(fitsfile *fptr, int colnum, > char *ttype, long *tbcol,
char *tunit, char *tform, double *scale, double *zero,
char *nulstr, char *tdisp, int *status)
int fits_get_bcolparms / ffgbcl
(fitsfile *fptr, int colnum, > char *ttype, char *tunit,
char *typechar, long *repeat, double *scale, double *zero,
long *nulval, char *tdisp, int *status)
int fits_get_bcolparmsll / ffgbclll
(fitsfile *fptr, int colnum, > char *ttype, char *tunit,
char *typechar, LONGLONG *repeat, double *scale, double *zero,
LONGLONG *nulval, char *tdisp, int *status)
- 2
- Return optimal number of rows to read or write at one time for
maximum I/O efficiency. Refer to the
``Optimizing Code'' section in Chapter 5 for more discussion on how
to use this routine.
int fits_get_rowsize / ffgrsz
(fitsfile *fptr, long *nrows, *status)
- 3
- Define the zero indexed byte offset of the 'heap' measured from
the start of the binary table data. By default the heap is assumed
to start immediately following the regular table data, i.e., at
location NAXIS1 x NAXIS2. This routine is only relevant for
binary tables which contain variable length array columns (with
TFORMn = 'Pt'). This routine also automatically writes
the value of theap to a keyword in the extension header. This
routine must be called after the required keywords have been
written (with ffphbn)
but before any data is written to the table.
int fits_write_theap / ffpthp
(fitsfile *fptr, long theap, > int *status)
- 4
- Test the contents of the binary table variable array heap, returning
the size of the heap, the number of unused bytes that are not currently
pointed to by any of the descriptors, and the number of bytes which are
pointed to by multiple descriptors. It also returns valid = FALSE if
any of the descriptors point to invalid addresses out of range of the
heap.
int fits_test_heap / fftheap
(fitsfile *fptr, > LONGLONG *heapsize, LONGLONG *unused, LONGLONG *overlap,
int *validheap, int *status)
- 5
- Re-pack the vectors in the binary table variable array heap to recover
any unused space. Normally, when a vector in a variable length
array column is rewritten the previously written array remains in
the heap as wasted unused space. This routine will repack the
arrays that are still in use, thus eliminating any bytes in the
heap that are no longer in use. Note that if several vectors point
to the same bytes in the heap, then this routine will make
duplicate copies of the bytes for each vector, which will actually
expand the size of the heap.
int fits_compress_heap / ffcmph
(fitsfile *fptr, > int *status)
FITSIO Home
Next: 9.6.2 Low-Level Table Access
Up: 9.6 Specialized FITS ASCII
Previous: 9.6 Specialized FITS ASCII
Contents


cb-chip is made for using as a chip in your app.
Single chip
Default chip
Sizes
Small chip
Medium chip
Large chip
With icons
Small chip
Medium chip
Large chip
Colors
Blue chip
Green chip
Orange chip
Gray light chip
Colors with background
Blue chip
Green chip
Orange chip
Gray light chip
Chip list
cb-chip-list is made for creating a wrapper to use more than one cb-chip. It provides spacements between items
Direction: Vertical
Blue chip
Green chip
Orange chip
Direction: Horizontal
Blue chip
Green chip
Orange chip


Suite of low-level modules to read Borland dBASE files (.dbf). Originally designed for use by the Arc/Info Shape File reader.
Interface Specification:
ReadDBFType
module ReadDBFType { string+IPort2 DBFFileName; string+IPort2 ColumnName; int+IPort2 ColumnNumber; int+OPort2 ColumnType; };ReadDBFDate, ReadDBFFloat, ReadDBFInteger, ReadDBFLogical & ReadDBFString
module { string+IPort2 DBFFileName; string+IPort2 ColumnName; int+IPort2 ColumnNumber; int NumberOfValues; prim+OPort2 ColumnValues[NumberOfValues]; };
This library contains a suite of low-level modules for reading dBase database files. The Borland dBase format is a popular database storage format that allows database columns and rows to be stored in a binary structured file. Each column in the database can have a different data type. Hence the module suite contains a module that discovers the type of a column and a column reading module for each type of data. If the specified column is valid and of the appropriate type the column reading module will read the contents of column into an array.
This suite of modules works as a stand-alone dBase reading system. However the suite was originally developed to be used with the ReadShape project that reads Arc/Info Shape files. In the Arc/Info Shape format attributes of the geometry, such as city names, are stored in dBase files. As this suite will generally have to be used as part of a larger system no high-level macros have been developed. An example of the use of this suite can be found in the ReadDbaseEg example application.
The current version of the ReadDbase project adds support for 64 bit platforms. This support has currently only been tested on a SGI Origin 2000.
ReadDBFDate Extracts Date Column ReadDBFFloat Extracts Floating Point (Real) Column ReadDBFInteger Extracts Integer Column ReadDBFLogical Extracts Logical Column ReadDBFString Extracts String Arrays ReadDBFType Identifies Types
DBFFilename
The name of the file that should be read from. The parameter is of type string. The filename should specify the full path name of the file.
ColumnName
The name of the column that should be read into an array. The parameter is of type string. If a column number is also provided then the column name should match the column number.
ColumnNumber
The number of the column that should be read into an array. The parameter is of type int. If a column name is also provided then the column name should match the column number. The first column is numbered 1.
ColumnType
A integer value specifying the data type of the column being examined. The data type can be derived from the resulting value as follows:
- string
- date
- logical
- integer
- float
A value of zero means that the data type was found to be invalid.
NumberOfValues
A integer value specifying the number of values in the column that is being read from. This is used to size the output array that contains the values read from the column.
ColumnValues[]
An array of primitive values containing the data read from the dBase file. The exact type of the array is dependent upon the data type of the data being read. ReadDBFFloat, ReadDBFInteger and ReadDBFString have output arrays of float, int and string as would be expected. As AVS/Express does not have a logical or date data type, ReadDBFLogical is read into a char array and ReadDBFDate is read into a string array. The size of output array is given by the NumberOfValues property.
The ReadDbase suite of modules does not have any user or functional macros. The comb_mesh_and_data module is provided. However this module simply replicates the behaviour of the DVcomb_mesh_and_data module so that the example application can be used with the Visualization edition of AVS/Express.
An example application ReadDbaseEg is provided that reads a supplied dBase file and generates a very simple map from it. The data file contains the coordinates, names, populations and sample dates of several cities. The application reads these values and maps the city names to text-glyphs and the population size to proportionally sized diamond glyphs.
xp_comm_proj/rd_dbase/rddbmods.v contains the V definitions of the suite of dBase reading modules.
xp_comm_proj/rd_dbase/rddbmacs.v contains the V definitions of the comb_mesh_and_data macro and the ReadDbaseEg example application.
This suite of dBase reading modules is implemented by an underlying C++ class system, which is then connected to the AVS/Express cxx module system. Not all possible DBF file entities are mapped. This set of modules has only been extensively tested with DBF files from Arc/Info.
The low-level ReadShapeMods library containing the low-level module suite does not specify a process. By default the express process will be used.
Steve Walker Advanced Visual Systems, Inc. Hanworth Lane, Chertsey Surrey, UK KT16 9JX
Andrew Dodd International AVS Centre


Tioga Pass is where the east entrance of Yosemite National Park is. At almost 10,000ft. elevation that road can be closed until as late as the beginning of July. This has taken many tourists by surprise. Thos same tourists, if they make it over the pass, often have a destination to go to on the same day, so they do not have time to stop or stay to see any of the beauty the area has to offer.
text about Mono Lake


renamed
by Trey Pendragon at 2021-02-26 19:18:24.labeled
by Trey Pendragon at 2021-02-26 19:18:29.renamed
by Trey Pendragon at 2021-02-26 19:22:15.labeled
by Trey Pendragon at 2021-02-26 19:22:18.renamed
by Trey Pendragon at 2021-02-26 19:27:07.referenced
by Trey Pendragon at 2021-02-26 19:28:35.My initial shell script (via marcli) took 51 minutes to process all the MARC files and produce new ones.
If I parallelize the work with 4 concurrent marcli
processes via Linux's native wait and &
the times comes down to around 23-28 minutes (see shell script).
I'll try to run the Ruby and Java versions that @escowles posted and see what the performance looks like.
mentioned
by Esmé Cowles at 2021-02-25 22:56:03.subscribed
by Esmé Cowles at 2021-02-25 22:56:03.Diagram showing the life of our MARC data (from Alma to Solr/Orangelight) https://docs.google.com/presentation/d/1aBVd3A3_O7RrUUSTPaz_bI32Q8z73ZgOlWO_HP5HTq8/edit
added_to_project
by Trey Pendragon at 2021-02-26 19:03:17.added_to_project
by Trey Pendragon at 2021-02-26 19:02:27.closed
by Trey Pendragon at 2021-02-25 22:01:13.unassigned
by Bess Sadler at 2021-02-25 22:14:04.assigned
by Shaun Ellis at 2021-02-25 22:14:04.Resolved by #700
closed
by James R. Griffin III at 2021-02-26 15:02:35.This collection is stored at Firestone Library.
is the collection level note on https://findingaids.princeton.edu/collections/C1596/c6. I am not certain where this is parsed within the XML, but it might already be partially stored into the Solr Document in location_code_ssm
for https://findingaids-beta.princeton.edu/catalog/C1596_c6/raw
@faithc @ccleeton Can you look at this again? I think it's fixed with the reindex.
Yes, this seems better now!
mentioned
by None at 2021-02-25 22:00:45.subscribed
by None at 2021-02-25 22:00:45.mentioned
by Christa Cleeton at 2021-02-25 22:00:45.subscribed
by Christa Cleeton at 2021-02-25 22:00:46.assigned
by Trey Pendragon at 2021-02-25 22:01:34.closed
by Trey Pendragon at 2021-02-26 18:18:40.renamed
by Trey Pendragon at 2021-02-26 19:31:35.convert_to_draft
by Bess Sadler at 2021-02-26 20:34:59.Here's a version with a darkened image, dropshadow, and centering of text.
FYI - axe is not taking the shadow into consideration in its test. This is perfectly acceptable with regard to accessibility though. See: https://www.w3.org/TR/WCAG20-TECHS/G18.html
If the background or the letters vary in relative luminance (or are patterned) then the background around the letters can be chosen or shaded so that the letters maintain a 4.5:1 contrast ratio with the background behind them even if they do not have that contrast ratio with the entire background.
review_requested
by Shaun Ellis at 2021-02-26 20:49:22.closed
by Kevin Reiss at 2021-02-26 17:55:18.closed
by Kevin Reiss at 2021-02-26 17:55:19.closed
by Kevin Reiss at 2021-02-26 17:55:19.head_ref_force_pushed
by Axa Mei Liauw at 2021-02-26 17:34:36.ready_for_review
by Axa Mei Liauw at 2021-02-26 17:54:11.referenced
by Kevin Reiss at 2021-02-26 17:55:18.merged
by Kevin Reiss at 2021-02-26 17:55:18.closed
by Kevin Reiss at 2021-02-26 17:55:18.head_ref_deleted
by Kevin Reiss at 2021-02-26 17:55:21.Looks like lodash is up-to-date now, so this is no longer needed.
closed
by None at 2021-02-26 17:56:24.head_ref_deleted
by None at 2021-02-26 17:56:25.


The following application is written using React Native and JSX. Run on Expo.
The app provides easy access to alert the Rapid Responders network in the Bay Area such as the following:
| User Interface | Resources |
|---|---|
|
-Help Button -Navigation bar |
-Connecting with nonprofits in order to integrate their services into our APP -Having a daily news feed regarding DACA, Immigration, and other local news that could affect families |
| Furthering Software | |
|


JFK A film review by Serdar Yegulalp Copyright 1997 Serdar Yegulalp
CAPSULE: A technical marvel, but an intellectual muddle, and ever so pretentious. Oliver Stone's take on who really killed JFK is compulsively watchable even if indigestible as history.
When I watch a movie that is based, however loosely, on fact, I try to keep "the facts" out of my mind and just watch the movie. With a movie as voluminous and fraught with controversy as JFK, this is darned near impossible, but I think I've managed to keep my feelings about the film in the abstract, and the service that the film has been put to.
In the space of three hours, JFK covers an astonishing amount of information and territory, and presents it in a package that is superbly edited and filmed. It keeps up involved and keeps us tense. What it does not do is provide us with much in the way of real characters, or a story that is not simply a mining of miscellaneous conspiracy theories that, especially after the publication of books like Gerald Posner's CASE CLOSED, pretty hard to defend.
Oliver Stone, the director, has chosen to follow the odd saga of Louisiana district attorney Jim Garrison, who got curious about the assassination after the fact and attempted to prosecute a Louisiana businessman, Clay Shaw, for conspiring to kill JFK. In real life, Garrison's ethics and scruples were questionable to say the least, and the story makes for some eye-opening reading. Stone doesn't hesitate a second to whitewash Garrison: the first time we see him, he's wearing a white shirt, and backlit to give him an angelic glow.
Many of the important details about who Garrison talked to, and when, and under what circumstances, are distorted or omitted entirely. What does come across is a sense of urgency and *grand mal* paranoia that few other movies have managed to match. Even if Garrison is dead wrong -- heck, even if *Stone* is dead wrong -- we can still sense what they must have been going through. The rush of names, places, footage styles, all contribute to the general feelig of truth held over. Even if the feeling is a propagandistic one, the fact that the movie works as well as it does can't be denied.
I had an argument with someone after coming out of the movie -- that JFK should be screened along with Leni Rienfenstahl's TRIUMPH OF THE WILL as a pair of perfect examples of film propaganda. The other man was appalled that I would dare to lump an obvious Nazi sympathizer in with someone as liberally inclined as JFK. I don't remember the conversation getting much further than that, unfortunately.
Rating not applicable.
<EMAIL_ADDRESS>EFNet IRC: GinRei http://www.io.com/~syegul another worldly device...
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


My name is Daniel Nyutu.
I am a student at Moringa school.
This website was created on 18/7/2021.
It contains some favorite pictures.


Welcome To JS-CMS!
JS-CMS is Javascript based cms the generate static HTML pages that will be hosted on CDN (Such as Github Pages, Firebase, etc'.)
This features the ability to build your site without worrying about hosting, performance, or any issue related to the server.
The CMS is Open-source with MIT License.
If you want to contribute - please choose one (or more) of the following paths:
- Donate - support by donating
- Task - Any open issue will help us improve the code.
- Code - you can
Enjoy!


// Make abstract into a single string, putting <s> and </s> tags around
// the sentences.
abstract = " ".join(["%s %s %s" % (SENTENCE_START, sent,
SENTENCE_END) for sent in highlights])
return article, abstract
// Make abstract into a single string, putting <s> and </s> tags around
// the sentences.
abstract = " ".join(highlights)
return article, abstract


- save() - Static method in class com.example.habittracker2017.UserManager
-
Saves the user's current data to file and to the remote database
- SectionsPagerAdapter(FragmentManager) - Constructor for class com.example.habittracker2017.HabitTracker2017MainActivity.SectionsPagerAdapter
-
SectionsPagerAdapter constructor
- setBitmapString(String) - Method in class com.example.habittracker2017.HabitEvent
-
Set bitmapString of this habit event
- setComment(String) - Method in class com.example.habittracker2017.HabitEvent
-
Set comment of this habit event
- setDate(Date) - Method in class com.example.habittracker2017.HabitEvent
-
Set date of this habit event
- setEvents(ArrayList<HabitEvent>) - Method in class com.example.habittracker2017.Habit
-
Set event of this habit type
- setFollowers(ArrayList<String>) - Method in class com.example.habittracker2017.User
-
- setFollowing(ArrayList<String>) - Method in class com.example.habittracker2017.User
-
- setHabit(String) - Method in class com.example.habittracker2017.HabitEvent
-
Set title of this habit event
- setHabitHash() - Method in class com.example.habittracker2017.createHabit
-
Set date checked, put into habitHash
- setHabitHash() - Method in class com.example.habittracker2017.EditHabitActivity
-
Set date checked, put into habitHash
- setHabits(ArrayList<Habit>) - Method in class com.example.habittracker2017.User
-
- setLocation(Location) - Method in class com.example.habittracker2017.HabitEvent
-
Set location of this habit event
- setName(String) - Method in class com.example.habittracker2017.User
-
- setReason(String) - Method in class com.example.habittracker2017.Habit
-
Set reason of this habit type
- setRequests(ArrayList<String>) - Method in class com.example.habittracker2017.User
-
- setSchedule(HashMap<Integer, Boolean>) - Method in class com.example.habittracker2017.Habit
-
Set schedule of this habit type
- setStartDate(Date) - Method in class com.example.habittracker2017.Habit
-
Set startDate of this habit type
- setTitle(String) - Method in class com.example.habittracker2017.Habit
-
Set title of this habit type
- setUserVisibleHint(boolean) - Method in class com.example.habittracker2017.manageSharing
-
- showDetailPopup(Context, Habit) - Method in class com.example.habittracker2017.ExpandableListAdapter
-
Inflate pop up window view, set view contents and display
Shows the details of habit event at position "pos", able to edit event detail and delete the event
- showDetailPopup(Context, int) - Method in class com.example.habittracker2017.HistoryAdapter
-
Inflate pop up window view, set view contents and display
Shows the details of habit event at position "pos", able to edit event detail and delete the event
- sortTodayHabit() - Method in class com.example.habittracker2017.ViewHabitAdapter
-
This method sorts out Habits that is due today from all habits of user
- StatManager - Class in com.example.habittracker2017
-
This class is responsible for habit statistic
- StatManager() - Constructor for class com.example.habittracker2017.StatManager
-
- StatView - Class in com.example.habittracker2017
-
Passed start date of habit and calculates all scheduled days in between start date and end date
compares to habit events, if habit event exists for that date put it in completed array
if no habit event found for it put it in missed
pie chart vals are completed/(completed + missed) and missed/(completed+missed)
- StatView() - Constructor for class com.example.habittracker2017.StatView
-


---
layout: post
title: iso100 and no sun
category:
- Analog
- BlackAndWhite
- Street Photos
tags:
- 35mm
- antónio capelo
- antoniocapelo
- BlackAndWhite
- braga
- canon
- canonet ql17
- film
- fotografia analógica
- photography
- porto
- shutter hell up
- yashica
- yashica me-1
status: publish
type: post
published: true
meta:
_edit_last: '1'
---
Hi there,
I've been busy these last weeks but I can handle the college projects and study marathons pretty well..what gets on my nerves its the damn rain and cold weather we're having!

Well, on the lack of B&W films I decided to use those Agfa Vista 100 that I bought some weeks ago. So a lot of color shots on this post.
Then I decided that I'm not a big fan of color (especially at iso 100) so the second rollI was shot as it were a 400 iso, and I converted most of the pics to B&W. Yeah, I'm mad like that.
Then I decided that I can't do those 2 things at the same time, or I'll get this kind of grainy and "dirty" negatives.
I'm thinking of using these color rolls more and try to develop them with B&W chemicals, so I can save some euros on the lab developing.
The first ones were shot with a Yashica ME-1 and the second one with my trusty canonet ql17.
Have a look:
homecooked
ride back home
out of focus because my arms aren't long enough
TL
yey balloons
resistance
toprockin'
photo of a photo being taken
where I go almost everyday :/
January 31st
yes the usual elevator shot
And now the iso100as400colortob&wphoto experiment begins
homeangled
before the budda power blues concert
and those are the Budda Power Blues
iso100+f1.7 <3
I liked this one in color, so I leaved it that way
some serious issues
S!
"but the point is"
two sides
wizzard
New rolls to come (even more if the sun decides to shine)
A. Capelo


Originalinally developed by Greg Hewgill. Further improvements by Joseph Yoon.
Project page on stackapps.com. Source code on github.com.
SBJson Copyright © 2007-2011 Stig Brautaset. All rights reserved.


rev 38. toggle recording on/off.
Talk With
Use language
EN
JA
FR
DE
IT
LA
KO
ZH
Webhook Url
Name
Channel
Image
State
Result


t
Posted on April 30, 2017
The Fourteenth Blog Post!
What did you do this past week?
This week was spent going to class and preparing for the exam. With no project due, there's no lab progress to report, and no strange bugs or unexpected difficulties to express.
What will you do next week?
The coming week will be spent doing nearly exactly the same thing. I have some improvement I definitely need to make from the last exam. I am however optomistic, as my notes this time are MUCH better, and I won't have to rely simply on the files that are up on the website. They're excellent supplements, but without the notes they're just code without any explanation as to why.
What's in the way?
I have to wrap up a more than a few things for the final week of the semester. I have a final project and paper due in the Ethical Hakcing Course, and I have to continue to hunt for an apartment, as I am now a real person who has to do adult things, unfortunately.
What's my experience in the class?
I'm a bit frightened for the upcoming test. I'm still not sure what exactly ill be on it, and the last one definitely caught me by surprise. There was much less general understanding and exstensions of concepts and more C++ minutae, which I am not nearly as good at.
What's the tip of the week?
Take good notes! Without good notes, studying for the test is not fun at all. Downing documents any code we write very well, but obviously the files that are put up on the website are static. And the most important thing to do is not to understand only what the code is doing, but understanding why it's doing that.


First Aid in children
Learning basic first aid skills which might save a human life is paramount, and yet often neglected. In unexpected situations, we would give a lot to know how to help a child who is choking, burned, dealing with a nosebleed or loss of consciousness. However, in such cases, the most valuable commodity is time, so it's worth knowing how to behave and how to effectively perform first aid.
While caring for small children, various types of accidents can happen, sometimes harmless, requiring only our intervention, sometimes very serious, when emergency assistance is needed. That is why it is so important not to spend time searching for knowledge online but rather to be able to help someone in need quickly and efficiently. In emergency situations, knowing what to do can make a huge difference when waiting for the emergency services to arrive.
When giving premedical help to a child, the set of actions to be performed varies, depending on their age: infant - under 1 year old, • child - over 1 year of age until reaching puberty, adult - children who have already reached puberty, and adults.
 There are two types of obstruction:
-
partial - the airways are not closed, air flow is possible. The most common defensive reflex of the body is coughing.
-
total - foreign matter in the respiratory tract closes the lumen of the duct and cuts off the access of air. In this case, the injured person is not able to speak, cough or breathe. Initially, the audible whistling of air in the airways calms down and the victim is exposed to loss of consciousness.
How can you help a choking infant?
In the event that the cough is effective, you only need to watch the child. If the child is conscious but not coughing or if the coughing is not effective, then:
-
1. kneel and place the child on your forearm with the head facing downwards,
-
2. hold the child’s lower jaw with your thumb and index finger, while tilting their head back and opening the airway (do not hold their neck!),
-
3. perform 5 blows with the base of the wrist in the inter-shoulder area,
-
4. after the impacts, check whether the foreign body has been removed from the respiratory tract or whether it is not in the mouth, from where it can be pulled out with a small finger.
If the above actions fail, you should:
-
1. turn the infant on their back on the other forearm (head still down),
-
2. embrace the baby's occiput with your hand,
-
3. indicate the place to compress the chest (lower half of the sternum, 1 finger wide above the end),
-
4. perform 5 chest compressions.
Then repeat both steps alternately (5 strokes and 5 compressions) until the foreign body is removed.
If the infant loses consciousness, resuscitation is required! Start with 5 breaths to push the foreign body deeper, even if it falls into one of the lungs, it will allow the other lung to breathe.
How do you help a child over 1 year old?
In the event that the cough results, you should only encourage the cough and watch the child. If the child is conscious but not coughing or coughing is not effective, then:
-
1. stand behind the child,
-
2. put your hand under the child's rib cage and bend them forward,
-
3. 5 back blows with the heel of your hand should be administered into the inter-shoulder space,
-
4. after each back blow, check whether the foreign body has been removed from the respiratory tract.
If the above actions fail, you should:
-
1. stand behind the child and put your arms around their upper abdomen,
-
2. lean the child forward
-
3. put your fist, covered by the other hand, between the child’s navel and breastbone,
-
4. press the epigastric region 5 times while moving inwards and upwards, without applying pressure to the rib cage.
Then repeat both steps alternately (5 strokes and 5 compressions) until the foreign body is removed.
Nosebleed
Quite a common phenomenon, especially in young people. In this situation
-
1. convince the child to sit down with the head extended and tilted forward,
-
2. tighten both sides of the nose for 10 minutes,
-
3. if blood runs down the throat, it should not be swallowed, it must be spat out,
-
4. you can cool your child's neck and forehead with cold compresses.
Dealing with burns
In the event of a burn, the steps you should take are as follows:
-
1. remove clothing from the burned area,
-
2. rinse the wound thoroughly with running water or, if this is not possible, apply a hydrogel wrap,
-
3. call for medical help or go to the hospital.
Preventing tick bites
Tick exposure can occur year-round, but ticks are most active during warmer months (April-September).
Before You Go Outdoors:
-
• Know where to expect ticks. Ticks live in grassy, brushy, or wooded areas, or even on animals. Spending time outside walking your dog, camping, gardening, or hunting could bring you in close contact with ticks. Many people get ticks in their own yard or neighborhood.
-
• Treat clothing and gear with products containing 0.5% permethrin. Permethrin can be used to treat boots, clothing and camping gear and remain protective through several washings. Alternatively, you can buy permethrin-treated clothing and gear.
-
• Use Oil of Lemon Eucalyptus (OLE)
-
• Avoid Contact with Ticks - wooded and brushy areas with high grass and leaf litter.
After You Come Indoors
-
Check your clothing for ticks. Ticks may be carried into the house on clothing. Any ticks that are found should be removed.  If the clothes are damp, additional time may be needed. If the clothes require washing first, hot water is recommended. Cold and medium temperature water will not kill ticks.
-
Examine gear and pets. Ticks can ride into the home on clothing and pets, then attach to a person later, so carefully examine pets, coats, and daypacks.
-
Shower soon after being outdoors. Showering within two hours of coming indoors has been shown to reduce your risk of getting Lyme disease and may be effective in reducing the risk of other tickborne diseases. Showering may help wash off unattached ticks and it is a good opportunity to do a tick check.
-
Check your body for ticks after being outdoors. Conduct a full body check upon return from potentially tick-infested areas, including your own backyard. Use a hand-held or full-length mirror to view all parts of your body. Check these parts of your body and your child’s body for ticks:
If you find a tick attached to your skin, there’s no need to panic—the key is to remove the tick as soon as possible. There are several tick removal devices on the market, but a plain set of fine-tipped tweezers work very well.
How to remove a tick
-
Use fine-tipped tweezers to grasp the tick as close to the skin’s surface as possible
-
Pull upward with steady, even pressure. Don’t twist or jerk the tick; this can cause the mouth-parts to break off and remain in the skin. If this happens, remove the mouth-parts with tweezers. If you are unable to remove the mouth easily with clean tweezers, leave it alone and let the skin heal.
-
After removing the tick, thoroughly clean the bite area and your hands with rubbing alcohol or soap and water.
-
Never crush a tick with your fingers. Dispose of a live tick by putting it in alcohol, placing it in a sealed bag/container, wrapping it tightly in tape, or flushing it down the toilet.


climate disease change food Campylobacter Salmonella Health incidence {border-style Food cases study likely px;} #ffffff;} impacts Infect associated food-borne infections However, weather changes review England Epidemiol impact important reported studies temperature Climate increase infection ./S Agency Environ Public change. factors health infectious monitoring risk Int Lake London Protection Standards affect affected areas diseases environment estimated example higher increasing levels mechanisms public px; rural terms {font-family Environmental Scotland ambient article collab: evidence font-size illness intestinal new number potential salmonella use (e.g. Campylobacter, Dis age campylobacter double; elevated pathways risks safety socioeconomic sources systems uncertainty understanding Cowden Disease Hunter New Nichols Therefore, available border-color border-width chain community consumption effects foodborne future human importance pathogens prices recent report solid; source transmission {font-style {font-weight Foodborne Infectious Ireland Kovats Open Research Risk Strachan UK, Wales adaptation addition animal annual assessment bold campylobacteriosis changing consider cost costs courier; determinants different early em; highly increased increases leading major older patterns poultry pt;} quality research resilience role salmonellosis supplementary using warmer


Harp
just music.™
What would you like to listen to?
Create a custom playlist by adding your favorite songs.


Ever wanted to…
It’s based on declarative W3C standards.
It works with HTML, SVG and XML.
with the following demos!
Learn more… Restart Download!


Independent t-tests and the 83% confidence interval: A useful trick for eyeballing your data.
30 Nov 2014Like most people who have analyzed data using frequentist statistics, I have often found myself staring at error bars and trying to guess whether my results are significant. When comparing two independent sample means, this practice is confusing and difficult. The conventions that we use for testing differences between sample means are not aligned with the conventions we use for plotting error bars. As a result, it’s fair to say that there’s a lot of confusion about this issue.
Some people believe that two independent samples have significantly different means if and only if their standard error bars (68% confidence intervals for large samples) don’t overlap. This belief is incorrect. Two samples can have nonoverlapping standard error bars and still fail to reach statistical significance at \(\alpha=.05\). Other people believe that two means are significantly different if and only if their 95% confidence intervals overlap. This belief is also incorrect. For one sample t-tests, it is true that significance is reached when the 95% confidence interval crosses the test parameter \(\mu_0\). But for two-sample t-tests, which are more common in research, statistical significance can occur with overlapping 95% confidence intervals.
If neither the 68% confidence interval nor the 95% confidence interval tells us anything about statistical significance, what does? In most situations, the answer is the 83.4% confidence interval. This can be seen in the figure below, which shows two samples with a barely significant difference in means (p=.05). Only the 83.4% confidence intervals shown in the third panel are barely overlapping, reflecting the barely significant results.
To understand why, let’s start by defining the t-statistic for two independent samples:
\[\begin{align} t = \frac{\overline{X_1} - \overline{X_2}}{\sqrt{se_1^2 + se_2^2}} \end{align}\]where \(\overline{X_1}\) and \(\overline{X_2}\) are the means of the two samples, and \(se_1\) and \(se_2\) are their standard errors. By rearranging, we can see that significant results will be barely obtained (\(p=.05\)) if the following condition holds:
\[\begin{align} \overline{X_1} - \overline{X_2} = 1.96\times\sqrt{se_1^2 + se_2^2} \end{align}\]where 1.96 is the large sample \(t\) cutoff for significance. Assuming equal standard errors (more on this later), the equation simplifies to:
\[\begin{align} \overline{X_1} - \overline{X_2} = 1.96\times{\sqrt{2}}\times{se} \end{align}\]On a graph, the quantity \(\overline{X_1} - \overline{X_2}\) is the distance between the means. If we want our error bars to just barely touch each other, we should set the length of the half-error bar to be exactly half of this, or:
\[\begin{align} 1.386\times{se} \end{align}\]This corresponds to an 83.4% confidence interval on the normal distribution. While this result assumes a large sample size, it remains quite useful for sample sizes as low as 20. The 83.4% confidence interval can also become slightly less useful when the samples have strongly different standard errors, which can stem from very unequal sample sizes or variances. If you really want a solution that generalizes to this situation, you can set your half-error bar on your first sample to:
\[\begin{align} \frac{1.96\times{\sqrt{se_1^2 + se_2^2}}\times{se_1}}{se_1^2 + se_2^2} \end{align}\]and make the appropriate substitutions to compute the half-error bar in your second sample. However, this solution has the undesirable property that the error bar for one sample depends on the standard error of the other sample. For most purposes, it’s probably better to just plot the 83% confidence interval. If you are eyeballing data for a project that requires frequentist statistics, it is arguably more useful than plotting the standard error or the 95% confidence interval.
Update: Jeff Rouder helpfully points me to Tryon and Lewis (2008), which presents an error bar that generalizes both to unequal standard errors and small samples. Like the last equation presented above, it has the undesirable property that the size of the error bar around a particular sample depends on both samples. But on the plus side, it’s guaranteed to tell you about significance.