Copyright 2009 Applied Research in Patacriticism and the University of Virginia
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
# File app/controllers/groups_controller.rb, line 253 def accept_as_peer_reviewed exhibit_id = params[:exhibit_id] exhibit = Exhibit.find(exhibit_id) params[:exhibit][:cluster_id] = nil if params[:exhibit][:cluster_id] == '0' exhibit.update_attributes(params[:exhibit]) if exhibit.is_published == 1 exhibit.adjust_indexing(:publishing, true) end #cluster = exhibit.cluster_id == nil ? nil : Cluster.find(exhibit.cluster_id) render :partial => 'group_exhibits_list', :locals => { :group => Group.find(exhibit.group_id), :cluster => nil, :user_id => get_curr_user_id() } end
# File app/controllers/groups_controller.rb, line 142 def accept_invitation from_web = request.request_method == 'POST' from_web = false if params[:from_create] # we can also be redirected here from the create user id page. begin has_login = GroupsUser.has_login(params[:id]) rescue redirect_to :action => 'stale_request' return end if has_login success = GroupsUser.join_group(params[:id]) group_id = GroupsUser.get_group_from_obfuscated_id(params[:id]) user_id = User.find(GroupsUser.find(Group.id_retriever(params[:id])).user_id) user = User.find(user_id) set_current_user({ :email => user.email, :fullname => user.fullname, :username => user.username, :role_names => user.role_names }) group = Group.find(group_id) GroupsUser.email_hook("membership", group_id, "New member, #{user.fullname}, in #{group.name}", "#{user.fullname} has joined the group #{group.name}. Visit the group at #{ActionMailer::Base.default_url_options[:host]}/groups/#{group.get_visible_id()}", url_for(:controller => 'home', :action => 'index', :only_path => false)) if from_web render :partial => 'group_details', :locals => { :group => group, :user_id => get_curr_user_id() } else redirect_to :action => 'acknowledge_notification', :type => 'join_group', :success => success, :group_id => group_id end else redirect_to :action => 'create_login', :id => Group.id_retriever(params[:id]), :message => '' end end
The following 4 calls can come from either the web or the email link. We have to go to different pages in the two cases. The way to tell is the email link is GET and the web is POST.
# File app/controllers/groups_controller.rb, line 106 def accept_request from_web = request.request_method == :'POST' success = GroupsUser.accept_request(params[:id]) if !success redirect_to :action => 'stale_request' else group_id = GroupsUser.get_group_from_obfuscated_id(params[:id]) user_id = GroupsUser.get_user_from_obfuscated_id(params[:id]) GroupsUser.email_hook("membership", group_id, "Member joined #{Group.find(group_id).name}", "The user #{User.find(user_id).fullname} was accepted.", url_for(:controller => 'home', :action => 'index', :only_path => false)) if from_web render :partial => 'group_details', :locals => { :group => Group.find(group_id), :user_id => get_curr_user_id() } else redirect_to :action => 'acknowledge_notification', :type => 'accept_request', :success => success, :group_id => group_id end end end
# File app/controllers/groups_controller.rb, line 188 def acknowledge_notification if params == nil || params[:group_id] == nil || params[:type] == nil render_422 end end
# File app/controllers/groups_controller.rb, line 56 def check_url url = params[:group]['visible_url'] if url == nil || url.length == 0 render :text => "No URL given. Please enter one.", :status => :bad_request return end url_int = url.to_i if url_int > 0 render :text => "Numbers are not allowed as URLs.", :status => :bad_request return end if url.index(/\W/) != nil render :text => "Only letters, numbers, and underscores are allowed as URLs.", :status => :bad_request return end id = params[:id] group = Group.find_by_visible_url(url) if group != nil && group.id != id.to_i render :text => 'The URL matches another group. Choose a different one.', :status => :bad_request else render :text => 'The URL is accepted. Please wait.' end end
POST /groups POST /groups.xml
# File app/controllers/groups_controller.rb, line 544 def create begin if params[:emails] err_msg = validate_email_list(params[:emails]) if !err_msg.nil? render :text => respond_to_file_upload("stopNewGroupUpload", err_msg) # This is loaded in the iframe and tells the dialog that the upload is complete. return end end params[:group][:show_membership] = true if params[:group][:show_membership] == 'Yes' params[:group][:show_membership] = false if params[:group][:show_membership] == 'No' params[:group][:exhibit_visibility] = 'www' params[:group][:forum_permissions] = 'full' send_email = false if params[:group][:group_type] == 'peer-reviewed' params[:group][:group_type] = 'community' send_email = true end @group = Group.new(params[:group]) @group.header_font_name = 'Arial' @group.header_font_size = '24' @group.text_font_name = 'Times New Roman' @group.text_font_size = '18' @group.illustration_font_name = 'Trebuchet MS' @group.illustration_font_size = '14' @group.caption1_font_name = 'Trebuchet MS' @group.caption1_font_size = '14' @group.caption2_font_name = 'Trebuchet MS' @group.caption2_font_size = '14' @group.endnotes_font_name = 'Times New Roman' @group.endnotes_font_size = '16' @group.footnote_font_name = 'Times New Roman' @group.footnote_font_size = '16' @group.use_styles = 0 @group.image_id = nil @group.exhibits_label = "Exhibit" @group.clusters_label = "Cluster" @group.show_admins = 'all' @group.notifications = "exhibit;membership" err = false if @group.save begin @group.image.save! if @group.image rescue err = true @group.delete flash = "ERROR: The image you have uploaded is too large or of the wrong type.
The file name must end in .jpg, .png or .gif, and cannot exceed 1MB in size." end if err == false flash =<EMAIL_ADDRESS>invitor = current_user url_accept = url_for(:controller => 'groups', :action => 'accept_invitation', :id => "PUT_ID_HERE", :only_path => false) url_decline = url_for(:controller => 'groups', :action => 'decline_invitation', :id => "PUT_ID_HERE", :only_path => false) url_home = url_for(:controller => 'home', :action => 'index', :only_path => false) @group.invite_members(invitor.fullname, invitor.email, params[:emails], params[:usernames], url_accept, url_decline, url_home) end else flash = "Error creating group" end rescue Exception => msg logger.error("**** ERROR: Can't create group: " + msg.message) flash = "Server error when creating group." end if send_email peer_review_request() end render :text => respond_to_file_upload("stopNewGroupUpload", flash) # This is loaded in the iframe and tells the dialog that the upload is complete. end
# File app/controllers/groups_controller.rb, line 194 def create_login if params == nil || params[:id] == nil render_422 end end
# File app/controllers/groups_controller.rb, line 200 def create_login_create gu_id = params[:id] user_name = params[:user_name] if params[:id] == nil || params[:user_name] == nil # this call was made without parameters. That is an error, probably made by a bot. redirect_to :action => 'create_login', :id => params[:id], :message => 'Illegal call.' return end gu = GroupsUser.find(gu_id) email = gu.email password = params[:password] password2 = params[:password2] if user_name.length == 0 redirect_to :action => 'create_login', :id => params[:id], :message => 'Please enter a user name.' return end user = User.find_by_username(user_name) if user != nil # there is a user with that name redirect_to :action => 'create_login', :id => params[:id], :message => 'There is already a user with that name. Please try another.' return end if password.length == 0 && password.strip.length == 0 redirect_to :action => 'create_login', :id => params[:id], :message => 'Please enter a password.' return end if password != password2 redirect_to :action => 'create_login', :id => params[:id], :message => 'Your passwords didn\t match. Please try again.' return end set_current_user(User.create_user(user_name, password.strip, email)) params[:id] = Group.id_obfuscator(gu_id) params[:from_create] = true accept_invitation() end
# File app/controllers/groups_controller.rb, line 170 def decline_invitation from_web = request.request_method == 'POST' group_id = GroupsUser.get_group_from_obfuscated_id(params[:id]) begin success = GroupsUser.decline_group(params[:id]) rescue redirect_to :action => 'stale_request' return end GroupsUser.email_hook("membership", group_id, "#{user.fullname} declined membership to #{Group.find(group_id).name}", "The user, #{user.fullname}, declined to join.", url_for(:controller => 'home', :action => 'index', :only_path => false)) if from_web render :partial => 'group_details', :locals => { :group => Group.find(group_id), :user_id => get_curr_user_id() } else redirect_to :action => 'acknowledge_notification', :type => 'decline_group', :success => success, :group_id => group_id end end
# File app/controllers/groups_controller.rb, line 124 def decline_request from_web = request.request_method == 'POST' group_id = GroupsUser.get_group_from_obfuscated_id(params[:id]) user_id = GroupsUser.get_user_from_obfuscated_id(params[:id]) success = GroupsUser.decline_request(params[:id]) if !success redirect_to :action => 'stale_request' else GroupsUser.email_hook("membership", group_id, "Member #{User.find(user_id).fullname} rejected from joining #{Group.find(group_id).name}", "The member #{User.find(user_id).fullname} was not allowed to join.", url_for(:controller => 'home', :action => 'index', :only_path => false)) if from_web render :partial => 'group_details', :locals => { :group => Group.find(group_id), :user_id => get_curr_user_id() } else redirect_to :action => 'acknowledge_notification', :type => 'decline_request', :success => success, :group_id => group_id end end end
DELETE /groups/1 DELETE /groups/1.xml
# File app/controllers/groups_controller.rb, line 695 def destroy @group = Group.find(params[:id]) GroupsUser.email_hook("group", @group.id, "Group deleted<EMAIL_ADDRESS>"The group was deleted.", url_for(:controller => 'home', :action => 'index', :only_path => false)) typ = @group.group_type @group.destroy # Also remove the exhibits and discussions from being in the group. exhibits = Exhibit.where({group_id: params[:id]}) exhibits.each { |exhibit| exhibit.adjust_indexing(:leave_group, true) exhibit.group_id = nil exhibit.save! } threads = DiscussionThread.where({group_id: params[:id]}) threads.each { |thread| thread.group_id = nil thread.save! } groupsusers = GroupsUser.where({group_id: params[:id]}) groupsusers.each { |gu| gu.destroy } clusters = Cluster.where({group_id: params[:id]}) clusters.each { |cluster| cluster.destroy } redirect_to self.class.helpers.make_group_home_link(typ) end
# File app/controllers/groups_controller.rb, line 343 def edit_membership show_membership = params[:show_membership] change_owner = params[:change_owner] member_list = params[:group] group_id = params[:id] if member_list member_list.each {|id,value| gu = GroupsUser.find(id) if value['delete'] == 'true' gu.destroy else role = value['editor'] == 'true' ? 'editor' : 'member' if gu.role != role gu.role = role if role == 'editor' gu.notifications = "editor;membership" else gu.notifications = "" end gu.save! end end } end group = Group.find(group_id) group.show_membership = show_membership == 'Yes' if change_owner && change_owner != '0' gu = GroupsUser.find_by_group_id_and_user_id(group.id, change_owner) if gu gu.user_id = group.owner gu.email = User.find(group.owner).email notifications = group.notifications group.notifications = gu.notifications gu.notifications = notifications gu.save group.owner = change_owner end end group.save! GroupsUser.email_hook("membership", group.id, "The membership in #{group.name} has changed", "The membership in #{group.name} has changed.", url_for(:controller => 'home', :action => 'index', :only_path => false)) render :partial => 'group_details', :locals => { :group => Group.find(group_id), :user_id => get_curr_user_id() } end
# File app/controllers/groups_controller.rb, line 403 def edit_thumbnail group_id = params[:id] group = Group.find(group_id) err = Image.save_image(params['image'], group) case err[:status] when :error then flash = err[:user_error] logger.error(err[:log_error]) when :saved then flash = "OK:Thumbnail updated" GroupsUser.email_hook("group", group.id, "Group updated: #{group.name}", "The group was updated.", url_for(:controller => 'home', :action => 'index', :only_path => false)) when :no_image then flash = "ERROR: No image specified" end # image = params['image'] # if image && image # image = Image.new({ :uploaded_data => image }) # end # begin # group.image = image # if group.save # group.image.save! if group.image # GroupsUser.email_hook("group", group.id, "Group updated: #{group.name}", "The group was updated.", url_for(:controller => 'home', :action => 'index', :only_path => false)) # flash = "OK:Thumbnail updated" # else # flash = "Error updating thumbnail" # end # rescue # flash = "ERROR: The image you have uploaded is too large or of the wrong type.
The file name must end in .jpg, .png or .gif, and cannot exceed 1MB in size." # end render :text => respond_to_file_upload("stopEditGroupThumbnailUpload", flash) # This is loaded in the iframe and tells the dialog that the upload is complete. end
# File app/controllers/groups_controller.rb, line 27 def get_all_groups groups = Group.all() ret = [] groups.each { |group| obj = {} obj[:id] = group.get_visible_id() obj[:img] = self.class.helpers.get_group_image_url(group) obj[:title] = group.id obj[:strFirstLine] = group.name if group.show_admins == 'all' editors = group.get_all_editors() editor_label = "Administrator#{'s' if editors.length > 1}: " for editor in editors editor_label += User.find(editor).fullname + ' ' end editor_label += "
" else editor_label = "" end obj[:strSecondLine] = "#{editor_label}Established: #{group.created_at.strftime("%b %d, %Y")}
#{Group.type_to_friendly(group.group_type)} -- #{self.class.helpers.pluralize(group.get_number_of_members(), 'member')}" ret.push(obj) } ret = ret.sort { |a,b| a[:strFirstLine].downcase <=> b[:strFirstLine].downcase } render :text => ret.to_json() end
TODO-PER: I think this is not called.
def create_cluster begin if params['image'] && params['image'].length > 0 image = Image.new({ :uploaded_data => params['image'] }) end cluster = Cluster.new(params[:cluster]) cluster.image = image err = false if cluster.save begin cluster.image.save! if cluster.image rescue err = true cluster.delete flash = "ERROR: The image you have uploaded is too large or of the wrong type.
The file name must end in .jpg, .png or .gif, and cannot exceed 1MB in size." end if err == false GroupsUser.email_hook("group", cluster.group.id, "Group updated: #{Group.find(cluster.group_id).name}", "The group was updated.", url_for(:controller => 'home', :action => 'index', :only_path => false)) flash = "OK:#{cluster.group_id}" end else flash = "Error creating cluster" end rescue flash = "Server error when creating cluster." end render :text => "" # This is loaded in the iframe and tells the dialog that the upload is complete. end
# File app/controllers/groups_controller.rb, line 533 def group_exhibits_list if params[:cluster_id] && params[:cluster_id].length > 0 cluster = Cluster.find(params[:cluster_id]) render :partial => '/groups/group_exhibits_list', :locals => { :group => Group.find(cluster.group_id), :cluster => cluster, :user_id => get_curr_user_id() } else render :partial => '/groups/group_exhibits_list', :locals => { :group => Group.find(params[:id]), :user_id => get_curr_user_id() } end end
# File app/controllers/groups_controller.rb, line 235 def leave_group group_id = params[:group_id] user_id = params[:user_id] GroupsUser.leave_group(group_id, user_id) GroupsUser.email_hook("membership", group_id, "#{User.find(user_id).fullname} left #{Group.find(group_id).name}", "The member #{User.find(user_id).fullname} left the group.", url_for(:controller => 'home', :action => 'index', :only_path => false)) redirect_to :back end
# File app/controllers/groups_controller.rb, line 285 def limit_exhibit exhibit_id = params[:exhibit_id] exhibit = Exhibit.find(exhibit_id) exhibit.adjust_indexing(:limit_to_group, true) exhibit.editor_limit_visibility = 'group' exhibit.save! group = Group.find(exhibit.group_id) GroupsUser.email_hook("exhibit", group.id, "#{group.get_exhibits_label()} visibility limited in #{group.name}", "#{get_curr_user_name} limited the exhibit #{exhibit.title} to group visibility.", url_for(:controller => 'home', :action => 'index', :only_path => false)) cluster = exhibit.cluster_id == nil ? nil : Cluster.find(exhibit.cluster_id) render :partial => 'group_exhibits_list', :locals => { :group => Group.find(exhibit.group_id), :cluster => cluster, :user_id => get_curr_user_id() } end
# File app/controllers/groups_controller.rb, line 331 def notifications levels = params[:notifications] group_id = params[:group_id] notes = [] levels.each {|key, val| notes.push(key) if val == "true" } user_id = get_curr_user_id() GroupsUser.set_notifications(group_id, user_id, notes) render :partial => 'group_details', :locals => { :group => Group.find(group_id), :user_id => user_id } end
# File app/controllers/groups_controller.rb, line 91 def pending_requests items = params[:group] group_id = params[:id] items.each { |key, val| if val == 'accept' GroupsUser.accept_request(key) elsif val == 'deny' GroupsUser.decline_request(key) end } render :partial => 'group_details', :locals => { :group => Group.find(group_id), :user_id => get_curr_user_id() } end
# File app/controllers/groups_controller.rb, line 309 def reject_as_peer_reviewed comment = params[:comment] exhibit_id = params[:exhibit_id] exhibit = Exhibit.find(exhibit_id) exhibit.is_published = 4 exhibit.save! group = Group.find(exhibit.group_id) GroupsUser.email_hook("exhibit", group.id, "#{group.get_exhibits_label()} \"#{exhibit.title}\" in \"#{group.name}\" needs revision.", "#{get_curr_user_name} returned the #{group.get_exhibits_label()} \"#{exhibit.title}\" for further revisions before being accepted as peer-reviewed.\n\nThe Editors included this message in their review:\n\n#{comment}", url_for(:controller => 'home', :action => 'index', :only_path => false)) user = exhibit.get_apparent_author() editor = current_user group = Group.find(exhibit.group_id) GenericMailer.generic(editor.fullname, editor.email, user.fullname, user.email, "Revisions Needed to #{group.get_exhibits_label()} \"#{exhibit.title}\"", "The editors of #{group.name} have returned your #{group.get_exhibits_label()} with suggested revisions, listed below. Please log into your account and review them at your earliest convenience.\n\n#{comment}", url_for(:controller => 'home', :action => 'index', :only_path => false), "").deliver cluster = exhibit.cluster_id == nil ? nil : Cluster.find(exhibit.cluster_id) render :partial => 'group_exhibits_list', :locals => { :group => group, :cluster => cluster, :user_id => get_curr_user_id() } end
# File app/controllers/groups_controller.rb, line 394 def remove_profile_picture id = params[:id] group = Group.find(id) group.image = nil group.save GroupsUser.email_hook("group", group.id, "Thumbnail removed from #{group.name}", "#{get_curr_user_name} has removed the thumbnail image from #{group.name}.", url_for(:controller => 'home', :action => 'index', :only_path => false)) redirect_to :back end
# File app/controllers/groups_controller.rb, line 389 def render_license @group = Group.find(params[:id]) render :partial => 'group_license', :locals => { :group => @group, :user_id => get_curr_user_id() } end
# File app/controllers/groups_controller.rb, line 243 def request_join group_id = params[:group_id] user_id = params[:user_id] url_accept = url_for(:controller => 'groups', :action => 'accept_request', :id => "PUT_ID_HERE", :only_path => false) url_decline = url_for(:controller => 'groups', :action => 'decline_request', :id => "PUT_ID_HERE", :only_path => false) url_home = url_for(:controller => 'home', :action => 'index', :only_path => false) GroupsUser.request_join(group_id, user_id, url_accept, url_decline, url_home) render :partial => 'group_details', :locals => { :group => Group.find(group_id), :user_id => user_id } end
GET /groups/1 GET /groups/1.xml
# File app/controllers/groups_controller.rb, line 464 def show @group = Group.find_by_visible_url(params[:id]) if @group == nil @group = Group.find_by_id(params[:id]) end if @group == nil #redirect_to "/404.html" render_404 return end respond_to do |format| format.html # show.html.erb format.xml { render :xml => @group } end end
# File app/controllers/groups_controller.rb, line 81 def sort_cluster session[:sort_cluster] = params[:sort] group_exhibits_list() end
# File app/controllers/groups_controller.rb, line 86 def sort_exhibits session[:sort_exhibit] = params[:sort] group_exhibits_list() end
# File app/controllers/groups_controller.rb, line 297 def unlimit_exhibit exhibit_id = params[:exhibit_id] exhibit = Exhibit.find(exhibit_id) exhibit.adjust_indexing(:limit_to_everyone, true) exhibit.editor_limit_visibility = 'www' exhibit.save! group = Group.find(exhibit.group_id) GroupsUser.email_hook("exhibit", group.id, "#{group.get_exhibits_label()} visibility not limited in #{group.name}", "#{get_curr_user_name} removed the visibility limitation on the #{group.get_exhibits_label()} #{exhibit.title}.", url_for(:controller => 'home', :action => 'index', :only_path => false)) cluster = exhibit.cluster_id == nil ? nil : Cluster.find(exhibit.cluster_id) render :partial => 'group_exhibits_list', :locals => { :group => Group.find(exhibit.group_id), :cluster => cluster, :user_id => get_curr_user_id() } end
# File app/controllers/groups_controller.rb, line 265 def unpublish_exhibit comment = params[:comment] exhibit_id = params[:exhibit_id] exhibit = Exhibit.find(exhibit_id) exhibit.adjust_indexing(:unpublishing, true) exhibit.is_published = 0 exhibit.save! user = exhibit.get_apparent_author() editor = current_user group = Group.find(exhibit.group_id) GenericMailer.generic(editor.fullname, editor.email, user.fullname, user.email, "#{group.get_exhibits_label()} \"#{exhibit.title}\" Unpublished", "The editors of #{group.name} have unpublished your #{group.get_exhibits_label()} with suggested revisions, listed below. Please log into your account and review them at your earliest convenience.\n\n#{comment}", url_for(:controller => 'home', :action => 'index', :only_path => false), "").deliver GroupsUser.email_hook("exhibit", group.id, "#{group.get_exhibits_label()} unpublished in #{group.name}", "#{editor.fullname} has unpublished the #{group.get_exhibits_label()} #{exhibit.title}.", url_for(:controller => 'home', :action => 'index', :only_path => false)) cluster = exhibit.cluster_id == nil ? nil : Cluster.find(exhibit.cluster_id) render :partial => 'group_exhibits_list', :locals => { :group => group, :cluster => cluster, :user_id => get_curr_user_id() } end
PUT /groups/1 PUT /groups/1.xml
# File app/controllers/groups_controller.rb, line 616 def update @group = Group.find(params[:id]) if params[:group] params[:group][:show_membership] = true if params[:group][:show_membership] == 'Yes' params[:group][:show_membership] = false if params[:group][:show_membership] == 'No' if params[:group][:group_type] == 'peer-reviewed' params[:group][:group_type] = 'community' peer_review_request() elsif params[:group][:group_type] == 'classroom' @group.university = @group.name if (@group.university.length == 0) @group.course_name = @group.name if (@group.course_name.length == 0) @group.course_mnemonic = @group.name if (@group.course_mnemonic.length == 0) end @group.update_attributes(params[:group]) end err_msg = nil if params[:emails] err_msg = validate_email_list(params[:emails]) if !err_msg.nil? render :text => err_msg, :status => :bad_request return end end if params[:emails] || params[:usernames] invitor = current_user() if invitor.nil? err_msg = "You must be logged in to invite users" else url_accept = url_for(:controller => 'groups', :action => 'accept_invitation', :id => "PUT_ID_HERE", :only_path => false) url_decline = url_for(:controller => 'groups', :action => 'decline_invitation', :id => "PUT_ID_HERE", :only_path => false) url_home = url_for(:controller => 'home', :action => 'index', :only_path => false) err_msg = @group.invite_members(invitor.fullname, invitor.email, params[:emails], params[:usernames], url_accept, url_decline, url_home) end end if params[:group] # this may be nil if we are just inviting people. which = params[:group].keys.join(" and ") values = self.class.helpers.strip_tags(params[:group].values.to_a().join("\n\n")) GroupsUser.email_hook("group", @group.id, "Group updated<EMAIL_ADDRESS>"#{get_curr_user_name} has updated the field \"#{which}\" in<EMAIL_ADDRESS>url_for(:controller => 'home', :action => 'index', :only_path => false)) end if err_msg == nil if params[:group] && params[:group][:forum_permissions] != nil render :partial => 'group_discussions_list', :locals => { :group => @group, :user_id => get_curr_user_id } else render :partial => 'group_details', :locals => { :group => @group, :user_id => get_curr_user_id } end else render :text => err_msg, :status => :bad_request end end
# File app/controllers/groups_controller.rb, line 436 def verify_group_title creator = current_user if creator.nil? render :text => "Your session has expired. Please log in and try again.", :status => :bad_request else title = params[:name] group = Group.find_by_name(title) if group == nil render :text => "ok" else render :text => "There is already a group with this title.", :status => :bad_request end end end


class Solution: def minimumTimeRequired(self, jobs: List[int], k: int) -> int: if not jobs or k == 0: return 0 self.ans = 0x7fffffff jobs.sort(reverse=True) times = [jobs[i] for i in range(k)] def solveByDfs(job): if job >= len(jobs): self.ans = min(self.ans, max(times)) return for j in range(k): times[j] += jobs[job] solveByDfs(job + 1) times[j] -= jobs[job] solveByDfs(k) return self.ans


--- title: MarkdownMerge keywords: fastai sidebar: home_sidebar summary: "API details" ---
Specify from_addr
and to_addrs
as either a string, or an Address
object (created with get_addr
). Note the to_addrs
is a list.
from_addr =<EMAIL_ADDRESS>'Jeremy Howard')
to_addrs =<EMAIL_ADDRESS>'Jeremy')]
Your message should be in markdown format. It will be converted into a two part email, containing both a plain text and an HTML part, so recipients will see whatever format they're set as their preference for viewing mail. Anything in curly brackets {}
will be replaced with the contents of the inserts dictionary for that address. If there are no bracketed variables to replace, then you don't need to pass any inserts.
msg = """
**Hello there!**
Here is your special message: *{special}*
"""
inserts
is a list of dictionaries. For each dictionary, the keys should match the bracketed names in your email template, and the values will be filled in to those sections.
inserts = [{'special': "You are special."}]
ml = MarkdownMerge(to_addrs, from_addr, 'A message', msg=msg, inserts=inserts)
In the above example, we didn't specify any server_settings
, so settings will be read from mail_settings.py
. This is in Django settings format, so you can find complete docs for what can be provided in the Django mail help. A sample settings file is provided in the markdown_merge repo.
Alternatively, pass a dictionary to server_settings
with the required keys, for instance:
cfg = dict(EMAIL_HOST='smtp.fastmail.com', EMAIL_PORT=465,
<EMAIL_ADDRESS>EMAIL_HOST_PASSWORD='XXX', EMAIL_USE_SSL=True)
ml.set_test(True)
ml.send_msgs(pause=0.5)
Use pause
to avoid sending too many messages too quickly; many SMTP servers restrict sending speed to avoid abuse. If you get an error during sending (e.g. "too many messages"), then wait an hour or so, then continue sending, using a larger pause
value.
NB: You can just call send_msgs
again when resending, since the successfully sent message count is saved, and those messages are not re-sent (unless you call reset
). This includes test sends, therefore you should run reset after a test send.
ml.reset()
eml = md2email("hi", from_addr, to_addrs, msg)
The basic email body is the plain text message (note that the template variables in {}
will be filled in by MarkdownMerge
):
print(eml.body)
Most email software is set up to display the HTML version:
from IPython.display import HTML
html,mimetype = eml.alternatives[0]
HTML(html)


NOTE: This is the frontend of the repository. To access the backend repository, refer to Perfect-Personnel-Placement/backend.
The project is only built for Android. While we also worked on the P3 with iOS in mind, certain components get off-centered in iOS and all the bugs have not been fleshed out.
The APK and the QR Code only work for Android Devices.
The Serverless Training planner is a serverless mobile app that Revature managers can use to look at important information regarding clientele demands and batch output for the company. This service visualizes all current batches planned along with any associated information. It also visualizes that batch output alongside the client demand for associates. Managers may input information for clients, their demands, and batches which consist of a curriculum composed of skills, the number of associates, a trainer, and the dates for the batch. This service helps ease the management of supply and demand for the company and is an organizational aid.
Upon a delete action, the user will prompted to confirm if they want to delete the item for form validation which is evident accross the application. However, the curricula components would need to be refactored to get form validation on the curricula screen. Upon an add or update/edit action, a notification will appear coming from the bottom of the device that the user's action has been successfully processed.
Quick and Easy Use: https://expo.dev/@mat2718/frontend In order to run P3, please install the Expo Go app on your android mobile device. Then, using the Expo Go app, scan the QR code below:
Other Methods:
There is no login screen so expect the batches screen upon startup.
To clone the repository, run the following command in your terminal:
https://github.com/Perfect-Personnel-Placement/frontend.git
Alternatively, if you have Github Desktop, you can click on Code and Open with Github Desktop. Be sure NodeJS is installed as well as a text editor. We used Visual Studio Code.
To check if NodeJS and Node Package Manager installed correctly, run the following command:
node --version
npm --version
Both should result in a version display. Once installed, open up the root of the repository and install P3's dependencies:
npm install
This will read from the package.json and install listed dependencies, including React and TypeScript.
Following the dependency installation, we recommend installing the expo-cli globally:
npm install -g expo-cli
At this point, everything should be ready to run the application. Run in the root directory:
npm start
Then, a new tab will appear in your browser giving you several methods of running the application. You may use iOS during development; however, we do not have a developer's license for iOS which is why the current iteration of P3 can only be run on an android device.
For more information on key components, visit the COMPONENT.md in the root.
The following main screens can be navigated to through the bottom navigation.
Upon starting the application, the first page the user sees is the Batches Main Screen. The bar graph that appears represents the number of active trainers and batches as well as planned and inactive batches and trainers respectively. Below displays all batches; however, the user can click on the downward carot icon to display a dropdown of different filters (All Batches, Active Batches, Upcoming Batches, Completed Batches).
The add screen which is the second screen above can be navigated to by clicking on the Add Batch button in the top right of the screen. The user may fill out the required inputs and click Add to confirm the batch. If the user does not not fill in a size or if the start date is greater than or equal to the start fate, a message from the bottom of the screen will come up notifying the user that the input fields are invalid.
To view a Batch, click on one of the batches and you will the third screen as shown above. Here, the user will see the name of the batch and its information associated with it, the number of skills assigned, and the status of the batch. The user may also delete a batch where they will prompted with an alert or choose to edit a batch by clicking on the pencil icon in the top left of the screen adjacent to the name of the batch.
The fourth screen displays the Edit Batch screen, where the user may edit the curriculum name, the trainer assigned to the batch, the batch size, and the start/end date. To navigate back from the subscreens, click on the back arrow on the header on the top left of the screen.
The Main Client Screen as seen in the first photo above is a list of all the clients. Each client is clickable and you may navigate to a specific client or add a client. The add client screen as shown in the second photo above is just a text field where you may add a client and hit add to send it to the database. The third photo is if you navigate by clicking on a specific client. Finally, the user may add a demand by clicking on the Add Demand button and it will navigate to the fourth screen.
The Main Curricula Screen displays all created curricula. Each curriculum is expandable, meaning if you click on the curriculum more information will be displayed as shown from the first photo above. If you click on Add Curriculum, it will navigate to the second photo as seen above where the user may add a curriculum.
Form validation has not been implemented on this screen.
The Main Trainer screen (as shown in the first photo above) displays all trainers in the database. Each trainer has a picker on the right side of its container where the user may choose to edit or delete the trainer. If the user chooses to delete the trainer, they will be prompted with an alert to confirm if they want to delete the trainer as shown in the second photo above. The user may also choose to search for a trainer using the search bar.
If the user chooses to edit the trainer, they will navigate to the third screen above where they can edit the first name, last name, and email of the trainer. The fourth screen is what happens if you click on Add Trainer which contains the same contents as the Edit Trainer Screen. Upon submitting a trainer, the fields will be cleaned up and you may add another trainer or return to the main trainer screen.
Note: A user can only delete a trainer that has not been added to a batch. To remove that trainer, the batch the trainer is mapped to needs to be deleted before deleting the trainer.
To access the drawer, either slide from the left side of the screen or click on the hamburger icon on the top left side of the screen. The following screens can only be navigated to through the drawer.
If the user clicks on supply vs Demand in the Drawer, the application navigates the user to the above screen. Here is a graphical representation of the Clients demands vs the number of Associates in training. The default is All Curricula but if the user clicks on the picker, it will display all the curriculum the user may choose to filter the chart with.
Skills is the other choice the user may navigate to from the drawer. The first photo is the Main Skills Screen where each skill can be deleted by clicking on the picker on the right side of the container. The user may also choose to add a skill by clicking on the Add Skill button, where they will navigate to the second screen above.
Generated using TypeDoc


The Dendrobatidae family is a fascinating family and with proper care,you can keep these amazing animals in your very own home! The Dendrobatidae family is composed of 13 genera, including the Dendrobates, the Phyllobates, the Oophaga, and many others.
People have been keeping dart frogs in the US since the 1990s. Ever since then,the hobby has only grown. Starting out with less than 10 species imported regularly, the US dart frog hobby now is almost completley self-sustaining, with over 20 species captive-bred and at least five species that are still being imported. The hobby's biggest forum is Dendroboard, with almost 23 thousand members, but many more people keep dart frogs and are not members of this amazing forum. Many people also have their own buisnesses that sell dart frogs, and a few do make an actual living.
The dart frog hobby can be truly rewarding, but only with time and patience. Welcome to the Dart Frog Hobby!


private fun clearChildren(): Unit
Removes references to child nodes, essentially making this node a leaf node.


Pluto
Facts
- When the pluton is far from the sun, the place is covered with ice, as the sun approaches, a subtle atmosphere is formed and the place is covered with black dust.
- There is a heart-shaped region on it.
- Its satellites is Charon, Nix, Hydra, Styx, Kerberos.
- Pluto is the god of death in Roman mythology and his satellite Charon is the ferryman that provides the transition between life and death in Greek mythology.
- It is the second largest dwarf planet.
- The average orbital speed is 4.67 km/h.
- The gravity is 0,62 m/s*s
- The heart-shaped area has been sterilized in order to protect the live development of the planet and the incoming visitors.
- Clyde Tombaugh's ashes are found in the pluton because he can't see the spacecraft being thrown into the pluton.
History
- Pluto was discovered by Clyde Tombaugh in 1930 as the ninth planet from the Sun.
- International Astronomical Union (IAU) to define the term "planet" formally in 2006, during their 26th General Assembly. That definition excluded Pluto and reclassified it as a dwarf planet.
- On April 26, 2024, George Terry set his foot on Pluto.
- On July 15, 2033, the first settlements began.
Highlights
- Cave Tourism: The caves formed by the ocean layer beneath the ice layer and meteorological events have a magnificent view.
- Ash Museum And Ash Cemetery: A visit to the cemetery with the ashes of Clyde Tombaugh and the graves with the ashes of the couples.
- Rocket Trip Around The Planet: The opportunity to see the moons better during the flight around the planet and a romantic meal on the heart shape.
- Ice Skating Lessons And Ice Skating Competition: Artistic ice skating training for couples during the trip and surprise prizes to be given at a competition at the end of the trip.
- Ice Sculptures: A huge area full of ice sculptures!
- Science: Science bases outside the sterile area.
Precaution
- Life becomes quite difficult due to adverse conditions that occur during the transition of the seasons. There are special shelters for these situations.
- We offer a special sprey-product for scientists doing field studies outside the sterile area for safety.
Products
Heat Sensitive Color Changing Cup
When the liquid inside the cup is hot.
When the liquid inside the cup is warm.
When the liquid inside the cup is cold.


- NEW_IMAGE_SIZE - Static variable in class assignment.PreviewMaker
-
- newFrame() - Method in class assignment.BoardModel
-
Creates a new blank frame after the current frame that the user is
working with.
- newFrame() - Method in class assignment.SuiteCanvas
-
Passes the call to create a new frame.
- newFrameMenuItem - Variable in class assignment.SuiteDirector
-
- newGrid(int, int, MyColor) - Method in class assignment.Model
-
Creates a new grid
based on the current project size (or new
size) and with whatever colour requested by the call.
- newMenuItem - Variable in class assignment.SuiteDirector
-
- newProject(int, MyColor) - Method in class assignment.BoardModel
-
Makes a full new blank project for the user.
- newProject(int, MyColor) - Method in class assignment.SuiteCanvas
-
Creates a full new blank project.
- newProject() - Method in class assignment.SuiteDirector
-
Creates a new project
- NewProjectMenu - Class in assignment
-
Sets up a JPanel
to be called by the 'New Project'
MenuItem
in SuiteDirector
.
- NewProjectMenu() - Constructor for class assignment.NewProjectMenu
-
Sets up all of the attributes and components of the menu, ready to be
called.
- newProjectPanel - Variable in class assignment.NewProjectMenu
-
- newProjectPanel - Variable in class assignment.SuiteDirector
-
- nextFrame() - Method in class assignment.Model
-
Jumps to the next frame in the sequence (supposing there are more after
the current).
- nextFrame() - Method in class assignment.SuiteCanvas
-
Passes on the call to jump to the next frame to board
and
updates the values/display.
- nextFrameMenuItem - Variable in class assignment.SuiteDirector
-
- noRecentEntries - Variable in class assignment.RecentItemsMenu
-
The menu item that is used to indicate that there aren't any recent
entries.


We are currently testing a beta UI for creating and editing of instances. You can switch and test this new UI with the toggle above. You can always switch back to legacy UI during this test phase.
We are currently testing a beta UI for creating and editing of instances. You can switch and test this new UI with the toggle above. You can always switch back to legacy UI during this test phase.


Generate Another Link This gift link has been marked as sent in your campaign. It can be redeemed only once.


Source code for lift.lift
"""
Code for the RD4B subsystem.
This file contains code for the RD4B lift subsystem, including helper functions
to make working with the lift easier from both autonomous and teleop control
modes. It also has functionality for reading config values from Preferences.
:Author: Brandon Gong
:Version: 0.0.1
:Date: January 19, 2018
"""
from ctre.talonsrx import TalonSRX
import wpilib
import math
[docs]class RD4BLift:
"""
This class contains helper functions for manipulating the position of the
RD4B lift.
Parameters:
left_id: the ID number of the left talon.
right_id: the ID number of the right talon.
"""
#: Length for one segment of the arm. As of the time this comment
#: was written a segment is 30 inches long.
ARM_LENGTH = 30
def __init__(self, left_id, right_id):
"""
Create a new instance of the RD4B lift.
Calling this constructor initializes the two drive motors and
configures their control modes, and also loads the configuration
values from preferences.
"""
# Create new instances of CANTalon for the left and right motors.
self.left_motor = TalonSRX(left_id)
self.right_motor = TalonSRX(right_id)
# The right motor will follow the left motor, so we will configure
# the left motor as Position control mode, and have the right motor
# follow it.
self.left_motor.configSelectedFeedbackSensor(
TalonSRX.FeedbackDevice.Analog, 0, 0
)
self.left_motor.selectProfileSlot(0, 0)
self.right_motor.set(TalonSRX.ControlMode.Follower, left_id)
# finally, load the configuration values.
self.load_config_values()
[docs] def load_config_values(self):
"""
Internal helper function for configuration values.
This function loads/reloads configuration values from Preferences.
The necessary keys that need to be defined are:
- "lift potentiometer horizontal angle"
- "lift potentiometer base angle"
- "lift limit up"
This function also precalculates values that are used throughout the
code and sets soft limits for the motor based on encoder values.
"""
# get the preferences instance.
preferences = wpilib.Preferences.getInstance()
# get the encoder value when the bars are horizontal and form right
# angles. This is used for calculations.
self.HORIZONTAL_ANGLE = preferences.getFloat("lift potentiometer horizontal angle", 0) # noqa: E501
# get the encoder value when the RD4B is in the fully down position.
self.initial_angle = preferences.getFloat("lift potentiometer base angle", 0) # noqa: E501
# pre-convert the initial angle to radians and take the sin of the
# angle.
self.INITIAL_ANGLE_RADIANS_SIN = math.sin(
(self.initial_angle - self.HORIZONTAL_ANGLE) / 512 * math.pi)
# get the upper limit of the encoder, or the encoder value when the
# RD4B is fully extended upward.
self.LIMIT_UP = preferences.getFloat("lift limit up", 0)
# set the soft limits to LIMIT_UP and the initial angle. the motors
# should not go outside of this range.
self.left_motor.configForwardSoftLimitThreshold(self.LIMIT_UP, 0)
self.left_motor.configReverseSoftLimitThreshold(self.initial_angle, 0)
[docs] def fully_extend(self):
"""
Fully extend the RD4B upward.
This function runs the motor to the LIMIT_UP position.
"""
self.left_motor.set(TalonSRX.ControlMode.Position, self.LIMIT_UP)
[docs] def fully_retract(self):
"""
Fully retract the RD4B to the lowest position.
This function runs the motor to the initial_angle position.
"""
self.left_motor.set(TalonSRX.ControlMode.Position, self.initial_angle)
[docs] def set_height(self, inches):
"""
Set the height for the RD4B lift.
Given a height to move to in inches, this function will calculate the
angle the motor needs to run to and apply it. The angle is calculated
by this equation:
.. math::
\\theta _f = \\sin^{-1}(\\frac{\\Delta H}{2 l_{arm}}
+ \\sin(\\theta_i))
Args:
inches: the height in inches to move the RD4B to.
"""
# calculate the final angle as per the equation given above.
final_angle_radians = math.asin(
inches / (2 * self.ARM_LENGTH) + self.INITIAL_ANGLE_RADIANS_SIN)
# convert this final angle from radians to native units.
native_units = (
(final_angle_radians * 512 / math.pi)
+ self.HORIZONTAL_ANGLE
)
# set the left motor to run to this position (the right motor will
# follow it)
self.left_motor.set(TalonSRX.ControlMode.Position, native_units)
[docs] def getHeight(self):
"""
Get the height of the RD4B.
This function will get the angle of the RD4B from the encoder and
convert this to a height given this equation:
.. math::
\\Delta H = 2 l_{arm} (\\sin(\\theta_f) - \\sin(\\theta_i))
Returns:
The height of the RD4B at the time this function is called.
"""
# get the final angle from the encoder, and convert to radians.
final_angle_radians = (
(self.left_motor.getSelectedSensorPosition(0) - self.HORIZONTAL_ANGLE) # noqa: E501
* 512 * math.pi
)
# calculate the height of the RD4B using the final angle and based on
# the given equation.
height = 2 * self.ARM_LENGTH * (
math.sin(final_angle_radians) - self.INITIAL_ANGLE_RADIANS_SIN
)
return height
[docs] def isMovementFinished(self):
"""
Check if the RD4B is in motion.
This function gets the closed loop error, which will be very small if
the motor is not currently in motion.
Returns:
True if the RD4B is not in motion
False if the RD4B is currently still in motion.
"""
return self.left_motor.getClosedLoopError(0) < 10
[docs] def stop(self):
"""
Stop the RD4B, no matter what position it is in currently.
This can be used as an emergency stop in the case of an encoder
breaking, but it can also be used for general purposes if needed.
"""
# change the control mode to percent vbus and then set the speed to 0.
self.left_motor.set(TalonSRX.ControlMode.PercentVBus, 0)


Yoobee Video Player
play_circle_outline
pause_circle_outline
stop
volume_up
volume_off
Youtube Playlist ID
Done
Change playlist
menu


STEM Space is the project that is closest to my heart. It grew my interest towards UX and product creation. I conceived the idea for this at an Aggies Invent(48-hour innovation competition). The prompt was to interest children in STEM education. I further took this product to Startup Aggieland and tested it through the lean startup methodology and thus understanding more about the entrepreneurial process.
The development of this process has gone through several iterations, from the initial prototype (seen above) which simply focused on science experiments and gamification to interest students to understanding the true customer problem through the lean startup process. I interviewed 100 potential customers, ranging from teachers, Parents and even children to truly begin to understand the magnitude of the problem. I paused work on the project for a few months to gain a deeper understanding of the problem and reflect on why I got the feeling that I was missing something key. During this I reframed the problem and sought to find how educators are approaching this problem now and I came across Project Based Learning conepts. Gathering this information I re-brainstromed to assess what the real value of the product is.
The product now involves a multi-sided market of both teachers, students and even involving the parents to an extent. The idea stands on three aspects
The essense here is to digitize Project Based Learning. focus formative assessment through reflections and content focusing on key knowledge and success skills. The social and gamification features exists solely to sustain interest and build on student enquiry.


Payments
Add membership payment
Accounting
Members
Add member
Events
Events Attending
Add event
Main
Messaging
Settings
Logout
Accounting
Load expenditure
Load payments
Add expenditure
Add payment
Item Search...
Add member
×
Username
Email address
User type
Standard
Admin
Password
Add event
×
Title
Description
Date and Time
Location
Approved?
No
Yes
Membership Payment
×
Card Holder Name
Credit or debit card
Add expenditure
×
Name of item
Description
Date and Time
Location
Which member is this outgoing from?
Add payment
×
Date and Time
Was this payment in person?
Yes
No
Form of payment
Donation
Membership Payment
Other
Which member is this a payment from?
Value
Description
Edit Expenditure
×
Item
Description
Date and Time
Location
Which member is this a payment from?
Are you sure you want to delete this expenditure?
×
Enter your password:
Edit Payment
×
Description
Date and Time
Was this payment in person?
No
Yes
Which member is this a payment from?


Secret identifier can be found on Azure Portal.
Secret value must be a Base64 encoded PKCS#12 file with content type set to application/x-pkcs12
.
It must also be protected by a non-empty password(both for private key and PFX container) due to restriction of Java security library.
When uploading to Azure, choose Manual as upload option to avoid password being stripped.
You can convert your certificate to PKCS#12 format using OpenSSL:
openssl pkcs12 -inkey key.pem -in cert.pem -export -out cert.pfx
base64 < cert.pfx > cert.pfx.b64
Then you can paste the content of cert.pfx.b64
into secret value field on Azure Portal.


Client HealthCheck chrome App
Upload client health check config file
Diagnostics
URL
Info
{{urlObj.url}}
{{urlObj.errorMessage}}
OS
Supported
Browser
Supported
{{ua.os}}
{{ua.browser}}
Screen Resolution
Supported
{{width}} X {{height}}


{{ member.name}}
{% assign photo = member.name | remove: " " | append: ".png" | prepend: "/images/members/" | absolute_url%}{{ member.paragraph}}
--- title: Team - Viridian Robotics stylesheets: - style.css --- {% include head.html %}
{% include navigation.html %}{{ member.paragraph}}
{{ member.paragraph}}


Public school funding in the United States comes from federal, state, and local sources, but because nearly half of those funds come from local property taxes, the system generates large funding differences between wealthy and impoverished communities. Such differences exist among states, among school districts within each state, and even among schools within specific districts.
Source: National Center for Education Statistics, 1998, pp. 103–104.
Total Per-Student Expenditures Versus Student Poverty Rates for U.S. School Districts with More Than 1,000 Enrollment
Source: Prepared using information from the Common Core of Data for 1995, School District Data Book, National Center for Education Statistics (2000b).
Schools are far worse in some places than others
Abuse and familial connections
reveal.js comes with a few themes built in:
Black (default) -
White -
League -
Sky -
Beige -
Simple
Serif -
Blood -
Night -
Moon -
Solarized
Themes created by Levi Sands
Udub -
USU -
Uiowa -
Gonzaga -
EWU


?6
7
8
9
10
XT
v
The
New
\bRK
copyright
reserved
Botanical
Garden
iEW
YO
BOTANICAL
¨ARDEH
New
York
Botanical
Garden
1^23500
Locality:
Near
PORT
HENDERSON*
Altitude:
100Ñ300
ft*
Date:
November
26,
1974
Habitat:
In
rocky
thickets*
Notes:
Sprawling
herb;
flowers
yellow*
Collector:
George
R*
Proctor
No.
34365
INSTITUTE
OF
JAMAICA
FLORA
OF
JAMAICA
Parish:
ST.
CATHERINE
Name:
.
flentzelie
aspera
L*
The
University
of
Texas
Herbarium
(LL,
TEX)
Mentzelia
aspera
L.
Det:
B.
L.
Turner,
7
Feb
2001
1623500
Legend -
Level of confidence that token is an accurately-transcribed word
extremely low
very low
low
undetermined
medium
high
very high


The Matrix: virtual messiah
The most successful use of the messiah-figure in movie-land so far has to be Star Wars, where young Luke 'redeems' that far away galaxy. And of course the narrative arc associated with the messianic character is the monomythic cycle, per Joseph Campbell, whom Lucas supposedly read heavily. Meaning Star Wars was no accident (i.e., was already ingrained into our cultural unconscious). Neither is the Wachowski brothers' (Andy & Larry, best know for Bound) The Matrix, which, instead of picking and choosing from the monomyth per Lucas, instead just uses it all, from the 'parentless' birth to the prophesied appearance to the ability to transcend reality. The messiah here even dies and gets reborn, which means, yes, this has all been done before. Thing is, though, it's never been visually-realized so well, from the opening frame on.
It all starts with a nifty little showcase of the Gap-commercial camerawork we know from the trailer, which provides perhaps the best opening-action sequence around, counting Bond. The woman in black is Trinity (sci-fi newbie Carrie-Anne Moss), and, while the special effects do get all the attention, they also serve a second purpose: to make us wonder just how she can pull them off. Meaning there's already a question to be answered, a mystery to be solved, which in narrative terms translates as a compelling reason to move forward. By the end of that opening sequence, we're hooked. And it only gets better (or, the mystery, as all good mysteries must, only deepens).
Cut now to Neo (Keanu Reeves, already at home in the sci-fi future, via Johnny Mnemonic, even Bill & Ted), our messiah, a cubicle-sitter by day, minor league computer hacker by night. It's his night job where he really lives, where he hears whisperings of the 'Matrix,' and some shadowy terrorist figure called Morpheus (sci-fi veteran Laurence Fishburne). But whisperings aren't enough: like Kirstun Dunst in Interview with the Vampire, he wants some more. Soon enough he gets it, gets pulled into answering the mind-bending question Donald Sutherland asked a long time ago in Body Snatchers: What if this world is just nested in another world, which is nested in another world, and on and on? He's introduced to the question--introduced to the 'Matrix'--by none other than Morpheus, who dresses it all up like a Through the Looking Glass experience. You almost expect Grace Slick to punctuate the background for us some, but the Wachowski bros. are able to reel it all in nicely, put the white rabbit on someone's arm instead of onto the soundtrack. It all makes sense if you pay just a little attention.
Once you're in on the secret then, (real, or Memorex?) everything shifts into overdrive. Lots of spaghetti-western hero shots, with Neo's overcoat whipping dramatically (see Cage in Face-Off for more shots like this). Lots of gunplay and techtalk. Lots of stepping into and out of realities, per Millennium (1989) or 12 Monkeys. Even a little romance. The Matrix simply has it all, and then some; you'll want to see it twice, at least. And yes, it does get a little gun-heavy for a while, but this is an action film, after all. Slow-motion leadslinging is part of the package. And the spent cartridges never quite rise above story-level, anyway, but not so much because there's not a lot of cartridges to spend, but simply because there's so much story there in the first place. That is what drew us to Star Wars, after all, yes? The Matrix, though not a space opera, is just as good, and has the added bonus of updated effects technology. The only place Star Wars might have a clear advantage, really, is that Lucas didn't tack an unnecessary coda on, where the Wachowski bros did. Minus those four or five seconds at the end, however, The Matrix is the best sci-fi to come along since Bladerunner. Just a lot louder.
(c) 1999 Stephen Graham Jones, http://www.cinemuck.com
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Do you need help for your Notes8 composite applications?
This is an IBM announcement our marketing manager asked me (very nicely) to publish here.
The recent release of the IBM Lotus Notes and Domino 8 platform gives developers more integration and business solution options than ever before. To celebrate this extensibility we would like to offer our Business Partners free access to Lotus development specialists who will assist you in creating Notes and Domino 8 business solutions.
Your existing solutions will continue to run in Lotus Notes and Domino 8 without modification -- all new integration options supplement existing application development capabilities. Our Lotus development specialists will work with you to explore possible integration scenarios and guide you through the details of this new set of integration options including:
The Composite Application Framework
The Lotus Notes 8 platform allows developers to build reusable, loosely coupled components which can be assembled into composite applications. These reusable components can be created from NSF, Eclipse or IBM Lotus Expeditor technology. Our specialists can evaluate your requirements and propose strategies for developing reusable components or improving integration with a composite application.
The Sidebar and Toolbar
The Lotus Notes 8 sidebar and toolbar are in the end user's sight at all times so they provide an excellent opportunity to display a ubiquitous view of your application or service. Our specialists can show you how to integrate components of your solution into the sidebar and toolbar most effectively. Work you've done developing for Lotus Sametime Connect will pay dividends here as well -- most plug-ins developed for IBM Lotus Sametime 7.5.1 are compatible with Lotus Notes 8.
Web Services
Lotus Notes and Domino 8 provide comprehensive support for web services producers and consumers on the Notes client and Domino server. Our specialists show you how to incorporate your web services in Notes and Domino applications to capitalise on existing IT investments and realise a service-oriented architecture.
Lotus Domino and DB2 Integration
Lotus Domino 8 provides a fresh opportunity for Business Partners with relational database experience and solutions. With Lotus Domino and DB2 integration developers can expose NSF data for relational use and list DBMS data in views and embedded views. Our specialists can discuss the possibilities afforded by this integration such as report generation and integration with other relational data stores.
To learn more about all that Lotus Notes and Domino 8 has to offer, please have a look at " Building on the evolution of people-centric applications" or " Creating business flexibility with IBM Lotus application development software" on the Lotus Notes and Domino developer site. For more information on composite applications see the composite applications page on developerWorks, or the composite applications blog.
If you'd like to find out more about how we can help you take advantage of Lotus Notes and Domino 8 please email us at<EMAIL_ADDRESS>We'll coordinate a follow-on call to review your needs and get you started right away.
At Lotusphere 2008 we will be looking to highlight Business Partner solutions that exploit the new integration possibilities in Lotus Notes and Domino 8 - including a new award category for these solutions. We encourage you to take advantage of this offer while it's available in preparation for Lotusphere.
Thank You,
Tim Shortley
Program Director, Worldwide ISV Technical Enablement, IBM Lotus Software
The recent release of the IBM Lotus Notes and Domino 8 platform gives developers more integration and business solution options than ever before. To celebrate this extensibility we would like to offer our Business Partners free access to Lotus development specialists who will assist you in creating Notes and Domino 8 business solutions.
Your existing solutions will continue to run in Lotus Notes and Domino 8 without modification -- all new integration options supplement existing application development capabilities. Our Lotus development specialists will work with you to explore possible integration scenarios and guide you through the details of this new set of integration options including:
The Composite Application Framework
The Lotus Notes 8 platform allows developers to build reusable, loosely coupled components which can be assembled into composite applications. These reusable components can be created from NSF, Eclipse or IBM Lotus Expeditor technology. Our specialists can evaluate your requirements and propose strategies for developing reusable components or improving integration with a composite application.
The Sidebar and Toolbar
The Lotus Notes 8 sidebar and toolbar are in the end user's sight at all times so they provide an excellent opportunity to display a ubiquitous view of your application or service. Our specialists can show you how to integrate components of your solution into the sidebar and toolbar most effectively. Work you've done developing for Lotus Sametime Connect will pay dividends here as well -- most plug-ins developed for IBM Lotus Sametime 7.5.1 are compatible with Lotus Notes 8.
Web Services
Lotus Notes and Domino 8 provide comprehensive support for web services producers and consumers on the Notes client and Domino server. Our specialists show you how to incorporate your web services in Notes and Domino applications to capitalise on existing IT investments and realise a service-oriented architecture.
Lotus Domino and DB2 Integration
Lotus Domino 8 provides a fresh opportunity for Business Partners with relational database experience and solutions. With Lotus Domino and DB2 integration developers can expose NSF data for relational use and list DBMS data in views and embedded views. Our specialists can discuss the possibilities afforded by this integration such as report generation and integration with other relational data stores.
To learn more about all that Lotus Notes and Domino 8 has to offer, please have a look at " Building on the evolution of people-centric applications" or " Creating business flexibility with IBM Lotus application development software" on the Lotus Notes and Domino developer site. For more information on composite applications see the composite applications page on developerWorks, or the composite applications blog.
If you'd like to find out more about how we can help you take advantage of Lotus Notes and Domino 8 please email us at<EMAIL_ADDRESS>We'll coordinate a follow-on call to review your needs and get you started right away.
At Lotusphere 2008 we will be looking to highlight Business Partner solutions that exploit the new integration possibilities in Lotus Notes and Domino 8 - including a new award category for these solutions. We encourage you to take advantage of this offer while it's available in preparation for Lotusphere.
Thank You,
Tim Shortley
Program Director, Worldwide ISV Technical Enablement, IBM Lotus Software
Posted by Stephan H Wissel on 12 November 2007 | Comments (4) | categories: Show-N-Tell Thursday


- AJ Jones.
(laughing)
- Yes.
- How are you my darling?
- I'm good.
- You look beautiful today.
Do you know that?
- Thank you, Derek.
- I looked across at you when you were cooking earlier
and I thought, my gosh,
your hair looks like Jennifer Aniston's.
- Oh, I'm that's lovely.
(laughing)
- That is a compliment, right?
- It is.
Sure, she is great here.
- All right, tell me three of your favorite things
that happened this week.
Go.
- Three of my favorite things that happened this week.
soaking together we soaked together this night to Jesse early. Do you like the way I
didn't say anything creepy there? That was a really good, great control and that's one
two would be uh probably having Dan fairly here he's a very good teacher. He has, he's
really enjoyed having him at emanate as well and um and three would be going to wild ginger on
on Halloween evening because there was nobody there and the kids were so well behaved and
it was so nice.
Good answer.
Thank you.
I'm about to Trump you.
My top three favorite things was having a day off on Wednesday.
That was amazing.
You've had your turn.
I'm so sorry.
Oh my God.
You blew it.
And other stuff.
We had lunch at Silly Euss.
We had the whole day off.
We did.
We had the whole day off.
Because when you watched our I come betters.
- Or what?
- Our ankle biters.
- Yeah, this is the first time in a long time
we haven't been responsible for small children.
- Yeah.
- We were in the Pinewood social,
which we'd seen about Instagram.
I thought, "I'll just skip it, looks too ponzi."
But it was actually really, really good.
You know what it reminded me of?
Was the Hollywood/Brown Derby in Hollywood Studios?
- It did, it did.
Hollywood Studios, Disney, Epcot.
- No.
- Yeah.
- Hollywood Studios?
the brown derby was an abcote or the derby thing was an abcote.
No, it wasn't. It was the movie theme park. Anyway, it reminded me of that restaurant.
Open plan, serve virtual dress the same way.
Yeah, I'm going to have to look it up.
You can look it up on a podcast in the next week.
So that's number one day off. Just I really enjoyed that day.
And the coffee at the Pinewood Social is crema coffee, so it was fantastic.
I don't care about coffee so that didn't do anything.
But I just feel that our listeners should know.
Number two was getting the screen in porch,
wrestled into submission with the help of Matt.
You did an amazing job.
It looks brilliant.
Thank you.
And then number three was probably the Scandinavian snack bread
that I had just before I came in that you don't know about it.
I know.
You did not.
Naughty boy.
But as you said, we're down fairly coming.
For those of you who don't know Dan, he's the dean of everything at Bethel.
the Dean of everything. That's the new job that we've given him after we kept introducing him as the
Dean of everything. Yeah, he's on the senior team at Bethel Church in Reading California,
and he's just a great, great super mellow, loves pizza, loves Jesus, is an outstanding teacher,
and has got just a really, really, really long history with that church. He predates Bill,
and we just love, he's been so gracious. He's come in three years in a row, and we just love it when
when he comes in and we got to pick his brain about year two, etc, etc, etc.
Yeah, he's awesome. Halloween, we put up a post on Halloween. So if you care what we think about it,
there's a post there. Everybody, every, the difficulties, I don't really want to talk about
Halloween because I don't want people to confuse and think it's a primary message of ours. It really
isn't. I don't care about Halloween. And that's the difficulty in not caring about Halloween. You
stand out about everybody who does care about Halloween. But anyway, I'm talking about it.
I don't even want to talk about it. We've got our website, we put up a blog article about it.
Yeah. And our kids got sick. Yeah, they did. Except. Except Abby, which is strange.
Abby's fine. And even tea and MJ, even though they're sick, it's just double barrel. It's
not. Yeah. Rivers of snot. And MJ is like Velcro. Oh, he's so. So no matter where you are,
Or he wants to touch himself to you.
He just wants to stand next to you or sit next to you or if you're lying on the floor
lie.
I want to try and have a nap on Friday and he, you were supposed to be watching him.
Oh sure, just throw that.
And all of a sudden the door gets flung open.
He loves flinging open our bedroom door.
Ta-da.
Ta-da.
And then he comes over and says up, up.
So I let him up into bed of course.
And then he comes over and snuggles and rubs his nose against my nose, which is really
cute normally, but when there's like so much snark flowing, it's not the best thing ever.
No, not good. It's gross. But he's adorable. All right, our topic for this week is
Duh-duh-duh boundaries. You really want a musical accompaniment to this podcast, which I love.
These are the boundaries that we live by. I don't know that much. Where did you,
when did you come into contact with the boundaries? And before we even start that,
Let's just describe what boundaries are.
I would say that boundaries are being able to say no and hear no in relationships without
panicking.
Oh, that's good.
Thanks.
I think boundaries help you understand that which you're responsible for and that which
everybody else is responsible for and not crossing the threshold or those things.
With that in mind, where did you first hear about boundaries?
I probably first encountered boundaries just being married to you and not realizing I didn't have
good boundaries, particularly with my family. I was, uh, I was okay with boundaries, I think
with friends and stuff, but with my, with my family, I was just like, I'd get rolled over.
So why do you think that is? I think probably a lot of people have a hard time holding
boundaries with their families. There's something in here that goes, well, they're my family,
and so I should. Right. And you start down the shooting on you. The shooting, yeah.
It's funny because even though you hadn't heard any teaching, I imagine just from your answer,
you were fairly bulletproof in terms of boundaries. I don't know if you learned that as being a
single woman who is ministering around the world that you'd learn to say no. But you seemed fairly
robust in saying no, or is that just my impression of you? Yeah, because I was starstruck by you.
Well, no, I was pretty good at saying no, but that's because I had to be right because there was there wasn't I mean on one level
I remember thinking I'll be so nice is there somebody is saying no for me, right? You're welcome
But you weren't you didn't exist at that point. Oh, I'm sorry. I learned to say no
Oh, I see what you say other than to my to my family. It wasn't great saying no with them
I first heard about boundaries from chip Judd obviously. Yeah, but so chip is one of my heroes
I love that it just seems like a pattern in God's life that he's been so gracious to me and that my heroes
I've become my friends
Yeah, a lot of the friends I have today in
Previous years were heroes of mine either books had read about them or I'd listened to them at conferences
And I you know had no relationship with them. So that's awesome. Jesus. Thank you for doing that
But so I you know I heard chip 2003 he came and spoke in our school and you know
It was funny because I'm probably fairly well known for the boundaries message in
that. But when I first heard his message, I love the man hated the message.
I just thought this is the most irresponsible teaching I've ever heard.
Is that why you hated it?
Because you thought it was irresponsible.
Yeah, I just thought I thought it was so offensive and so outrageous.
And I think in part, because I'd probably been raised.
When I say raised, I don't mean, I just mean the climate that I'd grown up in.
no wasn't permissible. So I'm not necessarily talking about my family that I'd include my family,
I'm just talking about the general culture, the operating system with which I grew up in,
in my upbringing, you know, no wasn't readily available. So this concept that you could say no
fell on Christ-like. Right. I think a lot of people still struggle with that now.
Right, but the quality of their life suck because of it.
He said gently and what you have to offer to other people that God's actually given you responsibility for is less because you haven't learned to say no to people that the Lord hasn't actually given you responsibility.
Right.
I realized a long time ago if if if I don't get good at saying no,
then my activities or my social camera, let's just take that is built by other people's requests.
So as long as people don't ask me to do anything, I have time to myself.
But if I can't say no, then I have to say yes to every invitation that comes my way.

So anyway, yeah, I heard Chip.
I didn't like it at all.
And I don't know if it's just because I like Chip that I stayed with it.
Or I don't know if it was because of the culture in Toronto, you know, especially
at the school was really, really equipped by boundaries.
Yeah, I was surrounded by people.
friendly. Yeah. I was surrounded by people who were healthy enough to say no without
no being a source of conflict. I think probably for many people, people will only use no at
breaking point. So no has got a bad rep. Does that make sense? So, you know, for me,
certainly, like no would come out blustering and, you know, exasperated. And so watching
people in Toronto use no really graciously and really, you know, without any hurt or
anger behind it was quite interesting for me. I remember when we were leading one of
the international leaders school of ministry and so we had leaders from all over the world
and we were their small group leaders and I remember it was the end of the day and Kathy
Harris, who's our dear friend in Toronto was leaving that day. And one of the pastors said to
Kathy, are you going to be at the meeting tonight? Now, contacts for everybody who's listening. At
that point, we did meetings every single night, except Monday night. Right. Every night of the week,
there was a church meeting going on. And we had a big visit and speaker in. And so anyway,
one of the pastors said to Kathy, are you going to be at the meeting tonight? And Kathy said, no,
"No, no, I'm gonna be at home with my son."
And even though Kathy wasn't saying no to this woman,
this woman was so shocked that Kathy was not gonna show up
for a church service that she just said,
"Well, shame on you."
- She seemed offended, didn't she?

 You can keep your shame. And I was just like that's amazing you
know Kathy wasn't saying no out of rebellion Kathy was saying no out of a desire to be
with her family. And I don't know if that got me started thinking but just watching people
around me manage their lives really really well and then not blame other people for the
the choices they've made started me thinking like,
I think too, even when we traveled, you know, for eight years or,
or, you know, four years together, yeah, you see so many people in
ministry that are miserable.
And actually if they just had good boundaries, it would solve 80% of the
issues, you know what I mean?
Because, you know, they're, they're wanting time with their family or their
kids, they're realizing what's, what things are costing them, but they're not feeling
like they're allowed to say no.
Right.
And you just, so, I mean, I just remember lots of different places going there and just
being like, yeah, but why don't you just say no?

You can say no.
Yeah.
I would say people pleasing is the number one epidemic that we face in the world.
Or certainly in the church.
Yeah.
I mean, of course, in our world, I'm talking about.
Yeah.
Yeah.
This whole notion that you've got people who are really trying to manage
the emotions and responses of other people. And that's normal. You know, like, well,
I can't do that because she'll be mad at me. Or, you know, I will have to do that.
Or I'll really upset my mother. Or I, you know, have to do this. Or my husband's going
to be angry with me. Or I have to. And you're like, okay, whenever you start saying have
to or should, or you're actually placing the choice at the foot of somebody else's responsibility.
You're reaction.
Yeah, you've suddenly realized, oh, I'm no longer responsible for my own actions because
I'm worried about their reactions.
That's the type of slavery, it's the type of bondage.
So how did you end up?
So really, I don't realize it was from encountering me.
Well, I would say, I mean, I was pretty good at saying on one level, I was okay even at
boundaries sometimes with my family about being on time or whatever, like I would just leave
if we hadn't had dinner already and you know that kind of stuff because everything was always
laid and but anything emotional I couldn't lay down a boundary at all.
So I would say it wasn't until you were like hey guess what you don't have to be their
personal Jesus and you're not the only answer to this problem and it's actually not reasonable
that you would go out at three o'clock in the morning when you have little tiny kids
to go and do whatever and I'd be like right right okay okay.
Right, I have another option.
Right, yeah.
I think the revelation that occurred to me was when I didn't have boundaries and people
asked me to do something that I would, if I had boundaries, really choose to say no to
for whatever reason, but felt like I couldn't.
I realized on the inside I was wishing I was sick or injured, so I had a legitimate reason
to say no.
Yeah.
Right? So could you do, could you help me with X on Friday?  I just, you know, I was really looking forward to doing, you know, this or that, the next
thing. And well, I suppose I should say yes, because you know, there, and you just end up being like,
Dang, if only I was like, had food poisoning, then I could say, Oh man, I've got food poisoning. And
we say that because we think, well, then the other person won't be mad at me because who's going to
be mad at somebody who has food poisoning. Right.
I think where the boundaries teaching has been misunderstood
is that boundaries enable you to be a selfish jerk.

- Right.
- No.
- And I think that's probably a phase
that you'd go through, like I certainly went through that.
- Yeah, you did.
- Thanks.
(laughing)
I certainly went through that
because you suddenly have this revelation
of discovering that you have power given to you,
like, whoa, I get to say no.

And then this phase where you go through
where you've got no skill at using no.
There's no grace attached to it.
It's just taking all your emotional energy
to actually say no, and it probably comes across
quite harshly.
- Right.
- And I remember, you know, going through that again,
because I didn't really feel like I ever had a no.
It would just, you know, I'm so nervous.
No!
And you know.
- It was a little intense to begin with.
- It was.
But that's, I think that's like any new skill.
You know, when you're learning to drive stick shift
in a car, you stall the car a couple of times
or you over rev, you know, or you're changing gears
or not that smooth, but the more you do it,
the more skills you get it and then the better you get.
And I think that's probably what happens.
suddenly realize, okay, my freedom in saying no is not so that I can be a hermit and just
have everything go my way.
And I think Danny Silk in particular has done such an amazing job in balancing out the boundaries
teaching along with Dan Farrelly, you know, and Dan was here.
It's one thing to be powerful, but it's another thing to be powerful with humility and learning
that okay just because we're in, just because I can say no doesn't mean I have to say no.
I'm actually learning to give out if you're no.
Yeah, and it's choice.
I think what's exciting is especially for us I suppose here, but you know like in Toronto
and other places where the boundary teaching is understood is you're creating a community
of people that can effectively communicate without being wounded by saying no.
And it also means then you mean your yes and you mean your no.
And if somebody, if you ask somebody and say, "Hey, do you want to do this or could you
do this?"
If they say, "Yes, I'm going to take their yes at, you know, and trust it because I know
that most of our community understands the boundaries teaching.
And if they want to say no, I want them to feel like they can say no without it affecting
how they think I view them or anything like that."
And I would say that we've worked as hard as I know how to foster a community where
people can say no to us.
especially as leaders, I'm aware that that leaders can abuse their power, even when they're not aware of it, or even when they don't like to acknowledge that they're aware of it.
So for example, when we moved house a couple of years ago, I actually only asked our school students at the time, and I did a little preamble going, guys, you don't need to say yes to me because I'm the director of the school.
That's not why I'm asking you.
Like if you are able to and you would like to, then we would love your help.
And if you can't, you haven't offended me.
I'm not going to be sitting thinking about you guys for Christians.
But now I'm not here.
And it does free up people because then you don't have to do the social massaging
when people are around where you think they've said yes, but they meant no.
You know, an internal, no nullifies an external yes.
So they're here, but then you're trying to placate them and pacify them.
Just make sure that they're OK.
And that's just exhausting.
So you're right. What a rich community you can have when everybody understands what everybody else is saying.
Yeah. Yeah, it's awesome. That's really freeing.
Yeah, I'm just, I'm very, very grateful for that teaching. It's really, I remember, do you remember
that we were teaching in Toronto at school? And one of the students who'd been, as funny, she was a
student she's in her own right was very connected with lots of
ministries had been connected with some very big name ministries.
And at the end of us teaching, she came up and she said, can I
ask you guys pass through? And we're like, ah, she's like, no,
but are you like real pastors?
I'm like, yeah, she's like, like, so you, you know, pass through
church, we're like, yeah, yeah, we do. She's like, but you're so
happy. And I was so taken aback. Well, that statement, I thought,
Oh gosh, there's a lot behind that. She said, what's your
secret. And I said, mmm, probably the revelation of the father's love and being able to say no.
And I, you know, that's absolutely the truth. Like we get to prioritize rest because we can say
note to lots of things. Yeah. You know, learning to say no, so you can say yes to other stuff.
Learning to say no to go and speak at this conference. So you can say yes to being at home with your
kids. Yeah. And you're still inviting the Holy Spirit into the process. So even if you're like,
My, my God is to say no, but if Holy Spirit goes, Hey, I'm saying yes, then you can go.
All right.
Yes.
Which is awesome.
If what we're saying is causing you to twitch that don't, that don't shut us down.
It's going to be okay.
If you are listening to something, man, I would love to learn more about this.
We have prepared three teachings on our website.
You can get them on CD or you can download them for this week only.
We are making the digital downloads available, all of them, all three of them available for three bucks.
They're not only three bucks a piece.
This way they're going to be a dollar piece, download the whole set for three dollars and you could absolutely revolutionize your life and the lives of those people in your community.
So three bucks to empower yourself to say no seems like an absolute bargain to me.
But download them. Have a listen. If you have questions, go to lnaj.com/ask.
we would love to try and answer your boundary related questions.
Mrs. A.J. Jones with a hair of Jennifer Aniston is her anything you would like to say is close.
You look very handsome today.
You know what it is.
What?
You're tired.
No, you know what it is.
I don't know where my hair waxes.
So I got lots of comments.
It's a light and fluffy look.
It is totally light and fluffy.
I blow dried my hair because I couldn't go to the towel drying it.
Then realize I had no product to put through it. So I'm all
wistful and light and
Well, until just that moment when you just like fixed your hair, you're looking a
little bit like Erkel. It was parted right down the middle, but still cute.
Okay.
I'm going to go and cry in my room for a little bit.
I love you.
I love you. And we love you listeners.
Thank you for tuning in. We will see you next week.
Bye bye.


THE SOLID GOLD CADILLAC
May 3-4, 1965 at Mason School
Director - Bob Cade
Assistant Director - Hilma Seefeld
THE CAST
Edna Bilek, Marda Burton, Connie Farrell, Jim Gibbon, Ernest Graves,
Trudy Harris, Jim Howell, Frances Keyes, Arthur Kitchens,
Mary Mobberly, Mayze Mackrell, Tom McGlothlin, Virginia McGlothlin,
Don Schlaefer, John Toal, Dan Walters, Nancy Walters


| AbstractXMLEncryptionMarshaller |
An abstract marshaller implementation for XMLObjects from XML Encryption.
|
| AbstractXMLEncryptionUnmarshaller |
An abstract unmarshaller implementation for XMLObjects from XML Encryption.
|
| AgreementMethodBuilder |
|
| AgreementMethodImpl |
|
| AgreementMethodMarshaller |
|
| AgreementMethodUnmarshaller |
|
| AlgorithmIdentifierTypeImpl |
|
| AlgorithmIdentifierTypeMarshaller |
|
| AlgorithmIdentifierTypeUnmarshaller |
|
| CarriedKeyNameBuilder |
|
| CarriedKeyNameImpl |
|
| CipherDataBuilder |
|
| CipherDataImpl |
|
| CipherDataMarshaller |
|
| CipherDataUnmarshaller |
A thread-safe Unmarshaller for CipherData objects.
|
| CipherReferenceBuilder |
|
| CipherReferenceImpl |
|
| CipherReferenceMarshaller |
|
| CipherReferenceUnmarshaller |
|
| CipherValueBuilder |
|
| CipherValueImpl |
|
| DataReferenceBuilder |
|
| DataReferenceImpl |
|
| DataReferenceMarshaller |
|
| DataReferenceUnmarshaller |
|
| DHKeyValueBuilder |
|
| DHKeyValueImpl |
|
| DHKeyValueMarshaller |
|
| DHKeyValueUnmarshaller |
A thread-safe Unmarshaller for DHKeyValue objects.
|
| EncryptedDataBuilder |
|
| EncryptedDataImpl |
|
| EncryptedDataMarshaller |
|
| EncryptedDataUnmarshaller |
|
| EncryptedKeyBuilder |
|
| EncryptedKeyImpl |
|
| EncryptedKeyMarshaller |
|
| EncryptedKeyUnmarshaller |
|
| EncryptedTypeImpl |
|
| EncryptedTypeMarshaller |
|
| EncryptedTypeUnmarshaller |
|
| EncryptionMethodBuilder |
|
| EncryptionMethodImpl |
|
| EncryptionMethodMarshaller |
|
| EncryptionMethodUnmarshaller |
|
| EncryptionPropertiesBuilder |
|
| EncryptionPropertiesImpl |
|
| EncryptionPropertiesMarshaller |
|
| EncryptionPropertiesUnmarshaller |
|
| EncryptionPropertyBuilder |
|
| EncryptionPropertyImpl |
|
| EncryptionPropertyMarshaller |
|
| EncryptionPropertyUnmarshaller |
|
| GeneratorBuilder |
|
| GeneratorImpl |
|
| KANonceBuilder |
|
| KANonceImpl |
Concrete implementation of KANonce .
|
| KeyReferenceBuilder |
|
| KeyReferenceImpl |
|
| KeyReferenceMarshaller |
|
| KeyReferenceUnmarshaller |
|
| KeySizeBuilder |
|
| KeySizeImpl |
Concrete implementation of KeySize .
|
| MGFBuilder |
|
| MGFImpl |
Abstract implementation of MGF .
|
| MGFMarshaller |
A thread-safe Marshaller for MGF objects.
|
| MGFUnmarshaller |
A thread-safe Unmarshaller for MGF objects.
|
| OAEPparamsBuilder |
|
| OAEPparamsImpl |
|
| OriginatorKeyInfoBuilder |
|
| OriginatorKeyInfoImpl |
|
| OriginatorKeyInfoMarshaller |
|
| OriginatorKeyInfoUnmarshaller |
|
| PBuilder |
|
| PgenCounterBuilder |
|
| PgenCounterImpl |
|
| PImpl |
Concrete implementation of P .
|
| PublicBuilder |
|
| PublicImpl |
Concrete implementation of Public .
|
| QBuilder |
|
| QImpl |
Concrete implementation of Q .
|
| RecipientKeyInfoBuilder |
|
| RecipientKeyInfoImpl |
|
| RecipientKeyInfoMarshaller |
|
| RecipientKeyInfoUnmarshaller |
|
| ReferenceListBuilder |
|
| ReferenceListImpl |
|
| ReferenceListMarshaller |
|
| ReferenceListUnmarshaller |
|
| ReferenceTypeImpl |
|
| ReferenceTypeMarshaller |
|
| ReferenceTypeUnmarshaller |
|
| SeedBuilder |
|
| SeedImpl |
Concrete implementation of Seed .
|
| TransformsBuilder |
|
| TransformsImpl |
|
| TransformsMarshaller |
|
| TransformsUnmarshaller |
A thread-safe Unmarshaller for Transforms objects.
|