text:
Bach stabbing
Angelic Octaves
midiTemperament tuning aid
Arduino and Eagle
Learn to tune a keyboard with Arduino midiTemperament and a Roland JV or XP
Learning to tune by ear with Arduino
Expert musicians, specially those who play string and keyboard instruments, know how to tune their instruments by ear, rapidly and accurately. Not everyone finds tuning easy to learn, and many amateurs are glad to be able to buy a tuner that detects the note being played and indicates how far out it is. But the gadgetry doesn't contribute much to this aspect of ones musical education.
Musical scales are in fact quite subtle. The basic difficulty, known to the ancients, is that a scale built of harmonically pure intervals doesn't add up to an octave (see
). Keyboard players have no way of adjusting their intonation while they are performing, and so various kludges called temperaments were invented starting in the 16th century; different intervals are made a little sharp or flat so that music written at a particular place and time sounds nicely in tune and interesting. The modern piano has equal semitone intervals (equal temperament), but this is bearable only because of some features of instrument design.
Historians have described how early musicians 'tempered' their instruments, and for all the temperaments that were thought of, the deviations from equal temperament can be found in tables and in the Scala program. Nowadays, you can tune an acoustic instrument to different temperaments with the help of software or with a tuner such as the Korg OT-120. Electronic synthesisers with microtuning can be set up directly using their software (if it's still compatible with your computer!) or with Scala. However, these methods give no feel for the way early musicians chose their temperaments and routinely tuned their instruments; a harpsichord may need tuning every day.
Here and there on the internet, people have asked if there exists a device that enables someone sitting at an electronic keyboard to learn tune as though they were tuning a real instrument. I'm fortunate to have access to a harsichord, but don't want to wear out the tuning pegs, or break strings too often. Also, authentic harpsichords don't display the results of ones efforts. Here is an electronic tuning setup that works on a Roland JV1010 and should be easily adaptable, at least to other JVs and XPs.
I chose the popular Arduino microcontroller because it has MIDI plug-in cards (shields), and an excellent MIDI software library. The Arduino is designed to be used by artists and others, who need to learn only very basic electronics and programming. Although, at least for the moment, I also need a Windows PC for interfacing and readout, it seems too difficult for an amateur to develop this kind of "real-time" software directly on a computer.
The latest version is midiTemperament21.
After downloading it, unzip and put the directory with the .ino file into the one you use for your Arduino sketches. Put the libraries that are in the zip file into your Arduino Libraries directories. Note that the MIDI.h file of the MIDI library has been modified, as indicated by added comments, in accordance with the documentation. In particular, we use Serial1.
Download Web_midiTemperament21.zip
How tuning with MIDI works
We want to vary the pitch a synthesiser gives for each note of a designated range on an electronic MIDI keyboard. Physically, a note is defined by its frequency. Since the perception of pitch increases logarithmically (progressively slower) with increasing frequency, pitch is defined in terms of the cent, which is 1/100th of an equal tempered semitone. midiTemperament works in cents, and re-calculates in the frequency domain in order to calculate and display beat frequencies between notes. The gory mathematical details can be found in books and on the web.
Applications that use MIDI pitch-bend to set temperaments have been described, but they don't do what we want. This website is a pitch-bend free zone.
I bought a JV1010 more than a decade ago because it has microtuning and also some harpsichord samples on the Super Soundset plug-in card. Synths of this range seem to be quite reliable (unlike the bundled software) and they can still be bought second hand.
I'll assume the reader knows a little bit about MIDI. When you play a note on a keyboard, it sends a MIDI message (usually 3 bytes) containing the note number (0-127) to the synth. Simple synths then generate the equal-tempered frequency corresponding to the note, with a more or less horrible timbre. A new-ish MIDI standard (MIDI Tuning) specifies how the pitch of each of the 128 notes can be set independently, but not many synths follow this standard. At any rate, I can't afford one that does.
The old Roland JV and XP synths have settings in memory for tuning each of the 12 degrees of the scale in 1-cent steps, but for a given MIDI channel you get the same tuning in each octave. That isn't much use, because you need more than one octave to go round the circle of fifths and generally play around with tuning. Fortunately, these synths can produce, simultaneously, one kind of sound for each of the 16 MIDI channels, and there are separate scale tuning settings for each channel. So what we do is program the Arduino microcontroller to send each note played to a different channel for each octave, and use the same sound patch for all the channels.
Existing users of these synths might get a bit confused because this conflicts with the Roland approach to "performance' settings, where up to 16 parts or patches can be assigned to a 'performance' and played simultaneously, one per channel. You will no longer be able do this when each channel has a different tuning. My application is basically a multiple keyboard split, that could also be used give one sound per keyboard octave if you really like that sort of thing.
You invoke the tuning/multi-split mode by setting the Arduino microcontroller to the non-existent channel 17. The range of keyboard octaves affected is set in the software, but you can easily change it, and will need to if (unlike mine) your keyboard has less than 88 notes. I've set it to start at octave 1 (starting at C, 3 octaves below middle C) with a span of 6 octaves. (Note that the octave number isn't a MIDI parameter.) Some notes in the top octave of the keyboard are assigned (mapped) for sending tuning commands. The command keys could be put at the bottom of the keyboard, but then you'd lose those nice resonant bass notes that 17th century French composers exploited so well, much to the chagrin (I suppose) of the historically informed fraternity.
In the Roland system, the "scale tune" parameter for each note ranges from 0 to 127, where the default setting of 64 corresponds to zero cents with respect to equal temperament. That means you can tune up or down by a bit more than half a semitone. The program lets you change the number of cents for the note you want to tune.
The keyboard notes I use to make the adjustments are shown in this table. You can re-map them to any keys you like:
Stop adjusting but tuning still active
Reset note to default tuning value
Down 1 cent each time note is played
Select a note to be tuned
Up 1 cent each time note is played
Leave tuning mode, turn all notes off
How to use midiTemperament
Connect up the Arduino, MIDI-box(es), keyboard and computer as shown in the diagram below. The keyboard can be on any channel.
Download and unzip the latest version of the program ("sketch"). Currently it's 'midiTemper21'. Make sure the file is in a sketch directory with the same name without the suffix. Upload it into the Arduino.
The libraries I use are included in the zip file. These go in the 'Libraries' directory of your Arduino installation. Note that MIDI.h library has been modified with respect to the original (see the comment lines in midiTemperament and MIDI.h).
Open the Arduino terminal and set the baud rate to 115200 (the fastest). If that doesn't work on your computer you'll have to modify the sketch and the terminal setting. Speeds as low as 9600 baud may cause noticeable latency (notes aren't sounded simultaneously).
A menu worthy of a teletypewriter appears on the terminal if you send any character. The available commands are all numeric, and if you get anything wrong, just send 'return' until the main menu reappears.
Set the channel to '17' (via the terminal) ; the Arduino sets itself to (the false) channel 17, whereby each designated octave is assigned to its own MIDI channel. You can also set a 'normal' channel (1-16), and then the Arduino will translate input from the keyboard to that channel.
There are commands to preset (with no apocalyptic warnings) the synth to various temperaments, and to randomise the tuning within a range you can change in the program. You can set up your own temperament by typing the cent values in the source code. Settings apply to whatever channel(s) has been selected.
To tune a note, play top G# (or whatever note you have chosen in the sketch), then the chosen note. When you play a note that sends a command, it sounds twice.
Subsequently, each time you play the note being tuned, it sounds normally, and the terminal provides relevant tuning information.
To tune your note up or down, play top A or G respectively. The note being tuned is then adjusted by 1 cent each time it's played. It doesn't seem possible to slide a note up and down in the manner of a string player, though the synth has a portamento function.
To listen to the note being tuned without adjusting it, play top F. To set it to the equal temperament value use top F#.
If exactly two notes are being sounded, the terminal displays them in order of pitch. Also given are the interval, the number of cents corresponding to the true (frequency ratio) interval, and the degree of mistuning or 'impurity'.
To tune another note, play top G# again.
To leave tuning mode and play the newly-tuned synth, play top A#. This key will also turn all notes off if any 'note off' MIDI messages have gone astray.
To set all octaves on the keyboard to the same channel, use the terminal to send the channel number. You may want to do this if you have tuned a range comprising at least one complete octave (starting at C) to the temperament you want, and would like to hear the effect over the whole keyboard. The channel number to use is indicated on the terminal during tuning.
To start tuning again, set channel '17'.
The preset temperaments are copied from Scala so they
be correct. Note that by default Scala scales use C as the reference note for conventional 12-note scales (the deviation of C is always zero cents). That means that A would usually be shifted by your tuning and therefore out of tune with other instruments tuned to A. In case you want A to stay put, the program subtracts algebraically the cents deviation for A (referred to C) from the value for each note of the scale; it's then A that has zero cents. You can choose in the source code which note is to be kept at zero cents.
If you want different information to appear on the terminal, you can modify the relevant part of the sketch, copying the syntax of the existing code (including the pesky semi-colons!!). It's easy if you try; that's the general idea behind the Arduino concept.
Readout using the Arduino terminal
Since the LCD display is too small for present purposes I've sent nearly all the readouts to the serial terminal provided with Arduino. The rotary encoder and the screen let you change channels and display the last note played. The terminal doesn't allow you to store data except by screen copy (below). Other serial software terminals can be used, but future developments will probably use the Processing application as described in the Arduino documentation. Here's a screen copy of the Arduino terminal taken while note D4 was being tuned by comparison with the G below it:
Setting up the Arduino
The application was developed by progressively modifying midiTranslator (Warren Gill), which provides a good introduction to using the Arduino MIDI library (see below). MidiTranslator lets you select channels, patches and volume by means of a rotary encoder with a push-button, and there is a liquid crystal text display. You don't need a computer to use it once the program has been uploaded.
MidiTranslator works with any Arduino. My application needs a Mega 2560, because you need two interrupt-driven serial connections. The Mega could also generate 5 or 6 tunable tones of uncertain timbre in a future incarnation, which would not then need the synth. The quality of the sound would be another matter.
For the moment my application does need a computer to be connected (unless you have a MIDI-merger box), and a computer is useful for sending commands and displaying the results. I've also kept, as an option, the midiTranslator hardware (display and buttons), which can still be used to change channels and reset the Arduino. I had to change the connections to suit the Mega and the MIDI shield. The Arduino has no way of "knowing" whether or not the hardware is connected.
Warren Gill made his own MIDI interface; I bought a MIDI shield from Sparkfun (you could also use the Sparkfun MIDI breakout box or other makes of shield).
You need to solder the long-pin connectors (two with 6 pins, two with 8), which weren't supplied (Grrrr). Snip off the Tx and Rx pins of the shield, and connect Tx and Rx of the shield to Tx1 and Rx1 of the Arduino. Best use proper jumper leads with pins at each end, so they don't jump out. Set the little switch on the shield to RUN, so Arduino's default Serial ports are connected normally via Tx and Rx. You can also solder in the shield's pots and push buttons, though we don't use them here.
If you don't use the rotary encoder or display, the setup would look like this:
Arduino Mega with encoder and display
Here's the schematic of midiTranslator adapted for the Mega :
My LCD display has 4 lines of 16 characters. The MidiTranslator screen was 4x20, and I changed the code accordingly. Finding a version of the Arduino library LCD.h that works with a particular display isn't always easy. The problem is that different makes are stated to be compatible with Hitachi models, though the
de facto
informal standard isn't really a standard.
If you want a stand-alone Arduino to run midiTemperament without a computer, you'll probably consider a display with more than 4 lines. Change the lines of code starting with Serial.print to lcd.print (or add new lines), and look up how to place the cursor.
Installing the Arduino MIDI library
The popularity of Arduino is largely due to the range of code libraries that hide the most difficult aspects of programming from ordinary users.
You need to copy the MIDI library into the 'libraries' directory of your Arduino installation (A library is a directory containing other directories and files.). It can be downloaded from the playground, but then you would have to edit file MIDI.h as instructed in my sketch. A re-edited copy is in the zip file for downloading. Note that as it isn't too easy to rename the library to indicate that it's been modified, I've included an explanatory text file.
Arduino with two MIDI INs
As explained elsewhere on this page, we need two MIDI INs, one for the synth and one for the keyboard.
At the moment the library can handle only one IN and one OUT, and you can't run two instances. So for now you need either a merger box or software (Midi-OX), unless you can add your own software to the sketch.
This situation is likely to evolve.
Download Web_midiTemperament21.zip
Setting up the MIDI network
A drawing of the network I'm using can be downloaded below. Obviously you'll use any other MIDI hardware that's available. This stuff can be expensive.
Since I don't have a MIDI merger box, the MIDI-OUT data from the keyboard and the JV1010 synth have to be merged using MidiOX on a Windows PC fitted with a 2-input MIDI-USB interface. Midi-OX is a valuable and unique application that has never has never been ported to other platforms.
A third MIDI-IN was (Nio) useful during development, because it lets Midi-OX display output from the Arduino application (system exclusive messages). You can use any means of interfacing MIDI with any computer; sometimes I use a joystick port adapter for the sound card of an ancient PC.
As explained above, Arduino MIDI shields have only one MIDI IN, whereas you need one for the keyboard and another for the synth. The MIDI library handles only one MIDI in and one OUT, and you can't run two instances, for example with piggy-backed MIDI shields. You could arrange a second MIDI IN by writing extra software, but the library is so simple and reliable to use that it seems preferable to sit and wait for an update to the library that's been discussed.
Midi-OX settings
Here's a screenshot of MIDI-OX connections with the MidiSport and Nio boxes connected. You can have as many inputs as you want, but only one output. The MIDI-OX event port may or may not appear, depending on your settings.
Note Off messages
With MIDI, when you send a Note On message, the note will stay on until a Note Off message is received. If you want to change anything in the Arduino sketch, you will need to make sure that Notes Off are redirected to the correct channel and are not sent before the corresponding Note On. There's a compilation directive to get a readout of the Notes On count.
The MIDI standard allows two kinds of Note Off message: a "genuine" one starting with 8, and a Note On (starting with 9) with velocity zero. The MIDI library handles only the "genuine" version, whereas most MIDI gear sends Note On with velocity zero. I've added a line of Arduino code to handle the velocity zero case, and my application works with both formats. If you want, you can convert one to the other using the data mapping function of MIDI-OX.
Computer compatibility
Arduino is an open-source hardware and software project (
). It runs on Mac OS X, Linux and Windows. You can buy an Arduino Mega 2560 from various sources.
If you need software MIDI-merge the only free package I know is Midi-OX, which is available only for Windows (all versions).
You need a USB port for the Arduino, and possibly another one one for a MIDI interface having a driver for your system. My Midiman Midisport 2X2 interface works with all versions of Windows except the latest and last service pack for XP (known problem).
The Roland JV1010 was delivered (more than a decade ago) with a third-party OEM software package called SoundDiver, which is not maintained. These synths really need some kind of controlling software, though in theory you can do everything by sending sysex messages. I will need to be able to make my own sounds adapted to make it easier to learn to tune. SoundDiver runs on the obsolete Mac OS 9 and on Windows 95/98. It doesn't crash every time on XP, but fails on V*sta and W7. Has anyone tried W8 which is said to be an improvement legacy-wise?
I'm quite familiar with this kind of compatibility problem, because I've encountered the same difficulties with computer-controlled scientific instruments ever since computer control was introduced. Normally, a musical or scientific instrument should be expected to last at least 15-20 years, during which time a hell of a lot of computing platforms come and go. In my opinion, Roland should not have marketed the JV-XP series using third-party software from a firm that was clearly not in a position to maintain it. On the other side, Microsoft and Apple should have been capable of providing operating systems that allow small-scale software developers to produce software that is secure and has a life-expectancy exceeding a couple of years.
Alternative patch editors are available at various prices, but I don't know if the ones that still work with the latest operating systems can handle all the system settings. Also, I don't want to spend serious money to support fairly old hardware.
Things to be done
Provide code to reset a temperament to a designated channel (a selection of temperaments is in the sketch, but the software hasn't been written yet). You can do this by hand or using the synth's native software.
Provide a listing of the results of your tuning settings.
Find out which sounds are best for practising tuning. Most of the JV ones have vibrato and other effects that make the beats difficult to hear. I'll have to get a patch editor that works on my computer and perhaps make my own sounds. The built-in ones seem to be a mixture of samples and purely synthetic sounds (a sine-wave generator is provided).
: the tuning of some of the piano sounds is "stretched", presumably without too much regard for the structure of the partials.
Generate frequencies directly, using Arduino's built-in timers.
I'll need to develop a user interface, and will probably have to learn Processing.
Find out if there exists a free microtunable synth to which I could adapt the application. The application cSound seems the most appropriate though everything has to be coded.
Finally, since this is an Arduino project, there are plenty of other ways of sending commands than by using designated MIDI keyboard keys: foot switches, TV remote controller, joystick, speech recognition...
Note on schematic drawings
Arduino and Eagle
Arduino is popular because it allows people who don't know much about electronics to make electronic and electromechanical devices. However, quite a few users find it difficult to produce accurate schematic drawings suitable for posting. On another page (
Arduino and Eagle
) I'll show how this can be done, and start by explaining to the uninitiated how the software works.
Copyright © 2013. Tous droits réservés.
13 April 2013


text:
The Linux kernel implements the concept of Virtual File System (VFS, originally Virtual Filesystem Switch), so that it is (to a large degree) possible to separate actual "low-level" filesystem code from the rest of the kernel. The API of a filesystem is described below.
This API was designed with things closely related to the ext2 filesystem in mind. For very different filesystems, like NFS, there are all kinds of problems.
Four main objects: superblock, dentries, inodes, files
The kernel keeps track of files using in-core inodes ("index nodes"), usually derived by the low-level filesystem from on-disk inodes.
A file may have several names, and there is a layer of dentries ("directory entries") that represent pathnames, speeding up the lookup operation.
Several processes may have the same file open for reading or writing, and file structures contain the required information such as the current file position.
Access to a filesystem starts by mounting it. This operation takes a filesystem type (like ext2, vfat, iso9660, nfs) and a device and produces the in-core superblock that contains the information required for operations on the filesystem; a third ingredient, the mount point, specifies what pathname refers to the root of the filesystem.
Auxiliary objects
We have filesystem types, used to connect the name of
the filesystem to the routines for setting it up (at
mount time)
or tearing it down (at
umount time).
A struct vfsmount represents a subtree in the big file hierarchy - basically a pair (device, mountpoint).
A struct nameidata represents the result of a lookup.
A struct address_space gives the mapping between the blocks in a file and blocks on disk. It is needed for I/O.
Various objects play a role here. There are file systems, organized collections of files, usually on some disk partition. And there are filesystem types, abstract descriptions of the way data is organized in a filesystem of that type, like FAT16 or ext2. And there is code, perhaps a module, that implements the handling of file systems of a given type. Sometimes this code is called a low-level filesystem, low-level since it sits below the VFS just like low-level SCSI drivers sit below the higher SCSI layers.
A module implementing a filesystem type must announce its presence so that it can be used. Its task is (i) to have a name, (ii) to know how it is mounted, (iii) to know how to lookup files, (iv) to know how to find (read, write) file contents.
This announcing is done using the call
either at kernel initialization time or when the module is inserted.
There is a single argument, a struct that contains the name of the
filesystem type (so that the kernel knows when to invoke it) and a
routine that can produce a superblock.
The struct is of type
struct file_system_type.
Here the 2.2.17 version:
struct file_system_type { const char *name; int fs_flags; struct super_block *(*read_super) (struct super_block *, void *, int); struct file_system_type *next; };
The call
register_filesystem() hangs this struct in the chain
with head
file_systems, and
unregister_filesystem() removes it again.
Accesses to this chain are protected by the spinlock
file_systems_lock. There are no other writers.
The main reader is of course the
mount() system call
Other readers are
get_filesystem_list() used
/proc/filesystems, and the
system call.
The code is in
static struct file_system_type tue_fs_type = { .owner = THIS_MODULE, .name = "tue", .get_sb = tue_get_sb, .kill_sb = kill_block_super, .fs_flags = FS_REQUIRES_DEV, }; static int __init init_tue_fs(void) { return register_filesystem(&tue_fs_type); } static void __exit exit_tue_fs(void) { unregister_filesystem(&tue_fs_type); }
struct file_system_type { const char *name; int fs_flags; struct super_block *(*get_sb)(struct file_system_type *, int, char *, void *, struct vfsmount *); void (*kill_sb) (struct super_block *); struct module *owner; struct file_system_type *next; struct list_head fs_supers; struct lock_class_key s_lock_key; struct lock_class_key s_umount_key; };
(In 2.4 there was no
kill_sb(), and the role of
get_sb() was taken by
The final parameter of
get_sb() and the
lock_class_key fields are present since 2.6.18.)
Let us look at the fields of the struct file_system_type.
Here the filesystem type gives its name ("tue"), so that the kernel
can find it when someone does
mount -t tue /dev/foo /dir.
(The name is the third parameter of the mount system call.)
It must be non-NULL. The name string lives in module space.
Access must be protected either by a reference to the module,
or by the
At mount time the kernel calls the
fstype->get_sb() routine
that initializes things and sets up a superblock.
It must be non-NULL. Typically this is a 1-line routine that calls
one of
The routines
get_sb_single and
get_sb_nodev are
almost identical. Both are for virtual filesystems. The former is used
when there can be at most one instance of the filesystem.
(Now an old instance is used if there is one, but its flags may be changed.)
At umount time the kernel calls the
fstype->kill_sb() routine
to clean up. It must be non-NULL. Typically one of
The first is normal for filesystems backed by block devices.
The second for virtual filesystems, where the information is
generated on the fly. The third for in-memory filesystems without
backing store - they need an additional
dget() when
a file is created (so that their dentries always have a nonzero
reference count and are not garbage collected), and the
that is the difference between
kill_anon_super and
kill_litter_super does the balancing
fs_flags field of a
struct file_system_type
is a bitmap, an OR of several possible flags with mostly obscure uses only.
The flags are defined in
This field was introduced in 2.1.43. The number of flags, and their
meanings, varies. In 2.6.19 there are the four flags
FS_REQUIRES_DEV flag (since 2.1.43) says that this is not
a virtual filesystem - an actual underlying block device is required.
It is used in only two places: when
is generated, its absence causes the filesystem type name to be prefixed
by "nodev". And in
fs/nfsd/export.c this flag is tested
in the process of determining whether the filesystem can be exported
via NFS. Earlier there were more uses.
FS_BINARY_MOUNTDATA flag (since 2.6.5) is set to tell
the selinux code that the mount data is binary, and cannot be
handled by the standard option parser. (This flag is set for
afs, coda, nfs, smbfs.)
FS_REVAL_DOT flag (since 2.6.0test4) is set to tell
the VFS code (in
namei.c) to revalidate the paths "/", ".", ".."
since they might have gone stale. (This flag is set for NFS.)
FS_RENAME_DOES_D_MOVE flag (since 2.6.19) says that
the low-level filesystem will handle
d_move() during
rename(). Earlier (2.4.0test6-2.6.19) this was called
FS_ODD_RENAME and was used for NFS only, but
now this is also useful for ocfs2.
See also the discussion of
silly rename.
FS_NOMOUNT flag (2.3.99pre7-2.5.22) says that this filesystem
must never be mounted from userland, but is used only kernel-internally.
This was used, for example, for pipefs, the implementation of Unix pipes
using a kernel-internal filesystem (see
Even though the flag has disappeared, the concept remains,
and is now represented by the MS_NOUSER flag.
FS_LITTER flag (2.4.0test3-2.5.7) says that after umount
d_genocide() is needed. This will remove one reference
from all dentries in that tree, probably killing all of them, which is
necessary in case at creation time the dentries already got reference
count 1. (This is typically done for an in-core filesystem where dentries
cannot be recreated when needed.) This flag disappeared in Linux 2.5.7
when the explicit
kill_super method
was introduced.
FS_SINGLE flag (2.3.99pre7-2.5.4) says that there is
only a single superblock for this filesystem type, so that
only a single instance of this filesystem may exist,
possibly mounted in several places.
FS_IBASKET was defined in 2.1.43 but never used, and
the definition disappeared in 2.3.99pre4.
FS_NO_DCACHE and
FS_NO_PRELIM flags were introduced
in 2.1.43, but were a mistake and disappeared again in 2.1.44. However,
the definitions survived until Linux 2.5.22.
For the purposes of these flags, see the comment in 2.1.43:dcache.c.
owner field of a
struct file_system_type
points at the module that owns this struct. When doing things that
might sleep, we must make sure that the module is not unloaded
while we are using its data, and do this with
try_inc_mod_count(owner). If this fails then the module
was just unloaded. If it succeeds we have incremented a reference
count so that the module will not go away before we are done.
This field is NULL for filesystems compiled into the kernel.
There exists a strange SYSV system call
that will return (i) a sequence number given a filesystem type,
and (ii) a filesystem type given a sequence number, and
(iii) the total number of filesystem types registered now.
This call is not supported by libc or glibc.
These sequence numbers are rather meaningless since they may change
any moment. But this means that one can get a snapshot of the
list of filesystem types without looking at
For example, the program
might give output like
#include <stdio.h>
#include <linux/unistd.h>
/* define the 3-arg version of sysfs() */
static _syscall3(int,sysfs,int,option,unsigned int,fsindex,char *,buf);
/* define the 1-arg version of sysfs() */
static int sysfs1(int i) {
return sysfs(i,0,NULL);
int i, tot;
char buf[100]; /* how long is a filesystem type name?? */
tot = sysfs1(3);
if (tot == -1) {
for (i=0; i<tot; i++) {
if (sysfs(2, i, buf)) {
printf("%2d: %s\n", i, buf);
return 0;
0: ext2
1: minix
2: romfs
3: msdos
4: vfat
5: proc
6: nfs
7: smbfs
8: iso9660
The kernel code for copying the names to user space is instructive:
static int fs_name(unsigned int index, char * buf) { struct file_system_type * tmp; int len, res; read_lock(&file_systems_lock); for (tmp = file_systems; tmp; tmp = tmp->next, index--) if (index <= 0 && try_inc_mod_count(tmp->owner)) break; read_unlock(&file_systems_lock); if (!tmp) return -EINVAL; /* OK, we got the reference, so we can safely block */ len = strlen(tmp->name) + 1; res = copy_to_user(buf, tmp->name, len) ? -EFAULT : 0; put_filesystem(tmp); return res; }
In order to walk safely along a linked list we need the read lock.
The routines that change links (like
need a write lock. Once the filesystem name with the desired
index is found we cannot just copy this name to user space.
Maybe the page we want to copy to was swapped out, and getting it
back in core takes some time, and maybe the module is unloaded just
at that point, and then, when we want to read the name we reference
memory that is no longer present. The routine
first gets the module unload lock, then looks whether the module still
is present; if so it increases the module's refcount and returns 1
(after releasing the unload lock), otherwise it returns 0.
After a successful return of
try_inc_mod_count() we own
a reference to the module, so that it cannot disappear while we
are doing
copy_to_user(). The
decreases the module's refcount again.
So this is how the
owner field is used: it tells which
module must be pinned when we do something with this struct.
A module stays as long as its refcount is positive, but can
disappear any moment when the refcount becomes zero.
fs/filesystems.c there is a global variable
static struct file_system_type *file_systems;that is the head of the list of known filesystem types. A
register_filesystem adds the filesystem to the linked list,
unregister_filesystem removes it again.
The field
next is the link in this simply linked list.
It must be NULL when
register_filesystem is called,
and is reset to NULL by
The list is protected by the
fs_supers field of a
struct file_system_type
is the head of a list of all superblocks of this type.
In each superblock the corresponding link is called
This list is protected by the spinlock
This list is used in
sget() for filesystems like NFS
where we get a filehandle and must check each superblock of
the given type whether it is the right one.
These are fields used when CONFIG_LOCKDEP is defined, and take no space otherwise. Used for lock validation.
The mount system call attaches a filesystem to the big file hierarchy at some indicated point. Ingredients needed: (i) a device that carries the filesystem (disk, partition, floppy, CDROM, SmartMedia card, ...), (ii) a directory where the filesystem on that device must be attached, (iii) a filesystem type.
In many cases it is possible to guess (iii) given the bits on the device, but heuristics fail in rare cases. Moreover, sometimes there is no difference on the device, as for example in the case where a FAT filesystem without long filenames must be mounted. Is it msdos? or vfat? That information is only in the user's head. If it must be used later in an environment that cannot handle long filenames it should be mounted as msdos; if files with long names are going to be copied to it, as vfat.
The kernel does not guess (except perhaps at boot time, when the
root device has to be found), and requires the three ingredients.
In fact the
mount system call has five parameters:
there are also mount flags (like "read-only") and options, like
for ext2 the choice between
errors=continue and
errors=remount-ro and
The code for
sys_mount() is found in
fs/super.c. The connection with the filesystem type name
is made in
struct file_system_type *type = get_fs_type(fstype); struct super_block *sb; if (!type) return ERR_PTR(-ENODEV); sb = type->get_sb(type, flags, name, data);and this is the only call of the
get_sb() routine.
The code for
sys_umount() is found in
fs/super.c. The counterpart of the just quoted code
is the cleanup in
fs->kill_sb(s);and this is the only call of the
kill_sb() routine.
The superblock gives global information on a filesystem: the device on which it lives, its block size, its type, the dentry of the root of the filesystem, the methods it has, etc., etc.
struct super_block { dev_t s_dev; unsigned long s_blocksize; struct file_system_type *s_type; struct super_operations *s_op; struct dentry *s_root; ... }
struct super_operations { struct inode *(*alloc_inode)(struct super_block *sb); void (*destroy_inode)(struct inode *); void (*read_inode) (struct inode *); void (*dirty_inode) (struct inode *); void (*write_inode) (struct inode *, int); void (*put_inode) (struct inode *); void (*drop_inode) (struct inode *); void (*delete_inode) (struct inode *); void (*put_super) (struct super_block *); void (*write_super) (struct super_block *); int (*sync_fs)(struct super_block *sb, int wait); void (*write_super_lockfs) (struct super_block *); void (*unlockfs) (struct super_block *); int (*statfs) (struct super_block *, struct statfs *); int (*remount_fs) (struct super_block *, int *, char *); void (*clear_inode) (struct inode *); void (*umount_begin) (struct super_block *); int (*show_options)(struct seq_file *, struct vfsmount *); };
This is enough to get started:
the dentry of the root directory tells us the inode of this root directory
(and in particular its
sb->s_op->read_inode(inode) will read this inode from disk.
inode->i_op->lookup() allows us to find names in the
root directory, etc.
Each superblock is on six lists, with links through the fields
s_instances, respectively.
All superblocks are collected in a list
with links in the fields
This list is protected by the spinlock
The main use is in
super.c:get_super() or
to find the superblock for a given block device.
(Both routines are identical, except that one takes a
the other a
This list is also used various places where all superblocks must be sync'ed
or all dirty inodes must be written out.
All superblocks of a given type are collected in a list headed by the
fs_supers field of the struct filesystem_type,
with links in the fields
Also this list is protected by the spinlock
All open files belonging to a given superblock are chained in
a list headed by the
s_files field of the superblock,
with links in the fields
f_list of the files.
These lists are protected by the spinlock
This list is used for example in
to check that there are no files currently open for writing.
See also
Normally, all dentries are connected to root. However, when
NFS filehandles are used this need not be the case.
Dentries that are roots of subtrees potentially unconnected
to root are chained in a list headed by the
field of the superblock, with links in the fields
These lists are protected by the spinlock
They are grown in
dcache.c:d_alloc_anon() and shrunk
See the discussion in
Lists of inodes to be written out.
These lists are headed at the
s_dirty (resp.
field of the superblock, with links in the fields
These lists are protected by the spinlock
An (in-core) inode contains the metadata of a file: its serial number, its protection (mode), its owner, its size, the dates of last access, creation and last modification, etc. It also points to the superblock of the filesystem the file is in, the methods for this file, and the dentries (names) for this file.
struct inode { unsigned long i_ino; umode_t i_mode; uid_t i_uid; gid_t i_gid; kdev_t i_rdev; loff_t i_size; struct timespec i_atime; struct timespec i_ctime; struct timespec i_mtime; struct super_block *i_sb; struct inode_operations *i_op; struct address_space *i_mapping; struct list_head i_dentry; ... }
In early times,
struct inode would end with a union
union { struct minix_inode_info minix_i; struct ext2_inode_info ext2_i; struct ext3_inode_info ext3_i; struct hpfs_inode_info hpfs_i; ... } u;to store the filesystemtype specific stuff. One could go from
inode to e.g.
struct ext3_inode_info
This setup was rather dissatisfactory, since it meant that
a core data structure had to know about all possible
filesystem types (even possible out-of-tree ones)
and reserve enough room for the largest one among the
struct foofs_inode_info. It also wasted memory.
In Linux 2.5.3 this system was changed, and instead of
a big
struct inode having a filesystemtype dependent part,
we now have big filesystemtype dependent inodes, with a VFS part.
struct ext3_inode_info has as its last field
struct inode vfs_inode;, and given the VFS inode
one finds the ext3 information via
EXT3_I(inode), defined as
container_of(inode, struct ext3_inode_info, vfs_inode).
See also the discussion of
The methods of an inode are given in the
struct inode_operations.
struct inode_operations { int (*create) (struct inode *, struct dentry *, int); struct dentry * (*lookup) (struct inode *, struct dentry *); int (*link) (struct dentry *, struct inode *, struct dentry *); int (*unlink) (struct inode *, struct dentry *); int (*symlink) (struct inode *, struct dentry *, const char *); int (*mkdir) (struct inode *, struct dentry *, int); int (*rmdir) (struct inode *, struct dentry *); int (*mknod) (struct inode *, struct dentry *, int, dev_t); int (*rename) (struct inode *, struct dentry *, struct inode *, struct dentry *); int (*readlink) (struct dentry *, char *,int); int (*follow_link) (struct dentry *, struct nameidata *); void (*truncate) (struct inode *); int (*permission) (struct inode *, int); int (*setattr) (struct dentry *, struct iattr *); int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *); int (*setxattr) (struct dentry *, const char *, const void *, size_t, int); ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); ssize_t (*listxattr) (struct dentry *, char *, size_t); int (*removexattr) (struct dentry *, const char *); };
Each inode is on four lists, with links through the fields
All dentries belonging to this inode (names for this file)
are collected in a list headed by the inode field
with links in the dentry fields
This list is protected by the spinlock
All inodes live in a hash table, with hash collision chains
through the field
i_hash of the inode.
These lists are protected by the spinlock
The appropriate head is found by a hash function; it will be
an element of the
inode_hashtable[] array when the
inode belongs to a superblock, or
if not.
Inodes are collected into lists that use the
field as link field. The lists are protected by the spinlock
inode_lock. An inode is either unused, and then on
the chain with head
inode_unused, or in use but not
dirty, and then on the chain with head
or dirty, and then on one of the per-superblock lists with heads
s_dirty or
s_io, see
Inodes belonging to a given block device are collected into
a list headed by the
bd_inodes field of the block device,
with links in the inode
i_devices fields.
The list is protected by the
bdev_lock spinlock.
It is used to set the
i_bdev field to NULL and to reset
i_mapping when the block device goes away.
The dentries encode the filesystem tree structure, the names of the files. Thus, the main parts of a dentry are the inode (if any) that belongs to it, the name (the final part of the pathname), and the parent (the name of the containing directory). There are also the superblocks, the methods, a list of subdirectories, etc.
struct dentry { struct inode *d_inode; struct dentry *d_parent; struct qstr d_name; struct super_block *d_sb; struct dentry_operations *d_op; struct list_head d_subdirs; ... }
struct dentry_operations { int (*d_revalidate)(struct dentry *, int); int (*d_hash) (struct dentry *, struct qstr *); int (*d_compare) (struct dentry *, struct qstr *, struct qstr *); int (*d_delete)(struct dentry *); void (*d_release)(struct dentry *); void (*d_iput)(struct dentry *, struct inode *); };
Here the strings are given by
struct qstr { const unsigned char *name; unsigned int len; unsigned int hash; };
Each dentry is on five lists, with links through the fields
Some of these names were badly chosen, and lead to confusion.
We should do a global replace changing
d_subdirs into
d_children and
d_child into
The pathname represented by a dentry, is the concatenation of
the name of its parent
d_parent, a slash character,
and its own name
However, if the dentry is the root of a mounted filesystem
(i.e., if
dentry->d_covers != dentry), then its pathname
is the pathname of the mount point
Finally, the pathname of the root of the filesystem
dentry->d_parent == dentry) is "/",
and this is also its
d_mounts and
d_covers fields of a dentry
point back to the dentry itself, except that the
d_covers field
of the dentry for the root of a mounted filesystem points back to
the dentry for the mount point, while the
d_mounts field
of the dentry for the mount point points at the dentry for the root of a
mounted filesystem.
d_parent field of a dentry points back to the
dentry for the directory in which it lives. It points back
to the dentry itself in case of the root of a filesystem.
A dentry is called negative if it does not have an associated inode, i.e., if it is a name only.
We see that although a dentry represents a pathname, there may be several dentries for the same pathname, namely when overmounting has taken place. Such dentries have different inodes.
Of course the converse, an inode with several dentries, can also occur.
The above description, with
d_mounts and
was for 2.4. In 2.5 these fields have disappeared, and we only
have the integer
d_mounted that indicates how many
filesystems have been mounted at that point. In case it is
nonzero (this is what
d_mountpoint() tests), a hash
table lookup can find the actual mounted filesystem.
Dentries are used to speed up the lookup operation.
A hash table
dentry_hashtable is used, with an index
that is a hash of the name and the parent. The hash collision
chain has links through the dentry fields
This chain is protected by the spinlock
All unused dentries are collected in a list
with links in the dentry fields
This list is protected by the spinlock
All subdirectories of a given directory are collected in a list
headed by the dentry field
d_subdirs with links
in the dentry fields
These lists are protected by the spinlock
All dentries belonging to the same inode are collected in a list
headed by the inode field
with links in the dentry fields
This list is protected by the spinlock
File structures represent open files, that is, an inode together
with a current (reading/writing) offset. The offset can be set
by the
lseek() system call. Note that instead of a
pointer to the inode we have a pointer to the dentry - that
means that the name used to open a file is known. In particular
system calls like
getcwd() are possible.
struct file { struct dentry *f_dentry; struct vfsmount *f_vfsmnt; struct file_operations *f_op; mode_t f_mode; loff_t f_pos; struct fown_struct f_owner; unsigned int f_uid, f_gid; unsigned long f_version; ... }
Here the
f_owner field gives the owner to use for
async I/O signals.
struct file_operations { struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char *, size_t, loff_t *); ssize_t (*aio_read) (struct kiocb *, char *, size_t, loff_t); ssize_t (*write) (struct file *, const char *, size_t, loff_t *); ssize_t (*aio_write) (struct kiocb *, const char *, size_t, loff_t); int (*readdir) (struct file *, void *, filldir_t); unsigned int (*poll) (struct file *, struct poll_table_struct *); int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); int (*open) (struct inode *, struct file *); int (*flush) (struct file *); int (*release) (struct inode *, struct file *); int (*fsync) (struct file *, struct dentry *, int datasync); int (*aio_fsync) (struct kiocb *, int datasync); int (*fasync) (int, struct file *, int); int (*lock) (struct file *, int, struct file_lock *); ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*sendfile) (struct file *, loff_t *, size_t, read_actor_t, void *); ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); };
Each file is in two lists, with links through the fields
The list with links through
f_list was discussed
above. It is the list of all files
belonging to a given superblock. There is a second use:
the tty driver collects all files that are opened instances
of a tty in a list headed by
tty->tty_files with
links through the file field
f_list. Conversely,
these files point back at the tty via their field
(This field
private_data is also used elsewhere.
For example, the proc code uses it to attach a struct
to a file.)
All event poll items belonging to a given file are collected
in a list with head
protected by the file field
(For event poll stuff, see epoll_ctl(2).)
struct vfsmount describes a mount.
The definition lives in
struct vfsmount { struct list_head mnt_hash; struct vfsmount *mnt_parent; /* fs we are mounted on */ struct dentry *mnt_mountpoint; /* dentry of mountpoint */ struct dentry *mnt_root; /* root of the mounted tree */ struct super_block *mnt_sb; /* pointer to superblock */ struct list_head mnt_mounts; /* list of children, anchored here */ struct list_head mnt_child; /* and going through their mnt_child */ atomic_t mnt_count; int mnt_flags; char *mnt_devname; /* Name of device e.g. /dev/dsk/hda1 */ struct list_head mnt_list; };
Long ago (1.3.46) it was introduced as part of the quota code.
There was a linked list of
struct vfsmounts that
contained a device number, device name, mount point name,
mount flags, superblock pointer, semaphore, file pointers
to quota files and time limits for how long an over-quota situation
would be allowed. Nowadays quota have independent bookkeeping,
and a
struct vfsmount only describes a mount.
These structs are allocated by
alloc_vfsmnt() and
released by
free_vfsmnt() in
Vfsmounts live in a hash headed by
The field
mnt_hash is the link in the collision chain.
This list does not seem to be protected by a lock.
They are put into the hash by
attach_mnt(), found there
lookup_mnt(), and removed again by
all from
Vfsmount for parent.
Dentry for the mountpoint. The pair (mnt_mountpoint, mnt_parent)
(returned by
follow_up()) will be the dentry and vfsmount
for the parent.
Used e.g. in
d_path to return the pathname of a dentry.
Dentry for the root of the mounted tree.
Superblock of the mounted filesystem.
The field
mnt_mounts of a struct vfsmount is the head of
a cyclic list of all submounts (mounts on top of some path
relative to the present mount). The remaining links of this cyclic
list are stored in the
mnt_child fields of its submounting
vfsmounts. (And each of these points back at us with its
mnt_parent field.)
Used in
autofs4/expire.c and
namespace.c (and nowhere else).
Keep track of users of this structure.
Incremented by
mntget, decremented by
Initially 1. It will be 2 for a mount that may be unmounted.
(Autofs also uses this to test whether a tree is busy.)
The mount flags, like MNT_NODEV, MNT_NOEXEC, MNT_NOSUID.
Earlier also MS_RDONLY (that now is stored in
and MNT_VISIBLE (came in 2.4.0-test5, went in 2.4.5)
that told whether this entry should be visible in
Name used in
There was a global cyclic list
containing all mounts, used only to create the contents of
/proc/mounts. These days we have per-process namespaces,
and the global
vfsmntlist has been replaced by
current->namespace->list. This list is ordered
by the order in which the mounts were done, so that one can do
the umounts in reverse order.
The field
mnt_list contains the pointers for this cyclic list.
struct fs_struct determines the interpretation
of pathnames referred to by a process (and also, somewhat
illogically, contains the umask). The typical reference
current->fs. The definition lives in
struct fs_struct {
atomic_t count;
rwlock_t lock;
int umask;
struct dentry * root, * pwd, * altroot;
struct vfsmount * rootmnt, * pwdmnt, * altrootmnt;
Semantics of
root and
pwd are clear.
Remains to discuss
In order to support emulation of different operating systems
like BSD and SunOS and Solaris, a small wart has been added
to the
walk_init_root code that finds the root directory
for a name lookup.
altroot field of an
is usually NULL. It is a function of the personality
and the current root, and the
sys_chroot system calls call
The effect is determined at kernel compile time.
One can define
__emul_prefix() in
as some pathname, say
The default is NULL, but some architectures have a
definition depending on
If this prefix is non-NULL, and the corresponding file is found,
set_fs_altroot() will set the
altrootmnt fields of
to dentry and vfsmnt of that file.
A subsequent lookup of a pathname starting with '/' will now first try to use the altroot. If that fails the usual root is used.
struct nameidata represents the result of a lookup.
The definition lives in
The typical use is:
struct nameidata {
struct dentry *dentry;
struct vfsmount *mnt;
struct qstr last;
unsigned int flags;
int last_type;
struct nameidata nd;
error = user_path_walk(filename, &nd);
if (!error)
path_release() does
The core of the routines
user_path_walk (which call
without or with the
LOOKUP_FOLLOW flag) is the
if (path_init(name, flags, nd))
error = path_walk(name, nd);
So the basic routines handling
nameidata are
path_walk. The former finds the start of the walk,
the latter does the walking. (However, the former returns
0 in case it did the walking itself already.)
The routine
path_init initialises the four fields
flags field was given as an argument, and
dentry and
mnt are initialised to those
of the current directory or those of the root directory
depending on whether name starts with a '/' or not.
It will always return 1 except in a certain obscure case
discussed below, where the return 0 means that the complete
lookup was done already. (And this case cannot occur for
sys_chroot, that is why the code there needs not check
the return value.)
path_init will always return 1, except when name starts
with a '/', in which case it returns whatever
walk_init_root will always return 1, except when
current->fs->altroot is non-NULL and
does not contain LOOKUP_NOALT (for
sys_chroot it does)
__emul_lookup_dentry succeeds, which it does when
pathwalk succeeds - in this case no
path_walk is
required anymore)

subset: commoncrawl


text:
Rbxpac.com Scam Alert! The Rbxpac review is here to reveal the truth about Rbxpac which is a fake Ray-Ban website. You must be here because you want to know why is Rbxpac.com a scam, what makes Rbxpac a scam, what is Rbxpac.com in real, right? Well, then let's begin with our Rbxpac review to find out the answers to these queries.
Rbxpac which is claiming to sell Ray-Ban's products is a fraudulent online store due to the following reasons:-
# Although Rbxpac claims to sell Ray-Ban's glasses, it is not authorized to sell the products of Ray-Ban. It doesn't have any link with Ray-Ban's brand.
# Like lots of scam sites, the website Rbxpac.com has also poorly designed which looks similar to lots of scam sites. For example; its website theme is very untidy; it hasn't provided the required security measures to secure its website; it has provided the fake trust seal logos.
# We can say the trust seal logos of VeriSign and so on provided by Rbxpac on its product detail pages are fake because those logos are not clickable. However, the real trust seal logos should be clickable so that we can click on them which will send us to the official website of respective trust seal providers to verify those trust seals. Only scam sites provide such fake trust seal logos which proves Rbxpac.com is a scam. So if you shop at this site, your credit card information can be stolen.
# You can find multiple scam sites similar to Rbxpac.com such as Rbxpcy, Rbxycc, Rbyoo, Rbreey, Rbxpur, Rbrtw, Rbtocoo, RBTodays, Rbuim, RBQ-All, RB-VIP, RB-QQ, RB-Kall, RB-Host, RB-En, RB-Coupon, Rb-Coo, Rb-Ban, Rb-Site, Rbo-One, Rbavo, Rabnn, Rabkb, Raybxc, Raybbn, Rbbrd, Rbgell, Buyrot, Saletd, RaybVIPs, Rbdaily and so on.
# These days multiple new online stores are claiming to sell various items on huge discount, but most of them are scams. So, it's better to stay away from the new online stores or at least do some research before you purchase something from the new online stores because most of these new online stores don't deliver the purchased items to their clients or, deliver completely different or very low-quality items. Some of these kinds of online stores even have charged the credit card of clients randomly without their consent. So, if you have ever purchased mistakenly from scam sites, we suggest you immediately contact your bank or credit card company to secure your credit card information.
Now you must be clear why is a Rbxpac scam through our Rbxpac.com review as above. However, if you still want to add your own Rbxpac.com reviews or want to say something about it, then please feel free to leave your comment below.
If you want to share this Rbxpac review with your friends and families through your social media accounts to make them aware of this Rbxpac.com scam, then please feel free to do so.
You can find the various kinds of scams listed within our "Scams" category by clicking >HERE< or you can navigate our website through our home page to find out the several interesting and knowledgeable articles under different categories by clicking >HERE<.
Actually, you can shop the products of Ray-Ban easily from renowned online stores like Amazon, so it's better you avoid to unknown sites like Rbxpac.


text:
Contributed by Sharon Butler / This weekend at Hyperallergic Thomas Micchelli reviews Dying on Stage: New Painting in New York, the Garis & Hahn exhibition curated by Kyle Chayka that was inspired by "The New Casualists, a 2011 essay I published in The Brooklyn Rail. Noting that much of the work in the show veers into representational territory and freely quotes from art history, Micchelli asks the following questions:
What does the process of reinvestigation say about the notion of freedom that Casualism is supposed to embody?
To what extent does intuition come into play, and where do convention and conditioning intrude? Does reality need to be forced through a cultural filter in order to be understood? Should past frameworks be scavenged for tools to compartmentalize and analyze direct experience?
Is it possible for "studied, passive-aggressive incompleteness" to address complex structures and extra-visual ideas?
Is Casualism's state of incompleteness, which is the flip side of unfettered freedom (if there is no limit to choice, all choices are necessarily limited), a conclusive metaphor or something we need to get beyond? …But how much weight will this fresh visual argot be able to carry? What structures will it rely upon in order to avoid dissipation and arbitrariness?
Which of these two visions — the unchecked or the purposely restricted — makes more sense for our time? Which is more honest, and which is self-deceiving?
In conclusion, Micchelli writes that:
Casualism, with its humble anti-heroics, acts as a necessary corrective to the overblown production values that have carried away most of the market's high end as well as the lion's share of media attention….In that way it resembles the "Vow of Chastity" taken by the Dogme 95 group of mostly Danish directors who resolved to strip filmmaking down to its essentials. Dogme 95 was too limiting to last, ultimately interfering with the creative process it was meant to nurture. Casualism will also run its course, but, like Dogme, its call for directness, spontaneity and self-effacement will leave its mark.
I agree completely. Artists working in a Casualist mode have already begun to move on. For ambitious artists (i.e. artists who want to make culturally meaningful work, not those who want to succeed in the art market), the Casualist approach may be too reductive. Personally, I've been looking at overworking as a companion strategy to the post-optimistic, underworked approach of Casualism. What happens when you won't give up, working on a painting long past the obvious point of resolution? Note: This is harder than it sounds.
And: Stay tuned for details about "Dense Surveillance," my solo show at the expansive Fine Arts Gallery of Westchester Community College, opening in September…
Related posts:
Sharon Butler: Precisionist Casual @ Pocket Utopia
Reader response to "Abstract Painting: The New Casualists"
Claude Viallat: Exploring Casualist abstraction in 1960s France


text:
Utah is known for many things, but one of its most popular attractions is its incredible snow. Due to this, many individuals wonder who will be liable in the event they are harmed while skiing. In general, any individual who is harmed by a snowboarder or a skier has the right to sue that person. However, suing a ski resort for an injury can be more difficult.
Personal injury lawyers in Utah understand that many of the ski resorts have laws that prevent their clients from suing them when they are skiing. This is because skiing and snowboarding have implicit risks and resorts argue that it is up to skiers and snowboards to protect themselves on the slopes.
Therefore, ski resorts do not cover common skiing and snowboarding accidents such as collisions, skiing outside of designated areas and skiing outside of one's ability. However, ski resorts can he held responsible for negligence.
For example, some ski resorts, by law, must ensure that they post signs on specific trails. However, if they forget to do this and someone is hurt due to a lack of signage, that individual may have a personal injury case against the ski resort.
To understand if one has been hurt due to their own negligence or negligence on behalf of a resort, an individual can contact a personal injury lawyer in Utah who can handle their case. Most personal injury claims against ski resorts are often settled outside of court and are handled quickly. However, Utah lawyers are also experts in handling personal injury cases that must progress to a lawsuit.
In addition to unmarked trails, other Utah residents have been successful in suing ski resorts for accidents that occurred due to a malfunctioning chairlift. Cases have also been won that involved one of the resort's employees skiing improperly and harming a skier or snowboarder.
Another common Utah lawsuit occurs when skiers or snowboards collide with a parked show machine. Generally, this occurrence is not considered an inherent risk of skiing or snowboarding, meaning an individual can pursue a claim against the ski resort.
Although many ski resorts accidents occur on the slopes, ski resorts also experience other common personal injuries. For example, a ski resort can be liable if one of their clients slips and falls on ice. However, even in this case one must prove that the ski resort acted negligently and didn't provide ice melt or a sign warning them that the ground was slippery.
Whether one is harmed on or off the slopes, personal injury lawyers in Utah are well versed in ski resort injuries. To understand if a ski resort is liable for one's injury, an individual should contact one of the state's lawyers to discuss their accident.


text:
Road to Resilience
Mount Sinai Health System
Stories and insights to help you thrive in a challenging world. From fighting burnout and trauma, to building resilient families and communities, we explore what's possible when science meets the human spirit. Powered by the best experts in the world.
Or Listen Elsewhere


text:
10 For the Chairman Episode 52
Chris Roberts answers your questions about Star Citizen in the latest edition of Ten for the Chairman! Chris answers ten questions chosen from development subscribers in each show. Want your question considered? Learn more about subscriptions here.
Questions covered in Episode 52:
2:28 – Custom Crew Uniforms.
3:24 – Banu & Xi'An embassies.
4:30 – Missions for more than one ship.
5:04 – How inventories work.
7:22 – Purchasable voice packs.
8:27 – Org contracts.
9:42 – Planetary quarantines.
10:50 – FPS dungeons/instances
13:19 – Tevarin update
14:21 – Organization leader tools
This video is intended to be a guide for people who aren't sure of how to change the weapon loadouts of their ships in Star Citizen. If you enjoyed the video…


text:
An Interview with Weebl
When did you get your c64? Was it your first contact with computers?
Oooh blimey. It was back in 85 or 86 I think. We'd had a few computers by the time I finally convinced my dad to get one, starting with a VIC 20, then a Commodore Plus 4 (shudder) and then a Speccy (yeah I know but it was cheap.) Then we went to the Amiga so Commodore 4 life (fo shizzle!).
Were you in any way creative on the c64?
I was indeed. I had microrhythm, the sampler cartridge (woo 2 seconds) and the weird keyboard addon which, lets face it, was pretty pointless.
Who were/are your favourite SID composers?
I love Martin Galway and Rob Hubbard. I also like Tim Follin. Some of his tunes are simply amazing, and the noises he coxes out of the SID chip are fantastic.
What are your fondest memories related to the c64?
The music was always the bit that's really stuck with me as it's what got me interested in making tunes myself. I remember just pausing Delta to listen to the in-game music, which is probably my favorite piece. I also loved pretty much all the Thalamus releases and of course the mighty Jeff Minter. Iridis Alpha was a favorite of mine.
Your Delta remix has been well received by the audience here at Remix64, and you were elected #2 Best Newcomer 2004. What kindled your desire to make your own c64 remix?
I mainly did it as a thank you to Chris Abbott for inviting me to Back in Time Live. He'd spotted I was using some c64 sounds in Magical Trevor and of course it's Delta. Meeting Gary Liddon was brilliant but he's a shouty bugger.
Are you going to produce further c64 remixes?
Possibly. I'm not one for obsessively remaking stuff, but I'd like to do a few more pieces that I've loved. If I can get decent MIDI files to rip to shreds I will.
What were your impressions from the BITLive 2004 event?
It was so much fun. Jon Hare playing bass like a trooper. Ben Daglish and co's storming Monty on the Run and of course Visa Röster with their amazing singing and theatrics. It's a shame Jeff Minter and Sir Hubbard couldn't be there, but everyone was top.
What do you do for a living?
Make childish jokes about poo and stupid animations.
Please tell us about the creation of the characters Weebl & Bob. Did you intend to make it a series from the start?
I was bored stiff and I'd found B3ta.com, so I figured:
I can use flash and pie is a funny word... Let's see if I can do the most idiotic and simple cartoon ever. I never intended it to be a huge thing, but it just sort of caught on.
Your website won
Yahoo! Finds Of The Year 2004, the SLAY Radio team did a Badger dance at the Stanstead airport... How does that make you feel, did you ever expect the series to become such a major hit?
It makes me feel like 13 cats milking a fox. Like I say, I never really expected any of this, but I'm glad it happened as now I can just sit around shouting like a loon all day.
Weebl & Bob had appearances on MTV, too. How did this come about?
MTV emailed everyone who worked on the site but me. I was working at a web company at the time when I suddenly got a bunch of phone calls from Skoo and Co. saying MTV were trying to get in contact. I phoned them up and they invited me in for a meeting and said did I want to show it on TV. Soon after I quit my job to make cartoons full time. Which was nice.
I understand that you had to rename Weebl to Wobbl for the DVD release because of 1960's toys of similar shape called "Weebles". Why are they so nitpicky about it, and is there a chance that this will be sorted in the future?
Lawyers eh? They seem to know what they are on about so I tend to do what they say is best. We're not rich as kings so being sued isn't really an option. I'm hoping that one day we'll be able to use it.
Why Badgers? 😊
Why not?
You seem to be effervescent with creativity. Where do you get your inspiration from?
Mind Piss. Skoo is helpful too.
What equipment do you use, for making music and for animation?
I use a wonderfully high spec PC. Shiney shiney soundcard and Flash 5 mainly. For sound I use Reason 2.5. Frankly it's the best music program ever made and anyone who says different is as bad as Moon Hitler.
Any last words to the c64/Amiga remixing community?
Do some exercise you lazy shits.
Some explicit last words from weebl. 😃 What's left to say - keep up the great work!
- LMan


text:
Getting pregnant is like rolling a dice and hoping you land a 6, no one tells you how much it hurts to give birth (think being crushed by a truck), how tired you will ALWAYS be, or how much anxiety you'll feel when you're in a playground standing next to the eternally gorgeous "Lululemon" mom. That's the hot one with the great body, full makeup, and incredible hair. I still don't know how their hair can always look that good ALL the time. I'm not friends with ANY Lululemon moms.
In fact a Lululemon mom would never let me into the club, and that's because I'm the "Just making it work and getting shit done" mom.
I work. I'm one of the "working moms". When my son was born I was 29, and had been running my own company for several years, with multiple offices in New York. He's 6 now and in the last year I closed those offices, took a corporate job, quit a corporate job, and launched two new businesses.
So you see, I'm just too busy to have it all. I CAN'T have it all, and be good at everything ALL THE TIME. Neither can you. If you try, you will be holding yourself to an impossible standard, and end up possibly having a nervous breakdown. The sooner you learn that having it all is a myth, a white lie, the better. Learn and accept.
I realized that I couldn't have it all when I dressed my son for a Thanksgiving dinner party, and the only clothes he had to wear was his school uniform. Because who knew kids grew? And they'd need clothes other than school uniform?.Good job he looks great in blue.
I realized that I couldn't have it all when I forgot to pick up a friends child for a playdate, and completely forgot that there even was a playdate. I did not remember until 6 pm AT NIGHT.
I realized that I couldn't have it all when I let my kid eat 3 peanut butter and jelly sandwiches and a bag of Doritos for dinner because I had a work deadline and had no time to buy groceries or cook.
I realized that I couldn't have it all when I accidentally ordered 20 packages of chicken breast on fresh direct because I was trying to multitask.
There was a time that I would be HORRIFIED at any of these things, I'm supposed to be the gatekeeper of time, I'm the calendar woman, I'm immaculately organized, I cook amazing dinners, I plan the best play dates, and I'm professional at work, always meet deadlines, respond to every email perfectly. AND I even let my husband touch my knees once a week. I AM SUPERWOMAN!
NOPE. I am human, and as mothers, wives, friends, women we often forget that we are just humans, and there is no universe that exists where we can do all things well, and be all things to everyone all the time.
How did I get over the horror of my mom blunders? I just stopped killing myself over being perfect all the time. So my kid ate a couple of sandwiches for dinner, he won't die because he didn't get an organic home cooked meal one night.
I called my friend who's kid I forgot to pick up, I was honest, she understood. You will be forgiven! And the biggest trick in the book is learning to let it go. It doesn't matter. Forgive yourself, lower the expectation bar on yourself, relax, and besides there will always be a Lululemon mom to kill it so you don't have to.
About the Author
Laura Little – Marketing & Social Media Professional
Laura Little is a former CEO with over 10 years in business development, business marketing and strategy.
in 2018 she launched her marketing consultancy company "That British Chick" helping startups and brands with creative ideas and strategy. Laura is a specialist at connecting people and prides herself in building ethical long-lasting relationships.
She is a photographer and author, and a graduate of The Liverpool Institute of Performing Arts.
Laura is also an advocate for women in business and enjoys meeting new people, traveling and writing.
She currently resides in Manhattan NYC with her partner, son, and dog lucky.


text:
- Views: 236
- Report Article
- Articles
- Business & Careers
- Business Ideas
Bringing Invention to Your Company
Posted: May 08, 2019
Managers typically deal with bringing invention right into their company. Part of the struggle starts with comprehending what defines invention. Managers merely relate innovation to transform. In other words, if they do the common job in a different way, they are innovative. Nevertheless, my objective is to reveal you, a regular manager, exactly how to promote innovation as well as bring it to your business leaders.
The initial step in fostering innovation is to recognize that invention calls for creative thinking. Creative thinking allows pioneers to dream the impossible. Without an innovative approach to invention, you and also your firm is destined create the exact same services over and over again. So to foster imagination you have to get rid of constraints. Permit your group to find up with ideas based only on a straightforward objective. Just how they achieve that objective is up to them. Do not force unreasonable time constraints. The more radical the invention; the longer the due date. Other means to cultivate creativity is with motivation and also challenges. Motivate your group as the suggestions establish. Make your team feel comfy with the instructions they are going. Stating things like, "that will never ever work" is a nail in the casket of innovation. Obstacle those to assume outside package, as well as do decline any kind of status options.
Another crucial component to innovation is to welcome variety. Develop a task force consisted of a random sample of the business. This would include people from various departments, various histories, and also numerous ability. When you obtain a diverse team sharing invention ideas, invention just happens. Permit them to interact normally to get the creative juices flowing. The natural stress between varied people will trigger some interesting "what-if" scenarios complied with by some devils promoting. You will certainly require positioning a moderator to make certain that the team remains on track as well as assists work towards an option.
When you have assembled the team, you need to sell the concept of invention to your group. You and your group are embarking on a task that is not "sponsored" by the company... yet. Your invention might happen after hours, during lunch breaks, and also throughout company downtime. You need to be sincere yet discuss the benefits. This is a chance to make your mark on the organization and boost your job. Invention needs enthusiasm, so build your team out of individuals that are searching for acknowledgment as well as duty, not those merely looking for monetary settlement.
Give your team the sources they need. This would certainly consist of redistributing present responsibilities so they can concentrate on the invention. The task force may need marketing research or accessibility to emerging technologies within the organization. Bigger companies might have company partnerships that might intend to go after a joint venture and also deal expanded resources. Local business might have investors looking to increase the business extent. Regardless, you require to give them what they require and also remove anything that stops them from producing innovation.
Now that you have had the ability to develop how to produce something innovative, selling the concept to your company is normally the largest roadblock. Several companies wish to really feel cutting-edge however do not have the dedication or the vision. Prior to you approach your business leaders ensure you have actually done your research. Evaluate whether the invention is achievable in a reasonable quantity of time. Establish a model when feasible. Recognize any type of worries the leaders might have and also have concrete services in place. Identify just how this invention will not just establish the business besides the competition, yet how it will certainly fill a need for customers. Be confident in your innovation and also your team. Program the leaders you can supply this invention with the assistance of the organization. Keep in mind, firms are seeking innovation and if you have actually followed the steps as well as created something absolutely innovative, the invention will sell itself.
Kelly Wilson is an experienced writer who has contributed to a number of publications, including many categories and and many other topics.
I gave CBD gummies a shot for the first occasion and wow, what a game-changer! Not at worst were they bits, but they provided a noticeable head of relaxation' and eased my anxiety. I'm excited to review more CBD products and strongly propose these gummies representing anyone seeking a straight stress-reliever.
I gave CBD gummies a space launch to go to the in the beginning What is the downside of CBD gummies? leisure and wow, what a game-changer! Not at most were they tasty, but they provided a discernible discernment of recreation and eased my anxiety. I'm edgy to inquire more CBD products and strongly recommend these gummies representing anyone seeking a natural stress-reliever.


text:
Do you need home remodeling in Moorpark, CA, or the surrounding areas? If so, give our team here at Cavalier Builders, Inc. a call today. We work hard to provide our customers with the home renovations or repairs they need to get the most out of your home.
From the moment you pick up the phone to give us a call, you become the center of our attention. No matter the size of your home renovation needs, we will work with you every step of the way. We can help you get the most out of your home, and may potentially help increase your property value. Here are some of the services we offer to our customers:
No matter your needs, our remodeling contractors are here to help. Call now if you have any questions regarding our services.
We work hard for the people of Moorpark, California, and the surrounding areas. Moorpark is a part of Ventura County and is home to 34,000 people. The city is located in Southern California, just outside of Los Angeles.
There is plenty to do in the area while we work on your home. We suggest visiting Arroyo Vista Community Park for areas to picnic and biking trails. Visit the official Moorpark website or the local Chamber of Commerce for more local information.
When you need home renovations, call our team here at Cavalier Builders, Inc. We can help the people of Moorpark, California. We look forward to working with you.


text:
A Forest of Signs: Josephine Stealey, Sun Smith-Foret, and Ann Coddington
A Forest of Signs: Josephine Stealey, Sun Smith-Foret, Ann Coddington and The Craft and Art of the Cedarhurst Basketeers are two separate, but theme-related exhibits opening soon at the Cedarhurst Center for the Arts. Both exhibits emphasize the… Read More
Award Winner Cathryn Peters
NBO member Cathryn Peters, from Angora, Minnesota, was awarded 1st place in 3-D and $500 by juror Sam Baardman, a multidisciplinary artist and photographer from Winnipeg, Manitoba, Canada, for her antler basket wall sculpture shown above, "Silent Whispers… Read More
Carol Eckert at Museum of Fine Arts Boston
The work of NBO member Carol Eckert is currently on display at the Museum of Fine Arts in Boston, Massachusetts. Each of the ten pieces currently on display is a container of some sort – drawers pull out,… Read More


text:
Celebrate Summer at "Blues, Brews & BBQ" Event
at Reunion Resort & Golf Club
WHO: Reunion Resort & Golf Club and its signature restaurant, Traditions at Nicklaus Clubhouse
WHAT: Start the summer off right at Reunion Resort's "Blues, Brews & BBQ," a fun-filled evening of finger-licking BBQ, live blues and a sampling of beers from Central Florida local breweries. The menu includes House Smoked Salmon Fillets, Slow Smoked Brisket and Ribs, Smoked Chicken and Pork Shoulders, along with a satisfying assortment of side items, desserts and house-made signature BBQ sauces. Wash it all down with frothy favorites from Crooked Can Brewing Company, Orlando Brewing, Ocean Sun Brewing and Veza Sur Brewing Co., while the Buddy Blues Band provides the live bluesy soundtrack. Pricing: Adults $59. Event is for guests 21 and over.
WHEN: Saturday, June 15, 2019, from 5 to 9 p.m.
WHERE: Traditions at the Nicklaus Clubhouse at Reunion Resort & Golf Club
7593 Gathering Drive, Kissimmee, FL 34747
HOW: Reservations are recommended and can be made online at ReunionResort.com/bbb. For more event information, visit www.reunionresort.com


text:
Taylor Callery is an American traditional artist whose conceptually bold and graphic work is heavily influenced by the texture and culture found in the urban landscape. His methods of creation include a mixed media approach of silkscreen, spray paint, stencil, acrylic, and collage on wood panel.
His work explores and comments on complex social issues found in modern culture, expressing a wide range of topics that include pop culture, sex, politics, religion, civil rights, and more.
Taylor's original works have been exhibited and featured in a number of galleries worldwide that include Paris, New York, and Washington D.C. among others.
Taylor's work has also been featured in the pages of Harper's Magazine, TIME, Rolling Stone, Newsweek, The New York Times, The Los Angeles Times, Mother Jones, The Smithsonian, The Atlantic, Scientific American, Sports Illustrated, The Washington Post, The Wall Street Journal, Billboard, Forbes, and over one hundred other national and international publications and advertising campaigns.
Taylor has also been recognized by prominent entities such as American Illustration, The New York Society of Illustrators, 3x3 Magazine, Communication Arts, and the Society for News Design among others.


text:
Looking for some interesting tip for a trip of your lifetime consider our solution with Air New Zealand and their partners Singapore Airlines, Air Tahihi Nui and United when departing from the UK. With this solution you would visit the most iconic and beutiful world destinations. You would fly from London to Singapore, New Zealand then to Samoa, New Caledonia, Cook Islands or French Polynesia. You last stop would be in Honolulu, Hawaii before you would return back Europe. Such a Round-The-World ticket is now available for £1190. (€1329). You can also depart from Manchester (but it is necessary to return from California to London).
We have managed to find these flights with Air New Zealand in April, May and June 2018. If you would struggle with your itinerary feel free to contact us via FB page or by mail. The cheapest option requires max stay 1 month but you can also find some interesting solution for itineries with longer stay. This is definitely not a low cost trip but you have an unique opportunity to visit the most incredible places at once also booked under just single ticket. With this offer you can build your own round the world tour..
Booking samples **Choose Skyscanner UK to see this fare**
UK – Singapore – New Zealand – Samoa – Hawaii – UK for £1190
UK – Singapore – New Zealand – New Caledonia – Hawaii – UK for £1220
UK – Singapore – New Zealand – Cook Islands – Hawaii – UK for £1263
UK – Singapore – New Zealand – French Polynesia – Hawaii – UK for £1281
Itinerary sample
London – Singapore on 21st of May 2018
Singapore – Auckland on 24th of May
Auckland – Apia / Noumea / Rarotonga / Papeete on 6th of June
Apia / Noumea / Rarotonga / Papeete – Honolulu on 14th of June
Honolulu – London on 22nd of June
You can also save some decent money when booking your hotel room in those cities. Have a look on following promo deals that offer Booking.com or Hotels.com.Planning a trip of your lifetime consider also this solution to New Zealand, French Polynesia, Easter Island, Chile and Brazil.
Booking sample of RTW flights from UK to Singapore, New Zealand, Samoa, Cook Islands or French Polynesia & Hawaii £1190! In this case you would fly on route London – Singapore – Auckland – Apia – Honolulu – London. Travel dates as per above itinerary sample. As mentioned in the article you can also fly to Los Angeles instead of Hawaii.


text:
102 mins – United States 2019 – Documentary – Dir: Nick Broomfield
Featuring: Leonard Cohen, Judy Collins and Helle Goldman
Marianne & Leonard – Words of Love is a beautiful yet tragic love story between Leonard Cohen and his Norwegian muse Marianne Ihlen. Their love began on the idyllic Greek island of Hydra in 1960 as part of a bohemian community of foreign artists, writers and musicians. The film follows their relationship from the early days on Hydra, a humble time of 'free love' and open marriage, to how their love evolved when Leonard became a successful musician.
It was on Hydra in 1968 that director Nick Broomfield, then aged 20, first met Marianne Ihlen. Marianne introduced him to Leonard Cohen's music and also encouraged Nick to make his first film and was an enormous influence on him.
Marianne and Leonard's was a love story that would continue for the rest of their lives. Along the way we learn of the tragedy that befell those that could not survive the beauty of Hydra, the highs and lows of Leonard's career, and the inspirational power that Marianne possessed. Marianne and Leonard died three months apart.
Deborah Harry Does Not Like Interviews (18 minutes, directed by Meghan Fredrich): Blondie's Debbie Harry endures years of superficial, tedious, and demeaning questions from journalists until she devises a brilliant way to turn interviews on their head. This short film will support Marianne & Leonard: Words of Love.
|Sun 13 Oct
1.30pm / 4pm / 6.15pm
|Mon 14 Oct
|Tues 15 Oct
|Wed 15 Oct
|Thurs 17 Oct


text:
Pizza is life. Pizza is bae. For Jess and Tony, the love for pizza was all too strong. The two got married in Miami and had the most millennial wedding ever. Guests were overjoyed when they arrived at the wedding to find pizza everywhere.
This is real love
"It was saucy and delicious and what pizza dreams are made of," the couple said. What's more, the other wedding decorations were baseball themed as the groom plays for a professional baseball team in Los Angeles.
While we fret over making weddings perfect, there are people who keep it real and perhaps that's the best way to get married. A wedding party that is the reflection of the two people getting married—what can be a cooler way to start a new life?! We'll have an Old Monk themed mandap we think. Only if the pandit agrees to dress up as a bartender.
What about you?


text:
A three-part series this week focuses on how some local governments and the waste industry are partnering to capture and reuse glass. Part two looks at Denver's closed loop system and why that system is lagging. It also gives a glimpse of a project to try and raise the bar. Read part one here. Read part three here.
In Colorado, there is infrastructure and a market to support a closed loop system to ensure end-of-life glass bottles are turned into new bottles. But that's if the bottle can be captured.
The state is home to two major bottle manufacturers, many materials recovery facilities (MRFs) that capture mixed glass and a processor that makes cullet from that glass.
But even with these resources, there are major shortcomings. The reason is there are challenges in residential and commercial collections, and there is no mandate to recycle glass, says Laurie Johnson, executive director of nonprofit Recycle Colorado.
"Multiple haulers collect residential and commercial glass that goes in the system. But in the greater Denver area, where most of the infrastructure is, we collect less than 30 percent of this material," says Johnson.
To try and figure out how to improve that figure, Recycle Colorado recently launched a six-month glass recycling pilot with 22 multifamily unit buildings and 15 businesses participating for free.
Momentum Recycling collects the glass and makes it into cullet. Rocky Mountain Bottle Company (a venture between MillerCoors and Owens-Illinois) is taking the cullet and making it into bottles. Rehrig Pacific provided all the carts. Alpine Waste & Recycling and Republic Services helped with securing pilot participants.
Partners hope to learn why more people don't recycle this material as well as to identify how much glass is available in these businesses and multifamily homes. Colorado Recycle will collect and report data from the project as well as show environmental and economic benefits.
"We will show participants that it keeps material in the loop. We will show, in the worst case, it's cost neutral to businesses and sometimes saves money on their trash service while indirectly creating jobs," says Johnson.
Glass processor Momentum is, for now, offering free curbside collections to pilot participants. Before, it got all its glass from MRFs, which is typically less clean.
"We are getting a couple of tons a month or more from the pilot—enough to prove there is an underserved subset in the region," says John Lair, CEO of Momentum. Since late November, the company has recovered about 12 tons of glass.
Momentum bought a small truck just for this project, deployed bins and hired a driver and a logistics coordinator.
It was a relatively low-risk investment because the company has a glass processing plant in Salt Lake City and could reallocate its investments there if needed.
"But we are hoping it will work here, and signs are strong that it will. We are seeing reasonable volume, and we are starting to offer collections to businesses outside of the pilot at a fee," says Lair.
"While we hope participants eventually become paying customers, our primary goal is not to generate profit from collections. It's to get more glass for recycling. We don't want it landfilled," he says.
Rocky Mountain Bottle Company produces about 3 million bottles a day, 360 days a year. They are shipped to MillerCoors breweries in Golden, Colo.; Milwaukee; Irwindale, Calif.; and Forth Worth, Texas. The company hopes participation in this pilot will lead to more recycled glass availability from Colorado.
"About 30 percent of our raw material is recycled glass. But we could use as much as 70 percent of recycled glass in our furnaces to make bottles if we could get it," says Bill Dillaman, plant manager at Rocky Mountain Bottle Company. "Our goal is to use more recycled glass from Colorado so that we can reduce the amount we have to import from Michigan."
"We want to see more glass being collected and sent to Momentum and, in turn, have it end up in our furnaces instead of the landfill," notes Dillaman, adding this aligns with MillerCoors' sustainability goals to reduce its environmental footprint.
Rehrig Pacific, cart manufacturers, provided 50 carts to Denver businesses participating in the pilot and shipped them from its Kansas plant to Momentum, which delivered them. The cart maker and supplier wanted to support the city's closed loop system.
"As a manufacturer, sometimes people see us simply as a vendor verses a company that can support higher industry initiatives. But we place a lot of importance on supporting the industry's initiatives and goals and helping our customers respond to recycling market challenges," says Andrew Moore, West regional sales manager for Rehrig Pacific.
Denver is growing quickly, which compounds its recycling challenges, including glass.
"As the city grows, my hope is it finds a good solution to these challenges. That's why we are involved. It's about contributing to the industry and our customers' goals," says Moore.


text:
Evers says he's willing to go to court to stop GOP efforts to limit power
MADISON (CBS 58) - Governor-elect Tony Evers vows to keep fighting after lawmakers vote to limit his power.
The Governor-elect says Wisconsin should be embarrassed by what happened.
"The whole thing is a mess," said Gov.-elect Evers during a press conference Tuesday.
The Gov. elect stood shoulder to should with other Democrats who won statewide election last month.
"The will of the people has officially been ignored by the legislature," said Gov.-elect Evers.
He says the package of bills passed in extraordinary session are not what voters wanted when they elected a Democrat Governor.
"The people of Wisconsin expect better of us as leaders of the legislature than to pit people against each other," said Gov.-elect Evers.
"That is absolutely not what it is," said Assembly Speaker Robin Vos.
Vos says this isn't about taking power away from the Governor.
"We don't want to usurp his power, that's never been our goal, our goal is just to guarantee that we have an opportunity to sit at the table, negotiate, and do it fairly," said Rep. Vos.
The Governor-elect doesn't see it that way. He says if Governor Scott Walker signs these bills into law, he'll take the next step.
"All issues are on the table, whether its litigation or other issues, we are exploring anything to make sure that this legislature does not get into practice," said Gov.-elect Evers.
"They have a right to go to court, we've already vetted these with legal experts that we believe have shown that they are clearly constitutional," said Speaker Vos.
Whatever happens next, the Governor-elect is not being shy about how he feels about what happened.
"I view what was passed as frankly a hot mess, and together all of it is dangerous precedent," said Gov.-elect Evers
Governor-elect Evers says he plans to reach out to Governor Walker personally and urge him to veto the bills that were passed.


text:
The jungle in South America is called the Amazon Rainforest, also known as Amazon Jungle and Amazonia. It is the biggest rainforest in the world. The majority of the Amazon rainforest is contained within the boundaries of 10 South American countries. Those countries are Brazil, Bolivia, Colombia, Ecuador, French Guiana, Guyana, Peru, Suriname and Venezuela.
The Amazon rainforest has a total area of 2.1 million square miles (5.5 million square kilometers), which means that it is larger than India, and if it was a country, it would have been the seventh largest country in the world.
Interesting Facts About the Amazon Rainforest
– The Amazon rainforest covers about 40 % of the South American Continent
– The Amazon reinforest represents over half of the planet's remaining rainforests
– The Amazon reinforest contains the largest and most species-rich tract of tropical rainforest in the world


text:
You want near me married women for affair and dating. Online looking men for one night stand and hookup. Best way to meet at speedxdating to find female in local area. Anybody attached with mature woman for sex hookup. Date fun is an extra bonus to our happiness story. Because every person have a so many task and not spend his time. Release your tension, because of many site available on Internet. Hook up with local lady for sex and it's so easy to register your profile. no any charges for the registration.
Now this days it is fairly a simple thing to see single hot honest and attached lady seeking local area white me for affair and guys want near girls fuck. Sometimes you turn your head back when you see them flirting and date in public places. I do not think so there is something wrong or funny in it.
Single Looking Partner For One Night Stand
Everyone makes different acumen and thoughts about every other person on this world. In this latest, there are numbers of marriage relationships and sexual attachment. Many of you have seen local woman for date with hot males. Then why it is funny for you to see white men seeking black sexy.
Online hookup way is used more they it was proved to work at handy. Free websites provide the easy way to meet singles for relationship. Without money any membership fee. Registration is the first start to enjoy the hookup world. Other people usually register their personal information at free sites. Because they don't want to pay any money for using such service.
How Can Meet Online Female For Fuck
To make sure he is the sound guy for you or not, you have to ask him many questions. Chat with him or talk with him more and more while you are completely cozy to find him in person. So attached hot girls for fuck partner. Easy to meet in local area married woman.
But not all connection comes to an end period not painful. Many real relationships designed on the Internet. Many sexy looking men are honest and honest and often really drop. Incredibly in really like with the man who is on the internet. Gradually they come in awesome mature girls relationships and progressively get wed. They quickly become great people assistance and help improve family.
Before you fix on whether or not to create relation married people for affair. It is important to first recognize the dissimilarity between date. Once you know the common uniqueness of equally age users. You will logically think inclined to move toward one over the new.