Before you read this part of the chapter, you should have already installed iptables as described in the previous section.
The general purpose of a firewall is to protect a computer or a network against malicious access.
In a perfect world, every daemon or service on every machine is perfectly configured and immune to flaws such as buffer overflows or other problems regarding its security. Furthermore, you trust every user accessing your services. In this world, you do not need to have a firewall.
In the real world however, daemons may be misconfigured and exploits against essential services are freely available. You may wish to choose which services are accessible by certain machines or you may wish to limit which machines or applications are allowed external access. Alternatively, you may simply not trust some of your applications or users. You are probably connected to the Internet. In this world, a firewall is essential.
Don't assume however, that having a firewall makes careful configuration redundant, or that it makes any negligent misconfiguration harmless. It doesn't prevent anyone from exploiting a service you intentionally offer but haven't recently updated or patched after an exploit went public. Despite having a firewall, you need to keep applications and daemons on your system properly configured and up to date.
The word firewall can have several different meanings.
This is a hardware device or software program commercially sold (or offered via freeware) by companies such as Symantec which claims that it secures a home or desktop computer connected to the Internet. This type of firewall is highly relevant for users who do not know how their computers might be accessed via the Internet or how to disable that access, especially if they are always online and connected via broadband links.
This is a system placed between the Internet and an intranet. To minimize the risk of compromising the firewall itself, it should generally have only one role—that of protecting the intranet. Although not completely risk free, the tasks of doing the routing and IP masquerading (rewriting IP headers of the packets it routes from clients with private IP addresses onto the Internet so that they seem to come from the firewall itself) are commonly considered relatively secure.
This is often an old computer you may have retired and nearly forgotten, performing masquerading or routing functions, but offering non-firewall services such as a web-cache or mail. This may be used for home networks, but is not to be considered as secure as a firewall only machine because the combination of server and router/firewall on one machine raises the complexity of the setup.
This box performs masquerading or routing, but grants public access to some branch of your network which, because of public IPs and a physically separated structure, is essentially a separate network with direct Internet access. The servers on this network are those which must be easily accessible from both the Internet and intranet. The firewall protects both networks. This type of firewall has a minimum of three network interfaces.
This introduction on how to setup a firewall is not a complete guide to securing systems. Firewalling is a complex issue that requires careful configuration. The scripts quoted here are simply intended to give examples of how a firewall works. They are not intended to fit into any particular configuration and may not provide complete protection from an attack.
Customization of these scripts for your specific situation will be necessary for an optimal configuration, but you should make a serious study of the iptables documentation and creating firewalls in general before hacking away. Have a look at the list of links for further reading at the end of this section for more details. There you will find a list of URLs that contain quite comprehensive information about building your own firewall.
The firewall configuration script installed in the iptables section differs from the standard configuration script. It only has two of the standard targets: start and status. The other targets are clear and lock. For instance if you issue:
/etc/rc.d/init.d/iptables start
the firewall will be restarted just as it is upon system startup. The status target will present a list of all currently implemented rules. The clear target turns off all firewall rules and the lock target will block all packets in and out of the computer with the exception of the loopback interface.
The main startup firewall is located in the file /etc/rc.d/rc.iptables
. The sections below provide
three different approaches that can be used for a system.
You should always run your firewall rules from a script. This ensures consistency and a record of what was done. It also allows retention of comments that are essential for understanding the rules long after they were written.
A Personal Firewall is designed to let you access all the services offered on the Internet, but keep your box secure and your data private.
Below is a slightly modified version of Rusty Russell's recommendation from the Linux 2.4 Packet Filtering HOWTO. It is still applicable to the Linux 2.6 kernels.
cat > /etc/rc.d/rc.iptables << "EOF"
#!/bin/sh
# Begin rc.iptables
# Insert connection-tracking modules
# (not needed if built into the kernel)
modprobe nf_conntrack
modprobe xt_LOG
# Enable broadcast echo Protection
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Disable Source Routed Packets
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
echo 0 > /proc/sys/net/ipv4/conf/default/accept_source_route
# Enable TCP SYN Cookie Protection
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Disable ICMP Redirect Acceptance
echo 0 > /proc/sys/net/ipv4/conf/default/accept_redirects
# Do not send Redirect Messages
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
# Drop Spoofed Packets coming in on an interface, where responses
# would result in the reply going out a different interface.
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
# Log packets with impossible addresses.
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
echo 1 > /proc/sys/net/ipv4/conf/default/log_martians
# be verbose on dynamic ip-addresses (not needed in case of static IP)
echo 2 > /proc/sys/net/ipv4/ip_dynaddr
# disable Explicit Congestion Notification
# too many routers are still ignorant
echo 0 > /proc/sys/net/ipv4/tcp_ecn
# Set a known state
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# These lines are here in case rules are already in place and the
# script is ever rerun on the fly. We want to remove all rules and
# pre-existing user defined chains before we implement new rules.
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
# Allow local-only connections
iptables -A INPUT -i lo -j ACCEPT
# Free output on any interface to any ip for any service
# (equal to -P ACCEPT)
iptables -A OUTPUT -j ACCEPT
# Permit answers on already established connections
# and permit new connections related to established ones
# (e.g. port mode ftp)
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Log everything else. What's Windows' latest exploitable vulnerability?
iptables -A INPUT -j LOG --log-prefix "FIREWALL:INPUT "
# End $rc_base/rc.iptables
EOF
chmod 700 /etc/rc.d/rc.iptables
This script is quite simple, it drops all traffic coming into your computer that wasn't initiated from your computer, but as long as you are simply surfing the Internet you are unlikely to exceed its limits.
If you frequently encounter certain delays at accessing FTP servers, take a look at BusyBox example number 4.
Even if you have daemons or services running on your system, these will be inaccessible everywhere but from your computer itself. If you want to allow access to services on your machine, such as ssh or ping, take a look at BusyBox.
A true Firewall has two interfaces, one connected to an intranet, in this example eth0, and one connected to the Internet, here ppp0. To provide the maximum security for the firewall itself, make sure that there are no unnecessary servers running on it such as X11 et al. As a general principle, the firewall itself should not access any untrusted service (think of a remote server giving answers that makes a daemon on your system crash, or even worse, that implements a worm via a buffer-overflow).
cat > /etc/rc.d/rc.iptables << "EOF"
#!/bin/sh
# Begin rc.iptables
echo
echo "You're using the example configuration for a setup of a firewall"
echo "from Beyond Linux From Scratch."
echo "This example is far from being complete, it is only meant"
echo "to be a reference."
echo "Firewall security is a complex issue, that exceeds the scope"
echo "of the configuration rules below."
echo "You can find additional information"
echo "about firewalls in Chapter 4 of the BLFS book."
echo "http://www.linuxfromscratch.org/blfs"
echo
# Insert iptables modules (not needed if built into the kernel).
modprobe nf_conntrack
modprobe nf_conntrack_ftp
modprobe xt_conntrack
modprobe xt_LOG
modprobe xt_state
# Enable broadcast echo Protection
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Disable Source Routed Packets
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
# Enable TCP SYN Cookie Protection
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Disable ICMP Redirect Acceptance
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
# Don't send Redirect Messages
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
# Drop Spoofed Packets coming in on an interface where responses
# would result in the reply going out a different interface.
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
# Log packets with impossible addresses.
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
# Be verbose on dynamic ip-addresses (not needed in case of static IP)
echo 2 > /proc/sys/net/ipv4/ip_dynaddr
# Disable Explicit Congestion Notification
# Too many routers are still ignorant
echo 0 > /proc/sys/net/ipv4/tcp_ecn
# Set a known state
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# These lines are here in case rules are already in place and the
# script is ever rerun on the fly. We want to remove all rules and
# pre-existing user defined chains before we implement new rules.
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
# Allow local connections
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Allow forwarding if the initiated on the intranet
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD ! -i ppp+ -m conntrack --ctstate NEW -j ACCEPT
# Do masquerading
# (not needed if intranet is not using private ip-addresses)
iptables -t nat -A POSTROUTING -o ppp+ -j MASQUERADE
# Log everything for debugging
# (last of all rules, but before policy rules)
iptables -A INPUT -j LOG --log-prefix "FIREWALL:INPUT "
iptables -A FORWARD -j LOG --log-prefix "FIREWALL:FORWARD "
iptables -A OUTPUT -j LOG --log-prefix "FIREWALL:OUTPUT "
# Enable IP Forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
EOF
chmod 700 /etc/rc.d/rc.iptables
With this script your intranet should be reasonably secure against external attacks. No one should be able to setup a new connection to any internal service and, if it's masqueraded, makes your intranet invisible to the Internet. Furthermore, your firewall should be relatively safe because there are no services running that a cracker could attack.
If the interface you're connecting to the Internet doesn't
connect via PPP, you will need to change <ppp+>
to the name of the
interface (e.g., eth1) which you are using.
This scenario isn't too different from the Masquerading Router, but additionally offers some services to your intranet. Examples of this can be when you want to administer your firewall from another host on your intranet or use it as a proxy or a name server.
Outlining a true concept of how to protect a server that offers services on the Internet goes far beyond the scope of this document. See the references at the end of this section for more information.
Be cautious. Every service you have enabled makes your setup more complex and your firewall less secure. You are exposed to the risks of misconfigured services or running a service with an exploitable bug. A firewall should generally not run any extra services. See the introduction to the Masquerading Router for some more details.
If you want to add services such as internal Samba or name servers that do not need to access the Internet themselves, the additional statements are quite simple and should still be acceptable from a security standpoint. Just add the following lines into the script before the logging rules.
iptables -A INPUT -i ! ppp+ -j ACCEPT
iptables -A OUTPUT -o ! ppp+ -j ACCEPT
If daemons, such as squid, have to access the Internet themselves, you could open OUTPUT generally and restrict INPUT.
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -j ACCEPT
However, it is generally not advisable to leave OUTPUT unrestricted. You lose any control over trojans who would like to "call home", and a bit of redundancy in case you've (mis-)configured a service so that it broadcasts its existence to the world.
To accomplish this, you should restrict INPUT and OUTPUT on all ports except those that it's absolutely necessary to have open. Which ports you have to open depends on your needs: mostly you will find them by looking for failed accesses in your log files.
 Although there's really little harm in this, having an identd running is not recommended because many security experts feel the service gives out too much additional information.
To avoid these delays you could reject the requests with a 'tcp-reset':
iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset
To log and drop invalid packets (packets that came in after netfilter's timeout or some types of network scans) insert these rules at the top of the chain:
iptables -I INPUT 0 -p tcp -m conntrack --ctstate INVALID \
-j LOG --log-prefix "FIREWALL:INVALID "
iptables -I INPUT 1 -p tcp -m conntrack --ctstate INVALID -j DROP
Anything coming from the outside should not have a private address, this is a common attack called IP-spoofing:
iptables -A INPUT -i ppp+ -s <IP_ADDRESS>/8 -j DROP
iptables -A INPUT -i ppp+ -s <IP_ADDRESS>/12 -j DROP
iptables -A INPUT -i ppp+ -s <IP_ADDRESS>/16 -j DROP
There are other addresses that you may also want to drop: <IP_ADDRESS>/8, <IP_ADDRESS>/8, <IP_ADDRESS>/3 (multicast and experimental), <IP_ADDRESS>/16 (Link Local Networks), and <IP_ADDRESS>/24 (IANA defined test network).
If your firewall is a DHCP client, you need to allow those packets:
iptables -A INPUT -i ppp0 -p udp -s <IP_ADDRESS> --sport 67 \
-d <IP_ADDRESS> --dport 68 -j ACCEPT
To simplify debugging and be fair to anyone who'd like to access a service you have disabled, purposely or by mistake, you could REJECT those packets that are dropped.
Obviously this must be done directly after logging as the very last lines before the packets are dropped by policy:
iptables -A INPUT -j REJECT
These are only examples to show you some of the capabilities of
the firewall code in Linux. Have a look at the man page of
iptables. There you will find much more information. The port
numbers needed for this can be found in /etc/services
, in case you didn't find them by
trial and error in your log file.
Finally, there is one fact you must not forget: The effort spent attacking a system corresponds to the value the cracker expects to gain from it. If you are responsible for valuable information, you need to spend the time to protect it properly.
www.netfilter.org - Homepage of the netfilter/iptables project
Netfilter related FAQ
Netfilter related HOWTO's
en.tldp.org/LDP/nag2/x-087-2-firewall.html
en.tldp.org/HOWTO/Security-HOWTO.html
en.tldp.org/HOWTO/Firewall-HOWTO.html
www.linuxsecurity.com/docs/
www.little-idiot.de/firewall (German & outdated, but very comprehensive)
linux.oreillynet.com/pub/a/linux/2000/03/10/netadmin/ddos.html
staff.washington.edu/dittrich/misc/ddos
www.e-infomax.com/ipmasq
www.circlemud.org/~jelson/writings/security/index.htm
www.securityfocus.com
www.cert.org - tech_tips
security.ittoolbox.com
www.insecure.org/reading.html
Last updated on 2020-02-26 08:20:10 -0800


Teamplay is at the heart of what we do.
Who is behind Moneo?
Moneo is an idea that consists of people. We are doers, enablers, problem solvers, approachers, disrupters, stargazers, communicators, developers, dreamers, future shapers, and leaders...
What does Moneo do?
We develop, apply, maintain, scale, test, implement, research and execute... See the job openings and seize the opportunity to be one of us.


All users of Pivot4D gain access to our support staff. You received training and ongoing support as required.


Created 21 Apr 2020 by Charles for Aurinoco by full clone of Template UPS - diogont (thanks Diogo Teixeira) then: . Added macros: .. {$UPS_BATTERY_VOLTAGE_LOW} .. {$UPS_BATTERY_VOLTAGE_VERY_LOW} . Deleted unpopulated and incredible items: .. UPS battery capacity (%) .. UPS battery temperature .. UPS input current .. UPS input power .. UPS run time remaining .. UPS time on battery . Fixed item: UPS battery voltage . Added triggers for: .. UPS battery voltage low .. UPS battery voltage very low
Template for Microtek MAX + SERIES 2kVA
Created 20 Apr 2020 by Charles for Aurinoco by full clone of Template UPS - diogont (thanks Diogo Teixeira) then:
Updated 27 Jun 2020: triggers made dependent on “not link down”
Updated 3 Sep 2020: Mikrotek changed to Microtek
Administration > General > Macros: SNMP_COMMUNITY
Download the file (link below).
Configuration > Templates > Import > browse to the downloaded file > Import
Configure a host > Templates > Link new templates > search for Template UPS Microtek MAX plus SERIES 2kVA > Add
This template is distributed under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
Copyright (c) Charles Michael Atkinson
| Charles M Atkinson (c | at | charlesmatkinson | dot | org) |
| Name | Description | Default | Type |
|---|---|---|---|
| {$UPS_BATT_VOLT_LOW} |
95.8% of 72
 | 69 |
Text macro |
| {$UPS_BATT_VOLT_VERY_LOW} |
91.7% of 72
 | 66 |
Text macro |
| Name |
|---|
| Template Module ICMP Ping |
There are no discovery rules in this template.
| Name | Description | Type | Key and additional info |
|---|---|---|---|
| Uptime |
-
 | SNMP agent |
sysUpTime
Update: 60
 |
| UPS output current |
-
 | SNMP agent |
upsAdvOutputCurrent
Update: 60
 |
| UPS input voltage |
-
 | SNMP agent |
upsAdvInputVoltage
Update: 60
 |
| Device Location |
-
 | SNMP agent |
sysLocation
Update: 24h
 |
| Software version (full) |
-
 | SNMP agent |
sysDescr
Update: 60
 |
| UPS output load (%) |
-
 | SNMP agent |
upsAdvOutputLoad
Update: 60
 |
| UPS output frequency |
-
 | SNMP agent |
upsAdvOutputFrequency
Update: 60
 |
| UPS battery status |
-
 | SNMP agent |
upsBasicBatteryStatus
Update: 300
 |
| UPS output voltage |
-
 | SNMP agent |
upsAdvOutputVoltage
Update: 60
 |
| Contact |
-
 | SNMP agent |
sysContact
Update: 24h
 |
| Device Name |
-
 | SNMP agent |
sysName
Update: 24h
 |
| UPS output power |
-
 | SNMP agent |
upsAdvOutputPower
Update: 60
 |
| UPS battery voltage |
-
 | SNMP agent |
upsBasicBatteryVoltage
Update: 60
 |
There are no triggers in this template.
Created 21 Apr 2020 by Charles for Aurinoco by full clone of Template UPS - diogont (thanks Diogo Teixeira) then: . Added macros: .. {$UPS_BATTERY_VOLTAGE_LOW} .. {$UPS_BATTERY_VOLTAGE_VERY_LOW} . Deleted unpopulated and incredible items: .. UPS battery capacity (%) .. UPS battery temperature .. UPS input current .. UPS input power .. UPS run time remaining .. UPS time on battery . Fixed item: UPS battery voltage . Added triggers for: .. UPS battery voltage low .. UPS battery voltage very low
Template for Microtek MAX + SERIES 2kVA
Created 20 Apr 2020 by Charles for Aurinoco by full clone of Template UPS - diogont (thanks Diogo Teixeira) then:
Updated 27 Jun 2020: triggers made dependent on “not link down”
Updated 3 Sep 2020: Mikrotek changed to Microtek
Administration > General > Macros: SNMP_COMMUNITY
Download the file (link below).
Configuration > Templates > Import > browse to the downloaded file > Import
Configure a host > Templates > Link new templates > search for Template UPS Microtek MAX plus SERIES 2kVA > Add
This template is distributed under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
Copyright (c) Charles Michael Atkinson
| Charles M Atkinson (c | at | charlesmatkinson | dot | org) |
| Name | Description | Default | Type |
|---|---|---|---|
| {$UPS_BATT_VOLT_LOW} |
95.8% of 72
 | 69 |
Text macro |
| {$UPS_BATT_VOLT_VERY_LOW} |
91.7% of 72
 | 66 |
Text macro |
| Name |
|---|
| Template Module ICMP Ping |
There are no discovery rules in this template.
| Name | Description | Type | Key and additional info |
|---|---|---|---|
| UPS output frequency |
-
 | SNMP agent |
upsAdvOutputFrequency
Update: 60
 |
| UPS output voltage |
-
 | SNMP agent |
upsAdvOutputVoltage
Update: 60
 |
| Device Name |
-
 | SNMP agent |
sysName
Update: 24h
 |
| UPS output power |
-
 | SNMP agent |
upsAdvOutputPower
Update: 60
 |
| Software version (full) |
-
 | SNMP agent |
sysDescr
Update: 60
 |
| UPS battery status |
-
 | SNMP agent |
upsBasicBatteryStatus
Update: 300
 |
| Uptime |
-
 | SNMP agent |
sysUpTime
Update: 60
 |
| UPS output current |
-
 | SNMP agent |
upsAdvOutputCurrent
Update: 60
 |
| Contact |
-
 | SNMP agent |
sysContact
Update: 24h
 |
| UPS battery voltage |
-
 | SNMP agent |
upsBasicBatteryVoltage
Update: 60
 |
| Device Location |
-
 | SNMP agent |
sysLocation
Update: 24h
 |
| UPS output load (%) |
-
 | SNMP agent |
upsAdvOutputLoad
Update: 60
 |
| UPS input voltage |
-
 | SNMP agent |
upsAdvInputVoltage
Update: 60
 |
There are no triggers in this template.
Created 21 Apr 2020 by Charles for Aurinoco by full clone of Template UPS - diogont (thanks Diogo Teixeira) then: . Added macros: .. {$UPS_BATTERY_VOLTAGE_LOW} .. {$UPS_BATTERY_VOLTAGE_VERY_LOW} . Deleted unpopulated and incredible items: .. UPS battery capacity (%) .. UPS battery temperature .. UPS input current .. UPS input power .. UPS run time remaining .. UPS time on battery . Fixed item: UPS battery voltage . Added triggers for: .. UPS battery voltage low .. UPS battery voltage very low
Template for Microtek MAX + SERIES 2kVA
Created 20 Apr 2020 by Charles for Aurinoco by full clone of Template UPS - diogont (thanks Diogo Teixeira) then:
Updated 27 Jun 2020: triggers made dependent on “not link down”
Updated 3 Sep 2020: Mikrotek changed to Microtek
Administration > General > Macros: SNMP_COMMUNITY
Download the file (link below).
Configuration > Templates > Import > browse to the downloaded file > Import
Configure a host > Templates > Link new templates > search for Template UPS Microtek MAX plus SERIES 2kVA > Add
This template is distributed under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
Copyright (c) Charles Michael Atkinson
| Charles M Atkinson (c | at | charlesmatkinson | dot | org) |
| Name | Description | Default | Type |
|---|---|---|---|
| {$UPS_BATT_VOLT_LOW} |
95.8% of 72
 | 69 |
Text macro |
| {$UPS_BATT_VOLT_VERY_LOW} |
91.7% of 72
 | 66 |
Text macro |
| Name |
|---|
| Template Module ICMP Ping |
There are no discovery rules in this template.
| Name | Description | Type | Key and additional info |
|---|---|---|---|
| UPS output frequency |
-
 | SNMP agent |
upsAdvOutputFrequency
Update: 60
 |
| UPS output voltage |
-
 | SNMP agent |
upsAdvOutputVoltage
Update: 60
 |
| Device Name |
-
 | SNMP agent |
sysName
Update: 24h
 |
| UPS output power |
-
 | SNMP agent |
upsAdvOutputPower
Update: 60
 |
| Software version (full) |
-
 | SNMP agent |
sysDescr
Update: 60
 |
| UPS battery status |
-
 | SNMP agent |
upsBasicBatteryStatus
Update: 300
 |
| Uptime |
-
 | SNMP agent |
sysUpTime
Update: 60
 |
| UPS output current |
-
 | SNMP agent |
upsAdvOutputCurrent
Update: 60
 |
| Contact |
-
 | SNMP agent |
sysContact
Update: 24h
 |
| UPS battery voltage |
-
 | SNMP agent |
upsBasicBatteryVoltage
Update: 60
 |
| Device Location |
-
 | SNMP agent |
sysLocation
Update: 24h
 |
| UPS output load (%) |
-
 | SNMP agent |
upsAdvOutputLoad
Update: 60
 |
| UPS input voltage |
-
 | SNMP agent |
upsAdvInputVoltage
Update: 60
 |
There are no triggers in this template.


Publications
- Chamberlain, S. (2022). Lessons Learned from Reevaluating Big Deals with Unsub. Serials Review. web pdf
- Guzman, L. M., Chamberlain, S. A., & Elle, E. (2021). Network robustness and structure depend on the phenological characteristics of plants and pollinators. Ecology and Evolution. web pdf
- Mitchell, N., Chamberlain, S. A., & Whitney, K. D. (2021). Proximity to crop relatives determines some patterns of natural selection in a wild sunflower. Evolutionary Applications. web pdf
- Norman, K. E. A., Chamberlain, S., & Boettiger, C. (2020). taxadb: A high‐performance local taxonomic database interface. Methods in Ecology and Evolution, 11(9), 1153–1159. web pdf
- Guzman, L. M., Chamberlain, S. A., & Elle, E. (2020). Phenology and Robustness in plant-pollinator networks. BioRxiv Preprint. web pdf
- Conde, D. A., Staerk, J., Colchero, F., da Silva, R., Schöley, J., Baden, H. M., … Vaupel, J. W. (2019). Data gaps and opportunities for comparative and conservation biology. Proceedings of the National Academy of Sciences, 116(19), 9658–9664. web pdf
- Ram, K., Boettiger, C., Chamberlain, S., Ross, N., Salmon, M., & Butland, S. (2019). A Community of Practice Around Peer Review for Long-Term Research Software Sustainability. Computing in Science & Engineering, 21(2), 59–65. web pdf
- Pearse, W., & Chamberlain, S.A. (2018). Suppdata: Downloading Supplementary Data from Published Manuscripts. Journal of Open Source Software, 3(25), 721. web pdf
- Foster ZSL, Chamberlain S and Grünwald NJ. 2018. taxa: An R package implementing data standards and methods for taxonomic data [version 1; referees: awaiting peer review]. F1000Research, 7:272 web pdf
- Chamberlain, S., C. Boettiger. 2017. R Python, and Ruby clients for GBIF species occurrence data. PeerJ Preprints. web pdf
- Winslow, L. A., Chamberlain, S., Appling, A. P., & Read, J. S. (2016). sbtools: A package connecting R to cloud-based data for collaborative online research. The R Journal, 8(1), 387-398. doi: 10.1371/journal.pone.0127781 web pdf
- Boettiger C, Chamberlain S, Vos R and Lapp H. 2016. RNeXML: A Package for Reading and Writing Richly Annotated Phylogenetic, Character, and Trait Data in R. Methods in Ecology and Evolution, 7, 352-357. (http://doi.org/10.1111/2041-210X.12469). web pdf
- Boettiger, C., Chamberlain, S., Hart, E., & Ram, K. 2015. Building software, building community: lessons from the rOpenSci project. Journal of Open Research Software, 3(1). https://doi.org/10.5334/jors.bu pdf
- Guo H, Chamberlain SA, Elhaik E, Jalli I, Lynes A-R, et al. 2015. Geographic Variation in Plant Community Structure of Salt Marshes: Species, Functional and Phylogenetic Perspectives. PLoS ONE, 10(5): e0127781. doi: 10.1371/journal.pone.0127781 web pdf
- Mair, P, and S. Chamberlain. 2014. Web Technologies Task View. The R Journal, 6(1): 178-181. web pdf
- Revell, L., S.A. Chamberlain. 2014. Rphylip: An R interface for PHYLIP. Methods in Ecology & Evolution web pdf
- Chamberlain, S.A., et al. 2014. Traits and phylogenetic history contribute to network structure across Canadian plant-pollinator communities. Oecologia web
- Chamberlain, S.A., et al. 2014. Phylogenetic tree shape and the structure of mutualistic networks. Journal of Ecology web pdf
- Chamberlain, S.A., J.A. Rudgers, and J.L. Bronstein. 2014. How context-dependent are species interactions. Ecology Letters web pdf
- Barraquand F, Ezard TH, Jørgensen PS, Zimmerman N, Chamberlain S et al. 2014. Lack of quantitative training among early-career ecologists: a survey of the problem and potential solutions. PeerJ 2:e285 web pdf xml
- Vamosi, J.; Chamberlain, S.A., Garcha, N.; Moray, C.; Mooers, A. 2014. Pollinators visit related plant species across 29 plant-pollinator networks. Ecology & Evolution
- Chamberlain S.A., Szöcs E. 2013. taxize: taxonomic search and retrieval in R [v2; ref status: indexed, http://f1000r.es/24v] F1000Research 2013, 2:191 (doi: 10.12688/f1000research.2-191.v2) pdf web
- Chamberlain, S.A. 2013. Consuming Article-Level Metrics: Observations and Lessons from Comparing Aggregator Provider Data. Information Standards Quarterly. on github pdf web
- Chamberlain, S.A., J.A. Rudgers, & K.D. Whitney. 2013. Proximity to agriculture alters abundance and community composition of wild sunflower mutualists and antagonists. Ecosphere. pdf
- Chamberlain, S.A., S.M. Hovick,…et al…K.D. Whitney. 2012. Does phylogeny matter? Assessing the impact of phylogenetic information in ecological meta-analysis. Ecology Letters 15(6):627-636. pdf
- Chamberlain, S.A., & J.A. Rudgers. 2012. How do plants balance multiple mutualists? Correlations among traits for attracting protective bodyguards and pollinators in cotton (Gossypium). Evolutionary Ecology 26:65-77. pdf
- Holland, J.N., Chamberlain, S.A.and T.E.X. Miller. 2011. Consequences of ants and extrafloral nectar for a pollinating seed-consuming mutualism: ant satiation, floral distraction, or plant defense? Oikos. pdf
- Chamberlain, S.A., J.K. Kilpatrick, & J.N. Holland. 2010. Do extrafloral nectar resources, abundances, and body sizes contribute to the structure of ant-plant mutualistic networks? Oecologia 164:741-750. pdf
- Holland, J.N., Chamberlain, S.A.,& K.C. Horn. 2010. Temporal variation in extrafloral nectar secretion by reproductive tissues of the senita cactus, Pachycereus schottii (Cactaceae), in the Sonoran Desert of Mexico. Journal of Arid Environments 74(6):712-714. pdf
- Chamberlain, S.A., & J.N. Holland. 2009. Quantitative synthesis of context-dependency in ant-plant protection mutualisms. Ecology 90(9):2384-2392. pdf
- Holland, J.N., S.A.Chamberlain, A.M. Waguespack, and A.S. Kinyo. 2009. Effects of pollen load and donor diversity on variation in seed and fruit size in a columnar cactus, Pachycereus schottii (Cactaceae). International Journal of Plant Sciences 170:467-475. pdf
- Chamberlain, S.A.& J.N. Holland. 2009. Body size predicts degree in ant-plant mutualistic networks. Functional Ecology 23:196-202. pdf
- Holland, J.N., Chamberlain, S.A.,& K.C. Horn. 2009. Constitutive and induced extrafloral nectar production: optimal defense theory predicts plant resource investment in a protection mutualism. Journal of Ecology 97(1):89-96. pdf
- Chamberlain, S.A. & J.N. Holland. 2008. Density-mediated and context-dependent consumer-resource interactions between ants and extrafloral nectar plants. Ecology 89(5):1364-1374. pdf
- Chamberlain, S.A.& R.A. Schlising. 2008. Role of honey bees (Hymenoptera: Apidae) in the pollination biology of a California native plant, Triteleia laxa (Asparagales: Themidaceae). Environmental Entomology 37(3):808-816. pdf
- Holland, J.N. &S.A. Chamberlain. 2007. Ecological and evolutionary mechanisms for low seed:ovule ratios: need for a pluralistic approach? Ecology 88(3):706-715. pdf
- Schlising, R.A. &S.A. Chamberlain. 2006. Biology of the geophytic lily, Triteleia laxa (Themidaceae), in grasslands of the Northern Sacramento Valley. Madroño 53(4):321-341. pdf


Trey Hunner / Python & Django Trainer / @treyhunner
for
loops work in PythonList comprehensions are a special syntax for looping over one list and building a new list from it
List comprehensions are a special syntax for looping over any iterable and building up a new list from it, modifying and/or filtering elements along the way.
for
loops
numbers = [2, 1, 3, 4, 7, 11]
# Print out square of odd numbers
for n in numbers:
if n % 2 == 1:
print(n**2)
numbers = [2, 1, 3, 4, 7, 11]
# Populate new list with square of odd numbers
squared_odds = []
for n in numbers:
if n % 2 == 1:
squared_odds.append(n**2)
numbers = [2, 1, 3, 4, 7, 11]
# Modifying numbers list to square each number
for i, n in enumerate(numbers):
if n % 2 == 1:
numbers[i] = n**2
numbers = [2, 1, 3, 4, 7, 11]
# Modifying numbers list to square each number
i = 0
while i < len(numbers):
if numbers[i] % 2 == 1:
numbers[i] = numbers[i]**2
i += 1
else:
numbers.pop(i)
>>> old = [1, 2, 3]
>>> new = old
>>> new.pop()
3
>>> new
[1, 2]
>>> old
[1, 2]
>>> old = [1, 2, 3]
>>> new = old[:-1]
>>> new
[1, 2]
>>> old
[1, 2, 3]
squared_odds = []
for n in numbers:
if n % 2 == 1:
squared_odds.append(n**2)
squared_odds = [n**2 for n in numbers if n % 2 == 1]
squared_odds = []
for n in numbers:
if n % 2 == 1:
squared_odds.append(n**2)
squared_odds = [n**2 for n in numbers if n % 2 == 1]
squared_odds = []
for n in numbers:
if n % 2 == 1:
squared_odds.append(n**2)
squared_odds = [n**2 for n in numbers if n % 2 == 1]
new_list = []
for x in old_list:
if condition(x):
new_list.append(operation(x))
new_list = [operation(x) for x in old_list if condition(x)]
for n in numbers:
if n % 2 == 1:
squared_odds.append(n**2)
squared_odds = [n**2 for n in numbers if n % 2 == 1]
squared_odds = [n**2 for n in numbers if n % 2 == 1]
squared_odds = [
n**2
for n in numbers
if n % 2 == 1
]
squared_odds = [n**2 for n in numbers if n % 2 == 1]
squared_odds = [
n**2
for n in numbers
if n % 2 == 1
]
squared_odds = []
for n in numbers:
if n % 2 == 1:
squared_odds.append(n**2)
squared_odds = [
n**2
for n in numbers
if n % 2 == 1
]
squared_odds = []
for n in squared_odds:
if n % 2 == 1:
squared_odds.append(n**2)
squared_odds = [
n**2
for n in numbers
if n % 2 == 1
]
squared_odds = []
for n in numbers:
if n % 2 == 1:
squared_odds.append(n**2)
squared_odds = [
n**2
for n in numbers
if n % 2 == 1
]
squared_numbers = []
for n in numbers:
squared_numbers.append(n**2)
squared_numbers = [
n**2
for n in numbers
]
flattened = []
for row in matrix:
for item in row:
flattened.append(item)
flattened = [
item
for row in matrix
for item in row
]
numbers = {2, 1, 3, 4, 7}
squared_odds = set()
for n in numbers:
if n % 2 == 1:
squared_odds.add(n**2)
numbers = {2, 1, 3, 4, 7}
squared_odds = {
n**2
for n in numbers
if n % 2 == 1
}
from string import ascii_lowercase
letter_positions = {}
for n, letter in enumerate(ascii_lowercase, start=1):
letter_positions[letter] = n
from string import ascii_lowercase
letter_positions = {
letter: n
for n, letter in enumerate(ascii_lowercase, start=1)
}
> numbers = [2, 1, 3, 4, 7, 11]
> numbers.filter(n => n % 2 == 1).map(n => n**2)
[ 1, 9, 49, 121 ]
>> numbers = [2, 1, 3, 4, 7, 11]
>> numbers.select{ |n| n % 2 == 1 }.map{ |n| n**2 }
=> [1, 9, 49, 121]
>>> numbers = [2, 1, 3, 4, 7, 11]
>>> numbers.filter(lambda n: n % 2 == 1).map(lambda n: n**2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'filter'
>>> numbers = [2, 1, 3, 4, 7, 11]
>>> [*map(lambda n: n**2, filter(lambda n: n % 2 == 1, numbers))]
[1, 9, 49, 121]
>>> numbers = [2, 1, 3, 4, 7, 11]
>>> [n**2 for n in numbers if n % 2 == 1]
[1, 9, 49, 121]
lowercased_words = [word.lower() for word in words]
def get_anagrams(target_word, words):
return [
candidate_word
for candidate_word in words
if is_anagram(candidate_word, target_word)
]
def is_anagram(word1, word2):
"""Return True if words contain same letters."""
return sorted(word1) == sorted(word2)
negative_matrix = []
for row in matrix:
new_row = []
for n in row:
new_row.append(-n)
negative_matrix.append(new_row)
negative_matrix = []
for row in matrix:
negative_matrix.append([-n for n in row])
negative_matrix = [
[-n for n in row]
for row in matrix
]
>>> numbers = range(1_000_000)
>>> squared_numbers = (n**2 for n in numbers)
>>> squared_numbers
<generator object <genexpr> at 0x7f129b187780>
>>> numbers = [2, 1, 3, 4, 7]
>>> squared_numbers = (n**2 for n in numbers)
>>> len(squared_numbers)
TypeError: object of type 'generator' has no len()
>>> squared_numbers[0]
TypeError: 'generator' object is not subscriptable
>>> list(squared_numbers)
[4, 1, 9, 16, 49]
>>> list(squared_numbers)
[]
>>> from itertools import islice
>>> numbers = range(1_000_000_000)
>>> squared_numbers = (n**2 for n in numbers)
>>> next(squared_numbers)
0
>>> next(squared_numbers)
1
>>> next(squared_numbers)
4
>>> next(squared_numbers)
9
>>> next(squared_numbers)
16
>>> numbers = [2, 1, 3, 4, 7]
>>> squared_numbers = (n**2 for n in numbers)
>>> sum(squared_numbers)
17
>>> sum(squared_numbers)
0>>> cubed_numbers = (n**3 for n in numbers)
>>> list(cubed_numbers)
[8, 1, 27, 64, 343]>>> list(cubed_numbers)
[]
>>> numbers = range(1_000_000)
>>> sum((n**2 for n in numbers))
333332833333500000
>>> sum(n**2 for n in numbers)
333332833333500000
>>> numbers = [2, 1, 3, 4, 7]
>>> sum_of_squares = sum([n**2 for n in numbers])
>>> sum_of_squares = sum(n**2 for n in numbers)
If you're making a list to loop over it exactly once, use a generator expression instead of a list comprehension
str.join
def translate(sentence):
translation = []
for w in sentence.split():
translation.append(DICTIONARY[w])
return " ".join(translation)
def translate(sentence):
translation = [
DICTIONARY[w]
for w in sentence.split()
]
return " ".join(translation)
def translate(sentence):
return " ".join(
DICTIONARY[w]
for w in sentence.split()
)
sum
sum_of_squares = 0
for n in numbers:
sum_of_squares += n**2
squares = []
for n in numbers:
squares.append(n**2)
sum_of_squares = sum(squares)
sum_of_squares = sum(n**2 for n in numbers)
>>> [print(n**2) for n in range(10) if n % 2 == 1]
1
9
25
49
81
[None, None, None, None, None]
color_ratios = {}
for color, ratio in zip(colors, ratios):
color_ratios[color] = ratio
color_ratios = {
color: ratio
for (color, ratio) in zip(colors, ratios)
}
color_ratios = dict(zip(colors, ratios))
with open(filename) as my_file:
lines = [line for line in my_file]
with open(filename) as my_file:
lines = list(my_file)
with open(filename) as my_file:
lines = my_file.readlines()
new_list = []
for item in old_list:
new_list.append(operation(item))
new_list = [
operation(item)
for item in old_list
]
new_list = []
for item in old_list:
if condition(item):
new_list.append(operation(item))
new_list = [
operation(item)
for item in old_list
if condition(item)
]
new_dict = {}
for key, value in old_dict.items():
if condition(key, value):
new_dict[change1(key)] = change2(value)
new_dict = {
change1(key): change2(value)
for key, value in old_dict.items()
if condition(key, value)
}
new_list = []
for inner_list in outer_list:
for item in inner_list:
new_list.append(item)
new_list = [
item
for inner_list in outer_list
for item in inner_list
]
new_list = [
item
for n in old_list
]
new_list = list(old_list)
new_list = []
for item in old_list:
new_list.append(operation(item))
some_result = some_operation(new_list)
some_result = some_operation(
operation(item)
for item in old_list
)


Did you download the zip or tar file described as the easiest way to try out Midje?
If you're on Unix (including the Mac), the shell script run
runs the tests:
% run
If you're on Windows, you can look at the contents of the script (two lines) and translate them into Windows terms.
The file in this folder called
run-expected-output
shows what
the results should look like.
You must have Leiningen installed to follow these instructions. It's easy to install. Start here.
To download and install everything you need to run the example, including Midje, type this:
% lein deps
The downloaded jar files are put in the
lib/
subdirectory.
The file
test/basic/core_test.clj
is
intended to be good documentation of the different ways
you can use midje.sweet
. You can run
the tests like this:
% lein midje
The file in this directory called
lein-expected-output
shows what
the results should look like.


A nanoscopic progress bar. Featuring realistic trickle animations to convince your users that something is happening!
NProgress.start() — shows the progress bar
NProgress.set(0.4, true) — sets a percentage
NProgress.inc() — increments by a little
NProgress.signal() — signal an error in the user code
NProgress.done() — completes the progress
Perfect for Turbolinks, Pjax, and other Ajax-heavy apps.


Welcome to my portfolio page! I am 25 years old and Im from Keyport,NJ. Music has always been a big part of my life both listening and playing. I can play piano but my best instrument is guitar. Other activites I enjoy in my spare time are hiking, traveling, and watching sports. I am a huge baseball fan and the New York Yankees are my favorite baseball team to follow. I try to go to at least 2 games every season. After taking an intro course to web design, I decided I wanted a career in the field so I decided to enroll in Rutgers Coding Bootcamp. I found that just like music, web design gives me the chance to be creative.


GeoMesa manual documentation¶
This is not the GeoMesa documentation itself, but rather notes on how to build it.
Setup¶
The documentation is built using Python's Sphinx module.
Installing Sphinx and its dependencies in a Python virtualenv
:
$ virtualenv .sphinx && source .sphinx/bin/activate
$ pip install -r requirements.txt
Alternatively use sudo
with the pip
command to install the packages in the system Python distribution.
$ sudo pip install -r requirements.txt
Optional: if you want to build the PDF version of the manual, install LaTeX:
# on Ubuntu
$ sudo apt-get install texlive-latex-base texlive-latex-recommended texlive-latex-extra texlive-fonts-recommended
The LaTeX distribution is pretty big, so you can skip it if you're just interested in the HTML docs.
You will also need make
.
Building¶
To build HTML versions of the manuals:
$ mvn clean install -Pdocs -pl docs
If you do not have Sphinx installed the manual will not be built.
The outputted files are written to the target/html
directory.
To build a PDF version:
$ mvn clean install -Pdocs,latex
$ cd target/latex
$ make
There may be some errors during the LaTeX build; just press Enter
when it prompts for input. It should build the whole document. If the
table of contents doesn't render properly, delete GeoMesa.pdf
and run make
again.
To build a single HTML file containing all three manuals:
$ mvn clean install -Pdocs,singlehtml
About¶
There are currently three main manuals: the User Manual (user
), the Developer Manual (developer
),
and Tutorials (tutorials
).
In each manual, the root page of the documentation is index.rst
. Any static files included go in
the _static
directory.
The files themselves are written in reStructuredText (RST) and have *.rst
extensions. Markdown files are also supported but do not support any of Docutils or Sphinx's special directives
(cross-references, admonitions, variable substitution, etc.).
For the most part, the syntax of RST is pretty similar to Markdown. Two particular sticking points are links and code blocks. Inline links should be written like this:
`Link text <http://example.com/>`_
The final underscore is important!
Code blocks should always be indented with 4 spaces, and prefixed with the .. code-block:: language
directive:
.. code-block:: scala
val ds = new DataStore()
To include an image, copy it into _static/img
and use the following:
.. image:: _static/img/name-of-file
You can also specify options for how to use the various directives. For example, this adds line numbers to a code block:
.. code-block:: scala
:linenos:
val ds = new DataStore()
See the Sphinx reStructuredText Primer for more information.


When
Thursday, October 4, 2018 from 10:00 AM to 11:00 AM CDT
Add to Calendar
Where
121 N LaSalle 10th Floor, Room 1006C
121 N. La Salle - Room 1006
Chicago, IL 60602
Driving Directions
Contact
Chicago Low-Income Housing Trust Fund
Chicago Low-Income Housing Trust Fund
312-744-0675
<EMAIL_ADDRESS>Chicago Low-Income Housing Trust Fund - October Allocations Meeting
Allocations Meeting for the Chicago Low-Income Housing Trust Fund
Register Now!
2018-10-04T10:00:00-0500
2018-10-04T11:00:00-0500
Chicago Low-Income Housing Trust Fund - October Allocations Meeting
121 N. La Salle - Room 1006, Chicago, IL, 60602, US
http://events.r20.constantcontact.com/register/event?llr=ydbpsxjab&oeidk=a07efpg5zbj0de5ed7d


Shiv Nadar<EMAIL_ADDRESS>8273663023 |
| Name of Institution | Name of Course/Board | Year of Passing | Percentage/ CGPA |
|---|---|---|---|
| Shiv Nadar University | B. Tech- Computer Science Engineering | 2018 | 7.37 (Upto 6th Semester) |
| Delhi Public School, Aligarh | Higher Secondary School (Central Board of Secondary Education) | 2014 | 90.6% |
| Delhi Public School, Aligarh | Senior Secondary School (Central Board of Secondary Education) | 2012 | 9.6 CGPA |
Shrida Udyog, 05/120- B- 10, Madhuvan Vihar, Barolla Bypass, Aligarh – 202001


Through hackathons we hope to encourage beginners to learn in a fun and open environment and for professionals to think outside the scope of their daily routines and lives. Together, beginners and professionals can learn from each other to develop technological solutions to real world problems.
Eco-responsibility for organizations is our theme for this year's BUHACK hackathon. Our goal is to help organizations like Bishop's University with their sustainability plans and goals through technological solutions.
Anyone with the enthusiasm for coding can attend this hackathon. The hackathon is for all age groups and for all the coders.
You can use the language of your choice as long as your project respects our rules. Don’t forget to consult the evaluation criteria to ensure that you obtain as many points as possible.
No, we do not provide computers. We suggest that you find a laptop and prepare it beforehand so it contains all the development tools that you plan to use.
You can form your own team or join an existing team during the 5 à 6 opening event on Tuesday evening. Don’t worry, you’ll find a team!


We are getting married or something.
Some people say the best reason to get married is because you're pregnant or tax breaks or something like that. But the real reason is so Jess can't testify against me. Theoretically, of course.
This website features real photosLIBERTY, taken by Mike BALD EAGLES at Wilsons Promentary NationalFREEDOM park, where he proposed to Jess
(so talented).
This website was made with Bootstrap. It is important to note that my hatred for bootstrap is outweighed only by my love of cheaply designed wedding websites.

MUKDuK IS PREGNANT.
(this was written by
Jess)
The Ceremony and Reception will take place approximately 1hr15m north-west EAST of Melbourne CBD at
303 Whitebridge Road, Cobaw, VictoriaNATHANIA SPRINGS HOME OF THE BRAVE.
INDEPENDANCE
Earliest arrival at 2:00, follwed by an informal ceremony at
3:00.
Casual food, whatever the young people are eating now days. A full dinner won't be provided, but there will
be plenty of finger food and snacks. LIFE LIBERTY AND THEN PURSUIT OF HAPPINESS (Unless
Dean and
Dew eat it all.)
Smart Casual
JessmUkDuK and I will probably dress up a bit but the whole point is to make us look good so please dress
terribly
(RED WHITE AND BLUE ONLY).
The
only gift we need is your attendance FREEDOM FOR THE COLONIES(
Jess made me write this part). However if you really want to support our
blessed union REVOLUTION
there will be a
wishing well FIREOWRKS STATION at the venue where you can contribute to our life. THE GREATEST COUNTRY ON EARTH
To be determined, something fun hopefully. Who likes
FIFA ACTUALLY STILL FIFA, BUT ALSO NRL?
It's been a couple of minutes since I first said the location, so here's a map, in case you're not so good at the internet, GEORGE WASHINGTONS HOUSE, NATHANIA SPRINGS Please Note: if this map doesn't load correctly, there is no technical support.


Purposeful Paper Forms for Guitar
by Tom Swan
Like most, I love my iPad, my laptops, my smart-azz phone and all my other devices. I’ve even gotten used to reading guitar scores on my tablet and not printing them out first.
But my early fantasies of doing away with paper never morphed into reality, and I’ve found paper copies of the blank sheet-music and other forms included with this repository especially valuable to my number one hobby, banging around on the guitar.
Maybe it’s just me, but I’ve always thought that just by writing something down, whatever it is, I learn the subject better. I know these forms have helped me improve as a musician.
If you play music as many of us developer-types do, maybe you’ll get some use out of my collection, and so I’m sharing it here. It’s pretty obvious how to use the forms, but I’ve included samples of each for hints.
| Click on any image to view it full screen. Click links to open the identical but higher-quality PDF documents for saving and printing. |
Blank Sheet Music
With so much computer technology usually within reach, I still like to scribble rough notes with a pencil.
Even if I’m just writing down a chord sequence, I like to get it on staff paper so I can show measures, the key, and so on. And I do mean scribble. I don’t do any fancy calligraphy, just whatever works that I can share with others and stuff in a drawer for future reference.
blank-staff.pdf
: Open
I created the blank staff PDF here for myself years ago using the music typesetting program Finale. There’s nothing much to it, just a single page with eight systems of unadorned staff lines. I always keep a bunch of them around.
Blank Staff With Tab
Guitar tablature is, for me, just another means to a common end — preserving and sharing music with others. I read traditional music fairly well, so I don’t use tabs very often, but one advantage is that tablature is unambiguous where traditional scores may raise questions — where on the fretboard, for example, to play a particular line or chord. With tabs, that’s always clear.
blank-staff-with-tab.pdf
: Open
I created the blank form shown here for sharing scores and licks with friends who don’t read traditional music. It’s the same as the plain blank score, but with an additional system of tablature where you can write down fretboard fingerings.
Sample
Following is a sample of the form in use, showing a work sheet I made while exploring diminished scales. Play a G7 arpeggio — the diminished arpeggio is a half step below all notes except the root. Try playing the arpeggios together — up one and down the other — for a really cool jazzy sound.
| The small 8 under the treble clef indicates to pianists that they must lower the notes of a score an octave to match the guitar. This is because, in standard tuning, a guitar’s middle C is, on the piano, C below middle C. |
Chord Diagrams With Tab
I use this page more than any other of my fill-in-the-blank forms. There are eight identical repeating sections, each with a blank chord chart, a treble clef staff, and a matching tablature system. You might fill the page with chords of a certain type (inversions of chord type, for example), or use it to explore similarities between chord shapes.
chord-diagrams-with-tab.pdf
: Open
One way to make practical use of this page is to grab one when you encounter an unfamiliar chord in a song that you are learning. When that happens to me, I fill in this form with inversions of the chord — just writing down the notes helps reinforce my memory of how to play the chord, and also helps me to focus on the notes (chord tones) so I can play the same chord in different inversions more easily.
Sample
In the sample that follows, "Drop-2 Voicings for C7," you’ll see that I try to include as much information about a chord as I can, its scale, and the intervals between notes — whether there’s a minor 3rd, for example, or a flat 7. I like to write this information at the top of the page and also below each chord chart, showing the fingerings. The Roman numeral at left shows the relative fret where the chord is to be played. Because the tab lines are so close together, I write the tablature as a melody although the notes are to be played together.
| Tid Bit: Fact: Using a pic, it is impossible to play a chord on the guitar! No matter how fast you strum, with a pick you are still playing one note after the other. So, technically, that’s an arpeggio. You can only truly play a chord, in which all notes are played simultaneously, with your fingers. |
Fretboard With Tab
I made up this form for diagramming multi-octave scales and runs, notated in three ways: graphically on a representation of a guitar fretboard (top), as a traditional score (middle), and in tablature (bottom). There are two such sections on every page.
| The fretboard diagrams here extend to the 19th fret because that’s traditionally the highest playable position on a classical guitar. |
fretboard-with-tab.pdf
: Open
I am often asked how one plays scales quickly between high and low positions as anybody who’s been to a rock concert knows that skilled guitar players love to do when soloing. One way to learn how to get around the fretboard more easily is to combine familiar patterns. Find the notes that each scale pattern shares, and then move in and out of your familiar shapes by playing the common notes.
Sample
There must be billions of ways to play scales this way! While I was learning to play my scales, I made up diagrams like the following sample of a 3-octave G-minor pentatonic (five-note) scale.
| Don’t try to just memorize entire patterns like this. Break it into small sections of only a few notes, learn those pieces, and then join them together. |
Scale Fingering
Starting with a copy of the preceding page, I divided the fretboard and associated score systems into four sections. This page is my second-most used form in practice. I use it to record scale fingering patterns in position (within a six-fret span).
This page proved invaluable in my learning traditional scales, and perhaps it will help you too if that’s one of your goals.
scale-fingering.pdf
: Open
Sample
The following example of the "Scale Fingering" form shows three ways to play an A major scale starting with the root note on the sixth (low E) string but using different starting fingers.
As I was taught years ago, I include in my scales all notes that are reachable in position, meaning within a hand’s width but with one-fret extensions ("x") allowed at either side (fingers 1 and 4). Circled positions show the root notes. When learning scales, practice to and from each root in turn before attempting to learn the entire pattern. Divide and Conquer!
Website: http://www.tomswan.com
Raw Text: Read


We are proudly helping various companies building their products at scale. If you are using Nest and would you like to be listed here, see this thread. We are willing to put your logo here!
According to our knowledge, all the following companies have built awesome projects on top of our framework:
| {{ item }} |
and a lot more but we don't have enough time to update above list. Feel free to create a pull request though!


— Corey Butler (@goldglovecb)
http://edgeATX.github.io/slides
— Jeff Lindsay (@progrium)
Thanks to our sponsors:
Last version check — March 2015:
| 41 | 36 | 28 | 8 | 11 | 0 |
As of May 27, 2015:
| 41 43 |
36 38 |
28 29 |
8 | 11 | 0 |
<input type="text" autocapitalize="sentences">
<input type="text" autocapitalize="words">
<input type="text" autocapitalize="characters">
Based on Chrome 42
Not much else to talk about from a dev perspective
Security updates
A ton of stuff planned & under consideration...
var message = "Hello there";
var origin = "http://tutorials.jenkov.com";
var theIframe = document.getElementById("theIframe");
theIframe.contentWindow.postMessage(message, origin);
var notification = new Notification('Email received', {
body: 'You have a total of 3 unread emails'
});
io.js 2.0 released.
An open source, extensible, platform-agnostic tool for remotely debugging and testing your JavaScript. Powered by node.js and socket.io.
CM First presents Gautam Agrawal, Director of Product Management for Sencha.
RSVP on Meetup.com
/
#


[1]
when we returned home on our first night we found the staff had left a card and a card .
[2]
really nice gesture that helped rectify what had not been a good start to our trip .


If you are watching a video on You Tube and the video is paused for an annoying 30 sec advertisement, you probably should know the history behind on-line advertisements. In fact, advertising and internet helped each other attain their respective potentials. Without advertising, there wouldn’t be any Google or Facebook (may be not in the present form), and without any internet, you probably wouldn’t know about a tourist package in a remote island like Madeira.
In this blog post, let us have a look at a mechanism design called Sponsored Search Auctions, which is key to the rise of internet giants like Yahoo! and Google. We shall discuss the properties of such auctions along with examples to gain a better insight. This post is intended for general audience, and hence we shall try hard to not drift into game theoretic concepts (although it is impossible to do so at all times).
Sponsored Search Auctions
Before diving into the topic, let us get familiar with auctions. Auction is the sale of items where the seller invites the buyers (bidders) to submit bids and makes a decision on whom to sell it to. The bidders have their own valuations for the item and submit bids indicating their willingness to pay for it, and the seller allocates the item to the bidder he/she likes the most (usually it is the bidder with the highest bid). For example, if you want to move to a new place but you do not want to carry some of your furniture/luggage, you put them on eBay for an auction. If someone fails to repay their loan to a bank, the bank auctions off the mortgaged property.
Consider that you are planning to travel to Madeira with your friends. A quick internet search for the work ‘Madeira tours’ results in a list of links some of which are marked as Ad sponsored by the respective websites. Whenever a user clicks a sponsored link through the search engine, the advertiser pays a certain amount to the search engine for facilitating their advertising. In Sponsored Search Auctions for every keyword, the search engine allocates a certain number of slots, and multiple advertisers compete for these slots which provide different value to different advertisers. The probability of an advertiser $i$’s Ad being clicked when placed in a slot $j$ is called the Click Through Rate, or CTR, denoted by $α_{ij}$ (this is simplified in various mechanisms). The per click value to advertiser $i$ is $s_{i}$ and the expected value on being assigned a slot $j$ is $α_{ij}s_i$. The search engine must design an efficient mechanism that maximizes the welfare (or the revenue) by assigning the slots to different advertisers (bidders). Let us follow the convention of using search engine for the seller and advertiser for the bidder.
Let us now look at some important properties of Sponsored Search Auctions that differentiate it from traditional auctions. - These auctions are dynamic in nature and the bidders can change their bids from time to time. We may now not get the same list of links for searching ‘Madeira tours’ if some bidders’ algorithms modified their respective bids. - The items at sale are perishable with time. If an item is unsold, it is of no value to the search engine at a later point of time, unlike a storable product such as a piece of furniture which still has some value in the future if unsold. The search engine though is not constrained by the quantity of items it can offer. It can potentially fill up the entire search results with Ads. However, we may not use Google Search if every search query returns only Ads. - The unit of what is being sold is different for the search engine and the advertiser. For the search engine, it is the space allotted to the advertiser every time a user searches for that particular key word. For the advertiser, it is the value of trade when a user clicks the sponsored link. In practice, the advertiser is charged based on the number of clicks (or the rate of it) the link receives.
History and Generalized First Price Auctions
In the early 1990s, when the era of internet advertising began, Ads were sold on a per impression basis, which includes a flat fee paid by the advertiser to the search engine for showing their advertisement a fixed number of times. Internet advertising was then revolutionized by Overture in 1997 (later acquired by Yahoo!), with their design called as the Generalized First Price Auction. It is similar to a traditional open bid first price auction. The important features of this auction are as follows - Advertisers can now target their Ads for specific keywords instead of tickers or banners - Advertisers can bid their willingness to pay on a per-click basis, instead of a flat price. The payments were also immediate and paid per click - The bids were arranged in decreasing order, with the highest bid getting the slot with the highest CTR (usually the top most slot), the second highest bid getting the second best slot and so on. - If an advertiser wins a slot, the advertiser has to pay value equal to their bid times the CTR of the slot. - Advertisers also were allowed to change their bids frequently by looking at the other bids
Owing to its novelty and advantages over the previous mechanisms, Overture’s GFP was a success and Yahoo! and MSN were among the top users of GFP. However, the mechanism itself was unstable and flawed.
Example:
Consider that for a specific key word, there are three slots and four advertisers competing for the slots. The click through rates of the slots are 400, 200 and 100 (clicks per hour). The advertisers 1, 2, 3, 4 have values $ \$10, \$5, \$2, \$1$ respectively.Note that the advertisers know the values of the other bidders.
Under the GFP mechanism, suppose advertiser 3 bids $ \$1.01$ to guarantee that he gets a slot (because advertiser 4 would not want to pay more than her value, i.e. $\$1$). Noticing this, advertiser 2 would revise her bid to $ \$1.02$ because she does not need to pay more than that to get the second best slot. Similarly, advertiser 1 would want to revise the bid to $ \$1.03$ for the same reason. But advertiser can now revise the bid to $ \$1.04$ to win the top slot (CTR 400) which is four times more valuable than the third slot (CTR 100). And, the cycle continues.
Clearly, there is no pure strategy equilibrium, and the competitive revision of bids continues. This gives an unfair advantage to bidders with high compute power to algorithmically outbid their competitors. Remember that the goal of the search engine is to maximize it’s own profit, the amount earned through the payments made by the bidders.
Generalized Second Price Auctions
Realizing that no bidder at position $i$ (in the decreasing order of bids) wants to pay more than the bidder at position $i+1$, as can be seen from the above example, Google came up with their own pay-per-click system, called AdWords Select in February 2002. Their system follows a Generalized Second Price mechanism, where the advertiser at position $i$ pays the bid of the advertiser in position in $i+1$ plus a minimum increment (say $ \$0.01$). Let us consider the above example and evaluate payments made while employing a GSP structure.
Example:
Consider that the advertisers bid truthfully (i.e. bid their actual values). Then the three slots 1,2,3 go to advertisers 1,2,3 respectively. - The payment made by advertiser 3 is $ \$101\ (=1.01\times 100)$ and the profit is $ \$99\ (=2\times100-101)$ - The payment made by advertiser 2 is $ \$402\ (=2.01\times200)$ and the profit is $ \$598\ (=5\times200-402)$ - The payment made by advertiser 1 is $ \$2004\ (=5.01\times400)$ and the profit is $ \$1996\ (=10\times400-2004)$
The total payment received by the search engine is $ \$2507$. Contrastingly, in the GFP example, there was no equilibrium payment like above.
Let us consider another example when the advertisers do not bid truthfully.
Example:
Consider that the CTRs of the three slots are comparable, say 400, 390, 380 respectively. Then if everyone bids truthfully, advertiser 1 pays $ \$2004$ and the profit is $ \$1996$. However, if advertiser underbids, say $ \$2.02$, he can still ensure slot 2. His payment is then $ \$3112=(10-2.02)\times390$ which is greater than $ \$1996$ if he bids truthfully.
Despite the fact that GSP doesn’t ensure truthful behavior, it is widely used because it is amazingly simple. It is interesting to note that most search engines including Google still use a variant of GSP.
Conclusion
Around two decades ago, innovative mechanism designs fueled the growth of on-line advertising and helped the dot com industry flourish. Today, the world is set to witness revolutionary changes in the way people move from one place to another. With autonomous ride sharing, ride hailing services becoming increasingly popular, we can expect new modes of advertising (may be call it in-transit advertising) with immersive multimedia technologies and what not. Recently Intel and Warner Bros joined hands to develop tech to enhance immersive experience of riders for entertainment and advertising. I would not be surprised to expect a future where you subscribe to Ad-free rides by paying more.
It is important to develop the tech to make autonomous vehicles safe for the public, but it is even more important to build revenue models that enable ride hailing services generate revenue to stay competitive. We can only wait and see how advertising (and mechanism design) can play its part in shaping the future of our transportation.
References
- Edelman, B., Ostrovsky, M. and Schwarz, M., 2007. Internet advertising and the generalized second-price auction: Selling billions of dollars worth of keywords. American economic review, 97(1), pp.242-259.


Fyi: "EOD_OH" and "TOTAL_OUT_NET" have same value in dataset, so they overlapping each other and you will see only one line for "TOTAL_OUT_NET". In order to see underneath line click on legend for "EOD_OH" it will select and show underneath line for "EOD_OH"


--- layout: post esbma_id: 1754 title: Product Parenting date: 2008-10-22 13:00:00 keywords: mfg_strategy ---
The genesis of this article happened back in May when I posted a blog entry containing the following snippet:
And finally, for something completely different, don't miss the Jam Session at Tech-Ed on June 3rd. Several of us minions from SourceGear are planning to take the stage and give our rendition of Pinball Wizard. It'll be me on acoustic guitar, our development manager Jeremy Sheeley on bass, and our product manager Paul Roub playing the Evil Mastermind Schecter PT that will be given away later that week.
BTW, I'm not a very good guitar player, but the jam turned out OK.
Anyway, the first comment on that blog post was from a reader who said:
3 managers. Wow. Your company must be growing and/or is fairly large.
The person who made that comment was probably using the word "manager" to refer to "someone who manages people". If so, then yes, our company has more than 3 managers, but not all of the 3 people playing Pinball Wizard qualify:
So when I saw that comment, I told myself I should write an article about the role of a product manager. This is that article.
(BTW, the content of this article was my presentation (video) at the Business of Software conference in September. For more information about this event, keep an eye on the Business of Software conference blog.)
In short, a product manager is a marketing person who focuses on strategic stuff and stuff that is specific to the product.
When people think of marketing, their thoughts often run to things like logos, graphic design, and advertising. This is the communications side of marketing. We call it "marcomm".
The other side of marketing is the stuff that is more focused on the product itself:
These activities are the domain of the product manager.
I still remember the moment when I first started to learn this distinction. Back when I worked at Spyglass, one of my peers asked, "Why don't we have any product marketing people?"
I said, "What do you mean? We've got marketing people. Marc and his team just spent six months deciding which Pantone shade of red we're going to use for our logo. That's marketing, right?"
The discussion that followed my clueless remark was very enlightening.
There is a confusion caused by the word "manager". As noted before, a product manager doesn't necessarily manage people.
To highlight the differences between product management and people management, I'm going to start by offering a brief but reasonably complete lecture on managing people in a software company.
Stop treating them like children.
Yep, that's it. Stop treating them like children.
If you follow this rule and all of its corollaries, you will be a competent manager, thus placing you in the top one percent of all managers in the software industry.
Software professionals are grownups. They do not deserve to be treated like children.
Unlike your coworkers, software products deserve to be treated very much like children. They're rebellious and wayward. They need to be given strict boundaries and lots of guidance.
Like children, products go through stages. Joel Spolsky said that "good software takes ten years". Those ten years are not all the same.
The life of a growing software product has six different stages. And the progression of those stages is a lot like the stages of parenting a child.
In parenting, the first stage is conception and pregnancy. In software, this stage covers all the time before your first product release. The key concept for this stage is "prepare".
This is the stage where you find a product idea and dream about what it might be when it grows up.
Product managers in stage 1 tend to make the same mistake that a new father makes: He believes that since the mother (the development team) is carrying the baby (writing the code), he doesn't have anything to do. All he has to do is wait until the kid is old enough to throw a baseball around, right?
As a product manager, stage 1 is perhaps your most important stage. You have a lot of preparation to do if you want your product to be successful.
This is challenging stuff, and you have to do it now. Later it will be too late.
Anybody else remember the Apple Pippin?
When I speak at conferences, they sometimes introduce me as "the person who led the team at Spyglass who built the browser that Microsoft licensed to become Internet Explorer". That's true, but it is an incomplete rendition of the truth.
Spyglass licensed its browser to around 120 different companies who released products based entirely or partially on our code. All but one of those products crashed and burned. So it would be equally accurate (albeit far less flattering) to introduce me as "the person who has been affiliated with more failed web browser products than anyone else on the planet". :-)
One of those products was the Apple Pippin (although I would hasten to say that my code was not the reason why the Pippin failed). :-)
The Pippin was a disastrous example of product marketing. And it failed because somebody did a terrible job in stage 1. The positioning of this product was never clear.
The answer to all of these questions was "yes". By trying to fit in every category, the Pippin ended up fitting in none of them.
Predictably, the primary differentiation for the Pippin was that it was lame in every category. Yes, it was a game machine, but it was insanely expensive and incompatible with 100% of the popular games in the world. Yes, it was a computer, but it was slow and underpowered.
In parenting, the second stage is birth and infancy. In software, this stage covers the 1.0 release and the time thereafter. The key concept for this stage is "care".
This is the stage where you endure the final pain of getting the product out the door.
The product manager has a very important role in the first release of a new product. The labor pains are endured by the development team, but the product manager is responsible for the launch. It is important to get the messaging just right.
Shipping release 1.0 is a lot like the birth of a new baby: Lots and lots of pain, followed by a brief period of pure happiness, and then no sleep for quite a while.
In most B2B software products, shipping the 1.0 release is more like a beginning than an end.
After a baby is born, the parents are overwhelmed with the responsibility of its care. A newborn is completely dependent, unable to do anything for itself. When it wants to be fed at 3 o'clock in the morning, that's what has to be done.
Many version 1.0 products have similar needs. Users need tech support, sometimes urgently and at very inconvenient times. That's what has to be done.
Like the husband of a breast-feeding mother, the product manager may not have primary responsibility for all this care that needs to be provided. But he can be involved, and both he and the product will benefit from his choice to do so.
Product managers and new fathers typically share one other task in common during stage 2: Soul searching.
Every father I know has held his new baby and wondered if he was really prepared for the responsibility.
Product managers in stage 2 need to be asking themselves questions about the quality of their preparation:
Stage 2 is not the time to start doing the stuff you should have done in stage 1. But it is time to review. It's not too late to make changes.
Around ten years ago, my company shipped version 1.0 of a product called SourceSurf. It was a web-based application for browsing source code repositories.
If you were to travel back in time and ask SourceSurf what it wants to be when it grows up, it would look into the future and say, "I want to be sort of like Atlassian FishEye". But SourceSurf never got the chance to grow up. Version 1.0 was its first and last major release. What we should have done was tweak the strategy and keep going. Instead, we looked at the initial results and gave up.
SourceSurf 1.0 didn't do very well, but the product concept was generally good. We failed to make the minor course corrections this product needed to be successful.
In parenting, the third stage is the so-called "terrible twos", (which, as all parents know, actually lasts until the child is almost four). In software, this stage typically covers the 2.0 release cycle. The key concept for this stage is "listen".
This is the stage of defiance and rebellion, where the product begins to exhibit its own will.
One day when my oldest daughter was in this stage, we called her to dinner. She sauntered up to the table, glanced at the food we had prepared, and gasped in horror, "There's nothing here I like except butter!" :-)
Obviously children need correction during these years. But they also need to be heard. This is the stage when "kids say the darndest things", some of which are cute, and some of which are annoying or embarrassing. Either way, this process is an important stage of growth. Parents need to provide correction without crushing the child's spirit. Often that means listening to the weird things the child says.
The product manager also needs to spend stage 3 listening. Customers ask for a lot of stuff, and that feedback needs to be heard and incorporated into the next release of the product. There is still time to tweak the strategy before the product goes mainstream.
Stage 3 is the most common place where products fail. There are plenty of examples. Almost any product that died at the bottom of the chasm was a failure in stage 3. My favorite two examples are BeOS and Wingz.
I often wonder if these products might have succeeded if they had been more willing to listen to the very early user feedback and change course accordingly. This might have meant allowing the product to become something its parents never dreamed it would be.
Since I am employed by a version control vendor, the chasm situation that is most interesting to me today is the Decentralized Version Control System (DVCS). Notable examples in this category include open source tools such as Git, Mercurial, and Bazaar.
Today, these products are not yet mainstream. They have a lot of buzz in certain communities, but the vast majority of all companies doing software development are still using centralized tools.
Will the DVCS tools make it across the chasm?
In parenting, the fourth stage is the time from elementary school to adolescence. In software, this stage typically covers version 3.0, which is often the first release where the product can be considered mainstream. The key concept for this stage is "talk".
Parents at this stage often express amazement at what their child can do. "Little Bobby is just amazing! Seven years ago we made this baby and now I can carry on an actual conversation with it!"
Similarly, software products in stage 4 have reached the point where most people can actually use them. They're mainstream now. Previous releases were really only popular with early adopters and people who have lots of patience. But release 3.0 is polished enough to be a productive solution for more than half of its target market.
Stage 4 is when products and children begin to develop an unhealthy level of focus on the competition. When kids go to school, they begin to learn that they can make themselves feel better by making others feel worse. It will take them many years to unlearn this lesson, to learn that mental health and personal peace come from the disciplined choice to not worry so much about others and take care of yourself.
Similarly, stage 4 products should probably not be terribly focused on the competition. If you don't have good differentiation by now, you're not gonna get it. Take care of your own customers.
The most important thing for parents and product managers in stage 4 is talking.
This is the stage where kids need information, and it is the last stage when they are actually willing to listen to anything you have to say: Parents need to talk to their kids about the risks ahead. Tell them about the heartache and consequences that can come from poor decisions about smoking and sex and drugs and being a fan of the Chicago Cubs.
Similarly, stage 4 is the time when a product manager's primary job is providing information. Your product is mainstream now. People want it. But to help them realize they want it, you have to give prospective customers lots of information. You need whitepapers. You need demo videos. You need product comparison documents. And so on.
As an example of a product that didn't do so well in stage 4, I cite my own company's flagship product, SourceGear Vault.
Vault is very popular and has been a success for our company. But when it comes to providing all the different kinds of information that a mainstream product needs, we dropped the ball.
Right around the release of Vault 3.0, the product started to get lots buzz through "word of mouth". People would come to our website to get product information, but the stuff we had there was just too anemic.
To our credit, we realized our mistake and took steps to fix it. We hired a product manager to focus on this kind of thing. But still, we got a late start, so even now Vault is still catching up to where it should be.
In parenting, the fifth stage is the teenage years, from adolescence through high school. In software, this stage typically covers the post-3.0 releases. The key concept for this stage is "balance".
 It is a time of transition to adulthood, defined by rebellion. No stage is more trying and difficult for a parent than stage 5. Every parent wants their children to eventually become independent, but few realize just how painful the journey will be. The teenage years are a lot like the terrible twos. When the child doesn't get his way, his anger can be quite explosive. However, instead of lying on the ground kicking and screaming, he shouts "I hate you!" and slams his bedroom door.
But just like the terrible twos, this stage is a critical part of growing up. The parent must strike a balance. This stage is the time to start steering a bit less. Let the teenager take a bit more control over her own life.
Stage 5 is when children and products spend a lot of their time asking for things they don't need:
As product manager in stage 5, you need to give your product some slack. It's time to let customers have some of the features you have been resisting for years. Even if you don't think the feature is a good idea, as long as it won't destroy the product, you should seriously consider letting it happen.
But you still need some boundaries:
The perfect example of a product that ruined its life with poor quality is Microsoft Visual SourceSafe.
Today, SourceSafe is the punch line to almost every joke about version control. It is widely despised and generally regarded to be unreliable.
Before Microsoft acquired SourceSafe, it was an outstanding and highly respected product. This product didn't become the mostly widely used proprietary version control tool for no reason at all. SourceSafe redefined the industry by bringing more ease of use than any of its predecessors.
But under Microsoft's parenting, SourceSafe ruined its life. Versions 5.0 and 6.0 were disastrous. I would bet that SourceSafe has more disdain per user than any other profitable product in history. My company has made megabucks from the world's dissatisfaction with SourceSafe.
Ironically, the latest version of SourceSafe probably doesn't deserve quite the level of scorn that it receives. I haven't used SourceSafe 2005, but I understand that it's not actually that bad. They fixed a lot of problems.
But the product has become something that people love to hate. Now it's too late. The world will never trust SourceSafe again.
In parenting, the sixth stage is adulthood. In software, this stage covers the time when the product is considered mature. The key concept for this stage is "let go".
This is the stage where your work as a parent is basically done. From now on, any mistake your child makes is their own fault. You have to let go.
Similarly, a product manager doesn't have much to do anymore when a product reaches maturity.
For both parent and product manager, this is a time to celebrate the successful end of a long and sometimes difficult journey.
Both parents and product managers often find it difficult to let go. But it is important that you do.
 Your job is to help define and shape the identity of this product.
Once the child is "all grown up", you need to stop trying to help it figure out what it wants to be. It already is.
Let the folks in marcomm, sales and support handle everything from now.
This product is done. Go find the next one.
The two most obvious examples where product managers refused to let go:
These products are done. They've been done for years. Unfortunately, Microsoft has largely failed to find its next product. So, because Microsoft has nothing better to do, they continue to sell us new releases we don't need and create contrived reasons to force us to buy them.
Naturally somebody is going to gripe at me for saying that the two highest-revenue software products in history are a failure. I'm not saying that. What I'm saying is that these two products were stunningly successful in stages one through five, and that doesn't change the fact that their execution of stage 6 has been awful.
The product manager and the parent both suffer from an abundance of diverse opinions. Your local bookstore has hundreds of titles on each topic, many of them offering conflicting advice.
This article contains lots of my opinions about parenting and product marketing. Some of my readers will agree with me. Others will think I am wrong. (The ones in the latter group will send me email.)
The problem with both parenting and product marketing is that everybody knows how to do it, but nobody really knows how to do it.
And in parenting, your best is probably good enough.
This is one very important way that product management is completely different from parenting: Most parents are successful.
Very few parents completely fail. We spend many sleepless hours worrying, but in the end, stuff tends to work out. If you love your kids and give them your best effort, they're probably going to turn out OK.
In contrast, most products fail. Marketing is field where effort and "doing your best" are not usually sufficient.
The Pippin didn't fail because there was no product manager -- it failed because its product manager was a nitwit.
Microsoft isn't flogging us with Windows Vista because they don't care about finding new products. Microsoft tried to find their next product. They tried very hard. They assigned their smartest people to the challenge. They spent many millions of dollars searching for it. But they never found it.
Google did.


Homepage Patterns
These are the designs for the homepage on large screens, tablets, and phones. Designs are shown both with and without grids.
These are the designs for the homepage on large screens, tablets, and phones. Designs are shown both with and without grids.


|
GiroDeGado
|
Files | |
| file | cattle.h [code] |
| This file contains the interface of a Cattle for the GiroDeGado software. | |
| file | cattleImpl.h [code] |
| This file contains the handle/body of a Cattle for the GiroDeGado software. | |
| file | farm.h [code] |
| This file contains the interface of a Farm for the GiroDeGado software. | |
| file | farmImpl.h [code] |
| This file contains the handle/body of a Farm for the GiroDeGado software. | |
| file | handlebody.h [code] |
| The classes Handle and Body implements "bridge" design pattern (also known as "handle/body idiom").The class Body was implemented based on the class teCounted writed by Ricardo Cartaxo and Gilberto Câmara and founded in the geographic library TerraLib. | |
| file | transaction.h [code] |
| This file contains the interface of a Transaction for the GiroDeGado software. | |
| file | transactionImpl.h [code] |
| This file contains the handle/body of a Transaction for the GiroDeGado software. | |
| file | user.h [code] |
| This file contains the interface of a User for the GiroDeGado software. | |
| file | userImpl.h [code] |
| This file contains the handle/body of a User for the GiroDeGado software. | |


|
|
|---|
This is a walk-through as to how to initially set up Tread3D.
Before starting this tutorial you should first get acquainted with the basics of the "Tread3D" editor; the screen and the various commands that are available.
As they say it's "Time to rock"
Start "Tread3D" editor and once the editor has started you should see the following screen.
Now, before you can start mapping you first need to know what .GDF2 game files you have.
Click on the "Options" menu and scroll down to "Script Information".
A new window will appear which lists all .GDF2 game files you have.
Now click "OK".
Now that you know what .GDF2 game files you have it is time to tell Tread3D where the games and associated files are located on your computer. This is necessary because Tread3D does not have to be located on the same drive as the game you are mapping for.
You may obain additional .GDF2 files from the Tread3D website or generate them yourself by using the GDF2 Edit utility.
Click on the "Options" menu and scroll down to "Game Setup".
A new window will appear which will allow you to input the location of the games files.
First click on the game you want to setup.
Then click on the "Texture Files" button.
Now in the middle window navigate until you locate the appropriate file folder where the textures are located.
Finally, in the right window, click on the appropriate file type for the textures.
Now click "Add File".
Now you will notice the path is now in the Status window.
Now it is time to tell Tread3D where files are located and where files should be located to "compile".
Click on the "Build Options" button.
You will now notice that the display window changes.
The changes take place in the status window.
Tread3D is now asking you to fill in some paths.
Now in the status window click on the directory item you want to set.
Now in the navigation window navigate until you locate the appropriate directory folder where the item is located.
Now click "Set Path".
Now you will notice the path is now in the Status window.
Finally, now click "Done".
There is one more task to complete before you can start mapping.
Some basic parameters should be checked and modified if so desired.
Click on the "Options" menu and scroll down to "Tread Setup".
A new window will appear which will allow you to modify some basic parameters.
Texture Gamma With this you can adjust the brightness of the textures in the 3D view.
Back Plane Clipping Distance This will adjust the visible distance in the 3D view.
Curve Sub Division This will adjust "smoothness" of curves in the 3D view.
Now click on the "Max Texture Memory" arrow and a drop-down menu will appear.
Just adjust the memory allocation you desire.
Now click on the "Max Open Maps" arrow and a new drop-down menu will appear.
Just adjust the number of open maps you desire.
Finally, now click "Save".
You should now restart Tread3D for all changes to take effect.
Start "Tread3D" editor and once the editor has started you should see the following screen.
Click on the "File" menu and scroll down to "New".
A new window will appear which lists all .GDF2 game files you have.
Now click on the game you want to make a map for, click "OK" and get ready for the ride.


V1 Update: May 7, 2020
V1 is the first update of my site. As of this update, the only available pages are my home page, briefly describing what the website contain and the context behind it; this About page, describing changes in each update of the site; and an index for comics that will be posted in the future.
V2 Update: May 16, 2020
V2 is the second update of this site. Additional images were added, extra features and graphics were added to page elements, and the first page of the "Pop Culture Asides" comic is added.


Thank you for signing up at The Earth Site!
To confirm your e-mail address, please CLICK HERE
Sincerely,
The Earth Site<EMAIL_ADDRESS>This is to confirm that The Earth Site has just received a registration with your e-mail address. If this is in error, you can unsubscribe here.


Radiology Server Access
All of the imaging and medical patient data is located within UCSF Radiology encrypted Linux servers. Here is how to access them:
List of Radiology servers
Please refer to the full list of Radiology servers (requires UCSF login) for a comprehensive list of servers grouped by CPU and GPU resources.
Here are the two main ways to access the servers:
SSH
Mac and Linux users
- Open a terminal and type the following:
ssh<EMAIL_ADDRESS>-L 9XXX:localhost:9XXX
- For the above command make sure to replace the
username
with your own, theservername
with any of the listed server names (requires UCSF login) and the9XXX
with a number above9020
- There will be a prompt for your UCSF password
PC users
- Use WSL, PuTTY, Cygwin or any other SSH tool:
- Use
servername.radiology.ucsf.edu
as the host name - Specify the local port forwarding, using the same number
9XXX
, higher than9020
, both the source port and the destination port - There will be a prompt for your UCSF password
- Use
VNC
Unlike SSH, VNC allows you to access a virtual display of the servers. This lets you browse through the file system and open visual applications such as Matlab and a web browser in a virtual operating system. Follow these steps to start a VNC session:
- Download and install VNC Viewer.
- Once installed you will need to SSH to the server to which you will VNC into and type the following command into a terminal:
myvncserver
- Towards the bottom of the output, take note of the last number as that will be the display number you will need to access the VNC server. Shown as
radiology.ucsf.edu:7
highlighted below.
- Open VNC Viewer and type the server information in the following form:
- e.g.
servername.radiology.ucsf.edu:7
- You will be prompted for your UCSF username and password.
- e.g.
Advanced
- Refer to the Scientific Computing Services (SCS) official VNC tutorial for more advanced options (requires UCSF login)


Filament Group
Custom select
(
github.com/filamentgroup/select
)
Shipping method:
Ground (7-9 days)
Prioritized (3-5 days)
2-day
Next business day


Password:
Comapny Name:
address1:
address2:
city:
state:
pin:
mobile:
telephone:
website:
email:
submit


{% if user.id != 0 %} links for {{ user.name }} -
post
::
profile
::
logout
{% else %} Not logged in (
login
::
register
) {% endif %}
news
::
articles
::
columns
::
demos
::
forums
::
galleries
another side thing
this is a link
this is another link
this is a link
this link makes the links look more...
natural so i can see shit
this is a link
this is a link
the way it might normally appear
this is a link
a side title
this is a link
this is another link
this is a link
this link makes the links look more...
natural so i can see shit
this is a link
this is a link
the way it might normally appear
this is a link
{% if content %} {{ content||safe }} {% endif %}


Quick pad: The worse notepad ever! It has no features but typing.
Download
Copyright © 2019 Mallis (Software)
Copyright © 2019 Paulo [MYDOGE] (Website)


# create the project:
ng new routing-app --routing
# create components:
ng g c -t nav
ng g c -t home
ng g c -t about
ng g c -t contacts
app-routing.module.ts
:
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
const routes: Routes = [];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
app-routing.module.ts
into our app.module.ts--routing
:
ng new app-name --routing
ng generate module app-routing --flat --module=app
# --flat will generate the file 'app-routing.module.ts' in src/app/ folder,
# --module=app will register it in the imports array of the AppModule.
app-routing.module.ts
content with:
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
const routes: Routes = [];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
const routes: Routes = []
array, where each route is a JavaScript object that contains two properties.
const routes: Routes = [
{ path: 'about', component: AboutComponent },
{ path: 'contacts', component: ContactsComponent },
{ path: 'home', component: HomeComponent },
];
app-routing.module.ts
and exporting them as an array to app.module.ts
...
export class AppRoutingModule { }
export const routingComponents = [
AboutComponent,
ContactsComponent,
HomeComponent
]
import { AppRoutingModule, routingComponents } from './app-routing.module';
routerLink
directive
<router-outlet>
is a router directive that tells the Router where to display routed views<router-outlet>
after the URL is activated.
{ path: '', redirectTo: '/home', pathMatch: 'full' },
ng g c PageNotFound
{ path: '**', component: PageNotFoundComponent },
ng g c -t BooksList
ng g c -t BookDetails
template: `

{{book.name}}

`,
{ path: 'books', component: BooksListComponent },
{ path: 'book/:id', component: BookDetailsComponent },
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router'
@Component({
selector: 'app-book-list',
template: `

{{book.name}}

`,
styleUrls: ['./book-list.component.css']
})
export class BookListComponent implements OnInit {
books = [
{id: 1, name: "Player Piano"},
{id: 2, name: "God Bless You, Mr. Rosewater"},
{id: 3, name: "The Sirens of Titan"},
{id: 4, name: "Cat's Cradle"},
{id: 5, name: "Mother Night"}
]
// inject the router object:
constructor(private router: Router) { }
ngOnInit() {
}
onBookClick(book){
this.router.navigate(['/books', book.id])
}
}
import { ActivatedRoute } from '@angular/router';
import { Location } from '@angular/common';
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-book-detail',
template: `
book-detail for {{bookId}}!
`,
styleUrls: ['./book-detail.component.css']
})
export class BookDetailComponent implements OnInit {
bookId;
constructor(private route:ActivatedRoute) { }
ngOnInit() {
this.bookId = parseInt(this.route.snapshot.paramMap.get('id'));
}
}
href="/books"
in nav.component.html and open the Network tab in Chrome Dev Tools.
Books List
Books List as href
books list
book detail
.active{
color: red;
}
{
path: 'books',
component: BooksListComponent,
outlet:'bookList'
},
Books List
These slides are based on
customised version of
framework


--- title: Implementing Responsive Design by Tim Kadlec excerpt: '
In Implementing #Responsive Design, http://implementingresponsivedesign.com/, @tkadlec collects all the latest #RWD experiments and best practices in one must-have book for all the people who make websites. Highly recommended.
' date: '2012-10-24 21:31:51 +0200' date_gmt: '2012-10-24 19:31:51 +0200' categories: - Books - Webdev ---In Implementing #Responsive Design, http://implementingresponsivedesign.com/, @tkadlec collects all the latest #RWD experiments and best practices in one must-have book for all the people who make websites. Highly recommended.


| subject length |
${orig} |
Parse Xml |
${marcxmlfile} |
|
|
Log To Console |
${orig} |
|
|
|
${subjects} = |
Get Elements |
${orig} |
./facet/group/docHit/meta/subject |
|
Length Should Be |
${subjects} |
11 |
|
|
${couchdbfixture} |
Get File |
${couchdbfile} |
|
|
${couchdbobj} |
loads |
${couchdbfixture} |
|
|
${cdblen} = |
Get Length |
${couchdbobj['sourceResource']['subject']} |
|
|
Should Be Equal As Numbers |
${cdblen} |
11 |
|
| grab data test |
${cdoc} |
Get Couch Doc |
26094--00000001 |
|
|
Log To Console |
===== CDOC -> ${cdoc['sourceResource'].keys()} from live data |
|
|
|
Log To Console |
===== CDOC TITLE-> ${cdoc['sourceResource']['title']} from live data |
|
|
|
Log To Console |
===== CDOC TEMPORAL-> ${cdoc['sourceResource']['temporal']} from live data |
|
|