#!/usr/bin/perl # ***** BEGIN LICENSE BLOCK ***** # Version: MPL 1.1/GPL 2.0/LGPL 2.1 # # The contents of this file are subject to the Mozilla Public License Version # 1.1 (the “License”); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an “AS IS” basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. # # The Original Code is pkg-dmg, a Mac OS X disk image (.dmg) packager # # The Initial Developer of the Original Code is # Mark Mentovai<EMAIL_ADDRESS># Portions created by the Initial Developer are Copyright (C) 2005 # the Initial Developer. All Rights Reserved. # # Contributor(s): # # Alternatively, the contents of this file may be used under the terms of # either the GNU General Public License Version 2 or later (the “GPL”), or # the GNU Lesser General Public License Version 2.1 or later (the “LGPL”), # in which case the provisions of the GPL or the LGPL are applicable instead # of those above. If you wish to allow use of your version of this file only # under the terms of either the GPL or the LGPL, and not to allow others to # use your version of this file under the terms of the MPL, indicate your # decision by deleting the provisions above and replace them with the notice # and other provisions required by the GPL or the LGPL. If you do not delete # the provisions above, a recipient may use your version of this file under # the terms of any one of the MPL, the GPL or the LGPL. # # ***** END LICENSE BLOCK *****
use strict; use warnings;
pod
head1 NAME
B<pkg-dmg> - Mac OS X disk image (.dmg) packager
head1 SYNOPSIS
B<pkg-dmg> B<–source> I<source-folder> B<–target> I<target-image>
- B<–format> I<format>
- B<–volname> I<volume-name>
- B<–tempdir> I<temp-dir>
- B<–mkdir> I<directory>
- B<–copy> head1 DESCRIPTION
I<pkg-dmg> takes a directory identified by I<source-folder> and transforms it into a disk image stored as I<target-image>. The disk image will occupy the least space possible for its format, or the least space that the authors have been able to figure out how to achieve.
head1 OPTIONS
over 5
item B<–source> I<source-folder>
Identifies the directory that will be packaged up. This directory is not touched, a copy will be made in a temporary directory for staging purposes. See B<–tempdir>.
item B<–target> I<target-image>
The disk image to create. If it exists and is not in use, it will be overwritten. If I<target-image> already contains a suitable extension, it will be used unmodified. If no extension is present, or the extension is incorrect for the selected format, the proper extension will be added. See B<–format>.
item B<–format> I<format>
The format to create the disk image in. Valid values for I<format> are:
- UDZO - zlib-compressed, read-only; extension I<.dmg> - UDRW - read-write; extension I<.dmg> - UDSP - read-write, sparse; extension I<.sparseimage>
UDZO is the default format.
See L<hdiutil(1)> for a description of these formats.
item B<–volname> I<volume-name>
The name of the volume in the disk image. If not specified, I<volume-name> defaults to the name of the source directory from B<–source>.
item B<–tempdir> I<temp-dir>
A temporary directory to stage intermediate files in. I<temp-dir> must have enough space available to accommodate twice the size of the files being packaged. If not specified, defaults to the same directory that the I<target-image> is to be placed in. B<pkg-dmg> will remove any temporary files it places in I<temp-dir>.
item B<–mkdir> I<directory>
Specifies a directory that should be created in the disk image. I<directory> and any ancestor directories will be created. This is useful in conjunction with B<–copy>, when copying files to directories that may not exist in I<source-folder>. B<–mkdir> may appear multiple times.
item B<–copy> item B<–license> I<file>
A plain text file containing a license agreement to be displayed before the disk image is mounted. English is the only supported language. To include license agreements in other languages, in multiple languages, or to use formatted text, prepare a resource and use L<–resource>.
item B<–resource> I<file>
A resource file to merge into I<target-image>. If I<format> is UDZO, the disk image will be flattened to a single-fork file that contains the resource but may be freely transferred without any special encodings. I<file> must be in a format suitable for L<Rez(1)>. See L<Rez(1)> for a description of the format, and L<hdiutil(1)> for a discussion on flattened disk images. B<–resource> may appear multiple times.
This option is useful for adding license agreements and other messages to disk images.
item B<–icon> I<icns-file>
Specifies an I<icns> file that will be used as the icon for the root of the volume. This file will be copied to the new volume and the custom icon attribute will be set on the root folder.
item B<–attribute> item B<–idme>
Enable IDME to make the disk image “Internet-enabled.” The first time the image is mounted, if IDME processing is enabled on the system, the contents of the image will be copied out of the image and the image will be placed in the trash with IDME disabled.
item B<–sourcefile>
If this option is present, I<source-folder> is treated as a file, and is placed as a file within the volume’s root folder. Without this option, I<source-folder> is treated as the volume root itself.
item B<–verbosity> I<level>
Adjusts the level of loudness of B<pkg-dmg>. The possible values for I<level> are:
0 - Only error messages are displayed. 1 - Print error messages and command invocations. 2 - Print everything, including command output.
The default I<level> is 2.
item B<–dry-run>
When specified, the commands that would be executed are printed, without actually executing them. When commands depend on the output of previous commands, dummy values are displayed.
back
head1 NON-OPTIONS
over 5
item
Resource forks aren’t copied.
item
The root folder of the created volume is designated as the folder to open when the volume is mounted. See L<bless(8)>.
item
All files in the volume are set to be world-readable, only writable by the owner, and world-executable when appropriate. All other permissions bits are cleared.
item
When possible, disk images are created without any partition tables. This is what L<hdiutil(1)> refers to as I<-layout NONE>, and saves a handful of kilobytes. The alternative, I<SPUD>, contains a partition table that is not terribly handy on disk images that are not intended to represent any physical disk.
item
Read-write images are created with journaling off. Any read-write image created by this tool is expected to be transient, and the goal of this tool is to create images which consume a minimum of space.
back
head1 EXAMPLE
pkg-dmg –source /Applications/DeerPark.app –target ~/DeerPark.dmg
--sourcefile --volname DeerPark --icon ~/DeerPark.icns --mkdir /.background --copy DeerParkBackground.png:/.background/background.png --copy DeerParkDSStore:/.DS_Store
head1 REQUIREMENTS
I<pkg-dmg> has been tested with Mac OS X releases 10.2 (“Jaguar”) through 10.4 (“Tiger”). Certain adjustments to behavior are made depending on the host system’s release. Mac OS X 10.3 (“Panther”) or later are recommended.
head1 LICENSE
MPL 1.1/GPL 2.0/LGPL 2.1.  Otherwise, go by absolute # path. These may be overridden with –config. %gConfig = (‘cmd_bless’ => ‘bless’,
'cmd_chmod' => 'chmod', 'cmd_diskutil' => 'diskutil', 'cmd_du' => 'du', 'cmd_hdid' => 'hdid', 'cmd_hdiutil' => 'hdiutil', 'cmd_mkdir' => 'mkdir', 'cmd_mktemp' => 'mktemp', 'cmd_Rez' => '/Developer/Tools/Rez', 'cmd_rm' => 'rm', 'cmd_rsync' => 'rsync', 'cmd_SetFile' => '/Developer/Tools/SetFile', # create_directly indicates whether hdiutil create supports # -srcfolder and -srcdevice. It does on >= 10.3 (Panther). # This is fixed up for earlier systems below. If false, # hdiutil create is used to create empty disk images that # are manually filled. 'create_directly' => 1, # If hdiutil attach -mountpoint exists, use it to avoid # mounting disk images in the default /Volumes. This reduces # the likelihood that someone will notice a mounted image and # interfere with it. Only available on >= 10.3 (Panther), # fixed up for earlier systems below. # # This is presently turned off for all systems, because there # is an infrequent synchronization problem during ejection. # diskutil eject might return before the image is actually # unmounted. If pkg-dmg then attempts to clean up its # temporary directory, it could remove items from a read-write # disk image or attempt to remove items from a read-only disk # image (or a read-only item from a read-write image) and fail, # causing pkg-dmg to abort. This problem is experienced # under Tiger, which appears to eject asynchronously where # previous systems treated it as a synchronous operation. # Using hdiutil attach -mountpoint didn't always keep images # from showing up on the desktop anyway. 'hdiutil_mountpoint' => 0, # hdiutil makehybrid results in optimized disk images that # consume less space and mount more quickly. Use it when # it's available, but that's only on >= 10.3 (Panther). # If false, hdiutil create is used instead. Fixed up for # earlier systems below. 'makehybrid' => 1, # hdiutil create doesn't allow specifying a folder to open # at volume mount time, so those images are mounted and # their root folders made holy with bless -openfolder. But # only on >= 10.3 (Panther). Earlier systems are out of luck. # Even on Panther, bless refuses to run unless root. # Fixed up below. 'openfolder_bless' => 1, # It's possible to save a few more kilobytes by including the # partition only without any partition table in the image. # This is a good idea on any system, so turn this option off. # # Except it's buggy. "-layout NONE" seems to be creating # disk images with more data than just the partition table # stripped out. You might wind up losing the end of the # filesystem - the last file (or several) might be incomplete. 'partition_table' => 1, # To create a partition table-less image from something # created by makehybrid, the hybrid image needs to be # mounted and a new image made from the device associated # with the relevant partition. This requires >= 10.4 # (Tiger), presumably because earlier systems have # problems creating images from devices themselves attached # to images. If this is false, makehybrid images will # have partition tables, regardless of the partition_table # setting. Fixed up for earlier systems below. 'recursive_access' => 1);
# –verbosity $gVerbosity = 2;
# –dry-run $gDryRun = 0;
# %gConfig fix-ups based on features and bugs present in certain releases. my($ignore, $uname_r, $uname_s); ($uname_s, $ignore, $uname_r, $ignore, $ignore) = POSIX::uname(); if($uname_s eq ‘Darwin’) {
($gDarwinMajor, $ignore) = split(/\./, $uname_r, 2); # $major is the Darwin major release, which for our purposes, is 4 higher # than the interesting digit in a Mac OS X release. if($gDarwinMajor <= 6) { # <= 10.2 (Jaguar) # hdiutil create does not support -srcfolder or -srcdevice $gConfig{'create_directly'} = 0; # hdiutil attach does not support -mountpoint $gConfig{'hdiutil_mountpoint'} = 0; # hdiutil mkhybrid does not exist $gConfig{'makehybrid'} = 0; } if($gDarwinMajor <= 7) { # <= 10.3 (Panther) # Can't mount a disk image and then make a disk image from the device $gConfig{'recursive_access'} = 0; # bless does not support -openfolder on 10.2 (Jaguar) and must run # as root under 10.3 (Panther) $gConfig{'openfolder_bless'} = 0; }
} else {
# If it's not Mac OS X, just assume all of those good features are # available. They're not, but things will fail long before they # have a chance to make a difference. # # Now, if someone wanted to document some of these private formats... print STDERR ($0.": warning, not running on Mac OS X, ". "this could be interesting.\n");
}
# Non-global variables used in Getopt my(@attributes, @copyFiles, $iconFile, $idme, $licenseFile, @makeDirs,
$outputFormat, @resourceFiles, $sourceFile, $sourceFolder, $targetImage, $tempDir, $volumeName);
# –format $outputFormat = ‘UDZO’;
# –idme $idme = 0;
# –sourcefile $sourceFile = 0;
# Leaving this might screw up the Apple tools. delete $ENV{‘NEXT_ROOT’};
# This script can get pretty messy, so trap a few signals. $SIG{‘INT’} = &trapSignal; $SIG{‘HUP’} = &trapSignal; $SIG{‘TERM’} = &trapSignal;
Getopt::Long::Configure(‘pass_through’); GetOptions(‘source=s’ => $sourceFolder,
'target=s' => \$targetImage, 'volname=s' => \$volumeName, 'format=s' => \$outputFormat, 'tempdir=s' => \$tempDir, 'mkdir=s' => \@makeDirs, 'copy=s' => \@copyFiles, 'license=s' => \$licenseFile, 'resource=s' => \@resourceFiles, 'icon=s' => \$iconFile, 'attribute=s' => \@attributes, 'idme' => \$idme, 'sourcefile' => \$sourceFile, 'verbosity=i' => \$gVerbosity, 'dry-run' => \$gDryRun, 'config=s' => \%Config); # "hidden" option not in usage()
if(@ARGV) {
# All arguments are parsed by Getopt usage(); exit(1);
}
if($gVerbosity<0 || $gVerbosity>2) {
usage(); exit(1);
}
if(!defined($sourceFolder) || $sourceFolder eq ” ||
!defined($targetImage) || $targetImage eq '') { # --source and --target are required arguments usage(); exit(1);
}
# Make sure $sourceFolder doesn’t contain trailing slashes. It messes with # rsync. while(substr($sourceFolder, -1) eq ‘/’) {
chop($sourceFolder);
}
if(!defined($volumeName)) {
# Default volumeName is the name of the source directory. my(@components); @components = pathSplit($sourceFolder); $volumeName = pop(@components);
}
my(@tempDirComponents, $targetImageFilename); @tempDirComponents = pathSplit($targetImage); $targetImageFilename = pop(@tempDirComponents);
if(defined($tempDir)) {
@tempDirComponents = pathSplit($tempDir);
} else {
# Default tempDir is the same directory as what is specified for # targetImage $tempDir = join('/', @tempDirComponents);
}
# Ensure that the path of the target image has a suitable extension. If # it didn’t, hdiutil would add one, and we wouldn’t be able to find the # file. # # Note that $targetImageFilename is not being reset. This is because it’s # used to build other names below, and we don’t need to be adding all sorts # of extra unnecessary extensions to the name. my($originalTargetImage, $requiredExtension); $originalTargetImage = $targetImage; if($outputFormat eq ‘UDSP’) {
$requiredExtension = '.sparseimage';
} else {
$requiredExtension = '.dmg';
} $targetImage = giveExtension($originalTargetImage, $requiredExtension);
if($targetImage ne $originalTargetImage) {
print STDERR ($0.": warning: target image extension is being added\n"); print STDERR (' The new filename is '. giveExtension($targetImageFilename,$requiredExtension)."\n");
}
# Make a temporary directory in $tempDir for our own nefarious purposes. my(@output, $tempSubdir, $tempSubdirTemplate); $tempSubdirTemplate=join(‘/’, @tempDirComponents,
'pkg-dmg.'.$$.'.XXXXXXXX');
if(!(@output = commandOutput($gConfig{‘cmd_mktemp’}, ‘-d’,
$tempSubdirTemplate)) || $#output != 0) { cleanupDie('mktemp failed');
}
if($gDryRun) {
(@output)=($tempSubdirTemplate);
}
($tempSubdir) = @output;
push(@gCleanup,
sub {commandVerbosity(0, $gConfig{'cmd_rm'}, '-rf', $tempSubdir);});
my($tempMount, $tempRoot, @tempsToMake); $tempRoot = $tempSubdir.‘/stage’; $tempMount = $tempSubdir.‘/mount’; push(@tempsToMake, $tempRoot); if($gConfig{‘hdiutil_mountpoint’}) {
push(@tempsToMake, $tempMount);
}
if(command($gConfig{‘cmd_mkdir’}, @tempsToMake) != 0) {
cleanupDie('mkdir tempRoot/tempMount failed');
}
# This cleanup object is not strictly necessary, because $tempRoot is inside # of $tempSubdir, but the rest of the script relies on this object being # on the cleanup stack and expects to remove it. push(@gCleanup,
sub {commandVerbosity(0, $gConfig{'cmd_rm'}, '-rf', $tempRoot);});
# If $sourceFile is true, it means that $sourceFolder is to be treated as # a file and placed as a file within the volume root, as opposed to being # treated as the volume root itself. rsync will do this by default, if no # trailing ‘/’ is present. With a trailing ‘/’, $sourceFolder becomes # $tempRoot, instead of becoming an entry in $tempRoot. if(command($gConfig{‘cmd_rsync’}, ‘-a’,
$sourceFolder.($sourceFile?'':'/'),$tempRoot) != 0) { cleanupDie('rsync failed');
}
if(@makeDirs) {
my($makeDir, @tempDirsToMake); foreach $makeDir (@makeDirs) { if($makeDir =~ /^\//) { push(@tempDirsToMake, $tempRoot.$makeDir); } else { push(@tempDirsToMake, $tempRoot.'/'.$makeDir); } } if(command($gConfig{'cmd_mkdir'}, '-p', @tempDirsToMake) != 0) { cleanupDie('mkdir failed'); }
}
my($copyFile); foreach $copyFile (@copyFiles) {
my($copySource, $copyDestination); ($copySource, $copyDestination) = split(/:/, $copyFile); if(!defined($copyDestination)) { $copyDestination = $tempRoot; } elsif($copyDestination =~ /^\//) { $copyDestination = $tempRoot.$copyDestination; } else { $copyDestination = $tempRoot.'/'.$copyDestination; } if(command($gConfig{'cmd_rsync'}, '-a', $copySource, $copyDestination) != 0) { cleanupDie('rsync failed for item copy'); }
}
if($gConfig{‘create_directly’}) {
# If create_directly is false, the contents will be rsynced into a # disk image and they would lose their attributes. setAttributes($tempRoot, @attributes);
}
if(defined($iconFile)) {
if(command($gConfig{'cmd_rsync'}, '-a', $iconFile, $tempRoot.'/.VolumeIcon.icns') != 0) { cleanupDie('rsync failed for volume icon'); } # It's pointless to set the attributes of the root when diskutil create # -srcfolder is being used. In that case, the attributes will be set # later, after the image is already created. if($outputFormat eq 'UDZO' && (command($gConfig{'cmd_SetFile'}, '-a', 'C', $tempRoot) != 0)) { cleanupDie('SetFile failed'); }
}
if(command($gConfig{‘cmd_chmod’}, ‘-R’, ‘a+rX,a-st,u+w,go-w’,
$tempRoot) != 0) { cleanupDie('chmod failed');
}
my($unflattenable); if($outputFormat eq ‘UDZO’) {
$unflattenable = 1;
} else {
$unflattenable = 0;
}
diskImageMaker($tempRoot, $targetImage, $outputFormat, $volumeName,
$tempSubdir, $tempMount, $targetImageFilename, defined($iconFile));
if(defined($licenseFile) && $licenseFile ne ”) {
my($licenseResource); $licenseResource = $tempSubdir.'/license.r'; if(!licenseMaker($licenseFile, $licenseResource)) { cleanupDie('licenseMaker failed'); } push(@resourceFiles, $licenseResource); # Don't add a cleanup object because licenseResource is in tempSubdir.
}
if(@resourceFiles) {
# Add resources, such as a license agreement. # Only unflatten read-only and compressed images. It's not supported # on other image times. if($unflattenable && (command($gConfig{'cmd_hdiutil'}, 'unflatten', $targetImage)) != 0) { cleanupDie('hdiutil unflatten failed'); } # Don't push flatten onto the cleanup stack. If we fail now, we'll be # removing $targetImage anyway. # Type definitions come from Carbon.r. if(command($gConfig{'cmd_Rez'}, 'Carbon.r', @resourceFiles, '-a', '-o', $targetImage) != 0) { cleanupDie('Rez failed'); } # Flatten. This merges the resource fork into the data fork, so no # special encoding is needed to transfer the file. if($unflattenable && (command($gConfig{'cmd_hdiutil'}, 'flatten', $targetImage)) != 0) { cleanupDie('hdiutil flatten failed'); }
}
# $tempSubdir is no longer needed. It’s buried on the stack below the # rm of the fresh image file. Splice in this fashion is equivalent to # pop-save, pop, push-save. splice(@gCleanup, -2, 1); # No need to remove licenseResource separately, it’s in tempSubdir. if(command($gConfig{‘cmd_rm’}, ‘-rf’, $tempSubdir) != 0) {
cleanupDie('rm -rf tempSubdir failed');
}
if($idme) {
if(command($gConfig{'cmd_hdiutil'}, 'internet-enable', '-yes', $targetImage) != 0) { cleanupDie('hdiutil internet-enable failed'); }
}
# Done.
exit(0);
# argumentEscape(@arguments) # # Takes a list of @arguments and makes them shell-safe. sub argumentEscape(@) {
my(@arguments); @arguments = @_; my($argument, @argumentsOut); foreach $argument (@arguments) { $argument =~ s%([^A-Za-z0-9_\-/.=+,])%\\$1%g; push(@argumentsOut, $argument); } return @argumentsOut;
}
# cleanupDie($message) # # Displays $message as an error message, and then runs through the # @gCleanup stack, performing any cleanup operations needed before # exiting. Does not return, exits with exit status 1. sub cleanupDie($) {
my($message); ($message) = @_; print STDERR ($0.': '.$message.(@gCleanup?' (cleaning up)':'')."\n"); while(@gCleanup) { my($subroutine); $subroutine = pop(@gCleanup); &$subroutine; } exit(1);
}
# command(@arguments) # # Runs the specified command at the verbosity level defined by $gVerbosity. # Returns nonzero on failure, returning the exit status if appropriate. # Discards command output. sub command(@) {
my(@arguments); @arguments = @_; return commandVerbosity($gVerbosity,@arguments);
}
# commandInternal($command, @arguments) # # Removes the files specified by @arguments with a verbosity level specified # by $gVerbosity. sub commandInternal($@) {
my(@arguments, $command); ($command, @arguments) = @_; return commandInternalVerbosity($gVerbosity, $command, @arguments);
}
# commandInternalVerbosity($verbosity, $command, @arguments) # # Run an internal command, printing a bogus command invocation message if # $verbosity is true. # # If $command is unlink: # Removes the files specified by @arguments. Wraps unlink. # # If $command is mkdir: # Creates the directory specified by @arguments, with an optional mask # argument, wrapping mkdir. sub commandInternalVerbosity($$@) {
my(@arguments, $command, $verbosity); ($verbosity, $command, @arguments) = @_; if($command eq 'unlink') { if($verbosity || $gDryRun) { print(join(' ', 'rm', '-f', argumentEscape(@arguments))."\n"); } if($gDryRun) { return $#arguments+1; } return unlink(@arguments); }
}
# commandOutput(@arguments) # # Runs the specified command at the verbosity level defined by $gVerbosity. # Output is returned in an array of lines. undef is returned on failure. # The exit status is available in $?. sub commandOutput(@) {
my(@arguments); @arguments = @_; return commandOutputVerbosity($gVerbosity, @arguments);
}
# commandOutputVerbosity($verbosity, @arguments) # # Runs the specified command at the verbosity level defined by the # $verbosity argument. Output is returned in an array of lines. undef is # returned on failure. The exit status is available in $?. # # If an error occurs in fork or exec, an error message is printed to # stderr and undef is returned. # # If $verbosity is 0, the command invocation is not printed, and its # stdout is not echoed back to stdout. # # If $verbosity is 1, the command invocation is printed. # # If $verbosity is 2, the command invocation is printed and the output # from stdout is echoed back to stdout. # # Regardless of $verbosity, stderr is left connected. sub commandOutputVerbosity($@) {
my(@arguments, $verbosity); ($verbosity, @arguments) = @_; my($pid); if($verbosity || $gDryRun) { print(join(' ', argumentEscape(@arguments))."\n"); } if($gDryRun) { return(1); } if (!defined($pid = open(*COMMAND, '-|'))) { printf STDERR ($0.': fork: '.$!."\n"); return undef; } elsif ($pid) { # parent my(@lines); while(!eof(*COMMAND)) { my($line); chop($line = <COMMAND>); if($verbosity > 1) { print($line."\n"); } push(@lines, $line); } close(*COMMAND); if ($? == -1) { printf STDERR ($0.': fork: '.$!."\n"); return undef; } elsif ($? & 127) { printf STDERR ($0.': exited on signal '.($? & 127). ($? & 128 ? ', core dumped' : '')."\n"); return undef; } return @lines; } else { # child; this form of exec is immune to shell games if(!exec {$arguments[0]} (@arguments)) { printf STDERR ($0.': exec: '.$!."\n"); exit(-1); } }
}
# commandVerbosity($verbosity, @arguments) # # Runs the specified command at the verbosity level defined by the # $verbosity argument. Returns nonzero on failure, returning the exit # status if appropriate. Discards command output. sub commandVerbosity($@) {
my(@arguments, $verbosity); ($verbosity, @arguments) = @_; if(!defined(commandOutputVerbosity($verbosity, @arguments))) { return -1; } return $?;
}
# diskImageMaker($source, $destination, $format, $name, $tempDir, $tempMount, # $baseName, $setRootIcon) # # Creates a disk image in $destination of format $format corresponding to the # source directory $source. $name is the volume name. $tempDir is a good # place to write temporary files, which should be empty (aside from the other # things that this script might create there, like stage and mount). # $tempMount is a mount point for temporary disk images. $baseName is the # name of the disk image, and is presently unused. $setRootIcon is true if # a volume icon was added to the staged $source and indicates that the # custom volume icon bit on the volume root needs to be set. sub diskImageMaker($$$$$$$$) {
my($baseName, $destination, $format, $name, $setRootIcon, $source, $tempDir, $tempMount); ($source, $destination, $format, $name, $tempDir, $tempMount, $baseName, $setRootIcon) = @_; if($format eq 'UDZO') { my($uncompressedImage); if($gConfig{'makehybrid'}) { my($hybridImage); $hybridImage = giveExtension($tempDir.'/hybrid', '.dmg'); if(command($gConfig{'cmd_hdiutil'}, 'makehybrid', '-hfs', '-hfs-volume-name', $name, '-hfs-openfolder', $source, '-ov', $source, '-o', $hybridImage) != 0) { cleanupDie('hdiutil makehybrid failed'); } $uncompressedImage = $hybridImage; # $source is no longer needed and will be removed before anything # else can fail. splice in this form is the same as pop/push. splice(@gCleanup, -1, 1, sub {commandInternalVerbosity(0, 'unlink', $hybridImage);}); if(command($gConfig{'cmd_rm'}, '-rf', $source) != 0) { cleanupDie('rm -rf failed'); } if(!$gConfig{'partition_table'} && $gConfig{'recursive_access'}) { # Even if we do want to create disk images without partition tables, # it's impossible unless recursive_access is set. my($rootDevice, $partitionDevice, $partitionMountPoint); if(!(($rootDevice, $partitionDevice, $partitionMountPoint) = hdidMountImage($tempMount, '-readonly', $hybridImage))) { cleanupDie('hdid mount failed'); } push(@gCleanup, sub {commandVerbosity(0, $gConfig{'cmd_diskutil'}, 'eject', $rootDevice);}); my($udrwImage); $udrwImage = giveExtension($tempDir.'/udrw', '.dmg'); if(command($gConfig{'cmd_hdiutil'}, 'create', '-format', 'UDRW', '-ov', '-srcdevice', $partitionDevice, $udrwImage) != 0) { cleanupDie('hdiutil create failed'); } $uncompressedImage = $udrwImage; # Going to eject before anything else can fail. Get the eject off # the stack. pop(@gCleanup); # $hybridImage will be removed soon, but until then, it needs to # stay on the cleanup stack. It needs to wait until after # ejection. $udrwImage is staying around. Make it appear as # though it's been done before $hybridImage. # # splice in this form is the same as popping one element to # @tempCleanup and pushing the subroutine. my(@tempCleanup); @tempCleanup = splice(@gCleanup, -1, 1, sub {commandInternalVerbosity(0, 'unlink', $udrwImage);}); push(@gCleanup, @tempCleanup); if(command($gConfig{'cmd_diskutil'}, 'eject', $rootDevice) != 0) { cleanupDie('diskutil eject failed'); } # Pop unlink of $uncompressedImage pop(@gCleanup); if(commandInternal('unlink', $hybridImage) != 1) { cleanupDie('unlink hybridImage failed: '.$!); } } } else { # makehybrid is not available, fall back to making a UDRW and # converting to UDZO. It ought to be possible to do a UDZO directly, # but those come out far too large (journaling?) and need to be # read-write to fix up the volume icon anyway. Luckily, we can # take advantage of a single call back into this function. my($udrwImage); $udrwImage = giveExtension($tempDir.'/udrw', '.dmg'); diskImageMaker($source, $udrwImage, 'UDRW', $name, $tempDir, $tempMount, $baseName, $setRootIcon); # The call back into diskImageMaker already removed $source. $uncompressedImage = $udrwImage; } # The uncompressed disk image is now in its final form. Compress it. # Jaguar doesn't support hdiutil convert -ov, but it always allows # overwriting. if(command($gConfig{'cmd_hdiutil'}, 'convert', '-format', 'UDZO', '-imagekey', 'zlib-level=9', (defined($gDarwinMajor) && $gDarwinMajor <= 6 ? () : ('-ov')), $uncompressedImage, '-o', $destination) != 0) { cleanupDie('hdiutil convert failed'); } # $uncompressedImage is going to be unlinked before anything else can # fail. splice in this form is the same as pop/push. splice(@gCleanup, -1, 1, sub {commandInternalVerbosity(0, 'unlink', $destination);}); if(commandInternal('unlink', $uncompressedImage) != 1) { cleanupDie('unlink uncompressedImage failed: '.$!); } # At this point, the only thing that the UDZO block has added to the # cleanup stack is the removal of $destination. $source has already # been removed, and its cleanup entry has been removed as well. } elsif($format eq 'UDRW' || $format eq 'UDSP') { my(@extraArguments); if(!$gConfig{'partition_table'}) { @extraArguments = ('-layout', 'NONE'); } if($gConfig{'create_directly'}) { # Use -fs HFS+ to suppress the journal. if(command($gConfig{'cmd_hdiutil'}, 'create', '-format', $format, @extraArguments, '-fs', 'HFS+', '-volname', $name, '-ov', '-srcfolder', $source, $destination) != 0) { cleanupDie('hdiutil create failed'); } # $source is no longer needed and will be removed before anything # else can fail. splice in this form is the same as pop/push. splice(@gCleanup, -1, 1, sub {commandInternalVerbosity(0, 'unlink', $destination);}); if(command($gConfig{'cmd_rm'}, '-rf', $source) != 0) { cleanupDie('rm -rf failed'); } } else { # hdiutil create does not support -srcfolder or -srcdevice, it only # knows how to create blank images. Figure out how large an image # is needed, create it, and fill it. This is needed for Jaguar. # Use native block size for hdiutil create -sectors. delete $ENV{'BLOCKSIZE'}; my(@duOutput, $ignore, $sizeBlocks, $sizeOverhead, $sizeTotal, $type); if(!(@output = commandOutput($gConfig{'cmd_du'}, '-s', $tempRoot)) || $? != 0) { cleanupDie('du failed'); } ($sizeBlocks, $ignore) = split(' ', $output[0], 2); # The filesystem itself takes up 152 blocks of its own blocks for the # filesystem up to 8192 blocks, plus 64 blocks for every additional # 4096 blocks or portion thereof. $sizeOverhead = 152 + 64 * POSIX::ceil( (($sizeBlocks - 8192) > 0) ? (($sizeBlocks - 8192) / (4096 - 64)) : 0); # The number of blocks must be divisible by 8. my($mod); if($mod = ($sizeOverhead % 8)) { $sizeOverhead += 8 - $mod; } # sectors is taken as the size of a disk, not a filesystem, so the # partition table eats into it. if($gConfig{'partition_table'}) { $sizeOverhead += 80; } # That was hard. Leave some breathing room anyway. Use 1024 sectors # (512kB). These read-write images wouldn't be useful if they didn't # have at least a little free space. $sizeTotal = $sizeBlocks + $sizeOverhead + 1024; # Minimum sizes - these numbers are larger on Jaguar than on later # systems. Just use the Jaguar numbers, since it's unlikely to wind # up here on any other release. if($gConfig{'partition_table'} && $sizeTotal < 8272) { $sizeTotal = 8272; } if(!$gConfig{'partition_table'} && $sizeTotal < 8192) { $sizeTotal = 8192; } # hdiutil create without -srcfolder or -srcdevice will not accept # -format. It uses -type. Fortunately, the two supported formats # here map directly to the only two supported types. if ($format eq 'UDSP') { $type = 'SPARSE'; } else { $type = 'UDIF'; } if(command($gConfig{'cmd_hdiutil'}, 'create', '-type', $type, @extraArguments, '-fs', 'HFS+', '-volname', $name, '-ov', '-sectors', $sizeTotal, $destination) != 0) { cleanupDie('hdiutil create failed'); } push(@gCleanup, sub {commandInternalVerbosity(0, 'unlink', $destination);}); # The rsync will occur shortly. } my($mounted, $rootDevice, $partitionDevice, $partitionMountPoint); $mounted=0; if(!$gConfig{'create_directly'} || $gConfig{'openfolder_bless'} || $setRootIcon) { # The disk image only needs to be mounted if: # create_directly is false, because the content needs to be copied # openfolder_bless is true, because bless -openfolder needs to run # setRootIcon is true, because the root needs its attributes set. if(!(($rootDevice, $partitionDevice, $partitionMountPoint) = hdidMountImage($tempMount, $destination))) { cleanupDie('hdid mount failed'); } $mounted=1; push(@gCleanup, sub {commandVerbosity(0, $gConfig{'cmd_diskutil'}, 'eject', $rootDevice);}); } if(!$gConfig{'create_directly'}) { # Couldn't create and copy directly in one fell swoop. Now that # the volume is mounted, copy the files. --copy-unsafe-links is # unnecessary since it was used to copy everything to the staging # area. There can be no more unsafe links. if(command($gConfig{'cmd_rsync'}, '-a', $source.'/',$partitionMountPoint) != 0) { cleanupDie('rsync to new volume failed'); } # We need to get the rm -rf of $source off the stack, because it's # being cleaned up here. There are two items now on top of it: # removing the target image and, above that, ejecting it. Splice it # out. my(@tempCleanup); @tempCleanup = splice(@gCleanup, -2); # The next splice is the same as popping once and pushing @tempCleanup. splice(@gCleanup, -1, 1, @tempCleanup); if(command($gConfig{'cmd_rm'}, '-rf', $source) != 0) { cleanupDie('rm -rf failed'); } } if($gConfig{'openfolder_bless'}) { # On Tiger, the bless docs say to use --openfolder, but only # --openfolder is accepted on Panther. Tiger takes it with a single # dash too. Jaguar is out of luck. if(command($gConfig{'cmd_bless'}, '-openfolder', $partitionMountPoint) != 0) { cleanupDie('bless failed'); } } setAttributes($partitionMountPoint, @attributes); if($setRootIcon) { # When "hdiutil create -srcfolder" is used, the root folder's # attributes are not copied to the new volume. Fix up. if(command($gConfig{'cmd_SetFile'}, '-a', 'C', $partitionMountPoint) != 0) { cleanupDie('SetFile failed'); } } if($mounted) { # Pop diskutil eject pop(@gCleanup); if(command($gConfig{'cmd_diskutil'}, 'eject', $rootDevice) != 0) { cleanupDie('diskutil eject failed'); } } # End of UDRW/UDSP section. At this point, $source has been removed # and its cleanup entry has been removed from the stack. } else { cleanupDie('unrecognized format'); print STDERR ($0.": unrecognized format\n"); exit(1); }
}
# giveExtension($file, $extension) # # If $file does not end in $extension, $extension is added. The new # filename is returned. sub giveExtension($$) {
my($extension, $file); ($file, $extension) = @_; if(substr($file, -length($extension)) ne $extension) { return $file.$extension; } return $file;
}
# hdidMountImage($mountPoint, @arguments) # # Runs the hdid command with arguments specified by @arguments. # @arguments may be a single-element array containing the name of the # disk image to mount. Returns a three-element array, with elements # corresponding to: # - The root device of the mounted image, suitable for ejection # - The device corresponding to the mounted partition # - The mounted partition’s mount point # # If running on a system that supports easy mounting at points outside # of the default /Volumes with hdiutil attach, it is used instead of hdid, # and $mountPoint is used as the mount point. # # The root device will differ from the partition device when the disk # image contains a partition table, otherwise, they will be identical. # # If hdid fails, undef is returned. sub hdidMountImage($@) {
my(@arguments, @command, $mountPoint); ($mountPoint, @arguments) = @_; my(@output); if($gConfig{'hdiutil_mountpoint'}) { @command=($gConfig{'cmd_hdiutil'}, 'attach', @arguments, '-mountpoint', $mountPoint); } else { @command=($gConfig{'cmd_hdid'}, @arguments); } if(!(@output = commandOutput(@command)) || $? != 0) { return undef; } if($gDryRun) { return('/dev/diskX','/dev/diskXsY','/Volumes/'.$volumeName); } my($line, $restOfLine, $rootDevice); foreach $line (@output) { my($device, $mountpoint); if($line !~ /^\/dev\//) { # Consider only lines that correspond to /dev entries next; } ($device, $restOfLine) = split(' ', $line, 2); if(!defined($rootDevice) || $rootDevice eq '') { # If this is the first device seen, it's the root device to be # used for ejection. Keep it. $rootDevice = $device; } if($restOfLine =~ /(\/.*)/) { # The first partition with a mount point is the interesting one. It's # usually Apple_HFS and usually the last one in the list, but beware of # the possibility of other filesystem types and the Apple_Free partition. # If the disk image contains no partition table, the partition will not # have a type, so look for the mount point by looking for a slash. $mountpoint = $1; return($rootDevice, $device, $mountpoint); } } # No mount point? This is bad. If there's a root device, eject it. if(defined($rootDevice) && $rootDevice ne '') { # Failing anyway, so don't care about failure commandVerbosity(0, $gConfig{'cmd_diskutil'}, 'eject', $rootDevice); } return undef;
}
# licenseMaker($text, $resource) # # Takes a plain text file at path $text and creates a license agreement # resource containing the text at path $license. English-only, and # no special formatting. This is the bare-bones stuff. For more # intricate license agreements, create your own resource. # # ftp.apple.com/developer/Development_Kits/SLAs_for_UDIFs_1.0.dmg sub licenseMaker($$) {
my($resource, $text); ($text, $resource) = @_; if(!sysopen(*TEXT, $text, O_RDONLY)) { print STDERR ($0.': licenseMaker: sysopen text: '.$!."\n"); return 0; } if(!sysopen(*RESOURCE, $resource, O_WRONLY|O_CREAT|O_EXCL)) { print STDERR ($0.': licenseMaker: sysopen resource: '.$!."\n"); return 0; } print RESOURCE << '__EOT__';
// See /System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Headers/Script.h for language IDs. data ‘LPic’ (5000) {
// Default language ID, 0 = English $"0000" // Number of entries in list $"0001" // Entry 1 // Language ID, 0 = English $"0000" // Resource ID, 0 = STR#/TEXT/styl 5000 $"0000" // Multibyte language, 0 = no $"0000"
};
resource ‘STR#’ (5000, “English”) {
{ // Language (unused?) = English "English", // Agree "Agree", // Disagree "Disagree",
__EOT__
# This stuff needs double-quotes for interpolations to work. print RESOURCE (" // Print, ellipsis is 0xC9\n"); print RESOURCE (" \"Print\xc9\",\n"); print RESOURCE (" // Save As, ellipsis is 0xC9\n"); print RESOURCE (" \"Save As\xc9\",\n"); print RESOURCE (' // Descriptive text, curly quotes are 0xD2 and 0xD3'. "\n"); print RESOURCE (' "If you agree to the terms of this license '. "agreement, click \xd2Agree\xd3 to access the software. If you ". "do not agree, press \xd2Disagree.\xd3\"\n");
print RESOURCE << ‘__EOT__’;
};
};
// Beware of 1024(?) byte (character?) line length limitation. Split up long // lines. // If straight quotes are used (“), remember to escape them ("). // Newline is n, to leave a blank line, use two of them. // 0xD2 and 0xD3 are curly double-quotes (”), 0xD4 and 0xD5 are curly // single quotes (‘), 0xD5 is also the apostrophe. data ’TEXT’ (5000, “English”) { __EOT__
while(!eof(*TEXT)) { my($line); chop($line = <TEXT>); while(defined($line)) { my($chunk); # Rez doesn't care for lines longer than (1024?) characters. Split # at less than half of that limit, in case everything needs to be # backwhacked. if(length($line)>500) { $chunk = substr($line, 0, 500); $line = substr($line, 500); } else { $chunk = $line; $line = undef; } if(length($chunk) > 0) { # Unsafe characters are the double-quote (") and backslash (\), escape # them with backslashes. $chunk =~ s/(["\\])/\\$1/g; print RESOURCE ' "'.$chunk.'"'."\n"; } } print RESOURCE ' "\n"'."\n"; } close(*TEXT); print RESOURCE << '__EOT__';
};
data ‘styl’ (5000, “English”) {
// Number of styles following = 1 $"0001" // Style 1. This is used to display the first two lines in bold text. // Start character = 0 $"0000 0000" // Height = 16 $"0010" // Ascent = 12 $"000C" // Font family = 1024 (Lucida Grande) $"0400" // Style bitfield, 0x1=bold 0x2=italic 0x4=underline 0x8=outline // 0x10=shadow 0x20=condensed 0x40=extended $"00" // Style, unused? $"02" // Size = 12 point $"000C" // Color, RGB $"0000 0000 0000"
}; __EOT__
close(*RESOURCE); return 1;
}
# pathSplit($pathname) # # Splits $pathname into an array of path components. sub pathSplit($) {
my($pathname); ($pathname) = @_; return split(/\//, $pathname);
}
# setAttributes($root, @attributeList) # # @attributeList is an array, each element of which must be in the form # <a>:<file>. <a> is a list of attributes, per SetFile. <file> is a file # which is taken as relative to $root (even if it appears as an absolute # path.) SetFile is called to set the attributes on each file in # @attributeList. sub setAttributes($@) {
my(@attributes, $root); ($root, @attributes) = @_; my($attribute); foreach $attribute (@attributes) { my($attrList, $file, @fileList, @fixedFileList); ($attrList, @fileList) = split(/:/, $attribute); if(!defined($attrList) || !@fileList) { cleanupDie('--attribute requires <attributes>:<file>'); } @fixedFileList=(); foreach $file (@fileList) { if($file =~ /^\//) { push(@fixedFileList, $root.$file); } else { push(@fixedFileList, $root.'/'.$file); } } if(command($gConfig{'cmd_SetFile'}, '-a', $attrList, @fixedFileList)) { cleanupDie('SetFile failed to set attributes'); } } return;
}
sub trapSignal($) {
my($signalName); ($signalName) = @_; cleanupDie('exiting on SIG'.$signalName);
}
sub usage() {
print STDERR (
“usage: pkg-dmg –source <source-folder>n”. “ –target <target-image>n”. “ [–format <format>] (default: UDZO)n”. “ [–volname <volume-name>] (default: same name as source)n”. “ [–tempdir <temp-dir>] (default: same dir as target)n”. “ [–mkdir <directory>] (make directory in image)n”. “ [–copy <


synergy 3.5.5a incompatible with itunes 9.0?
-
anonymous
i upgraded to itunes 9 (with mac os 10.5.8). synergy seems not to want to run anymore....
-
Greg Hurrell
I've only had time to test version 4 so far, but it works fine here. Have you tried using that version?
-
rotorglow
I've posted (in #1299) about trouble I'm having with various versions of Synergy not pulling cover art, from Amazon (ever) and iTunes (intermittently).
I've just installed a clean version of 10.5.8 (which unfortunately also pulled down iTunes 9), and I thought I'd report that 3.5.5a runs, but continues not to pull cover art from Amazon. This is a fresh install, and aside from running Software Update, ripping some test music and installing Synergy is the the only thing I've done with the machine.
The only message in the console is the following (which I also encountered and posted in the other thread: 9/11/09 8:37:46 PM [0x0-0x1c01c].org.wincent.Synergy[355] Synergy: unknown type name "tdta".
Let me know what other troubleshooting you'd like me to do or other versions you'd like me to install (3.4.1?).
Thanks.
-
Greg Hurrell
Thanks, let me look into that console message.
-
Greg Hurrell
Unfortunately that ones coming from the inside the system APIs, not the Synergy codebase itself, so I don't know where or when it's actually being produced. Searching through my own logs it doesn't appear.
Did the message appear once, or regularly? For all tracks? For only ones with iTunes cover art embedded in them? In other words, can you see any pattern that would help me to know when this is happening and what might be triggering it?
-
anonymous
Just once; I only changed tracks 10 or 15 times before giving up on that session. For testing purposes, none of the tracks have cover art; I simply installed OS X, updated it (without any 3rd party software), installed Synergy and ripped a couple of very popular CDs and watched to see if Synergy could get the art. I'll leave that test environment alone for the time being to try to find a pattern.
Is there any way to see exactly what Amazon is returning to Synergy? What port would that be coming back on? It seems like nothing at all is coming back, but I can't tell for sure. Little Snitch shows that Synergy tries to connect to xml.amazon.com. I'm only using the built-in OS X firewall, with an Airport router and cable modem; nothing exotic and nothing restrictive.
Other ideas: OS X localization? Amazon US vs other Amazon servers?
-
Greg Hurrell
Version 4.1 is going to be out soon (within the next day or so) and it includes a complete rewrite of all the cover art stuff. I did find a couple of bugs and fix them, and have done a lot of testing and everything seems to be working perfectly. If there turn out to be any problems in 4.1 we can open a new ticket for that in the issue tracker.
-
rotorglow
Ok, thanks. So, does this mean that 3.x won't be getting those fixes (for those of us who haven't completely upgraded to Snow Leopard)?
-
Greg Hurrell
I want to keep the 3.4 series operational, so if any serious problems are discovered I would like to fix them. The fixes I mentioned above aren't really for what I would call serious bugs — they are more "polish" and handling edge cases, like when songs don't have good ID3 tag information — so at least in the case of those specific changes I don't think there's much call for backporting them.
-
rotorglow
Well, whatever you fixed in 4.1a has reenabled the download of cover art for me on my Snow Leopard machine (with iTunes 8.2.1). Which is great. But I obviously can't run it on my Leopard machine, where 3.x has stopped grabbing art (as described above), so I was just hoping the 4.1 fixes would make it into 3.x
Reply
This topic is now closed.


|
| | ~Device () |
| |
| void | SetDelegate (DeviceStatusDelegate *delegate) |
| | Set the delegate object which will be called when a message is received. More...
|
| |
| CHIP_ERROR | SendMessage (Protocols::Id protocolId, uint8_t msgType, System::PacketBufferHandle message) |
| | Send the provided message to the device. More...
|
| |
| CHIP_ERROR | SendCommands () |
| | Send the command in internal command sender. More...
|
| |
| app::CommandSender * | GetCommandSender () |
| |
| bool | GetAddress (Inet::IPAddress &addr, uint16_t &port) const |
| | Get the IP address and port assigned to the device. More...
|
| |
| void | Init (ControllerDeviceInitParams params, uint16_t listenPort, Transport::AdminId admin) |
| | Initialize the device object with secure session manager and inet layer object references. More...
|
| |
| void | Init (ControllerDeviceInitParams params, uint16_t listenPort, NodeId deviceId, const Transport::PeerAddress &peerAddress, Transport::AdminId admin) |
| | Initialize a new device object with secure session manager, inet layer object, and other device specific parameters. More...
|
| |
| CHIP_ERROR | Serialize (SerializedDevice &output) |
| | Serialize the Pairing Session to a string. More...
|
| |
| CHIP_ERROR | Deserialize (const SerializedDevice &input) |
| | Deserialize the Pairing Session from the string. More...
|
| |
| void | OnNewConnection (SecureSessionHandle session) |
| | Called when a new pairing is being established. More...
|
| |
| void | OnConnectionExpired (SecureSessionHandle session) |
| | Called when a connection is closing. More...
|
| |
| void | OnMessageReceived (const PacketHeader &header, const PayloadHeader &payloadHeader, System::PacketBufferHandle msgBuf) |
| | This function is called when a message is received from the corresponding CHIP device. More...
|
| |
| CHIP_ERROR | OpenPairingWindow (uint32_t timeout, PairingWindowOption option, SetupPayload &setupPayload) |
| | Trigger a paired device to re-enter the pairing mode. More...
|
| |
| CHIP_ERROR | UpdateAddress (const Transport::PeerAddress &addr) |
| | Update address of the device. More...
|
| |
| bool | IsActive () const |
| | Return whether the current device object is actively associated with a paired CHIP device. More...
|
| |
| void | SetActive (bool active) |
| |
| bool | IsSecureConnected () const |
| |
| void | Reset () |
| |
| NodeId | GetDeviceId () const |
| |
| bool | MatchesSession (SecureSessionHandle session) const |
| |
| void | SetAddress (const Inet::IPAddress &deviceAddr) |
| |
| PASESessionSerializable & | GetPairing () |
| |
| uint8_t | GetNextSequenceNumber () |
| |
| void | AddResponseHandler (uint8_t seqNum, Callback::Cancelable *onSuccessCallback, Callback::Cancelable *onFailureCallback) |
| |
| void | AddReportHandler (EndpointId endpoint, ClusterId cluster, AttributeId attribute, Callback::Cancelable *onReportCallback) |
| |
Initialize a new device object with secure session manager, inet layer object, and other device specific parameters.
This variant of function is typically used when a new device is paired, and the corresponding device object needs to updated with all device specifc parameters (address, port, interface etc).
This is not done as part of constructor so that the controller can have a list of uninitialzed/unpaired device objects. The object is initialized only when the device is actually paired.
- Parameters
-
| [in] | params | Wrapper object for transport manager etc. |
| [in] | listenPort | Port on which controller is listening (typically CHIP_PORT) |
| [in] | deviceId | Node ID of the device |
| [in] | peerAddress | The location of the peer. MUST be of type Transport::Type::kUdp |
| [in] | admin | Local administrator that's initializing this device object |
Initialize the device object with secure session manager and inet layer object references.
This variant of function is typically used when the device object is created from a serialized device information. The other parameters (address, port, interface etc) are part of the serialized device, so those are not required to be initialized.
Note: The lifetime of session manager and inet layer objects must be longer than that of this device object. If these objects are freed, while the device object is still using them, it can lead to unknown behavior and crashes.
- Parameters
-
| [in] | params | Wrapper object for transport manager etc. |
| [in] | listenPort | Port on which controller is listening (typically CHIP_PORT) |
| [in] | admin | Local administrator that's initializing this device object |
Trigger a paired device to re-enter the pairing mode.
If an onboarding token is provided, the device will use the provided setup PIN code and the discriminator to advertise itself for pairing availability. If the token is not provided, the device will use the manufacturer assigned setup PIN code and discriminator.
The device will exit the pairing mode after a successful pairing, or after the given timeout
time.
- Parameters
-
| [in] | timeout | The pairing mode should terminate after this much time. |
| [in] | option | The pairing window can be opened using the original setup code, or an onboarding token can be generated using a random setup PIN code (or with the PIN code provied in the setupPayload). This argument selects one of these methods. |
| [out] | setupPayload | The setup payload corresponding to the generated onboarding token. |
- Returns
- CHIP_ERROR CHIP_NO_ERROR on success, or corresponding error


Nicholas E. Spirakis
• Windows, Android
Networking:• Cisco Networking Academy
Languages:• C, C++, Java, Javascript, Python, SQL, Android Development
Web:• HTML, CSS, Javascript, node.js
Applications:• Microsoft Office, SQL, Google Docs, Orange
Hardware/systems:•PC
EducationConcentration in Game and Simulation Programming GPA: 3.10
Masters: Artificial Intelligence Start: Fall 2022
Projects• A data visualization website made for the company Witron as my capstone project
Honors and Awards• Dean's List, Lewis Univerity, two semesters


It starts with a buzzing drone, like the spinning of a cd-drive penetrating the air as I feel my body falling out of agency to a state of paralysis. The room is lit by an ethereal light the colour of dark bruises, accentuating the shadows that lay behind the safety and familiarity of my bedroom decor. I know this place. I have been here before but for the first time come armed with the knowledge of eastern philosophy. I know this is no longer my bed, my room, my world, but the deepest antipodes of my mind revealing itself in the twilight between consciousness and sleep.
Fear is alive and well.
From the dark crevices of the room a creature manifests into significance, its long slender body, elastic in its movements and proportions floats across the room like a black shadow cast on air. The creature hovers just metres from my bed, twisting, spiraling in slow motion as if it were swimming in a pool of water. I am reminded of the black demons from the movie Ghost, and am certain this is one of them, here to take me away from my world and its attachments, to a dimension unknown. As it moves closer, ever so slowly, a sudden pressure is felt on my legs as if I were being tied down like a hostage. The fear has now risen to fever pitch, but I know that I must somehow let go and allow this creature to take me where it wants, for the destination may reveal to me a place where no one’s been, an answer sought after so long that has eluded my inquisitions.
To my left it speaks. The voice of an infant, babbling away a series of indecipherable sounds so close to my ear I can feel its breath, pure and chilling, penetrating my defences as try and scream. I fail and continue to hear this voice, chanting now what could be to be a mantra in another tongue, summoning a part of me of which I know I do not own, whose very existence is not defined by abstract names, symbols or memories. It is ‘I’ this sentient being is summoning to its world. It is ‘I’ I do not own, I do not know, I can not define.
And all that I’ve known, all that I’ve held, all that I’ve learnt about letting go, of releasing the ego to find this state of enlightenment, morksha, samadhi, heaven, is ripped to shreds, rendered meaningless in the face of a fear so terrifying, only my instincts for survival remain.
I try and scream once more but fail. I try and move just an inch, enough to prove to myself I still can but fail once again as the mantra continues, the demon remains. I remind myself I need to stop fighting and let go, for I know deep inside that letting go is the only way to find this ultimate goal, but the fear is too real, the threat too close. I persist in this struggle for waking consciousness; painfully with every aching breath over what feels like several years until finally I wake.
The room is now much darker without the presence of the demon or the unseen child. I lie relieved, breathing heavily. Though I can finally move through the security of familiarity, I feel a sense loss, a missed opportunity to go where no one’s been. I feel a sense of defeat knowing this philosophy I have learnt and taken upon as ‘the way’ has failed the ultimate test and can find no euphemism to gloss over the failure. The belief of letting go of one’s self I had clung to was merely a ghost, a falling rock I held as both the rock and I tumbled naively through this random chaos conceptualised as life. The instinct to survive, to hold on, to live, rose to the surface as I find my self back at square one, the default state of no belief, no conception, no idea.
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


OpenSSL speed
Operations per second per algorithm
Set minimum values (set to include/exclude algorithms)
Keygen/s:
Encap/s:
Decap/s:
Sign/s:
Verify/s:
All
OQS only
Algorithms & values (click name to enable/disable)
Color-coding derived from
a NIST presentation
.


---
company: "Engineering School of São Carlos - University of São Paulo"
location: "São Carlos, São Paulo, Brazil"
title: "Junior Researcher in Signal Processing"
started: "2004"
duration: "04.2004 - 03.2005"
keywords: "rehabilitation engineering, signal processing, sampling, mlp, neural networks, electromyography, matlab"
description: "Research on using Artificial Neural Networks in signal pattern recognition providing control of electronic devices for patients with physical disabilities."
skills:
- matlab:
name: "Matlab"
share: "100%"
- dsp:
name: "Digital Signal Processing"
share: "40%"
- neural:
name: "Neural Networks"
share: "40%"
- em:
name: "Electromyography"
share: "20%"
languages:
- "English"
- "Portuguese"
---
Research in Electromyography Signal Processing.
Laboratory: LABCIBER - Biomedical Engineering Laboratory.
Focus on using Artificial Neural Networks in signal pattern recognition.
Application on providing control of electronic devices for patients with physical disabilities.
Programming Language: Matlab


Version 1.0.1 by Volodymyr Volynets
- Business Intelligence
- Enhancement #1249 (Initial commit.)
Repository / Git:
Name: Numbers\BI
Title: Business Intelligence modules for Numbers Framework
Version: 1.0.0
Last Tag: fatal: No names found, cannot describe anything.
User Name: Volodymyr Volynets
User Email<EMAIL_ADDRESS>Statistics:
Addition: 2675
Deletion: 0
Modules:
Change Log (Numbers\ChangeLog, 1.0.5) | 2230 0
0 0 | .numbers/ChangeLogs/.gitkeep
1221 0 | .numbers/Framework/Functions.php
176 0 | .numbers/Framework/Helper/Cmd.php
222 0 | .numbers/Framework/Helper/File.php
330 0 | .numbers/Framework/Manager.php
9 0 | .numbers/Framework/Models.php
10 0 | .numbers/Framework/Template/ChangeLog.html
201 0 | .numbers/LICENSE
27 0 | .numbers/Make.cmd
25 0 | .numbers/Makefile
4 0 | .numbers/README.md
5 0 | .numbers/module.ini
B/I Business Intelligence (Numbers\BI\BusinessIntelligence, 1.0.0) | 209 0
49 0 | BusinessIntelligence/Data/Import.php
19 0 | BusinessIntelligence/Model/DataSource/Types.php
60 0 | BusinessIntelligence/Model/DataSources.php
59 0 | BusinessIntelligence/Model/Filters.php
22 0 | BusinessIntelligence/module.ini
Business Intelligence modules for Numbers Framework (Numbers\BI, 1.0.0) | 236 0
201 0 | LICENSE
27 0 | composer.json
8 0 | module.ini


The tycho.util.devtools package contains a set of tools useful for
developing programs in C, Java and other languages. (The tycho.edit.textedit
packaged contains the language specific editors).
The use of the developer tools use is documented here.
Contents
Developer Tools Class Documentation
Tycho Home Page
Copyright © 1998, The Regents of the University of California.
All rights reserved.
Last updated: 06/08/98,
comments to: cxh@eecs.berkeley.edu


This class to represent a body of the physics engine.
More...
#include <Body.h>
|
|
bodyindex | mID |
| | ID of the body.
|
| |
|
bool | mIsAlreadyInIsland |
| | True if the body has already been added in an island (for sleeping technique)
|
| |
|
bool | mIsAllowedToSleep |
| | True if the body is allowed to go to sleep for better efficiency.
|
| |
| bool | mIsActive |
| | True if the body is active. More...
|
| |
|
bool | mIsSleeping |
| | True if the body is sleeping (for sleeping technique)
|
| |
|
decimal | mSleepTime |
| | Elapsed time since the body velocity was bellow the sleep velocity.
|
| |
|
void * | mUserData |
| | Pointer that can be used to attach user data to the body.
|
| |
This class to represent a body of the physics engine.
You should not instantiante this class but instantiate the CollisionBody or RigidBody classes instead.
| Body::Body |
( |
bodyindex |
id | ) |
|
| bodyindex reactphysics3d::Body::getID |
( |
| ) |
const |
|
inline |
Return the ID of the body.
- Returns
- The ID of the body
| void * reactphysics3d::Body::getUserData |
( |
| ) |
const |
|
inline |
Return a pointer to the user data attached to this body.
- Returns
- A pointer to the user data you have attached to the body
| bool reactphysics3d::Body::isActive |
( |
| ) |
const |
|
inline |
Return true if the body is active.
- Returns
- True if the body currently active and false otherwise
| bool reactphysics3d::Body::isAllowedToSleep |
( |
| ) |
const |
|
inline |
Return whether or not the body is allowed to sleep.
- Returns
- True if the body is allowed to sleep and false otherwise
| bool reactphysics3d::Body::isSleeping |
( |
| ) |
const |
|
inline |
Return whether or not the body is sleeping.
- Returns
- True if the body is currently sleeping and false otherwise
| void reactphysics3d::Body::setIsActive |
( |
bool |
isActive | ) |
|
|
inlinevirtual |
| void reactphysics3d::Body::setIsAllowedToSleep |
( |
bool |
isAllowedToSleep | ) |
|
|
inline |
Set whether or not the body is allowed to go to sleep.
- Parameters
-
| isAllowedToSleep | True if the body is allowed to sleep |
| void reactphysics3d::Body::setUserData |
( |
void * |
userData | ) |
|
|
inline |
Attach user data to this body.
- Parameters
-
| userData | A pointer to the user data you want to attach to the body |
| bool reactphysics3d::Body::mIsActive |
|
protected |
True if the body is active.
An inactive body does not participate in collision detection, is not simulated and will not be hit in a ray casting query. A body is active by default. If you set this value to "false", all the proxy shapes of this body will be removed from the broad-phase. If you set this value to "true", all the proxy shapes will be added to the broad-phase. A joint connected to an inactive body will also be inactive.
The documentation for this class was generated from the following files:
- /Users/daniel/Programmation/ReactPhysics3D/reactphysics3d/src/body/Body.h
- /Users/daniel/Programmation/ReactPhysics3D/reactphysics3d/src/body/Body.cpp


- GameColor - Enum in model
-
Contains all colors used to represent a TrainCard or a RouteColor.
- getDestination() - Method in class model.DestinationCard
-
- getDestination() - Method in class model.Edge
-
- getDestinationCards() - Method in class model.Player
-
- getDestinationCardsList() - Method in class model.Cards
-
- getDestinationCardsRandomShuffler() - Method in class model.Cards
-
The trainCardsRandomShuffler is a Random object used to shuffle the Cards such that we
can produce unique matches each time the game is played.
- getName() - Method in class model.Player
-
- getNextDestinationCard() - Method in class model.Cards
-
This method gives the next destinationCard from the deck as if you were drawing a card from
the top of the deck.
- getNextTrainCard() - Method in class model.Cards
-
This method gives the next trainCard from the deck as if you were drawing a card from the
top of the deck.
- getNumberOfDestinationCards() - Static method in class model.DestinationCard
-
- getNumberOfEdges() - Static method in class model.Edge
-
- getRouteColor() - Method in class model.Edge
-
- getScore() - Method in class model.DestinationCard
-
- getScore() - Method in class model.Player
-
- getScoreOfAllCards() - Static method in class model.DestinationCard
-
- getSource() - Method in class model.DestinationCard
-
- getSource() - Method in class model.Edge
-
- getTeamColor() - Method in class model.Player
-
- getTrainCards() - Method in class model.Player
-
- getTrainCardsList() - Method in class model.Cards
-
- getTrainCardsRandomShuffler() - Method in class model.Cards
-
The trainCardsRandomShuffler is a Random object used to shuffle the Cards such that we
can produce unique matches each time the game is played.
- getTrainPieces() - Method in class model.Player
-
- getWeight() - Method in class model.Edge
-
- getWeightOfAllEdges() - Static method in class model.Edge
-
- Graph - Class in model
-
- Graph(int) - Constructor for class model.Graph
-
Creates a graph with specified number of vertices/nodes.
- GraphTest - Class in model
-
- GraphTest() - Constructor for class model.GraphTest
-


|
||||||||||
| PREV NEXT | FRAMES NO FRAMES |
| Packages that use org.kiji.schema | |
|---|---|
| org.kiji.schema | The main package for users of KijiSchema. |
| org.kiji.schema.filter | Row level filters used when reading data from Kiji tables. |
| org.kiji.schema.hbase | HBase-specific KijiSchema behavior. |
| org.kiji.schema.impl | Implementations for the main KijiSchema classes and interfaces. |
| org.kiji.schema.impl.hbase | Implementations for the main KijiSchema classes and interfaces. |
| org.kiji.schema.layout | Kiji table layouts. |
| org.kiji.schema.layout.impl | Implementation for Kiji table layout management. |
| org.kiji.schema.mapreduce | Kiji MapReduce utilities. |
| org.kiji.schema.security | Kiji security. |
| org.kiji.schema.tools | Package containing implementations, abstract base classes, and exceptions for kiji command-line tools. |
| org.kiji.schema.util | Package containing utility classes used throughout Kiji. |
| org.kiji.schema.zookeeper | Contains classes for interacting with ZooKeeper including utilities and recipes specific to Kiji. |
| Classes in org.kiji.schema used by org.kiji.schema | |
|---|---|
| AtomicKijiPutter
Interface for performing atomic puts to a single row of a Kiji table. |
|
| DecodedCell
Content of a Kiji cell. |
|
| EntityId
EntityId is used to identify a particular row under the key format of a Kiji table. |
|
| EntityIdFactory
Factory class for creating EntityIds. |
|
| HBaseEntityId
Entity ID encapsulating an HBase row key. |
|
| Kiji
Provides a handle to a Kiji instance that contains table information and access to Kiji administrative functionality. |
|
| KijiBufferedWriter
Interface for performing batch operations on a Kiji Table. |
|
| KijiCell
KijiCell represents a cell in a Kiji table. |
|
| KijiCell.CellType
Type of a Kiji cell. |
|
| KijiCellDecoder
Interface for Kiji cell decoders. |
|
| KijiCellDecoderFactory
Interface for factories of KijiCellDecoder instances. |
|
| KijiCellEncoder
Interface for Kiji cell encoders. |
|
| KijiColumnName
A Kiji column name is composed of one or two parts: a family and a qualifier. |
|
| KijiColumnPagingNotEnabledException
Thrown when a client attempts to fetch the next page of data from a Kiji column, but paging is not enabled on the column. |
|
| KijiDataRequest
Describes a request for columns of data to read from a Kiji table. |
|
| KijiDataRequest.Column
Describes a data request for a column in a Kiji table. |
|
| KijiDataRequestBuilder
Builds a request for columns of data to read from a Kiji table. |
|
| KijiDataRequestBuilder.ColumnsDef
Defines properties associated with one or more columns in a request for Kiji table columns. |
|
| KijiDataRequestValidator
This class validates a KijiDataRequest against the layout
of a Kiji table to make sure it contains all of the columns requested. |
|
| KijiDeleter
Interface for performing deletes on a Kiji table. |
|
| KijiFactory
Factory for Kiji instances. |
|
| KijiIncrementer
Interface for performing increments on a Kiji table. |
|
| KijiInstaller
Installs or uninstalls Kiji instances from an HBase cluster. |
|
| KijiMetaTable
The Kiji meta data table, which stores layouts and other user defined meta data on a per-table basis. |
|
| KijiPager
Retrieves pages of values from a column in a Kiji table. |
|
| KijiPutter
Interface for performing puts on a Kiji table. |
|
| KijiReaderFactory
Interface for table reader factories. |
|
| KijiRegion
A KijiRegion specifies a logical region in a Kiji Table, bounded by a start key (inclusive) and an end key (exclusive). |
|
| KijiRowData
KijiRowData provides a way for applications to access data read from a Kiji table. |
|
| KijiRowKeyComponents
This class represents an encapsulation of the parts of a Kiji row key, suitable for translation to an EntityId . |
|
| KijiRowKeySplitter
Utility class for splitting the Kiji row key space. |
|
| KijiRowScanner
Interface for scanning over rows read from a Kiji table. |
|
| KijiSchemaTable
The Kiji schema table, which contains the lookup table between schema IDs, hashes, and full schemas. |
|
| KijiSchemaTable.SchemaEntry
Association between a schema and its ID. |
|
| KijiSystemTable
The Kiji system table, which stores system information such as the version, ready state, and locks. |
|
| KijiTable
The KijiTable interface provides operations on KijiTables. |
|
| KijiTableAnnotator
Manages setting, retrieving, and searching key value annotations for a KijiTable. |
|
| KijiTableFactory
Factory for KijiTable instances. |
|
| KijiTableKeyValueDatabase
A database of per table key-value pairs. |
|
| KijiTablePool
Maintains a pool of opened KijiTables for reuse. |
|
| KijiTablePool.KijiTablePoolBuilder
Builder class for KijiTablePool instances. |
|
| KijiTableReader
Interface for reading data from a Kiji table. |
|
| KijiTableReader.KijiScannerOptions
Options for KijiRowScanners. |
|
| KijiTableReaderBuilder
Builder for KijiTableReader s with options. |
|
| KijiTableReaderBuilder.OnDecoderCacheMiss
Optional behavior when a ColumnReaderSpec override specified in a
KijiDataRequest used with this reader is not found in the prebuilt cache of cell
decoders. |
|
| KijiTableReaderPool
Maintains a pool of opened KijiTableReaders for reuse. |
|
| KijiTableReaderPool.Builder
Builder for KijiTableReaderPool instances. |
|
| KijiTableReaderPool.Builder.WhenExhaustedAction
Possible behaviors of GenericObjectPool.borrowObject() when a pool
is full. |
|
| KijiTableReaderPool.PooledKijiTableReader
KijiTableReader implementation which can be served from a pool. |
|
| KijiTableWriter
Interface for modifying a Kiji table. |
|
| KijiURI
URI that uniquely identifies a Kiji instance, table, column(s). |
|
| KijiURI.KijiURIBuilder
Builder class for constructing KijiURIs. |
|
| KijiWriterFactory
Interface for table writer factories. |
|
| MapFamilyVersionIterator.Entry
Entry from a map-type family. |
| Classes in org.kiji.schema used by org.kiji.schema.filter | |
|---|---|
| DecodedCell
Content of a Kiji cell. |
|
| KijiColumnName
A Kiji column name is composed of one or two parts: a family and a qualifier. |
|
| KijiDataRequest
Describes a request for columns of data to read from a Kiji table. |
|
| KijiSchemaTable
The Kiji schema table, which contains the lookup table between schema IDs, hashes, and full schemas. |
|
| NoSuchColumnException
Thrown when attempting to access a column that does not exist. |
| Classes in org.kiji.schema used by org.kiji.schema.hbase | |
|---|---|
| KijiURI
URI that uniquely identifies a Kiji instance, table, column(s). |
|
| NotAKijiManagedTableException
Thrown when Kiji encounters an HBase table that is not managed by Kiji. |
| Classes in org.kiji.schema used by org.kiji.schema.impl | |
|---|---|
| DecodedCell
Content of a Kiji cell. |
|
| Kiji
Provides a handle to a Kiji instance that contains table information and access to Kiji administrative functionality. |
|
| KijiCellDecoder
Interface for Kiji cell decoders. |
|
| KijiCellEncoder
Interface for Kiji cell encoders. |
|
| KijiCellEncoderFactory
Interface for factories of KijiCellEncoder instances. |
|
| KijiColumnName
A Kiji column name is composed of one or two parts: a family and a qualifier. |
|
| NoSuchColumnException
Thrown when attempting to access a column that does not exist. |
| Classes in org.kiji.schema used by org.kiji.schema.impl.hbase | |
|---|---|
| AtomicKijiPutter
Interface for performing atomic puts to a single row of a Kiji table. |
|
| EntityId
EntityId is used to identify a particular row under the key format of a Kiji table. |
|
| Kiji
Provides a handle to a Kiji instance that contains table information and access to Kiji administrative functionality. |
|
| KijiBufferedWriter
Interface for performing batch operations on a Kiji Table. |
|
| KijiCell
KijiCell represents a cell in a Kiji table. |
|
| KijiCellDecoder
Interface for Kiji cell decoders. |
|
| KijiColumnName
A Kiji column name is composed of one or two parts: a family and a qualifier. |
|
| KijiColumnPagingNotEnabledException
Thrown when a client attempts to fetch the next page of data from a Kiji column, but paging is not enabled on the column. |
|
| KijiDataRequest
Describes a request for columns of data to read from a Kiji table. |
|
| KijiDeleter
Interface for performing deletes on a Kiji table. |
|
| KijiFactory
Factory for Kiji instances. |
|
| KijiIncrementer
Interface for performing increments on a Kiji table. |
|
| KijiMetaTable
The Kiji meta data table, which stores layouts and other user defined meta data on a per-table basis. |
|
| KijiPager
Retrieves pages of values from a column in a Kiji table. |
|
| KijiPutter
Interface for performing puts on a Kiji table. |
|
| KijiReaderFactory
Interface for table reader factories. |
|
| KijiRegion
A KijiRegion specifies a logical region in a Kiji Table, bounded by a start key (inclusive) and an end key (exclusive). |
|
| KijiResult
Wraps underlying database results to provide iteration and decoding. |
|
| KijiRowData
KijiRowData provides a way for applications to access data read from a Kiji table. |
|
| KijiRowScanner
Interface for scanning over rows read from a Kiji table. |
|
| KijiSchemaTable
The Kiji schema table, which contains the lookup table between schema IDs, hashes, and full schemas. |
|
| KijiSchemaTable.SchemaEntry
Association between a schema and its ID. |
|
| KijiSystemTable
The Kiji system table, which stores system information such as the version, ready state, and locks. |
|
| KijiTable
The KijiTable interface provides operations on KijiTables. |
|
| KijiTableAnnotator
Manages setting, retrieving, and searching key value annotations for a KijiTable. |
|
| KijiTableFactory
Factory for KijiTable instances. |
|
| KijiTableKeyValueDatabase
A database of per table key-value pairs. |
|
| KijiTableReader
Interface for reading data from a Kiji table. |
|
| KijiTableReader.KijiScannerOptions
Options for KijiRowScanners. |
|
| KijiTableReaderBuilder
Builder for KijiTableReader s with options. |
|
| KijiTableReaderBuilder.OnDecoderCacheMiss
Optional behavior when a ColumnReaderSpec override specified in a
KijiDataRequest used with this reader is not found in the prebuilt cache of cell
decoders. |
|
| KijiTableWriter
Interface for modifying a Kiji table. |
|
| KijiURI
URI that uniquely identifies a Kiji instance, table, column(s). |
|
| KijiWriterFactory
Interface for table writer factories. |
| Classes in org.kiji.schema used by org.kiji.schema.layout | |
|---|---|
| Kiji
Provides a handle to a Kiji instance that contains table information and access to Kiji administrative functionality. |
|
| KijiCellDecoderFactory
Interface for factories of KijiCellDecoder instances. |
|
| KijiCellEncoderFactory
Interface for factories of KijiCellEncoder instances. |
|
| KijiColumnName
A Kiji column name is composed of one or two parts: a family and a qualifier. |
|
| KijiSchemaTable
The Kiji schema table, which contains the lookup table between schema IDs, hashes, and full schemas. |
|
| KijiURI
URI that uniquely identifies a Kiji instance, table, column(s). |
|
| NoSuchColumnException
Thrown when attempting to access a column that does not exist. |
| Classes in org.kiji.schema used by org.kiji.schema.layout.impl | |
|---|---|
| Kiji
Provides a handle to a Kiji instance that contains table information and access to Kiji administrative functionality. |
|
| KijiCellDecoder
Interface for Kiji cell decoders. |
|
| KijiCellDecoderFactory
Interface for factories of KijiCellDecoder instances. |
|
| KijiCellEncoder
Interface for Kiji cell encoders. |
|
| KijiCellEncoderFactory
Interface for factories of KijiCellEncoder instances. |
|
| KijiColumnName
A Kiji column name is composed of one or two parts: a family and a qualifier. |
|
| KijiMetaTable
The Kiji meta data table, which stores layouts and other user defined meta data on a per-table basis. |
|
| KijiSchemaTable
The Kiji schema table, which contains the lookup table between schema IDs, hashes, and full schemas. |
|
| KijiTableReaderBuilder.OnDecoderCacheMiss
Optional behavior when a ColumnReaderSpec override specified in a
KijiDataRequest used with this reader is not found in the prebuilt cache of cell
decoders. |
|
| KijiURI
URI that uniquely identifies a Kiji instance, table, column(s). |
|
| NoSuchColumnException
Thrown when attempting to access a column that does not exist. |
| Classes in org.kiji.schema used by org.kiji.schema.mapreduce | |
|---|---|
| EntityId
EntityId is used to identify a particular row under the key format of a Kiji table. |
|
| KijiDataRequest
Describes a request for columns of data to read from a Kiji table. |
|
| KijiRowData
KijiRowData provides a way for applications to access data read from a Kiji table. |
|
| KijiURI
URI that uniquely identifies a Kiji instance, table, column(s). |
| Classes in org.kiji.schema used by org.kiji.schema.security | |
|---|---|
| KijiURI
URI that uniquely identifies a Kiji instance, table, column(s). |
| Classes in org.kiji.schema used by org.kiji.schema.tools | |
|---|---|
| EntityId
EntityId is used to identify a particular row under the key format of a Kiji table. |
|
| EntityIdFactory
Factory class for creating EntityIds. |
|
| KijiColumnName
A Kiji column name is composed of one or two parts: a family and a qualifier. |
|
| KijiDataRequest
Describes a request for columns of data to read from a Kiji table. |
|
| KijiRowData
KijiRowData provides a way for applications to access data read from a Kiji table. |
|
| KijiURI
URI that uniquely identifies a Kiji instance, table, column(s). |
| Classes in org.kiji.schema used by org.kiji.schema.util | |
|---|---|
| EntityId
EntityId is used to identify a particular row under the key format of a Kiji table. |
|
| Kiji
Provides a handle to a Kiji instance that contains table information and access to Kiji administrative functionality. |
|
| KijiSchemaTable
The Kiji schema table, which contains the lookup table between schema IDs, hashes, and full schemas. |
|
| KijiSystemTable
The Kiji system table, which stores system information such as the version, ready state, and locks. |
|
| KijiTable
The KijiTable interface provides operations on KijiTables. |
|
| KijiTableReader
Interface for reading data from a Kiji table. |
|
| KijiTableReaderPool
Maintains a pool of opened KijiTableReaders for reuse. |
|
| KijiTableWriter
Interface for modifying a Kiji table. |
|
| KijiURI
URI that uniquely identifies a Kiji instance, table, column(s). |
| Classes in org.kiji.schema used by org.kiji.schema.zookeeper | |
|---|---|
| KijiURI
URI that uniquely identifies a Kiji instance, table, column(s). |
|
||||||||||
| PREV NEXT | FRAMES NO FRAMES |


I am originally from Milwaukee Wisconsin where I was born and raised. I moved to Portland Oregon in 2016, after I graduated from Cardinal Strich University with a BA in Business. I visited Portland the summer before I graduated and fell in love with the city. What caught my attention was the easy access to the surrounding nature. I get the benefits of living in a city but also have the pleasure of hiking snowboarding, and surfing.
My decision to enroll in Epicodus was my interest in programming. I started hearing about coding boot camps while I was in college. I decided to take a html course on Codecademy. It sparked my interest and I enjoyed the idea of learning a new skill. After moving to Portland I had a hard time finding in a job in my field of study so I looked in to coding boot camps. Epicodus had the best reviews in the country and happened to be fifteen minutes from my house. I decided to enroll and have not looked back.


UHF Chad'z rating: *** (out of 4 = good) 1989, PG-13, 97 minutes [1 hour, 37 minutes] [comedy] starring: "Weird Al" Yankovic (George Newman), Kevin McCarthy (R.J. Fletcher), Michael Richards (Stanley Spadowski), David Bowe (Bob), written by Al Yankovic, Jay Levey, produced by Gene Kirkwood, John Hyde, directed by Jay Levey.
 The only problem is sometimes you wonder why you laughed.
The film starts off with the typical buddy system. George (Yankovic) and Bob (Bowe) are two slackers who can't get their act together and keep floating from job to job. When George's uncle wins the deed to Channel 62, a UHF television station, he lets George manage it because he has nothing else to do.
Since this a film about stupidity for the masses, Channel 62 becomes an overnight success due to George's wacky ideas, especially when he gives Stanley Spadowski (Richards), the station's janitor, his own TV show. Richards is quite funny as Spadowski, a janitor who loves his mop with a passion. When he is given his own television show the stations' ratings soar and suddenly Channel 62 becomes the biggest station in town because of its sheer wackiness. George brings in his friends to create their own shows like "Wheel Of Fish," "Strip Solitaire," and "Fun With Dirt."
Yankovic and Levey certainly have a knack for satire and zaniness, as they do the correct thing by making everything in the film just as bizarre as everything else. If anything, the film is just a live action cartoon in all aspects, but a funny cartoon at that. Not only are the shows wacky, but so are the commercials such as "Spatula City," and "Plots R Us." There's a good sense of detail here, where as every little joke and gag have meaning and are funny within their context.
The actual "plot" involves the efforts of R.J. Fletcher (McCarthy), the general manager of a network affiliate, and his plans to sabotage Channel 62.
When George's uncle suddenly finds himself in debt he agrees to sell Channel 62 to Fletcher if George cannot come up with the money by a certain deadline. The story from here starts to become a comedic adventure, with cliff hangers and the like, but you can tell how it's going to turn out.
Although "UHF" is funny, it's far from a perfect film. Sometimes it becomes more ridiculous than necessary, but at least it doesn't take itself too seriously.
Please visit Chad'z Movie Page @ http://members.aol.com/ChadPolenz - over 140 new and old films reviewed in depth, not just blind ratings and capsules. Also, check out The FIRST Shay Astar Web Page @ http://members.aol.com/ChadPolenz/ShayAstar.html
e-mail<EMAIL_ADDRESS>(C)1997 Chad Polenz
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Product 3
Price: $4.99, $5.99, $7.99
Model #:<PHONE_NUMBER>1
Multiple cleaning supplies and houseold supplies even ranging up to frying pans for your kitchen
Product 4
Price: $4.99, $5.99, $7.99
Model #:<PHONE_NUMBER>83
Various plumbing supples and tools to help with any projects you need.


| Portfolio Management Application Home Page | Application Cross Reference |
The core Vision system comes with a set of classes already defined. These classes include an initial set of methods which can be modified and extended by the user. Vision's built-in class hierarchy is discussed in detail in the general Vision documentation. The Portfolio Management Application Layer defines classes, protocol, and starter applications that address the needs of the portfolio management function. This layer is entirely implemented using the Vision language and can be readily tailored to meet the specific needs of your organization.
Note that the actual entities created for the core investment classes will be dependent on your installation's requirements. Many of the named entities used in the examples in these documents are included for illustration purposes only and may not exist in your environment. You can create them using the techniques provided or substitute entity identifiers that are defined for you organization.
The Vision Run-Time Environment provides the tools needed to build and maintain a Vision database designed to deliver Web-based applications to users via an internal intranet. Basic capabilities provided in this environment include a starter suite of web-based applications, initial templates for loading portfolio, security, and supporting information, and basic tools for committing data to the database.
The document, Portfolio Management Application: Installation describes the implementation process.
The Portfolio Management Application Layer includes a starter suite of web-based applications. These applications are accessed with a web browser via an organization's intranet. The Headstart applications are described in the document, Portfolio Management Application: Headstart Application.
In addition, analysts can interact with Vision using Excel Add-ins designed to extract data from Vision and temporarily define and modify data that is used in conjunction with browser applications. These analyst tools are described in the document, Portfolio Management Application: Analyst Tools.
Standardized interfaces for loading data from external sources are provided as part of this Application Layer. An Excel interface is available for making temporary modifications to the database. These changes will be reflected in an analyst's private versions of browser reports, but will not be saved permanently. Tools for committing permanent changes to the database are also provided.
The pre-defined data feeds are described in the document, Portfolio Management Application: Feeds.
A collection of database administration tools are available for loading data into the database, defining additional database schema, and performing various database maintenance functions.
A single user is designated as the Vision database administrator and is given access to these tools which are described in the document, Portfolio Management Application: Administration .
Once you have installed your software, reviewed the data feed requirements, and created an initial set of feeds, you are ready to start loading and using your data. Samples of this process are described in the document, Portfolio Management Application: Getting Started.
Over time, you will probably want to add new reports and expand the set of internal and external data feeds you incorporate. You will be able to do many of these enhancements on your own using the techniques you learned during the installation process. At this point, you may want to learn more about the Vision language so you can modify and create additional applications. In addition, you may want to familiarize yourself with the production tools that have been defined to help manage your Vision environment.
More information about "next steps" is available.
The Portfolio Management Application Layer defines a number of core classes used to manage investment data. Core entity classes include Company, Security, Industry, and Account. Additional information is managed by subclasses of DataRecord and LinkRecord including PriceRecord, DivRecord, and Holding.
These classes are described in detail in the document, Portfolio Management Application: Classes.
The Portfolio Management Application Layer defines a number of supplemental core classes that are available as part of the Headstart Application Kit. Supplemental entity classes include Analyst and Manager. Additional information is managed by subclasses of DataRecord including fundamental company data and country economics.
These classes are described in detail in the document, Portfolio Management Application: Supplemental Classes.
Special structures have been designed to manage holdings, dividend, price, and adjustment data in the Vision database. These structures have been created to correctly handle split and currency adjustments automatically. In addition, these structures have been designed to facilitate future reorganizations as the database grows, so that applications that use this data are sheltered from structural changes.
The document, Portfolio Management Application: Issues describes these issues in more detail.
The document, Portfolio Management Application: Language Tutorial provides a tutorial for writing basic Vision programs using the Portfolio Management Application Layer classes and messages.
The document, Portfolio Management Application: Document Cross Reference provides a cross reference to the documents directly related to this application layer.
The document, Portfolio Management Application: FAQ provides guides that answer frequently asked questions about Portfolio Management Applications.
| Copyright © 1998 Innovative Systems Techniques, Inc. | Updated December 23, 1998 |


Hi! I am a member of Team 3 from pod 3.1.0 aka Recursive Rhinos.
Python Developer
Web Developer
Android Developer


You need to enable JavaScript to access NetBank
Follow these instructions on how to enable JavaScript. If you'd prefer not to enable Javascript, you can still access some basic NetBank functions by logging into the mobile version of NetBank.
Need proof of ID and account details?
Now you can view, download and email account and balance confirmation documents straight from NetBank. No branch or phone call needed.
Complete a short survey for an opportunity to win a $100 gift card
Should you get your home loan guaranteed?
Find answers fast with our community
You can lock your credit card while you look for it


Bêka & Lemoine's latest film shows Venice's worst flood in half a century
by Amy FrearsonArchitectural filmmakers Ila Bêka and Louise Lemoine have released footage from a film showing the impact of flooding in Venice.
The duo, known for films including Koolhaas Houselife and Moriyama-San, have released a two-minute trailer for their latest movie. It contains recent footage showing the streets of Venice under water, including the whole of Piazza San Marco.
The Italian city was hit by its worst flood since 1966 on on Tuesday 12 November. Water levels rose to 1.87 metres, leaving most of the city submerged. High waters have continued throughout the week, resulting in over €1 billion worth of damage.
"Being in Venice this week, we were in the foreground to observe the impact of this historical event," said Bêka & Lemoine.
Footage shows Venice streets under water
The footage shows tourists wading through the floods in waterproofs, shop owners trying to keep the waters at bay and locals trying to go about their daily business.
It also shows crowds of journalists and photographers gathering as authority figures including former Italian prime minister Silvio Berlusconi and Venice mayor Luigi Brugnaro arrive on the scene.
Venice is a UNESCO World Heritage Site, spread out over 118 small islands. It contains some of the world's most revered buildings, including St Mark's Basilica, the Doge's Palace and the Biblioteca Nazionale Marciana, as well as artworks by Carpaccio and Veronese.
The city is also home to cultural venues including the Peggy Guggenheim Collection and is currently hosting the Venice Art Biennale.
The biennale organisers have reported no damage to works on show in its main venues, the Giardini and the Arsenale, according to The Art Newspaper. However water is understood to have penetrated several of the national pavilions.
Extensive damage to St Mark's
St Mark's Basilica – which has only flooded six times since its construction in 1092 – has suffered extensive damage. The high waters have also caused the collapse of the San Servolo retaining wall, which houses Venice International University.
The government has pledged €20 million towards the cost of repairs. The mayor has also opened a bank account to receive charity donations.
A major infrastructure project has been underway since 2003 to protect the city from flooding, but the project has suffered multiple setbacks.
Bêka & Lemoine recorded the footage for ongoing series Homo Urbanus, a "huge cinematic odyssey" exploring the daily life of humanity in cities all around the world.
The series already includes films shot in Bogotà, Seoul, Tokyo, Kyoto, Rabat, Naples, Shanghai, Doha and Saint Petersburg. These are currently on show at the Rabat Biennale in Morocco and will also be shown in Shenzhen at the Bi-City Biennale of Urbanism/Architecture later this year.


Padoc.com
Home
Donor
About
Contact
Sign Up
Login
Administrator Login
Log In
Not Registered? Sign Up here


SP_initialize()
[macro]#include <sicstus/sicstus.h> int SP_initialize(int argc, char **argv, void *reserved);
Initializes the Prolog engine.
argv
vector.
prolog_flag(argv,X)
.
NULL
SP_SUCCESS
if initialization was successful.
If initialization was successful, further calls to
SP_initialize()
will be no-ops (and return SP_SUCCESS
).
This must be done before any interface functions are called, except
those annotated as [preinit].
The function will allocate data
areas used by Prolog, initialize command line arguments so that they
can be accessed by the argv
Prolog flag, and load the Runtime
Library.
Initializing the Prolog Engine.


Preparation time
less than 30 mins
Cooking time
10 to 30 mins
Serves
Serves 1
For the duck, trim the edges of the fat and score the skin with the tip of a sharp knife. Season well with salt and freshly ground black pepper. Heat a frying pan until smoking then add the duck, skin-side down, and fry for 3-4 minutes to render some of the fat. Turn the duck over.
In a bowl, mix together the remaining duck ingredients and pour over the duck. Cook for 2-3 minutes, or until the liquid is thick and glossy.
For the rice, place the rice into a pan with the stock, green beans and red pepper. Bring to the boil and cook for 10-12 minutes, or until the rice is tender. Drain, season with salt and freshly ground black pepper and pack into a small greased glass bowl, then turn out onto a serving plate.
Slice the duck, arrange next to the rice and drizzle over the juices from the pan. Garnish with fresh coriander and orange to serve.


Fingers beat for the heart beat
a better way to express what U want to
The best learning is practice
Good design make the world better
web design can be more than web design
good looking for good working


Kullanıcı Profili
Kullanıcı Bilgileriniz ve Profil GüncellemeKaan İnce
Müze Yöneticisi
<EMAIL_ADDRESS>Telefon(511) 111 1111
Adres71 Kumkapı Mahallesi, Eminönü İstanbul, TR 34130
Kaan İnce
(511) 111 1111
<EMAIL_ADDRESS>İstanbul
Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt.Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim.
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries
It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.