|
By Eric Lawrey, Copyright 1997-2001
The telecommunications industry faces the
problem of providing telephone services to rural areas, where the customer
base is small, but the cost of installing a wired phone network is very
high. One method of reducing the high infrastructure cost of a wired system
is to use a fixed wireless radio network. The problem with this is that
for rural and urban areas, large cell sizes are required to obtain sufficient
coverage. This results in problems cased by large signal path loss and
long delay times in multipath signal propagation.
Currently Global System for Mobile telecommunications
(GSM) technology is being applied to fixed wireless phone systems in rural
areas or Australia. However, GSM uses Time Division Multiple Access (TDMA),
which has a high symbol rate leading to problems with multipath causing
inter-symbol interference.
Several techniques are under consideration
for the next generation of digital phone systems, with the aim of improving
cell capacity, multipath immunity, and flexibility. These include Code
Division Multiple Access (CDMA) and Coded Orthogonal Frequency Division
Multiplexing (COFDM). Both these techniques could be applied to providing
a fixed wireless system for rural areas. However, each technique has different
properties, making it more suited for specific applications.
COFDM is currently being used in several
new radio broadcast systems including the proposal for high definition
digital television, Digital Video Broadcasting (DVB) and Digital Audio
Broadcasting (DAB). However, little research has been done into the use
of COFDM as a transmission method for mobile telecommunications systems.
With CDMA systems, all users transmit in
the same frequency band using specialized codes as a basis of channelization.
The transmitted information is spread in bandwidth by multiplying it by
a wide bandwidth pseudo random sequence. Both the base station and the
mobile station know these random codes that are used to modulate the data
sent, allowing it to de-scramble the received signal.
OFDM/COFDM allows many users to transmit
in an allocated band, by subdividing the available bandwidth into many
narrow bandwidth carriers. Each user is allocated several carriers in which
to transmit their data. The transmission is generated in such a way that
the carriers used are orthogonal to one another, thus allowing them to
be packed together much closer than standard frequency division multiplexing
(FDM). This leads to OFDM/COFDM providing a high spectral efficiency.
1.1 Third Generation Wireless Networks
The expansion of the use of digital networks
has led to the need for the design of new higher capacity communications
networks. The demand for cellular-type systems in Europe is predicted to
be between 15 and 20 million users by the year 2000 [1], and is already
over 30 million (1995) in the U.S. [2]. Wireless services have been growing
at a rate greater than 50% per year [2], with the current second-generation
European digital systems (GSM) being expected to be filled to capacity
by the early 2000ís[3]. The telecommunications industry is also changing,
with a demand for a greater range of services such as video conferencing,
Internet services, and data networks, and multimedia. This demand for higher
capacity networks has led to the development of third generation telecommunications
systems.
One of the proposed third generation telecommunications
systems is the Universal Mobile Telecommunications System (UMTS), which
aims to provide a more flexible data rate, a higher capacity, and a more
tightly integrated service, than current second generation mobile systems.
This section focuses on the services and aims of the UMTS. Other systems
around the world are being developed, however many of these technologies
are expected to be eventually combined into the UMTS.
The World Wide Web (WWW) has become an
important communications media, as its use has increased dramatically over
the last few years. This has resulted in an increased demand for computer
networking services. In order to satisfy this, telecommunications systems
are now being used for computer networking, Internet access and voice communications.
A WWW survey revealed that more then 60% of users access the Internet from
residential locations [10], where the bandwidth is often limited to 28.8kbps
[8]. This restricts the use of the Internet, preventing the use of real
time audio and video capabilities. Higher speed services are available,
such as integrated-services digital network (ISDN). These provide data
rates up to five times as fast, but at a much-increased access cost. This
has led to the demand of a more integrated service, providing faster data
rates, and a more universal interface for a variety of services. The emphasis
has shifted away from providing a fixed voice service to providing a general
data connection that allows for a wide variety of applications, such as
voice, Internet access, computer networking, etc.
The increased reliance on computer networking
and the Internet has resulted in demand for connectivity to be provided
ďany where, any timeĒ, leading to an increase in the demand for wireless
systems. This demand has driven the need to develop new higher capacity,
high reliability wireless telecommunications systems.
The development and deployment of third
generation telecommunication systems aim to overcome some of the downfalls
of current wireless systems by providing a high capacity, integrated wireless
network. There are currently several third generation wireless standards,
including UMTS, cdmaOne, IMT 2000, and IS-95 [10].
1.1.1 Evolution of Telecommunication Systems.
Many mobile radio standard have been developed
for wireless systems throughout the world, with more standards likely to
emerge.
Most first generations systems were introduced
in the mid 1980ís, and can be characterized by the use of analog transmission
techniques, and the use of simple multiple access techniques such as Frequency
Division Multiple Access (FDMA). First generation telecommunications systems
such as Advanced Mobile Phone Service (AMPS) [4] only provided voice communications.
They also suffered from a low user capacity, and security problems due
to the simple radio interface used.
Second generation systems were introduced
in the early 1990ís, and all use digital technology. This provided an increase
in the user capacity of around three times [6]. This was achieved by compressing
the voice waveforms before transmission [7].
Third generation systems are an extension
on the complexity of second-generation systems and will begin roll out
of services sometime after the year 2001. The capacity of third generation
systems is expected to be over ten times original first generation systems.
This is going to be achieved by using complex multiple access techniques
such as CDMA, or an extension of TDMA, and by improving flexibility of
services available.
Table 1 and Table 2 show some of the major
cellular mobile phone standards in North America and Europe.
| Cellular System |
Year of Introduction |
Transmission Type |
Multiple Access Technique |
Channel Bandwidth |
System Generation |
| Advanced Mobile Phone System (AMPS) |
1983 |
Analog |
FDMA |
30kHz |
First |
| Narrowband AMPS (NAMPS) |
1992 |
Analog |
FDMA |
10kHz |
First |
| U.S. Digital Cellular (USDC) |
1991 |
Digital |
TDMA |
30kHz |
Second |
| U.S Narrowband Spread Spectrum(IS-95) |
1993 |
Digital |
CDMA |
1.25MHz |
Second |
| Wideband cdmaOne |
2000 |
Digital |
CDMA |
- |
Third |
Table 1 Major Mobile Standards in North America[6]
| Cellular System |
Year of Introduction |
Transmission Type |
Multiple Access Technique |
Channel Bandwidth |
System Generation |
| E-TACS |
1985 |
Analog |
FDMA |
25kHz |
First |
| NMT-900 |
1986 |
Analog |
FDMA |
12.5kHz |
First |
| Global System for Mobile (GSM) |
1990 |
Digital |
TDMA |
200kHz |
Second |
| Universal Mobile Tele-communications System (UMTS) |
>2000 |
Digital |
CDMA/ TDMA |
- |
Third |
Table 2 Major Mobile Standards in Europe[6]
Figure 1 shows the evolution of current
services and networks to the aim of combining them into a unified third
generation network. Many currently separate systems and services such as
radio paging, cordless telephony, satellite phones, private radio systems
for companies etc, will be combined so that all these services will be
provided by third generation telecommunications systems.
Figure 1 Evolution of current networks
to the next generation of wirless networks (reproduced from [1])
1.1.2 Overall Aims of Universal Mobile Telecommunications System
The main aims of the Universal Mobile Telecommunications
System is to provide a more unified high capacity network, in wireless
and wired environments. UMTS will enable fixed and wireless services to
converge. There are to be three main channel capacity connections: a mobile
rate of 144kbps; a portable rate of 384kbps and an in-building rate of
2Mbps [10]. It will have the capacity to provide services and features
requiring less then 2Mbps that would otherwise have been provided with
a fixed network. UMTS must therefore provide on-demand, variable bandwidth
allocation. It will also combine a range of applications including cordless
phones, cellular phones, and mobile data networking for personal, business
and residential use.
1.1.3 Teleservices
Many services have been identified for
the UMTS, which can be categorized based on the data rate required, quality
of service (reliability and allowable bit error rate (BER)), real time
transfer rate. Each of the services has different characteristics in terms
of delay tolerance and allowable bit error rates. Table 3 shows characteristics
for some of the UMTS services.
| Applications or Services |
Data Rate Required |
Quality of service required |
Time critical data |
| Messaging (email, etc) |
Low (1-10kbps) |
High |
No |
| Voice |
Low (4-20kpbs) |
Low (BER < 1e-3) |
Yes |
| Web browsing |
As high as possible (>10kbps-100kbps) |
High (BER < 1e-9) |
Depends on material. Generally not time critical. |
| Videoconferencing |
High (100kbps-1Mbps) |
Medium |
Yes |
| Video Surveillance |
Medium (50-300kbps) |
Medium |
No |
| High Quality Audio |
High (100-300kbps) |
Medium |
Yes |
| Database access |
High (>30kbps) |
Very High |
No |
Table 3 UMTS Services, showing the data characteristics of each service
The data characteristics will determine
the most suitable transmission methods. The type of data associated with
each service determines the type of environment in which the service can
be supported.
1.1.4 UMTS Environments
The aim of the UMTS systems is to provide
an ďany where, any timeĒ service, thus the operating environment will vary
depending on the user location. The environment in which the wireless system
must operate affects the system capacity and type of services that can
be provided. Table 4 lists some of the environments in which UMTS will
be required to provide coverage.
| Environment |
Maximum supported Data Rate |
| Business (indoor) |
384kbps |
| Suburban (indoor/outdoor) |
144kbps |
| Urban vehicular (outdoor) |
144kbps |
| Urban pedestrian (outdoor) |
144kbps |
| Fixed (Outdoor) |
144kbps / 384kbps |
| Local high bit rate (Indoor) |
2Mbps |
Table 4 Maximum supported data rates for UMTS, for various environments.
The maximum supported data rate for each
environment is related to the cell size required to provide adequate coverage
for the environment.
1.1.5 Cell types
A cellular network is required to ensure
the UMTS can provide a high capacity network. As with any cellular system,
the total capacity of the network is dependent on the size of the cells
used. The smaller the cells are made, the larger the total capacity. However,
the cell size is limited by the amount of infrastructure. The cell size
also determines the maximum channel capacity for each cell, as propagation
effects, such as multipath delay spread and high path loss, force large
cells to have a lower data rate. Large cells also have to service a large
number of users, and since the cell capacity is approximately fixed, each
user can only have a reduced data rate, with respect to a smaller cell.
In order to optimise the cellular network three cell types are used. These
are the pico-cell, micro cell, and macro-cell. The three different cell
types trade off cell size will total capacity and services. Table 5 shows
the three cell types used in the UMTS system and some of the cell characteristics.
| |
Pico-cell |
Micro-cell |
Macro-cell |
| Cell radius |
<100m |
<1000m |
<20km |
| Antenna |
Ceiling/wall mounted |
Below roof top height |
Roof top mounting |
| Max. multipath delay spread |
1 msec |
5 msec |
20 msec |
| Applications and environments |
Indoor/Outdoor
Within buildings
City centres
Local high bit rate |
High density outdoor
Business (indoor)
Fixed (Outdoor)
Inner city areas |
Low density areas
Suburban areas
Urban areas
Fixed (outdoor) |
| Services and data rate supported |
All services (up to 2Mbps) |
Up to 384kbps |
Limited sub-set
(up to 144kpbs) |
Table 5 Cell Types used in UTMS
The size and type of coverage of each cell
type effects the radio propagation problems that will be encountered. This
will determine the most suitable radio transmission technique to use.
1.1.6 Radio Interface
One of the aims identified for UMTS is
to provide a wireless interface comparable to wired connections. The requirement
to provide wide band services up to 2Mb/s, with flexible, on demand allocation
of transmission capacity in a large range of radio environments, will call
for a revolution in the radio access techniques used.
The radio interface is currently undergoing
substantial research, with the relative performance of CDMA and TDMA being
investigated [9]. Currently CDMA appears to be the most likely candidate
for supporting the high data rate required. However, other techniques such
as COFDM and hybrid solutions may also be appropriate for UMTS.
1.1.7 Satellite Networking
One of the aims of the UMTS is to provide
access ďany where, any timeĒ. However, cellular networks can only cover
a limited area due to the high infrastructure costs. For this reason, satellite
systems will form an integral part of the UMTS network. Satellites will
be able to provide an extended wireless coverage to remote areas and to
aeronautical and maritime mobiles. The level of integration of the satellite
systems with the terrestrial cellular networks is under investigation.
A fully integrated solution will require mobiles to be dual mode terminals
that would allow communications with orbiting satellites and terrestrial
cellular networks. Low Earth Orbit (LEO) satellites are the most likely
candidates for providing worldwide coverage.
Currently several low earth orbit satellite
systems are being deployed for providing global telecommunications. These
include the Teledesic System, which is scheduled to begin operation by
the end of 2002 with 288 satellites [10], to provide high bandwidth two-way
communications to virtually anywhere in the world. However, the Teledesic
System will not be able to meet even 20% of the demand [10], thus the need
for broadband wireless networks.
(Addendum,
10/2001: Current estimates put the release date of the Teledesic System
sometime in 2005, see www.teledesic.com).
1.1.8 Timetable for System Implementation
Across the globe, each region is moving
to make third generation systems happen. Japan is looking at having a system
up and running by year 2001. This is driven by the very high demand for
mobile communications, which has been so great that their second-generation
cellular networks are starting to run out of capacity [10]. It is expected
that Europe will have a wide band CDMA system by the year 2005 [10]. The
U.S. is expected to implement a third generation system somewhere from
2000 to 2010 [10].
Manufacturers are creating several standards
to meet requirements in each sector of the world. To date, the majority
of systems are based on CDMA standards. Before infrastructure rolls out,
third generations will be developed on a regional basis.
This process is being guided by the International
Telecommunications Unionís (ITU) effort to create the IMT 2000 standard.
ITU will produce the IMT 2000 standard by the year 2000, with the aim of
combining the regional systems into a unified standard [10].
1.1.9 Conclusion
Future communications will be driven by
the need to provide a more integrated high capacity, wide coverage service.
For the 21st century user there should ideally be no distinction
in service capability between mobile or fixed network access. This will
be achieved using a variety of technologies including satellite communications,
advanced radio networking techniques, and high speed fixed networks.
1.2 Propagation Characteristics of mobile radio channels
In an ideal radio channel, the received
signal would consist of only a single direct path signal, which would be
a perfect reconstruction of the transmitted signal. However in a real channel,
the signal is modified during transmission in the channel. The received
signal consists of a combination of attenuated, reflected, refracted, and
diffracted replicas of the transmitted signal. On top of all this, the
channel adds noise to the signal and can cause a shift in the carrier frequency
if the transmitter, or receiver is moving (Doppler effect). Understanding
of these effects on the signal is important because the performance of
a radio system is dependent on the radio channel characteristics.
1.2.1 Attenuation
Attenuation is the drop in the signal power
when transmitting from one point to another. It can be caused by the transmission
path length, obstructions in the signal path, and multipath effects. Figure
2 shows some of the radio propagation effects that cause attenuation. Any
objects that obstruct the line of sight signal from the transmitter to
the receiver can cause attenuation.
Figure 2 Radio Propagation Effects
Shadowing of the signal can occur whenever
there is an obstruction between the transmitter and receiver. It is generally
caused by buildings and hills, and is the most important environmental
attenuation factor.
Shadowing is most severe in heavily built
up areas, due to the shadowing from buildings. However, hills can cause
a large problem due to the large shadow they produce. Radio signals diffract
off the boundaries of obstructions, thus preventing total shadowing of
the signals behind hills and buildings. However, the amount of diffraction
is dependent on the radio frequency used, with low frequencies diffracting
more then high frequency signals. Thus high frequency signals, especially,
Ultra High Frequencies (UHF), and microwave signals require line of sight
for adequate signal strength. To over come the problem of shadowing, transmitters
are usually elevated as high as possible to minimise the number of obstructions.
Typical amounts of variation in attenuation due to shadowing are shown
in Table 6.
| Description |
Typical Attenuation due to Shadowing |
| Heavily built-up urban centre |
20dB variation from street to street |
| Sub-urban area (fewer large buildings) |
10dB greater signal power then built-up urban center |
| Open rural area |
20dB greater signal power then sub-urban areas |
| Terrain irregularities and tree foliage |
3-12dB signal power variation |
Table 6 Typical shadowing in a radio channel (Values from [11])
Shadowed areas tend to be large, resulting
in the rate of change of the signal power being slow. For this reason,
it is termed slow-fading, or log-normal shadowing.
1.2.2 Multipath Effects
<IP_ADDRESS> Rayleigh fading
In a radio link, the RF signal from the
transmitter may be reflected from objects such as hills, buildings, or
vehicles. This gives rise to multiple transmission paths at the receiver.
Figure 3 show some of the possible ways in which multipath signals can
occur.
Figure 3 Multipath Signals
The relative phase of multiple reflected
signals can cause constructive or destructive interference at the receiver.
This is experienced over very short distances (typically at half wavelength
distances), thus is given the term fast fading. These variations can vary
from 10-30dB over a short distance. Figure 4 shows the level of attenuation
that can occur due to the fading.
Figure 4 Typical Rayleigh fading while the Mobile Unit is moving (for at 900 MHz)[15]
The Rayleigh distribution is commonly used
to describe the statistical time varying nature of the received signal
power. It describes the probability of the signal level being received
due to fading. Table 7 shows the probability of the signal level for the
Rayleigh distribution.
| Signal Level (dB about median) |
% Probability of Signal Level being less then the value given |
| 10 |
99 |
| 0 |
50 |
| -10 |
5 |
| -20 |
0.5 |
| -30 |
0.05 |
Table 7 Cummulative distribution for Rayleigh distribution (Value from [15])
<IP_ADDRESS> Frequency Selective Fading
In any radio transmission, the channel
spectral response is not flat. It has dips or fades in the response due
to reflections causing cancellation of certain frequencies at the receiver.
Reflections off near-by objects (e.g. ground, buildings, trees, etc) can
lead to multipath signals of similar signal power as the direct signal.
This can result in deep nulls in the received signal power due to destructive
interference.
For narrow bandwidth transmissions if the
null in the frequency response occurs at the transmission frequency then
the entire signal can be lost. This can be partly overcome in two ways.
By transmitting a wide bandwidth signal
or spread spectrum as CDMA, any dips in the spectrum only result in a small
loss of signal power, rather than a complete loss. Another method is to
split the transmission up into many small bandwidth carriers, as is done
in a COFDM/OFDM transmission. The original signal is spread over a wide
bandwidth and so nulls in the spectrum are likely to only affect a small
number of carriers rather than the entire signal. The information in the
lost carriers can be recovered by using forward error correction techniques.
<IP_ADDRESS> Delay Spread
The received radio signal from a transmitter
consists of typically a direct signal, plus reflections off objects such
as buildings, mountings, and other structures. The reflected signals arrive
at a later time then the direct signal because of the extra path length,
giving rise to a slightly different arrival times, spreading the received
energy in time. Delay spread is the time spread between the arrival of
the first and last significant multipath signal seen by the receiver.
In a digital system, the delay spread can
lead to inter-symbol interference. This is due to the delayed multipath
signal overlapping with the following symbols. This can cause significant
errors in high bit rate systems, especially when using time division multiplexing
(TDMA). Figure 5 shows the effect of inter-symbol interference due to delay
spread on the received signal. As the transmitted bit rate is increased
the amount of inter-symbol interference also increases. The effect starts
to become very significant when the delay spread is greater then ~50% of
the bit time.
Figure 5 Multipath Delay Spread
Table 8 shows the typical delay spread
for various environments. The maximum delay spread in an outdoor environment
is approximately 20 us, thus significant inter-symbol interference can
occur at bit rates as low as 25 kbps.
| Environment or cause |
Delay Spread |
Maximum Path Length Difference |
| Indoor (room) |
40 nsec - 200 nsec |
12 m - 60 m |
| Outdoor |
1 m sec - 20 m sec |
300 m - 6 km |
Table 8 Typical Delay Spread
Inter-symbol interference can be minimized
in several ways. One method is to reduce the symbol rate by reducing the
data rate for each channel (i.e. split the bandwidth into more channels
using frequency division multiplexing, or OFDM). Another is to use a coding
scheme that is tolerant to inter-symbol interference such as CDMA.
1.2.3 Doppler Shift
When a wave source and a receiver are moving
relative to one another the frequency of the received signal will not be
the same as the source. When they are moving toward each other the frequency
of the received signal is higher then the source, and when they are approaching
each other the frequency decreases. This is called the Doppler effect.
An example of this is the change of pitch in a carís horn as it approaches
then passes by. This effect becomes important when developing mobile radio
systems.
The amount the frequency changes due to
the Doppler effect depends on the relative motion between the source and
receiver and on the speed of propagation of the wave. The Doppler shift
in frequency can be written:
(from [12])
Where Df
is the change in frequency of the source seen at the receiver , fo
is the frequency of the source, v is the speed difference between the source
and transmitter, and c is the speed of light.
For example: Let fo=
1GHz, and v = 60km/hr (16.7m/s) then the Doppler shift will be:
This shift of 55Hz in the carrier will
generally not effect the transmission. However, Doppler shift can cause
significant problems if the transmission technique is sensitive to carrier
frequency offsets (for example OFDM) or the relative speed is higher (for
example in low earth orbiting satellites).
1.3Multiple Access Techniques
Multiple access schemes are used to allow
many simultaneous users to use the same fixed bandwidth radio spectrum.
In any radio system, the bandwidth that is allocated to it is always limited.
For mobile phone systems the total bandwidth is typically 50 MHz, which
is split in half to provide the forward and reverse links of the system.
Sharing of the spectrum is required in order increase the user capacity
of any wireless network. FDMA, TDMA and CDMA are the three major methods
of sharing the available bandwidth to multiple users in wireless system.
There are many extensions, and hybrid techniques for these methods, such
as OFDM, and hybrid TDMA and FDMA systems. However, an understanding of
the three major methods is required for understanding of any extensions
to these methods.
1.3.1 Frequency Division Multiple Access
For systems using Frequency Division Multiple
Access (FDMA), the available bandwidth is subdivided into a number of narrower
band channels. Each user is allocated a unique frequency band in which
to transmit and receive on. During a call, no other user can use the same
frequency band. Each user is allocated a forward link channel (from the
base station to the mobile phone) and a reverse channel (back to the base
station), each being a single way link. The transmitted signal on each
of the channels is continuous allowing analog transmissions. The channel
bandwidth used in most FDMA systems is typically low (30kHz) as each channel
only needs to support a single user. FDMA is used as the primary subdivision
of large allocated frequency bands and is used as part of most multi-channel
systems.
Figure 6 and Figure 7 shows the allocation
of the available bandwidth into several channels.
Figure 6 FDMA showing that the each narrow band channel is allocated to a single
user
Figure 7 FDMA spectrum, where the available bandwidth is subdivided into narrower
band channels
1.3.2 Time Division Multiple Access
Time Division Multiple Access (TDMA) divides
the available spectrum into multiple time slots, by giving each user a
time slot in which they can transmit or receive. Figure 8 shows how the
time slots are provided to users in a round robin fashion, with each user
being allotted one time slot per frame.
Figure 8 TDMA scheme where each user is allocated a small time slot
TDMA systems transmit data in a buffer
and burst method, thus the transmission of each channel is non-continuous.
The input data to be transmitted is buffered over the previous frame and
burst transmitted at a higher rate during the time slot for the channel.
TDMA can not send analog signals directly due to the buffering required,
thus is only used for transmitting digital data. TDMA can suffer from multipath
effects as the transmission rate is generally very high, resulting in significant
inter-symbol interference.
TDMA is normally used in conjunction with
FDMA to subdivide the total available bandwidth into several channels.
This is done to reduce the number of users per channel allowing a lower
data rate to be used. This helps reduce the effect of delay spread on the
transmission. Figure 9 shows the use of TDMA with FDMA. Each channel based
on FDMA, is further subdivided using TDMA, so that several users can transmit
of the one channel. This type of transmission technique is used by most
digital second generation mobile phone systems. For GSM, the total allocated
bandwidth of 25MHz is divided into 125, 200kHz channels using FDMA. These
channels are then subdivided further by using TDMA so that each 200kHz
channel allows 8-16 users [13].
Figure 9 TDMA / FDMA hybrid, showing that the bandwidth is split into frequency
channels and time slots
1.3.3 Code Division Multiple Access
Code Division Multiple Access (CDMA) is
a spread spectrum technique that uses neither frequency channels nor time
slots. With CDMA, the narrow band message (typically digitised voice data)
is multiplied by a large bandwidth signal that is a pseudo random noise
code (PN code). All users in a CDMA system use the same frequency band
and transmit simultaneously. The transmitted signal is recovered by correlating
the received signal with the PN code used by the transmitter. Figure 10
shows the general use of the spectrum using CDMA.
Figure 10 Code division multiple access (CDMA)
CDMA technology was originally developed
by the military during World War II [14]. Researchers were spurred into
looking at ways of communicating that would be secure and work in the presence
of jamming. Some of the properties that have made CDMA useful are:
-
· Signal hiding and non-interference
with existing systems.
-
· Anti-jam and interference rejection
-
· Information security
-
· Accurate Ranging
-
· Multiple User Access
-
· Multipath tolerance
For many years, spread spectrum technology
was considered solely for military applications. However, with rapid developments
in LSI and VLSI designs, commercial systems are starting to be used.
1.3.4 CDMA Process Gain
One of the most important concepts required
in order to understand spread spectrum techniques is the idea of process
gain. The process gain of a system indicates the gain or signal to noise
improvement exhibited by a spread spectrum system by the nature of the
spreading and despreading process. The process gain of a system is equal
to the ratio of the spread spectrum bandwidth used, to the original information
bandwidth. Thus, the process gain can be written as:
Where BWRF is the transmitted
bandwidth after the data is spread, and BWinfo is the bandwidth
of the information data being sent.
Figure 11 shows the process of a CDMA transmission.
The data to be transmitted (a) is spread before transmission by modulating
the data using a PN code. This broadens the spectrum as shown in (b). In
this example the process gain is 125 as the spread spectrum bandwidth is
125 times greater the data bandwidth. Part (c) shows the received signal.
This consists of the required signal, plus background noise, and any interference
from other CDMA users or radio sources. The received signal is recovered
by multiplying the signal by the original spreading code. This process
causes the wanted received signal to be despread back to the original transmitted
data. However, all other signals that are uncorrelated to the PN spreading
code become more spread. The wanted signal in (d) is then filtered removing
the wide spread interference and noise signals.
Figure 11 Basic CDMA transmission.
1.3.5 CDMA Generation
CDMA is achieved by modulating the data
signal by a pseudo random noise sequence (PN code), which has a chip rate
higher then the bit rate of the data. The PN code sequence is a sequence
of ones and zeros (called chips), which alternate in a random fashion.
Modulating the data with this PN sequence generates the CDMA signal. The
CDMA signal is generated by modulating the data by the PN sequence. The
modulation is performed by multiplying the data (XOR operator for binary
signals) with the PN sequence. Figure 12 shows a basic CDMA transmitter.
Figure 12 Simple direct sequence modulator
The PN code used to spread the data can
be of two main types. A short PN code (typically 10-128 chips in length)
can be used to modulate each data bit. The short PN code is then repeated
for every data bit allowing for quick and simple synchronization of the
receiver. Figure 13 shows the generation of a CDMA signal using a 10-chip
length short code. Alternatively a long PN code can be used. Long codes
are generally thousands to millions of chips in length, thus are only repeated
infrequently. Because of this they are useful for added security as they
are more difficult to decode.
Figure 13 Direct sequence signals
1.3.6 CDMA Forward Link Encoding
The forward link, from the base station
to the mobile, of a CDMA system can use special orthogonal PN codes, called
Walsh codes, for separating the multiple users on the same channel. These
are based on a Walsh matrix, which is a square matrix with binary elements
and dimensions that are a power of two. It is generated from the
basis that Walsh(1) = W1 = 0 and that:
Where Wn is the Walsh matrix
of dimension n. For example:
Walsh codes are orthogonal, which means
that the dot product of any two rows is zero. This is due to the fact that
for any two rows exactly half the number of bits match and half do not.
Each row of a Walsh matrix can be used
as the PN code of a user in a CDMA system. By doing this the signals from
each user is orthogonal to every other user, resulting in no interference
between the signals. However, in order for Walsh codes to work the transmitted
chips from all users must be synchronized. If the Walsh code used by one
user is shifted in time by more than about 1/10 of chip period, with respect
to all the other Walsh codes, it looses its orthogonal nature resulting
in inter-user interference. This is not a problem for the forward link
as signals for all the users originate from the base station, ensuring
that all the signal remain synchronized.
1.3.7 CDMA Reverse Link Encoding
The reverse link is different to the forward
link because the signals from each user do not originate from a same source
as in the forward link. The transmission from each user will arrive at
a different time, due to propagation delay, and synchronization errors.
Due to the unavoidable timing errors between the users, there is little
point in using Walsh codes as they will no longer be orthogonal. For this
reason, simple pseudo random sequences are typically used. These sequences
are chosen to have a low cross correlation to minimise interference between
users.
The capacity is different for the forward
and the reverse links because of the differences in modulation. The reverse
link is not orthogonal, resulting in significant inter-user interference.
For this reason the reverse channel sets the capacity of the system.
1.3.8 Orthogonal Frequency Division Multiplexing
Orthogonal Frequency Division Multiplexing
(OFDM) is a multicarrier transmission technique, which divides the available
spectrum into many carriers, each one being modulated by a low rate data
stream. OFDM is similar to FDMA in that the multiple user access is achieved
by subdividing the available bandwidth into multiple channels, which are
then allocated to users. However, OFDM uses the spectrum much more efficiently
by spacing the channels much closer together. This is achieved by making
all the carriers orthogonal to one another, preventing interference between
the closely spaced carriers.
Coded Orthogonal Frequency Division Multiplexing
(COFDM) is the same as OFDM except that forward error correction is applied
to the signal before transmission. This is to overcome errors in the transmission
due to lost carriers from frequency selective fading, channel noise and
other propagation effects. For this discussion the terms OFDM and COFDM
are used interchangeably, as the main focus of this thesis is on OFDM,
but it is assumed that any practical system will use forward error correction,
thus would be COFDM.
In FDMA each user is typically allocated
a single channel, which is used to transmit all the user information. The
bandwidth of each channel is typically 10 kHz-30 kHz for voice communications.
However, the minimum required bandwidth for speech is only 3 kHz. The allocated
bandwidth is made wider then the minimum amount required to prevent channels
from interfering with one another. This extra bandwidth is to allow for
signals from neighbouring channels to be filtered out, and to allow for
any drift in the centre frequency of the transmitter or receiver. In a
typical system up to 50% of the total spectrum is wasted due to the extra
spacing between channels. This problem becomes worse as the channel bandwidth
becomes narrower, and the frequency band increases.
Most digital phone systems use vocoders
to compress the digitised speech. This allows for an increased system capacity
due to a reduction in the bandwidth required for each user. Current vocoders
require a data rate somewhere between 4-13kbps [13], with depending on
the quality of the sound and the type used. Thus each user only requires
a minimum bandwidth of somewhere between 2-7 kHz, using QPSK modulation.
However, simple FDMA does not handle such narrow bandwidths very efficiently.
TDMA partly overcomes this problem by using
wider bandwidth channels, which are used by several users. Multiple users
access the same channel by transmitting in their data in time slots. Thus,
many low data rate users can be combined together to transmit in a single
channel that has a bandwidth sufficient so that the spectrum can be used
efficiently.
There are however, two main problems with
TDMA. There is an overhead associated with the change over between users
due to time slotting on the channel. A change over time must be allocated
to allow for any tolerance in the start time of each user, due to propagation
delay variations and synchronization errors. This limits the number of
users that can be sent efficiently in each channel. In addition, the symbol
rate of each channel is high (as the channel handles the information from
multiple users) resulting in problems with multipath delay spread.
OFDM overcomes most of the problems with
both FDMA and TDMA. OFDM splits the available bandwidth into many narrow
band channels (typically 100-8000). The carriers for each channel are made
orthogonal to one another, allowing them to be spaced very close together,
with no overhead as in the FDMA example. Because of this there is no great
need for users to be time multiplex as in TDMA, thus there is no overhead
associated with switching between users.
The orthogonality of the carriers means
that each carrier has an integer number of cycles over a symbol period.
Due to this, the spectrum of each carrier has a null at the centre frequency
of each of the other carriers in the system. This results in no interference
between the carriers, allowing then to be spaced as close as theoretically
possible. This overcomes the problem of overhead carrier spacing required
in FDMA.
Each carrier in an OFDM signal has a very
narrow bandwidth (i.e. 1 kHz), thus the resulting symbol rate is low. This
results in the signal having a high tolerance to multipath delay spread,
as the delay spread must be very long to cause significant inter-symbol
interference (e.g. > 100 msec).
1.3.9 OFDM generation
To generate OFDM successfully the relationship
between all the carriers must be carefully controlled to maintain the orthogonality
of the carriers. For this reason, OFDM is generated by firstly choosing
the spectrum required, based on the input data, and modulation scheme used.
Each carrier to be produced is assigned some data to transmit. The required
amplitude and phase of the carrier is then calculated based on the modulation
scheme (typically differential BPSK, QPSK, or QAM). The required spectrum
is then converted back to its time domain signal using an Inverse Fourier
Transform. In most applications, an Inverse Fast Fourier Transform (IFFT)
is used. The IFFT performs the transformation very efficiently, and provides
a simple way of ensuring the carrier signals produced are orthogonal.
The Fast Fourier Transform (FFT) transforms
a cyclic time domain signal into its equivalent frequency spectrum. This
is done by finding the equivalent waveform, generated by a sum of orthogonal
sinusoidal components. The amplitude and phase of the sinusoidal components
represent the frequency spectrum of the time domain signal. The IFFT performs
the reverse process, transforming a spectrum (amplitude and phase of each
component) into a time domain signal. An IFFT converts a number of complex
data points, of length that is a power of 2, into the time domain signal
of the same number of points. Each data point in frequency spectrum used
for an FFT or IFFT is called a bin.
The orthogonal carriers required for the
OFDM signal can be easily generated by setting the amplitude and phase
of each frequency bin, then performing the IFFT. Since each bin of an IFFT
corresponds to the amplitude and phase of a set of orthogonal sinusoids,
the reverse process guarantees that the carriers generated are orthogonal.
Figure 14 Basic FFT, OFDM transmitter and receiver
Figure 14 shows the configuration for a
basic OFDM transmitter and receiver. The signal generated is at base-band
and so to generate an RF signal the signal must be filtered and mixed to
the desired transmission frequency.
1.3.10 Adding a Guard Period to OFDM
One of the most important properties of
OFDM transmissions is its high level of robustness against multipath delay
spread. This is a result of the long symbol period used, which minimises
the inter-symbol interference. The level of multipath robustness can be
further increased by the addition of a guard period between transmitted
symbols. The guard period allows time for multipath signals from the pervious
symbol to die away before the information from the current symbol is gathered.
The most effective guard period to use is a cyclic extension of the symbol.
If a mirror in time, of the end of the symbol waveform is put at the start
of the symbol as the guard period, this effectively extends the length
of the symbol, while maintaining the orthogonality of the waveform. Using
this cyclic extended symbol the samples required for performing the FFT
(to decode the symbol), can be taken anywhere over the length of the symbol.
This provides multipath immunity as well as symbol time synchronization
tolerance.
As long as the multipath delay echoes stay
within the guard period duration, there is strictly no limitation regarding
the signal level of the echoes: they may even exceed the signal level of
the shorter path! The signal energy from all paths just add at the input
to the receiver, and since the FFT is energy conservative, the whole available
power feeds the decoder. If the delay spread is longer then the guard interval
then they begin to cause inter-symbol interference. However, provided the
echoes are sufficiently small they do not cause significant problems. This
is true most of the time as multipath echoes delayed longer than the guard
period will have been reflected of very distant objects.
Other variations of guard periods are possible.
One possible variation is to have half the guard period a cyclic extension
of the symbol, as above, an the other half a zero amplitude signal. This
will result in a signal as shown in Figure 15. Using this method the symbols
can be easily identified. This possibly allows for symbol timing to be
recovered from the signal, simply by applying envelop detection. The disadvantage
of using this guard period method is that the zero period does not give
any multipath tolerance, thus the effective active guard period is halved
in length. It is interesting to note that this guard period method has
not been mentioned in any of the research papers read, and it is still
not clear whether symbol timing needs to be recovered using this method.
Figure
15 Section of an OFDM signal showing 5 symbols, using a guard period which
is half a cyclic extension of the symbol, and half a zero amplitude signal.
(For a signal using a 2048 point FFT and 512 sample total guard period)
(Errata Note
10/2001: The best method for guard period implementation to use a cyclic
extension of the transmitted symbol over the entire guard period interval,
rather than only half of the guard period as described above).
Next Chapter 2
|


@(params: Map[String, Any]) @uk.gov.hmrc.hmrcemailrenderer.templates.helpers.html.template_main(params, "You’ve got a new message from HMRC") { @uk.gov.hmrc.hmrcemailrenderer.templates.helpers.html.salutationLine1(params)
You have a new message from HMRC about Self Assessment.
To view it, sign in to your HMRC online account.
For security reasons, we have not included a link with this email.
You chose to get paperless notifications instead of letters by post.
This means we send you an email to let you know you have a new message in your account.
From HMRC Self Assessment
}


Use this document as a way to quickly start any new project.
All you get is this text and a mostly barebones HTML document.
Playbooks are Ansible’s configuration, deployment, and orchestration language. They can describe a policy you want your remote systems to enforce, or a set of steps in a general IT process.
If Ansible modules are the tools in your workshop, playbooks are your design plans.
At a basic level, playbooks can be used to manage configurations of and deployments to remote machines. At a more advanced level, they can sequence multi-tier rollouts involving rolling updates, and can delegate actions to other hosts, interacting with monitoring servers and load balancers along the way.
While there’s a lot of information here, there’s no need to learn everything at once. You can start small and pick up more features over time as you need them.


We store all student state in MySQL. This includes registration information, enrollment, and certificate status.
General conventions:
All the tables will be described below, first in summary form with field types and constraints, and then with a detailed explanation of each field. For those not familiar with the MySQL schema terminology in the table summaries:
This is the kind of data it is, along with the size of the field. When a numeric field has a length specified, it just means that's how many digits we want displayed -- it has no affect on the number of bytes used.
int
= 4 byte integer.smallint
= 2 byte integer, sometimes used for enumerated values.tinyint
= 1 byte integer, but usually just used to indicate a boolean field with 0 = False and 1 = True.varchar
= String, typically short and indexable. The length is the number of chars, not bytes (so unicode friendly).longtext
= A long block of text, usually not indexed.date
= Datedatetime
= Datetime in UTC, precision in seconds.YES
= NULL values are allowed.NO
= NULL values are not allowed.
That being said, Django often just places blank strings instead of NULL when it wants to indicate a text value is optional. This is used more for numeric and date fields.PRI
= Primary key for the table, usually named id
, uniqueUNI
= UniqueMUL
= Indexed for fast lookup, but the same value can appear multiple times. A Unique index that allows NULLs can also show up as MUL.auth_user
The auth_user
table is built into the Django web framework that we use. It holds generic information necessary for basic login and permissions information. It has the following fields:
+------------------------------+--------------+------+-----+
| Field | Type | Null | Key |
+------------------------------+--------------+------+-----+
| id | int(11) | NO | PRI |
| username | varchar(30) | NO | UNI |
| first_name | varchar(30) | NO | | # Never used
| last_name | varchar(30) | NO | | # Never used
| email | varchar(75) | NO | UNI |
| password | varchar(128) | NO | |
| is_staff | tinyint(1) | NO | |
| is_active | tinyint(1) | NO | |
| is_superuser | tinyint(1) | NO | |
| last_login | datetime | NO | |
| date_joined | datetime | NO | |
| status | varchar(2) | NO | | # No longer used
| email_key | varchar(32) | YES | | # No longer used
| avatar_type | varchar(1) | NO | | # No longer used
| country | varchar(2) | NO | | # No longer used
| show_country | tinyint(1) | NO | | # No longer used
| date_of_birth | date | YES | | # No longer used
| interesting_tags | longtext | NO | | # No longer used
| ignored_tags | longtext | NO | | # No longer used
| email_tag_filter_strategy | smallint(6) | NO | | # No longer used
| display_tag_filter_strategy | smallint(6) | NO | | # No longer used
| consecutive_days_visit_count | int(11) | NO | | # No longer used
+------------------------------+--------------+------+-----+
id
Primary key, and the value typically used in URLs that reference the user. A user has the same value for id
here as they do in the MongoDB database's users collection. Foreign keys referencing auth_user.id
will often be named user_id
, but are sometimes named student_id
.
username
The unique username for a user in our system. It may contain alphanumeric, _, @, +, . and - characters. The username is the only information that the students give about themselves that we currently expose to other students. We have never allowed people to change their usernames so far, but that's not something we guarantee going forward.
first_name
Not used; we store a user's full name in auth_userprofile.name
instead.
last_name
Not used; we store a user's full name in auth_userprofile.name
instead.
email
Their email address. While Django by default makes this optional, we make it required, since it's the primary mechanism through which people log in. Must be unique to each user. Never shown to other users.
password
A hashed version of the user's password. Depending on when the password was last set, this will either be a SHA1 hash or PBKDF2 with SHA256 (Django 1.3 uses the former and 1.4 the latter).
is_staff
This value is 1 if the user is a staff member of edX with corresponding elevated privileges that cut across courses. It does not indicate that the person is a member of the course staff for any given course. Generally, users with this flag set to 1 are either edX program managers responsible for course delivery, or edX developers who need access for testing and debugging purposes. People who have is_staff = 1
get instructor privileges on all courses, along with having additional debug information show up in the instructor tab.
Note that this designation has no bearing with a user's role in the forums, and confers no elevated privileges there.
Most users have a 0 for this value.
is_active
This value is 1 if the user has clicked on the activation link that was sent to them when they created their account, and 0 otherwise. Users who have is_active = 0
generally cannot log into the system. However, when users first create their account, they are automatically logged in even though they are not active. This is to let them experience the site immediately without having to check their email. They just get a little banner at the top of their dashboard reminding them to check their email and activate their account when they have time. If they log out, they won't be able to log back in again until they've activated. However, because our sessions last a long time, it is theoretically possible for someone to use the site as a student for days without being "active".
Once is_active
is set to 1, the only circumstance where it would be set back to 0 would be if we decide to ban the user (which is very rare, manual operation).
is_superuser
Value is 1 if the user has admin privileges. Only the earliest developers of the system have this set to 1, and it's no longer really used in the codebase. Set to 0 for almost everybody.
last_login
A datetime of the user's last login. Should not be used as a proxy for activity, since people can use the site all the time and go days between logging in and out.
date_joined
Date that the account was created (NOT when it was activated).
All the following fields were added by an application called Askbot, a discussion forum package that is no longer part of the system:
status
email_key
avatar_type
country
show_country
date_of_birth
interesting_tags
ignored_tags
email_tag_filter_strategy
display_tag_filter_strategy
consecutive_days_visit_count
Only users who were part of the prototype 6.002x course run in the Spring of 2012 would have any information in these fields. Even with those users, most of this information was never collected. Only the fields that are automatically generated have any values in them, such as tag settings.
These fields are completely unrelated to the discussion forums we currently use.
auth_userprofile
The auth_userprofile
table is mostly used to store user demographic information collected during the signup process. We also use it to store certain additional metadata relating to certificates. Every row in this table corresponds to one row in auth_user
.
+--------------------+--------------+------+-----+
| Field | Type | Null | Key |
+--------------------+--------------+------+-----+
| id | int(11) | NO | PRI |
| user_id | int(11) | NO | UNI |
| name | varchar(255) | NO | MUL |
| language | varchar(255) | NO | MUL | # Prototype course users only
| location | varchar(255) | NO | MUL | # Prototype course users only
| meta | longtext | NO | |
| courseware | varchar(255) | NO | | # No longer used
| gender | varchar(6) | YES | MUL | # Only users signed up after prototype
| mailing_address | longtext | YES | | # Only users signed up after prototype
| year_of_birth | int(11) | YES | MUL | # Only users signed up after prototype
| level_of_education | varchar(6) | YES | MUL | # Only users signed up after prototype
| goals | longtext | YES | | # Only users signed up after prototype
| allow_certificate | tinyint(1) | NO | |
+--------------------+--------------+------+-----+
There is an important split between information gathered for the students who signed up during the MITx prototype phase and took 6.002x's first offering in the spring of 2012, and those that signed up afterwards. The first non-prototype user has a auth_userprofile.user_id
of 156633
and an auth_userprofile.id
of 155156
.
id
Primary key, not referenced anywhere else.
user_id
A foreign key that maps to auth_user.id
.
name
String for a user's full name. We make no constraints on language or breakdown into first/last name. The names are never shown to other students. Foreign students usually enter a romanized version of their names, but not always.
It used to be our policy to require manual approval of name changes to guard the integrity of the certificates. Students would submit a name change request and someone from the team would approve or reject as appropriate. Later, we decided to allow the name changes to take place automatically, but to log previous names in the meta
field.
language
User's preferred language, asked during the sign up process for the 6.002x prototype course given in the Spring of 2012. This information stopped being collected after the transition from MITx to edX happened, but we never removed the values from our first group of students. Sometimes written in those languages.
location
User's location, asked during the sign up process for the 6.002x prototype course given in the Spring of 2012. We weren't specific, so people tended to put the city they were in, though some just specified their country and some got as specific as their street address. Again, sometimes romanized and sometimes written in their native language. Like language
, we stopped collecting this field when we transitioned from MITx to edX, so it's only available for our first batch of students.
meta
An optional, freeform text field that stores JSON data. This was a hack to allow us to associate arbitrary metadata with a user. An example of the JSON that can be stored here is:
{
"old_names" : [["David Ormsbee", "I want to add my middle name as well.", "2012-11-15T17:28:12.658126"],
["Dave Ormsbee", "Dave's too informal for a certificate.", "2013-02-07T11:15:46.524331"]],
"old_emails"<EMAIL_ADDRESS>"2012-10-18T15:21:41.916389"]],
"6002x_exit_response" : {
"rating": ["6"],
"teach_ee": ["I do not teach EE."],
"improvement_textbook": ["I'd like to get the full PDF."],
"future_offerings": ["true"],
"university_comparison": ["This course was on the same level as the university class."],
"improvement_lectures": ["More PowerPoint!"],
"highest_degree": ["Bachelor's degree."],
"future_classes": ["true"],
"future_updates": ["true"],
"favorite_parts": ["Releases, bug fixes, and askbot."]
}
}
The following are details about this metadata. Please note that the fields described below are found as JSON attributes inside the meta
field, and are not separate database fields of their own.
old_names
A list of the previous names this user had, and the timestamps at which they submitted a request to change those names. These name change request submissions used to require a staff member to approve it before the name change took effect. This is no longer the case, though we still record their previous names.
Note that the value stored for each entry is the name they had, not the name they requested to get changed to. People often changed their names as the time for certificate generation approached, to replace nicknames with their actual names or correct spelling/punctuation errors.
The timestamps are UTC, like all datetimes stored in our system.
old_emails
A list of previous emails this user had, with timestamps of when they changed them, in a format similar to old_names
. There was never an approval process for this.
The timestamps are UTC, like all datetimes stored in our system.
6002x_exit_response
Answers to a survey that was sent to students after the prototype 6.002x course in the Spring of 2012. The questions and number of questions were randomly selected to measure how much survey length affected response rate. Only students from this course have this field.
courseware
This can be ignored. At one point, it was part of a way to do A/B tests, but it has not been used for anything meaningful since the conclusion of the prototype course in the spring of 2012.
gender
Dropdown field collected during student signup. We only started collecting this information after the transition from MITx to edX, so prototype course students will have NULL for this field.
Possible values are:
NULL
= This student signed up during the 6.002x prototype course, before this information was collected''
(blank) = User did not specify gender.'f'
= Female'm'
= Male'o'
= Othermailing_address
Text field collected during student signup. We only started collecting this information after the transition from MITx to edX, so prototype course students will have NULL for this field. Students who elected not to enter anything will have a blank string.
year_of_birth
Dropdown field collected during student signup. We only started collecting this information after the transition from MITx to edX, so prototype course students will have NULL for this field. Students who decided not to fill this in will also have NULL.
level_of_education
Dropdown field collected during student signup. We only started collecting this information after the transition from MITx to edX, so prototype course students will have NULL for this field.
Possible values are:
NULL
= This student signed up during the 6.002x prototype course, before this information was collected''
(blank) = User did not specify level of education.'p_se'
= Doctorate in science or engineering'p_oth'
= Doctorate in another field'm'
= Master's or professional degree'b'
= Bachelor's degree'hs'
= Secondary/high school'jhs'
= Junior secondary/junior high/middle school'el'
= Elementary/primary school'none'
= None'other'
= Othergoals
Text field collected during student signup in response to the prompt, "Goals in signing up for edX". We only started collecting this information after the transition from MITx to edX, so prototype course students will have NULL for this field. Students who elected not to enter anything will have a blank string.
allow_certificate
Set to 1
for most students. This field is set to 0
if log analysis has revealed that this student is accessing our site from a country that the US has an embargo against. At this time, we do not issue certificates to students from those countries.
certificates_generatedcertificate
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| user_id | int(11) | NO | MUL | NULL | |
| download_url | varchar(128) | NO | | NULL | |
| grade | varchar(5) | NO | | NULL | |
| course_id | varchar(255) | NO | MUL | NULL | |
| key | varchar(32) | NO | | NULL | |
| distinction | tinyint(1) | NO | | NULL | |
| status | varchar(32) | NO | | NULL | |
| verify_uuid | varchar(32) | NO | | NULL | |
| download_uuid | varchar(32) | NO | | NULL | |
| name | varchar(255) | NO | | NULL | |
| created_date | datetime | NO | | NULL | |
| modified_date | datetime | NO | | NULL | |
| error_reason | varchar(512) | NO | | NULL | |
+---------------+--------------+------+-----+---------+----------------+
The generatedcertificate table tracks certificate state for students who have been graded after a course completes. Currently the table is only populated when a course ends and a script is run to grade students who have completed the course.
user_id
and course_id
The table is indexed by user and course
status
Status may be one of these states
unavailable = 'unavailable'
generating = 'generating'
regenerating = 'regenerating'
deleting = 'deleting'
deleted = 'deleted'
downloadable = 'downloadable'
notpassing = 'notpassing'
restricted = 'restricted'
error = 'error'
After a course has been graded and certificates have been issued status will be one of:
downloadable = 'downloadable'
notpassing = 'notpassing'
restricted = 'restricted'
If the status is downloadable
then the student passed the course and there will be a certificate available for download.
download_url
, verify_uuid
, download_uuid
The two uuids are what uniquely identify the download url and the url used to download the certificate
The download_uuid
has the full URL to the certificate
distinction
This was used for letters of distinction for 188.1x and is not being used for any current courses
name
This field records the name of the student that was set at the time the student was graded and the certificate was generated.
grade
The grade of the student recorded at the time the certificate was generated. This may be different than the current grade since grading is only done once for a course when it ends.
courseware_studentmodule
The courseware_studentmodule
table holds all courseware state for a given user. Every student has a separate row for every piece of content in the course, making this by far our largest table.
+-------------+--------------+------+-----+
| Field | Type | Null | Key |
+-------------+--------------+------+-----+
| id | int(11) | NO | PRI |
| module_type | varchar(32) | NO | MUL |
| module_id | varchar(255) | NO | MUL |
| student_id | int(11) | NO | MUL |
| state | longtext | YES | |
| grade | double | YES | MUL | # problem, selfassessment, and combinedopenended use this
| created | datetime | NO | MUL |
| modified | datetime | NO | MUL |
| max_grade | double | YES | | # problem, selfassessment, and combinedopenended use this
| done | varchar(8) | NO | MUL | # ignore this
| course_id | varchar(255) | NO | MUL |
+-------------+--------------+------+-----+
It's important to understand what "modules" are in the context of our system, as the terminology can be confusing. For the conventions of this table and many parts of our code, a "module" is a content piece that appears in the courseware. This can be nearly anything that appears when users are in the courseware tab: a video, a piece of HTML, a problem, etc. Modules can also be collections of other modules, such as sequences, verticals (modules stacked together on the same page), weeks, chapters, etc. In fact, the course itself is a top level module that contains all the other contents of the course as children. You can imagine the entire course as a tree with modules at every node.
Modules can store state, but whether and how they do so is up to the implemenation for that particular kind of module. When a user loads page, we look up all the modules they need to render in order to display it, and then we ask the database to look up state for those modules for that user. If there is corresponding entry for that user for a given module, we create a new row and set the state to an empty JSON dictionary.
id
Primary key. Rarely used though, since most lookups on this table are searches on the three tuple of (course_id, student_id, module_id)
.
module_type
Broad category of what kind of module this is. Possible values are:
chapter
= The top level categories for a course. Each of these is usually labeled as a Week in the courseware, but this is just convention.combinedopenended
= A new module type developed for grading open ended questions via self assessment, peer assessment, and machine learning.conditional
= A new module type recently developed for 8.02x, this allows you to prevent access to certain parts of the courseware if other parts have not been completed first.course
= The top level course module of which all course content is descended.problem
= A problem that the user can submit solutions for. We have many different varieties.problemset
= A collection of problems and supplementary materials, typically used for homeworks and rendered as a horizontal icon bar in the courseware. Use is inconsistent, and some courses use a sequential
instead.selfassessment
= Self assessment problems. An early test of the open ended grading system that is not in widespread use yet. Recently deprecated in favor of combinedopenended
.sequential
= A collection of videos, problems, and other materials, rendered as a horizontal icon bar in the courseware.timelimit
= A special module that records the time you start working on a piece of courseware and enforces time limits, used for Pearson exams. This hasn't been completely generalized yet, so is not available for widespread use.videosequence
= A collection of videos, exercise problems, and other materials, rendered as a horizontal icon bar in the courseware. Use is inconsistent, and some courses use a sequential
instead.There's been substantial muddling of our container types, particularly between sequentials, problemsets, and videosequences. In the beginning we only had sequentials, and these ended up being used primarily for two purposes: creating a sequence of lecture videos and exercises for instruction, and creating homework problem sets. The problemset
and videosequence
types were created with the hope that our system would have a better semantic understanding of what a sequence actually represented, and could at a later point choose to render them differently to the user if it was appropriate. Due to a variety of reasons, migration over to this has been spotty. They all render the same way at the moment.
module_id
Unique ID for a distinct piece of content in a course, these are recorded as URLs of the form i4x://{org}/{course_num}/{module_type}/{module_name}
(ex: i4x://MITx/3.091x/problemset/Sample_Problems
). Having URLs of this form allows us to give content a canonical representation even as we are in a state of transition between backend data stores. A breakdown of the parts of a module_id
:
i4x://
= Just a convention we ran with (we had i4x.org but we never ended up using it).org
(ex: MITx
) = The organization part of the ID, indicating what organization created this piece of content.course_num
(ex: 3.091x
) = The course number this content was created for. Note that there is no run information here, so you can't know what runs of the course this content is being used for from the module_id
alone; you have to look at the courseware_studentmodule.course_id
field.module_type
= The module type, same value as what's in the courseware_studentmodule.module_type
field.module_name
= The name given for this module by the content creators. If the module was not named, the system will generate a name based on the type and a hash of its contents (ex: selfassessment_03c483062389
).student_id
A reference to auth_user.id
, this is the student that this module state row belongs to.
state
This is a JSON text field where different module types are free to store their state however they wish.
course
, chapter
, problemset
, sequential
, videosequence
The state for all of these is a JSON dictionary indicating the user's last known position within this container. This is 1-indexed, not 0-indexed, mostly because it went out that way at one point and we didn't want to later break saved navigation state for users.
Example: {"position" : 3}
= When this user last interacted with this course/chapter/etc., they had clicked on the third child element. Note that the position is a simple index and not a module_id
, so if you rearranged the order of the contents, it would not be smart enough to accomodate the changes and would point users to the wrong place.
The hierarchy goes: course > chapter > (problemset | sequential | videosequence)
combinedopenended
TODO: More details to come.
conditional
Conditionals don't actually store any state, so this value is always an empty JSON dictionary ('{}'
). We should probably remove these entries altogether.
problem
There are many kinds of problems supported by the system, and they all have different state requirements. Note that one problem can have many different response fields. If a problem generates a random circuit and asks five questions about it, then all of that is stored in one row in courseware_studentmodule
.
TODO: Write out different problem types and their state.
selfassessment
TODO: More details to come.
timelimit
This very uncommon type was only used in one Pearson exam for one course, and the format may change significantly in the future. It is currently a JSON dictionary with fields:
beginning_at
= UTC time as measured in seconds since UNIX epoch representing when the exam was started.ending_at
= UTC time as measured in seconds since UNIX epoch representing the time the exam will close.accomodation_codes
(optional) = Sometimes students are given more time for accessibility reasons. The codes are:NONE
= 'No Time Accommodation'ADDHALFTIME
= Extra Time - 1 1/2 TimeADD30MIN
= Extra Time - 30 MinutesDOUBLE
= Extra Time - Double TimeTESTING
= Extra Time -- Large amount for testing purposesgrade
Floating point value indicating the total unweighted grade for this problem that the student has scored. Basically how many responses they got right within the problem.
Only problem
and selfassessment
types use this field. All other modules set this to NULL
. Due to a quirk in how rendering is done, grade
can also be NULL
for a tenth of a second or so the first time that a user loads a problem. The initial load will trigger two writes, the first of which will set the grade
to NULL
, and the second of which will set it to 0
.
created
Datetime when this row was created (i.e. when the student first accessed this piece of content).
modified
Datetime when we last updated this row. Set to be equal to created
at first. A change in modified
implies that there was a state change, usually in response to a user action like saving or submitting a problem, or clicking on a navigational element that records its state. However it can also be triggered if the module writes multiple times on its first load, like problems do (see note in grade
).
max_grade
Floating point value indicating the total possible unweighted grade for this problem, or basically the number of responses that are in this problem. Though in practice it's the same for every entry with the same module_id
, it is technically possible for it to be anything. The problems are dynamic enough where you could create a random number of responses if you wanted. This a bad idea and will probably cause grading errors, but it is possible.
Another way in which max_grade
can differ between entries with the same module_id
is if the problem was modified after the max_grade
was written and the user never went back to the problem after it was updated. This might happen if a member of the course staff puts out a problem with five parts, realizes that the last part doesn't make sense, and decides to remove it. People who saw and answered it when it had five parts and never came back to it after the changes had been made will have a max_grade
of 5
, while people who saw it later will have a max_grade
of 4
.
These complexities in our grading system are a high priority target for refactoring in the near future.
Only problem
and selfassessment
types use this field. All other modules set this to NULL
.
done
Ignore this field. It was supposed to be an indication whether something was finished, but was never properly used and is just 'na'
in every row.
course_id
The course that this row applies to, represented in the form org/course/run (ex: MITx/6.002x/2012_Fall
). The same course content (same module_id
) can be used in different courses, and a student's state needs to be tracked separately for each course.
student_courseenrollment
A row in this table represents a student's enrollment for a particular course run. If they decide to unenroll in the course, we delete their entry in this table, but we still leave all their state in courseware_studentmodule
untouched.
id
Primary key.
user_id
Student's ID in auth_user.id
course_id
The ID of the course run they're enrolling in (e.g. MITx/6.002x/2012_Fall
). You can get this from the URL when you're viewing courseware on your browser.
created
Datetime of enrollment, UTC.


Fire Department
Register a new fire incident
Address
Cause
Type of Environment
No. of Firemen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
No. of Vehicles
1
2
3
4
5
Call Time (24 hr format)
Reach Time (24 hr format)
Return Time (24 hr format)
Second call required
Yes
No
Equipment Used
Casuality
Yes
No
Action taken
Submit


It’s raining today. I can smell the familiar earthy smell, wafting in from my window, alongside the mist of droplets scattering over my messy desk, and the steady pit pat pit pat, which never skips a beat.
I pull my light blue comforter up to my chest, and reach into my bag of chips. Like the steady rhythm of rain, barbeque chips won’t ever leave; they’re a comfortable constancy that I can rely on.
Knock, knock, knock. “Ali?”
It’s Sarah. This is the second of her biweekly appearances, probably to make sure I’m not a rotting corpse. I guess she’s trying to help, but I can’t help but feel like her “help” is a lot more self-motivated. Maybe she wants to feel altruistic, and throw a little “pity party” for me to show everyone else how “good” she is.
“Ali, let’s go out tonight!”
See what I mean about self-motivated?
“I don’t want to,” I grumble and I try to bury myself in my blankets further. If I could, I wouldn’t respond at all, but I don’t want to have to deal with her thinking I was actually dead. Though, I might as well be.
Sarah sighs. “Come on, Ali. We haven’t gone out in a while.”
“It’s only been three days since you’ve dragged me out.” Boo-freaking-hoo.
She’s quiet on the other end of the door. Maybe I was too harsh on her.
“Can I come in?” She sounds meeker than her usual confident, brash self.
I sigh and roll out of bed to open the door. Sarah gives me that same look of pity she’s been giving me for the past three months. It’s the look you’d give to a kicked puppy.
She stares at me, clearly contemplating how to respond to… whatever was afflicting me.
“When’s the last time you had a good night of sleep?”
“Last night.” Lie. It’s relentless nights of cold sweats, and feeling haunted by the remnants of you.
“When’s the last time you got out of bed?”
“Today.” Well, technically I got out of bed to, y’know, pee.
Sarah looks at me, and I can tell that just being in my presence is exhausting for her.
“Come on, you can’t keep moping in bed and eating… barbeque chips.” She looks slightly disgusted as she pulls a chip out of my knotted hair. Honestly, I’m kind of disgusted with myself.
“You can’t let this consume you, Ali…”
“I- it’s not consuming me. I’m perfectly whole by myself.”
She pauses. “Look Ali, I’m worried about you and I don’t know how to fix it.”
“Fix what? I’m fine.” It’d take a thousand years to put all of my shattered glass back together.
“You’re such a liar.”
I’m honestly surprised Sarah hasn’t given up on me yet. She probably couldn’t live with the guilt of letting me slowly waste away into nothingness.
Sarah runs her fingers through her hair. “Fine. Just come out for me. Girls’ night. It’s the last time, I promise.”
I’m used to false promises, so I agree. But under one condition.
“Can we go to Copacabana?”
I throw on jeans and a shirt and somehow tame my mane of hair. I hop into the driver’s seat and find Sarah holding a large box of Krispy Kreme donuts.
Sarah seems especially happy about coercing me out of my usually sedentary lifestyle. “Ali, take a donut! I got your favorite -- glazed jelly.”
It’s a rainy day in New York City, and the rain always brings out something in me. It’s nostalgic, whispers of memories supposed to be left behind flutter back with the pit pat of the rain. I glance over at Central Park on my left side, and it’s like the ghost of our past selves has stumbled into the muddy bright green grass. I can still picture us walking around the park that first month (and many more to come), hands intertwined, smiling and talking. We were sitting on our jackets and gazing at the clouds, making invisible shapes and memories all out of thin air. And when the rain came pouring down, we both ran, shielding ourselves with flimsy jackets, and eventually embracing the way that the rain washed away all of our impurities.
It’s been a month since it happened. It’s been a month since you boarded everything up, slammed the door, and called it quits. We spent nine years building a house of bricks together, but you only needed fifteen minutes to leave me with disintegrated rubble.
HONK. “Move already, you slut!” the driver behind calls out in the most New York fashion.
“What’s so special about Central Park?”
I miss you.
“I just like it.”
I continue driving down the crowded roads.
Red light, green light. Which will it be today? Do you love me? Do you love me not?
I cross my fingers and hope it’ll stay green as I push the gas pedal a little harder. I find disappointment as the lights turn yellow, just as I was about to finish crossing. A resounding I don’t know. The universe doesn’t know because I don’t know. I don’t know because you don’t know. You thought we needed a break, when I thought we needed a forever. I can’t help the tears streaming down my face, and I know Sarah can see them. But what can she say? I’m sorry the light didn’t stay green? I’m sorry your love isn’t on?
Sarah puts a hand on my shoulder, and somehow, that feels like enough.
Deep breaths, Ali. In and out. In and out. A traffic light has no ties with the matters of fate.
 My affliction is unexplainable to a person who switches lovers by the season.
“You know what we haven’t done in a long time?”
“What?” I sniffle slightly.
Sarah’s grinning from ear to ear. “We haven’t done carpool karaoke in a really long time.”
“Karaoke?” We haven’t done that since… college.
“Do you remember our senior year road trip? We jammed out to every single song on the Red album.”
I can’t help but laugh. “Do you remember our cover of the goat’s version of ‘I Knew You Were Trouble’?”
“Pfft, how could I forget!”
For a moment, I feel like everything might be alright. Sarah plays ‘I Knew You Were Trouble’ and starts miming the guitar as I drive. We, of course, gave the goat a run for its money, when it came to the screams. We’re laughing and smiling like we’re young again, and we can’t possibly run out of time.
But then, I stop at a red light, and look to my right. And… it’s you. You’re sitting behind the long windows of the cafe, furrowing your eyebrows as you read what’s on your laptop. I’m not sure what compelled you to look up in that split second. Maybe you could sense that I was there, and that I wasn’t quite finished with you, nor would I ever be finished with you.
 I wanted to say something to you, scream ‘I love you’ through everything keeping us apart. But it’s not like you would hear me, anyways, through wailing NYC traffic and the increasingly angered pit pat of the rain and the distance tearing us away. And even if you could hear me, I’m not even sure what I would say.
I wonder if I will ever see you like this again, or if you will only visit me in my memories. And I’m afraid that those too may fade away. I can’t frequent California, just to hope to bump into some version of you, some version of you that has nothing to do with me. I want to go back to when we were great together, and you were imprinted in my mind and I in yours, and we had the world left to explore. But, I’m only left with the remnants of something great, and the whispers of you that haunt me every corner that I turn.
I can’t remember a part of me that you didn’t touch. Every part of me was tainted by you, and I can’t go back to strangers holding me for a night, and disappearing by morning.  But I don’t even want to forget, because that means the story is over. You told me it was a great love. Was being the key word here. You said was, which means that you closed the chapter on me. But, why can’t I do the same?
 I drive on to Copacabana, as ‘All Too Well’ somberly thrums through my car.
We park, and Sarah tells me everything will be alright. Though I’m not sure how it’s alright that two people who loved each other were reduced to nothing but strangers in this small town. At this point, she only has empty words, and I can’t even blame her. She saw him too.
Sarah links arms with me as we walk into the club. We awkwardly dance to an EDM remix of a Billie Eilish song, and make small talk with the people who bump into us. I can’t help but stare at the one thing that brought me here -- the unnecessarily extravagant chandelier hanging from the ceiling.
Why am I in Copacabana, dancing with all of these strangers? Why am I here, watching this goddamn chandelier quietly flicker, unnoticed by everyone except for me? I should be drinking to forget, dancing to regret.
“Ali, why do you come here?”
For the chandelier.
“For you.”
“This is the most crowded bar in all of NYC.  Sarah looks increasingly suspicious.
It’s the only place with any semblance of a sign.
“I like the decor.” It’s a half-truth, I suppose.
She follows my gaze and notes the flickering chandelier. It looks like it’s on the verge of flickering into dark, but it still holds onto the light.
“They should really get that chandelier fixed, huh. Maybe I should talk with management.”
“NO. No. No. You can’t.”
“Why not? Ali, it’s a chandelier.” Sarah looks absolutely lost.
Because she wouldn’t have noticed that chandelier if it wasn’t for me and if she fixes it, I won’t get my sign from the universe.
“Please Sarah. Just don’t.”
I know she doesn’t understand why my breaking point is a chandelier, but she lets it go.
I sigh in relief, and all of a sudden, the chandelier flickers out.
And that’s when the sobs erupt out of me, like a volcanic, uncontrollable eruption that could not be stopped. Sarah helps me out of the club, amidst all of the confused, lost, drunk people stumbling in the pitch black dark, guided by the loud thrum of avant-garde pop music.
 I want to drown myself in alcohol; maybe blurring my existence could wipe the ghost of you from my memories. I want to find a different sign, a different sign that tells me it’s okay to keep waiting for you, a sign that tells me our story hasn’t run its course and there is another tomorrow.
Maybe that’s why I keep searching, maybe I just want to find an excuse for another page in our love story, and in my search, I convince myself that we should have had enough love for a lifetime of pages. Every person in that club is searching for something, whether it’s something that can be found in the physical comfort of another lost person’s arms, or to forget everything that’s ever happened and replace it with blurs of memories not noteworthy enough to remember. But, I don’t want to forget you, and I can’t ever replace you. You’re permanently etched into my brain for eternity, and the memories we shared and the love we shared can’t just disappear like that. No amount of distance can wash away your existence.
I want to hate you for leaving.  But the truth is, we’ve grown into different people; we’re not the same people we were in freshman year of college. And this is the part where we fork into our separate lives, and grow into our full selves - without the other. I want to keep wishing for one last moment, one last kiss, one last gaze, but all I have left are the broken remnants of our great love.
But after the rain stops pouring, the stars finally shine on the ghosts of our past selves, drenched from the rain, but lucky enough to be in love. And it’s beautiful.


I have rather obstructive sleep apnea. Combined with years of insomnia that never went away after a bad bout with depression, I used to only get about 3-4 hours of sleep each night. This was due to a few different factors:
1. My insomnia prevented me from getting to bed until the wee hours of the morning.
2. My apnea-treatment is very uncomfortable. I usually only get 3-4 hours of uninterrupted sleep before I wake up and in the past, I usually was not able to get back to sleep.
3. Even the 3-4 hours I was getting was not very restful.
Since starting treatment with cannabis, I am able to:
1. Sleep more or less when I want to
2. Sometimes get 6-7 hours of uninterrupted sleep
3. Even if I wake up after 3-4 hours, I can get back to sleep
4. Each sleep cycle is more restful.
I live in a legal state but I really hope it becomes federally legal for med use. Its a shame because there are really no side-effects, it is not addictive and there is no hangover. What more could I ask for from a sleep therapy med - all the others come with a host of side-effects and most synthesized med are, in varying degress, toxic to the body.
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


<IP_ADDRESS>: 2011-07-22
- Bugfix: svn properties were not indexed for files that are affected by the -b option
<IP_ADDRESS>: 2011-03-13
- SvnIndex: added the -b option "IgnoreBinary". This is a regex and all files that match this
regex will be indexed even if their mime-type is a binary one.
- SvnWebQuery: now uses SyntaxHighlighter 3.0
- fixed issues #9 and #10
- updated online documentations
<IP_ADDRESS>: 2010-11-02
- Fixed issues with maximum number of terms per document.
- Added support for sharing the same website for multiple indices. see http://svnquery.tigris.org/issues/show_bug.cgi?id=8
- Added convenience logic to enable SvnFind to show file content if the repository was moved/copied and the original external url is no longer available.
<IP_ADDRESS>: 2010-08-21
- RunDetached: detached background process is now started with a priority below normal
- SvnWebQuery: fixed some issues in syntax highlighting
- SvnWebQuery: allow running with under an service account that as no user profile
- SvnIndex: Increased the number of terms per document from 10000 to 50000
<IP_ADDRESS>: 2010-07-22
- SvnQuery: fixed resource leak in SvnApi (event handlers were not removed when putting a SvnClient back to the pool)
- SvnQuery: fixed wrong detection of path query when querying for dot separated identifiers like "Status.OK"
- SvnIndex: all logging is done to stdout including all error messages
- SvnIndex: If you ommit options like -x or -n on the update command and they were set on the last call, then now those are overwritten with the default values
- SvnWebQuery: set focus back to query input control after postback/refresh
- SvnFind: fixed multiple UI issues
- SvnFind: viewing application can be configured with ViewWith parameter, default is now notepad.exe
- SvnFind: if an repository contains an index folder, you can directly open the repository as an index
- upgraded to ReSharper 5
<IP_ADDRESS>: 2010-05-17
- added SvnFind as a rich windows client frontend, no need to use a web server
- workaround for unreadable files due to "inconsistent line ending" exceptions thrown by the subversion api
- internal refactoring of the SvnQuery Api
<IP_ADDRESS>: 2010-01-13
- SvnIndex: option -f (filter) now defaults to "/tags/". This should prevent novice users from mistakenly indexing tags which could make the index extremely big.
- Fix: If the external repository needs authentication SvnWebQuery didn't work. Now the credentials provided to SvnIndex with the -u and -p options are stored as index properties inside the index. This allows SvnWebQuery to actually read content from the repository and show it on the View page.
<IP_ADDRESS>: 2009-11-21
- fine tuned syntax highlighting css styles
- query parameters are now encoded inside the url so you can send links to live query results
- additional testing for the first 1.0 release
<IP_ADDRESS>: 2009-10-26
- added syntax highlighting when displaying source code from the repository
<IP_ADDRESS>: 2009-10-20
- Fix: Queries over a range of revisions or an explicit revision could throw a NullReferenceException
- Fix: Broken Layout on Firefox and IE7
<IP_ADDRESS>: 2009-10-19
- SvnWebQuery: Moved from a table based layout to css based layout. Improves load time and fixes some layout problems with firefox.
- build process uses 7zip instead of ZipFile task to prevent corrupted zip files
- resharped the source a little with resharper 4.5
<IP_ADDRESS>: 2009-06-15
- new option -s for generating
a "single revision" index, which contains only one revision of an index (without history)
- much more documentation about how to install and use
- fixed handling of thread pool exceptions
<IP_ADDRESS>: 2009-04-07
- support for subversion 1.6
- some documentation
- cosmetic bugfixes


15 August 2001
Disease Outbreak Reported
As of 12 August 2001, WHO has reported 1959 cases including 83 deaths, with a case-fatality rate of 4.2% in the south-western part of the country.
The Emergency Coordination Committee is continuing to oversee the outbreak, reinforcing surveillance activities, particularly in N'djamena district.


Before Change
answers = {k: format_guess(v.page) for k, v in all_questions.items()}
guesses_df = AbstractGuesser.load_guesses(bc.GUESSES_DIR, folds=[fold])
outfile = open("n_layers.txt", "w")
for i in [1,2,3,4,5]:
cfg.n_layers = i
outfile.write("n_layers: {0}\n".format(i))
buzzes = run(cfg, fold, all_guesses, option2id)
output = generate_report(buzzes, answers, guesses_df, fold)
outfile.write(output + "\n")
outfile.flush()
outfile.close()
if __name__ == "__main__":
fold = "test"
hyper_search(fold)
After Change
buzzes = run(cfg, fold, all_guesses, option2id)
output = generate_report(buzzes, answers, guesses_df, fold)
with open("example.txt", "w") as outfile:
outfile.write(output)
print(output)
if __name__ == "__main__":
fold = sys.argv[1]


THE PARTY CRASHERS A film review by Steve Rhodes Copyright 1999 Steve Rhodes RATING (0 TO ****): ** 1/2
As the band plays on, the couples dance slowly and romantically to the music. In some corners of the room in THE PARTY CRASHERS, young lovers make small talk, and in others guys talk about everything from stocks to sports. It's your typically hip, LA party full of the rich, like investment bankers and heiresses, and almost famous, like the Olympic ice skater who fell down during her big meet.
Typical, that is, except for these three down-on-their-luck actors and writers with Uzis, who've crashed the party. The "bad" guys tell the not so frightened guests, that, if everyone keeps cool, they can continue to party until the father (John Saxon) of the richest girl (Shawnee Smith) at the party gets his rich estranged wife to come up with a 5 million-dollar ransom.
Phil Leirness, the writer and director of THE PARTY CRASHERS, plays a frustrated screenwriter who leads the gang of crooks. With his sarcastic brand of humor, he may remind you of a little less articulate Ben Affleck. At any rate, Phil is an easy guy to like, which helps smooth over the film's many rough edges.
A laid back movie, it works best when Phil the director, lets Phil the actor really cut loose. In one memorable but unprintable piece of dialog he uses an IRS reference that is hilarious. More typical of the film is the subtle humor as when one of the other criminals starts kissing one of the hostages. When Phil's character sees them, he caustically remarks, "At what point did this felony turn into 'The Love Boat?'"
The story has some subplots, but actually a few more complications and subplots would have provided some needed enrichment. One of the best subplots concerns the real-life Sid Hillman band, which is playing at the party. The record producers there have to be threatened at gunpoint to get them to listen. The director, who was at our screening, said that the real Sid Hillman has had trouble getting record producers interested.
The movie's big "twist" is so obvious that they might as well as have proclaimed it in the opening credits, but the delicious little twists within twists aren't obvious at all. And any movie that dares to come in at less than an hour and a half deserves a big thanks. Too many movies these days wear out their welcome. THE PARTY CRASHERS gives you a little entertainment and then the party is over before you know it.
THE PARTY CRASHERS runs 1:17. It is not rated but would be an R for some profanity, mild violence and a single drug usage scene and would be fine for teenagers.
Email<EMAIL_ADDRESS>Web: www.InternetReviews.com
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Quickstart¶
Contents
Installation¶
reqwire supports all versions of Python above 2.7. The recommneded way to install reqwire is with pip:
$ pip install reqwire
Source code is available on GitHub.
Usage¶
Run
reqwire init
in the working directory of your Python project. This will scaffold out a requirements directory:requirements/ ├── build └── src ├── main.in ├── qa.in └── test.in
To add requirements during development, use
reqwire add [-t <tag name>] <requirement>
.For example,
reqwire add -t qa flake8
will:- Resolve the latest version of
flake8
(e.g.flake8==3.2.1
). - Add
flake8==3.2.1
torequirements/src/qa.in
.
- Resolve the latest version of
To compile tags, use
reqwire build -t <tag name>
.To quickly compile all tags, use
reqwire build -a
.


Work Day Scheduler
A calendar application for scheduling your work day
9AM
LOCK
10AM
LOCK
11AM
LOCK
12PM
LOCK
1PM
LOCK
2PM
LOCK
3PM
LOCK
4PM
LOCK


First person adventure You have selected to create a new adventure in 1st person mode (player is not shown). There is no avatar for the player. The player explores the game himself, and transitions between scenes are instantaneous. Usually these games are designed using photos to configure the scenes. Hence the player interacts in first person with a very real-looking world, in which you can turn or go back in the scene bi clicking left, right, down, etc.


The Erlang Journal
home
Articles
17 Feb 2009
»
How to set up an ejabberd cluster on Amazon EC2 in 6 easy steps
25 Aug 2008
»
Optimizing Erlang - A death match of arrays and tuples
03 Feb 2008
»
Parsing text and binary files with Erlang
13 Oct 2007
»
Upgrading your Erlang cluster on Amazon EC2
12 Oct 2007
»
Setting up Erlang on Amazon EC2
01 Jan 2006
»
Haskell vs Erlang, Reloaded
Open Source Projects
OpenPoker:
scalable poker server written in Erlang


"I will always place the mission first. I will never accept defeat. I will never quit. I will never leave a fallen comrade.''


|
|||||||||
| PREV PACKAGE NEXT PACKAGE | FRAMES NO FRAMES |
| Class Summary | |
|---|---|
| BooleanTypedValue | |
| ReflectionHelper | Utility methods used by the reflection resolver code to discover the appropriate methods/constructors and fields that should be used in expressions. |
| ReflectionHelper.ArgumentsMatchInfo | An instance of ArgumentsMatchInfo describes what kind of match was achieved between two sets of arguments - the set that a method/constructor is expecting and the set that are being supplied at the point of invocation. |
| ReflectiveConstructorResolver | A constructor resolver that uses reflection to locate the constructor that should be invoked |
| ReflectiveMethodResolver | A method resolver that uses reflection to locate the method that should be invoked. |
| ReflectivePropertyAccessor | Simple PropertyAccessor that uses reflection to access properties for reading and writing. |
| StandardEvaluationContext | Provides a default EvaluationContext implementation. |
| StandardOperatorOverloader | |
| StandardTypeComparator | A simple basic TypeComparator implementation. |
| StandardTypeConverter | Default implementation of the TypeConverter interface,
delegating to a core Spring ConversionService . |
| StandardTypeLocator | A default implementation of a TypeLocator that uses the context classloader (or any classloader set upon it). |
| Enum Summary | |
|---|---|
| ReflectionHelper.ArgsMatchKind |
|
|||||||||
| PREV PACKAGE NEXT PACKAGE | FRAMES NO FRAMES |