TweetFollow Us on Twitter

Sep 89 Mousehole
Volume Number:5
Issue Number:9
Column Tag:Mousehole Report

Mousehole Report

By Rusty Hodge & Larry Nedry, Mousehole BBS

From: Cheasy

Re: INIT31 Help wanted

Today I’m writing because of some VERY difficult programming problems. At this time, I am trying to write an INIT for use with the INIT 31 mechanism, which will do something like pop up a dialog box onto the screen. (Yes, indeed, I need this during startup!)

Unfortunately, if I call InitWindows from the toolbox, the startup screen is destroyed and the menu bar will be drawn, along with a fresh erased desktop. This is an very ugly effect, especially if there are more than one or two INITs in my System Folder. So I wrote some code to draw some pseudo-dialog boxes, fill them in, handle something like EditText fields and look for mouseDown events in different regions. They all work nice in my testing program. To make them work, I have to initialize a lot of low-memory globals myself, including my own quickdraw globals. This all worked fine.

But when I try to CopyBits the background of my window before drawing onto it, the routine will crash immediately. Nothing works, and even my own QD globals seem to be destroyed. Has anyone out there a little bit experience dealing with quickdraw at startup (INIT31) time? I am interested in any code which shows how to set up and reference to Quickdraw globals at INIT time.

P.S. I apologize my bad english, but in fact, I am only speaking Pascal. (You can ask me for a German version of this bulletin.)

From: Anthony

Re: INIT resources

I have a question, I am working with INIT’s, and just wanted to see if this bit of code would really do the job. It is written in LS C, and is all of one line,

main()
    {
    Sysbeep(5);
    }

I have saved it as an INIT, but when I add it to the list of INIT resources in the system, and reboot, it doesn’t do anything? Why, I don’t want to use the INIT 31 trick, I want this to be a part of the system file, so I don’t have to worry about users carrying it over with them when they switch pc’s.

From: Retzes

Re: INIT resources

I think there are two possible reasons why the INIT didn’t work. One, at the time the init is called the Sound-manager, Operating-System Utilities, or Sound-Driver has not been initialized. Two, the INIT didn’t get called for some other reason. When making an INIT that uses Quickdraw functions, I think you have to call InitGraf with a pointer to some local variables that resemble the Quickdraw globals. This was what seemed to be necessary when I added a function that displayed the ICN# for the INIT at the bottom of the screen at startup. I found out how to do this with TMON, examining another INIT file. First you must decide what you want your INIT to really do, then decide if its possible with the system existing at startup.

From: Bzweig

Re: May MacTutor error?

I use SetupA4 and RestoreA4 in my LSC XCMDs all the time, and I haven’t encountered any problems yet. I can use string constants in my error messages and debugging messages without any problems. I’ve also found it useful to recompile sprintf as a code resource (so it uses A4 instead of A5) so I can easily dump the values of variables from my XCMD during debugging. The procedure for doing this is buried somewhere in the LSC manual. It’s not too hard.

From: Bzweig

Re: bulletproof XCMDs

I was interested to read Don Koscheka’s article on Modularity and Coupling in the June MacTutor. I think that Don should add one additional attribute to all XCMDs in his libraries: all XCMDs should be bulletproof, and should detect and handle (either softly or explicitly) any errors by the invoking script. I bring this up because the GetFilename XFCN is not bulletproof as written in the article. If the user gives more than four parameters to the XFCN, the SFTypeList array will be blown and bad things will result. The soft way to handle this would be to say:

numTypes = (paramPtr->paramCount = 4) ? paramPtr->paramCount : 4;

The other way would be to return an error message in the function result. It sure would be nice if all XFCNs could return errors in a uniform manner, by the way. I personally begin each error message with the characters “!@!#” which I hope would never be a normal result. I’d like to hear any smoother suggestions. Maybe if everyone could agree on the name of a global to report XCMDerrors, like XCMDerr.

From: Mikec

Re: New folders from HyperCard

Is there any way to create new folders form within HyperCard using an XCMD? I have a HyperCard application that needs to create a new folder with the user’s name every time a new user registers. There is nothing in “Inside Mac.” or the Mac Tech Notes on this. Is this a closely guarded secret of the Mac’s finder? Thanks for any info or support.

From: Tonys

Re: INIT using dialog manager

How do I create an INIT using LS Pascal which accesses the dialog manager, such as a simple StopAlert call? I think I know how to access the Quickdraw globals using CurrentA5, but once the dialog has been dismissed, the system bombs. Am I missing some other initializations or have resources labeled incorrectly?

From: Siegel

Re: INIT using dialog manager

You’ll need to call InitWindows, InitFonts, and InitDialogs as well. It’s generally un-INIT-like to fire up the Window Manager. If you want to give a message, use ShowInit to draw your INIT’s icon with an X in it, or something similar.

From: Rguerra

Re: KeyMap Kraziness

Can someone PLEASE help me with manipulating the keyMap and modifier keys in assembly? I have user-definable modifiers stored (derived directly from the event record’s modifiers field. I know that the modifier keys all live in bytes 6 and 7 of the keymap. I can easily MOVE these bytes to a data register, but I can’t seem to figure out how to manipulate the bits of either the stored modifiers or the keyMap bytes, and then determine if they are the same. I have to do this directly in assembly since this is in a patch. I know that this will only take about 4 lines of code, but I can’t quite get it right. (It’s so frustrating since I can do the check so easily in Pascal.) Can someone help? I’d appreciate it.

From: Gurglekat

Re: KeyMap Kraziness

Give the BTST instruction a whirl. I’d tell you more about it but my Motorola 68000 manual seems to have escaped me.

From: Siegel

Re: More Help

To create your own port and fill up black, try this:

main()
{
 GrafPort myPort;   /* static storage */
 InitGraf(&thePort);
 OpenPort(&myPort);
 PaintRect(&myPort.portRect);
}

From: Apage

Re: More Help

Your most obvious problem in this code is your calls to EraseRect and FrameRect.

The Pascal traps are expecting them to be passed as a Pointer to rectangles, however the C compiler will try passing all 16 bytes of each rectangle onto the stack, as per C calling parameters. Change your calls to the following and try again:

        EraseRect(&myPort.portRect);
        FrameRect(&myPort.portRect);

From: Bcbg

Re: More Help

When you call the ROM in C, you must be aware of the standard calling conventions.Every object more than 4 bytes in size or every VAR parameter is passed by “address” and not by “value”. It means that to call EraseRect, you must do:

EraseRect (&myPort.portRect);

Same thing for FrameRect. If you used LSC 3.0 or MPW C 3.0, the compiler would tell you these problems...

From: Cforden

Re: LSC Assembly: Save registers for call?

What registers must I save before I call another routine? Inside Mac (phone book ed.) and LSC (3.0 manual) both hint that registers D0-D2 and A0-A1 are generally considered expendable and are generally trashed by routines. However saying that they (LSC and the toolbox) trash them is not quite the same as saying I am allowed to trash them or let them get trashed. In fact I found that if I did not save those registers prior to calling my LSC wordBreak() routine and restore them upon return, the toolbox would get confused and crash the system. I couldn’t find explicit guidance in Williams’ book “Programming the Macintosh in Assembly Language” (Sybex), but many examples showed all registers being saved by routines.

From: Noisy

Re: LSC Assembly: Save registers for call?

Hmmmm...I thought that the LSC (v3.x) manual (pg. 151) was pretty clear about saving D0-D2/A0-A1, and IMvI says the same. As for what an application can trash, I haven’t had any problems trashing registers prior to Toolbox calls. Like yourself, though, I did get into trouble with ‘call-back’ routines: routines that are provided by the application, but actually called by the Toolbox. (The one that bit me was a List clikLoop) I have adopted the ‘better safe than sorry’ attitude of pushing/popping ALL registers in call-back routines, just to ensure future compatibility if nothing else. The space and time wasted by pushing registers is nothing compared to the agony of trying to figure out which one got trashed by whom!

From: Siegel

Re: LSC Assembly: Save registers for call?

The conservative way to go is to save any registers you use, and if any routines that you call use them, be sure they’re correct.

From: Bruceq

Re: Alternate Screen/Snd

I am currently writing a game for the Mac and need to use the Alternate Screen/sound buffers to make it playable on non 020 machines. I know that I can use the alt. buffers if I force the user to boot off of the master disk, but I would really like to have the game load off of the users harddisk if possible. The problem is the case of MultiFinder running. Does _Launch still allocate the alt buffers for you when asked? What if another program had loaded previously? Will MultiFinder reserve that space or swap it out if the foreground application needs the alternate buffers? Or has Apple decided not to support the alt buffers in the future. I don’t need to use a frame buffer on a 68020 or 030 machine because of the extra HorsePower, but doing full screen animated graphics on a Plus or SE with out the frame buffer is the pits.

Any ideas or higher knowledge?

From: Gurglekat

Re: WMgrPort ?’s

There is a low memory global called DeskHook, $A6C, which according to my Inside Mac X-ref is “Address of procedure for painting desktop or responding to clicks on desktop.” You might ask jbx, whose CompuServe address is 73177,1404, how he did the pop-up menu bar in hierDA -- I’m pretty sure he used this routine. If not, you might want to contact the DeskPict people.

From: Gus

Re: ANIMATION

Hey there guys. I’m writing a freeware game for the MAC and am interested in how you guys do flicker free animation?? I’ve tried everything. Is there some secret I don’t know about?? Code would really be appreciated. Also I’m using a Mac+ and I’m, writing in LSC. I would really appreciate any help as you guys are my last hope before that programming black hole.

From: Inbox

Re: ANIMATION

You can read about it in Scott Knaster’s ‘How to Program Macintosh Software’. Anyway, here’s the advice given there: (I’ll condense it...) It says that the first thing that occurs in the vertical retrace interrupt, is that the global variable Ticks gets incremented. So you can draw right after the interrupt occurs, before the beam actually draws the stuff on the screen. So, here’s the suggested code of your drawing proc:

  Var  tickValue : longint;
  begin
  tickvalue := TickCount;{calls ROM to get value of Ticks}
  repeat until (tickValue <> TickCount)
  { start drawing fast!! here...}

That loop waits until the interrupt occurs, and then you should draw. Keep in mind that the top of the window should be drawn before the bottom (if possible) because the electron beam goes from top to bottom.

From: Tan

Re: Scrolling

What you could do is to use ScrollRect, that’ll take care of most of the window that’s scrolled. The new portion of the window contents that need to be redrawn can be clipped. As there’s less to draw on the screen, it would be faster. Of course, another way is to cache a margin around the current visible area in an offscreen bitmap and blit it in when you scroll to the cached area. You’ll need four caches for each of the four directions you can scroll in. I think Excel does something like that to speed the scrolling.

From: Moreno

Re: Scrolling

Here is some pseudo code for determining if you should draw a line in your apps window

theUpdateRgn := NewRgn; { create a temporary region, NewRgn returns a 
region HANDLE }
ScrollRect(windowRect_Minus_One_Line_at_Top_Or_Bottom, +_or_-_One_Line_Height,
0, theUpdateRgn);
{ don’t forget to subtrac the scrollbars from the window rect }
trect:=theUpdateRgn^^.rgnBBox;
SetRect(DrawingRect,{ you fill in the blanks it’s not MY
program}left,top,right,bottom);
IF RectInRgn(DrawingRect, YourWindow^.visRgn) AND RectInRgn(DrawingRect,
YourWindow^.clipRgn) THEN
BEGIN
{ draw the top or bottom line if scrolling by on line }
END;

From: Inbox

Re: TEdit

Does anyone know of a good way to replace (or designate) the text in a Text Edit record? I did the following, and it didn’t quite work... vat sheesh.. make that VAR

  myTeh : TEHandle;
  myStrHandle : StringHandle;
  myStr : String[20];
begin
myStr := ‘ 20 letters go here  ... ‘;
myStrHandle := NewString(myStr);
myTeh^^.hText := Handle(myStrHandle);
TECalText(myTeh);
end;

What happens is that a garbage char gets displayed along with the first 17 or so characters of myStr; And the ASCII value of the char is 20, and so is the length of the string. So, I think that the type coercion from StringHandle to Handle makes it point to the length of the string and not to the contents. I don’t know what to do with this, because I’m using LSP 2.0. If this was in C, no problem. But I don’t know how to do this in Pascal. So, I FOUGHT THE ROM AND THE ROM WON!!! < a sob is heard here> ANY suggestions are greatly appreciated.

From: Gurglekat

Re: TEdit

Just in case you’ve not got an answer yet, the garbage character is the Pascal length byte. NewString passes you back a StringHandle, which points to a chunk of mem headed by the length byte, which is followed by the letters of the string. In order to do what you are doing while maintaining your code, it might be best to do

BlockMove(@myStrHandle^^[1], @myStrHandle^^[0], length(myStr));
SetHandleSize(Handle(myStrHandle)), GetHandleSize( Handle(myStrHandle))-1);

before installing the handle and TECalText’ing. However, I think you should use

   TEInsert(@myStr[1],length(myStr),myTeh);

which avoids the StringHandle muddle altogether. TEInsert will take care of space for the text, if that’s what you’re worried about.

From: Gurglekat

Re: TEdit

Ah. Forgot to mention -- the TECalText becomes unnecessary if you use the TEInsert method.

From: Inbox

Re: TEdit

I thought that this was the garbage char. Thank you very much for your suggestion. However, I don’t think that TEInsert is the way to go because I have to clear the text that was already there. Anyway, I’m using this scheme in a spreadsheet program I’m writing (and, no, I don’t plan to put Microsoft out of business) for input to and from cells. The new text has to be shown when a new cell is selected, and that’s where the garbage char problem comes in. Is there a better way to do cell input?

From: Pdyson

Re: Shutdown under Multifinder

A good Multifinder-friendly app quits gracefully when the user gives the Restart or Shutdown command from the Finder’s Special menu. But what is the secret of writing an app to receive and obey this message from the Finder? I downloaded the TEsample.C from Apple DTS, modified it for LSC 3.0 and Lo! it simply refuses to die when the Finder calls for a restart.

The app has 4 mstr resources (100-103) and (since I simply cribbed it from DTS) should be correct in the way it dispatches events. I am mystified.

From: MacDTS

Re: Shutdown under Multifinder

I would guess the “Quit” item in the File menu has more than what you’re specifying in ‘mstr’. Look for some spaces after the Quit string. I’ve heard about this problem before with LSC.

From: Pdyson

Re: Shutdown under Multifinder

Aaah, the way things become obvious after someone else points them out. Problem due to my own sloppy typing, no fault of LSC here.

Much thanks for the help.

From: Rapier

Re: GrowZone, cbNeeded

I’ve got a GrowZone proc that seemed to work fine, except that, occasionally, I get a negative number for cbNeeded. I’m using LSP 2.01, and my test program is allocating $9000 bytes. The value of cbNeeded is FFFF9008!! Is this an OS bug, a weirdness with LSP’s Zone, or something unheard of??.

I don’t want to add a special negative number handler without knowing why, and I want to put off going into Macsbug if someone already knows what’s happening.

Any help would be appreciated.

From: Brad

Re: GrowZone, cbNeeded

How are you allocating the memory? If you are using $9000 as a constant, try changing it to $09000, which will force the Compiler to use a LONGINT. It might be sign extending the $9000 (which is -28672 in decimal), in which case you would be asking for a HUGE block of memory. I think the memory manager treats memory requests as unsigned.

From: Nfong

Re: ioFLAttrib

I’m trying to set the protect bit in ioFlAttrib with PBSetCatInfo but can’t seem to get it to work. It returns with no error but doesn’t do anything. Anyone got any suggestions?

From: Inbox

Re: bundle bit

Does anyone know whether it’s possible to set the bundle bit using ResEdit? I’m using LSC 3.0, and couldn’t get the icon to be recognized.

From: Spud

Re: bundle bit

There was an old version of ResEdit that had the Changed and Bundle bits mixed up; you clicked on the Bundle checkbox and the Changed bit was set, and vice versa. The good ol’ boys at Apple have fixed that little mishap since then, and I’m sure that the version here (version 1.2) has the fix.

From: Zarko

Re: PenMode funnies

Beware of wrong PenMode() calls. If you mistakenly pass srcXOR (0x02) instead of patXOR (0x0A), then the intended XOR drawing effect WILL take place on a Mac II, but not on a Mac+. IM says that the source modes will cause no drawing to take place - not true for the II.

From: Eau

Re: bundle bit

Yes, you can set the bundle bit with ResEdit. Do ‘command-I’ when a file is selected, and a window will appear, which has a checkbox for Bundle. To get the Finder to recognize the icon, you will probably have to move the file to a different folder. The Finder will not automatically pick up changed bundle bits. Of course, the file should also contain resources defining the icons.

When I’ve got an application, and I want the Finder to re-read the bundle information, I move it between the top-level and a subdirectory on my hard disk. This works pretty well. Hope this helps.

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

NetNewsWire 5.1 - RSS and Atom news read...
NetNewsWire is the best way to keep up with the sites and authors you read most regularly. Let NetNewsWire pull down the latest articles, and read them in a distraction-free and Mac-like way. Native... Read more
FontExplorer X Pro 7.1.3 - Font manageme...
FontExplorer X Pro is optimized for professional use; it's the solution that gives you the power you need to manage all your fonts. Now you can more easily manage, activate and organize your... Read more
DiskCatalogMaker 8.2.5 - Catalog your di...
DiskCatalogMaker is a simple disk management tool which catalogs disks. Simple, light-weight, and fast Finder-like intuitive look and feel Super-fast search algorithm Can compress catalog data for... Read more
Skim 1.5.12 - PDF reader and note-taker...
Skim is a PDF reader and note-taker for OS X. It is designed to help you read and annotate scientific papers in PDF, but is also great for viewing any PDF file. Skim includes many features and has a... Read more
rekordbox 6.1.0.0030 - Professional DJ m...
rekordbox is the best way of preparing and managing your tracks, be it at home, in the studio, or even on the plane! It allows you to import music from other music-management software using the... Read more
iExplorer 4.4.0 - View and transfer file...
iExplorer is an iPhone browser for Mac lets you view the files on your iOS device. By using a drag and drop interface, you can quickly copy files and folders between your Mac and your iPhone or... Read more
OmniGraffle 7.17.5 - Create diagrams, fl...
OmniGraffle helps you draw beautiful diagrams, family trees, flow charts, org charts, layouts, and (mathematically speaking) any other directed or non-directed graphs. We've had people use Graffle to... Read more
Apple Configurator 2.13.1 - Configure an...
Apple Configurator makes it easy to deploy iPad, iPhone, iPod touch, and Apple TV devices in your school or business. Use Apple Configurator to quickly configure large numbers of devices connected to... Read more
OmniGraffle Pro 7.17.5 - Create diagrams...
OmniGraffle Pro helps you draw beautiful diagrams, family trees, flow charts, org charts, layouts, and (mathematically speaking) any other directed or non-directed graphs. We've had people use... Read more
FoldersSynchronizer 5.1.6 - Synchronize...
FoldersSynchronizer is a popular and useful utility that synchronizes and backs-up files, folders, disks and boot disks. On each session you can apply special options like Timers, Multiple Folders,... Read more

Latest Forum Discussions

See All

Steam Link Spotlight - Hades
Steam Link Spotlight is a feature where we look at PC games that play exceptionally well using the Steam Link app. Our last entry was on Disco Elysium. Read about how it plays using Steam Link over here. | Read more »
Microsoft has acquired ZeniMax Media and...
In the latest of a series of blockbuster moves, Microsoft has now acquired Zenimax Media and its subsidiary, Bethesda Softworks, for $7.5 billion. [Read more] | Read more »
Infinity Mechs is an upcoming idle game...
Indie developer SkullStar studio has announced an upcoming idle mech game called Infinity Mechs. It draws inspiration from the mobile game Iron Saga and has been officially licensed by Game Duchy. It's set to launch for both iOS and Android on... | Read more »
PUBG Mobile Lite's latest update se...
PUBG Mobile Lite, the streamlined version of the popular battle royale that's designed to work on less powerful devices, sees the return of a popular game variant today, Survive Till Dawn mode. It arrives as part of the 0.19.0 content update. [... | Read more »
Matchy Catch, Jyamma Games’ new hyper-ca...
Matchy Catch is a new hyper-casual puzzler from Jyamma Games, the Italian studio behind the Pong-inspired puzzle-adventure Hi-Ball Rush. It’s only the developer’s second game for iOS and Android devices, but it promises to be every bit as fun and... | Read more »
Among Us! Imposter Guide - How to be a s...
Among Us! continues to be getting a lot of play in these parts, and since our first guide we've learned a thing or two about the game. This is especially true regarding the imposter role, as its a relatively rare opportunity that we've now put... | Read more »
Paladin's Story is an upcoming fant...
Paladin's Story is an upcoming fantasy RPG with an off-kilter sense of humour that's heading for iOS and Android. It will officially launch for both on September 16th though the game is already available on Google Play in Early Access. [Read more... | Read more »
Among Us! Guide - Tips for the uninitiat...
| Read more »
A Pretty Odd Bunny is a stealth-platform...
A Pretty Odd Bunny is a stealth-platformer from two-man team AJ Ordaz and René Rivera. It follows the story of a red-eyed rabbit who is allergic to carrots and instead has a penchant for devouring pigs. It's available now for Android devices. [... | Read more »
Apple Arcade: Ranked - Top 25 [Updated 9...
In case you missed it, I am on a quest to rank every Apple Arcade game there is. [Read more] | Read more »

Price Scanner via MacPrices.net

Sale! Amazon has 2020 13″ 2.0GHz MacBook Pros...
Amazon has 2020 13″ MacBook Pros with 10th generation Intel CPUs back in stock on sale again today for $150-$200 off Apple’s MSRP. Shipping is free. Be sure to purchase the MacBook Pro from Amazon,... Read more
Base 13″ 1.4GHz Apple MacBook Pros on sale fo...
Apple reseller Expercom is offering a $65-$75 discount on new 2020 13″ 1.4GHz MacBook Pros, depending on configuration. Shipping is free. Expercom estimates shipping in 3-5 days, as stock of Apple’s... Read more
Price drop! Get a 44mm Apple Watch Series 5 G...
Amazon has dropped their price on the 44mm Apple Watch Series 5 GPS + Cellular by $100 to $429 shipped. That’s $100 off Apple’s original MSRP for this model. For the latest prices and sales, see our... Read more
Verizon offers $200 discount on new Apple Wat...
Verizon will take up to $200 off the purchase of a new GPS + Cellular Apple Watch Series 6 or Apple Watch SE with select trade-in and the purchase of a new iPhone with service. The fine print: “Get... Read more
Verizon offers $250 discount on new 8th gener...
Verizon will take up to $250 off the price of an 8th generation 2020 Apple Cellular iPad with select trade-ins and a new iPhone purchase. Plus get Apple News+ free for 6 months. The fine print: “Save... Read more
Apple’s Implementation Of COVID-19 Exposure...
NEWS: 09.18.20 – The latest effort by Apple to embed exposure notifications for COVID-19 contact tracing right into its mobile operating system has some iPhone users weary of being exposed to... Read more
Here’s how to get a 16″ MacBook Pro for $300...
B&H Photo has new 16″ MacBook Pros on sale today for $250-$300 off Apple’s MSRP, starting at $2099. Expedited shipping is free to many addresses in the US: – 2019 16″ 2.6GHz 6-Core MacBook Pro... Read more
Apple has Certified Refurbished 16″ MacBook P...
Apple has Certified Refurbished 2019 16″ MacBook Pros available for up to $420 off the cost of new models, starting at $2039. Each model features a new outer case, shipping is free, and an Apple 1-... Read more
Price drops! Apple reseller B&H drops App...
B&H Photo has dropped prices on Apple Watch Series 5 models by $50-$70 off Apple’s original MSRP. Shipping is free. These are the same Apple Watch models sold by Apple in their retail and online... Read more
Apple extends their 2020 Back-to-School promo...
As part of their Back to School promotion for 2020, Apple will include one free pair Apple AirPods (with charging case) with the purchase of a MacBook Air, MacBook Pro, iMac, iMac Pro (Mac Pro and... Read more

Jobs Board

Security Officer ($23.00/Hourly) - *Apple*...
**Security Officer \($23\.00/Hourly\) \- Apple Store** **Description** About NMS Built on a culture of safety and integrity, NMSdelivers award\-winning, integrated Read more
Security Officer ($23.00/Hourly) - *Apple*...
**Security Officer \($23\.00/Hourly\) \- Apple Store** **Description** About NMS Built on a culture of safety and integrity, NMSdelivers award\-winning, integrated Read more
Platform - Workplace Eng - *Apple* Enterpri...
MORE ABOUT THIS JOB We are looking for an Apple Platform Engineer who will bring a unique engineering skill set, support, clarity, organization and above all else, Read more
*Apple* Certified Repair Technician - Utah S...
…selected candidate will work in the USU Campus Store Tech Department as an Apple Certified Repair Technician and floor associate. This position is for both summer Read more
Senior Data Engineer - *Apple* - Theorem, L...
Job Summary Apple is seeking an experienced, detail-minded data engineeringconsultant to join our worldwide business development and strategy team. If you are Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.