text:
LPI Linux Certification/Perform security administration tasks

Detailed Objective
(LPIC-1 Version 5.0)

Weight: 3

Description: Candidates should know how to review system configuration to ensure host security in accordance with local security policies.

Key Knowledge Areas:
 * Audit a system to find files with the suid/sgid bit set.
 * Set or change user passwords and password aging information.
 * Being able to use nmap and netstat to discover open ports on a system.
 * Set up limits on user logins, processes and memory usage.
 * Determine which users have logged in to the system or are currently logged in.
 * Basic sudo configuration and usage.

The following is a partial list of the used files, terms and utilities:


text:
LPI Linux Certification/Securing data with encryption

Detailed Objectives
(LPIC-1 Version 5.0)

Weight: 4

Description: The candidate should be able to use public key techniques to secure data and communication.

Key Knowledge Areas:
 * Perform basic OpenSSH 2 client configuration and usage.
 * Understand the role of OpenSSH 2 server host keys.
 * Perform basic GnuPG configuration, usage and revocation.
 * Use GPG to encrypt, decrypt, sign and verify files.
 * Understand SSH port tunnels (including X11 tunnels).

The following is a partial list of the used files, terms and utilities:
 * and
 * and
 * and
 * and
 * and
 * and
 * and
 * and
 * and
 * and
 * and
 * and

license: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/4.0/


text:
User talk:Verfassungsfreund

Welcome
Welcome to Wikibooks, Verfassungsfreund!

 First steps tutorial Wikibooks is for collaborative development of free textbooks.

You do not need technical skills to contribute. You can easily change most books. Please introduce yourself, and let us know what interests you.

If you already contribute at other Wikimedia projects, our Wikimedia Orientation should quickly get you started. (Would you like to provide feedback on this message?)

  Getting help   Made a mistake?   Goodies, tips and tricks
 * Read the Using Wikibooks book for a friendly introduction to the project, or our help pages for more information.
 * You can get friendly help from the community in the user assistance room or our IRC channel.
 * Upload freely licensed files to Wikimedia Commons. You may request permission to upload fair use files locally. Please include author and source information and a non-free use rationale for non-free files.
 * You can restore a previously saved version.
 * Pages should follow the  naming convention.
 * Need to rename a page? Use the move tab (is available once your account is 4 days old - until then, ask for help).
 * To request a page be deleted, add to the top of the page.
 * Was a page you made deleted? Please read the deletion policy, and check the deletion log to find out why. Also check the RFD archives if applicable. You can request undeletion at WB:RFU, or ask the administrator who deleted the page.
 * Please fill in the edit summary and preview your edits before saving.
 * Sign your name on discussion pages by typing ~~~~
 * User scripts can make many tasks easier. Look at the Gadgets tab of my preferences; check off the boxes for the scripts you want, and hit save!

-- Jules (Mrjulesd) 23:43, 22 February 2021 (UTC)

title: User talk:Verfassungsfreund


text:
LPI Linux Certification/Measure and Troubleshoot Resource Usage

Detailed Objectives (200.1)
(LPIC-2 Version 4.5)

Weight: 6

Description: Candidates should be able to measure hardware resource and network bandwidth, identify and troubleshoot resource problems.

Key Knowledge Areas:
 * Measure CPU usage
 * Measure memory usage
 * Measure disk I/O
 * Measure network I/O
 * Measure firewalling and routing throughput
 * Map client bandwidth usage
 * Match / correlate system symptoms with likely problems
 * Estimate throughput and identify bottlenecks in a system including networking

The following is a partial list of the used files, terms and utilities:
 * processes blocked on I/O
 * blocks out
 * swap
 * blocks in
 * processes blocked on I/O
 * blocks out
 * swap
 * blocks in
 * swap
 * blocks in
 * swap
 * blocks in
 * blocks in


text:
LPI Linux Certification/Predict Future Resource Needs

Detailed Objectives (200.2)
(LPIC-1 Version 4.5)

Weight: 2

Description: Candidates should be able to monitor resource usage to predict future resource needs.

Key Knowledge Areas:
 * Use monitoring and measurement tools to monitor IT infrastructure usage.
 * Predict capacity break point of a configuration
 * Observe growth rate of capacity usage
 * Graph the trend of capacity usage
 * Awareness of monitoring solutions such as Icinga2, Nagios, collectd, MRTG and Cacti

The following is a partial list of the used files, terms and utilities:
 * diagnose
 * predict growth
 * resource exhaustion


text:
LPI Linux Certification/Kernel runtime management and troubleshooting

Detailed Objectives (201.3)
(LPIC-2 Version 4.5)

Weight: 4

Description: Candidates should be able to manage and/or query a 2.6.x, 3.x or 4.x kernel and its loadable modules. Candidates should be able to identify and correct common boot and run time issues. Candidates should understand device detection and management using udev. This objective includes troubleshooting udev rules.

Key Knowledge Areas:
 * Use command-line utilities to get information about the currently running kernel and kernel modules
 * Manually load and unload kernel modules
 * Determine when modules can be unloaded
 * Determine what parameters a module accepts
 * Configure the system to load modules by names other than their file name.
 * filesystem
 * Content of,  , and
 * Tools and utilities to analyze information about the available hardware
 * rules

Terms and Utilities:
 * module configuration files in
 * udevmonitor
 * udevadm monitor
 * udevmonitor
 * udevadm monitor
 * udevmonitor
 * udevadm monitor
 * udevmonitor
 * udevadm monitor
 * udevmonitor
 * udevadm monitor
 * udevmonitor
 * udevadm monitor
 * udevmonitor
 * udevadm monitor
 * udevmonitor
 * udevadm monitor
 * udevadm monitor


text:
LPI Linux Certification/Alternate Bootloaders

Detailed Objectives (202.3)
(LPIC-2 Version 4.5)

Weight: 2

Description: Candidates should be aware of other bootloaders and their major features.

Key Knowledge Areas:
 * SYSLINUX, ISOLINUX, PXELINUX
 * Understanding of PXE for both BIOS and UEFI
 * Awareness of systemd-boot and U-Boot

Terms and Utilities:


text:
LPI Linux Certification/Adjusting Storage Device Access

Detailed Objectives (204.2)
(LPIC-2 Version 4.5)

Weight: 2

Description: Candidates should be able to configure kernel options to support various drives. This objective includes software tools to view & modify hard disk settings including iSCSI devices.

Key Knowledge Areas:
 * Tools and utilities to configure DMA for IDE devices including ATAPI and SATA
 * Tools and utilities to configure Solid State Drives including AHCI and NVMe
 * Tools and utilities to manipulate or analyse system resources (e.g. interrupts)
 * Awareness of sdparm command and its uses
 * Tools and utilities for iSCSI
 * Awareness of SAN, including relevant protocols (AoE, FCoE)

Terms and Utilities:
 * ,,   and
 * WWID, WWN, LUN numbers
 * ,,   and
 * WWID, WWN, LUN numbers
 * ,,   and
 * WWID, WWN, LUN numbers
 * ,,   and
 * WWID, WWN, LUN numbers


text:
LPI Linux Certification/Logical Volume Manager

Detailed Objectives (204.3)
(LPIC-2 Version 4.5)

Weight: 3

Description: Candidates should be able to create and remove logical volumes, volume groups, and physical volumes. This objective includes snapshots and resizing logical volumes.

Key Knowledge Areas:
 * Tools in the LVM suite
 * Resizing, renaming, creating, and removing logical volumes, volume groups, and physical volumes
 * Creating and maintaining snapshots
 * Activating volume groups

Terms and Utilities:


text:
LPI Linux Certification/Notify users on system-related issues

Detailed Objectives (206.3)
(LPIC-2 Version 4.5)

Weight: 1

Description: Candidates should be able to notify the users about current issues related to the system.

Key Knowledge Areas:
 * Automate communication with users through logon messages
 * Inform active users of system maintenance

Terms and Utilities:


text:
User:BooksWithLooks

I like to make books.

title: User:BooksWithLooks


text:
User talk:BooksWithLooks

Welcome to my discussion

Your book
Hello, it's unclear what you plan for your book but I wanted to let you know that if you intend just to create a list of poems, then that's not in scope for Wikibooks. Source texts belong at Wikisource, and works of original fiction including poetry / songs, are out of scope for Wikibooks. If it is intended as a reading book for children, it might fit in Wikijunior. QuiteUnusual (discuss • contribs) 09:19, 23 February 2021 (UTC)

title: User talk:BooksWithLooks


text:
User:BooksWithLooks/sandbox

This is my sandbox!

title: User:BooksWithLooks/sandbox


text:
Talk:The Organ Systems/Table of Contents

The immune system is NOT an organ system. Let someone delete the page. --24.165.186.34 (discuss) 12:07, 23 February 2021 (UTC)
 * If the author wants it in the book, then it's fine in the book. There's no need to delete it. QuiteUnusual (discuss • contribs) 13:31, 23 February 2021 (UTC)


text:
Category:User mnw

Users in this category indicate they have knowledge of language Mon.

title: Category:User mnw


text: User:咽頭べさ

title: User:咽頭べさ


text:
Category:User shn

Users in this category indicate they have knowledge of language Shan.

title: Category:User shn


text:
Talk:Trigonometry/For Enthusiasts/What Tessellations are Possible with Regular Polygons

uhm this hasent been updated in 10 years — Preceding unsigned comment added by 2600:6C5E:4B7F:FDE2:5961:B0C5:A9ED:82A3 (talk • contribs)
 * Would you be interested in developing it? -- Jules (Mrjulesd) 15:09, 24 March 2021 (UTC)


text:
Cookbook:Pasta alla Gricia (Pasta with Guanciale)

Pasta alla gricia is an Italian pasta dish, typical of Rome. The preparation is very simple and quick. There are several versions of the recipe but they are all very similar.

Ingredients

 * 3 tbsp salt
 * 400 g pasta (rigatoni or spaghetti)
 * 200–300 g guanciale, chopped
 * Pecorino romano, grated
 * Black pepper

Procedure

 * 1) Heat water and salt in a pot until it starts boiling.
 * 2) Add the pasta, and cook until al dente.
 * 3) Cook the guanciale in a frying pan until fat melts almost completely.
 * 4) Add the cooked pasta to the guanciale pan, and fry for 2 minutes.
 * 5) Add grated pecorino romano and black pepper to the frying pan, and toss to blend the ingredients.


text:
LPI Linux Certification/Implementing Nginx as a web server and a reverse proxy

Detailed Objectives (208.4)
(LPIC-2 Version 4.5)

Weight: 2

Description: Candidates should be able to install and configure a reverse proxy server, Nginx. Basic configuration of Nginx as a HTTP server is included.

Key Knowledge Areas:
 * Nginx
 * Reverse Proxy
 * Basic Web Server

Terms and Utilities:


text:
LPI Linux Certification/LDAP Client Usage

Detailed Objectives (210.3)
(LPIC-2 Version 4.5)

Weight: 2

Description: Candidates should be able to perform queries and updates to an LDAP server. Also included is importing and adding items, as well as adding and managing users.

Key Knowledge Areas:
 * LDAP utilities for data management and queries
 * Change user passwords
 * Querying the LDAP directory

Terms and Utilities:


text:
LPI Linux Certification/Managing E-Mail Delivery

Detailed Objectives (211.2)
(LPIC-2 Version 4.5)

Weight: 2

Description: Candidates should be able to implement client e-mail management software to filter, sort and monitor incoming user e-mail.

Key Knowledge Areas:
 * Understanding of Sieve functionality, syntax and operators
 * Use Sieve to filter and sort mail with respect to sender, recipient(s), headers and size
 * Awareness of procmail

Terms and Utilities:
 * Conditions and comparison operators
 * keep, fileinto, redirect, reject, discard, stop
 * Dovecot vacation extension


text:
LPI Linux Certification/Managing Remote E-Mail Delivery

Detailed Objectives (211.3)
(LPIC-2 Version 4.5)

Weight: 2

Description: Candidates should be able to install and configure POP and IMAP daemons.

Key Knowledge Areas:
 * Dovecot IMAP and POP3 configuration and administration
 * Basic TLS configuration for Dovecot
 * Awareness of Courier

Terms and Utilities:


text:
Talk:General Anatomy/Digestive System/Parts

Merge
This should be moved to be a subpage of General Anatomy/Digestive System as General Anatomy/Digestive System/Parts. Minorax (discuss • contribs) 02:40, 24 February 2021 (UTC)
 * yes I think this should be merged. I will bring about this process. -- Jules (Mrjulesd) 12:07, 25 February 2021 (UTC)

You know that you can add to it. Press Edit after you press the link. — Preceding unsigned comment added by 65.31.10.98 (talk • contribs)
 * Well I'll first discuss it at Talk:General Anatomy. -- Jules (Mrjulesd) 22:57, 25 February 2021 (UTC)


text:
History of video games/Platforms/Swinxs

Development
Swiinxs was made by Swinxs BV, a company located at the Paasheuvelweg 29, 1105 BG in Amsterdam, the capital of the Netherlands. The CEO of the company at the time was Eduard Zanen. The console was created by Govert de Vries and designed by Khodi Feiz, a duo who had prior experience collaborating together. The company Peercode, known as in2sports prior to the 1st of November 2012, was involved in the development of the console.

Prior to launch, the Swinxs was demonstrated at Toy Fair 2008.

Launch
By 2008 the console had released. The console launched in the United Kingdom specifically on the 2nd of October, 2008.

The console sold in a bundle with four controllers for either $150, $175, $199.99, or 149.95 euros. Games for the system were available at no charge.

Following its launch, the console won a number of awards from parenting organizations.

Legacy
On June 1st, 2020 Swinxs was discontinued, having been on the market for 12 years. Though relatively obscure, the console is notable for it's creative and bold design, as well as it's innovative features.

Peercode continued operating after the console was discontinued, notably helping the Netherlands government quickly set up a critical employment website during COVID-19 pandemic.

Technology
"It is specifically designed to stimulate creativity and learning"

Hardware
The console was designed to be screenless and encourage physical activity, leading to a number of unique design choices.

The console has a degree of water resistance.

The console used a user replaceable rechargeable battery pack, which lasts for about 2 to 4 hours of gameplay.

Controllers
The console is controlled with wristbands known as X-S tags, which also double as memory devices for player data. There was also a playing card deck with similar functionality to the wristbands. The console is advertised as supporting between 1 and 10 players, though some games advertise supporting between 0 and 99 players. The Swinxs controllers communicated with the console using RFID, and thus did not use batteries.

Games & Software
Games were downloaded to the console over a USB connection to a computer running the Swinxslink application and which had loaded the Swinxs website. Swinxslink software was compatible with Windows and OSX. Games for the Swinxs were between 1 megabyte and 32 megabytes in download size. Some games required "credits". Some titles were region locked. The My Swinxs online service contained social functions.

The system was open to developers with a free software development kit.

Game Library
34 official games were released for the Swinxs.
 * Animal Battle
 * Animal Sounds Game
 * Busy Bodies, Speed Star Memory
 * Charades
 * CircleSwinxs
 * Count Down
 * Dark Swinxs
 * Dice
 * Duel
 * Far and Away
 * Flyswatter
 * Hansel and Gretel
 * Happy Birthday
 * Hide and Seek
 * Hide your XS
 * Jukebox
 * Little Red Riding Hood
 * Lost & Found
 * Quiz
 * Reaction Game
 * Relay
 * Sound Game
 * Soundblast
 * Swinxs Dash Pro
 * Swinxsball
 * SwinxsDash
 * Swinxsstop
 * Tag
 * Tangle
 * The Swinxs Animal Quiz
 * The Swinxs Cartoon and Fairy Tale Quiz
 * The Swinxs Sports Game
 * The Ugly Duckling
 * Touchdown - American Football Game

title: History of video games/Platforms/Swinxs


text:
Talk:Flora of New York/Legends

Horrible Latin
According to my (and my dictionary's) knowledge, "plantus" is not a Latin word. I'd recommend saying "planta" and "planta communis", as in true Latin. See for example Planta. -- Martinus KE (discuss • contribs) 15:30, 24 February 2021 (UTC)
 * any chance of you fixing it? -- Jules (Mrjulesd) 15:10, 24 March 2021 (UTC)

title: Talk:Flora of New York/Legends


text:
User:PEMNCX

welcome Bienvenido Bienvenida

title: User:PEMNCX


text:
Tibetan/Nouns

མིང་ཚིག Ming tshig

Honorific forms
Many nouns and verbs have honorific forms called she sa.

Declensions
Here we have the declension of the noun house (Nang)

Genitive Case
The last sound of the noun determines the genitive suffix. The following rules determine the appropiate suffixes:

Agentive Case
The rules for which suffix to use are as follows;

Ablative
In sentences:
 * བོད་ནས།
 * Bod na
 * From Tibet.
 * རྒྱ་གར་ནས།
 * Gya gar na
 * From India.
 * ཡུ་རོབ་ནས།
 * Yu rob na
 * From Europe.
 * ཁོང་ཡུ་རོབ་ནས་རེད།
 * Khong yu rob na red
 * She is from Europe.
 * ཁྱེད་རང་རྒྱ་གར་ནས་ཡིན་པས།
 * Khyed rang gya gar na yin pa
 * Are you from India?
 * ང་བོད་ནས་མ་རེད་པས།
 * Nga bod na ma red pa
 * Am not I from Tibet?

title: Tibetan/Nouns


text:
User:Ntoki Mbuthuma

Ntoki Mbuthuma is an book lover

title: User:Ntoki Mbuthuma


text:
History of video games/Platforms/LeapFrog Didj

Launch
The system was announced on February 5th, 2008. The Didj was marketed more as a gaming device with educational value, rather then an educational device with entertainment value.

The Didj was launched in mid 2008. The system cost $89.99 at launch with games costing $29.99.

By February 2010 the system was being sold for as little as $25, gaining the interest of Linux enthusiasts looking for cheap portable computers. By the middle of 2010 the device was discontinued.

Legacy
As the system was popular with Linux enthusiasts, a surprising number of mods were developed for it. Such mods included adding MicroSD card capabilities or doubling the RAM to a capacity of 64 megabytes.

Technology
The Didj was built on the Leapfrog Pollux Platform. The Didj uses the same CPU as the GP2X at a lower clock speed, with software being relatively portable between the two. This processor used a 32-bit ARM9 architecture. Different sources list the processor clock speed at either 300 megahertz or 393 megahertz. The system had 32 megabytes of RAM, with different sources listing either "DDRI" or "SDRAM". The system graphics supported basic 3D with OpenGL ES 1.1 support.

The system had 256 megabytes of internal storage, and cartridge media held 64 megabytes.

The system used Brio Firmware.

The Didj has a 3.2" screen with a resolution of 320 by 240 pixels. The screen can output 16.7 million colors. The system has unused composite out hardware, which can be enabled with modding.

The system was powered by 4 AA batteries, with an optional $35 rechargeable NIMH battery pack available. 35,000 early rechargeable battery packs sold between October 2008 were defective, and recalled on October 23rd, 2008 as they could burn the user, with one incident of a burnt hand reported.

Games
Games could be enhanced with a custom vocabulary.


text:
History of video games/Platforms/JXD 1000

History
The JXD 1000 was a handheld game console released in 2009 by the Shenzhen China based firm JinXing Digital CO.Ltd (JXD for short). The system cost $88 in 2009. The system was primarily used to play unlicensed retro games through emulation.

Technology
The system is powered by a Sunplus 8000 series chipset and a proprietary firmware.

The handheld formfactor was similar to a PSP, but featured an integrated rear camera. The user interface mimics the style of iOS used on Apple iPhones at the time.

The system was shipped with an AC adapter.


text:
User:Pranavmanglani/Project work

PROJECT WORK SITE CREATED TO FIND ANY DEFINATION ON GRAMMAR FROM1 TO 3 GRADE

title: User:Pranavmanglani/Project work


text:
User talk:Pranavmanglani

Note
A page you created has been moved to User:Pranavmanglani/Project work. If you intend to expand it, please work on it there. Thanks. Minorax (discuss • contribs) 06:02, 25 February 2021 (UTC)

title: User talk:Pranavmanglani


text:
History of video games/Platforms/PC-8800 series

Launch
NEC launched the PC-8800 line in 1981. The system would quickly become a mainstay in Japanese home computer gaming.

Use by creatives
The PC88 was a popular platform for Japanese indie game developers during the 1980's.

Composer Yuzo Koshiro often used the PC-88 when developing music for console games, actively using the system for commercial title development as recently as 2016 with his work on Etrian Odyssey V.

Technology
The technical attributes of the system resulted games for the system possessing a unique aesthetic.

Games

 * Snatcher - An early story based game by Hideo Kojima.
 * Excite Bike
 * Balloon Fight

Super Mario Bros. Special
An infamously poor yet official port of Super Mario Bros for the computer.

Read More

 * The Wikibook NEC PC Programmers Reference has information on programing NEC computers, including the PC88 series.


text:
User talk:Mathmogeek

Moving Pages
In order to meet the requirements of the site license, we need to maintain a record of authors. This means that you can't move content by a copy / paste type activity. If you want to move a page, please use the "Move" function or ask an administrator to help. Thanks. QuiteUnusual (discuss • contribs) 12:42, 25 February 2021 (UTC)

 * Oh, fair enough. I did not know about that, but to be fair I did change almost all of it. But, still fair enough. I will do that. Thank you for this. --Mathmogeek (discuss • contribs) 13:49, 25 February 2021 (UTC)

 * I think it is too late now to do much about the page in question. However, I will do that next time. --Mathmogeek (discuss • contribs) 13:49, 25 February 2021 (UTC)

 * Actually, it's okay as I moved the old page and merged the histories so the new page now has the old page's edit history. I was just pointing it out so you knew next time. QuiteUnusual (discuss • contribs) 16:03, 25 February 2021 (UTC)

 * Thank you for this! This is what makes Wiki a great place! --Mathmogeek (discuss • contribs) 16:10, 25 February 2021 (UTC)

Response to your request
About your question at Requests for permissions: I don't really know. But its been left open for admins to opine. -- Jules (Mrjulesd) 17:36, 25 February 2021 (UTC)
 * Thank you for leaving it open :). --Mathmogeek (discuss • contribs) 17:42, 25 February 2021 (UTC)
 * About your edits at Requests for permissions: Leaderboard is quite correct, I'm not an admin (although I may be in the near future), but I strongly advise you to accept the opinion of Leaderboard on this topic. They're a highly trusted and long-standing administrator on this project, and I think they're quite correct in their decision to withhold the permission at this time. -- Jules (Mrjulesd) 18:33, 26 February 2021 (UTC)

Hi, I think you're wondering why you haven't been promoted to reviewer yet. Let me explain per Reviewers

 * ✓ Have a registered account that is at least 30 days
 * ✕ enabled email: you haven't enabled email in preferences: Special:Preferences
 * ✓ Have never been blocked
 * ✓ 100 edits since registration
 * ✓ 50 or more edits are to pages other than discussion pages.
 * ✓ 50 or more edit summaries are used.
 * ✓ 10 or more unique pages are edited at least once.
 * ✕ 8 edits are spaced 2 or more days apart from each other (which takes at least 14 days, if you edit every 2 days): you haven't passed, see below
 * ✓ 5 or more edits are in recent changes

You haven't passed "8 edits are spaced 2 or more days apart from each other (which takes at least 14 days, if you edit every 2 days)." as you have edited on:
 * 1st Feb: 1st of eight
 * (2nd Feb didn't count)
 * 25th Feb: 2nd of eight
 * (26th Feb didn't count)
 * 27th Feb: 3rd of eight
 * 1st March: 4th of eight

'''Conclusion: you need to make 4 more edits spaced 2 days apart from each other. You also need to enable email.''' -- Jules (Mrjulesd) 06:56, 2 March 2021 (UTC)

 * How many more edits (spaced 2 days apart) do I have to make now? Mathmogeek (discuss • contribs) 16:42, 6 June 2021 (UTC)

 * I think you need a couple more. -- Jules (Mrjulesd) 18:16, 6 June 2021 (UTC)
 * @Mrjulesd I think I now have 8 edits that are spaced 2 or more days apart from each other. Mathmogeek (discuss • contribs) 08:33, 4 September 2021 (UTC)

title: User talk:Mathmogeek


text:
Oberon/V2/Graphics

MODULE Graphics; (*NW 21.12.89 / 3.2.92*) IMPORT Files, Modules, Display, Fonts, Printer, Texts, Oberon; CONST NameLen* = 16; GraphFileId = 0F9X; LibFileId = 0FDX; TYPE Graph* = POINTER TO GraphDesc; Object* = POINTER TO ObjectDesc; Method* = POINTER TO MethodDesc; Line* = POINTER TO LineDesc; Caption* = POINTER TO CaptionDesc; Macro* = POINTER TO MacroDesc; ObjectDesc* = RECORD x*, y*, w*, h*, col*: INTEGER; selected*, marked*: BOOLEAN; do*: Method; next, dmy: Object END ; Msg* = RECORD END ; WidMsg* = RECORD (Msg) w*: INTEGER END ; ColorMsg* = RECORD (Msg) col*: INTEGER END ; FontMsg* = RECORD (Msg) fnt*: Fonts.Font END ; Name* = ARRAY NameLen OF CHAR; GraphDesc* = RECORD time*: LONGINT; sel*, first: Object END ; MacHead* = POINTER TO MacHeadDesc; MacExt* = POINTER TO MacExtDesc; Library* = POINTER TO LibraryDesc; MacHeadDesc* = RECORD name*: Name; w*, h*: INTEGER; ext*: MacExt; lib*: Library; first: Object; next: MacHead END ; LibraryDesc* = RECORD name*: Name; first: MacHead; next: Library END ; MacExtDesc* = RECORD END ; Context* = RECORD nofonts, noflibs, nofclasses: INTEGER; font: ARRAY 10 OF Fonts.Font; lib: ARRAY 4 OF Library; class: ARRAY 10 OF Modules.Command END; MethodDesc* = RECORD module*, allocator*: Name; new*: Modules.Command; copy*: PROCEDURE (from, to: Object); draw*, handle*: PROCEDURE (obj: Object; VAR msg: Msg); selectable*: PROCEDURE (obj: Object; x, y: INTEGER): BOOLEAN; read*: PROCEDURE (obj: Object; VAR R: Files.Rider; VAR C: Context); write*: PROCEDURE (obj: Object; cno: SHORTINT; 					VAR R: Files.Rider; VAR C: Context); print*: PROCEDURE (obj: Object; x, y: INTEGER) END ; LineDesc* = RECORD (ObjectDesc) END ; CaptionDesc* = RECORD (ObjectDesc) pos*, len*: INTEGER END ; MacroDesc* = RECORD (ObjectDesc) mac*: MacHead END ; VAR new*: Object; width*, res*: INTEGER; T*: Texts.Text; (*captions*) LineMethod*, CapMethod*, MacMethod* : Method; FirstLib: Library; W, TW: Texts.Writer; PROCEDURE Add*(G: Graph; obj: Object); BEGIN obj.marked := FALSE; obj.selected := TRUE; obj.next := G.first; G.first := obj; G.sel := obj; G.time := Oberon.Time END Add; PROCEDURE Draw*(G: Graph; VAR M: Msg); VAR obj: Object; BEGIN obj := G.first; WHILE obj # NIL DO obj.do.draw(obj, M); obj := obj.next END END Draw; PROCEDURE ThisObj*(G: Graph; x, y: INTEGER): Object; VAR obj: Object; BEGIN obj := G.first; WHILE (obj # NIL) & ~obj.do.selectable(obj, x ,y) DO obj := obj.next END ; RETURN obj END ThisObj; PROCEDURE SelectObj*(G: Graph; obj: Object); BEGIN IF obj # NIL THEN obj.selected := TRUE; G.sel := obj; G.time := Oberon.Time END END SelectObj; PROCEDURE SelectArea*(G: Graph; x0, y0, x1, y1: INTEGER); VAR obj: Object; t: INTEGER; BEGIN obj := G.first; IF x1 < x0 THEN t := x0; x0 := x1; x1 := t END ; IF y1 < y0 THEN t := y0; y0 := y1; y1 := t END ; WHILE obj # NIL DO 			IF (x0 <= obj.x) & (obj.x + obj.w <= x1) & (y0 <= obj.y) & (obj.y + obj.h <= y1) THEN obj.selected := TRUE; G.sel := obj END ; obj := obj.next END ; IF G.sel # NIL THEN G.time := Oberon.Time END END SelectArea; PROCEDURE Enumerate*(G: Graph; 			handle: PROCEDURE (obj: Object; VAR done: BOOLEAN)); VAR obj: Object; done: BOOLEAN; BEGIN done := FALSE; obj := G.first; WHILE (obj # NIL) & ~done DO handle(obj, done); obj := obj.next END END Enumerate; (*procedures operating on selection ---*) PROCEDURE Deselect*(G: Graph); VAR obj: Object; BEGIN obj := G.first; G.sel := NIL; G.time := 0; WHILE obj # NIL DO obj.selected := FALSE; obj := obj.next END END Deselect; PROCEDURE DrawSel*(G: Graph; VAR M: Msg); VAR obj: Object; BEGIN obj := G.first; WHILE obj # NIL DO 			IF obj.selected THEN obj.do.draw(obj, M) END ; obj := obj.next END END DrawSel; PROCEDURE Handle*(G: Graph; VAR M: Msg); VAR obj: Object; BEGIN obj := G.first; WHILE obj # NIL DO 			IF obj.selected THEN obj.do.handle(obj, M) END ; obj := obj.next END END Handle; PROCEDURE Move*(G: Graph; dx, dy: INTEGER); VAR obj, ob0: Object; x0, x1, y0, y1: INTEGER; BEGIN obj := G.first; WHILE obj # NIL DO 			IF obj.selected & ~(obj IS Caption) THEN x0 := obj.x; x1 := obj.w + x0; y0 := obj.y; y1 := obj.h + y0; IF dx = 0 THEN (*vertical move*) ob0 := G.first; WHILE ob0 # NIL DO 						IF ~ob0.selected & (ob0 IS Line) & (x0 <= ob0.x) 									& (ob0.x <= x1) & (ob0.w < ob0.h) THEN IF (y0 <= ob0.y) & (ob0.y <= y1) THEN INC(ob0.y, dy); DEC(ob0.h, dy); ob0.marked := TRUE ELSIF (y0 <= ob0.y + ob0.h) & (ob0.y + ob0.h <= y1) THEN INC(ob0.h, dy); ob0.marked := TRUE END END ; ob0 := ob0.next END ELSIF dy = 0 THEN (*horizontal move*) ob0 := G.first; WHILE ob0 # NIL DO 						IF ~ob0.selected & (ob0 IS Line) & (y0 <= ob0.y) 								& (ob0.y <= y1) & (ob0.h < ob0.w) THEN IF (x0 <= ob0.x) & (ob0.x <= x1) THEN INC(ob0.x, dx); DEC(ob0.w, dx); ob0.marked := TRUE ELSIF (x0 <= ob0.x + ob0.w) & (ob0.x + ob0.w <= x1) THEN INC(ob0.w, dx); ob0.marked := TRUE END END ; ob0 := ob0.next END END END ; obj := obj.next END ; obj := G.first; (*now move*) WHILE obj # NIL DO 			IF obj.selected THEN INC(obj.x, dx); INC(obj.y, dy) END ; obj.marked := FALSE; obj := obj.next END END Move; PROCEDURE Copy*(Gs, Gd: Graph; dx, dy: INTEGER); VAR obj: Object; BEGIN obj := Gs.first; WHILE obj # NIL DO 			IF obj.selected THEN obj.do.new; obj.do.copy(obj, new); INC(new.x, dx); INC(new.y, dy); obj.selected := FALSE; Add(Gd, new) END ; obj := obj.next END ; new := NIL END Copy; PROCEDURE Delete*(G: Graph); VAR obj, pred: Object; BEGIN G.sel := NIL; obj := G.first; WHILE (obj # NIL) & obj.selected DO obj := obj.next END ; G.first := obj; IF obj # NIL THEN pred := obj; obj := obj.next; WHILE obj # NIL DO 				IF obj.selected THEN pred.next := obj.next ELSE pred := obj END ; obj := obj.next END END END Delete; (* -- File I/O *) PROCEDURE ReadInt*(VAR R: Files.Rider; VAR x: INTEGER); VAR c0: CHAR; s1: SHORTINT; BEGIN Files.Read(R, c0); Files.Read(R, s1); x := s1; x := x * 100H + ORD(c0) END ReadInt; PROCEDURE ReadLInt*(VAR R: Files.Rider; VAR x: LONGINT); VAR c0, c1, c2: CHAR; s3: SHORTINT; BEGIN Files.Read(R, c0); Files.Read(R, c1); Files.Read(R, c2); Files.Read(R, s3); x := s3; x := ((x * 100H + LONG(c2)) * 100H + LONG(c1)) * 100H + LONG(c0) END ReadLInt; PROCEDURE ReadString*(VAR R: Files.Rider; VAR s: ARRAY OF CHAR); VAR i: INTEGER; ch: CHAR; BEGIN i := 0; REPEAT Files.Read(R, ch); s[i] := ch; INC(i) UNTIL ch = 0X END ReadString; PROCEDURE ReadObj(VAR R: Files.Rider; obj: Object); BEGIN ReadInt(R, obj.x); ReadInt(R, obj.y); ReadInt(R, obj.w); ReadInt(R, obj.h); ReadInt(R, obj.col) END ReadObj; PROCEDURE WriteInt*(VAR W: Files.Rider; x: INTEGER); BEGIN Files.Write(W, CHR(x)); Files.Write(W, CHR(x DIV 100H)) END WriteInt; PROCEDURE WriteLInt*(VAR W: Files.Rider; x: LONGINT); BEGIN Files.Write(W, CHR(x)); Files.Write(W, CHR(x DIV 100H)); Files.Write(W, CHR(x DIV 10000H)); Files.Write(W, CHR(x DIV 1000000H)) END WriteLInt; PROCEDURE WriteString*(VAR W: Files.Rider; VAR s: ARRAY OF CHAR); VAR i: INTEGER; ch: CHAR; BEGIN i := 0; REPEAT ch := s[i]; INC(i); Files.Write(W, ch) UNTIL ch = 0X END WriteString; PROCEDURE WriteObj*(VAR W: Files.Rider; cno: SHORTINT; obj: Object); BEGIN Files.Write(W, cno); WriteInt(W, obj.x); WriteInt(W, obj.y); WriteInt(W, obj.w); WriteInt(W, obj.h); WriteInt(W, obj.col) END WriteObj; (* -- Storing --- *) PROCEDURE WMsg(s0, s1: ARRAY OF CHAR); BEGIN Texts.WriteString(W, s0); Texts.WriteString(W, s1); Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf) END WMsg; PROCEDURE InitContext(VAR C: Context); BEGIN C.nofonts := 0; C.noflibs := 0; C.nofclasses := 4; C.class[1] := LineMethod.new; C.class[2] := CapMethod.new; C.class[3] := MacMethod.new END InitContext; PROCEDURE FontNo*(VAR W: Files.Rider; VAR C: Context; fnt: Fonts.Font): SHORTINT; VAR fno: SHORTINT; BEGIN fno := 0; WHILE (fno < C.nofonts) & (C.font[fno] # fnt) DO INC(fno) END ; IF fno = C.nofonts THEN Files.Write(W, 0); Files.Write(W, 0); Files.Write(W, fno); WriteString(W, fnt.name); C.font[fno] := fnt; INC(C.nofonts) END ; RETURN fno END FontNo; PROCEDURE StoreElems(VAR W: Files.Rider; VAR C: Context; obj: Object); VAR cno: INTEGER; BEGIN WHILE obj # NIL DO 			cno := 1; WHILE (cno < C.nofclasses) & (obj.do.new # C.class[cno]) DO INC(cno) END ; IF cno = C.nofclasses THEN Files.Write(W, 0); Files.Write(W, 2); Files.Write(W, SHORT(cno)); WriteString(W, obj.do.module); WriteString(W, obj.do.allocator); C.class[cno] := obj.do.new; INC(C.nofclasses) END ; obj.do.write(obj, SHORT(cno), W, C); obj := obj.next END ; Files.Write(W, -1) END StoreElems; PROCEDURE Store*(G: Graph; VAR W: Files.Rider); VAR C: Context; BEGIN InitContext(C); StoreElems(W, C, G.first) END Store; PROCEDURE WriteFile*(G: Graph; name: ARRAY OF CHAR); VAR F: Files.File; W: Files.Rider; C: Context; BEGIN F := Files.New(name); Files.Set(W, F, 0); Files.Write(W, GraphFileId); InitContext(C); StoreElems(W, C, G.first); Files.Register(F) END WriteFile; PROCEDURE Print*(G: Graph; x0, y0: INTEGER); VAR obj: Object; BEGIN obj := G.first; WHILE obj # NIL DO obj.do.print(obj, x0, y0); obj := obj.next END END Print; (* -- Loading *) PROCEDURE ThisClass*(VAR module, allocator: ARRAY OF CHAR): Modules.Command; VAR mod: Modules.Module; com: Modules.Command; BEGIN mod := Modules.ThisMod(module); IF mod # NIL THEN com := Modules.ThisCommand(mod, allocator); IF com = NIL THEN WMsg(allocator, " unknown") END ELSE WMsg(module, " not available"); com := NIL END ; RETURN com END ThisClass; PROCEDURE Font*(VAR R: Files.Rider; VAR C: Context): Fonts.Font; VAR fno: SHORTINT; BEGIN Files.Read(R, fno); RETURN C.font[fno] END Font; PROCEDURE^ ThisLib*(VAR name: ARRAY OF CHAR; replace: BOOLEAN): Library; PROCEDURE LoadElems(VAR R: Files.Rider; VAR C: Context; VAR obj: Object); VAR cno, len, k: SHORTINT; name, name1: ARRAY 32 OF CHAR; BEGIN obj := NIL; Files.Read(R, cno); WHILE ~R.eof & (cno >= 0) DO 			IF cno = 0 THEN Files.Read(R, cno); Files.Read(R, k); ReadString(R, name); IF cno = 0 THEN C.font[k] := Fonts.This(name) ELSIF cno = 1 THEN C.lib[k] := ThisLib(name, FALSE) ELSE ReadString(R, name1); C.class[k] := ThisClass(name, name1) END ELSIF C.class[cno] # NIL THEN C.class[cno]; ReadObj(R, new); new.selected := FALSE; new.marked := FALSE; new.next := obj; obj := new; new.do.read(new, R, C) 			ELSE Files.Set(R, Files.Base(R), Files.Pos(R) + 10); Files.Read(R, len); Files.Set(R, Files.Base(R), Files.Pos(R) + len) END ; Files.Read(R, cno) END ; new := NIL END LoadElems; PROCEDURE Load*(G: Graph; VAR R: Files.Rider); VAR C: Context; BEGIN G.sel := NIL; InitContext(C); LoadElems(R, C, G.first) END Load; PROCEDURE Open*(G: Graph; name: ARRAY OF CHAR); VAR tag: CHAR; F: Files.File; R: Files.Rider; C: Context; BEGIN G.first := NIL; G.sel := NIL; G.time := 0; F := Files.Old(name); IF F # NIL THEN Files.Set(R, F, 0); Files.Read(R, tag); IF tag = GraphFileId THEN InitContext(C); LoadElems(R, C, G.first); res := 0 ELSE res := 1 END ELSE res := 2 END END Open; (* - Macros / Libraries --- *) PROCEDURE ThisLib*(VAR name: ARRAY OF CHAR; replace: BOOLEAN): Library; VAR i, j: INTEGER; ch: CHAR; L: Library; mh: MacHead; F: Files.File; R: Files.Rider; C: Context; Lname, Fname: ARRAY 32 OF CHAR; BEGIN L := FirstLib; i := 0; WHILE name[i] >= "0" DO Lname[i] := name[i]; INC(i) END ; Lname[i] := 0X; WHILE (L # NIL) & (L.name # Lname) DO L := L.next END ; IF (L = NIL) OR replace THEN (*load library*) j := 0; WHILE name[j] > 0X DO Fname[j] := name[j]; INC(j) END ; IF i = j THEN Fname[j] := "."; Fname[j+1] := "L"; Fname[j+2] := "i"; Fname[j+3] := "b"; INC(j, 4) END ; Fname[j] := 0X; F := Files.Old(Fname); IF F # NIL THEN WMsg("loading ", name); Files.Set(R, F, 0); Files.Read(R, ch); IF ch = LibFileId THEN IF L = NIL THEN NEW(L); COPY(Lname, L.name); L.next := FirstLib; FirstLib := L 					END ; L.first := NIL; InitContext(C); WHILE ~R.eof DO 						NEW(mh); LoadElems(R, C, mh.first); ReadInt(R, mh.w); ReadInt(R, mh.h); ReadString(R, mh.name); mh.lib := L; mh.next := L.first; L.first := mh; END ELSE L := NIL; WMsg(name, " bad library") END ELSE WMsg(name, " not found") END END ; RETURN L 	END ThisLib; PROCEDURE NewLib*(VAR Lname: ARRAY OF CHAR): Library; VAR L: Library; BEGIN NEW(L); COPY(Lname, L.name); L.first := NIL; L.next := FirstLib; FirstLib := L; RETURN L 	END NewLib; PROCEDURE StoreLib*(L: Library; VAR Fname: ARRAY OF CHAR); VAR mh: MacHead; F: Files.File; W: Files.Rider; C: Context; BEGIN F := Files.New(Fname); Files.Set(W, F, 0); Files.Write(W, LibFileId); InitContext(C); mh := L.first; WHILE mh # NIL DO 			WriteInt(W, mh.w); WriteInt(W, mh.h); WriteString(W, mh.name); StoreElems(W, C, mh.first); mh := mh.next END END StoreLib; PROCEDURE RemoveLibraries*; BEGIN FirstLib := NIL END RemoveLibraries; PROCEDURE ThisMac*(L: Library; VAR Mname: ARRAY OF CHAR): MacHead; VAR mh: MacHead; BEGIN mh := L.first; WHILE (mh # NIL) & (mh.name # Mname) DO mh := mh.next END ; RETURN mh 	END ThisMac; PROCEDURE OpenMac*(mh: MacHead; G: Graph; x, y: INTEGER); VAR obj: Object; BEGIN obj := mh.first; WHILE obj # NIL DO 			obj.do.new; obj.do.copy(obj, new); INC(new.x, x); INC(new.y, y); new.selected := TRUE; Add(G, new); obj := obj.next END ; new := NIL END OpenMac; PROCEDURE DrawMac*(mh: MacHead; VAR M: Msg); VAR elem: Object; BEGIN elem := mh.first; WHILE elem # NIL DO elem.do.draw(elem, M); elem := elem.next END END DrawMac; PROCEDURE MakeMac*(G: Graph; x, y, w, h: INTEGER; 			VAR Mname: ARRAY OF CHAR): MacHead; VAR obj, last: Object; mh: MacHead; BEGIN obj := G.first; last := NIL; WHILE obj # NIL DO 			IF obj.selected THEN obj.do.new; obj.do.copy(obj, new); new.next := last; new.selected := FALSE; DEC(new.x, x); DEC(new.y, y); last := new END ; obj := obj.next END ; NEW(mh); mh.w := w; mh.h := h; mh.first := last; mh.ext := NIL; COPY(Mname, mh.name); new := NIL; RETURN mh 	END MakeMac; PROCEDURE InsertMac*(mh: MacHead; L: Library; VAR new: BOOLEAN); VAR mh1: MacHead; BEGIN mh.lib := L; mh1 := L.first; WHILE (mh1 # NIL) & (mh1.name # mh.name) DO mh1 := mh1.next END ; IF mh1 = NIL THEN new := TRUE; mh.next := L.first; L.first := mh 		ELSE new := FALSE; mh1.w := mh.w; mh1.h := mh.h; mh1.first := mh.first END END InsertMac; (* Line Methods -*) PROCEDURE* NewLine; VAR line: Line; BEGIN NEW(line); new := line; line.do := LineMethod END NewLine; PROCEDURE* CopyLine(src, dst: Object); BEGIN dst.x := src.x; dst.y := src.y; dst.w := src.w; dst.h := src.h; dst.col := src.col END CopyLine; PROCEDURE* HandleLine(obj: Object; VAR M: Msg); BEGIN IF M IS WidMsg THEN IF obj.w < obj.h THEN IF obj.w <= 7 THEN obj.w := M(WidMsg).w END ELSIF obj.h <= 7 THEN obj.h := M(WidMsg).w 			END ELSIF M IS ColorMsg THEN obj.col := M(ColorMsg).col END END HandleLine; PROCEDURE* LineSelectable(obj: Object; x, y: INTEGER): BOOLEAN; BEGIN RETURN (obj.x <= x) & (x < obj.x + obj.w) & (obj.y <= y) & (y < obj.y + obj.h) 	END LineSelectable; PROCEDURE* ReadLine(obj: Object; VAR R: Files.Rider; VAR C: Context); BEGIN END ReadLine; PROCEDURE* WriteLine(obj: Object; cno: SHORTINT; 			VAR W: Files.Rider; VAR C: Context); BEGIN WriteObj(W, cno, obj) END WriteLine; PROCEDURE* PrintLine(obj: Object; x, y: INTEGER); VAR w, h: INTEGER; BEGIN w := obj.w * 2; h := obj.h * 2; IF w < h THEN h := 2*h ELSE w := 2*w END ; Printer.ReplConst(obj.x * 4 + x, obj.y *4 + y, w, h) 	END PrintLine; (* -- Caption Methods *) PROCEDURE* NewCaption; VAR cap: Caption; BEGIN NEW(cap); new := cap; cap.do := CapMethod END NewCaption; PROCEDURE* CopyCaption(src, dst: Object); VAR ch: CHAR; R: Texts.Reader; BEGIN WITH src: Caption DO 			WITH dst: Caption DO 				dst.x := src.x; dst.y := src.y; dst.w := src.w; dst.h := src.h; dst.col := src.col; dst.pos := SHORT(T.len + 1); dst.len := src.len; Texts.Write(TW, 0DX); Texts.OpenReader(R, T, src.pos); Texts.Read(R, ch); TW.fnt := R.fnt; WHILE ch > 0DX DO Texts.Write(TW, ch); Texts.Read(R, ch) END END END ; Texts.Append(T, TW.buf) END CopyCaption; PROCEDURE* HandleCaption(obj: Object; VAR M: Msg); VAR dx, x1, dy, y1, w, w1, h1, len: INTEGER; pos: LONGINT; ch: CHAR; pat: Display.Pattern; fnt: Fonts.Font; R: Texts.Reader; BEGIN IF M IS FontMsg THEN fnt := M(FontMsg).fnt; w := 0; len := 0; pos := obj(Caption).pos; Texts.OpenReader(R, T, pos); Texts.Read(R, ch); dy := R.fnt.minY; WHILE ch > 0DX DO 				Display.GetChar(fnt.raster, ch, dx, x1, y1, w1, h1, pat); INC(w, dx); INC(len); Texts.Read(R, ch) END ; INC(obj.y, fnt.minY-dy); obj.w := w; obj.h := fnt.height; Texts.ChangeLooks(T, pos, pos+len, {0}, fnt, 0, 0) ELSIF M IS ColorMsg THEN obj.col := M(ColorMsg).col END END HandleCaption; PROCEDURE* CaptionSelectable(obj: Object; x, y: INTEGER): BOOLEAN; BEGIN RETURN (obj.x <= x) & (x < obj.x + obj.w) & (obj.y <= y) & (y < obj.y + obj.h) 	END CaptionSelectable; PROCEDURE* ReadCaption(obj: Object; VAR R: Files.Rider; VAR C: Context); VAR ch: CHAR; fno: SHORTINT; len: INTEGER; BEGIN obj(Caption).pos := SHORT(T.len + 1); Texts.Write(TW, 0DX); Files.Read(R, fno); TW.fnt := C.font[fno]; len := 0; Files.Read(R, ch); WHILE ch > 0DX DO Texts.Write(TW, ch); INC(len); Files.Read(R, ch) END ; obj(Caption).len := len; Texts.Append(T, TW.buf) END ReadCaption; PROCEDURE* WriteCaption(obj: Object; cno: SHORTINT; 			VAR W: Files.Rider; VAR C: Context); VAR ch: CHAR; fno: SHORTINT; TR: Texts.Reader; BEGIN Texts.OpenReader(TR, T, obj(Caption).pos); Texts.Read(TR, ch); fno := FontNo(W, C, TR.fnt); WriteObj(W, cno, obj); Files.Write(W, fno); WHILE ch > 0DX DO Files.Write(W, ch); Texts.Read(TR, ch) END ; Files.Write(W, 0X) END WriteCaption; PROCEDURE* PrintCaption(obj: Object; x, y: INTEGER); VAR fnt: Fonts.Font; i: INTEGER; ch: CHAR; R: Texts.Reader; s: ARRAY 128 OF CHAR; BEGIN Texts.OpenReader(R, T, obj(Caption).pos); Texts.Read(R, ch); fnt := R.fnt; DEC(y, fnt.minY*4); i := 0; WHILE ch >= " " DO s[i] := ch; INC(i); Texts.Read(R, ch) END ; s[i] := 0X; IF i > 0 THEN Printer.String(obj.x*4 + x, obj.y*4 + y, s, fnt.name) END END PrintCaption; (* -- Macro Methods *) PROCEDURE* NewMacro; VAR mac: Macro; BEGIN NEW(mac); new := mac; mac.do := MacMethod END NewMacro; PROCEDURE* CopyMacro(src, dst: Object); BEGIN dst.x := src.x; dst.y := src.y; dst.w := src.w; dst.h := src.h; 		dst.col := src.col; dst(Macro).mac := src(Macro).mac END CopyMacro; PROCEDURE* HandleMacro(obj: Object; VAR M: Msg); BEGIN IF M IS ColorMsg THEN obj.col := M(ColorMsg).col END END HandleMacro; PROCEDURE* MacroSelectable(obj: Object; x, y: INTEGER): BOOLEAN; BEGIN RETURN (obj.x <= x) & (x <= obj.x + 8) & (obj.y <= y) & (y <= obj.y + 8) END MacroSelectable; PROCEDURE* ReadMacro(obj: Object; VAR R: Files.Rider; VAR C: Context); VAR lno: SHORTINT; name: ARRAY 32 OF CHAR; BEGIN Files.Read(R, lno); ReadString(R, name); obj(Macro).mac := ThisMac(C.lib[lno], name) END ReadMacro; PROCEDURE* WriteMacro(obj: Object; cno: SHORTINT; 			VAR W1: Files.Rider; VAR C: Context); VAR ch: CHAR; lno: SHORTINT; TR: Texts.Reader; BEGIN lno := 0; WITH obj: Macro DO 			WHILE (lno < C.noflibs) & (obj.mac.lib # C.lib[lno]) DO INC(lno) END ; IF lno = C.noflibs THEN Files.Write(W1, 0); Files.Write(W1, 1); Files.Write(W1, lno); WriteString(W1, obj.mac.lib.name); C.lib[lno] := obj.mac.lib; INC(C.noflibs) END ; WriteObj(W1, cno, obj); Files.Write(W1, lno); WriteString(W1, obj.mac.name) END END WriteMacro; PROCEDURE* PrintMacro(obj: Object; x, y: INTEGER); VAR elem: Object; mh: MacHead; BEGIN mh := obj(Macro).mac; IF mh # NIL THEN elem := mh.first; WHILE elem # NIL DO 				elem.do.print(elem, obj.x*4 + x, obj.y*4 + y); elem := elem.next END END END PrintMacro; PROCEDURE* Notify(T: Texts.Text; op: INTEGER; beg, end: LONGINT); BEGIN END Notify; BEGIN Texts.OpenWriter(W); Texts.OpenWriter(TW); width := 1; NEW(T); Texts.Open(T, ""); T.notify := Notify; NEW(LineMethod); LineMethod.new := NewLine; LineMethod.copy := CopyLine; LineMethod.selectable := LineSelectable; LineMethod.handle := HandleLine; LineMethod.read := ReadLine; LineMethod.write := WriteLine; LineMethod.print := PrintLine; NEW(CapMethod); CapMethod.new := NewCaption; CapMethod.copy := CopyCaption; CapMethod.selectable := CaptionSelectable; CapMethod.handle := HandleCaption; CapMethod.read := ReadCaption; CapMethod.write := WriteCaption; CapMethod.print := PrintCaption; NEW(MacMethod); MacMethod.new := NewMacro; MacMethod.copy := CopyMacro; MacMethod.selectable := MacroSelectable; MacMethod.handle := HandleMacro; MacMethod.read := ReadMacro; MacMethod.write := WriteMacro; MacMethod.print := PrintMacro END Graphics.

title: Oberon/V2/Graphics


text:
Category:Book:Knot Theory

This is the Knot Theory book.

title: Category:Book:Knot Theory


text:
Free Knowledge Culture Calendar/July 30

Today in 2020 the first Linux systems were launched to Mars. NASA’s Mars 2020 mission uses Linux to relay imagery and control flight of the autonomous drone helicopter Ingenuity, among other things, and includes other Free Software like the famous FFMpeg.

title: Free Knowledge Culture Calendar/July 30


text:
Pharmacology/Introduction

So how does the brain work? What are Receptors and Neurotransmitters? What is an agnist and antagonist?

In this brief introductory section, we will be introducing these new terminologies.

The brain has billions of cells (i.e., neurones). Each neurone has thousands of connections (i.e., synapses). These neurones send electric signals to each other; they release chemicals (i.e., neurotransmitters) which carry the signals across the snaptic cleft.

 * A neurotransmitter is a signaling molecule which crosses the synapse.
 * A receptor is a protein that detects a specific checmical by binding to it.
 * A hormone is a signaling moolecule, similar to the neurotransmittor (in fact, many chemicals are both; leaving the difference to tell between one and the other all the more blurry).
 * A ligand is a molecule that binds to a receptor.
 * We say a neuron is excitatory when it increases action potentials. So it sends signals (increases the signal).
 * Likewise, we say that a neuron is inhibitory if it decreases the action potentials. So it blocks the signals (decreases the signal).
 * An agonist is a ligand that stimulates a receptor. This mimics the neurotransmitter.
 * And, lastly, an antagonist is a ligand that binds to a receptor without stimulating it. So this blocks the receptor.

From these definitions, we can conclude that antagonists block receptors and counteract agonists. So a receptor becomes excitatory if an agonist binds it; and becomes inhibitory if an antagonist binds it.

A nice example that gave is the following (taken exactly):

 * Opioids (such as morphine, codeine, etc...) are full agonists at the $$\mu$$-opioid receptor.
 * Alcohol is a GABA-agonist.
 * Antihistimanies are histamine antagonists.
 * Antipsychotics are dopamine antagonists at high doses, and serotonin antagonists at low doses.

Common Neurotransmitters
The most common excitatory neurotransmitter in the brain is glutamate (helps in learning and memory). "Glutamate is released by 80% of neurons." .

 * PCP and Ketamine are glutamate antagonists. "They act at the NMDA glutamate receptor."
 * Another NMDA antagonist is memantine (which is used for treating Alzheimer's disease).

What do glutamate agonists do? They tend to cause seizures since they excite the neurons.

The gamma-aminobutyric acid (GABA) neurotransmitter is the most common inhibitory neurotransmittor. Sleep and anxiety relief are the most common causes of the GABA agonists. Also, muscle relaxation and memory impairment.

The norepinephrine (NE) neurotransmitter causes excitement and the "fight/flight" response, along with fear.

The dopamine (DA) neurotransmitter increases happiness and alertness, and increases the rewards part of your brain, it is known as the salience neurotransmitter.

The serotonin (SER, 5-HT) neurotransmitter is known as the satiety neurotransmitter, it relieves depression and causes feelings of contentment.

The acetylcholine (ACh) neurotransmitter casues alertness, improves memory, and causes secretions of sweat and saliva.

The histamine neurotransmitter causes alertness, itchiness, rashes and stomach acid secretion.

Partial agonists is as the name suggests, an agonist but with partial effects. So partial agonists may be safer and have fewer side effects than full agonists. One example is buprenorphine (a $$\mu$$-opioid partial agonist); this is a lot safer than, say diamorphine (a full $$\mu$$-opioid agonist), but gives similar effects (i.e., pain relief).

title: Pharmacology/Introduction


text:
Trainz/Content Creator's Guide

The Trainz Content Creator's Guide(s) (CCG) were technical documentation collections professionally written delineating the needful tags, definitions, and parametrics of constructing Trainz compatible digital asset models. They (are alleged to) have been superseded by the TrainzOnline wiki covering most of the same topics, but the presentation, information and tautological information in each article of the CCG is generally more user friendly and detailed with instructional coverage of its topics ranging from the introductory concepts to the detailed when compared to the terse, sometimes overly bare focus of the corresponding article pages of the main Trainz Wiki.  One way to understand it, is the Trainz wiki has been written by geeks writing for those already in the know, being put together and maintained mainly by the N3V programmers — whereas the CCGs impart the same kinds of information plus some introductory, cross-connective or fundamental background knowledge along with the same degree of data reliability.  Another way to appreciate it, the Trainz Wiki was in the main put up by four programmers as a reference in between other duties, whereas the CCGs were written by a Staff of 30 including graphics artists, technical writers, programmers and programmer-managers—and was part of the professional job for many of those working the project. The world owes a great debt to Greg Lane whose oversight and vision put Trainz on such a firm beginning footing up through 2006.  In the early days, the first drafts of the CCG was made available to Auran Developmental partners, interested 3rd-parties sans formal relationships and various hobbyists around the world who were often key active members of large model railroading clubs and associations, all assisting in the design of run-time features, early asset generation, and all accessed through a web page hyperlinking various topics. These were updated even as the code was being written for the Trainz 0.9 Beta release, and once stabilized, released on the installation CDROM with Trainz 1.3 and Trainz UTC retail releases (TBV's 1.3 and 1.5).

Trainz data models

 * main article:

As a rule each active line of a config.txt file contains a proscribed specific keyword (a 'Tag') followed by whitespace and a defining value:  The CCG's focus was solely on how to make compatible digital models for rendering by the JET 2.0 game engine that Auran leased out to other game companies and powered all the Trainz UTC through TS2009 retail products. Since GMAX was bundled and distributed with each version of Trainz until TRS2006, many data storage practices were implemented the same way in Trainz.
 * 1)  Some such values are NULL or NIL, where there is nothing defined. This is a common occurrence in informational tags meant to give information to humans instead of the game. license, origin, company, author, organisation, contact-email, contact-website, website, and internationalization tags such as translated names and comments all might show up in a config as empty tags.
 * 2) This is in part because many content items are based on a config someone copies parts from by cut and paste.
 * 3) Over the years, certain tools like TRS2006's CCP provide automatic formatting and tag definitions, with default settings defining such boilerplate data for repetitive tag data.

title: Trainz/Content Creator's Guide


text:
User talk:167.93.49.20

February 2021
Wikibooks is not censored. Please do not remove content from articles to replace it with a "family-friendly" version. --Belwine (discuss • contribs) 21:09, 25 February 2021 (UTC)

title: User talk:167.93.49.20


text:
User:Another Try for the Kronosaurus

Hello.

title: User:Another Try for the Kronosaurus


text:
User talk:Another Try for the Kronosaurus

Kronosaurus!


text:
User:Another Try for the Kronosaurus/sandbox

Alright!


text: User talk:Another Try for the Kronosaurus/sandbox


text: Category:Book:Wikijunior:This is a Book

title: Category:Book:Wikijunior:This is a Book


text:
Trainz/AM&C/Content Creator Plus

Content Creator Plus
Content Creator Plus (or more often CCP on the forums) is a asset creation and editing tool envisioned as a strict syntax enforcer; a software module introduced along side Content Manager Plus— (CMP)' in TRS2006 in fall 2005. Like each release's CM version, each had their own CCP with capability of handling or enforcing progression of the Trainz data model; generally version to version, these are only slight evolutionary changes in how data is organized and expected to be presented going forward. Each CCP was directly launched by the CM/CMP right-click (Select-and-Do) pop-up menu until the TS2009-SP4 release in 2012. With the progression of TR06's CMP thru the years up through TS12's CM 3.7 upgrades, each new CM would get pickier about what tags and containers it accepted in legacy assets' translation to the effective (run time) data model. In effect, certain prior practices and default understandings were made illegal, almost always unnecessarily—and this voluntary N3V procedural practice, in effect, created faulty content messages because the new CM was changing the rules... when merely honoring the older practices' defaulted data definitions would still be workable.

Specifically, CCP was a text processing syntax checker and file/folder test tool that tried to enforce ideal data configurations using the most up to date data preferences. The long term benefit to CCP was that it forced strict compliance with the most up to date acceptable data model (i.e. To The Highest TBV tags and most up-to-date data structures preferred by the Auran/N3V's programmer's up to the technical level supported by that release's explicit TBV and applicable therefore in testing assets as the high end requirement defining acceptable coding within the config.txt file's data. The problem with this was exacerbated by N3V when they introduced the Trainz Life-Cycle Policy and increased fault testing of the uploading of assets—the fault testing required old data structures to be manually eliminated to newer TBV practices, just as did each CCP release, but the great majority of such changes is inconsequential, name changes, translate-data to French, Italian, or Albanian, and so forth. For several years, CM and the DLS required thumbnails be made for assets but only those using texture.txt file methods were kept in DLS versions... the whole process was rife with unnecessary enforced requirements creating strife and unnecessary time expenditure by asset creators—The Trainz Communities most valuable members! Such preferable 'more modern' arrangements accordingly are thence used to define CCP's consequentially STRICT fault testing criteria. ) at that era of Trainz evolution. This is a much stricter and narrower application of test hurdles and 'interpretation of acceptability', since it applies all cumulative changes up to that version. This is quite a bit different from Content Manager's fault testing which responds to a variation in the listed  by applying the appropriate older tests and format interpretations of the TBV standard based on the declared .  The problem with that is all the CCP variants assume the current minimum TBV tech level, and a minor change of importance only to human operators such changing a name, category-class parameter or a description note required upgrading all the data structures for CCP to allow the asset to be reinstalled (i.e. Committed to the Data Base). Hence for normal maintenance of assets, CCP is relatively useless and vexing in that it requires extra time to conform to what it considers necessary, which as noted, are ideals which have no run time effect in the face of old time default behavior and practices! This is not to say CCP was useless. It was an excellent tool for helping new content taking advantage of newer capabilities utilize and get the correct syntax for unfamiliar data combinations or names. Again, as noted, these are generally datum tags and values controlling functionality not achievable in a older data model, which is why they were added! So CCP quickly devolved into a hard-core data creation tool with minimal usage to average Trainzers. The truth is, this combined treatment is probably N3V Games biggest mistake. For insufficient and inexplicable reasons, the programmers decided to force-feed what amounts to cosmetic and unimportant 'style changes' that could have been handled by a translation process on the user community and burden the content creators with a need to almost continually evolve a work product shelved, if they kept any raw files at all, years ago. Simpler and better for all would have been to take the routines which accommodate different TBVs mix of tags, placements and defaulted values, to allow perfectly functional digital models to be automatically updated to the standard of the CCP desired as a pre-processing step during asset commitment. This invalidates absolutely no copyrights, because the creator's original files are intact, they are just being stored into the data base with additional and relatively straightforward minor processing to changed replacements--a compressed .chump file (Now TANE's encrypted .tzarc) is created by historical methods no matter what, and the original non-updated and copyright original is retained as a backup! Simple, and efficient—and a non-burden to the user community. The version creep caused by requiring all uploaded content to pass current TBV (Not just a NECESSARY TBV level required by its own use of capabilities, new tags and their values) muster has stifled upgrading of the DLS, or of eliminating missing dependencies within its library of assets. N3V and Auran management and ownership ought be ashamed.

title: Trainz/AM&C/Content Creator Plus


text:
History of video games/Platforms/Kittenbot MeowBit

History
The system was announced by March 30th, 2019. By April 15th, 2019 the system had launched. The system cost between $34.90 and $39.90 at launch, depending on the retailer. At launch much of the documentation was written in the Chinese language.

Technology
The Kittenbot MeowBit uses a STM32F401RET6 microcontroller, containing an ARM Cortex M4 architecture processor. The system has 2 megabytes of SPI Flash storage. The system also has an SD card reader.

The console uses a 1.8" color TFT LCD with a resolution of 160 by 128 pixels. A simple buzzer is used for audio.

The system uses a MP6050 gyroscope for motion controls. The system also has a light sensor and a temperature sensor.

The system is powered by a 3.3 volt 500 milliamp hour capacity lithium chemistry battery.

The console is clad in casing made of silicone in either orange or baby blue colors. Notably the bottom of the console contains a BBC Micro:bit connector for expansion.


text:
Pharmacology/Antidepressants

We usually write DA for the dopamine neurotransmitter and 5-HT for the serotonin neurotransmitter. These two neurotransmitters are usually slow and a lot less common than the major ones. They originate in brainstem, but they are released throughout the entire brain and spine.

Amazingly enough, even though they are called antidepressants, they can be used for a lot of non-depression related illnesses. For instance, SSNRI's are used in conjunction with pain medication for pain in cancer patients.

In this section we will attempt to answer what depression is; what anxiety is; how we treat them; and what antidepressants are.

Antidepressants

 * Selective serotonin reuptake inhibitor (SSRI)
 * This inhibits the 5-HT reuptake.

 * Tricyclic antidepressant (TCA)
 * This inhibits 5-HT and NE reuptake, and antagonizes ACh receptors.

 * Monoamine oxidase inhibitor (MAOI)
 * This inhibits MAO breakdown of 5-HT, NE, and DA.

 * Serotonin-norepinephrine reuptake inhibitor (SNRI)
 * This inhibits 5-HT and NE reuptake.

Examples

 * Mirtazapine: Antagonizes presynaptic NE receptors and thus boosts the release of NE and 5-HT receptors, and antognises specific postsynaptic 5-HT receptors to relieve anxiety.
 * Bupropion: Inhibits NE and DA reuptake. Making it very good for stimulant addicts.
 * Atomoxetine: Inhibits NE reuptake. Making it very good for Attention Deficit Hyperactivity Disorder (ADHD).

title: Pharmacology/Antidepressants


text:
Tibetan/Adjectives

Degree

 * Bryu ru ni zi la khong chung ba yod
 * Coral is cheaper than dzi
 * Bu shel dang yu khong chung chung red
 * Amber and turquoise are cheap

We expresse feelings and emotions with adjectives.
 * Kyi po yin : I am happy
 * Khong thro sa wa yin : I am angry
 * Thang chhe pa yin : I am tired
 * Saem kyo wa yin : I am sad
 * Nyop pa yin : I am bored
 * Go khor wa yin : I am confused
 * Dro go tog pa yin : I am hungry

title: Tibetan/Adjectives


text:
Wikijunior:Languages/Chechen

Who speaks it
Chechen is spoken by people in Chechnya.

Basic words
Barkal - How are you?

Ha - Yes

Hah ha - No

So - I, me

Ho- you

Iza - He/she, him/her

Salam - Hello

Wo - I am (if you are a boy)

Yoo - I am (if you are a girl)

A - And

How to make sentences
In English, actions like to run and to have are called verbs. The person who does the verb goes first and who they do the verb to goes right after in Chechen. So "I have eggs" would be "I eggs have" in Chechen.

So kant wo. I boy am. So ya yoo. I girl am.

title: Wikijunior:Languages/Chechen


text:
Tibetan/Verbs

Bya tshig

The sentence structure is:

Subject+object+verb

Essential egophoric
ང་བོད་པ་ ཡིན །
 * Nga bod pa yin
 * I am Tibetan.

The negative form is with the word Min.

ང་དབིན་ཇི་པ་ མིན །
 * Nga bin ji pa min
 * I am not englisman.

Existencial testimonial
ཁྱེད་རང་དགེ་རྒན་ རེད །
 * Khyed rang ge gan red
 * You are a teacher.

The negative form is with the word Ma red.

ཁ་པར་སེར་པོ་ མ་རེག །
 * Kha par ser po ma red
 * The phone don't is yellow.

Asking questions
Yes/no question are formed by adding the question mark པས (pa) to the end of the verb. Examples:
 * ཁོང་བོད་པ་རེད་པས།
 * Khong bod pa red pa
 * Is he Tibetan?
 * འདི་ཁ་པར་རེད་པས།
 * Di kha par red pa
 * Is this a phone?

Negative questions

 * འདི་ཁ་པར་མ་རེད་པས།
 * Di kha par ma red pa
 * Isn't this a phone?
 * ཁྱེད་རང་མཚོ་མོ་མིན་པས།
 * Khyed rang Tchomo min pa
 * Aren't you Tsomo?

Infinitive
In general the suffixes for to create infinitives is pa or wa

Present
Da ta ba

 * Nga di la kha po med
 * I don't like it

Past
'da pa

There are several ways of expressing the past tense, the most common is with the suffixes chung, tong, and chin.

 * Nga na ning lor nyi hong la yül kor chin pa yin.
 * I traveled to Japón last year.

Future
Ma ong pa

 * Nga zla ba ze mar phar bre yod
 * I will pay you back next week

Imperative
The imperative is generally formed replacing the verb root with the central vowel change into an O

Howerer, there are cases in wicht tang  or dhang must be annexing to the verbal root. Others words take the preffix shok to create the imperative.

title: Tibetan/Verbs


text:
Tibetan/Pronouns

མིང་ཚཔ། Ming tshab

Possesive
Examples:
 * ང་ཡི་྅ལ་ཁྲི།
 * Nga yi nyal khri
 * My bed
 * རང་གི་ཁྱིམ་ཚང།
 * Rang gi khyim tshang
 * Your family
 * ཁོང་གི་སྤོ་ལོ།
 * Khong gi po lo
 * His ball
 * ང་ཚོ་ཡི་ཁྱི།
 * Nga tsho yi khyi
 * Our dogs
 * རཔ་ཚོ་ཡི་མོ་ཏ།
 * Rang tsho yi mo ta
 * Your cars
 * ཁོང་ཚོ་ཡི་གྲོགས་པོ།
 * Khong tsho yi grogs po
 * Their friends

Demonstrative
Examples:
 * གཙང་ཆུ་འདི། (Tsang chu di) : This river
 * པུད་མེད་དེ། (Bud med de) : That woman
 * རོང་ཕ་གི། (Rong pha gi) : That valley
 * ཀུ་ཤུ་འདི་ཚོ། (Ku shu di tsho) : These apples
 * ལུག་དེ་ཚོ། (Lug de tsho) : Those sheeps
 * ཤིང་ཏོག་ཕ་གི་ཚོ། (Sching tog pha gi tsho) : Those fruits

Interrogative
Examples:
 * དེ་ཚོ་ག་རེརེད།
 * De tsho ga re red
 * What are those?
 * ཁོང་སུ་རེད།
 * Khong su red
 * who is she?
 * ང་སུ་རེད།
 * Nga su red
 * Who am I?
 * ཁྱེ་རང་སུ་ཡིན
 * khyed rang su yin
 * Who are you?

Questions and fast asks

 * དེ་ད་རེ་རེད།
 * De ga re red
 * What is that?
 * དེབ་རེད།
 * Deb red
 * It's a book.
 * ཁྱེད་རང་བོད་ནས་ཡིན་པས།
 * Khyed rang bod na yin pa
 * Are you from Tibet?
 * མིན།ང་རྒྱ་གར་ནས་ཡིན།
 * Min.Nga gya gar na yin
 * No.I am from India.
 * ཁྱེད་རང་ཡུ་རོབ་ཡིན་པས།
 * Khyed rang yu rob yin pa
 * Are you from Europe?
 * ལགས་ཡིན།
 * Lag yin
 * Yes (Polite)
 * ཡིན་ཡིན།
 * Yin yin
 * Yes
 * ལགས་མིན།
 * Lag min
 * No (Polite)
 * ང་དགེ་རྒན་ཡི།
 * Nga ge gan yin
 * I am teacher.
 * ཡིང་པས།
 * Yin pa
 * Really?/Are you?
 * ཁོང་སློབ་ཕྲུག་རེད་མ་རེད།
 * Khong lob phrug red ma red
 * Is she a student, or not?

title: Tibetan/Pronouns


text:
Free Knowledge Culture Calendar/April 8

Today in 2011 Safecast launched the crowdfunding campaign for the mass production of its open hardware Geiger counter.

title: Free Knowledge Culture Calendar/April 8


text:
User:EcheveriaJ

Hi! I joined Wikibooks late 2020, early 2021; but have been doing stuff on wikipedia for a bit longer. Mainly editing stuff on the French language, but would like to do a bit more work out-with French.

Please feel free to help me add more vocab and easier to understand grammar notes on the French pages!

title: User:EcheveriaJ


text:
Free Knowledge Culture Calendar/March 13

Today in 1997 the UK’s fixed book price agreement (“Net Book Agreement”) was ruled to be anti-competitive and therefore against the public interest. In other countries such monopolies persist.


text: World Stamp Catalogue/Malaysia/1958

title: World Stamp Catalogue/Malaysia/1958


text: World Stamp Catalogue/Malaysia/1961

title: World Stamp Catalogue/Malaysia/1961


text: World Stamp Catalogue/Malaysia/1965

title: World Stamp Catalogue/Malaysia/1965


text: World Stamp Catalogue/Malaysia/1957

title: World Stamp Catalogue/Malaysia/1957


text:
German/Grammar/Adverbs

Adverbs
Now that we can build very simple sentences, it's time to introduce a simple way of making them more interesting by including additional information.

Terminology
Unfortunately the terminology can be somewhat difficult here, not because the concepts themselves are difficult, but because the terminology itself is difficult to work with. For English speakers, or at least English speaking grammarians, words that modify other words are either adjectives or adverbs. If the word modifies a noun then it is an adjective, and if the word modifies something else, which can be any other kind of word or phrase, or even the rest of the sentence, then it's an adverb. This classification corresponds to the conditions where the suffix "-ly" is normally used in English, but there is no such suffix in German so this criterion is less useful here. The term modifier can be applied to adverbs and adjectives, and also includes phrases that perform a similar function. Meanwhile German speaking grammarians tend to organize these words along more logical lines, and, of course, differently than English speaking grammarians. But there is less agreement amongst themselves as to the exact scheme. For example Duden (a widely regarded as an authority on German grammar), calls nicht (to be covered below) a Partikel but DWDS (a widely regarded online German dictionary) lists it as an Adverb.

Another potential cause of confusion is that German words are often more flexible than their English counterparts, so the role a word plays depends on which meaning is attached to it in a particular sentence. And so the same term does not always apply to the same word in all its possible meanings.

The upshot is that there is no generally agreed upon name for the concept that is the subject of this section, namely that of a word that modifies a verb. The German meaning of Adverb comes close, but again, the exact meaning of the German term is variable. The German term Umstandswort, literally "circumstance word", is more descriptive, but it is a mouthful. So, for simplicity, the term adverb, with no qualifier, will be used here for the concept and we'll use the term modifier, possibly with a qualifier, for words that modify words other than verbs or nouns. For example, in the sentence "He's sleeping soundly," the word "soundly" is an adverb because it's applied to the verb "to sleep". On the other hand, in the sentence "This apple is bright red," the word "bright" is an adjective modifier because it modifies the adjective "red".

In German, the entire sentence (or clause in complex sentences) tends to revolve around the verb, so an adverb may usually be regarded as being applied the sentence as a whole. There are a few adverbs which usually only apply to an entire sentence and we'll cover those later in the section.

Adverb classification
German adverbs are not inflected, so you don't have to worry about things like number and gender with them. Some grammars thus include them in a larger class of "uninflected words" ― Nichtflektierbaren Wörter. We can classify most of them according to the type of information they provide:
 * Adverbs of time tell you when the action is taking place, in other words they answer a "When ..." question.
 * nun ― "now"
 * heute ― "today"
 * gestern ― "yesterday"
 * morgen ― "tomorrow"
 * Adverbs of location tell you where the action is taking place, in other words they answer a "Where ..." question.
 * hier ― "here"
 * dort ― "there"
 * draußen ― "outside"
 * drinnen ― "inside"
 * Adverbs of direction tell you in which direction movement is taking place, in other words they answer a "Where to ..." question.
 * her ― "(to) here"
 * hin ― "(to) there"
 * weg ― "away"
 * Adverbs of manner tell you the way the action is taking place, in other words they answer a "How ..." question.
 * anders ― "differently"
 * gern ― "with pleasure"

The V2 word order
Before adding these new words to sentences, we need to explore how the words will be arranged. English is said to have SVO word order, which means the subject (S) comes before the verb (V), which is then sometimes followed by other nouns or objects (O). German has what is called V2 word order, meaning that the subject and other elements in the sentence can go in various places, but the verb (V) must be in the second position. (At least in the simple sentence types we're covering at the moment.) In other words, there should be one and only one phrase or functional unit, be it the subject, an object, or adverbial phrase, at the start of a sentence, and this must be followed by the verb. This can sound odd to English speaking ears, but it becomes more natural with practice. To see how this works, we'll compare German and English versions of a simple subject+verb+adverb sentence.

In English, the usual order of words in such a sentence is (subject) then (verb) then (adverb), for example: If you want to accent the "now", then you can move it to the start of the sentence: But notice that the subject "I" comes before the verb "am working" in both cases.
 * "I'm working now." (In this case the verb has two parts "am working".)
 * "Now I'm working."

In German, you can say the same thing as: If you want to accent the nun then you can move it to the front, but with V2 word order the verb must come second and the subject must be moved after the verb:
 * Ich arbeite nun.
 * Nun arbeite ich.

Note that the word for word translation would be "Now work I," which is incorrect in English. But the word for word translation of the English into German, Nun ich arbeite, is just as incorrect. Much of the time the subject will go first in both English and German, and the word order winds up about the same in both languages. But flexible word order is essential to convey the stress and importance you're giving to the individual parts of the sentence, and since the rules for possible word orders in German are different than they are in English, you must master these differences to produce grammatical German.

Examples
Here are a few examples to illustrate V2 word order:
 * Er lebt hier. ― "He lives here."
 * Hier lebt er. ― "Here he lives."
 * Wir reden morgen. ― "We'll talk tomorrow."
 * Morgen reden wir. ― "Tomorrow we'll talk."
 * Ich koche gern. ― "I like to cook" (Literally, "I cook with pleasure.")
 * Adverbs of manner are more shy about moving to the start of the sentence, so while Gern koche ich, may be technically grammatical, the phrasing is odd enough that it doesn't work as an example.

Negation of verbs
There are a number of ways to negate a sentence in German, and when to use which one depends on the situation. One of the most important is to use the adverb nicht, which tells you that whatever the verb is saying, that's what you're not doing. For example: The German grammar is actually much simpler than English in this case since English requires an additional verb ("to do", "to be") to accomplish this. This is good news, but be sure not try to use the word for word translation from English to German since the result will always be ungrammatical. When nicht is used as an adverb it comes last in the sentence, except in cases where the something else must come last and has priority. (As noted above, Duden does not consider nicht an adverb, and this is the main reason. Duden includes the ability to move to the front of a sentence as a criterion for being an adverb.) But note that there are other uses of nicht, and its position in the sentence is a clue you can use to figure out exactly which word is being negated.
 * Wir reden nicht. ― "We don't talk."
 * Ich arbeite nicht. ― "I'm not working."
 * Sie kocht nicht. ― "She doesn't cook."

A similar adverb is nie ("never"). It can be used similarly to the way nicht is used, except that it's more flexible in terms of word order.
 * Sie kocht nie. ― "She never cooks."
 * Nie kocht sie. ― "Never does she cook."

Sentence adverbs
As mentioned above, there is a small class of words that serve to modify the rest of the sentence. They tell you what the speaker thinks of the fact itself rather than describing the action. For example:
 * natürlich ― "naturally, of course"
 * leider ― "unfortunately"
 * vielleicht ― "perhaps"

Examples
The rules for where sentence adverbs go in a sentence are about the same as for (verb modifying) adverbs:
 * Ich arbeite leider. ― "I'm working, unfortunately."
 * Natürlich kocht er. ― "Of course he's cooking."
 * Note that natürlich, just like the English counterpart "naturally", has multiple meanings, so the previous example is somewhat ambiguous. It might mean that he is cooking without artificial ingredients, though in that case the sentence would probably be phrased as Er kocht natürlich.

title: German/Grammar/Adverbs


text:
Talk:General Anatomy/Digestive System/Parts/Stomach

I’m gonna let someone merge this page after I create part 3. I’m going to change it a bit. Do NOT change the text before or after it is merged. Also, someone needs to make Redirect pages. Someone will merge part 2 and part 3. Do NOT remove or edit the Redirect pages. Someone needs to put the –  with R:From merge between these brackets: {} 65.31.10.98 (discuss) 12:54, 4 March 2021 (UTC)


text: World Stamp Catalogue/Malaysia/1970

title: World Stamp Catalogue/Malaysia/1970


text:
Talk:General Anatomy/Digestive System/Parts/Stomach/Part 2

Someone will merge the page after I create part 3. This page will be gone.


text:
Perspectives in Digital Literacy/What is Digital Literacy?

"Digital Literacy: “[t]he capability to use digital technology and knowing when and how to use it.” --Mike Ribble, 'Passport to Digital Citizenship.'"Is the Internet the same as the World-Wide-Web? How does the online world work and how has it changed? What are some useful, proper, and safe ways to navigate it? What is my role in it?

This book intends to help you become better educated about the Internet and the World-Wide-Web. Thus our definition of “digital literacy” includes the capacity to decipher online media, how to behave and communicate properly in online environments, and how to manipulate online tools to create content on the Web.


text:
Perspectives in Digital Literacy/Contributors

 * Ssjun
 * Labrat21
 * TRainez
 * JAYACEEE
 * Spongebob is cute

 * Pebbles
 * ELLANDREJTEAH
 * Dinaagudelo
 * Dr. X


text:
Oberon/V2/GraphicFrames

MODULE GraphicFrames; (*NW 18.4.88 / 22.11.91*) IMPORT Display, Viewers, Input, Fonts, Texts, Graphics, Oberon, MenuViewers; CONST (*update message ids*) restore = 0; drawobj = 1; drawobjs = 2; drawobjd = 3; drawnorm = 4; drawsel = 5; drawdel = 6; markW = 5; TYPE Frame* = POINTER TO FrameDesc; Location* = POINTER TO LocDesc; LocDesc* = RECORD x*, y*: INTEGER; next*: Location END ; FrameDesc* = RECORD (Display.FrameDesc) graph*: Graphics.Graph; Xg*, Yg*: INTEGER; (*pos rel to graph origin*) X1*, Y1*: INTEGER; (*right and upper margins*) x*, y*, col*: INTEGER; (*x = X + Xg, y = Y + Yg*) marked*, ticked*: BOOLEAN; mark*: LocDesc END ; DrawMsg* = RECORD (Graphics.Msg) f*: Frame; x*, y*, col*, mode*: INTEGER END ; CtrlMsg* = RECORD (Graphics.Msg) f*: Frame; res*: INTEGER END ; UpdateMsg = RECORD (Display.FrameMsg) id: INTEGER; graph: Graphics.Graph; obj: Graphics.Object END ; SelQuery = RECORD (Display.FrameMsg) f: Frame; time: LONGINT END ; FocusQuery = RECORD (Display.FrameMsg) f: Frame END ; PosQuery = RECORD (Display.FrameMsg) f: Frame; x, y: INTEGER END ; DispMsg = RECORD (Display.FrameMsg) x1, y1, w: INTEGER; pat: Display.Pattern; graph: Graphics.Graph END ; VAR Crosshair*: Oberon.Marker; newcap: Graphics.Caption; DW, DH, CL: INTEGER; W: Texts.Writer; (*Exported procedures: 		Restore, Focus, Selected, This, Draw, Erase, 		DrawObj, EraseObj, Change, Defocus, Deselect, Macro, New*) PROCEDURE Restore*(F: Frame); VAR M: DrawMsg; x, y, col: INTEGER; BEGIN F.X1 := F.X + F.W; F.Y1 := F.Y + F.H; 		F.x := F.X + F.Xg; F.y := F.Y1 + F.Yg; F.marked := FALSE; F.mark.next := NIL; IF F.X < CL THEN col := Display.black ELSE col := F.col END ; Oberon.RemoveMarks(F.X, F.Y, F.W, F.H); Display.ReplConst(col, F.X, F.Y, F.W, F.H, 0); IF F.ticked THEN y := F.Yg MOD 16 + F.Y1 - 16; WHILE y >= F.Y DO (*draw ticks*) x := F.Xg MOD 16 + F.X; 				WHILE x < F.X1 DO Display.Dot(Display.white, x, y, 0); INC(x, 16) END ; DEC(y, 16) END END ; M.f := F; M.x := F.x; M.y := F.y; M.col := 0; M.mode := 0; Graphics.Draw(F.graph, M) 	END Restore; PROCEDURE Focus*: Frame; VAR FQ: FocusQuery; BEGIN FQ.f := NIL; Viewers.Broadcast(FQ); RETURN FQ.f 	END Focus; PROCEDURE Selected*: Frame; VAR SQ: SelQuery; BEGIN SQ.f := NIL; SQ.time := 0; Viewers.Broadcast(SQ); RETURN SQ.f 	END Selected; PROCEDURE This*(x, y: INTEGER): Frame; VAR PQ: PosQuery; BEGIN PQ.f := NIL; PQ.x := x; PQ.y := y; Viewers.Broadcast(PQ); RETURN PQ.f 	END This; PROCEDURE Draw*(F: Frame); VAR UM: UpdateMsg; BEGIN UM.id := drawsel; UM.graph := F.graph; Viewers.Broadcast(UM) END Draw; PROCEDURE DrawNorm(F: Frame); VAR UM: UpdateMsg; BEGIN UM.id := drawnorm; UM.graph := F.graph; Viewers.Broadcast(UM) END DrawNorm; PROCEDURE Erase*(F: Frame); VAR UM: UpdateMsg; BEGIN UM.id := drawdel; UM.graph := F.graph; Viewers.Broadcast(UM) END Erase; PROCEDURE DrawObj*(F: Frame; obj: Graphics.Object); VAR UM: UpdateMsg; BEGIN UM.id := drawobj; UM.graph := F.graph; UM.obj := obj; Viewers.Broadcast(UM) END DrawObj; PROCEDURE EraseObj*(F: Frame; obj: Graphics.Object); VAR UM: UpdateMsg; BEGIN UM.id := drawobjd; UM.graph := F.graph; UM.obj := obj; Viewers.Broadcast(UM) END EraseObj; PROCEDURE Change*(F: Frame; VAR msg: Graphics.Msg); BEGIN IF F # NIL THEN Erase(F); Graphics.Handle(F.graph, msg); Draw(F) END END Change; PROCEDURE FlipMark(x, y: INTEGER); BEGIN Display.ReplConst(Display.white, x-7, y, 15, 1, 2); Display.ReplConst(Display.white, x, y-7, 1, 15, 2) END FlipMark; PROCEDURE Defocus*(F: Frame); VAR m: Location; BEGIN newcap := NIL; IF F.marked THEN FlipMark(F.mark.x, F.mark.y); m := F.mark.next; WHILE m # NIL DO FlipMark(m.x, m.y); m := m.next END ; F.marked := FALSE; F.mark.next := NIL END END Defocus; PROCEDURE Deselect*(F: Frame); VAR UM: UpdateMsg; BEGIN IF F # NIL THEN UM.id := drawnorm; UM.graph := F.graph; Viewers.Broadcast(UM); Graphics.Deselect(F.graph) END END Deselect; PROCEDURE Macro*(VAR Lname, Mname: ARRAY OF CHAR); VAR x, y: INTEGER; F: Frame; mac: Graphics.Macro; mh: Graphics.MacHead; L: Graphics.Library; BEGIN F := Focus; IF F # NIL THEN x := F.mark.x - F.x; y := F.mark.y - F.y; 			L := Graphics.ThisLib(Lname, FALSE); IF L # NIL THEN mh := Graphics.ThisMac(L, Mname); IF mh # NIL THEN Deselect(F); Defocus(F); NEW(mac); mac.x := x; mac.y := y; mac.w := mh.w; mac.h := mh.h; 					mac.mac := mh; mac.do := Graphics.MacMethod; mac.col := Oberon.CurCol; Graphics.Add(F.graph, mac); DrawObj(F, mac) END END END END Macro; PROCEDURE CaptionCopy(F: Frame; 			x1, y1: INTEGER; T: Texts.Text; beg, end: LONGINT): Graphics.Caption; VAR ch: CHAR; dx, w, x2, y2, w1, h1: INTEGER; cap: Graphics.Caption; pat: Display.Pattern; R: Texts.Reader; BEGIN Texts.Write(W, 0DX); NEW(cap); cap.len := SHORT(end - beg); cap.pos := SHORT(Graphics.T.len)+1; cap.do := Graphics.CapMethod; Texts.OpenReader(R, T, beg); Texts.Read(R, ch); W.fnt := R.fnt; W.col := R.col; w := 0; cap.x := x1 - F.x; cap.y := y1 - F.y + R.fnt.minY; WHILE beg < end DO 			Display.GetChar(R.fnt.raster, ch, dx, x2, y2, w1, h1, pat); INC(w, dx); INC(beg); Texts.Write(W, ch); Texts.Read(R, ch) END ; cap.w := w; cap.h := W.fnt.height; cap.col := W.col; Texts.Append(Graphics.T, W.buf); Graphics.Add(F.graph, cap); RETURN cap END CaptionCopy; PROCEDURE SendCaption(cap: Graphics.Caption); VAR M: Oberon.CopyOverMsg; BEGIN M. text := Graphics.T; M.beg := cap.pos; M.end := M.beg + cap.len; Viewers.Broadcast(M) END SendCaption; PROCEDURE Edit(F: Frame; x0, y0: INTEGER; k0: SET); VAR obj: Graphics.Object; x1, y1, w, h, t, pos: INTEGER; beg, end, time: LONGINT; k1, k2: SET; ch: CHAR; mark, newmark: Location; T: Texts.Text; Fd: Frame; G: Graphics.Graph; CM: CtrlMsg; name: ARRAY 32 OF CHAR; PROCEDURE NewLine(x, y, w, h: INTEGER); VAR line: Graphics.Line; BEGIN NEW(line); line.col := Oberon.CurCol; line.x := x - F.x; line.y := y - F.y; 			line.w := w; line.h := h; line.do := Graphics.LineMethod; Graphics.Add(G, line) END NewLine; BEGIN k1 := k0; G := F.graph; IF k0 = {1} THEN obj := Graphics.ThisObj(G, x0 - F.x, y0 - F.y); IF (obj # NIL) & ~obj.selected THEN CM.f := F; CM.res := 0; obj.do.handle(obj, CM); IF CM.res # 0 THEN (*done*) k0 := {} END END END ; REPEAT Input.Mouse(k2, x1, y1); k1 := k1 + k2; DEC(x1, (x1-F.x) MOD 4); DEC(y1, (y1-F.y) MOD 4); Oberon.DrawCursor(Oberon.Mouse, Crosshair, x1, y1) UNTIL k2 = {}; Oberon.FadeCursor(Oberon.Mouse); IF k0 = {2} THEN (*left key*) w := ABS(x1-x0); h := ABS(y1-y0); IF k1 = {2} THEN IF (w < 7) & (h < 7) THEN (*set mark*) IF (x1 - markW >= F.X) & (x1 + markW < F.X1) & (y1 - markW >= F.Y) & (y1 + markW < F.Y1) THEN Defocus(F); Oberon.PassFocus(Viewers.This(F.X, F.Y)); F.mark.x := x1; F.mark.y := y1; F.marked := TRUE; FlipMark(x1, y1) END ELSE (*draw line*) Deselect(F); IF w < h THEN IF y1 < y0 THEN y0 := y1 END ; NewLine(x0, y0, Graphics.width, h) 					ELSE IF x1 < x0 THEN x0 := x1 END ; NewLine(x0, y0, w, Graphics.width) END ; Draw(F) END ELSIF k1 = {2, 1} THEN (*copy selection to caret mark*) Deselect(F); Oberon.GetSelection(T, beg, end, time); IF time >= 0 THEN DrawObj(F, CaptionCopy(F, x1, y1, T, beg, end)) END ELSIF k1 = {2, 0} THEN IF F.marked THEN (*set secondary mark*) NEW(newmark); newmark.x := x1; newmark.y := y1; newmark.next := NIL; FlipMark(x1, y1); mark := F.mark.next; IF mark = NIL THEN F.mark.next := newmark ELSE WHILE mark.next # NIL DO mark := mark.next END ; mark.next := newmark END END END ELSIF k0 = {1} THEN (*middle key*) IF k1 = {1} THEN (*move*) IF (x0 # x1) OR (y0 # y1) THEN Fd := This(x1, y1); Erase(F); IF Fd = F THEN Graphics.Move(G, x1-x0, y1-y0) ELSIF (Fd # NIL) & (Fd.graph = G) THEN Graphics.Move(G, (x1-Fd.x-x0+F.x) DIV 4 * 4, (y1-Fd.y-y0+F.y) DIV 4 * 4) END ; Draw(F) END ELSIF k1 = {1, 2} THEN (*copy*) Fd := This(x1, y1); IF Fd # NIL THEN DrawNorm(F); IF Fd = F THEN Graphics.Copy(G, G, x1-x0, y1-y0) ELSE Deselect(Fd); Graphics.Copy(G, Fd.graph, (x1-Fd.x-x0+F.x) DIV 4 * 4, (y1-Fd.y-y0+F.y) DIV 4 * 4) END ; Draw(Fd) END ELSIF k1 = {1, 0} THEN (*shift graph origin*) INC(F.Xg, x1-x0); INC(F.Yg, y1-y0); Restore(F) END ELSIF k0 = {0} THEN (*right key: select*) newcap := NIL; IF (ABS(x0-x1) < 7) & (ABS(y0-y1) < 7) THEN IF ~(2 IN k1) THEN Deselect(F) END ; obj := Graphics.ThisObj(G, x1 - F.x, y1 - F.y); IF obj # NIL THEN Graphics.SelectObj(G, obj); DrawObj(F, obj); IF (k1 = {0, 1}) & (obj IS Graphics.Caption) THEN SendCaption(obj(Graphics.Caption)) END END ELSE Deselect(F); IF x1 < x0 THEN t := x0; x0 := x1; x1 := t END ; IF y1 < y0 THEN t := y0; y0 := y1; y1 := t END ; Graphics.SelectArea(G, x0 - F.x, y0 - F.y, x1 - F.x, y1 - F.y); Draw(F) END END END Edit; PROCEDURE NewCaption(F: Frame; col: INTEGER; font: Fonts.Font); BEGIN Texts.Write(W, 0DX); NEW(newcap); newcap.x := F.mark.x - F.x; newcap.y := F.mark.y - F.y + font.minY; newcap.w := 0; newcap.h := font.height; newcap.col := col; newcap.pos := SHORT(Graphics.T.len + 1); newcap.len := 0; newcap.do := Graphics.CapMethod; Graphics.Add(F.graph, newcap); W.fnt := font END NewCaption; PROCEDURE InsertChar(F: Frame; ch: CHAR); VAR w1, h1: INTEGER; DM: DispMsg; BEGIN DM.graph := F.graph; Display.GetChar(W.fnt.raster, ch, DM.w, DM.x1, DM.y1, w1, h1, DM.pat); DEC(DM.y1, W.fnt.minY); IF newcap.x + newcap.w + DM.w + F.x < F.X1 THEN Viewers.Broadcast(DM); INC(newcap.w, DM.w); INC(newcap.len); Texts.Write(W, ch) END ; Texts.Append(Graphics.T, W.buf) END InsertChar; PROCEDURE DeleteChar(F: Frame); VAR w1, h1: INTEGER; ch: CHAR; pos: LONGINT; DM: DispMsg; R: Texts.Reader; BEGIN DM.graph := F.graph; IF newcap.len > 0 THEN pos := Graphics.T.len; Texts.OpenReader(R, Graphics.T, pos-1); (*backspace*) Texts.Read(R, ch); IF ch >= " " THEN Display.GetChar(R.fnt.raster, ch, DM.w, DM.x1, DM.y1, w1, h1, DM.pat); DEC(newcap.w, DM.w); DEC(newcap.len); DEC(DM.y1, R.fnt.minY); Viewers.Broadcast(DM); Texts.Delete(Graphics.T, pos-1, pos) END END END DeleteChar; PROCEDURE GetSelection(F: Frame; VAR text: Texts.Text; VAR beg, end, time: LONGINT); VAR obj: Graphics.Object; BEGIN obj := F.graph.sel; IF (obj # NIL) & (obj IS Graphics.Caption) & (F.graph.time >= time) THEN WITH obj: Graphics.Caption DO beg := obj.pos; end := obj.pos + obj.len END ; text := Graphics.T; time := F.graph.time END END GetSelection; PROCEDURE* Handle(G: Display.Frame; VAR M: Display.FrameMsg); VAR i: LONGINT; ch: CHAR; x, y: INTEGER; DM: DispMsg; dM: DrawMsg; G1: Frame; PROCEDURE move(G: Frame; dx, dy: INTEGER); VAR M: UpdateMsg; BEGIN Defocus(G); Oberon.FadeCursor(Oberon.Mouse); M.id := drawdel; M.graph := G.graph; Viewers.Broadcast(M); Graphics.Move(G.graph, dx, dy); M.id := drawsel; Viewers.Broadcast(M) END move; BEGIN WITH G: Frame DO 			IF M IS Oberon.InputMsg THEN WITH M: Oberon.InputMsg DO 					IF M.id = Oberon.track THEN x := M.X - (M.X - G.x) MOD 4; y := M.Y - (M.Y - G.y) MOD 4; IF M.keys # {} THEN Edit(G, x, y, M.keys) ELSE Oberon.DrawCursor(Oberon.Mouse, Crosshair, x, y) 						END ELSIF M.id = Oberon.consume THEN IF M.ch = 7FX THEN IF newcap # NIL THEN DeleteChar(G) ELSE Oberon.FadeCursor(Oberon.Mouse); Defocus(G); Erase(G); Graphics.Delete(G.graph) END ELSIF M.ch = 91X THEN Restore(G) ELSIF M.ch = 93X THEN G.Xg := -1; G.Yg := 0; Restore(G) (*reset*) ELSIF M.ch = 0C1X THEN move(G, 0, 1) ELSIF M.ch = 0C2X THEN move(G, 0, -1) ELSIF M.ch = 0C3X THEN move(G, 1, 0) ELSIF M.ch = 0C4X THEN move(G, -1, 0) ELSIF (M.ch >= 20X) & (M.ch <= 86X) THEN IF newcap # NIL THEN InsertChar(G, M.ch) ELSIF G.marked THEN Defocus(G); Deselect(G); NewCaption(G, M.col, M.fnt); InsertChar(G, M.ch) END END END END ELSIF M IS UpdateMsg THEN WITH M: UpdateMsg DO 					IF M.graph = G.graph THEN dM.f := G; dM.x := G.x; dM.y := G.y; dM.col := 0; CASE M.id OF 							restore: Restore(G) | drawobj: dM.mode := 0; M.obj.do.draw(M.obj, dM) | drawobjs: dM.mode := 1; M.obj.do.draw(M.obj, dM) | drawobjd: dM.mode := 3; M.obj.do.draw(M.obj, dM) | drawsel: dM.mode := 0; Graphics.DrawSel(G.graph, dM) | drawnorm: dM.mode := 2; Graphics.DrawSel(G.graph, dM) | drawdel: dM.mode := 3; Graphics.DrawSel(G.graph, dM) END END END ELSIF M IS SelQuery THEN WITH M: SelQuery DO 					IF (G.graph.sel # NIL) & (M.time < G.graph.time) THEN M.f := G; M.time := G.graph.time END END ELSIF M IS FocusQuery THEN IF G.marked THEN M(FocusQuery).f := G END ELSIF M IS PosQuery THEN WITH M: PosQuery DO 					IF (G.X <= M.x) & (M.x < G.X1) & (G.Y <= M.y) & (M.y < G.Y1) THEN M.f := G 					END END ELSIF M IS DispMsg THEN DM := M(DispMsg); x := G.x + newcap.x + newcap.w; y := G.y + newcap.y; 				IF (DM.graph = G.graph) & (x >= G.X) & (x + DM.w < G.X1) & (y >= G.Y) & (y < G.Y1) THEN Display.CopyPattern(Oberon.CurCol, DM.pat, x + DM.x1, y + DM.y1, 2); Display.ReplConst(Display.white, x, y, DM.w, newcap.h, 2) END ELSIF M IS Oberon.ControlMsg THEN WITH M: Oberon.ControlMsg DO 					IF M.id = Oberon.neutralize THEN Oberon.RemoveMarks(G.X, G.Y, G.W, G.H); Defocus(G); DrawNorm(G); Graphics.Deselect(G.graph) ELSIF M.id = Oberon.defocus THEN Defocus(G) END END ELSIF M IS Oberon.SelectionMsg THEN WITH M: Oberon.SelectionMsg DO GetSelection(G, M.text, M.beg, M.end, M.time) END ELSIF M IS Oberon.CopyMsg THEN Oberon.RemoveMarks(G.X, G.Y, G.W, G.H); Defocus(G); NEW(G1); G1^ := G^; M(Oberon.CopyMsg).F := G1 			ELSIF M IS MenuViewers.ModifyMsg THEN WITH M: MenuViewers.ModifyMsg DO G.Y := M.Y; G.H := M.H; Restore(G) END ELSIF M IS Oberon.CopyOverMsg THEN WITH M: Oberon.CopyOverMsg DO 					IF G.marked THEN DrawObj(G, CaptionCopy(G, G.mark.x, G.mark.y, M.text, M.beg, M.end)) END END END END END Handle; (*--- Methods ---*) PROCEDURE* DrawLine(obj: Graphics.Object; VAR M: Graphics.Msg); (*M.mode = 0: draw according to state, 			= 1: normal -> selected, 			= 2: selected -> normal, 			= 3: erase*) VAR x, y, w, h, col: INTEGER; f: Frame; BEGIN WITH M: DrawMsg DO 			x := obj.x + M.x; y := obj.y + M.y; w := obj.w; h := obj.h; f := M.f; 			IF (x+w > f.X) & (x < f.X1) & (y+h > f.Y) & (y < f.Y1) THEN IF x < f.X THEN DEC(w, f.X-x); x := f.X END ; IF x+w > f.X1 THEN w := f.X1-x END ; IF y < f.Y THEN DEC(h, f.Y-y); y := f.Y END ; IF y+h > f.Y1 THEN h := f.Y1-y END ; IF M.col = Display.black THEN col := obj.col ELSE col := M.col (*macro*) END ; IF (M.mode = 0) & obj.selected OR (M.mode = 1) THEN Display.ReplPattern(col, Display.grey2, x, y, w, h, 0) ELSIF M.mode = 3 THEN Display.ReplConst(Display.black, x, y, w, h, 0) (*erase*) ELSE Display.ReplConst(col, x, y, w, h, 0) END END END END DrawLine; PROCEDURE* DrawCaption(obj: Graphics.Object; VAR M: Graphics.Msg); VAR x, y, dx, x0, x1, y0, y1, w, h, w1, h1, col: INTEGER; f: Frame; ch: CHAR; pat: Display.Pattern; fnt: Fonts.Font; R: Texts.Reader; BEGIN WITH M: DrawMsg DO 			x := obj.x + M.x; y := obj.y + M.y; w := obj.w; h := obj.h; f := M.f; 			IF (f.X <= x) & (x <= f.X1) & (f.Y <= y) & (y+h <= f.Y1) THEN IF x+w > f.X1 THEN w := f.X1-x END ; Texts.OpenReader(R, Graphics.T, obj(Graphics.Caption).pos); Texts.Read(R, ch); IF M.mode = 0 THEN IF ch >= " " THEN IF M.col = Display.black THEN col := obj.col ELSE col := M.col (*macro*) END ; fnt := R.fnt; x0 := x; y0 := y - fnt.minY; LOOP Display.GetChar(fnt.raster, ch, dx, x1, y1, w1, h1, pat); IF x0+x1+w1 <= f.X1 THEN Display.CopyPattern(col, pat, x0+x1, y0+y1, 1) ELSE EXIT END ; INC(x0, dx); Texts.Read(R, ch); IF ch < " " THEN EXIT END END ; IF obj.selected THEN Display.ReplConst(Display.white, x, y, w, h, 2) END END ELSIF M.mode < 3 THEN Display.ReplConst(Display.white, x, y, w, h, 2) ELSE Display.ReplConst(Display.black, x, y, w, h, 0) END END END END DrawCaption; PROCEDURE* DrawMacro(obj: Graphics.Object; VAR M: Graphics.Msg); VAR x, y, w, h: INTEGER; f: Frame; M1: DrawMsg; BEGIN WITH M: DrawMsg DO 			x := obj.x + M.x; y := obj.y + M.y; w := obj.w; h := obj.h; f := M.f; 			IF (x+w > f.X) & (x < f.X1) & (y+h > f.Y) & (y < f.Y1) THEN M1.x := x; M1.y := y; 				IF x < f.X THEN DEC(w, f.X-x); x := f.X END ; IF x+w > f.X1 THEN w := f.X1-x END ; IF y < f.Y THEN DEC(h, f.Y-y); y := f.Y END ; IF y+h > f.Y1 THEN h := f.Y1-y END ; IF M.mode = 0 THEN M1.f := f; M1.col := obj.col; M1.mode := 0; Graphics.DrawMac(obj(Graphics.Macro).mac, M1); IF obj.selected THEN Display.ReplConst(Display.white, x, y, w, h, 2) END ELSIF M.mode < 3 THEN Display.ReplConst(Display.white, x, y, w, h, 2) ELSE Display.ReplConst(Display.black, x, y, w, h, 0) END END END END DrawMacro; PROCEDURE New*(graph: Graphics.Graph; X, Y, col: INTEGER; ticked: BOOLEAN): Frame; VAR G: Frame; BEGIN NEW(G); G.graph := graph; G.Xg := X; G.Yg := Y; G.col := col; G.marked := FALSE; G.mark.next := NIL; G.ticked := ticked; G.handle := Handle; RETURN G 	END New; PROCEDURE* DrawCrosshair(x, y: INTEGER); BEGIN IF x < CL THEN IF x < markW THEN x := markW ELSIF x > DW THEN x := DW - markW END ELSE IF x < CL + markW THEN x := CL + markW ELSIF x > CL + DW THEN x := CL + DW - markW END END ; IF y < markW THEN y := markW ELSIF y > DH THEN y := DH - markW END ; Display.CopyPattern(Display.white, Display.cross, x - markW, y - markW, 2) END DrawCrosshair; BEGIN DW := Display.Width - 8; DH := Display.Height - 8; CL := Display.ColLeft; Crosshair.Draw := DrawCrosshair; Crosshair.Fade := DrawCrosshair; Texts.OpenWriter(W); Graphics.LineMethod.draw := DrawLine; Graphics.CapMethod.draw := DrawCaption; Graphics.MacMethod.draw := DrawMacro END GraphicFrames.

title: Oberon/V2/GraphicFrames


text: Category:Book:Themes in Literature

title: Category:Book:Themes in Literature


text:
German/Grammar/Stem-changing verbs

Stem changing verbs
Before moving on to other aspects of grammar, it would be a good idea to expand our repertoire of verbs. In most languages, the best verbs, in other words the ones that are used the most often and are the most important to learn, are usually irregular in some way. So in this section we'll cover a class of slightly irregular verbs, verbs that are irregular but in a regular pattern.

Terminology
In English, we usually say that a verb that does not follow the usual conjugation pattern in irregular and leave it at that. German adds an extra dimension to this by also classifying verbs as weak and strong. This mostly has to do with the way the verb forms its past tenses and the reason lies deep in the history of the German language.

In early German, the past tense was formed using what is called an ablaut, meaning a change of vowel. We can see this pattern in some irregular verbs in English: "swing" ― "swung", "get" ― "got", "bite" ― "bit". At some point the method of forming the past tense changed; verbs that existed in language before then were grandfathered in with the old ablaut method, while new verbs, either borrowed from other languages or converted from other parts of speech, used the new method which changed the ending. The old ablaut verbs are what we now call strong, and the newer ending-change verbs are what we now call weak. English, since it's a Germanic language, follows this same pattern to some degree, as seen in the examples above. But English grammarians usually don't make the strong/weak distinction since the pattern is not as pervasive as it is in German, and since English conjugation is simpler in general than it is in German.

Strong verbs are often classified into types according to the specifics of the ablaut in the Germanic root. But that won't be covered here since it's debatable how useful this information is to people wishing to learn German as it's spoken today rather than how it was spoken in the ancient past.

The stem-changing pattern
We haven't covered the past tense yet, so why talk about strong and weak now? The reason is that there is a subclass of strong verbs which also experience a vowel change in the present tense, and it's these verbs which we'll be covering in this section. An easy example is schlafen ("to sleep"). It's conjugated as follows, with the vowel changes marked in bold.

The general pattern is:

The vowel changes are marked with an asterisk (*) here. Note that it only occurs in the second person familiar singular (the du form) and in the third person singular (the er/sie/es form).

Examples
Here is a list of common stem-changing verbs along with their vowel changes:
 * schlafen ― "to sleep" ― -a- to -ä-
 * Ich schlafe. Du schläfst.
 * sehen ― "to see" ― -e- to -ie-
 * Ich sehe. Du siehst.
 * fallen ― "to fall" ― -a- to -ä-
 * Ich falle. Du fällst.
 * laufen ― "to run" ― -au- to -äu-
 * Ich laufe. Du läufst.
 * sprechen ― "to speak" ― -e- to -i-
 * Ich spreche. Du sprichst.

Dictionary entries
Because vowel changes, if they occur at all in the present tense, occur so consistently in du and er/sie/es forms, the common practice in dictionaries is to list only the third person singular in the present tense. Knowing the common pattern, you can usually deduce all forms of the present tense from the infinitive, which will be the form where the verb is listed, and this one additional form. Even if you you're using a dictionary that lists every possible conjugation, such as the English Wiktionary, it will certainly reduce the load on your memory to learn only one entry in the conjugation table instead of seven.

title: German/Grammar/Stem-changing verbs